@omnimedia/omnitool 1.1.0-3 → 1.1.0-4

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.
Files changed (103) hide show
  1. package/package.json +10 -9
  2. package/s/context.ts +1 -1
  3. package/s/demo/demo.bundle.ts +6 -2
  4. package/s/demo/routines/filmstrip-test.ts +2 -2
  5. package/s/demo/routines/transcriber-test.ts +34 -0
  6. package/s/driver/fns/host.ts +7 -6
  7. package/s/driver/fns/schematic.ts +1 -1
  8. package/s/driver/fns/work.ts +116 -119
  9. package/s/driver/utils/load-decoder-source.ts +3 -4
  10. package/s/features/speech/transcribe/default-spec.ts +11 -0
  11. package/s/features/speech/transcribe/parts/load-pipe.ts +19 -0
  12. package/s/features/speech/transcribe/parts/prep-audio.ts +23 -0
  13. package/s/features/speech/transcribe/parts/transcribe.ts +70 -0
  14. package/s/features/speech/transcribe/transcriber.ts +46 -0
  15. package/s/features/speech/transcribe/types.ts +82 -0
  16. package/s/features/speech/transcribe/worker.bundle.ts +40 -0
  17. package/s/timeline/utils/checksum.ts +2 -1
  18. package/s/tools/common/loader.ts +26 -0
  19. package/s/tools/common/transformer-pipeline.ts +26 -0
  20. package/s/tools/speech-recognition/common/model.ts +26 -0
  21. package/s/tools/speech-recognition/whisper/fns/host.ts +25 -0
  22. package/s/tools/speech-recognition/whisper/fns/schematic.ts +23 -0
  23. package/s/tools/speech-recognition/whisper/fns/work.ts +91 -0
  24. package/s/tools/speech-recognition/whisper/parts/types.ts +38 -0
  25. package/s/tools/speech-recognition/whisper/parts/worker.bundle.ts +7 -0
  26. package/s/tools/speech-recognition/whisper/tool.ts +70 -0
  27. package/x/context.js +1 -1
  28. package/x/context.js.map +1 -1
  29. package/x/demo/demo.bundle.js +6 -2
  30. package/x/demo/demo.bundle.js.map +1 -1
  31. package/x/demo/demo.bundle.min.js +6 -6
  32. package/x/demo/demo.bundle.min.js.map +4 -4
  33. package/x/demo/routines/filmstrip-test.d.ts +1 -1
  34. package/x/demo/routines/filmstrip-test.js +2 -2
  35. package/x/demo/routines/filmstrip-test.js.map +1 -1
  36. package/x/demo/routines/transcriber-test.d.ts +4 -0
  37. package/x/demo/routines/transcriber-test.js +33 -0
  38. package/x/demo/routines/transcriber-test.js.map +1 -0
  39. package/x/driver/driver.worker.bundle.min.js +80 -80
  40. package/x/driver/driver.worker.bundle.min.js.map +4 -4
  41. package/x/driver/fns/host.js +3 -3
  42. package/x/driver/fns/host.js.map +1 -1
  43. package/x/driver/fns/schematic.d.ts +1 -1
  44. package/x/driver/fns/work.js +8 -8
  45. package/x/driver/fns/work.js.map +1 -1
  46. package/x/driver/utils/load-decoder-source.d.ts +2 -1
  47. package/x/driver/utils/load-decoder-source.js +2 -3
  48. package/x/driver/utils/load-decoder-source.js.map +1 -1
  49. package/x/features/speech/transcribe/default-spec.d.ts +2 -0
  50. package/x/features/speech/transcribe/default-spec.js +8 -0
  51. package/x/features/speech/transcribe/default-spec.js.map +1 -0
  52. package/x/features/speech/transcribe/parts/load-pipe.d.ts +2 -0
  53. package/x/features/speech/transcribe/parts/load-pipe.js +13 -0
  54. package/x/features/speech/transcribe/parts/load-pipe.js.map +1 -0
  55. package/x/features/speech/transcribe/parts/prep-audio.d.ts +5 -0
  56. package/x/features/speech/transcribe/parts/prep-audio.js +21 -0
  57. package/x/features/speech/transcribe/parts/prep-audio.js.map +1 -0
  58. package/x/features/speech/transcribe/parts/transcribe.d.ts +5 -0
  59. package/x/features/speech/transcribe/parts/transcribe.js +56 -0
  60. package/x/features/speech/transcribe/parts/transcribe.js.map +1 -0
  61. package/x/features/speech/transcribe/transcriber.d.ts +5 -0
  62. package/x/features/speech/transcribe/transcriber.js +33 -0
  63. package/x/features/speech/transcribe/transcriber.js.map +1 -0
  64. package/x/features/speech/transcribe/types.d.ts +66 -0
  65. package/x/features/speech/transcribe/types.js +2 -0
  66. package/x/features/speech/transcribe/types.js.map +1 -0
  67. package/x/features/speech/transcribe/worker.bundle.d.ts +1 -0
  68. package/x/features/speech/transcribe/worker.bundle.js +33 -0
  69. package/x/features/speech/transcribe/worker.bundle.js.map +1 -0
  70. package/x/features/speech/transcribe/worker.bundle.min.js +2916 -0
  71. package/x/features/speech/transcribe/worker.bundle.min.js.map +7 -0
  72. package/x/index.html +2 -2
  73. package/x/timeline/utils/checksum.js +2 -1
  74. package/x/timeline/utils/checksum.js.map +1 -1
  75. package/x/tools/common/loader.d.ts +19 -0
  76. package/x/tools/common/loader.js +18 -0
  77. package/x/tools/common/loader.js.map +1 -0
  78. package/x/tools/common/transformer-pipeline.d.ts +8 -0
  79. package/x/tools/common/transformer-pipeline.js +24 -0
  80. package/x/tools/common/transformer-pipeline.js.map +1 -0
  81. package/x/tools/speech-recognition/common/model.d.ts +14 -0
  82. package/x/tools/speech-recognition/common/model.js +16 -0
  83. package/x/tools/speech-recognition/common/model.js.map +1 -0
  84. package/x/tools/speech-recognition/whisper/fns/host.d.ts +13 -0
  85. package/x/tools/speech-recognition/whisper/fns/host.js +19 -0
  86. package/x/tools/speech-recognition/whisper/fns/host.js.map +1 -0
  87. package/x/tools/speech-recognition/whisper/fns/schematic.d.ts +19 -0
  88. package/x/tools/speech-recognition/whisper/fns/schematic.js +2 -0
  89. package/x/tools/speech-recognition/whisper/fns/schematic.js.map +1 -0
  90. package/x/tools/speech-recognition/whisper/fns/work.d.ts +12 -0
  91. package/x/tools/speech-recognition/whisper/fns/work.js +74 -0
  92. package/x/tools/speech-recognition/whisper/fns/work.js.map +1 -0
  93. package/x/tools/speech-recognition/whisper/parts/types.d.ts +31 -0
  94. package/x/tools/speech-recognition/whisper/parts/types.js +2 -0
  95. package/x/tools/speech-recognition/whisper/parts/types.js.map +1 -0
  96. package/x/tools/speech-recognition/whisper/parts/worker.bundle.d.ts +1 -0
  97. package/x/tools/speech-recognition/whisper/parts/worker.bundle.js +4 -0
  98. package/x/tools/speech-recognition/whisper/parts/worker.bundle.js.map +1 -0
  99. package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js +8 -0
  100. package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js.map +7 -0
  101. package/x/tools/speech-recognition/whisper/tool.d.ts +12 -0
  102. package/x/tools/speech-recognition/whisper/tool.js +63 -0
  103. package/x/tools/speech-recognition/whisper/tool.js.map +1 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../node_modules/@e280/renraku/s/comms/json-rpc.ts", "../../node_modules/@e280/renraku/s/core/errors.ts", "../../node_modules/@e280/renraku/s/comms/respond.ts", "../../node_modules/@e280/sten/s/themes/basic.ts", "../../node_modules/@e280/sten/s/themes/auto.ts", "../../node_modules/@e280/sten/s/colors/parts/codes.ts", "../../node_modules/@e280/sten/s/colors/parts/color-fns.ts", "../../node_modules/@e280/sten/s/colors/colorless.ts", "../../node_modules/@e280/sten/s/colors/colorful.ts", "../../node_modules/@e280/sten/s/utils/supports.ts", "../../node_modules/@e280/sten/s/colors/auto.ts", "../../node_modules/@e280/sten/s/shapers/errors.ts", "../../node_modules/@e280/sten/s/shapers/shaper.ts", "../../node_modules/@e280/sten/s/shapers/timestamp.ts", "../../node_modules/@e280/sten/s/shapers/auto.ts", "../../node_modules/@e280/sten/s/writers/deno.ts", "../../node_modules/@e280/sten/s/writers/node.ts", "../../node_modules/@e280/sten/s/writers/console.ts", "../../node_modules/@e280/sten/s/writers/auto.ts", "../../node_modules/@e280/sten/s/writers/void.ts", "../../node_modules/@e280/sten/s/shapers/none.ts", "../../node_modules/@e280/sten/s/logger.ts", "../../node_modules/@e280/stz/s/data/bytes.ts", "../../node_modules/@e280/stz/s/data/hex.ts", "../../node_modules/@e280/stz/s/data/base58.ts", "../../node_modules/@e280/stz/s/data/base-x.ts", "../../node_modules/@e280/stz/s/data/base64.ts", "../../node_modules/@e280/stz/s/data/txt.ts", "../../node_modules/@e280/stz/s/is.ts", "../../node_modules/@e280/stz/s/deadline.ts", "../../node_modules/@e280/stz/s/defer.ts", "../../node_modules/@e280/stz/s/drill.ts", "../../node_modules/@e280/stz/s/hat.ts", "../../node_modules/@e280/stz/s/ob.ts", "../../node_modules/@e280/stz/s/pubsub.ts", "../../node_modules/@e280/stz/s/trash.ts", "../../node_modules/@e280/renraku/s/tools/random-user-emojis.ts", "../../node_modules/@e280/renraku/s/core/taps/logger.ts", "../../node_modules/@e280/renraku/s/core/taps/error.ts", "../../node_modules/@e280/renraku/s/core/taps/default.ts", "../../node_modules/@e280/renraku/s/core/endpoint.ts", "../../node_modules/@e280/renraku/s/core/remote-proxy.ts", "../../node_modules/@e280/renraku/s/core/remote.ts", "../../node_modules/@e280/renraku/s/core/mock.ts", "../../node_modules/@e280/renraku/s/transports/messenger/conduits/conduit.ts", "../../node_modules/@e280/renraku/s/transports/messenger/parts/helpers.ts", "../../node_modules/@e280/renraku/s/transports/messenger/conduits/postable.ts", "../../node_modules/@e280/renraku/s/transports/defaults.ts", "../../node_modules/@e280/renraku/s/transports/utils/response-waiter.ts", "../../node_modules/@e280/renraku/s/transports/messenger/messenger.ts", "../../node_modules/@e280/comrade/s/parts/shells.ts", "../../node_modules/@e280/comrade/s/parts/default-tap.ts", "../../node_modules/@e280/comrade/s/parts/worker.ts", "../../node_modules/@e280/comrade/s/parts/thread.ts", "../../node_modules/@e280/comrade/s/parts/cluster.ts", "../../node_modules/@e280/comrade/s/comrade.ts", "../../node_modules/@e280/comrade/s/compat/browser.ts", "../../node_modules/@e280/comrade/s/index.browser.ts", "../../node_modules/mediabunny/dist/modules/misc.js", "../../node_modules/mediabunny/dist/modules/custom-coder.js", "../../node_modules/mediabunny/dist/modules/codec.js", "../../node_modules/mediabunny/dist/modules/codec-data.js", "../../node_modules/mediabunny/dist/modules/isobmff/isobmff-misc.js", "../../node_modules/mediabunny/dist/modules/matroska/ebml.js", "../../node_modules/mediabunny/dist/modules/matroska/matroska-misc.js", "../../node_modules/mediabunny/dist/modules/mp3/mp3-misc.js", "../../node_modules/mediabunny/dist/modules/ogg/ogg-misc.js", "../../node_modules/mediabunny/dist/modules/ogg/ogg-reader.js", "../../node_modules/mediabunny/dist/modules/demuxer.js", "../../node_modules/mediabunny/dist/modules/packet.js", "../../node_modules/mediabunny/dist/modules/sample.js", "../../node_modules/mediabunny/dist/modules/media-sink.js", "../../node_modules/mediabunny/dist/modules/input-track.js", "../../node_modules/mediabunny/dist/modules/reader.js", "../../node_modules/mediabunny/dist/modules/wave/riff-reader.js", "../../node_modules/mediabunny/dist/modules/wave/wave-demuxer.js", "../../node_modules/mediabunny/dist/modules/source.js", "../../node_modules/mediabunny/dist/modules/isobmff/isobmff-reader.js", "../../node_modules/mediabunny/dist/modules/isobmff/isobmff-demuxer.js", "../../node_modules/mediabunny/dist/modules/matroska/matroska-demuxer.js", "../../node_modules/mediabunny/dist/modules/mp3/mp3-reader.js", "../../node_modules/mediabunny/dist/modules/mp3/mp3-demuxer.js", "../../node_modules/mediabunny/dist/modules/ogg/ogg-demuxer.js", "../../node_modules/mediabunny/dist/modules/input-format.js", "../../node_modules/mediabunny/dist/modules/input.js", "../../s/driver/parts/machina.ts", "../../s/driver/fns/host.ts", "../../s/driver/utils/load-decoder-source.ts", "../../s/driver/driver.ts", "../../s/context.ts", "../../node_modules/wavesurfer.js/dist/wavesurfer.esm.js", "../../s/timeline/parts/waveform.ts", "../../s/demo/routines/waveform-test.ts", "../../s/timeline/parts/filmstrip.ts", "../../s/demo/routines/filmstrip-test.ts", "../../s/demo/routines/transcode-test.ts", "../../s/demo/demo.bundle.ts"],
4
- "sourcesContent": ["\nexport namespace JsonRpc {\n\texport type Requestish = Request | Request[]\n\texport type Respondish = Response | Response[]\n\texport type Bidirectional = Requestish | Respondish\n\n\t/////////////////////////////////////////////////////////////\n\n\texport const version = \"2.0\"\n\n\texport type Request<P extends Params = any> = (\n\t\t| Query<P>\n\t\t| Notification<P>\n\t)\n\n\texport type Response<Result = any> = (\n\t\t| Success<Result>\n\t\t| Failure\n\t)\n\n\texport type Serializable = (\n\t\t| void\n\t\t| null\n\t\t| undefined\n\t\t| boolean\n\t\t| number\n\t\t| string\n\t\t| Serializable[]\n\t\t| {[key: string]: Serializable}\n\t)\n\n\t/////////////////////////////////////////////////////////////\n\n\texport type Id = number | string\n\texport type Params = Serializable[] | Record<string, Serializable>\n\n\texport type Notification<P extends Params> = {\n\t\tjsonrpc: string\n\t\tmethod: string\n\t\tparams: P\n\t}\n\n\texport type Query<P extends Params> = {\n\t\tid: Id\n\t\tjsonrpc: string\n\t\tmethod: string\n\t\tparams: P\n\t}\n\n\texport type Error = {\n\t\tcode: number\n\t\tmessage: string\n\t\tdata?: any\n\t}\n\n\texport type Success<Result> = {\n\t\tjsonrpc: \"2.0\"\n\t\tid: Id\n\t\tresult: Result\n\t}\n\n\texport type Failure = {\n\t\tjsonrpc: \"2.0\"\n\t\tid: Id\n\t\terror: Error\n\t}\n\n\t/////////////////////////////////////////////////////////////\n\n\texport function getId(request: Request): Id | null {\n\t\treturn \"id\" in request\n\t\t\t? request.id\n\t\t\t: null\n\t}\n\n\texport const errorCodes = {\n\t\tserverError: -32000,\n\t\tunexposedError: -32001,\n\t}\n}\n\n", "\n/**\n * An error that has a publicly viewable name and message.\n * - this error class, and its subclasses, are the only kinds of errors that renraku will send back to clients\n * - so if you want a client to be able to read an error message you throw, it must be a subclass of ExposedError\n */\nexport class ExposedError extends Error {\n\treadonly name = this.constructor.name\n}\n\n////////////////////////////////////////////////////\n\nexport class RemoteError extends Error {\n\treadonly name = this.constructor.name\n}\n\nexport class RemoteTimeoutError extends RemoteError {\n\treadonly name = this.constructor.name\n}\n\n////////////////////////////////////////////////////\n\nexport class HttpError extends Error {\n\treadonly name = this.constructor.name\n\treadonly code: number\n\n\tconstructor(code: number, message: string) {\n\t\tsuper(message)\n\t\tthis.code = code\n\t}\n}\n\n", "\nimport {Tap} from \"../core/types.js\"\nimport {JsonRpc} from \"./json-rpc.js\"\nimport {ExposedError} from \"../core/errors.js\"\n\nexport async function respond<R>({\n\t\ttap,\n\t\trequest,\n\t\taction,\n\t}: {\n\t\ttap: Tap\n\t\trequest: JsonRpc.Request\n\t\taction: () => Promise<R>\n\t}): Promise<JsonRpc.Response<R> | null> {\n\n\tconst id = JsonRpc.getId(request)\n\n\ttry {\n\t\tconst result = await action()\n\n\t\tif (id === null)\n\t\t\treturn null\n\n\t\treturn {\n\t\t\tid,\n\t\t\tresult,\n\t\t\tjsonrpc: JsonRpc.version,\n\t\t}\n\t}\n\n\tcatch (error) {\n\t\ttap.rpcError({request, error})\n\n\t\tif (id === null)\n\t\t\treturn null\n\n\t\treturn {\n\t\t\tid,\n\t\t\tjsonrpc: JsonRpc.version,\n\t\t\terror: (error instanceof ExposedError)\n\t\t\t\t? {\n\t\t\t\t\tcode: JsonRpc.errorCodes.serverError,\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\tcode: JsonRpc.errorCodes.unexposedError,\n\t\t\t\t\tmessage: `unexposed error`,\n\t\t\t\t},\n\t\t}\n\t}\n}\n\n", "\nimport {asTheme} from \"./theme.js\"\n\nexport const basicTheme = () => asTheme(colors => ({\n\tplain: colors.none,\n\terrMessage: colors.mix(colors.brightRed, colors.bold),\n\terrName: colors.red,\n\terrStack: colors.mix(colors.red, colors.dim),\n\ttimestamp: colors.blue,\n\ttimestampErr: colors.red,\n}))\n\n", "\nimport {basicTheme} from \"./basic.js\"\n\nexport function autoTheme() {\n\treturn basicTheme()\n}\n\n", "\nexport const codes = Object.freeze({\n\n\t// regular colors\n\tblack: \"\\u001b[30m\",\n\tred: \"\\u001b[31m\",\n\tgreen: \"\\u001b[32m\",\n\tyellow: \"\\u001b[33m\",\n\tblue: \"\\u001b[34m\",\n\tmagenta: \"\\u001b[35m\",\n\tcyan: \"\\u001b[36m\",\n\twhite: \"\\u001b[37m\",\n\n\t// bright colors\n\tbrightBlack: \"\\u001b[90m\",\n\tbrightRed: \"\\u001b[91m\",\n\tbrightGreen: \"\\u001b[92m\",\n\tbrightYellow: \"\\u001b[93m\",\n\tbrightBlue: \"\\u001b[94m\",\n\tbrightMagenta: \"\\u001b[95m\",\n\tbrightCyan: \"\\u001b[96m\",\n\tbrightWhite: \"\\u001b[97m\",\n\n\t// background colors\n\tbgBlack: \"\\u001b[40m\",\n\tbgRed: \"\\u001b[41m\",\n\tbgGreen: \"\\u001b[42m\",\n\tbgYellow: \"\\u001b[43m\",\n\tbgBlue: \"\\u001b[44m\",\n\tbgMagenta: \"\\u001b[45m\",\n\tbgCyan: \"\\u001b[46m\",\n\tbgWhite: \"\\u001b[47m\",\n\n\t// bright background colors\n\tbgBrightBlack: \"\\u001b[100m\",\n\tbgBrightRed: \"\\u001b[101m\",\n\tbgBrightGreen: \"\\u001b[102m\",\n\tbgBrightYellow: \"\\u001b[103m\",\n\tbgBrightBlue: \"\\u001b[104m\",\n\tbgBrightMagenta: \"\\u001b[105m\",\n\tbgBrightCyan: \"\\u001b[106m\",\n\tbgBrightWhite: \"\\u001b[107m\",\n\n\t// styles\n\tbold: \"\\u001b[1m\",\n\tdim: \"\\u001b[2m\",\n\titalic: \"\\u001b[3m\",\n\tunderline: \"\\u001b[4m\",\n\tinverse: \"\\u001b[7m\",\n\thidden: \"\\u001b[8m\",\n\tstrikethrough: \"\\u001b[9m\",\n\n\t// reset\n\treset: \"\\u001b[0m\",\n})\n\n", "\nimport {codes} from \"./codes.js\"\n\nexport type ColorFn = (s: string) => string\n\nexport const colorFns = () => ({\n\tnone: (s: string) => s,\n\tuncolor,\n\tmix,\n\thex,\n\trgb,\n\tbgRgb,\n})\n\nexport function uncolor(s: string) {\n\treturn s.replace(\n\t\t/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,\n\t\t\"\",\n\t)\n}\n\nexport function mix(...colorFns: ColorFn[]) {\n\treturn (s: string) => {\n\t\tfor (const fn of colorFns)\n\t\t\ts = fn(s)\n\t\treturn s\n\t}\n}\n\nexport function hex(hex: string) {\n\thex = hex.replace(/^#/, \"\")\n\tlet bigint: number\n\tlet r: number\n\tlet g: number\n\tlet b: number\n\n\tif (hex.length === 3)\n\t\tbigint = parseInt(hex.split('').map(c => c + c).join(''), 16)\n\telse if (hex.length === 6)\n\t\tbigint = parseInt(hex, 16)\n\telse\n\t\tthrow new Error('Invalid hex color')\n\n\tr = (bigint >> 16) & 255\n\tg = (bigint >> 8) & 255\n\tb = bigint & 255\n\treturn rgb(r, g, b)\n}\n\nexport function rgb(r: number, g: number, b: number) {\n\tconst code = `\\u001b[38;2;${r};${g};${b}m`\n\treturn (s: string) => `${code}${s}${codes.reset}`\n}\n\nexport function bgRgb(r: number, g: number, b: number) {\n\tconst code = `\\u001b[48;2;${r};${g};${b}m`\n\treturn (s: string) => `${code}${s}${codes.reset}`\n}\n\n", "\nimport {Colors} from \"./colorful.js\"\nimport {codes} from \"./parts/codes.js\"\nimport {colorFns} from \"./parts/color-fns.js\"\n\nexport const colorless = {\n\t...<{[key in keyof typeof codes]: (s: string) => string}>(\n\t\tObject.fromEntries(\n\t\t\tObject.entries(codes)\n\t\t\t\t.map(([key]) => [\n\t\t\t\t\tkey,\n\t\t\t\t\t(s: string) => s,\n\t\t\t\t])\n\t\t)\n\t),\n\t...colorFns(),\n} as Colors\n\n", "\nimport {codes} from \"./parts/codes.js\"\nimport {colorFns} from \"./parts/color-fns.js\"\n\nexport type Colors = typeof colorful\n\nexport const colorful = {\n\t...<{[key in keyof typeof codes]: (s: string) => string}>(\n\t\tObject.fromEntries(\n\t\t\tObject.entries(codes)\n\t\t\t\t.map(([key, code]) => [\n\t\t\t\t\tkey,\n\t\t\t\t\t(s: string) => `${code}${s}${codes.reset}`,\n\t\t\t\t])\n\t\t)\n\t),\n\t...colorFns(),\n}\n\n", "\ndeclare const Deno: any\n\nexport function isDeno() {\n\treturn typeof Deno !== \"undefined\" && typeof Deno.version !== \"undefined\"\n}\n\nexport function isNode() {\n\treturn (\n\t\ttypeof process !== \"undefined\" &&\n\t\tprocess.versions &&\n\t\tprocess.versions.node\n\t)\n}\n\nexport function isColorSupported() {\n\tif (isNode())\n\t\treturn (process.env.FORCE_COLOR) || (\n\t\t\tprocess.stdout.isTTY &&\n\t\t\tprocess.env.TERM !== \"dumb\"\n\t\t)\n\n\telse if (isDeno())\n\t\treturn (Deno.env.get(\"FORCE_COLOR\")) || (\n\t\t\tDeno.isatty(Deno.stdout.rid) &&\n\t\t\tDeno.env.get(\"TERM\") !== \"dumb\"\n\t\t)\n\n\telse\n\t\treturn false\n}\n\nexport function exit(code: number) {\n\tif (isNode())\n\t\tprocess.exit(code)\n\telse if (isDeno())\n\t\tDeno.exit(code)\n}\n\nexport function hasEnv(name: string): boolean {\n\tif (isNode())\n\t\treturn name in process.env\n\telse if (isDeno())\n\t\treturn Deno.env.get(name) !== undefined\n\treturn false\n}\n\nexport function hasArg(arg: string): boolean {\n\tif (isNode())\n\t\treturn process.argv.slice(1).includes(arg)\n\telse if (isDeno())\n\t\treturn Deno.args.includes(arg)\n\telse\n\t\treturn false\n}\n\nfunction findArgValue(name: string, args: string[]) {\n\tfor (const arg of args) {\n\t\tif (arg.includes(\"=\")) {\n\t\t\tconst [first, ...rest] = arg.split(\"=\")\n\t\t\tif (first === name)\n\t\t\t\treturn rest.join(\"=\")\n\t\t}\n\t}\n}\n\nexport function getArg(name: string) {\n\tif (isNode())\n\t\treturn findArgValue(name, process.argv.slice(1))\n\telse if (isDeno())\n\t\treturn findArgValue(name, Deno.args)\n}\n\nexport function getEnv(name: string): string | undefined {\n\tif (isNode())\n\t\treturn process.env[name]\n\telse if (isDeno())\n\t\treturn Deno.env.get(name)\n}\n\nexport async function writeStdout(line: string) {\n\tif (isNode())\n\t\tprocess.stdout.write(line + \"\\n\")\n\telse if (isDeno())\n\t\tawait Deno.stdout.write(new TextEncoder().encode(line + \"\\n\"))\n\telse\n\t\tconsole.log(line)\n}\n\nexport async function writeStderr(line: string) {\n\tif (isNode())\n\t\tprocess.stderr.write(line + \"\\n\")\n\telse if (isDeno())\n\t\tawait Deno.stderr.write(new TextEncoder().encode(line + \"\\n\"))\n\telse\n\t\tconsole.error(line)\n}\n\n", "\nimport {colorless} from \"./colorless.js\"\nimport {colorful, Colors} from \"./colorful.js\"\nimport {isColorSupported} from \"../utils/supports.js\"\n\nexport const autoColors = (): Colors => {\n\treturn isColorSupported()\n\t\t? colorful\n\t\t: colorless\n}\n\n", "\nimport {Shaper} from \"./shaper.js\"\n\nexport const errorsShaper = (): Shaper => ({colors, theme}) => {\n\tconst palette = theme(colors)\n\n\tfunction errstring(error: Error) {\n\t\tconst stack = error.stack\n\t\t\t? \"\\n\" + error.stack + \"\\n\"\n\t\t\t: \"\"\n\t\treturn [\n\t\t\tpalette.errName(error.name + \":\"),\n\t\t\tpalette.errMessage(error.message),\n\t\t].join(\" \") + palette.errStack(stack)\n\t}\n\n\tfunction processErrors(item: any) {\n\t\treturn (item && item instanceof Error)\n\t\t\t? errstring(item)\n\t\t\t: item\n\t}\n\n\tfunction processAll(item: any) {\n\t\treturn (item && item instanceof Error)\n\t\t\t? errstring(item)\n\t\t\t: palette.errMessage(item)\n\t}\n\n\treturn {\n\t\tstdout: items => items.map(processErrors),\n\t\tstderr: items => items.map(processAll),\n\t}\n}\n\n", "\nimport {Theme} from \"../themes/theme.js\"\nimport {Colors} from \"../colors/colorful.js\"\n\nexport type ShaperContext = {\n\tcolors: Colors\n\ttheme: Theme\n}\n\nexport type Shaper = (context: ShaperContext) => ShaperFns\n\nexport type ShaperFns = {\n\tstdout: (items: any[]) => any[]\n\tstderr: (items: any[]) => any[]\n}\n\nexport function asShaper(shaper: Shaper) {\n\treturn shaper\n}\n\nexport function combineShapers(...shapers: Shaper[]): Shaper {\n\treturn context => ({\n\t\tstdout: items => {\n\t\t\tfor (const shaper of shapers)\n\t\t\t\titems = shaper(context).stdout(items)\n\t\t\treturn items\n\t\t},\n\t\tstderr: items => {\n\t\t\tfor (const shaper of shapers)\n\t\t\t\titems = shaper(context).stderr(items)\n\t\t\treturn items\n\t\t},\n\t})\n}\n\n", "\nimport {Shaper} from \"./shaper.js\"\n\nexport type TimestampOptions = {\n\ticon: string | undefined\n\tnow: () => number\n}\n\nfunction defaultTimestampOptions(): TimestampOptions {\n\treturn {\n\t\ticon: \"\uD83D\uDEA8\",\n\t\tnow: () => Date.now(),\n\t}\n}\n\nexport const timestampShaper = (options?: Partial<TimestampOptions>): Shaper => ({colors, theme}) => {\n\tconst opts = {...defaultTimestampOptions(), ...options}\n\tconst palette = theme(colors)\n\n\tconst date = new Date(opts.now())\n\n\tconst year = date.getUTCFullYear().toString().padStart(4, \"0\")\n\tconst month = (date.getUTCMonth() + 1).toString().padStart(2, \"0\")\n\tconst day = date.getUTCDate().toString().padStart(2, \"0\")\n\tconst calendar = `${year}-${month}-${day}`\n\n\tconst hour = date.getUTCHours().toString().padStart(2, \"0\")\n\tconst minute = date.getUTCMinutes().toString().padStart(2, \"0\")\n\tconst second = date.getUTCSeconds().toString().padStart(2, \"0\")\n\tconst milliseconds = date.getUTCMilliseconds().toString().padStart(3, \"0\")\n\tconst clock = `${hour}:${minute}:${second}.${milliseconds}`\n\n\tconst stamp = `${calendar}::${clock}`\n\n\treturn {\n\t\tstdout: items => [\n\t\t\tpalette.timestamp(stamp),\n\t\t\t...items,\n\t\t],\n\t\tstderr: items => [\n\t\t\tpalette.timestampErr(stamp),\n\t\t\t...[opts.icon].filter(Boolean),\n\t\t\t...items,\n\t\t],\n\t}\n}\n\n", "\nimport {errorsShaper} from \"./errors.js\"\nimport {combineShapers} from \"./shaper.js\"\nimport {timestampShaper} from \"./timestamp.js\"\n\nexport function autoShaper() {\n\treturn combineShapers(\n\t\terrorsShaper(),\n\t\ttimestampShaper(),\n\t)\n}\n\n", "\nimport {Writer} from \"./writer.js\"\n\ndeclare const Deno: any\n\nexport const denoWriter = (): Writer => ({\n\tstdout: async line => {\n\t\tawait Deno.stdout.write(new TextEncoder().encode(line + \"\\n\"))\n\t},\n\tstderr: async line => {\n\t\tawait Deno.stderr.write(new TextEncoder().encode(line + \"\\n\"))\n\t},\n})\n\n", "\nimport {Writer} from \"./writer.js\"\n\nexport const nodeWriter = (): Writer => ({\n\tstdout: async(line: string) => void process.stdout.write(line + \"\\n\"),\n\tstderr: async(line: string) => void process.stderr.write(line + \"\\n\"),\n})\n\n", "\nimport {Writer} from \"./writer.js\"\n\nexport const consoleWriter = (): Writer => ({\n\tstdout: async line => console.log(line),\n\tstderr: async line => console.error(line),\n})\n\n", "\nimport {Writer} from \"./writer.js\"\nimport {denoWriter} from \"./deno.js\"\nimport {nodeWriter} from \"./node.js\"\nimport {consoleWriter} from \"./console.js\"\nimport {isDeno, isNode} from \"../utils/supports.js\"\n\nexport const autoWriter = (): Writer => {\n\tif (isDeno()) return denoWriter()\n\telse if (isNode()) return nodeWriter()\n\telse return consoleWriter()\n}\n\n", "\nimport {Writer} from \"./writer.js\"\n\nexport const voidWriter = (): Writer => ({\n\tstdout: async() => undefined,\n\tstderr: async() => undefined,\n})\n\n", "\nimport {Shaper} from \"./shaper.js\"\n\nexport function noneShaper(): Shaper {\n\treturn () => ({\n\t\tstdout: items => items,\n\t\tstderr: items => items,\n\t})\n}\n\n", "\nimport {Theme} from \"./themes/theme.js\"\nimport {Writer} from \"./writers/writer.js\"\nimport {autoTheme} from \"./themes/auto.js\"\nimport {autoColors} from \"./colors/auto.js\"\nimport {autoShaper} from \"./shapers/auto.js\"\nimport {autoWriter} from \"./writers/auto.js\"\nimport {basicTheme} from \"./themes/basic.js\"\nimport {denoWriter} from \"./writers/deno.js\"\nimport {nodeWriter} from \"./writers/node.js\"\nimport {voidWriter} from \"./writers/void.js\"\nimport {noneShaper} from \"./shapers/none.js\"\nimport {colorless} from \"./colors/colorless.js\"\nimport {errorsShaper} from \"./shapers/errors.js\"\nimport {consoleWriter} from \"./writers/console.js\"\nimport {colorful, Colors} from \"./colors/colorful.js\"\nimport {timestampShaper} from \"./shapers/timestamp.js\"\nimport {combineShapers, Shaper} from \"./shapers/shaper.js\"\n\nexport class Logger {\n\tstatic writers = {\n\t\tauto: autoWriter,\n\t\tvoid: voidWriter,\n\t\tdeno: denoWriter,\n\t\tnode: nodeWriter,\n\t\tconsole: consoleWriter,\n\t}\n\n\tstatic colors = {\n\t\tauto: autoColors,\n\t\tcolorful: () => colorful,\n\t\tcolorless: () => colorless,\n\t}\n\n\tstatic themes = {\n\t\tauto: autoTheme,\n\t\tbasic: basicTheme,\n\t}\n\n\tstatic shapers = {\n\t\tauto: autoShaper,\n\t\tnone: noneShaper,\n\t\terrors: errorsShaper,\n\t\ttimestamp: timestampShaper,\n\t}\n\n\twriter: Writer = Logger.writers.auto()\n\tcolors: Colors = Logger.colors.auto()\n\ttheme: Theme = Logger.themes.auto()\n\tshaper: Shaper = Logger.shapers.auto()\n\n\tasync log(...items: any[]) {\n\t\tawait this.writer.stdout(\n\t\t\tthis.shaper(this).stdout(items).join(\" \")\n\t\t)\n\t}\n\n\tasync error(...items: any[]) {\n\t\tawait this.writer.stderr(\n\t\t\tthis.shaper(this).stderr(items).join(\" \")\n\t\t)\n\t}\n\n\tsetWriter(writer: Writer) {\n\t\tthis.writer = writer\n\t\treturn this\n\t}\n\n\tsetColors(colors: Colors) {\n\t\tthis.colors = colors\n\t\treturn this\n\t}\n\n\tsetTheme(theme: Theme) {\n\t\tthis.theme = theme\n\t\treturn this\n\t}\n\n\tsetShaper(...shapers: Shaper[]) {\n\t\tthis.shaper = combineShapers(...shapers)\n\t\treturn this\n\t}\n}\n\n", "\nexport const Bytes = Object.freeze({\n\teq(a: Uint8Array, b: Uint8Array) {\n\t\tif (a.length !== b.length)\n\t\t\treturn false\n\t\tfor (let i = 0; i <= a.length; i++) {\n\t\t\tif (a.at(i) !== b.at(i))\n\t\t\t\treturn false\n\t\t}\n\t\treturn true\n\t},\n\n\trandom(count: number) {\n\t\treturn crypto.getRandomValues(new Uint8Array(count))\n\t},\n})\n\n", "\n/*\n\n256-bit hex ids look like this:\n\n\t8ff8dfbc7c994c5439d2dd327b9898aa6796f97fb396e262985f03f868707e32\n\t6b99284a2c4a1c5f101502bd009f9fb592ca4427e4375155e411ddd07ed9da6b\n\t2eb73fb00a2b9e38c855b5aa353b530d820a3a2dcea5013b7e4e277ddfe9d0ad\n\n*/\n\nimport {Bytes} from \"./bytes.js\"\n\nexport const Hex = Object.freeze({\n\tfromBytes(bytes: Uint8Array) {\n\t\treturn [...bytes]\n\t\t\t.map(byte => byte.toString(16).padStart(2, \"0\"))\n\t\t\t.join(\"\")\n\t},\n\n\ttoBytes(string: string) {\n\t\tif (string.length % 2 !== 0)\n\t\t\tthrow new Error(\"must have even number of hex characters\")\n\t\tconst bytes = new Uint8Array(string.length / 2)\n\t\tfor (let i = 0; i < string.length; i += 2)\n\t\t\tbytes[i / 2] = parseInt(string.slice(i, i + 2), 16)\n\t\treturn bytes\n\t},\n\n\t/** generate a random hex string. byteCount defaults to 32. */\n\trandom(byteCount = 32) {\n\t\treturn this.fromBytes(Bytes.random(byteCount))\n\t},\n\n\t/** @deprecated renamed to `fromBytes` */\n\tstring(bytes: Uint8Array) {\n\t\treturn Hex.fromBytes(bytes)\n\t},\n\n\t/** @deprecated renamed to `toBytes` */\n\tbytes(string: string) {\n\t\treturn Hex.toBytes(string)\n\t},\n})\n\n", "\n/*\n\n256-bit base58 ids look like this:\n\n\t9X1D9rdkDgRdykzmogNcxfopRc7TnbS869ow1E2ehCFS\n\tAmRKyNfq6jhhsd9qda1Y6rAVS2NLUqyTUvfcB2wUiiAC\n\t8skYcqBAXsejDcJzsZMo19PErt43DHP3bykaXBtMvdu\n\n*/\n\nimport {Hex} from \"./hex.js\"\nimport {Bytes} from \"./bytes.js\"\n\nconst base = 58\nconst characters = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\"\n\nexport const Base58 = Object.freeze({\n\tfromBytes(bytes: Uint8Array) {\n\t\tlet intVal = BigInt(\"0x\" + Hex.fromBytes(bytes))\n\t\tlet encoded = \"\"\n\n\t\twhile (intVal > 0) {\n\t\t\tconst remainder = intVal % BigInt(base)\n\t\t\tintVal = intVal / BigInt(base)\n\t\t\tencoded = characters[Number(remainder)] + encoded\n\t\t}\n\n\t\tfor (const byte of bytes) {\n\t\t\tif (byte === 0) encoded = characters[0] + encoded\n\t\t\telse break\n\t\t}\n\n\t\treturn encoded\n\t},\n\n\ttoBytes(string: string) {\n\t\tlet intVal = BigInt(0)\n\n\t\tfor (const char of string) {\n\t\t\tconst index = characters.indexOf(char)\n\t\t\tif (index === -1) throw new Error(`Invalid character '${char}' in base58 string`)\n\t\t\tintVal = intVal * BigInt(base) + BigInt(index)\n\t\t}\n\n\t\tlet hex = intVal.toString(16)\n\t\tif (hex.length % 2 !== 0) hex = \"0\" + hex\n\t\tconst bytes = Hex.toBytes(hex)\n\n\t\tlet leadingZeroes = 0\n\t\tfor (const char of string) {\n\t\t\tif (char === characters[0]) leadingZeroes++\n\t\t\telse break\n\t\t}\n\n\t\tconst decoded = new Uint8Array(leadingZeroes + bytes.length)\n\t\tdecoded.set(bytes, leadingZeroes)\n\t\treturn decoded\n\t},\n\n\trandom(count = 32) {\n\t\treturn this.fromBytes(Bytes.random(count))\n\t},\n\n\t/** @deprecated renamed to `fromBytes` */\n\tstring(bytes: Uint8Array) {\n\t\treturn Base58.fromBytes(bytes)\n\t},\n\n\t/** @deprecated renamed to `toBytes` */\n\tbytes(string: string) {\n\t\treturn Base58.toBytes(string)\n\t},\n})\n\n", "\nimport {Bytes} from \"./bytes.js\"\n\nexport type Lexicon = {\n\tcharacters: string\n\tnegativePrefix?: string\n\tpadding?: {\n\t\tcharacter: string\n\t\tsize: number\n\t}\n}\n\nexport class BaseX {\n\tstatic lexicons = Object.freeze({\n\t\tbase2: {characters: \"01\"},\n\t\thex: {characters: \"0123456789abcdef\"},\n\t\tbase36: {characters: \"0123456789abcdefghijklmnopqrstuvwxyz\"},\n\t\tbase58: {characters: \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\"},\n\t\tbase62: {characters: \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"},\n\t\tbase64url: {\n\t\t\tnegativePrefix: \"~\",\n\t\t\tcharacters: \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\",\n\t\t},\n\t\tbase64: {\n\t\t\tcharacters: \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",\n\t\t\tpadding: {character: \"=\", size: 4},\n\t\t},\n\t})\n\n\tprivate lookup: Record<string, number>\n\tprivate negativePrefix: string\n\n\tconstructor(public lexicon: Lexicon) {\n\t\tthis.lookup = Object.fromEntries(\n\t\t\t[...lexicon.characters].map((char, i) => [char, i])\n\t\t)\n\t\tthis.negativePrefix = lexicon.negativePrefix ?? \"-\"\n\t}\n\n\ttoBytes(s: string): Uint8Array {\n\t\tconst bitsPerChar = Math.log2(this.lexicon.characters.length)\n\t\tif (Number.isInteger(bitsPerChar)) {\n\t\t\t// Bitstream mode (for power-of-2 lexicons)\n\t\t\tlet bitBuffer = 0\n\t\t\tlet bitCount = 0\n\t\t\tconst output: number[] = []\n\n\t\t\tfor (const char of s) {\n\t\t\t\tif (char === this.lexicon.padding?.character) continue\n\t\t\t\tconst val = this.lookup[char]\n\t\t\t\tif (val === undefined) throw new Error(`Invalid character: ${char}`)\n\t\t\t\tbitBuffer = (bitBuffer << bitsPerChar) | val\n\t\t\t\tbitCount += bitsPerChar\n\n\t\t\t\twhile (bitCount >= 8) {\n\t\t\t\t\tbitCount -= 8\n\t\t\t\t\toutput.push((bitBuffer >> bitCount) & 0xFF)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn new Uint8Array(output)\n\t\t}\n\n\t\t// Radix mode fallback\n\t\tlet num = 0n\n\t\tconst base = BigInt(this.lexicon.characters.length)\n\t\tlet negative = false\n\t\tif (s.startsWith(this.negativePrefix)) {\n\t\t\ts = s.slice(this.negativePrefix.length)\n\t\t\tnegative = true\n\t\t}\n\t\tfor (const char of s) {\n\t\t\tconst val = this.lookup[char]\n\t\t\tif (val === undefined) throw new Error(`Invalid character: ${char}`)\n\t\t\tnum = num * base + BigInt(val)\n\t\t}\n\t\tconst out: number[] = []\n\t\twhile (num > 0n) {\n\t\t\tout.unshift(Number(num % 256n))\n\t\t\tnum = num / 256n\n\t\t}\n\t\treturn new Uint8Array(out)\n\t}\n\n\tfromBytes(bytes: Uint8Array): string {\n\t\tconst bitsPerChar = Math.log2(this.lexicon.characters.length)\n\t\tif (Number.isInteger(bitsPerChar)) {\n\t\t\t// Bitstream mode (for power-of-2 lexicons)\n\t\t\tlet bitBuffer = 0\n\t\t\tlet bitCount = 0\n\t\t\tlet out = \"\"\n\n\t\t\tfor (const byte of bytes) {\n\t\t\t\tbitBuffer = (bitBuffer << 8) | byte\n\t\t\t\tbitCount += 8\n\n\t\t\t\twhile (bitCount >= bitsPerChar) {\n\t\t\t\t\tbitCount -= bitsPerChar\n\t\t\t\t\tconst index = (bitBuffer >> bitCount) & ((1 << bitsPerChar) - 1)\n\t\t\t\t\tout += this.lexicon.characters[index]\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// \uD83E\uDE79 flush remaining bits\n\t\t\tif (bitCount > 0) {\n\t\t\t\tconst index = (bitBuffer << (bitsPerChar - bitCount)) & ((1 << bitsPerChar) - 1)\n\t\t\t\tout += this.lexicon.characters[index]\n\t\t\t}\n\n\t\t\t// Add padding if applicable\n\t\t\tif (this.lexicon.padding) {\n\t\t\t\twhile (out.length % this.lexicon.padding.size !== 0)\n\t\t\t\t\tout += this.lexicon.padding.character\n\t\t\t}\n\n\t\t\treturn out\n\t\t}\n\n\t\t// Radix mode fallback\n\t\tlet num = 0n\n\t\tfor (const byte of bytes)\n\t\t\tnum = (num << 8n) + BigInt(byte)\n\n\t\tif (num === 0n) return this.lexicon.characters[0]\n\n\t\tconst base = BigInt(this.lexicon.characters.length)\n\t\tlet out = \"\"\n\t\twhile (num > 0n) {\n\t\t\tout = this.lexicon.characters[Number(num % base)] + out\n\t\t\tnum = num / base\n\t\t}\n\t\treturn out\n\t}\n\n\ttoInteger(s: string) {\n\t\tif (!s) return 0\n\t\tlet n = 0n\n\t\tlet negative = false\n\t\tconst base = BigInt(this.lexicon.characters.length)\n\t\tif (s.startsWith(this.negativePrefix)) {\n\t\t\ts = s.slice(this.negativePrefix.length)\n\t\t\tnegative = true\n\t\t}\n\t\tfor (const char of s) {\n\t\t\tconst value = this.lookup[char]\n\t\t\tif (value === undefined) throw new Error(`Invalid character: ${char}`)\n\t\t\tn = n * base + BigInt(value)\n\t\t}\n\t\treturn Number(negative ? -n : n)\n\t}\n\n\tfromInteger(n: number) {\n\t\tn = Math.floor(n)\n\t\tconst negative = n < 0\n\t\tlet num = BigInt(negative ? -n : n)\n\t\tif (num === 0n) return this.lexicon.characters[0]\n\t\tconst base = BigInt(this.lexicon.characters.length)\n\t\tlet out = \"\"\n\t\twhile (num > 0n) {\n\t\t\tout = this.lexicon.characters[Number(num % base)] + out\n\t\t\tnum = num / base\n\t\t}\n\t\treturn negative ? `${this.negativePrefix}${out}` : out\n\t}\n\n\trandom(count = 32) {\n\t\treturn this.fromBytes(Bytes.random(count))\n\t}\n}\n\n", "\nimport {Bytes} from \"./bytes.js\"\n\nexport const Base64 = Object.freeze({\n\tfromBytes(bytes: Uint8Array) {\n\t\treturn (typeof btoa === \"function\")\n\t\t\t? btoa(String.fromCharCode(...bytes))\n\t\t\t: Buffer.from(bytes).toString(\"base64\")\n\t},\n\n\ttoBytes(string: string) {\n\t\treturn (typeof atob === \"function\")\n\t\t\t? Uint8Array.from(atob(string), char => char.charCodeAt(0))\n\t\t\t: Uint8Array.from(Buffer.from(string, \"base64\"))\n\t},\n\n\trandom(count = 32) {\n\t\treturn this.fromBytes(Bytes.random(count))\n\t},\n\n\t/** @deprecated rename to \"fromBytes\" */\n\tstring(bytes: Uint8Array) {\n\t\treturn Base64.fromBytes(bytes)\n\t},\n\n\t/** @deprecated rename to \"toBytes\" */\n\tbytes(string: string) {\n\t\treturn Base64.toBytes(string)\n\t},\n})\n\n", "\nexport const Txt = Object.freeze({\n\tfromBytes(bytes: Uint8Array) {\n\t\treturn new TextDecoder().decode(bytes)\n\t},\n\n\ttoBytes(string: string) {\n\t\treturn new TextEncoder().encode(string)\n\t},\n\n\t/** @deprecated renamed to `fromBytes` */\n\tstring(bytes: Uint8Array) {\n\t\treturn Txt.fromBytes(bytes)\n\t},\n\n\t/** @deprecated renamed to `toBytes` */\n\tbytes(string: string) {\n\t\treturn Txt.toBytes(string)\n\t},\n})\n\n", "\nexport const is = Object.freeze({\n\tset: <X>(x: X): x is NonNullable<X> =>\n\t\tx !== undefined && x !== null,\n\n\tunset: (x: any): x is (undefined | null) =>\n\t\tx === undefined || x === null,\n\n\tboolean: (x: any): x is boolean =>\n\t\ttypeof x === \"boolean\",\n\n\tnumber: (x: any): x is number =>\n\t\ttypeof x === \"number\",\n\n\tstring: (x: any): x is string =>\n\t\ttypeof x === \"string\",\n\n\tbigint: (x: any): x is bigint =>\n\t\ttypeof x === \"bigint\",\n\n\tobject: <X>(x: X): x is object & NonNullable<X> =>\n\t\ttypeof x === \"object\" && x !== null,\n\n\tarray: (x: any | any[]): x is any[] =>\n\t\tArray.isArray(x),\n\n\tfn: (x: any): x is (...a: any[]) => any =>\n\t\ttypeof x === \"function\",\n\n\tsymbol: (x: any): x is symbol =>\n\t\ttypeof x === \"symbol\",\n})\n\n", "\nexport class DeadlineError extends Error {\n\tname = this.constructor.name\n\tconstructor(public milliseconds: number, message: string) {\n\t\tsuper(`${message}, timed out in ${(milliseconds / 1000).toFixed(1)} seconds`)\n\t}\n}\n\n/** set a deadline for a fn to do something, will reject with a `DeadlineError` if it takes too long */\nexport function deadline<R>(milliseconds: number, message: string, fn: () => Promise<R>) {\n\tif (milliseconds <= 0 || milliseconds === Infinity)\n\t\treturn fn()\n\n\treturn new Promise<R>((resolve, reject) => {\n\n\t\tconst id = setTimeout(\n\t\t\t() => reject(new DeadlineError(milliseconds, message)),\n\t\t\tmilliseconds,\n\t\t)\n\n\t\tfn()\n\t\t\t.then(resolve)\n\t\t\t.catch(reject)\n\t\t\t.finally(() => clearTimeout(id))\n\t})\n}\n\n", "\n/** a promise which can be resolved from the outside */\nexport type Deferred<R> = {\n\tpromise: Promise<R>\n\tresolve: (result: R) => void\n\treject: (reason: any) => void\n\n\t/** ties the fate of this deferred promise to the outcome of the provided outsidePromise */\n\tentangle: (outsidePromise: Promise<R>) => Promise<R>\n}\n\n/** returns a deferred promise with exposed resolve and reject fns */\nexport function defer<R>(): Deferred<R> {\n\tlet resolve!: (result: R) => void\n\tlet reject!: (reason: any) => void\n\n\tconst promise = new Promise<R>((res, rej) => {\n\t\tresolve = res\n\t\treject = rej\n\t})\n\n\tfunction entangle(outside: Promise<R>) {\n\t\toutside.then(resolve).catch(reject)\n\t\treturn promise\n\t}\n\n\treturn {promise, resolve, reject, entangle}\n}\n\n", "\nimport {is} from \"./is.js\"\n\n/** return a value within an object tree, found at the given path. */\nexport function drill<xResult>(\n\t\tobject: {[key: string]: any},\n\t\tpath: string[],\n\t): xResult {\n\n\tlet current: any = object\n\n\tfor (const key of path) {\n\t\tcurrent = current[key]\n\t\tif (is.unset(current))\n\t\t\tbreak\n\t}\n\n\treturn current\n}\n\n", "\nexport class Hat<T> {\n\t#content: T[] = []\n\n\tconstructor(public items: T[]) {\n\t\tthis.#content = [...items]\n\t}\n\n\tpull() {\n\t\tif (this.#content.length === 0)\n\t\t\tthis.#content = [...this.items]\n\t\tconst index = Math.floor(Math.random() * this.#content.length)\n\t\tconst [item] = this.#content.splice(index, 1)\n\t\treturn item\n\t}\n}\n\n", "\nexport function ob<Ob extends object>(o: Ob) {\n\treturn {\n\t\tmap: <Value>(transform: ObTransform<Ob, Value>) => (\n\t\t\tobMap(o, transform)\n\t\t),\n\t\tfilter: (predicate: ObPredicate<Ob>) => (\n\t\t\tobFilter(o, predicate)\n\t\t),\n\t}\n}\n\n////////////\n////////////\n\nob.pipe = Object.freeze({\n\tmap: <O extends {}, Value>(\n\t\t\ttransform: (value: O[keyof O], key: keyof O) => Value,\n\t\t) => (\n\t\t(o: O) => obMap(o, transform)\n\t),\n\tfilter: <O extends {}>(\n\t\t\ttransform: (value: O[keyof O], key: keyof O) => boolean,\n\t\t) => (\n\t\t(o: O) => obFilter(o, transform) as {[key: string]: O[keyof O]}\n\t),\n})\n\n////////////\n////////////\n\nexport type ObTransform<Ob extends object, Value> = (\n\t(value: Ob[keyof Ob], key: keyof Ob) => Value\n)\n\nexport type ObPredicate<Ob extends object> = (\n\t(value: Ob[keyof Ob], key: keyof Ob) => boolean\n)\n\n////////////\n////////////\n\nconst obMap = <Ob extends object, Value>(\n\t\to: Ob,\n\t\ttransform: ObTransform<Ob, Value>,\n\t) => {\n\n\treturn Object.fromEntries(\n\t\tObject.entries(o).map(\n\t\t\t([key, value]: any) => [key, transform(value, key)]\n\t\t)\n\t) as {[P in keyof Ob]: Value}\n}\n\nconst obFilter = <Ob extends object>(\n\t\to: Ob,\n\t\tpredicate: ObPredicate<Ob>,\n\t) => {\n\n\treturn Object.fromEntries(\n\t\tObject.entries(o).filter(\n\t\t\t([key, value]: any) => predicate(value, key)\n\t\t)\n\t) as {[P in keyof Ob]?: Ob[keyof Ob]}\n}\n\n", "\nimport {defer} from \"./defer.js\"\n\nexport type Listener<A extends any[]> = (...a: A) => (void | Promise<void>)\n\nexport interface Xub<A extends any[] = []> {\n\n\t/** publish to all subscribed listeners. */\n\tpub(...a: A): Promise<void>\n\n\t/** subscribe a listener function. */\n\tsub(fn: Listener<A>): () => void\n\n\t/**\n\t * subscribe a listener function.\n\t * @alias sub\n\t */\n\ton(fn: Listener<A>): () => void\n\n\t/** subscribe a listener function that unsubscribes itself after being invoked. */\n\tonce(): Promise<A>\n\n\t/** wipe all listeners attached to this. */\n\tclear(): void\n}\n\n/** subscriber fn that can be published to. */\nexport interface Sub<A extends any[] = []> extends Xub<A> {\n\t(fn: Listener<A>): () => void\n}\n\n/** publisher fn that can be published to. */\nexport interface Pub<A extends any[] = []> extends Xub<A> {\n\t(...a: A): Promise<void>\n}\n\nexport function xub<A extends any[] = []>() {\n\tconst set = new Set<Listener<A>>()\n\n\tfunction sub(fn: Listener<A>) {\n\t\tset.add(fn)\n\t\treturn () => { set.delete(fn) }\n\t}\n\n\tasync function pub(...a: A) {\n\t\tawait Promise.all([...set].map(fn => fn(...a)))\n\t}\n\n\tasync function once() {\n\t\tconst {promise, resolve} = defer<A>()\n\t\tconst unsubscribe = sub((...a) => {\n\t\t\tresolve(a)\n\t\t\tunsubscribe()\n\t\t})\n\t\treturn promise\n\t}\n\n\tfunction clear() {\n\t\tset.clear()\n\t}\n\n\tsub.pub = pub\n\tsub.sub = sub\n\tsub.on = sub\n\tsub.once = once\n\tsub.clear = clear\n\n\tpub.pub = pub\n\tpub.sub = sub\n\tpub.on = sub\n\tpub.once = once\n\tpub.clear = clear\n\n\treturn [pub, sub] as [Pub<A>, Sub<A>]\n}\n\n/** create a subscriber fn that can be published to */\nexport function sub<A extends any[] = []>(listener?: Listener<A>): Sub<A> {\n\tconst fn = xub<A>()[1]\n\tif (listener)\n\t\tfn.sub(listener)\n\treturn fn\n}\n\n/** create a publisher fn that can be subscribed to */\nexport function pub<A extends any[] = []>(listener?: Listener<A>): Pub<A> {\n\tconst fn = xub<A>()[0]\n\tif (listener)\n\t\tfn.sub(listener)\n\treturn fn\n}\n\n", "\n/** a trashcan where you can collect disposer fns, and dispose them all at once */\nexport class Trash {\n\t#fns: (() => void)[] = []\n\n\t/** add a disposer fn to the trashcan */\n\tadd(...fns: (() => void)[]) {\n\t\tthis.#fns.push(...fns)\n\t\treturn this\n\t}\n\n\t/** add a disposable object to the trashcan, and return the object */\n\tdisposable<X extends {dispose: () => void}>(x: X) {\n\t\treturn this.bag(x, () => x.dispose())\n\t}\n\n\t/** add an item's disposer fn, and return the item */\n\tbag<X>(x: X, fn: (x: X) => void) {\n\t\tthis.add(() => fn(x))\n\t\treturn x\n\t}\n\n\t/** dispose of everything in the trashcan */\n\tdispose() {\n\t\tfor (const fn of this.#fns.reverse())\n\t\t\tfn()\n\t\tthis.#fns = []\n\t}\n}\n\n", "\nimport {Hat} from \"@e280/stz\"\n\nexport class RandomUserEmojis extends Hat<string> {\n\tconstructor() {\n\t\tsuper([\n\t\t\t\"\uD83D\uDC36\",\n\t\t\t\"\uD83D\uDC15\",\n\t\t\t\"\uD83D\uDC29\",\n\t\t\t\"\uD83D\uDC3A\",\n\t\t\t\"\uD83E\uDD8A\",\n\t\t\t\"\uD83E\uDD9D\",\n\t\t\t\"\uD83D\uDC31\",\n\t\t\t\"\uD83D\uDC08\",\n\t\t\t\"\uD83D\uDC2F\",\n\t\t\t\"\uD83D\uDC05\",\n\t\t\t\"\uD83D\uDC06\",\n\t\t\t\"\uD83D\uDC34\",\n\t\t\t\"\uD83D\uDC0E\",\n\t\t\t\"\uD83E\uDD84\",\n\t\t\t\"\uD83E\uDD93\",\n\t\t\t\"\uD83E\uDD8D\",\n\t\t\t\"\uD83E\uDDA7\",\n\t\t\t\"\uD83E\uDDA3\",\n\t\t\t\"\uD83D\uDC18\",\n\t\t\t\"\uD83E\uDD8F\",\n\t\t\t\"\uD83E\uDD9B\",\n\t\t\t\"\uD83D\uDC2D\",\n\t\t\t\"\uD83D\uDC01\",\n\t\t\t\"\uD83D\uDC00\",\n\t\t\t\"\uD83D\uDC39\",\n\t\t\t\"\uD83D\uDC30\",\n\t\t\t\"\uD83D\uDC07\",\n\t\t\t\"\uD83E\uDDA8\",\n\t\t\t\"\uD83E\uDDA1\",\n\t\t\t\"\uD83E\uDD98\",\n\t\t\t\"\uD83E\uDD99\",\n\t\t\t\"\uD83D\uDC3F\uFE0F\",\n\t\t\t\"\uD83E\uDDA6\",\n\t\t\t\"\uD83E\uDDA5\",\n\t\t\t\"\uD83D\uDC3B\",\n\t\t\t\"\uD83D\uDC28\",\n\t\t\t\"\uD83D\uDC3C\",\n\t\t\t\"\uD83E\uDDAB\",\n\t\t\t\"\uD83D\uDC37\",\n\t\t\t\"\uD83D\uDC3D\",\n\t\t\t\"\uD83D\uDC16\",\n\t\t\t\"\uD83D\uDC17\",\n\t\t\t\"\uD83D\uDC2E\",\n\t\t\t\"\uD83D\uDC04\",\n\t\t\t\"\uD83D\uDC03\",\n\t\t\t\"\uD83D\uDC02\",\n\t\t\t\"\uD83E\uDD8C\",\n\t\t\t\"\uD83D\uDC10\",\n\t\t\t\"\uD83D\uDC0F\",\n\t\t\t\"\uD83D\uDC11\",\n\t\t\t\"\uD83D\uDC2A\",\n\t\t\t\"\uD83D\uDC2B\",\n\t\t\t\"\uD83D\uDC26\",\n\t\t\t\"\uD83D\uDC27\",\n\t\t\t\"\uD83E\uDD85\",\n\t\t\t\"\uD83E\uDD86\",\n\t\t\t\"\uD83E\uDDA2\",\n\t\t\t\"\uD83E\uDD89\",\n\t\t\t\"\uD83E\uDDA9\",\n\t\t\t\"\uD83E\uDDA4\",\n\t\t\t\"\uD83D\uDC38\",\n\t\t\t\"\uD83E\uDD8E\",\n\t\t\t\"\uD83D\uDC22\",\n\t\t\t\"\uD83D\uDC0D\",\n\t\t\t\"\uD83D\uDC0A\",\n\t\t\t\"\uD83D\uDC20\",\n\t\t\t\"\uD83D\uDC1F\",\n\t\t\t\"\uD83E\uDD88\",\n\t\t\t\"\uD83D\uDC21\",\n\t\t\t\"\uD83D\uDC2C\",\n\t\t\t\"\uD83D\uDC0B\",\n\t\t\t\"\uD83D\uDC33\",\n\t\t\t\"\uD83D\uDC1E\",\n\t\t\t\"\uD83D\uDC1C\",\n\t\t\t\"\uD83D\uDC1D\",\n\t\t\t\"\uD83E\uDD8B\",\n\t\t\t\"\uD83D\uDC0C\",\n\t\t\t\"\uD83E\uDD97\",\n\t\t\t\"\uD83E\uDEB2\",\n\t\t\t\"\uD83E\uDD9F\",\n\t\t\t\"\uD83E\uDDA0\",\n\t\t\t\"\uD83E\uDEC3\",\n\t\t])\n\t}\n}\n\n", "\nimport {Logger} from \"@e280/sten\"\nimport {Tap, HttpMeta} from \"../types.js\"\nimport {RandomUserEmojis} from \"../../tools/random-user-emojis.js\"\n\nexport class LoggerTap extends Logger implements Tap {\n\tstatic dummy() {\n\t\treturn new this().setWriter(Logger.writers.void())\n\t}\n\n\trequest: Tap[\"request\"] = async({request, label}) => {\n\t\tconst g = this.colors.none\n\t\tthis.log(\n\t\t\t...[label].filter(Boolean),\n\t\t\tg(`${request.method}()`),\n\t\t)\n\t}\n\n\trpcError: Tap[\"rpcError\"] = async({request, error, label}) => {\n\t\tthis.error(\n\t\t\t...[label].filter(Boolean),\n\t\t\t`${request.method}()`,\n\t\t\terror,\n\t\t)\n\t}\n\n\t#emojis = new RandomUserEmojis()\n\n\t#requestInfo(meta: HttpMeta) {\n\t\treturn [\n\t\t\tthis.colors.yellow(`[${meta.ip}]`),\n\t\t\tthis.colors.green(meta.headers.origin ?meta.headers.origin :\"(no-origin)\"),\n\t\t].join(\" \")\n\t}\n\n\thttp(meta: HttpMeta): Tap {\n\t\tconst label = this.#requestInfo(meta)\n\t\treturn {\n\t\t\terror: this.error.bind(this),\n\t\t\trequest: o => this.request({...o, label}),\n\t\t\trpcError: o => this.rpcError({...o, label}),\n\t\t}\n\t}\n\n\twebSocket(meta: HttpMeta) {\n\t\tconst info = this.#requestInfo(meta)\n\t\tconst emoji = this.#emojis.pull()\n\t\tconst g = this.colors.yellow\n\t\tconst prep = (isRemote: boolean): Tap => {\n\t\t\tconst label = info + \" \" + (\n\t\t\t\tisRemote\n\t\t\t\t\t? emoji + g(\" <-\")\n\t\t\t\t\t: emoji + g(\" ->\")\n\t\t\t)\n\t\t\treturn {\n\t\t\t\terror: this.error.bind(this),\n\t\t\t\trequest: o => this.request({...o, label}),\n\t\t\t\trpcError: o => this.rpcError({...o, label}),\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tremote: prep(true),\n\t\t\tlocal: prep(false),\n\t\t}\n\t}\n}\n\n", "\nimport {Tap} from \"../types.js\"\nimport {LoggerTap} from \"./logger.js\"\n\nexport class ErrorTap extends LoggerTap implements Tap {\n\trequest: Tap[\"request\"] = async() => {}\n}\n\n", "\nimport {ErrorTap} from \"./error.js\"\n\nexport const defaultTap = new ErrorTap()\n\n", "\nimport {drill} from \"@e280/stz\"\nimport {respond} from \"../comms/respond.js\"\nimport {defaultTap} from \"./taps/default.js\"\nimport {Endpoint, Fn, Fns, Tap} from \"./types.js\"\n\nexport type EndpointOptions<F extends Fns> = {\n\tfns: F\n\ttap?: Tap\n}\n\n/**\n * Create a renraku endpoint for your fns.\n * - an endpoint is a function that accepts json rpc requests\n * - for each request, it calls the appropriate fn\n * - it then returns the fn's in json rpc response format\n */\nexport function endpoint<F extends Fns>({fns, tap = defaultTap}: EndpointOptions<F>): Endpoint {\n\treturn async request => {\n\t\tconst path = request.method.split(\".\")\n\t\tconst fn = drill(fns, path) as Fn\n\t\tconst action = async() => await fn(...request.params)\n\n\t\ttap.request({request})\n\n\t\tconst response = await respond({\n\t\t\ttap,\n\t\t\trequest,\n\t\t\taction,\n\t\t})\n\n\t\treturn response\n\t}\n}\n\n", "\nimport {Fn, Fns} from \"./types.js\"\n\nexport const tune = Symbol(\"tune\")\nexport const query = Symbol(\"query\")\nexport const notify = Symbol(\"notify\")\nexport const settings = Symbol(\"settings\")\n\nexport type TuneSymbol = typeof tune\nexport type QuerySymbol = typeof query\nexport type NotifySymbol = typeof notify\nexport type SettingsSymbol = typeof settings\n\nexport type Executor = (\n\tpath: string[],\n\targs: any[],\n\tsettings: Settings,\n) => Promise<any>\n\nexport type Settings = {\n\tnotify?: boolean\n\ttransfer?: Transferable[]\n}\n\nexport type Remote<F extends Fn | Fns> = (\n\tF extends Fn\n\t\t? F & {\n\t\t\t[tune]: (settings: Settings) => F\n\t\t\t[query]: F\n\t\t\t[notify]: F\n\t\t\t[settings]: Settings\n\t\t}\n\t\t: F extends Fns\n\t\t\t? {[K in keyof F]: Remote<F[K]>}\n\t\t\t: never\n)\n\nexport function remoteProxy<F extends Fns>(executor: Executor) {\n\n\tfunction recurse(path: string[]) {\n\t\tconst currentSettings: Settings = {notify: undefined}\n\n\t\treturn new Proxy((() => {}) as any, {\n\t\t\tapply: (_, _this, args) => {\n\t\t\t\treturn executor(path, args, currentSettings)\n\t\t\t},\n\t\t\tget: (target, key: string | QuerySymbol | NotifySymbol | TuneSymbol | SettingsSymbol) => {\n\n\t\t\t\tif (key === \"then\")\n\t\t\t\t\treturn undefined\n\n\t\t\t\tif (key === tune)\n\t\t\t\t\treturn (settings: Settings) => (...args: any[]) => executor(path, args, {\n\t\t\t\t\t\t...currentSettings,\n\t\t\t\t\t\t...settings,\n\t\t\t\t\t})\n\n\t\t\t\tif (key === notify)\n\t\t\t\t\treturn (...args: any[]) => executor(path, args, {\n\t\t\t\t\t\t...currentSettings,\n\t\t\t\t\t\tnotify: true,\n\t\t\t\t\t})\n\n\t\t\t\tif (key === query)\n\t\t\t\t\treturn (...args: any[]) => executor(path, args, {\n\t\t\t\t\t\t...currentSettings,\n\t\t\t\t\t\tnotify: false,\n\t\t\t\t\t})\n\n\t\t\t\tif (key === settings)\n\t\t\t\t\treturn currentSettings\n\n\t\t\t\tif (!target[key])\n\t\t\t\t\ttarget[key] = recurse([...path, key])\n\n\t\t\t\treturn target[key]\n\t\t\t},\n\t\t\tset: (target, key: string, value: any) => {\n\t\t\t\ttarget[key] = value\n\t\t\t\treturn true\n\t\t\t},\n\t\t})\n\t}\n\n\treturn recurse([]) as Remote<F>\n}\n\n", "\nimport {RemoteError} from \"./errors.js\"\nimport {defaultTap} from \"./taps/default.js\"\nimport {JsonRpc} from \"../comms/json-rpc.js\"\nimport {remoteProxy} from \"./remote-proxy.js\"\nimport {Endpoint, Fns, Tap} from \"./types.js\"\n\nexport type RemoteOptions = {\n\tendpoint: Endpoint\n\tlabel?: string\n\tnotify?: boolean\n\ttap?: Tap\n}\n\n/**\n * Create a renraku remote for the given endpoint.\n * - the remote uses js proxies to mirror the shape of your fns object\n * - so when you make async calls on the remote, it will convert those into json rpc requests that are actuated on the given endpoint\n * - the endpoint you provide could be making network calls, or doing something else, the remote doesn't care how the endpoint is implemented\n */\nexport function remote<F extends Fns>(options: RemoteOptions) {\n\tconst {endpoint, tap = defaultTap} = options\n\tlet id = 1\n\n\treturn remoteProxy<F>(async(\n\t\t\tpath,\n\t\t\tparams,\n\t\t\tsettings,\n\t\t) => {\n\n\t\tconst notify = settings.notify ?? options.notify ?? false\n\t\tconst transfer = settings.transfer\n\n\t\tconst base: JsonRpc.Notification<any[]> = {\n\t\t\tjsonrpc: \"2.0\" as const,\n\t\t\tmethod: path.join(\".\"),\n\t\t\tparams,\n\t\t}\n\n\t\tconst request: JsonRpc.Request = (\n\t\t\tnotify\n\t\t\t\t? base\n\t\t\t\t: {...base, id: id++}\n\t\t)\n\n\t\ttap.request({request})\n\n\t\tconst response = await endpoint(request, {transfer})\n\n\t\tif (notify && !response)\n\t\t\treturn null\n\n\t\tif (!response)\n\t\t\tthrow new RemoteError(\"response was null, but shouldn't be, because the request was not a notification\")\n\n\t\tif (\"error\" in response)\n\t\t\tthrow new RemoteError(\n\t\t\t\toptions.label\n\t\t\t\t\t? `${options.label}: ${response.error.message}`\n\t\t\t\t\t: response.error.message\n\t\t\t)\n\n\t\treturn response.result\n\t})\n}\n\n", "\nimport {Fns} from \"./types.js\"\nimport {remote} from \"./remote.js\"\nimport {Remote} from \"./remote-proxy.js\"\nimport {endpoint, EndpointOptions} from \"./endpoint.js\"\n\n/**\n * Wrap your fns in an endpoint and remote.\n * - this gives you a real renraku remote where you can use the `tune` symbol and such\n * - this is useful for when you have special logic that relies on that special renraku functionality\n */\nexport function mock<F extends Fns>(options: EndpointOptions<F>): Remote<F> {\n\treturn remote<F>({endpoint: endpoint(options), tap: options.tap})\n}\n\n", "\nimport {pub} from \"@e280/stz\"\nimport {JsonRpc} from \"../../../comms/json-rpc.js\"\n\nexport class Conduit {\n\trecv = pub<[incoming: JsonRpc.Bidirectional, {origin: string}]>()\n\tsendRequest = pub<[request: JsonRpc.Requestish, transfer: Transferable[] | undefined]>()\n\tsendResponse = pub<[response: JsonRpc.Respondish, transfer: Transferable[] | undefined]>()\n\n\tstatic makeEntangledPair({origin = \"example.e280.org\"}: {origin?: string} = {}) {\n\t\tconst a = new this()\n\t\tconst b = new this()\n\n\t\tconst disposers = [\n\t\t\ta.sendRequest.sub(data => b.recv(data, {origin})),\n\t\t\ta.sendResponse.sub(data => b.recv(data, {origin})),\n\t\t\tb.sendRequest.sub(data => a.recv(data, {origin})),\n\t\t\tb.sendResponse.sub(data => a.recv(data, {origin})),\n\t\t]\n\n\t\tconst dispose = () => disposers.forEach(fn => fn())\n\t\treturn [a, b, dispose] as [Conduit, Conduit, () => void]\n\t}\n}\n\n", "\nimport {defer} from \"@e280/stz\"\nimport {Endpoint} from \"../../../core/types.js\"\nimport {JsonRpc} from \"../../../comms/json-rpc.js\"\nimport {Channel, ChannelMessage} from \"../types.js\"\nimport {ResponseWaiter} from \"../../utils/response-waiter.js\"\n\nexport class Rig {\n\ttransfer: Transferable[] | undefined = undefined\n}\n\nexport function onMessage(channel: Channel, fn: (e: ChannelMessage) => void) {\n\tchannel.addEventListener(\"message\", fn)\n\treturn () => channel.removeEventListener(\"message\", fn)\n}\n\n////////////////\n\nexport type SendRequestFn = (\n\trequest: JsonRpc.Request,\n\ttransfer: Transferable[] | undefined,\n\tdone: Promise<JsonRpc.Response | null>,\n) => void\n\nexport function makeRemoteEndpoint(waiter: ResponseWaiter, sendRequest: SendRequestFn): Endpoint {\n\treturn async(request, {transfer} = {}) => {\n\t\tif (\"id\" in request) {\n\t\t\tconst done = defer<JsonRpc.Response | null>()\n\t\t\tsendRequest(request, transfer, done.promise)\n\t\t\treturn waiter.wait(request.id, request.method).then(response => {\n\t\t\t\tdone.resolve(response)\n\t\t\t\treturn response\n\t\t\t})\n\t\t}\n\t\telse {\n\t\t\tconst done = Promise.resolve(null)\n\t\t\tsendRequest(request, transfer, done)\n\t\t\treturn done\n\t\t}\n\t}\n}\n\nexport function interpretIncoming(json: JsonRpc.Bidirectional) {\n\tconst requests: JsonRpc.Request[] = []\n\tconst responses: JsonRpc.Response[] = []\n\n\tfor (const item of (Array.isArray(json) ? json : [json])) {\n\t\tif (\"method\" in item) requests.push(item)\n\t\telse responses.push(item)\n\t}\n\n\treturn {requests, responses}\n}\n\nexport async function handleIncomingRequests(\n\t\tlocalEndpoint: Endpoint,\n\t\trequests: JsonRpc.Request[],\n\t): Promise<JsonRpc.Respondish | null> {\n\n\tconst responses = (\n\t\tawait Promise.all(\n\t\t\trequests.map(async request => localEndpoint(request))\n\t\t)\n\t).filter(r => r !== null)\n\n\tif (responses.length === 0)\n\t\treturn null\n\n\treturn (responses.length === 1)\n\t\t? responses[0]\n\t\t: responses\n}\n\nexport function handleIncomingResponses(\n\t\twaiter: ResponseWaiter,\n\t\tresponses: JsonRpc.Response[],\n\t) {\n\n\tfor (const response of responses)\n\t\twaiter.deliverResponse(response)\n}\n\n", "\nimport {Trash} from \"@e280/stz\"\nimport {Conduit} from \"./conduit.js\"\nimport {PostableChannel} from \"../types.js\"\nimport {onMessage} from \"../parts/helpers.js\"\n\nexport class PostableConduit extends Conduit {\n\t#trash = new Trash()\n\n\tconstructor(channel: PostableChannel) {\n\t\tsuper()\n\t\tthis.#trash.add(\n\t\t\tthis.sendRequest.sub((m, transfer) => channel.postMessage(m, transfer)),\n\t\t\tthis.sendResponse.sub((m, transfer) => channel.postMessage(m, transfer)),\n\t\t\tonMessage(channel, e => this.recv(e.data, e)),\n\t\t)\n\t}\n\n\tdispose() {\n\t\tthis.#trash.dispose()\n\t}\n}\n\n", "\nexport const defaults = Object.freeze({\n\ttimeout: 60_000,\n\tmaxRequestBytes: 10_000_000,\n})\n\n", "\nimport {deadline, defer, Deferred} from \"@e280/stz\"\n\nimport {JsonRpc} from \"../../comms/json-rpc.js\"\nimport {RemoteError} from \"../../core/errors.js\"\n\ntype Pend = {\n\tmethod: string\n\tdeferred: Deferred<JsonRpc.Response>\n}\n\nexport class ResponseWaiter {\n\tpending = new Map<JsonRpc.Id, Pend>()\n\n\tconstructor(public timeout: number) {}\n\n\tasync wait(id: JsonRpc.Id, method: string) {\n\t\tconst deferred = defer<JsonRpc.Response>()\n\t\tthis.pending.set(id, {method, deferred})\n\t\treturn await deadline(this.timeout, `request #${id} ${method}()`, () => deferred.promise)\n\t}\n\n\tdeliverResponse(response: JsonRpc.Response) {\n\t\tconst pend = this.pending.get(response.id)\n\t\tif (pend) {\n\t\t\tif (\"error\" in response)\n\t\t\t\tpend.deferred.reject(new RemoteError(response.error.message))\n\t\t\telse\n\t\t\t\tpend.deferred.resolve(response)\n\t\t}\n\t}\n}\n\n", "\nimport {defaults} from \"../defaults.js\"\nimport {remote} from \"../../core/remote.js\"\nimport {MessengerOptions} from \"./types.js\"\nimport {JsonRpc} from \"../../comms/json-rpc.js\"\nimport {Remote} from \"../../core/remote-proxy.js\"\nimport {Endpoint, Fns} from \"../../core/types.js\"\nimport {ResponseWaiter} from \"../utils/response-waiter.js\"\nimport {handleIncomingRequests, interpretIncoming, makeRemoteEndpoint, Rig} from \"./parts/helpers.js\"\n\n/**\n * Establish a renraku remote that communicates over the given conduit.\n * - supports two-way or one-way communication\n * - you can use a messenger to call a remote messenger\n * - you can use a messenger to respond to incoming requests\n */\nexport class Messenger<xRemoteFns extends Fns> {\n\twaiter: ResponseWaiter\n\tremoteEndpoint: Endpoint\n\tremote: Remote<xRemoteFns>\n\n\tconstructor(public options: MessengerOptions<xRemoteFns>) {\n\t\tconst {conduit} = options\n\n\t\tthis.waiter = new ResponseWaiter(options.timeout ?? defaults.timeout)\n\n\t\tthis.remoteEndpoint = makeRemoteEndpoint(\n\t\t\tthis.waiter,\n\t\t\tconduit.sendRequest.pub.bind(conduit.sendRequest),\n\t\t)\n\n\t\tthis.remote = remote<xRemoteFns>({\n\t\t\tendpoint: this.remoteEndpoint,\n\t\t\ttap: options.tap,\n\t\t})\n\n\t\tconduit.recv.sub(m => this.recv(m))\n\t}\n\n\tasync recv(incoming: JsonRpc.Bidirectional) {\n\t\tconst rig = new Rig()\n\t\tconst {conduit, getLocalEndpoint} = this.options\n\n\t\tconst {requests, responses} = interpretIncoming(incoming)\n\n\t\tfor (const response of responses)\n\t\t\tthis.waiter.deliverResponse(response)\n\n\t\tif (!getLocalEndpoint)\n\t\t\treturn undefined\n\n\t\tconst outgoing = await handleIncomingRequests(getLocalEndpoint(this.remote, rig), requests)\n\t\tif (outgoing)\n\t\t\tawait conduit.sendResponse(outgoing, rig.transfer)\n\t}\n}\n\n", "\nimport {Host, Schematic, Work} from \"./types.js\"\n\nexport class HostShell<S extends Schematic> {\n\thost!: Host<S>\n\tconstructor(host?: Host<S>) {\n\t\tthis.host = host!\n\t}\n}\n\nexport class WorkShell<S extends Schematic> {\n\twork!: Work<S>\n\tconstructor(work?: Work<S>) {\n\t\tthis.work = work!\n\t}\n}\n\n", "\nimport {ErrorTap} from \"@e280/renraku\"\n\nexport const defaultTap = new ErrorTap()\n\n", "\nimport {endpoint, Messenger, PostableConduit} from \"@e280/renraku\"\n\nimport {HostShell} from \"./shells.js\"\nimport {Compat} from \"../compat/types.js\"\nimport {defaultTap} from \"./default-tap.js\"\nimport {MinistryFns, Schematic, SetupWork, WorkerOpts} from \"./types.js\"\n\n/**\n * create a web worker\n */\nexport async function worker<S extends Schematic>(\n\t\tcompat: Compat,\n\t\tsetupWork: SetupWork<S>,\n\t\toptions: WorkerOpts = {},\n\t) {\n\n\tconst tap = options.tap ?? defaultTap\n\n\tconst messenger = new Messenger<MinistryFns<S>>({\n\t\ttap,\n\t\ttimeout: options.timeout ?? Infinity,\n\t\tconduit: new PostableConduit(compat.getSelf()),\n\t\tgetLocalEndpoint: (remote, rig) => endpoint({\n\t\t\ttap,\n\t\t\tfns: setupWork(\n\t\t\t\tnew HostShell(remote.host),\n\t\t\t\trig,\n\t\t\t)\n\t\t}),\n\t})\n\n\tawait messenger.remote.meta.ready()\n\treturn messenger.remote.host\n}\n\n", "\nimport {defer} from \"@e280/stz\"\nimport {endpoint, Messenger, PostableConduit} from \"@e280/renraku\"\n\nimport {WorkShell} from \"./shells.js\"\nimport {defaultTap} from \"./default-tap.js\"\nimport {Compat, CompatWorker} from \"../compat/types.js\"\nimport {Meta, Schematic, ThreadOptions} from \"./types.js\"\n\nexport class Thread<S extends Schematic> {\n\tconstructor(\n\t\tpublic worker: CompatWorker,\n\t\tpublic messenger: Messenger<S[\"work\"]>,\n\t) {}\n\n\tstatic async make<S extends Schematic>(compat: Compat, options: ThreadOptions<S>) {\n\t\tconst tap = options.tap ?? defaultTap\n\t\tconst worker = compat.loadWorker(options.workerUrl, options.label)\n\t\tconst readyprom = defer<void>()\n\n\t\tconst meta: Meta = {\n\t\t\tasync ready() {\n\t\t\t\treadyprom.resolve()\n\t\t\t},\n\t\t}\n\n\t\tconst messenger = new Messenger<S[\"work\"]>({\n\t\t\ttap,\n\t\t\ttimeout: options.timeout ?? Infinity,\n\t\t\tconduit: new PostableConduit(worker),\n\t\t\tgetLocalEndpoint: (remote, rig) => endpoint({\n\t\t\t\ttap,\n\t\t\t\tfns: {\n\t\t\t\t\tmeta,\n\t\t\t\t\thost: options.setupHost(new WorkShell(remote), rig),\n\t\t\t\t},\n\t\t\t}),\n\t\t})\n\n\t\tawait readyprom.promise\n\t\treturn new this<S>(worker, messenger)\n\t}\n\n\tget work() {\n\t\treturn this.messenger.remote\n\t}\n\n\tterminate() {\n\t\tthis.worker.terminate()\n\t}\n}\n\n", "\nimport {defer} from \"@e280/stz\"\nimport {Endpoint, remote, Remote, Tap} from \"@e280/renraku\"\n\nimport {Thread} from \"./thread.js\"\nimport {Compat} from \"../compat/types.js\"\nimport {defaultTap} from \"./default-tap.js\"\nimport {ClusterOptions, Schematic, Task} from \"./types.js\"\n\n/**\n * a pool of web workers\n * - please use `await Cluster.make(options)` to create your worker pool\n * - call your worker functions like `await cluster.remote.hello()`\n */\nexport class Cluster<S extends Schematic> {\n\n\tstatic async make<S extends Schematic>(compat: Compat, options: ClusterOptions<S>) {\n\t\tconst workerCount = options.workerCount ?? compat.guessOptimalThreadCount()\n\t\tconst threads = await Promise.all([...Array(workerCount)].map(\n\t\t\tasync(_, index) => Thread.make(compat, {\n\t\t\t\t...options,\n\t\t\t\tlabel: options.label ?? `${options.label ?? \"comrade\"}_${index + 1}`,\n\t\t\t})\n\t\t))\n\t\treturn new this<S>(threads, {tap: options.tap})\n\t}\n\n\twork: Remote<S[\"work\"]>\n\t#available = new Set<Thread<S>>()\n\t#tasks: Task[] = []\n\n\tconstructor(private threads: Thread<S>[], options: {tap?: Tap} = {}) {\n\t\tconst tap = options.tap ?? defaultTap\n\n\t\t// delegation\n\t\tconst remoteEndpoint: Endpoint = async(request, special) => this.#scheduleTask({\n\t\t\trequest,\n\t\t\tprom: defer(),\n\t\t\ttransfer: special?.transfer,\n\t\t})\n\n\t\t// remote proxy to call comrade fns\n\t\tthis.work = remote({\n\t\t\ttap,\n\t\t\tendpoint: remoteEndpoint,\n\t\t})\n\n\t\t// in the beginning, all threads are available\n\t\tthreads.forEach(t => this.#available.add(t))\n\t}\n\n\tget threadCount() {\n\t\treturn this.threads.length\n\t}\n\n\tterminate() {\n\t\tfor (const thread of this.threads)\n\t\t\tthread.terminate()\n\t}\n\n\t#scheduleTask(task: Task) {\n\t\tthis.#tasks.push(task)\n\t\tthis.#distributeTasks()\n\t\treturn task.prom.promise\n\t}\n\n\t#distributeTasks() {\n\t\twhile (this.#available.size > 0 && this.#tasks.length > 0) {\n\t\t\tconst thread = [...this.#available].pop()!\n\t\t\tthis.#available.delete(thread)\n\n\t\t\tconst task = this.#tasks.shift()!\n\n\t\t\t// this thread is no longer available\n\t\t\tthis.#available.delete(thread)\n\n\t\t\t// call the thread endpoint\n\t\t\tconst callprom = thread.messenger.remoteEndpoint(task.request, {transfer: task.transfer})\n\n\t\t\t// resolve/reject the task prom when callprom is done\n\t\t\ttask.prom.entangle(callprom).finally(() => {\n\n\t\t\t\t// thread is ready again\n\t\t\t\tthis.#available.add(thread)\n\n\t\t\t\t// distribute more tasks\n\t\t\t\tthis.#distributeTasks()\n\t\t\t})\n\t\t}\n\t}\n}\n\n", "\nimport {mock, Rig, Tap} from \"@e280/renraku\"\n\nimport {worker} from \"./parts/worker.js\"\nimport {Compat} from \"./compat/types.js\"\nimport {Thread} from \"./parts/thread.js\"\nimport {Cluster} from \"./parts/cluster.js\"\nimport {defaultTap} from \"./parts/default-tap.js\"\nimport {HostShell, WorkShell} from \"./parts/shells.js\"\nimport {ClusterOptions, Mocks, Schematic, SetupHost, SetupWork, ThreadOptions, WorkerOpts} from \"./parts/types.js\"\n\nexport const setupComrade = (compat: Compat) => ({\n\tthread: <S extends Schematic>(options: ThreadOptions<S>) => Thread.make(compat, options),\n\tcluster: <S extends Schematic>(options: ClusterOptions<S>) => Cluster.make(compat, options),\n\tworker: <S extends Schematic>(\n\t\tsetupWork: SetupWork<S>,\n\t\toptions: WorkerOpts = {},\n\t) => worker(compat, setupWork, options),\n\n\twork: <S extends Schematic>(fn: SetupWork<S>) => fn,\n\thost: <S extends Schematic>(fn: SetupHost<S>) => fn,\n\n\tmocks<S extends Schematic>(options: {\n\t\t\ttap?: Tap\n\t\t\tsetupWork: SetupWork<S>\n\t\t\tsetupHost: SetupHost<S>\n\t\t}): Mocks<S> {\n\n\t\tconst {setupWork, setupHost, tap = defaultTap} = options\n\n\t\tconst hostShell = new HostShell<S>()\n\t\tconst workShell = new WorkShell<S>()\n\n\t\tworkShell.work = mock({tap, fns: setupWork(hostShell, new Rig())})\n\t\thostShell.host = mock({tap, fns: setupHost(workShell, new Rig())})\n\n\t\treturn {\n\t\t\tworkShell,\n\t\t\thostShell,\n\t\t\twork: workShell.work,\n\t\t\thost: hostShell.host,\n\t\t}\n\t},\n\n\tmockWork<S extends Schematic>(setupWork: SetupWork<S>, tap: Tap = defaultTap) {\n\t\tconst hostShell = new HostShell<S>()\n\t\tconst workShell = new WorkShell<S>()\n\n\t\tworkShell.work = mock({tap, fns: setupWork(hostShell, new Rig())})\n\n\t\treturn {\n\t\t\tworkShell,\n\t\t\thostShell,\n\t\t\twork: workShell.work,\n\t\t\tmockHost: (setupHost: SetupHost<S>): Mocks<S> => {\n\t\t\t\thostShell.host = mock({tap, fns: setupHost(workShell, new Rig())})\n\t\t\t\treturn {\n\t\t\t\t\tworkShell,\n\t\t\t\t\thostShell,\n\t\t\t\t\twork: workShell.work,\n\t\t\t\t\thost: hostShell.host,\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t},\n})\n\n", "\nimport {Compat, CompatWorker} from \"./types.js\"\n\nexport const setupBrowserCompat = (): Compat => ({\n\tgetSelf() {\n\t\treturn self\n\t},\n\n\tguessOptimalThreadCount() {\n\t\tconst count = navigator.hardwareConcurrency ?? 1\n\t\treturn Math.max(1, count - 1)\n\t},\n\n\tloadWorker(url, name) {\n\t\treturn new window.Worker(url, {name, type: \"module\"}) as CompatWorker\n\t},\n\n\tasync loadWasm(url) {\n\t\treturn WebAssembly.instantiateStreaming(fetch(url))\n\t},\n})\n\n", "\nimport {setupComrade} from \"./comrade.js\"\nimport {setupBrowserCompat} from \"./compat/browser.js\"\n\nexport const compat = setupBrowserCompat()\nexport const Comrade = setupComrade(compat)\n\nexport * from \"./exports.js\"\n\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nexport function assert(x) {\n if (!x) {\n throw new Error('Assertion failed.');\n }\n}\nexport const normalizeRotation = (rotation) => {\n const mappedRotation = (rotation % 360 + 360) % 360;\n if (mappedRotation === 0 || mappedRotation === 90 || mappedRotation === 180 || mappedRotation === 270) {\n return mappedRotation;\n }\n else {\n throw new Error(`Invalid rotation ${rotation}.`);\n }\n};\nexport const last = (arr) => {\n return arr && arr[arr.length - 1];\n};\nexport const isU32 = (value) => {\n return value >= 0 && value < 2 ** 32;\n};\nexport class Bitstream {\n constructor(bytes) {\n this.bytes = bytes;\n /** Current offset in bits. */\n this.pos = 0;\n }\n seekToByte(byteOffset) {\n this.pos = 8 * byteOffset;\n }\n readBit() {\n const byteIndex = Math.floor(this.pos / 8);\n const byte = this.bytes[byteIndex] ?? 0;\n const bitIndex = 0b111 - (this.pos & 0b111);\n const bit = (byte & (1 << bitIndex)) >> bitIndex;\n this.pos++;\n return bit;\n }\n readBits(n) {\n let result = 0;\n for (let i = 0; i < n; i++) {\n result <<= 1;\n result |= this.readBit();\n }\n return result;\n }\n readAlignedByte() {\n // Ensure we're byte-aligned\n if (this.pos % 8 !== 0) {\n throw new Error('Bitstream is not byte-aligned.');\n }\n const byteIndex = this.pos / 8;\n const byte = this.bytes[byteIndex] ?? 0;\n this.pos += 8;\n return byte;\n }\n skipBits(n) {\n this.pos += n;\n }\n getBitsLeft() {\n return this.bytes.length * 8 - this.pos;\n }\n clone() {\n const clone = new Bitstream(this.bytes);\n clone.pos = this.pos;\n return clone;\n }\n}\n/** Reads an exponential-Golomb universal code from a Bitstream. */\nexport const readExpGolomb = (bitstream) => {\n let leadingZeroBits = 0;\n while (bitstream.readBit() === 0 && leadingZeroBits < 32) {\n leadingZeroBits++;\n }\n if (leadingZeroBits >= 32) {\n throw new Error('Invalid exponential-Golomb code.');\n }\n const result = (1 << leadingZeroBits) - 1 + bitstream.readBits(leadingZeroBits);\n return result;\n};\n/** Reads a signed exponential-Golomb universal code from a Bitstream. */\nexport const readSignedExpGolomb = (bitstream) => {\n const codeNum = readExpGolomb(bitstream);\n return ((codeNum & 1) === 0)\n ? -(codeNum >> 1)\n : ((codeNum + 1) >> 1);\n};\nexport const writeBits = (bytes, start, end, value) => {\n for (let i = start; i < end; i++) {\n const byteIndex = Math.floor(i / 8);\n let byte = bytes[byteIndex];\n const bitIndex = 0b111 - (i & 0b111);\n byte &= ~(1 << bitIndex);\n byte |= ((value & (1 << (end - i - 1))) >> (end - i - 1)) << bitIndex;\n bytes[byteIndex] = byte;\n }\n};\nexport const toUint8Array = (source) => {\n if (source instanceof Uint8Array) {\n return source;\n }\n else if (source instanceof ArrayBuffer) {\n return new Uint8Array(source);\n }\n else {\n return new Uint8Array(source.buffer, source.byteOffset, source.byteLength);\n }\n};\nexport const toDataView = (source) => {\n if (source instanceof DataView) {\n return source;\n }\n else if (source instanceof ArrayBuffer) {\n return new DataView(source);\n }\n else {\n return new DataView(source.buffer, source.byteOffset, source.byteLength);\n }\n};\nexport const textEncoder = new TextEncoder();\nconst invertObject = (object) => {\n return Object.fromEntries(Object.entries(object).map(([key, value]) => [value, key]));\n};\n// For the color space mappings, see Rec. ITU-T H.273.\nexport const COLOR_PRIMARIES_MAP = {\n bt709: 1, // ITU-R BT.709\n bt470bg: 5, // ITU-R BT.470BG\n smpte170m: 6, // ITU-R BT.601 525 - SMPTE 170M\n bt2020: 9, // ITU-R BT.202\n smpte432: 12, // SMPTE EG 432-1\n};\nexport const COLOR_PRIMARIES_MAP_INVERSE = invertObject(COLOR_PRIMARIES_MAP);\nexport const TRANSFER_CHARACTERISTICS_MAP = {\n 'bt709': 1, // ITU-R BT.709\n 'smpte170m': 6, // SMPTE 170M\n 'linear': 8, // Linear transfer characteristics\n 'iec61966-2-1': 13, // IEC 61966-2-1\n 'pg': 16, // Rec. ITU-R BT.2100-2 perceptual quantization (PQ) system\n 'hlg': 18, // Rec. ITU-R BT.2100-2 hybrid loggamma (HLG) system\n};\nexport const TRANSFER_CHARACTERISTICS_MAP_INVERSE = invertObject(TRANSFER_CHARACTERISTICS_MAP);\nexport const MATRIX_COEFFICIENTS_MAP = {\n 'rgb': 0, // Identity\n 'bt709': 1, // ITU-R BT.709\n 'bt470bg': 5, // ITU-R BT.470BG\n 'smpte170m': 6, // SMPTE 170M\n 'bt2020-ncl': 9, // ITU-R BT.2020-2 (non-constant luminance)\n};\nexport const MATRIX_COEFFICIENTS_MAP_INVERSE = invertObject(MATRIX_COEFFICIENTS_MAP);\nexport const colorSpaceIsComplete = (colorSpace) => {\n return (!!colorSpace\n && !!colorSpace.primaries\n && !!colorSpace.transfer\n && !!colorSpace.matrix\n && colorSpace.fullRange !== undefined);\n};\nexport const isAllowSharedBufferSource = (x) => {\n return (x instanceof ArrayBuffer\n || (typeof SharedArrayBuffer !== 'undefined' && x instanceof SharedArrayBuffer)\n || ArrayBuffer.isView(x));\n};\nexport class AsyncMutex {\n constructor() {\n this.currentPromise = Promise.resolve();\n }\n async acquire() {\n let resolver;\n const nextPromise = new Promise((resolve) => {\n resolver = resolve;\n });\n const currentPromiseAlias = this.currentPromise;\n this.currentPromise = nextPromise;\n await currentPromiseAlias;\n return resolver;\n }\n}\nexport const bytesToHexString = (bytes) => {\n return [...bytes].map(x => x.toString(16).padStart(2, '0')).join('');\n};\nexport const reverseBitsU32 = (x) => {\n x = ((x >> 1) & 0x55555555) | ((x & 0x55555555) << 1);\n x = ((x >> 2) & 0x33333333) | ((x & 0x33333333) << 2);\n x = ((x >> 4) & 0x0f0f0f0f) | ((x & 0x0f0f0f0f) << 4);\n x = ((x >> 8) & 0x00ff00ff) | ((x & 0x00ff00ff) << 8);\n x = ((x >> 16) & 0x0000ffff) | ((x & 0x0000ffff) << 16);\n return x >>> 0; // Ensure it's treated as an unsigned 32-bit integer\n};\n/** Returns the smallest index i such that val[i] === key, or -1 if no such index exists. */\nexport const binarySearchExact = (arr, key, valueGetter) => {\n let low = 0;\n let high = arr.length - 1;\n let ans = -1;\n while (low <= high) {\n const mid = (low + high) >> 1;\n const midVal = valueGetter(arr[mid]);\n if (midVal === key) {\n ans = mid;\n high = mid - 1; // Continue searching left to find the lowest index\n }\n else if (midVal < key) {\n low = mid + 1;\n }\n else {\n high = mid - 1;\n }\n }\n return ans;\n};\n/** Returns the largest index i such that val[i] <= key, or -1 if no such index exists. */\nexport const binarySearchLessOrEqual = (arr, key, valueGetter) => {\n let low = 0;\n let high = arr.length - 1;\n let ans = -1;\n while (low <= high) {\n const mid = (low + (high - low + 1) / 2) | 0;\n const midVal = valueGetter(arr[mid]);\n if (midVal <= key) {\n ans = mid;\n low = mid + 1;\n }\n else {\n high = mid - 1;\n }\n }\n return ans;\n};\nexport const promiseWithResolvers = () => {\n let resolve;\n let reject;\n const promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve: resolve, reject: reject };\n};\nexport const removeItem = (arr, item) => {\n const index = arr.indexOf(item);\n if (index !== -1) {\n arr.splice(index, 1);\n }\n};\nexport const findLast = (arr, predicate) => {\n for (let i = arr.length - 1; i >= 0; i--) {\n if (predicate(arr[i])) {\n return arr[i];\n }\n }\n return undefined;\n};\nexport const findLastIndex = (arr, predicate) => {\n for (let i = arr.length - 1; i >= 0; i--) {\n if (predicate(arr[i])) {\n return i;\n }\n }\n return -1;\n};\nexport const toAsyncIterator = async function* (source) {\n if (Symbol.iterator in source) {\n // @ts-expect-error Trust me\n yield* source[Symbol.iterator]();\n }\n else {\n // @ts-expect-error Trust me\n yield* source[Symbol.asyncIterator]();\n }\n};\nexport const validateAnyIterable = (iterable) => {\n if (!(Symbol.iterator in iterable) && !(Symbol.asyncIterator in iterable)) {\n throw new TypeError('Argument must be an iterable or async iterable.');\n }\n};\nexport const assertNever = (x) => {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n throw new Error(`Unexpected value: ${x}`);\n};\nexport const getUint24 = (view, byteOffset, littleEndian) => {\n const byte1 = view.getUint8(byteOffset);\n const byte2 = view.getUint8(byteOffset + 1);\n const byte3 = view.getUint8(byteOffset + 2);\n if (littleEndian) {\n return byte1 | (byte2 << 8) | (byte3 << 16);\n }\n else {\n return (byte1 << 16) | (byte2 << 8) | byte3;\n }\n};\nexport const getInt24 = (view, byteOffset, littleEndian) => {\n // The left shift pushes the most significant bit into the sign bit region, and the subsequent right shift\n // then correctly interprets the sign bit.\n return getUint24(view, byteOffset, littleEndian) << 8 >> 8;\n};\nexport const setUint24 = (view, byteOffset, value, littleEndian) => {\n // Ensure the value is within 24-bit unsigned range (0 to 16777215)\n value = value >>> 0; // Convert to unsigned 32-bit\n value = value & 0xFFFFFF; // Mask to 24 bits\n if (littleEndian) {\n view.setUint8(byteOffset, value & 0xFF);\n view.setUint8(byteOffset + 1, (value >>> 8) & 0xFF);\n view.setUint8(byteOffset + 2, (value >>> 16) & 0xFF);\n }\n else {\n view.setUint8(byteOffset, (value >>> 16) & 0xFF);\n view.setUint8(byteOffset + 1, (value >>> 8) & 0xFF);\n view.setUint8(byteOffset + 2, value & 0xFF);\n }\n};\nexport const setInt24 = (view, byteOffset, value, littleEndian) => {\n // Ensure the value is within 24-bit signed range (-8388608 to 8388607)\n value = clamp(value, -8388608, 8388607);\n // Convert negative values to their 24-bit representation\n if (value < 0) {\n value = (value + 0x1000000) & 0xFFFFFF;\n }\n setUint24(view, byteOffset, value, littleEndian);\n};\nexport const setInt64 = (view, byteOffset, value, littleEndian) => {\n if (littleEndian) {\n view.setUint32(byteOffset + 0, value, true);\n view.setInt32(byteOffset + 4, Math.floor(value / 2 ** 32), true);\n }\n else {\n view.setInt32(byteOffset + 0, Math.floor(value / 2 ** 32), true);\n view.setUint32(byteOffset + 4, value, true);\n }\n};\n/**\n * Calls a function on each value spat out by an async generator. The reason for writing this manually instead of\n * using a generator function is that the generator function queues return() calls - here, we forward them immediately.\n */\nexport const mapAsyncGenerator = (generator, map) => {\n return {\n async next() {\n const result = await generator.next();\n if (result.done) {\n return { value: undefined, done: true };\n }\n else {\n return { value: map(result.value), done: false };\n }\n },\n return() {\n return generator.return();\n },\n throw(error) {\n return generator.throw(error);\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n};\nexport const clamp = (value, min, max) => {\n return Math.max(min, Math.min(max, value));\n};\nexport const UNDETERMINED_LANGUAGE = 'und';\nexport const roundToPrecision = (value, digits) => {\n const factor = 10 ** digits;\n return Math.round(value * factor) / factor;\n};\nexport const roundToMultiple = (value, multiple) => {\n return Math.round(value / multiple) * multiple;\n};\nexport const ilog = (x) => {\n let ret = 0;\n while (x) {\n ret++;\n x >>= 1;\n }\n return ret;\n};\nconst ISO_639_2_REGEX = /^[a-z]{3}$/;\nexport const isIso639Dash2LanguageCode = (x) => {\n return ISO_639_2_REGEX.test(x);\n};\n// Since the result will be truncated, add a bit of eps to compensate for floating point errors\nexport const SECOND_TO_MICROSECOND_FACTOR = 1e6 * (1 + Number.EPSILON);\nexport const mergeObjectsDeeply = (a, b) => {\n const result = { ...a };\n for (const key in b) {\n if (typeof a[key] === 'object'\n && a[key] !== null\n && typeof b[key] === 'object'\n && b[key] !== null) {\n result[key] = mergeObjectsDeeply(a[key], b[key]);\n }\n else {\n result[key] = b[key];\n }\n }\n return result;\n};\nexport const retriedFetch = async (url, requestInit, getRetryDelay) => {\n let attempts = 0;\n while (true) {\n try {\n return await fetch(url, requestInit);\n }\n catch (error) {\n console.error('Retrying failed fetch. Error:', error);\n attempts++;\n const retryDelayInSeconds = getRetryDelay(attempts);\n if (retryDelayInSeconds === null) {\n throw error;\n }\n if (!Number.isFinite(retryDelayInSeconds) || retryDelayInSeconds < 0) {\n throw new TypeError('Retry delay must be a non-negative finite number.');\n }\n if (retryDelayInSeconds > 0) {\n await new Promise(resolve => setTimeout(resolve, 1000 * retryDelayInSeconds));\n }\n }\n }\n};\nexport const computeRationalApproximation = (x, maxDenominator) => {\n // Handle negative numbers\n const sign = x < 0 ? -1 : 1;\n x = Math.abs(x);\n let prevNumerator = 0, prevDenominator = 1;\n let currNumerator = 1, currDenominator = 0;\n // Continued fraction algorithm\n let remainder = x;\n while (true) {\n const integer = Math.floor(remainder);\n // Calculate next convergent\n const nextNumerator = integer * currNumerator + prevNumerator;\n const nextDenominator = integer * currDenominator + prevDenominator;\n if (nextDenominator > maxDenominator) {\n return {\n numerator: sign * currNumerator,\n denominator: currDenominator,\n };\n }\n prevNumerator = currNumerator;\n prevDenominator = currDenominator;\n currNumerator = nextNumerator;\n currDenominator = nextDenominator;\n remainder = 1 / (remainder - integer);\n // Guard against precision issues\n if (!isFinite(remainder)) {\n break;\n }\n }\n return {\n numerator: sign * currNumerator,\n denominator: currDenominator,\n };\n};\nexport class CallSerializer {\n constructor() {\n this.currentPromise = Promise.resolve();\n }\n call(fn) {\n return this.currentPromise = this.currentPromise.then(fn);\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n/**\n * Base class for custom video decoders. To add your own custom video decoder, extend this class, implement the\n * abstract methods and static `supports` method, and register the decoder using `registerDecoder`.\n * @public\n */\nexport class CustomVideoDecoder {\n /** Returns true iff the decoder can decode the given codec configuration. */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static supports(codec, config) {\n return false;\n }\n}\n/**\n * Base class for custom audio decoders. To add your own custom audio decoder, extend this class, implement the\n * abstract methods and static `supports` method, and register the decoder using `registerDecoder`.\n * @public\n */\nexport class CustomAudioDecoder {\n /** Returns true iff the decoder can decode the given codec configuration. */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static supports(codec, config) {\n return false;\n }\n}\n/**\n * Base class for custom video encoders. To add your own custom video encoder, extend this class, implement the\n * abstract methods and static `supports` method, and register the encoder using `registerEncoder`.\n * @public\n */\nexport class CustomVideoEncoder {\n /** Returns true iff the encoder can encode the given codec configuration. */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static supports(codec, config) {\n return false;\n }\n}\n/**\n * Base class for custom audio encoders. To add your own custom audio encoder, extend this class, implement the\n * abstract methods and static `supports` method, and register the encoder using `registerEncoder`.\n * @public\n */\nexport class CustomAudioEncoder {\n /** Returns true iff the encoder can encode the given codec configuration. */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static supports(codec, config) {\n return false;\n }\n}\nexport const customVideoDecoders = [];\nexport const customAudioDecoders = [];\nexport const customVideoEncoders = [];\nexport const customAudioEncoders = [];\n/**\n * Registers a custom video or audio decoder. Registered decoders will automatically be used for decoding whenever\n * possible.\n * @public\n */\nexport const registerDecoder = (decoder) => {\n if (decoder.prototype instanceof CustomVideoDecoder) {\n customVideoDecoders.push(decoder);\n }\n else if (decoder.prototype instanceof CustomAudioDecoder) {\n customAudioDecoders.push(decoder);\n }\n else {\n throw new TypeError('Decoder must be a CustomVideoDecoder or CustomAudioDecoder.');\n }\n};\n/**\n * Registers a custom video or audio encoder. Registered encoders will automatically be used for encoding whenever\n * possible.\n * @public\n */\nexport const registerEncoder = (encoder) => {\n if (encoder.prototype instanceof CustomVideoEncoder) {\n customVideoEncoders.push(encoder);\n }\n else if (encoder.prototype instanceof CustomAudioEncoder) {\n customAudioEncoders.push(encoder);\n }\n else {\n throw new TypeError('Encoder must be a CustomVideoEncoder or CustomAudioEncoder.');\n }\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { customAudioEncoders, customVideoEncoders } from './custom-coder.js';\nimport { Bitstream, COLOR_PRIMARIES_MAP, MATRIX_COEFFICIENTS_MAP, TRANSFER_CHARACTERISTICS_MAP, assert, bytesToHexString, isAllowSharedBufferSource, last, reverseBitsU32, toDataView, } from './misc.js';\n/**\n * List of known video codecs, ordered by encoding preference.\n * @public\n */\nexport const VIDEO_CODECS = [\n 'avc',\n 'hevc',\n 'vp9',\n 'av1',\n 'vp8',\n];\n/**\n * List of known PCM (uncompressed) audio codecs, ordered by encoding preference.\n * @public\n */\nexport const PCM_AUDIO_CODECS = [\n 'pcm-s16', // We don't prefix 'le' so we're compatible with the WebCodecs-registered PCM codec strings\n 'pcm-s16be',\n 'pcm-s24',\n 'pcm-s24be',\n 'pcm-s32',\n 'pcm-s32be',\n 'pcm-f32',\n 'pcm-f32be',\n 'pcm-f64',\n 'pcm-f64be',\n 'pcm-u8',\n 'pcm-s8',\n 'ulaw',\n 'alaw',\n];\n/**\n * List of known compressed audio codecs, ordered by encoding preference.\n * @public\n */\nexport const NON_PCM_AUDIO_CODECS = [\n 'aac',\n 'opus',\n 'mp3',\n 'vorbis',\n 'flac',\n];\n/**\n * List of known audio codecs, ordered by encoding preference.\n * @public\n */\nexport const AUDIO_CODECS = [\n ...NON_PCM_AUDIO_CODECS,\n ...PCM_AUDIO_CODECS,\n];\n/**\n * List of known subtitle codecs, ordered by encoding preference.\n * @public\n */\nexport const SUBTITLE_CODECS = [\n 'webvtt',\n]; // TODO add the rest\n// https://en.wikipedia.org/wiki/Advanced_Video_Coding\nconst AVC_LEVEL_TABLE = [\n { maxMacroblocks: 99, maxBitrate: 64000, level: 0x0A }, // Level 1\n { maxMacroblocks: 396, maxBitrate: 192000, level: 0x0B }, // Level 1.1\n { maxMacroblocks: 396, maxBitrate: 384000, level: 0x0C }, // Level 1.2\n { maxMacroblocks: 396, maxBitrate: 768000, level: 0x0D }, // Level 1.3\n { maxMacroblocks: 396, maxBitrate: 2000000, level: 0x14 }, // Level 2\n { maxMacroblocks: 792, maxBitrate: 4000000, level: 0x15 }, // Level 2.1\n { maxMacroblocks: 1620, maxBitrate: 4000000, level: 0x16 }, // Level 2.2\n { maxMacroblocks: 1620, maxBitrate: 10000000, level: 0x1E }, // Level 3\n { maxMacroblocks: 3600, maxBitrate: 14000000, level: 0x1F }, // Level 3.1\n { maxMacroblocks: 5120, maxBitrate: 20000000, level: 0x20 }, // Level 3.2\n { maxMacroblocks: 8192, maxBitrate: 20000000, level: 0x28 }, // Level 4\n { maxMacroblocks: 8192, maxBitrate: 50000000, level: 0x29 }, // Level 4.1\n { maxMacroblocks: 8704, maxBitrate: 50000000, level: 0x2A }, // Level 4.2\n { maxMacroblocks: 22080, maxBitrate: 135000000, level: 0x32 }, // Level 5\n { maxMacroblocks: 36864, maxBitrate: 240000000, level: 0x33 }, // Level 5.1\n { maxMacroblocks: 36864, maxBitrate: 240000000, level: 0x34 }, // Level 5.2\n { maxMacroblocks: 139264, maxBitrate: 240000000, level: 0x3C }, // Level 6\n { maxMacroblocks: 139264, maxBitrate: 480000000, level: 0x3D }, // Level 6.1\n { maxMacroblocks: 139264, maxBitrate: 800000000, level: 0x3E }, // Level 6.2\n];\n// https://en.wikipedia.org/wiki/High_Efficiency_Video_Coding\nconst HEVC_LEVEL_TABLE = [\n { maxPictureSize: 36864, maxBitrate: 128000, tier: 'L', level: 30 }, // Level 1 (Low Tier)\n { maxPictureSize: 122880, maxBitrate: 1500000, tier: 'L', level: 60 }, // Level 2 (Low Tier)\n { maxPictureSize: 245760, maxBitrate: 3000000, tier: 'L', level: 63 }, // Level 2.1 (Low Tier)\n { maxPictureSize: 552960, maxBitrate: 6000000, tier: 'L', level: 90 }, // Level 3 (Low Tier)\n { maxPictureSize: 983040, maxBitrate: 10000000, tier: 'L', level: 93 }, // Level 3.1 (Low Tier)\n { maxPictureSize: 2228224, maxBitrate: 12000000, tier: 'L', level: 120 }, // Level 4 (Low Tier)\n { maxPictureSize: 2228224, maxBitrate: 30000000, tier: 'H', level: 120 }, // Level 4 (High Tier)\n { maxPictureSize: 2228224, maxBitrate: 20000000, tier: 'L', level: 123 }, // Level 4.1 (Low Tier)\n { maxPictureSize: 2228224, maxBitrate: 50000000, tier: 'H', level: 123 }, // Level 4.1 (High Tier)\n { maxPictureSize: 8912896, maxBitrate: 25000000, tier: 'L', level: 150 }, // Level 5 (Low Tier)\n { maxPictureSize: 8912896, maxBitrate: 100000000, tier: 'H', level: 150 }, // Level 5 (High Tier)\n { maxPictureSize: 8912896, maxBitrate: 40000000, tier: 'L', level: 153 }, // Level 5.1 (Low Tier)\n { maxPictureSize: 8912896, maxBitrate: 160000000, tier: 'H', level: 153 }, // Level 5.1 (High Tier)\n { maxPictureSize: 8912896, maxBitrate: 60000000, tier: 'L', level: 156 }, // Level 5.2 (Low Tier)\n { maxPictureSize: 8912896, maxBitrate: 240000000, tier: 'H', level: 156 }, // Level 5.2 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 60000000, tier: 'L', level: 180 }, // Level 6 (Low Tier)\n { maxPictureSize: 35651584, maxBitrate: 240000000, tier: 'H', level: 180 }, // Level 6 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 120000000, tier: 'L', level: 183 }, // Level 6.1 (Low Tier)\n { maxPictureSize: 35651584, maxBitrate: 480000000, tier: 'H', level: 183 }, // Level 6.1 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 240000000, tier: 'L', level: 186 }, // Level 6.2 (Low Tier)\n { maxPictureSize: 35651584, maxBitrate: 800000000, tier: 'H', level: 186 }, // Level 6.2 (High Tier)\n];\n// https://en.wikipedia.org/wiki/VP9\nexport const VP9_LEVEL_TABLE = [\n { maxPictureSize: 36864, maxBitrate: 200000, level: 10 }, // Level 1\n { maxPictureSize: 73728, maxBitrate: 800000, level: 11 }, // Level 1.1\n { maxPictureSize: 122880, maxBitrate: 1800000, level: 20 }, // Level 2\n { maxPictureSize: 245760, maxBitrate: 3600000, level: 21 }, // Level 2.1\n { maxPictureSize: 552960, maxBitrate: 7200000, level: 30 }, // Level 3\n { maxPictureSize: 983040, maxBitrate: 12000000, level: 31 }, // Level 3.1\n { maxPictureSize: 2228224, maxBitrate: 18000000, level: 40 }, // Level 4\n { maxPictureSize: 2228224, maxBitrate: 30000000, level: 41 }, // Level 4.1\n { maxPictureSize: 8912896, maxBitrate: 60000000, level: 50 }, // Level 5\n { maxPictureSize: 8912896, maxBitrate: 120000000, level: 51 }, // Level 5.1\n { maxPictureSize: 8912896, maxBitrate: 180000000, level: 52 }, // Level 5.2\n { maxPictureSize: 35651584, maxBitrate: 180000000, level: 60 }, // Level 6\n { maxPictureSize: 35651584, maxBitrate: 240000000, level: 61 }, // Level 6.1\n { maxPictureSize: 35651584, maxBitrate: 480000000, level: 62 }, // Level 6.2\n];\n// https://en.wikipedia.org/wiki/AV1\nconst AV1_LEVEL_TABLE = [\n { maxPictureSize: 147456, maxBitrate: 1500000, tier: 'M', level: 0 }, // Level 2.0 (Main Tier)\n { maxPictureSize: 278784, maxBitrate: 3000000, tier: 'M', level: 1 }, // Level 2.1 (Main Tier)\n { maxPictureSize: 665856, maxBitrate: 6000000, tier: 'M', level: 4 }, // Level 3.0 (Main Tier)\n { maxPictureSize: 1065024, maxBitrate: 10000000, tier: 'M', level: 5 }, // Level 3.1 (Main Tier)\n { maxPictureSize: 2359296, maxBitrate: 12000000, tier: 'M', level: 8 }, // Level 4.0 (Main Tier)\n { maxPictureSize: 2359296, maxBitrate: 30000000, tier: 'H', level: 8 }, // Level 4.0 (High Tier)\n { maxPictureSize: 2359296, maxBitrate: 20000000, tier: 'M', level: 9 }, // Level 4.1 (Main Tier)\n { maxPictureSize: 2359296, maxBitrate: 50000000, tier: 'H', level: 9 }, // Level 4.1 (High Tier)\n { maxPictureSize: 8912896, maxBitrate: 30000000, tier: 'M', level: 12 }, // Level 5.0 (Main Tier)\n { maxPictureSize: 8912896, maxBitrate: 100000000, tier: 'H', level: 12 }, // Level 5.0 (High Tier)\n { maxPictureSize: 8912896, maxBitrate: 40000000, tier: 'M', level: 13 }, // Level 5.1 (Main Tier)\n { maxPictureSize: 8912896, maxBitrate: 160000000, tier: 'H', level: 13 }, // Level 5.1 (High Tier)\n { maxPictureSize: 8912896, maxBitrate: 60000000, tier: 'M', level: 14 }, // Level 5.2 (Main Tier)\n { maxPictureSize: 8912896, maxBitrate: 240000000, tier: 'H', level: 14 }, // Level 5.2 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 60000000, tier: 'M', level: 15 }, // Level 5.3 (Main Tier)\n { maxPictureSize: 35651584, maxBitrate: 240000000, tier: 'H', level: 15 }, // Level 5.3 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 60000000, tier: 'M', level: 16 }, // Level 6.0 (Main Tier)\n { maxPictureSize: 35651584, maxBitrate: 240000000, tier: 'H', level: 16 }, // Level 6.0 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 100000000, tier: 'M', level: 17 }, // Level 6.1 (Main Tier)\n { maxPictureSize: 35651584, maxBitrate: 480000000, tier: 'H', level: 17 }, // Level 6.1 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 160000000, tier: 'M', level: 18 }, // Level 6.2 (Main Tier)\n { maxPictureSize: 35651584, maxBitrate: 800000000, tier: 'H', level: 18 }, // Level 6.2 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 160000000, tier: 'M', level: 19 }, // Level 6.3 (Main Tier)\n { maxPictureSize: 35651584, maxBitrate: 800000000, tier: 'H', level: 19 }, // Level 6.3 (High Tier)\n];\nconst VP9_DEFAULT_SUFFIX = '.01.01.01.01.00';\nconst AV1_DEFAULT_SUFFIX = '.0.110.01.01.01.0';\nexport const buildVideoCodecString = (codec, width, height, bitrate) => {\n if (codec === 'avc') {\n const profileIndication = 0x64; // High Profile\n const totalMacroblocks = Math.ceil(width / 16) * Math.ceil(height / 16);\n // Determine the level based on the table\n const levelInfo = AVC_LEVEL_TABLE.find(level => totalMacroblocks <= level.maxMacroblocks && bitrate <= level.maxBitrate) ?? last(AVC_LEVEL_TABLE);\n const levelIndication = levelInfo ? levelInfo.level : 0;\n const hexProfileIndication = profileIndication.toString(16).padStart(2, '0');\n const hexProfileCompatibility = '00';\n const hexLevelIndication = levelIndication.toString(16).padStart(2, '0');\n return `avc1.${hexProfileIndication}${hexProfileCompatibility}${hexLevelIndication}`;\n }\n else if (codec === 'hevc') {\n const profilePrefix = ''; // Profile space 0\n const profileIdc = 1; // Main Profile\n const compatibilityFlags = '6'; // Taken from the example in ISO 14496-15\n const pictureSize = width * height;\n const levelInfo = HEVC_LEVEL_TABLE.find(level => pictureSize <= level.maxPictureSize && bitrate <= level.maxBitrate) ?? last(HEVC_LEVEL_TABLE);\n const constraintFlags = 'B0'; // Progressive source flag\n return 'hev1.'\n + `${profilePrefix}${profileIdc}.`\n + `${compatibilityFlags}.`\n + `${levelInfo.tier}${levelInfo.level}.`\n + `${constraintFlags}`;\n }\n else if (codec === 'vp8') {\n return 'vp8'; // Easy, this one\n }\n else if (codec === 'vp9') {\n const profile = '00'; // Profile 0\n const pictureSize = width * height;\n const levelInfo = VP9_LEVEL_TABLE.find(level => pictureSize <= level.maxPictureSize && bitrate <= level.maxBitrate) ?? last(VP9_LEVEL_TABLE);\n const bitDepth = '08'; // 8-bit\n return `vp09.${profile}.${levelInfo.level.toString().padStart(2, '0')}.${bitDepth}`;\n }\n else if (codec === 'av1') {\n const profile = 0; // Main Profile, single digit\n const pictureSize = width * height;\n const levelInfo = AV1_LEVEL_TABLE.find(level => pictureSize <= level.maxPictureSize && bitrate <= level.maxBitrate) ?? last(AV1_LEVEL_TABLE);\n const level = levelInfo.level.toString().padStart(2, '0');\n const bitDepth = '08'; // 8-bit\n return `av01.${profile}.${level}${levelInfo.tier}.${bitDepth}`;\n }\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n throw new TypeError(`Unhandled codec '${codec}'.`);\n};\nexport const generateVp9CodecConfigurationFromCodecString = (codecString) => {\n // Reference: https://www.webmproject.org/docs/container/#vp9-codec-feature-metadata-codecprivate\n const parts = codecString.split('.'); // We can derive the required values from the codec string\n const profile = Number(parts[1]);\n const level = Number(parts[2]);\n const bitDepth = Number(parts[3]);\n const chromaSubsampling = parts[4] ? Number(parts[4]) : 1;\n return [\n 1, 1, profile,\n 2, 1, level,\n 3, 1, bitDepth,\n 4, 1, chromaSubsampling,\n ];\n};\nexport const generateAv1CodecConfigurationFromCodecString = (codecString) => {\n // Reference: https://aomediacodec.github.io/av1-isobmff/\n const parts = codecString.split('.'); // We can derive the required values from the codec string\n const marker = 1;\n const version = 1;\n const firstByte = (marker << 7) + version;\n const profile = Number(parts[1]);\n const levelAndTier = parts[2];\n const level = Number(levelAndTier.slice(0, -1));\n const secondByte = (profile << 5) + level;\n const tier = levelAndTier.slice(-1) === 'H' ? 1 : 0;\n const bitDepth = Number(parts[3]);\n const highBitDepth = bitDepth === 8 ? 0 : 1;\n const twelveBit = 0;\n const monochrome = parts[4] ? Number(parts[4]) : 0;\n const chromaSubsamplingX = parts[5] ? Number(parts[5][0]) : 1;\n const chromaSubsamplingY = parts[5] ? Number(parts[5][1]) : 1;\n const chromaSamplePosition = parts[5] ? Number(parts[5][2]) : 0; // CSP_UNKNOWN\n const thirdByte = (tier << 7)\n + (highBitDepth << 6)\n + (twelveBit << 5)\n + (monochrome << 4)\n + (chromaSubsamplingX << 3)\n + (chromaSubsamplingY << 2)\n + chromaSamplePosition;\n const initialPresentationDelayPresent = 0; // Should be fine\n const fourthByte = initialPresentationDelayPresent;\n return [firstByte, secondByte, thirdByte, fourthByte];\n};\nexport const extractVideoCodecString = (trackInfo) => {\n const { codec, codecDescription, colorSpace, avcCodecInfo, hevcCodecInfo, vp9CodecInfo, av1CodecInfo } = trackInfo;\n if (codec === 'avc') {\n if (avcCodecInfo) {\n const bytes = new Uint8Array([\n avcCodecInfo.avcProfileIndication,\n avcCodecInfo.profileCompatibility,\n avcCodecInfo.avcLevelIndication,\n ]);\n return `avc1.${bytesToHexString(bytes)}`;\n }\n if (!codecDescription || codecDescription.byteLength < 4) {\n throw new TypeError('AVC decoder description is not provided or is not at least 4 bytes long.');\n }\n return `avc1.${bytesToHexString(codecDescription.subarray(1, 4))}`;\n }\n else if (codec === 'hevc') {\n let generalProfileSpace;\n let generalProfileIdc;\n let compatibilityFlags;\n let generalTierFlag;\n let generalLevelIdc;\n let constraintFlags;\n if (hevcCodecInfo) {\n generalProfileSpace = hevcCodecInfo.generalProfileSpace;\n generalProfileIdc = hevcCodecInfo.generalProfileIdc;\n compatibilityFlags = reverseBitsU32(hevcCodecInfo.generalProfileCompatibilityFlags);\n generalTierFlag = hevcCodecInfo.generalTierFlag;\n generalLevelIdc = hevcCodecInfo.generalLevelIdc;\n constraintFlags = [...hevcCodecInfo.generalConstraintIndicatorFlags];\n }\n else {\n if (!codecDescription || codecDescription.byteLength < 23) {\n throw new TypeError('HEVC decoder description is not provided or is not at least 23 bytes long.');\n }\n const view = toDataView(codecDescription);\n const profileByte = view.getUint8(1);\n generalProfileSpace = (profileByte >> 6) & 0x03;\n generalProfileIdc = profileByte & 0x1F;\n compatibilityFlags = reverseBitsU32(view.getUint32(2));\n generalTierFlag = (profileByte >> 5) & 0x01;\n generalLevelIdc = view.getUint8(12);\n constraintFlags = [];\n for (let i = 0; i < 6; i++) {\n constraintFlags.push(view.getUint8(6 + i));\n }\n }\n let codecString = 'hev1.';\n codecString += ['', 'A', 'B', 'C'][generalProfileSpace] + generalProfileIdc;\n codecString += '.';\n codecString += compatibilityFlags.toString(16).toUpperCase();\n codecString += '.';\n codecString += generalTierFlag === 0 ? 'L' : 'H';\n codecString += generalLevelIdc;\n while (constraintFlags.length > 0 && constraintFlags[constraintFlags.length - 1] === 0) {\n constraintFlags.pop();\n }\n if (constraintFlags.length > 0) {\n codecString += '.';\n codecString += constraintFlags.map(x => x.toString(16).toUpperCase()).join('.');\n }\n return codecString;\n }\n else if (codec === 'vp8') {\n return 'vp8'; // Easy, this one\n }\n else if (codec === 'vp9') {\n if (!vp9CodecInfo) {\n // Calculate level based on dimensions\n const pictureSize = trackInfo.width * trackInfo.height;\n let level = last(VP9_LEVEL_TABLE).level; // Default to highest level\n for (const entry of VP9_LEVEL_TABLE) {\n if (pictureSize <= entry.maxPictureSize) {\n level = entry.level;\n break;\n }\n }\n // We don't really know better, so let's return a general-purpose, common codec string and hope for the best\n return `vp09.00.${level.toString().padStart(2, '0')}.08`;\n }\n const profile = vp9CodecInfo.profile.toString().padStart(2, '0');\n const level = vp9CodecInfo.level.toString().padStart(2, '0');\n const bitDepth = vp9CodecInfo.bitDepth.toString().padStart(2, '0');\n const chromaSubsampling = vp9CodecInfo.chromaSubsampling.toString().padStart(2, '0');\n const colourPrimaries = vp9CodecInfo.colourPrimaries.toString().padStart(2, '0');\n const transferCharacteristics = vp9CodecInfo.transferCharacteristics.toString().padStart(2, '0');\n const matrixCoefficients = vp9CodecInfo.matrixCoefficients.toString().padStart(2, '0');\n const videoFullRangeFlag = vp9CodecInfo.videoFullRangeFlag.toString().padStart(2, '0');\n let string = `vp09.${profile}.${level}.${bitDepth}.${chromaSubsampling}`;\n string += `.${colourPrimaries}.${transferCharacteristics}.${matrixCoefficients}.${videoFullRangeFlag}`;\n if (string.endsWith(VP9_DEFAULT_SUFFIX)) {\n string = string.slice(0, -VP9_DEFAULT_SUFFIX.length);\n }\n return string;\n }\n else if (codec === 'av1') {\n if (!av1CodecInfo) {\n // Calculate level based on dimensions\n const pictureSize = trackInfo.width * trackInfo.height;\n let level = last(VP9_LEVEL_TABLE).level; // Default to highest level\n for (const entry of VP9_LEVEL_TABLE) {\n if (pictureSize <= entry.maxPictureSize) {\n level = entry.level;\n break;\n }\n }\n // We don't really know better, so let's return a general-purpose, common codec string and hope for the best\n return `av01.0.${level.toString().padStart(2, '0')}M.08`;\n }\n // https://aomediacodec.github.io/av1-isobmff/#codecsparam\n const profile = av1CodecInfo.profile; // Single digit\n const level = av1CodecInfo.level.toString().padStart(2, '0');\n const tier = av1CodecInfo.tier ? 'H' : 'M';\n const bitDepth = av1CodecInfo.bitDepth.toString().padStart(2, '0');\n const monochrome = av1CodecInfo.monochrome ? '1' : '0';\n const chromaSubsampling = 100 * av1CodecInfo.chromaSubsamplingX\n + 10 * av1CodecInfo.chromaSubsamplingY\n + 1 * (av1CodecInfo.chromaSubsamplingX && av1CodecInfo.chromaSubsamplingY\n ? av1CodecInfo.chromaSamplePosition\n : 0);\n // The defaults are 1 (ITU-R BT.709)\n const colorPrimaries = colorSpace?.primaries ? COLOR_PRIMARIES_MAP[colorSpace.primaries] : 1;\n const transferCharacteristics = colorSpace?.transfer ? TRANSFER_CHARACTERISTICS_MAP[colorSpace.transfer] : 1;\n const matrixCoefficients = colorSpace?.matrix ? MATRIX_COEFFICIENTS_MAP[colorSpace.matrix] : 1;\n const videoFullRangeFlag = colorSpace?.fullRange ? 1 : 0;\n let string = `av01.${profile}.${level}${tier}.${bitDepth}`;\n string += `.${monochrome}.${chromaSubsampling.toString().padStart(3, '0')}`;\n string += `.${colorPrimaries.toString().padStart(2, '0')}`;\n string += `.${transferCharacteristics.toString().padStart(2, '0')}`;\n string += `.${matrixCoefficients.toString().padStart(2, '0')}`;\n string += `.${videoFullRangeFlag}`;\n if (string.endsWith(AV1_DEFAULT_SUFFIX)) {\n string = string.slice(0, -AV1_DEFAULT_SUFFIX.length);\n }\n return string;\n }\n throw new TypeError(`Unhandled codec '${codec}'.`);\n};\nexport const buildAudioCodecString = (codec, numberOfChannels, sampleRate) => {\n if (codec === 'aac') {\n // If stereo or higher channels and lower sample rate, likely using HE-AAC v2 with PS\n if (numberOfChannels >= 2 && sampleRate <= 24000) {\n return 'mp4a.40.29'; // HE-AAC v2 (AAC LC + SBR + PS)\n }\n // If sample rate is low, likely using HE-AAC v1 with SBR\n if (sampleRate <= 24000) {\n return 'mp4a.40.5'; // HE-AAC v1 (AAC LC + SBR)\n }\n // Default to standard AAC-LC for higher sample rates\n return 'mp4a.40.2'; // AAC-LC\n }\n else if (codec === 'mp3') {\n return 'mp3';\n }\n else if (codec === 'opus') {\n return 'opus';\n }\n else if (codec === 'vorbis') {\n return 'vorbis';\n }\n else if (codec === 'flac') {\n return 'flac';\n }\n else if (PCM_AUDIO_CODECS.includes(codec)) {\n return codec;\n }\n throw new TypeError(`Unhandled codec '${codec}'.`);\n};\nexport const extractAudioCodecString = (trackInfo) => {\n const { codec, codecDescription, aacCodecInfo } = trackInfo;\n if (codec === 'aac') {\n if (!aacCodecInfo) {\n throw new TypeError('AAC codec info must be provided.');\n }\n if (aacCodecInfo.isMpeg2) {\n return 'mp4a.67';\n }\n else {\n const audioSpecificConfig = parseAacAudioSpecificConfig(codecDescription);\n return `mp4a.40.${audioSpecificConfig.objectType}`;\n }\n }\n else if (codec === 'mp3') {\n return 'mp3';\n }\n else if (codec === 'opus') {\n return 'opus';\n }\n else if (codec === 'vorbis') {\n return 'vorbis';\n }\n else if (codec === 'flac') {\n return 'flac';\n }\n else if (codec && PCM_AUDIO_CODECS.includes(codec)) {\n return codec;\n }\n throw new TypeError(`Unhandled codec '${codec}'.`);\n};\nexport const parseAacAudioSpecificConfig = (bytes) => {\n if (!bytes || bytes.byteLength < 2) {\n throw new TypeError('AAC description must be at least 2 bytes long.');\n }\n const bitstream = new Bitstream(bytes);\n let objectType = bitstream.readBits(5);\n if (objectType === 31) {\n objectType = 32 + bitstream.readBits(6);\n }\n const frequencyIndex = bitstream.readBits(4);\n let sampleRate = null;\n if (frequencyIndex === 15) {\n sampleRate = bitstream.readBits(24);\n }\n else {\n const freqTable = [\n 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,\n 16000, 12000, 11025, 8000, 7350,\n ];\n if (frequencyIndex < freqTable.length) {\n sampleRate = freqTable[frequencyIndex];\n }\n }\n const channelConfiguration = bitstream.readBits(4);\n let numberOfChannels = null;\n if (channelConfiguration >= 1 && channelConfiguration <= 7) {\n const channelMap = {\n 1: 1,\n 2: 2,\n 3: 3,\n 4: 4,\n 5: 5,\n 6: 6,\n 7: 8,\n };\n numberOfChannels = channelMap[channelConfiguration];\n }\n return {\n objectType,\n frequencyIndex,\n sampleRate,\n channelConfiguration,\n numberOfChannels,\n };\n};\nexport const OPUS_INTERNAL_SAMPLE_RATE = 48000;\nconst PCM_CODEC_REGEX = /^pcm-([usf])(\\d+)+(be)?$/;\nexport const parsePcmCodec = (codec) => {\n assert(PCM_AUDIO_CODECS.includes(codec));\n if (codec === 'ulaw') {\n return { dataType: 'ulaw', sampleSize: 1, littleEndian: true, silentValue: 255 };\n }\n else if (codec === 'alaw') {\n return { dataType: 'alaw', sampleSize: 1, littleEndian: true, silentValue: 213 };\n }\n const match = PCM_CODEC_REGEX.exec(codec);\n assert(match);\n let dataType;\n if (match[1] === 'u') {\n dataType = 'unsigned';\n }\n else if (match[1] === 's') {\n dataType = 'signed';\n }\n else {\n dataType = 'float';\n }\n const sampleSize = (Number(match[2]) / 8);\n const littleEndian = match[3] !== 'be';\n const silentValue = codec === 'pcm-u8' ? 2 ** 7 : 0;\n return { dataType, sampleSize, littleEndian, silentValue };\n};\nexport const inferCodecFromCodecString = (codecString) => {\n // Video codecs\n if (codecString.startsWith('avc1') || codecString.startsWith('avc3')) {\n return 'avc';\n }\n else if (codecString.startsWith('hev1') || codecString.startsWith('hvc1')) {\n return 'hevc';\n }\n else if (codecString === 'vp8') {\n return 'vp8';\n }\n else if (codecString.startsWith('vp09')) {\n return 'vp9';\n }\n else if (codecString.startsWith('av01')) {\n return 'av1';\n }\n // Audio codecs\n if (codecString.startsWith('mp4a.40') || codecString === 'mp4a.67') {\n return 'aac';\n }\n else if (codecString === 'mp3'\n || codecString === 'mp4a.69'\n || codecString === 'mp4a.6B'\n || codecString === 'mp4a.6b') {\n return 'mp3';\n }\n else if (codecString === 'opus') {\n return 'opus';\n }\n else if (codecString === 'vorbis') {\n return 'vorbis';\n }\n else if (codecString === 'flac') {\n return 'flac';\n }\n else if (codecString === 'ulaw') {\n return 'ulaw';\n }\n else if (codecString === 'alaw') {\n return 'alaw';\n }\n else if (PCM_CODEC_REGEX.test(codecString)) {\n return codecString;\n }\n // Subtitle codecs\n if (codecString === 'webvtt') {\n return 'webvtt';\n }\n return null;\n};\nexport const getVideoEncoderConfigExtension = (codec) => {\n if (codec === 'avc') {\n return {\n avc: {\n format: 'avc', // Ensure the format is not Annex B\n },\n };\n }\n else if (codec === 'hevc') {\n return {\n hevc: {\n format: 'hevc', // Ensure the format is not Annex B\n },\n };\n }\n return {};\n};\nexport const getAudioEncoderConfigExtension = (codec) => {\n if (codec === 'aac') {\n return {\n aac: {\n format: 'aac', // Ensure the format is not ADTS\n },\n };\n }\n else if (codec === 'opus') {\n return {\n opus: {\n format: 'opus',\n },\n };\n }\n return {};\n};\n/**\n * Represents a subjective media quality level.\n * @public\n */\nexport class Quality {\n /** @internal */\n constructor(factor) {\n this._factor = factor;\n }\n /** @internal */\n _toVideoBitrate(codec, width, height) {\n const pixels = width * height;\n const codecEfficiencyFactors = {\n avc: 1.0, // H.264/AVC (baseline)\n hevc: 0.6, // H.265/HEVC (~40% more efficient than AVC)\n vp9: 0.6, // Similar to HEVC\n av1: 0.4, // ~60% more efficient than AVC\n vp8: 1.2, // Slightly less efficient than AVC\n };\n const referencePixels = 1920 * 1080;\n const referenceBitrate = 3000000;\n const scaleFactor = Math.pow(pixels / referencePixels, 0.95); // Slight non-linear scaling\n const baseBitrate = referenceBitrate * scaleFactor;\n const codecAdjustedBitrate = baseBitrate * codecEfficiencyFactors[codec];\n const finalBitrate = codecAdjustedBitrate * this._factor;\n return Math.ceil(finalBitrate / 1000) * 1000;\n }\n /** @internal */\n _toAudioBitrate(codec) {\n if (PCM_AUDIO_CODECS.includes(codec) || codec === 'flac') {\n return undefined;\n }\n const baseRates = {\n aac: 128000, // 128kbps base for AAC\n opus: 64000, // 64kbps base for Opus\n mp3: 160000, // 160kbps base for MP3\n vorbis: 64000, // 64kbps base for Vorbis\n };\n const baseBitrate = baseRates[codec];\n if (!baseBitrate) {\n throw new Error(`Unhandled codec: ${codec}`);\n }\n let finalBitrate = baseBitrate * this._factor;\n if (codec === 'aac') {\n // AAC only works with specific bitrates, let's find the closest\n const validRates = [96000, 128000, 160000, 192000];\n finalBitrate = validRates.reduce((prev, curr) => Math.abs(curr - finalBitrate) < Math.abs(prev - finalBitrate) ? curr : prev);\n }\n else if (codec === 'opus' || codec === 'vorbis') {\n finalBitrate = Math.max(6000, finalBitrate);\n }\n else if (codec === 'mp3') {\n const validRates = [\n 8000, 16000, 24000, 32000, 40000, 48000, 64000, 80000,\n 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000,\n ];\n finalBitrate = validRates.reduce((prev, curr) => Math.abs(curr - finalBitrate) < Math.abs(prev - finalBitrate) ? curr : prev);\n }\n return Math.round(finalBitrate / 1000) * 1000;\n }\n}\n/**\n * Represents a very low media quality.\n * @public\n */\nexport const QUALITY_VERY_LOW = new Quality(0.3);\n/**\n * Represents a low media quality.\n * @public\n */\nexport const QUALITY_LOW = new Quality(0.6);\n/**\n * Represents a medium media quality.\n * @public\n */\nexport const QUALITY_MEDIUM = new Quality(1);\n/**\n * Represents a high media quality.\n * @public\n */\nexport const QUALITY_HIGH = new Quality(2);\n/**\n * Represents a very high media quality.\n * @public\n */\nexport const QUALITY_VERY_HIGH = new Quality(4);\nconst VALID_VIDEO_CODEC_STRING_PREFIXES = ['avc1', 'avc3', 'hev1', 'hvc1', 'vp8', 'vp09', 'av01'];\nconst AVC_CODEC_STRING_REGEX = /^(avc1|avc3)\\.[0-9a-fA-F]{6}$/;\nconst HEVC_CODEC_STRING_REGEX = /^(hev1|hvc1)\\.(?:[ABC]?\\d+)\\.[0-9a-fA-F]{1,8}\\.[LH]\\d+(?:\\.[0-9a-fA-F]{1,2}){0,6}$/;\nconst VP9_CODEC_STRING_REGEX = /^vp09(?:\\.\\d{2}){3}(?:(?:\\.\\d{2}){5})?$/;\nconst AV1_CODEC_STRING_REGEX = /^av01\\.\\d\\.\\d{2}[MH]\\.\\d{2}(?:\\.\\d\\.\\d{3}\\.\\d{2}\\.\\d{2}\\.\\d{2}\\.\\d)?$/;\nexport const validateVideoChunkMetadata = (metadata) => {\n if (!metadata) {\n throw new TypeError('Video chunk metadata must be provided.');\n }\n if (typeof metadata !== 'object') {\n throw new TypeError('Video chunk metadata must be an object.');\n }\n if (!metadata.decoderConfig) {\n throw new TypeError('Video chunk metadata must include a decoder configuration.');\n }\n if (typeof metadata.decoderConfig !== 'object') {\n throw new TypeError('Video chunk metadata decoder configuration must be an object.');\n }\n if (typeof metadata.decoderConfig.codec !== 'string') {\n throw new TypeError('Video chunk metadata decoder configuration must specify a codec string.');\n }\n if (!VALID_VIDEO_CODEC_STRING_PREFIXES.some(prefix => metadata.decoderConfig.codec.startsWith(prefix))) {\n throw new TypeError('Video chunk metadata decoder configuration codec string must be a valid video codec string as specified in'\n + ' the WebCodecs Codec Registry.');\n }\n if (!Number.isInteger(metadata.decoderConfig.codedWidth) || metadata.decoderConfig.codedWidth <= 0) {\n throw new TypeError('Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).');\n }\n if (!Number.isInteger(metadata.decoderConfig.codedHeight) || metadata.decoderConfig.codedHeight <= 0) {\n throw new TypeError('Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).');\n }\n if (metadata.decoderConfig.description !== undefined) {\n if (!isAllowSharedBufferSource(metadata.decoderConfig.description)) {\n throw new TypeError('Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an'\n + ' ArrayBuffer view.');\n }\n }\n if (metadata.decoderConfig.colorSpace !== undefined) {\n const { colorSpace } = metadata.decoderConfig;\n if (typeof colorSpace !== 'object') {\n throw new TypeError('Video chunk metadata decoder configuration colorSpace, when provided, must be an object.');\n }\n const primariesValues = Object.keys(COLOR_PRIMARIES_MAP);\n if (colorSpace.primaries != null && !primariesValues.includes(colorSpace.primaries)) {\n throw new TypeError(`Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of`\n + ` ${primariesValues.join(', ')}.`);\n }\n const transferValues = Object.keys(TRANSFER_CHARACTERISTICS_MAP);\n if (colorSpace.transfer != null && !transferValues.includes(colorSpace.transfer)) {\n throw new TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of`\n + ` ${transferValues.join(', ')}.`);\n }\n const matrixValues = Object.keys(MATRIX_COEFFICIENTS_MAP);\n if (colorSpace.matrix != null && !matrixValues.includes(colorSpace.matrix)) {\n throw new TypeError(`Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of`\n + ` ${matrixValues.join(', ')}.`);\n }\n if (colorSpace.fullRange != null && typeof colorSpace.fullRange !== 'boolean') {\n throw new TypeError('Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.');\n }\n }\n if (metadata.decoderConfig.codec.startsWith('avc1') || metadata.decoderConfig.codec.startsWith('avc3')) {\n // AVC-specific validation\n if (!AVC_CODEC_STRING_REGEX.test(metadata.decoderConfig.codec)) {\n throw new TypeError('Video chunk metadata decoder configuration codec string for AVC must be a valid AVC codec string as'\n + ' specified in Section 3.4 of RFC 6381.');\n }\n // `description` may or may not be set, depending on if the format is AVCC or Annex B, so don't perform any\n // validation for it.\n // https://www.w3.org/TR/webcodecs-avc-codec-registration\n }\n else if (metadata.decoderConfig.codec.startsWith('hev1') || metadata.decoderConfig.codec.startsWith('hvc1')) {\n // HEVC-specific validation\n if (!HEVC_CODEC_STRING_REGEX.test(metadata.decoderConfig.codec)) {\n throw new TypeError('Video chunk metadata decoder configuration codec string for HEVC must be a valid HEVC codec string as'\n + ' specified in Section E.3 of ISO 14496-15.');\n }\n // `description` may or may not be set, depending on if the format is HEVC or Annex B, so don't perform any\n // validation for it.\n // https://www.w3.org/TR/webcodecs-hevc-codec-registration\n }\n else if (metadata.decoderConfig.codec.startsWith('vp8')) {\n // VP8-specific validation\n if (metadata.decoderConfig.codec !== 'vp8') {\n throw new TypeError('Video chunk metadata decoder configuration codec string for VP8 must be \"vp8\".');\n }\n }\n else if (metadata.decoderConfig.codec.startsWith('vp09')) {\n // VP9-specific validation\n if (!VP9_CODEC_STRING_REGEX.test(metadata.decoderConfig.codec)) {\n throw new TypeError('Video chunk metadata decoder configuration codec string for VP9 must be a valid VP9 codec string as'\n + ' specified in Section \"Codecs Parameter String\" of https://www.webmproject.org/vp9/mp4/.');\n }\n }\n else if (metadata.decoderConfig.codec.startsWith('av01')) {\n // AV1-specific validation\n if (!AV1_CODEC_STRING_REGEX.test(metadata.decoderConfig.codec)) {\n throw new TypeError('Video chunk metadata decoder configuration codec string for AV1 must be a valid AV1 codec string as'\n + ' specified in Section \"Codecs Parameter String\" of https://aomediacodec.github.io/av1-isobmff/.');\n }\n }\n};\nconst VALID_AUDIO_CODEC_STRING_PREFIXES = ['mp4a', 'mp3', 'opus', 'vorbis', 'flac', 'ulaw', 'alaw', 'pcm'];\nexport const validateAudioChunkMetadata = (metadata) => {\n if (!metadata) {\n throw new TypeError('Audio chunk metadata must be provided.');\n }\n if (typeof metadata !== 'object') {\n throw new TypeError('Audio chunk metadata must be an object.');\n }\n if (!metadata.decoderConfig) {\n throw new TypeError('Audio chunk metadata must include a decoder configuration.');\n }\n if (typeof metadata.decoderConfig !== 'object') {\n throw new TypeError('Audio chunk metadata decoder configuration must be an object.');\n }\n if (typeof metadata.decoderConfig.codec !== 'string') {\n throw new TypeError('Audio chunk metadata decoder configuration must specify a codec string.');\n }\n if (!VALID_AUDIO_CODEC_STRING_PREFIXES.some(prefix => metadata.decoderConfig.codec.startsWith(prefix))) {\n throw new TypeError('Audio chunk metadata decoder configuration codec string must be a valid audio codec string as specified in'\n + ' the WebCodecs Codec Registry.');\n }\n if (!Number.isInteger(metadata.decoderConfig.sampleRate) || metadata.decoderConfig.sampleRate <= 0) {\n throw new TypeError('Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).');\n }\n if (!Number.isInteger(metadata.decoderConfig.numberOfChannels) || metadata.decoderConfig.numberOfChannels <= 0) {\n throw new TypeError('Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).');\n }\n if (metadata.decoderConfig.description !== undefined) {\n if (!isAllowSharedBufferSource(metadata.decoderConfig.description)) {\n throw new TypeError('Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an'\n + ' ArrayBuffer view.');\n }\n }\n if (metadata.decoderConfig.codec.startsWith('mp4a')\n // These three refer to MP3:\n && metadata.decoderConfig.codec !== 'mp4a.69'\n && metadata.decoderConfig.codec !== 'mp4a.6B'\n && metadata.decoderConfig.codec !== 'mp4a.6b') {\n // AAC-specific validation\n const validStrings = ['mp4a.40.2', 'mp4a.40.02', 'mp4a.40.5', 'mp4a.40.05', 'mp4a.40.29', 'mp4a.67'];\n if (!validStrings.includes(metadata.decoderConfig.codec)) {\n throw new TypeError('Audio chunk metadata decoder configuration codec string for AAC must be a valid AAC codec string as'\n + ' specified in https://www.w3.org/TR/webcodecs-aac-codec-registration/.');\n }\n if (!metadata.decoderConfig.description) {\n throw new TypeError('Audio chunk metadata decoder configuration for AAC must include a description, which is expected to be'\n + ' an AudioSpecificConfig as specified in ISO 14496-3.');\n }\n }\n else if (metadata.decoderConfig.codec.startsWith('mp3') || metadata.decoderConfig.codec.startsWith('mp4a')) {\n // MP3-specific validation\n if (metadata.decoderConfig.codec !== 'mp3'\n && metadata.decoderConfig.codec !== 'mp4a.69'\n && metadata.decoderConfig.codec !== 'mp4a.6B'\n && metadata.decoderConfig.codec !== 'mp4a.6b') {\n throw new TypeError('Audio chunk metadata decoder configuration codec string for MP3 must be \"mp3\", \"mp4a.69\" or'\n + ' \"mp4a.6B\".');\n }\n }\n else if (metadata.decoderConfig.codec.startsWith('opus')) {\n // Opus-specific validation\n if (metadata.decoderConfig.codec !== 'opus') {\n throw new TypeError('Audio chunk metadata decoder configuration codec string for Opus must be \"opus\".');\n }\n if (metadata.decoderConfig.description && metadata.decoderConfig.description.byteLength < 18) {\n // Description is optional for Opus per-spec, so we shouldn't enforce it\n throw new TypeError('Audio chunk metadata decoder configuration description, when specified, is expected to be an'\n + ' Identification Header as specified in Section 5.1 of RFC 7845.');\n }\n }\n else if (metadata.decoderConfig.codec.startsWith('vorbis')) {\n // Vorbis-specific validation\n if (metadata.decoderConfig.codec !== 'vorbis') {\n throw new TypeError('Audio chunk metadata decoder configuration codec string for Vorbis must be \"vorbis\".');\n }\n if (!metadata.decoderConfig.description) {\n throw new TypeError('Audio chunk metadata decoder configuration for Vorbis must include a description, which is expected to'\n + ' adhere to the format described in https://www.w3.org/TR/webcodecs-vorbis-codec-registration/.');\n }\n }\n else if (metadata.decoderConfig.codec.startsWith('flac')) {\n // FLAC-specific validation\n if (metadata.decoderConfig.codec !== 'flac') {\n throw new TypeError('Audio chunk metadata decoder configuration codec string for FLAC must be \"flac\".');\n }\n const minDescriptionSize = 4 + 4 + 34; // 'fLaC' + metadata block header + STREAMINFO block\n if (!metadata.decoderConfig.description || metadata.decoderConfig.description.byteLength < minDescriptionSize) {\n throw new TypeError('Audio chunk metadata decoder configuration for FLAC must include a description, which is expected to'\n + ' adhere to the format described in https://www.w3.org/TR/webcodecs-flac-codec-registration/.');\n }\n }\n else if (metadata.decoderConfig.codec.startsWith('pcm')\n || metadata.decoderConfig.codec.startsWith('ulaw')\n || metadata.decoderConfig.codec.startsWith('alaw')) {\n // PCM-specific validation\n if (!PCM_AUDIO_CODECS.includes(metadata.decoderConfig.codec)) {\n throw new TypeError('Audio chunk metadata decoder configuration codec string for PCM must be one of the supported PCM'\n + ` codecs (${PCM_AUDIO_CODECS.join(', ')}).`);\n }\n }\n};\nexport const validateSubtitleMetadata = (metadata) => {\n if (!metadata) {\n throw new TypeError('Subtitle metadata must be provided.');\n }\n if (typeof metadata !== 'object') {\n throw new TypeError('Subtitle metadata must be an object.');\n }\n if (!metadata.config) {\n throw new TypeError('Subtitle metadata must include a config object.');\n }\n if (typeof metadata.config !== 'object') {\n throw new TypeError('Subtitle metadata config must be an object.');\n }\n if (typeof metadata.config.description !== 'string') {\n throw new TypeError('Subtitle metadata config description must be a string.');\n }\n};\n/**\n * Checks if the browser is able to encode the given codec.\n * @public\n */\nexport const canEncode = (codec) => {\n if (VIDEO_CODECS.includes(codec)) {\n return canEncodeVideo(codec);\n }\n else if (AUDIO_CODECS.includes(codec)) {\n return canEncodeAudio(codec);\n }\n else if (SUBTITLE_CODECS.includes(codec)) {\n return canEncodeSubtitles(codec);\n }\n throw new TypeError(`Unknown codec '${codec}'.`);\n};\n/**\n * Checks if the browser is able to encode the given video codec with the given parameters.\n * @public\n */\nexport const canEncodeVideo = async (codec, { width = 1280, height = 720, bitrate = 1e6 } = {}) => {\n if (!VIDEO_CODECS.includes(codec)) {\n return false;\n }\n if (!Number.isInteger(width) || width <= 0) {\n throw new TypeError('width must be a positive integer.');\n }\n if (!Number.isInteger(height) || height <= 0) {\n throw new TypeError('height must be a positive integer.');\n }\n if (!(bitrate instanceof Quality) && (!Number.isInteger(bitrate) || bitrate <= 0)) {\n throw new TypeError('bitrate must be a positive integer or a quality.');\n }\n const resolvedBitrate = bitrate instanceof Quality\n ? bitrate._toVideoBitrate(codec, width, height)\n : bitrate;\n if (customVideoEncoders.length > 0) {\n const encoderConfig = {\n codec: buildVideoCodecString(codec, width, height, resolvedBitrate),\n width,\n height,\n bitrate: resolvedBitrate,\n ...getVideoEncoderConfigExtension(codec),\n };\n if (customVideoEncoders.some(x => x.supports(codec, encoderConfig))) {\n // There's a custom encoder\n return true;\n }\n }\n if (typeof VideoEncoder === 'undefined') {\n return false;\n }\n const support = await VideoEncoder.isConfigSupported({\n codec: buildVideoCodecString(codec, width, height, resolvedBitrate),\n width,\n height,\n bitrate: resolvedBitrate,\n ...getVideoEncoderConfigExtension(codec),\n });\n return support.supported === true;\n};\n/**\n * Checks if the browser is able to encode the given audio codec with the given parameters.\n * @public\n */\nexport const canEncodeAudio = async (codec, { numberOfChannels = 2, sampleRate = 48000, bitrate = 128e3 } = {}) => {\n if (!AUDIO_CODECS.includes(codec)) {\n return false;\n }\n if (!Number.isInteger(numberOfChannels) || numberOfChannels <= 0) {\n throw new TypeError('numberOfChannels must be a positive integer.');\n }\n if (!Number.isInteger(sampleRate) || sampleRate <= 0) {\n throw new TypeError('sampleRate must be a positive integer.');\n }\n if (!(bitrate instanceof Quality) && (!Number.isInteger(bitrate) || bitrate <= 0)) {\n throw new TypeError('bitrate must be a positive integer.');\n }\n const resolvedBitrate = bitrate instanceof Quality\n ? bitrate._toAudioBitrate(codec)\n : bitrate;\n if (customAudioEncoders.length > 0) {\n const encoderConfig = {\n codec: buildAudioCodecString(codec, numberOfChannels, sampleRate),\n numberOfChannels,\n sampleRate,\n bitrate: resolvedBitrate,\n ...getAudioEncoderConfigExtension(codec),\n };\n if (customAudioEncoders.some(x => x.supports(codec, encoderConfig))) {\n // There's a custom encoder\n return true;\n }\n }\n if (PCM_AUDIO_CODECS.includes(codec)) {\n return true; // Because we encode these ourselves\n }\n if (typeof AudioEncoder === 'undefined') {\n return false;\n }\n const support = await AudioEncoder.isConfigSupported({\n codec: buildAudioCodecString(codec, numberOfChannels, sampleRate),\n numberOfChannels,\n sampleRate,\n bitrate: resolvedBitrate,\n ...getAudioEncoderConfigExtension(codec),\n });\n return support.supported === true;\n};\n/**\n * Checks if the browser is able to encode the given subtitle codec.\n * @public\n */\nexport const canEncodeSubtitles = async (codec) => {\n if (!SUBTITLE_CODECS.includes(codec)) {\n return false;\n }\n return true;\n};\n/**\n * Returns the list of all media codecs that can be encoded by the browser.\n * @public\n */\nexport const getEncodableCodecs = async () => {\n const [videoCodecs, audioCodecs, subtitleCodecs] = await Promise.all([\n getEncodableVideoCodecs(),\n getEncodableAudioCodecs(),\n getEncodableSubtitleCodecs(),\n ]);\n return [...videoCodecs, ...audioCodecs, ...subtitleCodecs];\n};\n/**\n * Returns the list of all video codecs that can be encoded by the browser.\n * @public\n */\nexport const getEncodableVideoCodecs = async (checkedCodecs = VIDEO_CODECS, options) => {\n const bools = await Promise.all(checkedCodecs.map(codec => canEncodeVideo(codec, options)));\n return checkedCodecs.filter((_, i) => bools[i]);\n};\n/**\n * Returns the list of all audio codecs that can be encoded by the browser.\n * @public\n */\nexport const getEncodableAudioCodecs = async (checkedCodecs = AUDIO_CODECS, options) => {\n const bools = await Promise.all(checkedCodecs.map(codec => canEncodeAudio(codec, options)));\n return checkedCodecs.filter((_, i) => bools[i]);\n};\n/**\n * Returns the list of all subtitle codecs that can be encoded by the browser.\n * @public\n */\nexport const getEncodableSubtitleCodecs = async (checkedCodecs = SUBTITLE_CODECS) => {\n const bools = await Promise.all(checkedCodecs.map(canEncodeSubtitles));\n return checkedCodecs.filter((_, i) => bools[i]);\n};\n/**\n * Returns the first video codec from the given list that can be encoded by the browser.\n * @public\n */\nexport const getFirstEncodableVideoCodec = async (checkedCodecs, options) => {\n for (const codec of checkedCodecs) {\n if (await canEncodeVideo(codec, options)) {\n return codec;\n }\n }\n return null;\n};\n/**\n * Returns the first audio codec from the given list that can be encoded by the browser.\n * @public\n */\nexport const getFirstEncodableAudioCodec = async (checkedCodecs, options) => {\n for (const codec of checkedCodecs) {\n if (await canEncodeAudio(codec, options)) {\n return codec;\n }\n }\n return null;\n};\n/**\n * Returns the first subtitle codec from the given list that can be encoded by the browser.\n * @public\n */\nexport const getFirstEncodableSubtitleCodec = async (checkedCodecs) => {\n for (const codec of checkedCodecs) {\n if (await canEncodeSubtitles(codec)) {\n return codec;\n }\n }\n return null;\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { VP9_LEVEL_TABLE } from './codec.js';\nimport { assert, Bitstream, last, readExpGolomb, readSignedExpGolomb, toDataView } from './misc.js';\n// References for AVC/HEVC code:\n// ISO 14496-15\n// Rec. ITU-T H.264\n// Rec. ITU-T H.265\n// https://stackoverflow.com/questions/24884827\n/** Finds all NAL units in an AVC packet in Annex B format. */\nconst findNalUnitsInAnnexB = (packetData) => {\n const nalUnits = [];\n let i = 0;\n while (i < packetData.length) {\n let startCodePos = -1;\n let startCodeLength = 0;\n for (let j = i; j < packetData.length - 3; j++) {\n // Check for 3-byte start code (0x000001)\n if (packetData[j] === 0 && packetData[j + 1] === 0 && packetData[j + 2] === 1) {\n startCodePos = j;\n startCodeLength = 3;\n break;\n }\n // Check for 4-byte start code (0x00000001)\n if (j < packetData.length - 4\n && packetData[j] === 0\n && packetData[j + 1] === 0\n && packetData[j + 2] === 0\n && packetData[j + 3] === 1) {\n startCodePos = j;\n startCodeLength = 4;\n break;\n }\n }\n if (startCodePos === -1) {\n break; // No more start codes found\n }\n // If this isn't the first start code, extract the previous NAL unit\n if (i > 0 && startCodePos > i) {\n const nalData = packetData.subarray(i, startCodePos);\n if (nalData.length > 0) {\n nalUnits.push(nalData);\n }\n }\n i = startCodePos + startCodeLength;\n }\n // Extract the last NAL unit if there is one\n if (i < packetData.length) {\n const nalData = packetData.subarray(i);\n if (nalData.length > 0) {\n nalUnits.push(nalData);\n }\n }\n return nalUnits;\n};\nconst removeEmulationPreventionBytes = (data) => {\n const result = [];\n const len = data.length;\n for (let i = 0; i < len; i++) {\n // Look for the 0x000003 pattern\n if (i + 2 < len && data[i] === 0x00 && data[i + 1] === 0x00 && data[i + 2] === 0x03) {\n result.push(0x00, 0x00); // Push the first two bytes\n i += 2; // Skip the 0x03 byte\n }\n else {\n result.push(data[i]);\n }\n }\n return new Uint8Array(result);\n};\n/** Converts an AVC packet in Annex B format to length-prefixed format. */\nexport const transformAnnexBToLengthPrefixed = (packetData) => {\n const NAL_UNIT_LENGTH_SIZE = 4;\n const nalUnits = findNalUnitsInAnnexB(packetData);\n if (nalUnits.length === 0) {\n // If no NAL units were found, it's not valid Annex B data\n return null;\n }\n let totalSize = 0;\n for (const nalUnit of nalUnits) {\n totalSize += NAL_UNIT_LENGTH_SIZE + nalUnit.byteLength;\n }\n const avccData = new Uint8Array(totalSize);\n const dataView = new DataView(avccData.buffer);\n let offset = 0;\n // Write each NAL unit with its length prefix\n for (const nalUnit of nalUnits) {\n const length = nalUnit.byteLength;\n dataView.setUint32(offset, length, false);\n offset += 4;\n avccData.set(nalUnit, offset);\n offset += nalUnit.byteLength;\n }\n return avccData;\n};\nconst extractNalUnitTypeForAvc = (data) => {\n return data[0] & 0x1F;\n};\n/** Builds an AvcDecoderConfigurationRecord from an AVC packet in Annex B format. */\nexport const extractAvcDecoderConfigurationRecord = (packetData) => {\n try {\n const nalUnits = findNalUnitsInAnnexB(packetData);\n const spsUnits = nalUnits.filter(unit => extractNalUnitTypeForAvc(unit) === 7);\n const ppsUnits = nalUnits.filter(unit => extractNalUnitTypeForAvc(unit) === 8);\n const spsExtUnits = nalUnits.filter(unit => extractNalUnitTypeForAvc(unit) === 13);\n if (spsUnits.length === 0) {\n return null;\n }\n if (ppsUnits.length === 0) {\n return null;\n }\n // Let's get the first SPS for profile and level information\n const spsData = spsUnits[0];\n const bitstream = new Bitstream(removeEmulationPreventionBytes(spsData));\n bitstream.skipBits(1); // forbidden_zero_bit\n bitstream.skipBits(2); // nal_ref_idc\n const nal_unit_type = bitstream.readBits(5);\n if (nal_unit_type !== 7) { // SPS NAL unit type is 7\n console.error('Invalid SPS NAL unit type');\n return null;\n }\n const profile_idc = bitstream.readAlignedByte();\n const constraint_flags = bitstream.readAlignedByte();\n const level_idc = bitstream.readAlignedByte();\n const record = {\n configurationVersion: 1,\n avcProfileIndication: profile_idc,\n profileCompatibility: constraint_flags,\n avcLevelIndication: level_idc,\n lengthSizeMinusOne: 3, // Typically 4 bytes for length field\n sequenceParameterSets: spsUnits,\n pictureParameterSets: ppsUnits,\n chromaFormat: null,\n bitDepthLumaMinus8: null,\n bitDepthChromaMinus8: null,\n sequenceParameterSetExt: null,\n };\n if (profile_idc === 100\n || profile_idc === 110\n || profile_idc === 122\n || profile_idc === 144) {\n readExpGolomb(bitstream); // seq_parameter_set_id\n const chroma_format_idc = readExpGolomb(bitstream);\n if (chroma_format_idc === 3) {\n bitstream.skipBits(1); // separate_colour_plane_flag\n }\n const bit_depth_luma_minus8 = readExpGolomb(bitstream);\n const bit_depth_chroma_minus8 = readExpGolomb(bitstream);\n record.chromaFormat = chroma_format_idc;\n record.bitDepthLumaMinus8 = bit_depth_luma_minus8;\n record.bitDepthChromaMinus8 = bit_depth_chroma_minus8;\n record.sequenceParameterSetExt = spsExtUnits;\n }\n return record;\n }\n catch (error) {\n console.error('Error building AVC Decoder Configuration Record:', error);\n return null;\n }\n};\n/** Serializes an AvcDecoderConfigurationRecord into the format specified in Section 5.3.3.1 of ISO 14496-15. */\nexport const serializeAvcDecoderConfigurationRecord = (record) => {\n const bytes = [];\n // Write header\n bytes.push(record.configurationVersion);\n bytes.push(record.avcProfileIndication);\n bytes.push(record.profileCompatibility);\n bytes.push(record.avcLevelIndication);\n bytes.push(0xFC | (record.lengthSizeMinusOne & 0x03)); // Reserved bits (6) + lengthSizeMinusOne (2)\n // Reserved bits (3) + numOfSequenceParameterSets (5)\n bytes.push(0xE0 | (record.sequenceParameterSets.length & 0x1F));\n // Write SPS\n for (const sps of record.sequenceParameterSets) {\n const length = sps.byteLength;\n bytes.push(length >> 8); // High byte\n bytes.push(length & 0xFF); // Low byte\n for (let i = 0; i < length; i++) {\n bytes.push(sps[i]);\n }\n }\n bytes.push(record.pictureParameterSets.length);\n // Write PPS\n for (const pps of record.pictureParameterSets) {\n const length = pps.byteLength;\n bytes.push(length >> 8); // High byte\n bytes.push(length & 0xFF); // Low byte\n for (let i = 0; i < length; i++) {\n bytes.push(pps[i]);\n }\n }\n if (record.avcProfileIndication === 100\n || record.avcProfileIndication === 110\n || record.avcProfileIndication === 122\n || record.avcProfileIndication === 144) {\n assert(record.chromaFormat !== null);\n assert(record.bitDepthLumaMinus8 !== null);\n assert(record.bitDepthChromaMinus8 !== null);\n assert(record.sequenceParameterSetExt !== null);\n bytes.push(0xFC | (record.chromaFormat & 0x03)); // Reserved bits + chroma_format\n bytes.push(0xF8 | (record.bitDepthLumaMinus8 & 0x07)); // Reserved bits + bit_depth_luma_minus8\n bytes.push(0xF8 | (record.bitDepthChromaMinus8 & 0x07)); // Reserved bits + bit_depth_chroma_minus8\n bytes.push(record.sequenceParameterSetExt.length);\n // Write SPS Ext\n for (const spsExt of record.sequenceParameterSetExt) {\n const length = spsExt.byteLength;\n bytes.push(length >> 8); // High byte\n bytes.push(length & 0xFF); // Low byte\n for (let i = 0; i < length; i++) {\n bytes.push(spsExt[i]);\n }\n }\n }\n return new Uint8Array(bytes);\n};\nconst NALU_TYPE_VPS = 32;\nconst NALU_TYPE_SPS = 33;\nconst NALU_TYPE_PPS = 34;\nconst NALU_TYPE_SEI_PREFIX = 39;\nconst NALU_TYPE_SEI_SUFFIX = 40;\nconst extractNalUnitTypeForHevc = (data) => {\n return (data[0] >> 1) & 0x3F;\n};\n/** Builds a HevcDecoderConfigurationRecord from an HEVC packet in Annex B format. */\nexport const extractHevcDecoderConfigurationRecord = (packetData) => {\n try {\n const nalUnits = findNalUnitsInAnnexB(packetData);\n const vpsUnits = nalUnits.filter(unit => extractNalUnitTypeForHevc(unit) === NALU_TYPE_VPS);\n const spsUnits = nalUnits.filter(unit => extractNalUnitTypeForHevc(unit) === NALU_TYPE_SPS);\n const ppsUnits = nalUnits.filter(unit => extractNalUnitTypeForHevc(unit) === NALU_TYPE_PPS);\n const seiUnits = nalUnits.filter(unit => extractNalUnitTypeForHevc(unit) === NALU_TYPE_SEI_PREFIX\n || extractNalUnitTypeForHevc(unit) === NALU_TYPE_SEI_SUFFIX);\n if (spsUnits.length === 0 || ppsUnits.length === 0)\n return null;\n const sps = spsUnits[0];\n const bitstream = new Bitstream(removeEmulationPreventionBytes(sps));\n bitstream.skipBits(16); // NAL header\n bitstream.readBits(4); // sps_video_parameter_set_id\n const sps_max_sub_layers_minus1 = bitstream.readBits(3);\n const sps_temporal_id_nesting_flag = bitstream.readBits(1);\n const { general_profile_space, general_tier_flag, general_profile_idc, general_profile_compatibility_flags, general_constraint_indicator_flags, general_level_idc, } = parseProfileTierLevel(bitstream, sps_max_sub_layers_minus1);\n readExpGolomb(bitstream); // sps_seq_parameter_set_id\n const chroma_format_idc = readExpGolomb(bitstream);\n if (chroma_format_idc === 3)\n bitstream.skipBits(1); // separate_colour_plane_flag\n readExpGolomb(bitstream); // pic_width_in_luma_samples\n readExpGolomb(bitstream); // pic_height_in_luma_samples\n if (bitstream.readBits(1)) { // conformance_window_flag\n readExpGolomb(bitstream); // conf_win_left_offset\n readExpGolomb(bitstream); // conf_win_right_offset\n readExpGolomb(bitstream); // conf_win_top_offset\n readExpGolomb(bitstream); // conf_win_bottom_offset\n }\n const bit_depth_luma_minus8 = readExpGolomb(bitstream);\n const bit_depth_chroma_minus8 = readExpGolomb(bitstream);\n readExpGolomb(bitstream); // log2_max_pic_order_cnt_lsb_minus4\n const sps_sub_layer_ordering_info_present_flag = bitstream.readBits(1);\n const maxNum = sps_sub_layer_ordering_info_present_flag ? 0 : sps_max_sub_layers_minus1;\n for (let i = maxNum; i <= sps_max_sub_layers_minus1; i++) {\n readExpGolomb(bitstream); // sps_max_dec_pic_buffering_minus1[i]\n readExpGolomb(bitstream); // sps_max_num_reorder_pics[i]\n readExpGolomb(bitstream); // sps_max_latency_increase_plus1[i]\n }\n readExpGolomb(bitstream); // log2_min_luma_coding_block_size_minus3\n readExpGolomb(bitstream); // log2_diff_max_min_luma_coding_block_size\n readExpGolomb(bitstream); // log2_min_luma_transform_block_size_minus2\n readExpGolomb(bitstream); // log2_diff_max_min_luma_transform_block_size\n readExpGolomb(bitstream); // max_transform_hierarchy_depth_inter\n readExpGolomb(bitstream); // max_transform_hierarchy_depth_intra\n if (bitstream.readBits(1)) { // scaling_list_enabled_flag\n if (bitstream.readBits(1)) {\n skipScalingListData(bitstream);\n }\n }\n bitstream.skipBits(1); // amp_enabled_flag\n bitstream.skipBits(1); // sample_adaptive_offset_enabled_flag\n if (bitstream.readBits(1)) { // pcm_enabled_flag\n bitstream.skipBits(4); // pcm_sample_bit_depth_luma_minus1\n bitstream.skipBits(4); // pcm_sample_bit_depth_chroma_minus1\n readExpGolomb(bitstream); // log2_min_pcm_luma_coding_block_size_minus3\n readExpGolomb(bitstream); // log2_diff_max_min_pcm_luma_coding_block_size\n bitstream.skipBits(1); // pcm_loop_filter_disabled_flag\n }\n const num_short_term_ref_pic_sets = readExpGolomb(bitstream);\n skipAllStRefPicSets(bitstream, num_short_term_ref_pic_sets);\n if (bitstream.readBits(1)) { // long_term_ref_pics_present_flag\n const num_long_term_ref_pics_sps = readExpGolomb(bitstream);\n for (let i = 0; i < num_long_term_ref_pics_sps; i++) {\n readExpGolomb(bitstream); // lt_ref_pic_poc_lsb_sps[i]\n bitstream.skipBits(1); // used_by_curr_pic_lt_sps_flag[i]\n }\n }\n bitstream.skipBits(1); // sps_temporal_mvp_enabled_flag\n bitstream.skipBits(1); // strong_intra_smoothing_enabled_flag\n let min_spatial_segmentation_idc = 0;\n if (bitstream.readBits(1)) { // vui_parameters_present_flag\n min_spatial_segmentation_idc = parseVuiForMinSpatialSegmentationIdc(bitstream, sps_max_sub_layers_minus1);\n }\n // Parse PPS for parallelismType\n let parallelismType = 0;\n if (ppsUnits.length > 0) {\n const pps = ppsUnits[0];\n const ppsBitstream = new Bitstream(removeEmulationPreventionBytes(pps));\n ppsBitstream.skipBits(16); // NAL header\n readExpGolomb(ppsBitstream); // pps_pic_parameter_set_id\n readExpGolomb(ppsBitstream); // pps_seq_parameter_set_id\n ppsBitstream.skipBits(1); // dependent_slice_segments_enabled_flag\n ppsBitstream.skipBits(1); // output_flag_present_flag\n ppsBitstream.skipBits(3); // num_extra_slice_header_bits\n ppsBitstream.skipBits(1); // sign_data_hiding_enabled_flag\n ppsBitstream.skipBits(1); // cabac_init_present_flag\n readExpGolomb(ppsBitstream); // num_ref_idx_l0_default_active_minus1\n readExpGolomb(ppsBitstream); // num_ref_idx_l1_default_active_minus1\n readSignedExpGolomb(ppsBitstream); // init_qp_minus26\n ppsBitstream.skipBits(1); // constrained_intra_pred_flag\n ppsBitstream.skipBits(1); // transform_skip_enabled_flag\n if (ppsBitstream.readBits(1)) { // cu_qp_delta_enabled_flag\n readExpGolomb(ppsBitstream); // diff_cu_qp_delta_depth\n }\n readSignedExpGolomb(ppsBitstream); // pps_cb_qp_offset\n readSignedExpGolomb(ppsBitstream); // pps_cr_qp_offset\n ppsBitstream.skipBits(1); // pps_slice_chroma_qp_offsets_present_flag\n ppsBitstream.skipBits(1); // weighted_pred_flag\n ppsBitstream.skipBits(1); // weighted_bipred_flag\n ppsBitstream.skipBits(1); // transquant_bypass_enabled_flag\n const tiles_enabled_flag = ppsBitstream.readBits(1);\n const entropy_coding_sync_enabled_flag = ppsBitstream.readBits(1);\n if (!tiles_enabled_flag && !entropy_coding_sync_enabled_flag)\n parallelismType = 0;\n else if (tiles_enabled_flag && !entropy_coding_sync_enabled_flag)\n parallelismType = 2;\n else if (!tiles_enabled_flag && entropy_coding_sync_enabled_flag)\n parallelismType = 3;\n else\n parallelismType = 0;\n }\n const arrays = [\n ...(vpsUnits.length\n ? [\n {\n arrayCompleteness: 1,\n nalUnitType: NALU_TYPE_VPS,\n nalUnits: vpsUnits,\n },\n ]\n : []),\n ...(spsUnits.length\n ? [\n {\n arrayCompleteness: 1,\n nalUnitType: NALU_TYPE_SPS,\n nalUnits: spsUnits,\n },\n ]\n : []),\n ...(ppsUnits.length\n ? [\n {\n arrayCompleteness: 1,\n nalUnitType: NALU_TYPE_PPS,\n nalUnits: ppsUnits,\n },\n ]\n : []),\n ...(seiUnits.length\n ? [\n {\n arrayCompleteness: 1,\n nalUnitType: extractNalUnitTypeForHevc(seiUnits[0]),\n nalUnits: seiUnits,\n },\n ]\n : []),\n ];\n const record = {\n configurationVersion: 1,\n generalProfileSpace: general_profile_space,\n generalTierFlag: general_tier_flag,\n generalProfileIdc: general_profile_idc,\n generalProfileCompatibilityFlags: general_profile_compatibility_flags,\n generalConstraintIndicatorFlags: general_constraint_indicator_flags,\n generalLevelIdc: general_level_idc,\n minSpatialSegmentationIdc: min_spatial_segmentation_idc,\n parallelismType,\n chromaFormatIdc: chroma_format_idc,\n bitDepthLumaMinus8: bit_depth_luma_minus8,\n bitDepthChromaMinus8: bit_depth_chroma_minus8,\n avgFrameRate: 0,\n constantFrameRate: 0,\n numTemporalLayers: sps_max_sub_layers_minus1 + 1,\n temporalIdNested: sps_temporal_id_nesting_flag,\n lengthSizeMinusOne: 3,\n arrays,\n };\n return record;\n }\n catch (error) {\n console.error('Error building HEVC Decoder Configuration Record:', error);\n return null;\n }\n};\nconst parseProfileTierLevel = (bitstream, maxNumSubLayersMinus1) => {\n const general_profile_space = bitstream.readBits(2);\n const general_tier_flag = bitstream.readBits(1);\n const general_profile_idc = bitstream.readBits(5);\n let general_profile_compatibility_flags = 0;\n for (let i = 0; i < 32; i++) {\n general_profile_compatibility_flags = (general_profile_compatibility_flags << 1) | bitstream.readBits(1);\n }\n const general_constraint_indicator_flags = new Uint8Array(6);\n for (let i = 0; i < 6; i++) {\n general_constraint_indicator_flags[i] = bitstream.readBits(8);\n }\n const general_level_idc = bitstream.readBits(8);\n const sub_layer_profile_present_flag = [];\n const sub_layer_level_present_flag = [];\n for (let i = 0; i < maxNumSubLayersMinus1; i++) {\n sub_layer_profile_present_flag.push(bitstream.readBits(1));\n sub_layer_level_present_flag.push(bitstream.readBits(1));\n }\n if (maxNumSubLayersMinus1 > 0) {\n for (let i = maxNumSubLayersMinus1; i < 8; i++) {\n bitstream.skipBits(2); // reserved_zero_2bits\n }\n }\n for (let i = 0; i < maxNumSubLayersMinus1; i++) {\n if (sub_layer_profile_present_flag[i])\n bitstream.skipBits(88);\n if (sub_layer_level_present_flag[i])\n bitstream.skipBits(8);\n }\n return {\n general_profile_space,\n general_tier_flag,\n general_profile_idc,\n general_profile_compatibility_flags,\n general_constraint_indicator_flags,\n general_level_idc,\n };\n};\nconst skipScalingListData = (bitstream) => {\n for (let sizeId = 0; sizeId < 4; sizeId++) {\n for (let matrixId = 0; matrixId < (sizeId === 3 ? 2 : 6); matrixId++) {\n const scaling_list_pred_mode_flag = bitstream.readBits(1);\n if (!scaling_list_pred_mode_flag) {\n readExpGolomb(bitstream); // scaling_list_pred_matrix_id_delta\n }\n else {\n const coefNum = Math.min(64, 1 << (4 + (sizeId << 1)));\n if (sizeId > 1) {\n readSignedExpGolomb(bitstream); // scaling_list_dc_coef_minus8\n }\n for (let i = 0; i < coefNum; i++) {\n readSignedExpGolomb(bitstream); // scaling_list_delta_coef\n }\n }\n }\n }\n};\nconst skipAllStRefPicSets = (bitstream, num_short_term_ref_pic_sets) => {\n const NumDeltaPocs = [];\n for (let stRpsIdx = 0; stRpsIdx < num_short_term_ref_pic_sets; stRpsIdx++) {\n NumDeltaPocs[stRpsIdx] = skipStRefPicSet(bitstream, stRpsIdx, num_short_term_ref_pic_sets, NumDeltaPocs);\n }\n};\nconst skipStRefPicSet = (bitstream, stRpsIdx, num_short_term_ref_pic_sets, NumDeltaPocs) => {\n let NumDeltaPocsThis = 0;\n let inter_ref_pic_set_prediction_flag = 0;\n let RefRpsIdx = 0;\n if (stRpsIdx !== 0) {\n inter_ref_pic_set_prediction_flag = bitstream.readBits(1);\n }\n if (inter_ref_pic_set_prediction_flag) {\n if (stRpsIdx === num_short_term_ref_pic_sets) {\n const delta_idx_minus1 = readExpGolomb(bitstream);\n RefRpsIdx = stRpsIdx - (delta_idx_minus1 + 1);\n }\n else {\n RefRpsIdx = stRpsIdx - 1;\n }\n bitstream.readBits(1); // delta_rps_sign\n readExpGolomb(bitstream); // abs_delta_rps_minus1\n // The number of iterations is NumDeltaPocs[RefRpsIdx] + 1\n const numDelta = NumDeltaPocs[RefRpsIdx] ?? 0;\n for (let j = 0; j <= numDelta; j++) {\n const used_by_curr_pic_flag = bitstream.readBits(1);\n if (!used_by_curr_pic_flag) {\n bitstream.readBits(1); // use_delta_flag\n }\n }\n NumDeltaPocsThis = NumDeltaPocs[RefRpsIdx];\n }\n else {\n const num_negative_pics = readExpGolomb(bitstream);\n const num_positive_pics = readExpGolomb(bitstream);\n for (let i = 0; i < num_negative_pics; i++) {\n readExpGolomb(bitstream); // delta_poc_s0_minus1[i]\n bitstream.readBits(1); // used_by_curr_pic_s0_flag[i]\n }\n for (let i = 0; i < num_positive_pics; i++) {\n readExpGolomb(bitstream); // delta_poc_s1_minus1[i]\n bitstream.readBits(1); // used_by_curr_pic_s1_flag[i]\n }\n NumDeltaPocsThis = num_negative_pics + num_positive_pics;\n }\n return NumDeltaPocsThis;\n};\nconst parseVuiForMinSpatialSegmentationIdc = (bitstream, sps_max_sub_layers_minus1) => {\n if (bitstream.readBits(1)) { // aspect_ratio_info_present_flag\n const aspect_ratio_idc = bitstream.readBits(8);\n if (aspect_ratio_idc === 255) {\n bitstream.readBits(16); // sar_width\n bitstream.readBits(16); // sar_height\n }\n }\n if (bitstream.readBits(1)) { // overscan_info_present_flag\n bitstream.readBits(1); // overscan_appropriate_flag\n }\n if (bitstream.readBits(1)) { // video_signal_type_present_flag\n bitstream.readBits(3); // video_format\n bitstream.readBits(1); // video_full_range_flag\n if (bitstream.readBits(1)) {\n bitstream.readBits(8); // colour_primaries\n bitstream.readBits(8); // transfer_characteristics\n bitstream.readBits(8); // matrix_coeffs\n }\n }\n if (bitstream.readBits(1)) { // chroma_loc_info_present_flag\n readExpGolomb(bitstream); // chroma_sample_loc_type_top_field\n readExpGolomb(bitstream); // chroma_sample_loc_type_bottom_field\n }\n bitstream.readBits(1); // neutral_chroma_indication_flag\n bitstream.readBits(1); // field_seq_flag\n bitstream.readBits(1); // frame_field_info_present_flag\n if (bitstream.readBits(1)) { // default_display_window_flag\n readExpGolomb(bitstream); // def_disp_win_left_offset\n readExpGolomb(bitstream); // def_disp_win_right_offset\n readExpGolomb(bitstream); // def_disp_win_top_offset\n readExpGolomb(bitstream); // def_disp_win_bottom_offset\n }\n if (bitstream.readBits(1)) { // vui_timing_info_present_flag\n bitstream.readBits(32); // vui_num_units_in_tick\n bitstream.readBits(32); // vui_time_scale\n if (bitstream.readBits(1)) { // vui_poc_proportional_to_timing_flag\n readExpGolomb(bitstream); // vui_num_ticks_poc_diff_one_minus1\n }\n if (bitstream.readBits(1)) {\n skipHrdParameters(bitstream, true, sps_max_sub_layers_minus1);\n }\n }\n if (bitstream.readBits(1)) { // bitstream_restriction_flag\n bitstream.readBits(1); // tiles_fixed_structure_flag\n bitstream.readBits(1); // motion_vectors_over_pic_boundaries_flag\n bitstream.readBits(1); // restricted_ref_pic_lists_flag\n const min_spatial_segmentation_idc = readExpGolomb(bitstream);\n // skip the rest\n readExpGolomb(bitstream); // max_bytes_per_pic_denom\n readExpGolomb(bitstream); // max_bits_per_min_cu_denom\n readExpGolomb(bitstream); // log2_max_mv_length_horizontal\n readExpGolomb(bitstream); // log2_max_mv_length_vertical\n return min_spatial_segmentation_idc;\n }\n return 0;\n};\nconst skipHrdParameters = (bitstream, commonInfPresentFlag, maxNumSubLayersMinus1) => {\n let nal_hrd_parameters_present_flag = false;\n let vcl_hrd_parameters_present_flag = false;\n let sub_pic_hrd_params_present_flag = false;\n if (commonInfPresentFlag) {\n nal_hrd_parameters_present_flag = bitstream.readBits(1) === 1;\n vcl_hrd_parameters_present_flag = bitstream.readBits(1) === 1;\n if (nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag) {\n sub_pic_hrd_params_present_flag = bitstream.readBits(1) === 1;\n if (sub_pic_hrd_params_present_flag) {\n bitstream.readBits(8); // tick_divisor_minus2\n bitstream.readBits(5); // du_cpb_removal_delay_increment_length_minus1\n bitstream.readBits(1); // sub_pic_cpb_params_in_pic_timing_sei_flag\n bitstream.readBits(5); // dpb_output_delay_du_length_minus1\n }\n bitstream.readBits(4); // bit_rate_scale\n bitstream.readBits(4); // cpb_size_scale\n if (sub_pic_hrd_params_present_flag) {\n bitstream.readBits(4); // cpb_size_du_scale\n }\n bitstream.readBits(5); // initial_cpb_removal_delay_length_minus1\n bitstream.readBits(5); // au_cpb_removal_delay_length_minus1\n bitstream.readBits(5); // dpb_output_delay_length_minus1\n }\n }\n for (let i = 0; i <= maxNumSubLayersMinus1; i++) {\n const fixed_pic_rate_general_flag = bitstream.readBits(1) === 1;\n let fixed_pic_rate_within_cvs_flag = true; // Default assumption if general is true\n if (!fixed_pic_rate_general_flag) {\n fixed_pic_rate_within_cvs_flag = bitstream.readBits(1) === 1;\n }\n let low_delay_hrd_flag = false; // Default assumption\n if (fixed_pic_rate_within_cvs_flag) {\n readExpGolomb(bitstream); // elemental_duration_in_tc_minus1[i]\n }\n else {\n low_delay_hrd_flag = bitstream.readBits(1) === 1;\n }\n let CpbCnt = 1; // Default if low_delay is true\n if (!low_delay_hrd_flag) {\n const cpb_cnt_minus1 = readExpGolomb(bitstream); // cpb_cnt_minus1[i]\n CpbCnt = cpb_cnt_minus1 + 1;\n }\n if (nal_hrd_parameters_present_flag) {\n skipSubLayerHrdParameters(bitstream, CpbCnt, sub_pic_hrd_params_present_flag);\n }\n if (vcl_hrd_parameters_present_flag) {\n skipSubLayerHrdParameters(bitstream, CpbCnt, sub_pic_hrd_params_present_flag);\n }\n }\n};\nconst skipSubLayerHrdParameters = (bitstream, CpbCnt, sub_pic_hrd_params_present_flag) => {\n for (let i = 0; i < CpbCnt; i++) {\n readExpGolomb(bitstream); // bit_rate_value_minus1[i]\n readExpGolomb(bitstream); // cpb_size_value_minus1[i]\n if (sub_pic_hrd_params_present_flag) {\n readExpGolomb(bitstream); // cpb_size_du_value_minus1[i]\n readExpGolomb(bitstream); // bit_rate_du_value_minus1[i]\n }\n bitstream.readBits(1); // cbr_flag[i]\n }\n};\n/** Serializes an HevcDecoderConfigurationRecord into the format specified in Section 8.3.3.1 of ISO 14496-15. */\nexport const serializeHevcDecoderConfigurationRecord = (record) => {\n const bytes = [];\n bytes.push(record.configurationVersion);\n bytes.push(((record.generalProfileSpace & 0x3) << 6)\n | ((record.generalTierFlag & 0x1) << 5)\n | (record.generalProfileIdc & 0x1F));\n bytes.push((record.generalProfileCompatibilityFlags >>> 24) & 0xFF);\n bytes.push((record.generalProfileCompatibilityFlags >>> 16) & 0xFF);\n bytes.push((record.generalProfileCompatibilityFlags >>> 8) & 0xFF);\n bytes.push(record.generalProfileCompatibilityFlags & 0xFF);\n bytes.push(...record.generalConstraintIndicatorFlags);\n bytes.push(record.generalLevelIdc & 0xFF);\n bytes.push(0xF0 | ((record.minSpatialSegmentationIdc >> 8) & 0x0F)); // Reserved + high nibble\n bytes.push(record.minSpatialSegmentationIdc & 0xFF); // Low byte\n bytes.push(0xFC | (record.parallelismType & 0x03));\n bytes.push(0xFC | (record.chromaFormatIdc & 0x03));\n bytes.push(0xF8 | (record.bitDepthLumaMinus8 & 0x07));\n bytes.push(0xF8 | (record.bitDepthChromaMinus8 & 0x07));\n bytes.push((record.avgFrameRate >> 8) & 0xFF); // High byte\n bytes.push(record.avgFrameRate & 0xFF); // Low byte\n bytes.push(((record.constantFrameRate & 0x03) << 6)\n | ((record.numTemporalLayers & 0x07) << 3)\n | ((record.temporalIdNested & 0x01) << 2)\n | (record.lengthSizeMinusOne & 0x03));\n bytes.push(record.arrays.length & 0xFF);\n for (const arr of record.arrays) {\n bytes.push(((arr.arrayCompleteness & 0x01) << 7)\n | (0 << 6)\n | (arr.nalUnitType & 0x3F));\n bytes.push((arr.nalUnits.length >> 8) & 0xFF); // High byte\n bytes.push(arr.nalUnits.length & 0xFF); // Low byte\n for (const nal of arr.nalUnits) {\n bytes.push((nal.length >> 8) & 0xFF); // High byte\n bytes.push(nal.length & 0xFF); // Low byte\n for (let i = 0; i < nal.length; i++) {\n bytes.push(nal[i]);\n }\n }\n }\n return new Uint8Array(bytes);\n};\nexport const extractVp9CodecInfoFromPacket = (packet) => {\n // eslint-disable-next-line @stylistic/max-len\n // https://storage.googleapis.com/downloads.webmproject.org/docs/vp9/vp9-bitstream-specification-v0.7-20170222-draft.pdf\n // http://downloads.webmproject.org/docs/vp9/vp9-bitstream_superframe-and-uncompressed-header_v1.0.pdf\n // Handle superframe\n const lastByte = packet[packet.length - 1];\n if (lastByte && (lastByte & 0xe0) === 0xc0) { // Is superframe\n const bytesPerFrameSize = ((lastByte & 0x18) >> 3) + 1;\n const numFrames = (lastByte & 0x07) + 1;\n const indexSize = 2 + numFrames * bytesPerFrameSize;\n // Verify matching marker bytes\n if (packet[packet.length - indexSize] !== lastByte) {\n return null;\n }\n // Get first frame size\n let frameSize = 0;\n const offset = packet.length - indexSize + 1;\n for (let i = 0; i < bytesPerFrameSize; i++) {\n if (!packet[offset + i])\n return null;\n frameSize |= packet[offset + i] << (8 * i);\n }\n packet = packet.subarray(0, frameSize);\n }\n const bitstream = new Bitstream(packet);\n // Frame marker (0b10)\n const frameMarker = bitstream.readBits(2);\n if (frameMarker !== 2) {\n return null;\n }\n // Profile\n const profileLowBit = bitstream.readBits(1);\n const profileHighBit = bitstream.readBits(1);\n const profile = (profileHighBit << 1) + profileLowBit;\n // Skip reserved bit for profile 3\n if (profile === 3) {\n bitstream.skipBits(1);\n }\n // show_existing_frame\n const showExistingFrame = bitstream.readBits(1);\n if (showExistingFrame === 1) {\n return null;\n }\n // frame_type (0 = key frame)\n const frameType = bitstream.readBits(1);\n if (frameType !== 0) {\n return null;\n }\n // Skip show_frame and error_resilient_mode\n bitstream.skipBits(2);\n // Sync code (0x498342)\n const syncCode = bitstream.readBits(24);\n if (syncCode !== 0x498342) {\n return null;\n }\n // Color config\n let bitDepth = 8;\n if (profile >= 2) {\n const tenOrTwelveBit = bitstream.readBits(1);\n bitDepth = tenOrTwelveBit ? 12 : 10;\n }\n // Color space\n const colorSpace = bitstream.readBits(3);\n let chromaSubsampling = 0;\n let videoFullRangeFlag = 0;\n if (colorSpace !== 7) { // 7 is CS_RGB\n const colorRange = bitstream.readBits(1);\n videoFullRangeFlag = colorRange;\n if (profile === 1 || profile === 3) {\n const subsamplingX = bitstream.readBits(1);\n const subsamplingY = bitstream.readBits(1);\n // 0 = 4:2:0 vertical\n // 1 = 4:2:0 colocated\n // 2 = 4:2:2\n // 3 = 4:4:4\n chromaSubsampling = !subsamplingX && !subsamplingY\n ? 3 // 0,0 = 4:4:4\n : subsamplingX && !subsamplingY\n ? 2 // 1,0 = 4:2:2\n : 1; // 1,1 = 4:2:0 colocated (default)\n // Skip reserved bit\n bitstream.skipBits(1);\n }\n else {\n // For profile 0 and 2, always 4:2:0\n chromaSubsampling = 1; // Using colocated as default\n }\n }\n else {\n // RGB is always 4:4:4\n chromaSubsampling = 3;\n videoFullRangeFlag = 1;\n }\n // Parse frame size\n const widthMinusOne = bitstream.readBits(16);\n const heightMinusOne = bitstream.readBits(16);\n const width = widthMinusOne + 1;\n const height = heightMinusOne + 1;\n // Calculate level based on dimensions\n const pictureSize = width * height;\n let level = last(VP9_LEVEL_TABLE).level; // Default to highest level\n for (const entry of VP9_LEVEL_TABLE) {\n if (pictureSize <= entry.maxPictureSize) {\n level = entry.level;\n break;\n }\n }\n // Map color_space to standard values\n const matrixCoefficients = colorSpace === 7\n ? 0\n : colorSpace === 2\n ? 1\n : colorSpace === 1\n ? 6\n : 2;\n const colourPrimaries = colorSpace === 2\n ? 1\n : colorSpace === 1\n ? 6\n : 2;\n const transferCharacteristics = colorSpace === 2\n ? 1\n : colorSpace === 1\n ? 6\n : 2;\n return {\n profile,\n level,\n bitDepth,\n chromaSubsampling,\n videoFullRangeFlag,\n colourPrimaries,\n transferCharacteristics,\n matrixCoefficients,\n };\n};\n/**\n * When AV1 codec information is not provided by the container, we can still try to extract the information by digging\n * into the AV1 bitstream.\n */\nexport const extractAv1CodecInfoFromPacket = (packet) => {\n // https://aomediacodec.github.io/av1-spec/av1-spec.pdf\n const bitstream = new Bitstream(packet);\n const readLeb128 = () => {\n let value = 0;\n for (let i = 0; i < 8; i++) {\n const byte = bitstream.readAlignedByte();\n if (byte === undefined)\n return 0;\n value |= ((byte & 0x7f) << (i * 7));\n if (!(byte & 0x80)) {\n break;\n }\n // Spec requirement\n if (i === 7 && (byte & 0x80)) {\n return null;\n }\n }\n // Spec requirement\n if (value >= 2 ** 32 - 1) {\n return null;\n }\n return value;\n };\n while (bitstream.getBitsLeft() >= 8) {\n // Parse OBU header\n const obuHeader = bitstream.readBits(8);\n const obuType = (obuHeader >> 3) & 0xf;\n const obuExtension = (obuHeader >> 2) & 0x1;\n const obuHasSizeField = (obuHeader >> 1) & 0x1;\n // Skip extension header if present\n if (obuExtension) {\n bitstream.skipBits(8);\n }\n // Read OBU size if present\n let obuSize;\n if (obuHasSizeField) {\n const obuSizeValue = readLeb128();\n if (obuSizeValue === null)\n return null; // It was invalid\n obuSize = obuSizeValue;\n }\n else {\n // Calculate remaining bits and convert to bytes, rounding down\n obuSize = Math.floor(bitstream.getBitsLeft() / 8);\n }\n // We're only interested in Sequence Header OBU (type 1)\n if (obuType === 1) {\n // Read sequence header fields\n const seqProfile = bitstream.readBits(3);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const stillPicture = bitstream.readBits(1);\n const reducedStillPictureHeader = bitstream.readBits(1);\n let seqLevel = 0;\n let seqTier = 0;\n let bufferDelayLengthMinus1 = 0;\n if (reducedStillPictureHeader) {\n seqLevel = bitstream.readBits(5);\n }\n else {\n // Parse timing_info_present_flag\n const timingInfoPresentFlag = bitstream.readBits(1);\n if (timingInfoPresentFlag) {\n // Skip timing info (num_units_in_display_tick, time_scale, equal_picture_interval)\n bitstream.skipBits(32); // num_units_in_display_tick\n bitstream.skipBits(32); // time_scale\n const equalPictureInterval = bitstream.readBits(1);\n if (equalPictureInterval) {\n // Skip num_ticks_per_picture_minus_1 (uvlc)\n // Since this is variable length, we'd need to implement uvlc reading\n // For now, we'll return null as this is rare\n return null;\n }\n }\n // Parse decoder_model_info_present_flag\n const decoderModelInfoPresentFlag = bitstream.readBits(1);\n if (decoderModelInfoPresentFlag) {\n // Store buffer_delay_length_minus_1 instead of just skipping\n bufferDelayLengthMinus1 = bitstream.readBits(5);\n bitstream.skipBits(32); // num_units_in_decoding_tick\n bitstream.skipBits(5); // buffer_removal_time_length_minus_1\n bitstream.skipBits(5); // frame_presentation_time_length_minus_1\n }\n // Parse operating_points_cnt_minus_1\n const operatingPointsCntMinus1 = bitstream.readBits(5);\n // For each operating point\n for (let i = 0; i <= operatingPointsCntMinus1; i++) {\n // operating_point_idc[i]\n bitstream.skipBits(12);\n // seq_level_idx[i]\n const seqLevelIdx = bitstream.readBits(5);\n if (i === 0) {\n seqLevel = seqLevelIdx;\n }\n if (seqLevelIdx > 7) {\n // seq_tier[i]\n const seqTierTemp = bitstream.readBits(1);\n if (i === 0) {\n seqTier = seqTierTemp;\n }\n }\n if (decoderModelInfoPresentFlag) {\n // decoder_model_present_for_this_op[i]\n const decoderModelPresentForThisOp = bitstream.readBits(1);\n if (decoderModelPresentForThisOp) {\n const n = bufferDelayLengthMinus1 + 1;\n bitstream.skipBits(n); // decoder_buffer_delay[op]\n bitstream.skipBits(n); // encoder_buffer_delay[op]\n bitstream.skipBits(1); // low_delay_mode_flag[op]\n }\n }\n // initial_display_delay_present_flag\n const initialDisplayDelayPresentFlag = bitstream.readBits(1);\n if (initialDisplayDelayPresentFlag) {\n // initial_display_delay_minus_1[i]\n bitstream.skipBits(4);\n }\n }\n }\n const highBitdepth = bitstream.readBits(1);\n let bitDepth = 8;\n if (seqProfile === 2 && highBitdepth) {\n const twelveBit = bitstream.readBits(1);\n bitDepth = twelveBit ? 12 : 10;\n }\n else if (seqProfile <= 2) {\n bitDepth = highBitdepth ? 10 : 8;\n }\n let monochrome = 0;\n if (seqProfile !== 1) {\n monochrome = bitstream.readBits(1);\n }\n let chromaSubsamplingX = 1;\n let chromaSubsamplingY = 1;\n let chromaSamplePosition = 0;\n if (!monochrome) {\n if (seqProfile === 0) {\n chromaSubsamplingX = 1;\n chromaSubsamplingY = 1;\n }\n else if (seqProfile === 1) {\n chromaSubsamplingX = 0;\n chromaSubsamplingY = 0;\n }\n else {\n if (bitDepth === 12) {\n chromaSubsamplingX = bitstream.readBits(1);\n if (chromaSubsamplingX) {\n chromaSubsamplingY = bitstream.readBits(1);\n }\n }\n }\n if (chromaSubsamplingX && chromaSubsamplingY) {\n chromaSamplePosition = bitstream.readBits(2);\n }\n }\n return {\n profile: seqProfile,\n level: seqLevel,\n tier: seqTier,\n bitDepth,\n monochrome,\n chromaSubsamplingX,\n chromaSubsamplingY,\n chromaSamplePosition,\n };\n }\n // Move to next OBU\n // The OBU size is in bytes, so skip that many bytes.\n bitstream.skipBits(obuSize * 8);\n }\n return null;\n};\nexport const parseOpusIdentificationHeader = (bytes) => {\n const view = toDataView(bytes);\n const outputChannelCount = view.getUint8(9);\n const preSkip = view.getUint16(10, true);\n const inputSampleRate = view.getUint32(12, true);\n const outputGain = view.getInt16(16, true);\n const channelMappingFamily = view.getUint8(18);\n let channelMappingTable = null;\n if (channelMappingFamily) {\n channelMappingTable = bytes.subarray(19, 19 + 2 + outputChannelCount);\n }\n return {\n outputChannelCount,\n preSkip,\n inputSampleRate,\n outputGain,\n channelMappingFamily,\n channelMappingTable,\n };\n};\n// From https://datatracker.ietf.org/doc/html/rfc6716, in 48 kHz samples\nconst OPUS_FRAME_DURATION_TABLE = [\n 480, 960, 1920, 2880,\n 480, 960, 1920, 2880,\n 480, 960, 1920, 2880,\n 480, 960,\n 480, 960,\n 120, 240, 480, 960,\n 120, 240, 480, 960,\n 120, 240, 480, 960,\n 120, 240, 480, 960,\n];\nexport const parseOpusTocByte = (packet) => {\n const config = packet[0] >> 3;\n return {\n durationInSamples: OPUS_FRAME_DURATION_TABLE[config],\n };\n};\n// Based on vorbis_parser.c from FFmpeg.\nexport const parseModesFromVorbisSetupPacket = (setupHeader) => {\n // Verify that this is a Setup header.\n if (setupHeader.length < 7) {\n throw new Error('Setup header is too short.');\n }\n if (setupHeader[0] !== 5) {\n throw new Error('Wrong packet type in Setup header.');\n }\n const signature = String.fromCharCode(...setupHeader.slice(1, 7));\n if (signature !== 'vorbis') {\n throw new Error('Invalid packet signature in Setup header.');\n }\n // Reverse the entire buffer.\n const bufSize = setupHeader.length;\n const revBuffer = new Uint8Array(bufSize);\n for (let i = 0; i < bufSize; i++) {\n revBuffer[i] = setupHeader[bufSize - 1 - i];\n }\n // Initialize a Bitstream on the reversed buffer.\n const bitstream = new Bitstream(revBuffer);\n // --- Find the framing bit.\n // In FFmpeg code, we scan until get_bits1() returns 1.\n let gotFramingBit = 0;\n while (bitstream.getBitsLeft() > 97) {\n if (bitstream.readBits(1) === 1) {\n gotFramingBit = bitstream.pos;\n break;\n }\n }\n if (gotFramingBit === 0) {\n throw new Error('Invalid Setup header: framing bit not found.');\n }\n // --- Search backwards for a valid mode header.\n // We try to \u201Cguess\u201D the number of modes by reading a fixed pattern.\n let modeCount = 0;\n let gotModeHeader = false;\n let lastModeCount = 0;\n while (bitstream.getBitsLeft() >= 97) {\n const tempPos = bitstream.pos;\n const a = bitstream.readBits(8);\n const b = bitstream.readBits(16);\n const c = bitstream.readBits(16);\n // If a > 63 or b or c nonzero, assume we\u2019ve gone too far.\n if (a > 63 || b !== 0 || c !== 0) {\n bitstream.pos = tempPos;\n break;\n }\n bitstream.skipBits(1);\n modeCount++;\n if (modeCount > 64) {\n break;\n }\n const bsClone = bitstream.clone();\n const candidate = bsClone.readBits(6) + 1;\n if (candidate === modeCount) {\n gotModeHeader = true;\n lastModeCount = modeCount;\n }\n }\n if (!gotModeHeader) {\n throw new Error('Invalid Setup header: mode header not found.');\n }\n if (lastModeCount > 63) {\n throw new Error(`Unsupported mode count: ${lastModeCount}.`);\n }\n const finalModeCount = lastModeCount;\n // --- Reinitialize the bitstream.\n bitstream.pos = 0;\n // Skip the bits up to the found framing bit.\n bitstream.skipBits(gotFramingBit);\n // --- Now read, for each mode (in reverse order), 40 bits then one bit.\n // That one bit is the mode blockflag.\n const modeBlockflags = Array(finalModeCount).fill(0);\n for (let i = finalModeCount - 1; i >= 0; i--) {\n bitstream.skipBits(40);\n modeBlockflags[i] = bitstream.readBits(1);\n }\n return { modeBlockflags };\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nexport const buildIsobmffMimeType = (info) => {\n const base = info.hasVideo\n ? 'video/'\n : info.hasAudio\n ? 'audio/'\n : 'application/';\n let string = base + (info.isQuickTime ? 'quicktime' : 'mp4');\n if (info.codecStrings.length > 0) {\n const uniqueCodecMimeTypes = [...new Set(info.codecStrings)];\n string += `; codecs=\"${uniqueCodecMimeTypes.join(', ')}\"`;\n }\n return string;\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n/** Wrapper around a number to be able to differentiate it in the writer. */\nexport class EBMLFloat32 {\n constructor(value) {\n this.value = value;\n }\n}\n/** Wrapper around a number to be able to differentiate it in the writer. */\nexport class EBMLFloat64 {\n constructor(value) {\n this.value = value;\n }\n}\n/** Wrapper around a number to be able to differentiate it in the writer. */\nexport class EBMLSignedInt {\n constructor(value) {\n this.value = value;\n }\n}\n/** Defines some of the EBML IDs used by Matroska files. */\nexport var EBMLId;\n(function (EBMLId) {\n EBMLId[EBMLId[\"EBML\"] = 440786851] = \"EBML\";\n EBMLId[EBMLId[\"EBMLVersion\"] = 17030] = \"EBMLVersion\";\n EBMLId[EBMLId[\"EBMLReadVersion\"] = 17143] = \"EBMLReadVersion\";\n EBMLId[EBMLId[\"EBMLMaxIDLength\"] = 17138] = \"EBMLMaxIDLength\";\n EBMLId[EBMLId[\"EBMLMaxSizeLength\"] = 17139] = \"EBMLMaxSizeLength\";\n EBMLId[EBMLId[\"DocType\"] = 17026] = \"DocType\";\n EBMLId[EBMLId[\"DocTypeVersion\"] = 17031] = \"DocTypeVersion\";\n EBMLId[EBMLId[\"DocTypeReadVersion\"] = 17029] = \"DocTypeReadVersion\";\n EBMLId[EBMLId[\"SeekHead\"] = 290298740] = \"SeekHead\";\n EBMLId[EBMLId[\"Seek\"] = 19899] = \"Seek\";\n EBMLId[EBMLId[\"SeekID\"] = 21419] = \"SeekID\";\n EBMLId[EBMLId[\"SeekPosition\"] = 21420] = \"SeekPosition\";\n EBMLId[EBMLId[\"Duration\"] = 17545] = \"Duration\";\n EBMLId[EBMLId[\"Info\"] = 357149030] = \"Info\";\n EBMLId[EBMLId[\"TimestampScale\"] = 2807729] = \"TimestampScale\";\n EBMLId[EBMLId[\"MuxingApp\"] = 19840] = \"MuxingApp\";\n EBMLId[EBMLId[\"WritingApp\"] = 22337] = \"WritingApp\";\n EBMLId[EBMLId[\"Tracks\"] = 374648427] = \"Tracks\";\n EBMLId[EBMLId[\"TrackEntry\"] = 174] = \"TrackEntry\";\n EBMLId[EBMLId[\"TrackNumber\"] = 215] = \"TrackNumber\";\n EBMLId[EBMLId[\"TrackUID\"] = 29637] = \"TrackUID\";\n EBMLId[EBMLId[\"TrackType\"] = 131] = \"TrackType\";\n EBMLId[EBMLId[\"FlagEnabled\"] = 185] = \"FlagEnabled\";\n EBMLId[EBMLId[\"FlagDefault\"] = 136] = \"FlagDefault\";\n EBMLId[EBMLId[\"FlagForced\"] = 21930] = \"FlagForced\";\n EBMLId[EBMLId[\"FlagLacing\"] = 156] = \"FlagLacing\";\n EBMLId[EBMLId[\"Language\"] = 2274716] = \"Language\";\n EBMLId[EBMLId[\"CodecID\"] = 134] = \"CodecID\";\n EBMLId[EBMLId[\"CodecPrivate\"] = 25506] = \"CodecPrivate\";\n EBMLId[EBMLId[\"CodecDelay\"] = 22186] = \"CodecDelay\";\n EBMLId[EBMLId[\"SeekPreRoll\"] = 22203] = \"SeekPreRoll\";\n EBMLId[EBMLId[\"DefaultDuration\"] = 2352003] = \"DefaultDuration\";\n EBMLId[EBMLId[\"Video\"] = 224] = \"Video\";\n EBMLId[EBMLId[\"PixelWidth\"] = 176] = \"PixelWidth\";\n EBMLId[EBMLId[\"PixelHeight\"] = 186] = \"PixelHeight\";\n EBMLId[EBMLId[\"Audio\"] = 225] = \"Audio\";\n EBMLId[EBMLId[\"SamplingFrequency\"] = 181] = \"SamplingFrequency\";\n EBMLId[EBMLId[\"Channels\"] = 159] = \"Channels\";\n EBMLId[EBMLId[\"BitDepth\"] = 25188] = \"BitDepth\";\n EBMLId[EBMLId[\"Segment\"] = 408125543] = \"Segment\";\n EBMLId[EBMLId[\"SimpleBlock\"] = 163] = \"SimpleBlock\";\n EBMLId[EBMLId[\"BlockGroup\"] = 160] = \"BlockGroup\";\n EBMLId[EBMLId[\"Block\"] = 161] = \"Block\";\n EBMLId[EBMLId[\"BlockAdditions\"] = 30113] = \"BlockAdditions\";\n EBMLId[EBMLId[\"BlockMore\"] = 166] = \"BlockMore\";\n EBMLId[EBMLId[\"BlockAdditional\"] = 165] = \"BlockAdditional\";\n EBMLId[EBMLId[\"BlockAddID\"] = 238] = \"BlockAddID\";\n EBMLId[EBMLId[\"BlockDuration\"] = 155] = \"BlockDuration\";\n EBMLId[EBMLId[\"ReferenceBlock\"] = 251] = \"ReferenceBlock\";\n EBMLId[EBMLId[\"Cluster\"] = 524531317] = \"Cluster\";\n EBMLId[EBMLId[\"Timestamp\"] = 231] = \"Timestamp\";\n EBMLId[EBMLId[\"Cues\"] = 475249515] = \"Cues\";\n EBMLId[EBMLId[\"CuePoint\"] = 187] = \"CuePoint\";\n EBMLId[EBMLId[\"CueTime\"] = 179] = \"CueTime\";\n EBMLId[EBMLId[\"CueTrackPositions\"] = 183] = \"CueTrackPositions\";\n EBMLId[EBMLId[\"CueTrack\"] = 247] = \"CueTrack\";\n EBMLId[EBMLId[\"CueClusterPosition\"] = 241] = \"CueClusterPosition\";\n EBMLId[EBMLId[\"Colour\"] = 21936] = \"Colour\";\n EBMLId[EBMLId[\"MatrixCoefficients\"] = 21937] = \"MatrixCoefficients\";\n EBMLId[EBMLId[\"TransferCharacteristics\"] = 21946] = \"TransferCharacteristics\";\n EBMLId[EBMLId[\"Primaries\"] = 21947] = \"Primaries\";\n EBMLId[EBMLId[\"Range\"] = 21945] = \"Range\";\n EBMLId[EBMLId[\"Projection\"] = 30320] = \"Projection\";\n EBMLId[EBMLId[\"ProjectionType\"] = 30321] = \"ProjectionType\";\n EBMLId[EBMLId[\"ProjectionPoseRoll\"] = 30325] = \"ProjectionPoseRoll\";\n EBMLId[EBMLId[\"Attachments\"] = 423732329] = \"Attachments\";\n EBMLId[EBMLId[\"Chapters\"] = 272869232] = \"Chapters\";\n EBMLId[EBMLId[\"Tags\"] = 307544935] = \"Tags\";\n})(EBMLId || (EBMLId = {}));\nexport const LEVEL_0_EBML_IDS = [\n EBMLId.EBML,\n EBMLId.Segment,\n];\nexport const LEVEL_1_EBML_IDS = [\n EBMLId.EBMLMaxIDLength,\n EBMLId.EBMLMaxSizeLength,\n EBMLId.SeekHead,\n EBMLId.Info,\n EBMLId.Cluster,\n EBMLId.Tracks,\n EBMLId.Cues,\n EBMLId.Attachments,\n EBMLId.Chapters,\n EBMLId.Tags,\n];\nexport const LEVEL_0_AND_1_EBML_IDS = [\n ...LEVEL_0_EBML_IDS,\n ...LEVEL_1_EBML_IDS,\n];\nexport const measureUnsignedInt = (value) => {\n if (value < (1 << 8)) {\n return 1;\n }\n else if (value < (1 << 16)) {\n return 2;\n }\n else if (value < (1 << 24)) {\n return 3;\n }\n else if (value < 2 ** 32) {\n return 4;\n }\n else if (value < 2 ** 40) {\n return 5;\n }\n else {\n return 6;\n }\n};\nexport const measureSignedInt = (value) => {\n if (value >= -(1 << 6) && value < (1 << 6)) {\n return 1;\n }\n else if (value >= -(1 << 13) && value < (1 << 13)) {\n return 2;\n }\n else if (value >= -(1 << 20) && value < (1 << 20)) {\n return 3;\n }\n else if (value >= -(1 << 27) && value < (1 << 27)) {\n return 4;\n }\n else if (value >= -(2 ** 34) && value < 2 ** 34) {\n return 5;\n }\n else {\n return 6;\n }\n};\nexport const measureVarInt = (value) => {\n if (value < (1 << 7) - 1) {\n /** Top bit is set, leaving 7 bits to hold the integer, but we can't store\n * 127 because \"all bits set to one\" is a reserved value. Same thing for the\n * other cases below:\n */\n return 1;\n }\n else if (value < (1 << 14) - 1) {\n return 2;\n }\n else if (value < (1 << 21) - 1) {\n return 3;\n }\n else if (value < (1 << 28) - 1) {\n return 4;\n }\n else if (value < 2 ** 35 - 1) {\n return 5;\n }\n else if (value < 2 ** 42 - 1) {\n return 6;\n }\n else {\n throw new Error('EBML varint size not supported ' + value);\n }\n};\nexport class EBMLWriter {\n constructor(writer) {\n this.writer = writer;\n this.helper = new Uint8Array(8);\n this.helperView = new DataView(this.helper.buffer);\n /**\n * Stores the position from the start of the file to where EBML elements have been written. This is used to\n * rewrite/edit elements that were already added before, and to measure sizes of things.\n */\n this.offsets = new WeakMap();\n /** Same as offsets, but stores position where the element's data starts (after ID and size fields). */\n this.dataOffsets = new WeakMap();\n }\n writeByte(value) {\n this.helperView.setUint8(0, value);\n this.writer.write(this.helper.subarray(0, 1));\n }\n writeFloat32(value) {\n this.helperView.setFloat32(0, value, false);\n this.writer.write(this.helper.subarray(0, 4));\n }\n writeFloat64(value) {\n this.helperView.setFloat64(0, value, false);\n this.writer.write(this.helper);\n }\n writeUnsignedInt(value, width = measureUnsignedInt(value)) {\n let pos = 0;\n // Each case falls through:\n switch (width) {\n case 6:\n // Need to use division to access >32 bits of floating point var\n this.helperView.setUint8(pos++, (value / 2 ** 40) | 0);\n // eslint-disable-next-line no-fallthrough\n case 5:\n this.helperView.setUint8(pos++, (value / 2 ** 32) | 0);\n // eslint-disable-next-line no-fallthrough\n case 4:\n this.helperView.setUint8(pos++, value >> 24);\n // eslint-disable-next-line no-fallthrough\n case 3:\n this.helperView.setUint8(pos++, value >> 16);\n // eslint-disable-next-line no-fallthrough\n case 2:\n this.helperView.setUint8(pos++, value >> 8);\n // eslint-disable-next-line no-fallthrough\n case 1:\n this.helperView.setUint8(pos++, value);\n break;\n default:\n throw new Error('Bad unsigned int size ' + width);\n }\n this.writer.write(this.helper.subarray(0, pos));\n }\n writeSignedInt(value, width = measureSignedInt(value)) {\n if (value < 0) {\n // Two's complement stuff\n value += 2 ** (width * 8);\n }\n this.writeUnsignedInt(value, width);\n }\n writeVarInt(value, width = measureVarInt(value)) {\n let pos = 0;\n switch (width) {\n case 1:\n this.helperView.setUint8(pos++, (1 << 7) | value);\n break;\n case 2:\n this.helperView.setUint8(pos++, (1 << 6) | (value >> 8));\n this.helperView.setUint8(pos++, value);\n break;\n case 3:\n this.helperView.setUint8(pos++, (1 << 5) | (value >> 16));\n this.helperView.setUint8(pos++, value >> 8);\n this.helperView.setUint8(pos++, value);\n break;\n case 4:\n this.helperView.setUint8(pos++, (1 << 4) | (value >> 24));\n this.helperView.setUint8(pos++, value >> 16);\n this.helperView.setUint8(pos++, value >> 8);\n this.helperView.setUint8(pos++, value);\n break;\n case 5:\n /**\n * JavaScript converts its doubles to 32-bit integers for bitwise\n * operations, so we need to do a division by 2^32 instead of a\n * right-shift of 32 to retain those top 3 bits\n */\n this.helperView.setUint8(pos++, (1 << 3) | ((value / 2 ** 32) & 0x7));\n this.helperView.setUint8(pos++, value >> 24);\n this.helperView.setUint8(pos++, value >> 16);\n this.helperView.setUint8(pos++, value >> 8);\n this.helperView.setUint8(pos++, value);\n break;\n case 6:\n this.helperView.setUint8(pos++, (1 << 2) | ((value / 2 ** 40) & 0x3));\n this.helperView.setUint8(pos++, (value / 2 ** 32) | 0);\n this.helperView.setUint8(pos++, value >> 24);\n this.helperView.setUint8(pos++, value >> 16);\n this.helperView.setUint8(pos++, value >> 8);\n this.helperView.setUint8(pos++, value);\n break;\n default:\n throw new Error('Bad EBML varint size ' + width);\n }\n this.writer.write(this.helper.subarray(0, pos));\n }\n // Assumes the string is ASCII\n writeString(str) {\n this.writer.write(new Uint8Array(str.split('').map(x => x.charCodeAt(0))));\n }\n writeEBML(data) {\n if (data === null)\n return;\n if (data instanceof Uint8Array) {\n this.writer.write(data);\n }\n else if (Array.isArray(data)) {\n for (const elem of data) {\n this.writeEBML(elem);\n }\n }\n else {\n this.offsets.set(data, this.writer.getPos());\n this.writeUnsignedInt(data.id); // ID field\n if (Array.isArray(data.data)) {\n const sizePos = this.writer.getPos();\n const sizeSize = data.size === -1 ? 1 : (data.size ?? 4);\n if (data.size === -1) {\n // Write the reserved all-one-bits marker for unknown/unbounded size.\n this.writeByte(0xff);\n }\n else {\n this.writer.seek(this.writer.getPos() + sizeSize);\n }\n const startPos = this.writer.getPos();\n this.dataOffsets.set(data, startPos);\n this.writeEBML(data.data);\n if (data.size !== -1) {\n const size = this.writer.getPos() - startPos;\n const endPos = this.writer.getPos();\n this.writer.seek(sizePos);\n this.writeVarInt(size, sizeSize);\n this.writer.seek(endPos);\n }\n }\n else if (typeof data.data === 'number') {\n const size = data.size ?? measureUnsignedInt(data.data);\n this.writeVarInt(size);\n this.writeUnsignedInt(data.data, size);\n }\n else if (typeof data.data === 'string') {\n this.writeVarInt(data.data.length);\n this.writeString(data.data);\n }\n else if (data.data instanceof Uint8Array) {\n this.writeVarInt(data.data.byteLength, data.size);\n this.writer.write(data.data);\n }\n else if (data.data instanceof EBMLFloat32) {\n this.writeVarInt(4);\n this.writeFloat32(data.data.value);\n }\n else if (data.data instanceof EBMLFloat64) {\n this.writeVarInt(8);\n this.writeFloat64(data.data.value);\n }\n else if (data.data instanceof EBMLSignedInt) {\n const size = data.size ?? measureSignedInt(data.data.value);\n this.writeVarInt(size);\n this.writeSignedInt(data.data.value, size);\n }\n }\n }\n}\nconst MAX_VAR_INT_SIZE = 8;\nexport const MIN_HEADER_SIZE = 2; // 1-byte ID and 1-byte size\nexport const MAX_HEADER_SIZE = 4 + MAX_VAR_INT_SIZE; // 4-byte ID and 8-byte size\nexport class EBMLReader {\n constructor(reader) {\n this.reader = reader;\n this.pos = 0;\n }\n readBytes(length) {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + length);\n this.pos += length;\n return new Uint8Array(view.buffer, offset, length);\n }\n readU8() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 1);\n this.pos++;\n return view.getUint8(offset);\n }\n readS16() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 2);\n this.pos += 2;\n return view.getInt16(offset, false);\n }\n readVarIntSize() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 1);\n const firstByte = view.getUint8(offset);\n let width = 1;\n let mask = 0x80;\n while ((firstByte & mask) === 0 && width < 8) {\n width++;\n mask >>= 1;\n }\n return width;\n }\n readVarInt() {\n // Read the first byte to determine the width of the variable-length integer\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 1);\n const firstByte = view.getUint8(offset);\n // Find the position of VINT_MARKER, which determines the width\n let width = 1;\n let mask = 1 << 7;\n while ((firstByte & mask) === 0 && width < MAX_VAR_INT_SIZE) {\n width++;\n mask >>= 1;\n }\n const { view: fullView, offset: fullOffset } = this.reader.getViewAndOffset(this.pos, this.pos + width);\n // First byte's value needs the marker bit cleared\n let value = firstByte & (mask - 1);\n // Read remaining bytes\n for (let i = 1; i < width; i++) {\n value *= 1 << 8;\n value += fullView.getUint8(fullOffset + i);\n }\n this.pos += width;\n return value;\n }\n readUnsignedInt(width) {\n if (width < 1 || width > 8) {\n throw new Error('Bad unsigned int size ' + width);\n }\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + width);\n let value = 0;\n // Read bytes from most significant to least significant\n for (let i = 0; i < width; i++) {\n value *= 1 << 8;\n value += view.getUint8(offset + i);\n }\n this.pos += width;\n return value;\n }\n readSignedInt(width) {\n let value = this.readUnsignedInt(width);\n // If the highest bit is set, convert from two's complement\n if (value & (1 << (width * 8 - 1))) {\n value -= 2 ** (width * 8);\n }\n return value;\n }\n readFloat(width) {\n if (width === 0) {\n return 0;\n }\n if (width !== 4 && width !== 8) {\n throw new Error('Bad float size ' + width);\n }\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + width);\n const value = width === 4 ? view.getFloat32(offset, false) : view.getFloat64(offset, false);\n this.pos += width;\n return value;\n }\n readString(length) {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + length);\n this.pos += length;\n return String.fromCharCode(...new Uint8Array(view.buffer, offset, length));\n }\n readElementId() {\n const size = this.readVarIntSize();\n const id = this.readUnsignedInt(size);\n return id;\n }\n readElementSize() {\n let size = this.readU8();\n if (size === 0xff) {\n size = null;\n }\n else {\n this.pos--;\n size = this.readVarInt();\n // In some (livestreamed) files, this is the value of the size field. While this technically is just a very\n // large number, it is intended to behave like the reserved size 0xFF, meaning the size is undefined. We\n // catch the number here. Note that it cannot be perfectly represented as a double, but the comparison works\n // nonetheless.\n // eslint-disable-next-line no-loss-of-precision\n if (size === 0x00ffffffffffffff) {\n size = null;\n }\n }\n return size;\n }\n readElementHeader() {\n const id = this.readElementId();\n const size = this.readElementSize();\n return { id, size };\n }\n /** Returns the byte offset in the file of the next element with a matching ID. */\n async searchForNextElementId(ids, until) {\n const loadChunkSize = 2 ** 20; // 1 MiB\n const idsSet = new Set(ids);\n while (this.pos < until - MAX_HEADER_SIZE) {\n if (!this.reader.rangeIsLoaded(this.pos, this.pos + MAX_HEADER_SIZE)) {\n await this.reader.loadRange(this.pos, Math.min(this.pos + loadChunkSize, until));\n }\n const elementStartPos = this.pos;\n const elementHeader = this.readElementHeader();\n if (idsSet.has(elementHeader.id)) {\n return elementStartPos;\n }\n assertDefinedSize(elementHeader.size);\n this.pos += elementHeader.size;\n }\n return null;\n }\n}\nexport const CODEC_STRING_MAP = {\n 'avc': 'V_MPEG4/ISO/AVC',\n 'hevc': 'V_MPEGH/ISO/HEVC',\n 'vp8': 'V_VP8',\n 'vp9': 'V_VP9',\n 'av1': 'V_AV1',\n 'aac': 'A_AAC',\n 'mp3': 'A_MPEG/L3',\n 'opus': 'A_OPUS',\n 'vorbis': 'A_VORBIS',\n 'flac': 'A_FLAC',\n 'pcm-u8': 'A_PCM/INT/LIT',\n 'pcm-s16': 'A_PCM/INT/LIT',\n 'pcm-s16be': 'A_PCM/INT/BIG',\n 'pcm-s24': 'A_PCM/INT/LIT',\n 'pcm-s24be': 'A_PCM/INT/BIG',\n 'pcm-s32': 'A_PCM/INT/LIT',\n 'pcm-s32be': 'A_PCM/INT/BIG',\n 'pcm-f32': 'A_PCM/FLOAT/IEEE',\n 'pcm-f64': 'A_PCM/FLOAT/IEEE',\n 'webvtt': 'S_TEXT/WEBVTT',\n};\nexport function assertDefinedSize(size) {\n if (size === null) {\n throw new Error('Undefined element size is used in a place where it is not supported.');\n }\n}\n;\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nexport const buildMatroskaMimeType = (info) => {\n const base = info.hasVideo\n ? 'video/'\n : info.hasAudio\n ? 'audio/'\n : 'application/';\n let string = base + (info.isWebM ? 'webm' : 'x-matroska');\n if (info.codecStrings.length > 0) {\n const uniqueCodecMimeTypes = [...new Set(info.codecStrings.filter(Boolean))];\n string += `; codecs=\"${uniqueCodecMimeTypes.join(', ')}\"`;\n }\n return string;\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nexport const FRAME_HEADER_SIZE = 4;\n// These are in kbps:\nexport const MPEG_V1_BITRATES = {\n // Layer 3\n 1: [-1, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1],\n // Layer 2\n 2: [-1, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, -1],\n // Layer 1\n 3: [-1, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, -1],\n};\nexport const MPEG_V2_BITRATES = {\n // Layer 3\n 1: [-1, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, -1],\n // Layer 2\n 2: [-1, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1],\n // Layer 1\n 3: [-1, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1],\n};\nexport const SAMPLING_RATES = {\n // MPEG Version 2.5\n 0: [11025, 12000, 8000, -1],\n // MPEG Version 2 (ISO/IEC 13818-3)\n 2: [22050, 24000, 16000, -1],\n // MPEG Version 1 (ISO/IEC 11172-3)\n 3: [44100, 48000, 32000, -1],\n};\n/** 'Xing' */\nexport const XING = 0x58696e67;\n/** 'Info' */\nexport const INFO = 0x496e666f;\nexport const computeMp3FrameSize = (layer, bitrate, sampleRate, padding) => {\n if (layer === 3) {\n // Layer 1\n return Math.floor((12 * bitrate / sampleRate + padding) * 4);\n }\n else {\n return Math.floor((144 * bitrate / sampleRate) + padding);\n }\n};\nexport const getXingOffset = (mpegVersionId, channel) => {\n return mpegVersionId === 3\n ? (channel === 3 ? 21 : 36)\n : (channel === 3 ? 13 : 21);\n};\nexport const readFrameHeader = (word, reader) => {\n const startPos = reader.pos;\n const firstByte = word >>> 24;\n const secondByte = (word >>> 16) & 0xff;\n const thirdByte = (word >>> 8) & 0xff;\n const fourthByte = word & 0xff;\n if (firstByte !== 0xff && secondByte !== 0xff && thirdByte !== 0xff && fourthByte !== 0xff) {\n reader.pos += 4;\n return null;\n }\n reader.pos += 1;\n if (firstByte !== 0xff) {\n return null;\n }\n if ((secondByte & 0xe0) !== 0xe0) {\n return null;\n }\n const mpegVersionId = (secondByte >> 3) & 0x3;\n const layer = (secondByte >> 1) & 0x3;\n const bitrateIndex = (thirdByte >> 4) & 0xf;\n const frequencyIndex = (thirdByte >> 2) & 0x3;\n const padding = (thirdByte >> 1) & 0x1;\n const channel = (fourthByte >> 6) & 0x3;\n const modeExtension = (fourthByte >> 4) & 0x3;\n const copyright = (fourthByte >> 3) & 0x1;\n const original = (fourthByte >> 2) & 0x1;\n const emphasis = fourthByte & 0x3;\n const kilobitRate = mpegVersionId === 3\n ? MPEG_V1_BITRATES[layer]?.[bitrateIndex]\n : MPEG_V2_BITRATES[layer]?.[bitrateIndex];\n if (!kilobitRate || kilobitRate === -1) {\n return null;\n }\n const bitrate = kilobitRate * 1000;\n const sampleRate = SAMPLING_RATES[mpegVersionId]?.[frequencyIndex];\n if (!sampleRate || sampleRate === -1) {\n return null;\n }\n const frameLength = computeMp3FrameSize(layer, bitrate, sampleRate, padding);\n if (reader.fileSize !== null && reader.fileSize - startPos < frameLength) {\n // The frame doesn't fit into the rest of the file\n return null;\n }\n let audioSamplesInFrame;\n if (mpegVersionId === 3) {\n audioSamplesInFrame = layer === 3 ? 384 : 1152;\n }\n else {\n if (layer === 3) {\n audioSamplesInFrame = 384;\n }\n else if (layer === 2) {\n audioSamplesInFrame = 1152;\n }\n else {\n audioSamplesInFrame = 576;\n }\n }\n return {\n startPos: startPos,\n totalSize: frameLength,\n mpegVersionId,\n layer,\n bitrate,\n frequencyIndex,\n sampleRate,\n channel,\n modeExtension,\n copyright,\n original,\n emphasis,\n audioSamplesInFrame,\n };\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { parseOpusTocByte } from '../codec-data.js';\nimport { assert, ilog, toDataView } from '../misc.js';\nexport const OGGS = 0x5367674f; // 'OggS'\nconst OGG_CRC_POLYNOMIAL = 0x04c11db7;\nconst OGG_CRC_TABLE = new Uint32Array(256);\nfor (let n = 0; n < 256; n++) {\n let crc = n << 24;\n for (let k = 0; k < 8; k++) {\n crc = (crc & 0x80000000)\n ? ((crc << 1) ^ OGG_CRC_POLYNOMIAL)\n : (crc << 1);\n }\n OGG_CRC_TABLE[n] = (crc >>> 0) & 0xffffffff;\n}\nexport const computeOggPageCrc = (bytes) => {\n const view = toDataView(bytes);\n const originalChecksum = view.getUint32(22, true);\n view.setUint32(22, 0, true); // Zero out checksum field\n let crc = 0;\n for (let i = 0; i < bytes.length; i++) {\n const byte = bytes[i];\n crc = ((crc << 8) ^ OGG_CRC_TABLE[(crc >>> 24) ^ byte]) >>> 0;\n }\n view.setUint32(22, originalChecksum, true); // Restore checksum field\n return crc;\n};\nexport const extractSampleMetadata = (data, codecInfo, vorbisLastBlocksize) => {\n let durationInSamples = 0;\n let currentBlocksize = null;\n if (data.length > 0) {\n // To know sample duration, we'll need to peak inside the packet\n if (codecInfo.codec === 'vorbis') {\n assert(codecInfo.vorbisInfo);\n const vorbisModeCount = codecInfo.vorbisInfo.modeBlockflags.length;\n const bitCount = ilog(vorbisModeCount - 1);\n const modeMask = ((1 << bitCount) - 1) << 1;\n const modeNumber = (data[0] & modeMask) >> 1;\n if (modeNumber >= codecInfo.vorbisInfo.modeBlockflags.length) {\n throw new Error('Invalid mode number.');\n }\n // In Vorbis, packet duration also depends on the blocksize of the previous packet\n let prevBlocksize = vorbisLastBlocksize;\n const blockflag = codecInfo.vorbisInfo.modeBlockflags[modeNumber];\n currentBlocksize = codecInfo.vorbisInfo.blocksizes[blockflag];\n if (blockflag === 1) {\n const prevMask = (modeMask | 0x1) + 1;\n const flag = data[0] & prevMask ? 1 : 0;\n prevBlocksize = codecInfo.vorbisInfo.blocksizes[flag];\n }\n durationInSamples = prevBlocksize !== null\n ? (prevBlocksize + currentBlocksize) >> 2\n : 0; // The first sample outputs no audio data and therefore has a duration of 0\n }\n else if (codecInfo.codec === 'opus') {\n const toc = parseOpusTocByte(data);\n durationInSamples = toc.durationInSamples;\n }\n }\n return {\n durationInSamples,\n vorbisBlockSize: currentBlocksize,\n };\n};\nexport const buildOggMimeType = (info) => {\n let string = 'audio/ogg';\n if (info.codecStrings) {\n const uniqueCodecMimeTypes = [...new Set(info.codecStrings)];\n string += `; codecs=\"${uniqueCodecMimeTypes.join(', ')}\"`;\n }\n return string;\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { OGGS } from './ogg-misc.js';\nexport const MIN_PAGE_HEADER_SIZE = 27;\nexport const MAX_PAGE_HEADER_SIZE = 27 + 255;\nexport const MAX_PAGE_SIZE = MAX_PAGE_HEADER_SIZE + 255 * 255;\nexport class OggReader {\n constructor(reader) {\n this.reader = reader;\n this.pos = 0;\n }\n readBytes(length) {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + length);\n this.pos += length;\n return new Uint8Array(view.buffer, offset, length);\n }\n readU8() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 1);\n this.pos += 1;\n return view.getUint8(offset);\n }\n readU32() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 4);\n this.pos += 4;\n return view.getUint32(offset, true);\n }\n readI32() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 4);\n this.pos += 4;\n return view.getInt32(offset, true);\n }\n readI64() {\n const low = this.readU32();\n const high = this.readI32();\n return high * 0x100000000 + low;\n }\n readAscii(length) {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + length);\n this.pos += length;\n let str = '';\n for (let i = 0; i < length; i++) {\n str += String.fromCharCode(view.getUint8(offset + i));\n }\n return str;\n }\n readPageHeader() {\n const startPos = this.pos;\n const capturePattern = this.readU32();\n if (capturePattern !== OGGS) {\n return null;\n }\n this.pos += 1; // Version\n const headerType = this.readU8();\n const granulePosition = this.readI64();\n const serialNumber = this.readU32();\n const sequenceNumber = this.readU32();\n const checksum = this.readU32();\n const numberPageSegments = this.readU8();\n const lacingValues = new Uint8Array(numberPageSegments);\n for (let i = 0; i < numberPageSegments; i++) {\n lacingValues[i] = this.readU8();\n }\n const headerSize = 27 + numberPageSegments;\n const dataSize = lacingValues.reduce((a, b) => a + b, 0);\n const totalSize = headerSize + dataSize;\n return {\n headerStartPos: startPos,\n totalSize,\n dataStartPos: startPos + headerSize,\n dataSize,\n headerType,\n granulePosition,\n serialNumber,\n sequenceNumber,\n checksum,\n lacingValues,\n };\n }\n findNextPageHeader(until) {\n while (this.pos < until - (4 - 1)) { // Size of word minus 1\n const word = this.readU32();\n const firstByte = word & 0xff;\n const secondByte = (word >>> 8) & 0xff;\n const thirdByte = (word >>> 16) & 0xff;\n const fourthByte = (word >>> 24) & 0xff;\n const O = 0x4f; // 'O'\n if (firstByte !== O && secondByte !== O && thirdByte !== O && fourthByte !== O) {\n continue;\n }\n this.pos -= 4;\n if (word === OGGS) {\n // We have found the capture pattern\n return true;\n }\n this.pos += 1;\n }\n return false;\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nexport class Demuxer {\n constructor(input) {\n this.input = input;\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { SECOND_TO_MICROSECOND_FACTOR } from './misc.js';\nexport const PLACEHOLDER_DATA = new Uint8Array(0);\n/**\n * Represents an encoded chunk of media. Mainly used as an expressive wrapper around WebCodecs API's EncodedVideoChunk\n * and EncodedAudioChunk, but can also be used standalone.\n * @public\n */\nexport class EncodedPacket {\n constructor(\n /** The encoded data of this packet. */\n data, \n /** The type of this packet. */\n type, \n /**\n * The presentation timestamp of this packet in seconds. May be negative. Samples with negative end timestamps\n * should not be presented.\n */\n timestamp, \n /** The duration of this packet in seconds. */\n duration, \n /**\n * The sequence number indicates the decode order of the packets. Packet A must be decoded before packet B if A\n * has a lower sequence number than B. If two packets have the same sequence number, they are the same packet.\n * Otherwise, sequence numbers are arbitrary and are not guaranteed to have any meaning besides their relative\n * ordering. Negative sequence numbers mean the sequence number is undefined.\n */\n sequenceNumber = -1, byteLength) {\n this.data = data;\n this.type = type;\n this.timestamp = timestamp;\n this.duration = duration;\n this.sequenceNumber = sequenceNumber;\n if (data === PLACEHOLDER_DATA && byteLength === undefined) {\n throw new Error('Internal error: byteLength must be explicitly provided when constructing metadata-only packets.');\n }\n if (byteLength === undefined) {\n byteLength = data.byteLength;\n }\n if (!(data instanceof Uint8Array)) {\n throw new TypeError('data must be a Uint8Array.');\n }\n if (type !== 'key' && type !== 'delta') {\n throw new TypeError('type must be either \"key\" or \"delta\".');\n }\n if (!Number.isFinite(timestamp)) {\n throw new TypeError('timestamp must be a number.');\n }\n if (!Number.isFinite(duration) || duration < 0) {\n throw new TypeError('duration must be a non-negative number.');\n }\n if (!Number.isFinite(sequenceNumber)) {\n throw new TypeError('sequenceNumber must be a number.');\n }\n if (!Number.isInteger(byteLength) || byteLength < 0) {\n throw new TypeError('byteLength must be a non-negative integer.');\n }\n this.byteLength = byteLength;\n }\n /** If this packet is a metadata-only packet. Metadata-only packets don't contain their packet data. */\n get isMetadataOnly() {\n return this.data === PLACEHOLDER_DATA;\n }\n /** The timestamp of this packet in microseconds. */\n get microsecondTimestamp() {\n return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.timestamp);\n }\n /** The duration of this packet in microseconds. */\n get microsecondDuration() {\n return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.duration);\n }\n /** Converts this packet to an EncodedVideoChunk for use with the WebCodecs API. */\n toEncodedVideoChunk() {\n if (this.isMetadataOnly) {\n throw new TypeError('Metadata-only packets cannot be converted to a video chunk.');\n }\n if (typeof EncodedVideoChunk === 'undefined') {\n throw new Error('Your browser does not support EncodedVideoChunk.');\n }\n return new EncodedVideoChunk({\n data: this.data,\n type: this.type,\n timestamp: this.microsecondTimestamp,\n duration: this.microsecondDuration,\n });\n }\n /** Converts this packet to an EncodedAudioChunk for use with the WebCodecs API. */\n toEncodedAudioChunk() {\n if (this.isMetadataOnly) {\n throw new TypeError('Metadata-only packets cannot be converted to an audio chunk.');\n }\n if (typeof EncodedAudioChunk === 'undefined') {\n throw new Error('Your browser does not support EncodedAudioChunk.');\n }\n return new EncodedAudioChunk({\n data: this.data,\n type: this.type,\n timestamp: this.microsecondTimestamp,\n duration: this.microsecondDuration,\n });\n }\n /**\n * Creates an EncodedPacket from an EncodedVideoChunk or EncodedAudioChunk. This method is useful for converting\n * chunks from the WebCodecs API to EncodedPackets.\n */\n static fromEncodedChunk(chunk) {\n if (!(chunk instanceof EncodedVideoChunk || chunk instanceof EncodedAudioChunk)) {\n throw new TypeError('chunk must be an EncodedVideoChunk or EncodedAudioChunk.');\n }\n const data = new Uint8Array(chunk.byteLength);\n chunk.copyTo(data);\n return new EncodedPacket(data, chunk.type, chunk.timestamp / 1e6, (chunk.duration ?? 0) / 1e6);\n }\n /** Clones this packet while optionally updating timing information. */\n clone(options) {\n if (options !== undefined && (typeof options !== 'object' || options === null)) {\n throw new TypeError('options, when provided, must be an object.');\n }\n if (options?.timestamp !== undefined && !Number.isFinite(options.timestamp)) {\n throw new TypeError('options.timestamp, when provided, must be a number.');\n }\n if (options?.duration !== undefined && !Number.isFinite(options.duration)) {\n throw new TypeError('options.duration, when provided, must be a number.');\n }\n return new EncodedPacket(this.data, this.type, options?.timestamp ?? this.timestamp, options?.duration ?? this.duration, this.sequenceNumber, this.byteLength);\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { assert, clamp, isAllowSharedBufferSource, SECOND_TO_MICROSECOND_FACTOR, toDataView, toUint8Array, } from './misc.js';\n/**\n * Represents a raw, unencoded video sample (frame). Mainly used as an expressive wrapper around WebCodecs API's\n * VideoFrame, but can also be used standalone.\n * @public\n */\nexport class VideoSample {\n /** The width of the frame in pixels after rotation. */\n get displayWidth() {\n return this.rotation % 180 === 0 ? this.codedWidth : this.codedHeight;\n }\n /** The height of the frame in pixels after rotation. */\n get displayHeight() {\n return this.rotation % 180 === 0 ? this.codedHeight : this.codedWidth;\n }\n /** The presentation timestamp of the frame in microseconds. */\n get microsecondTimestamp() {\n return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.timestamp);\n }\n /** The duration of the frame in microseconds. */\n get microsecondDuration() {\n return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.duration);\n }\n constructor(data, init) {\n /** @internal */\n this._closed = false;\n if (data instanceof ArrayBuffer || ArrayBuffer.isView(data)) {\n if (!init || typeof init !== 'object') {\n throw new TypeError('init must be an object.');\n }\n if (!('format' in init) || typeof init.format !== 'string') {\n throw new TypeError('init.format must be a string.');\n }\n if (!Number.isInteger(init.codedWidth) || init.codedWidth <= 0) {\n throw new TypeError('init.codedWidth must be a positive integer.');\n }\n if (!Number.isInteger(init.codedHeight) || init.codedHeight <= 0) {\n throw new TypeError('init.codedHeight must be a positive integer.');\n }\n if (init.rotation !== undefined && ![0, 90, 180, 270].includes(init.rotation)) {\n throw new TypeError('init.rotation, when provided, must be 0, 90, 180, or 270.');\n }\n if (!Number.isFinite(init.timestamp)) {\n throw new TypeError('init.timestamp must be a number.');\n }\n if (init.duration !== undefined && (!Number.isFinite(init.duration) || init.duration < 0)) {\n throw new TypeError('init.duration, when provided, must be a non-negative number.');\n }\n this._data = toUint8Array(data).slice(); // Copy it\n this.format = init.format;\n this.codedWidth = init.codedWidth;\n this.codedHeight = init.codedHeight;\n this.rotation = init.rotation ?? 0;\n this.timestamp = init.timestamp;\n this.duration = init.duration ?? 0;\n this.colorSpace = new VideoColorSpace(init.colorSpace);\n }\n else if (typeof VideoFrame !== 'undefined' && data instanceof VideoFrame) {\n if (init?.rotation !== undefined && ![0, 90, 180, 270].includes(init.rotation)) {\n throw new TypeError('init.rotation, when provided, must be 0, 90, 180, or 270.');\n }\n if (init?.timestamp !== undefined && !Number.isFinite(init?.timestamp)) {\n throw new TypeError('init.timestamp, when provided, must be a number.');\n }\n if (init?.duration !== undefined && (!Number.isFinite(init.duration) || init.duration < 0)) {\n throw new TypeError('init.duration, when provided, must be a non-negative number.');\n }\n this._data = data;\n this.format = data.format;\n this.codedWidth = data.codedWidth;\n this.codedHeight = data.codedHeight;\n this.rotation = init?.rotation ?? 0;\n this.timestamp = init?.timestamp ?? data.timestamp / 1e6;\n this.duration = init?.duration ?? (data.duration ?? 0) / 1e6;\n this.colorSpace = data.colorSpace;\n }\n else if ((typeof HTMLImageElement !== 'undefined' && data instanceof HTMLImageElement)\n || (typeof SVGImageElement !== 'undefined' && data instanceof SVGImageElement)\n || (typeof ImageBitmap !== 'undefined' && data instanceof ImageBitmap)\n || (typeof HTMLVideoElement !== 'undefined' && data instanceof HTMLVideoElement)\n || (typeof HTMLCanvasElement !== 'undefined' && data instanceof HTMLCanvasElement)\n || (typeof OffscreenCanvas !== 'undefined' && data instanceof OffscreenCanvas)) {\n if (!init || typeof init !== 'object') {\n throw new TypeError('init must be an object.');\n }\n if (init.rotation !== undefined && ![0, 90, 180, 270].includes(init.rotation)) {\n throw new TypeError('init.rotation, when provided, must be 0, 90, 180, or 270.');\n }\n if (!Number.isFinite(init.timestamp)) {\n throw new TypeError('init.timestamp must be a number.');\n }\n if (init.duration !== undefined && (!Number.isFinite(init.duration) || init.duration < 0)) {\n throw new TypeError('init.duration, when provided, must be a non-negative number.');\n }\n if (typeof VideoFrame !== 'undefined') {\n return new VideoSample(new VideoFrame(data, {\n timestamp: Math.trunc(init.timestamp * SECOND_TO_MICROSECOND_FACTOR),\n duration: Math.trunc((init.duration ?? 0) * SECOND_TO_MICROSECOND_FACTOR),\n }), init);\n }\n let width = 0;\n let height = 0;\n // Determine the dimensions of the thing\n if ('naturalWidth' in data) {\n width = data.naturalWidth;\n height = data.naturalHeight;\n }\n else if ('videoWidth' in data) {\n width = data.videoWidth;\n height = data.videoHeight;\n }\n else if ('width' in data) {\n width = Number(data.width);\n height = Number(data.height);\n }\n if (!width || !height) {\n throw new TypeError('Could not determine dimensions.');\n }\n const canvas = new OffscreenCanvas(width, height);\n const context = canvas.getContext('2d', { alpha: false, willReadFrequently: true });\n assert(context);\n // Draw it to a canvas\n context.drawImage(data, 0, 0);\n this._data = canvas;\n this.format = 'RGBX';\n this.codedWidth = width;\n this.codedHeight = height;\n this.rotation = init.rotation ?? 0;\n this.timestamp = init.timestamp;\n this.duration = init.duration ?? 0;\n this.colorSpace = new VideoColorSpace({\n matrix: 'rgb',\n primaries: 'bt709',\n transfer: 'iec61966-2-1',\n fullRange: true,\n });\n }\n else {\n throw new TypeError('Invalid data type: Must be a BufferSource or CanvasImageSource.');\n }\n }\n /** Clones this video sample. */\n clone() {\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n assert(this._data !== null);\n if (isVideoFrame(this._data)) {\n return new VideoSample(this._data.clone(), {\n timestamp: this.timestamp,\n duration: this.duration,\n });\n }\n else if (this._data instanceof Uint8Array) {\n return new VideoSample(this._data.slice(), {\n format: this.format,\n codedWidth: this.codedWidth,\n codedHeight: this.codedHeight,\n timestamp: this.timestamp,\n duration: this.duration,\n colorSpace: this.colorSpace,\n });\n }\n else {\n return new VideoSample(this._data, {\n format: this.format,\n codedWidth: this.codedWidth,\n codedHeight: this.codedHeight,\n timestamp: this.timestamp,\n duration: this.duration,\n colorSpace: this.colorSpace,\n });\n }\n }\n /**\n * Closes this video sample, releasing held resources. Video samples should be closed as soon as they are not\n * needed anymore.\n */\n close() {\n if (this._closed) {\n return;\n }\n if (isVideoFrame(this._data)) {\n this._data.close();\n }\n else {\n this._data = null; // GC that shit\n }\n this._closed = true;\n }\n /** Returns the number of bytes required to hold this video sample's pixel data. */\n allocationSize() {\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n assert(this._data !== null);\n if (isVideoFrame(this._data)) {\n return this._data.allocationSize();\n }\n else if (this._data instanceof Uint8Array) {\n return this._data.byteLength;\n }\n else {\n return this.codedWidth * this.codedHeight * 4; // RGBX\n }\n }\n /** Copies this video sample's pixel data to an ArrayBuffer or ArrayBufferView. */\n async copyTo(destination) {\n if (!isAllowSharedBufferSource(destination)) {\n throw new TypeError('destination must be an ArrayBuffer or an ArrayBuffer view.');\n }\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n assert(this._data !== null);\n if (isVideoFrame(this._data)) {\n await this._data.copyTo(destination);\n }\n else if (this._data instanceof Uint8Array) {\n const dest = toUint8Array(destination);\n dest.set(this._data);\n }\n else {\n const canvas = this._data;\n const context = canvas.getContext('2d', { alpha: false });\n assert(context);\n const imageData = context.getImageData(0, 0, this.codedWidth, this.codedHeight);\n const dest = toUint8Array(destination);\n dest.set(imageData.data);\n }\n }\n /**\n * Converts this video sample to a VideoFrame for use with the WebCodecs API. The VideoFrame returned by this\n * method *must* be closed separately from this video sample.\n */\n toVideoFrame() {\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n assert(this._data !== null);\n if (isVideoFrame(this._data)) {\n return new VideoFrame(this._data, {\n timestamp: this.microsecondTimestamp,\n duration: this.microsecondDuration || undefined, // Drag 0 duration to undefined, glitches some codecs\n });\n }\n else if (this._data instanceof Uint8Array) {\n return new VideoFrame(this._data, {\n format: this.format,\n codedWidth: this.codedWidth,\n codedHeight: this.codedHeight,\n timestamp: this.microsecondTimestamp,\n duration: this.microsecondDuration,\n colorSpace: this.colorSpace,\n });\n }\n else {\n return new VideoFrame(this._data, {\n timestamp: this.microsecondTimestamp,\n duration: this.microsecondDuration,\n });\n }\n }\n draw(context, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) {\n let sx = 0;\n let sy = 0;\n let sWidth = this.displayWidth;\n let sHeight = this.displayHeight;\n let dx = 0;\n let dy = 0;\n let dWidth = this.displayWidth;\n let dHeight = this.displayHeight;\n if (arg5 !== undefined) {\n sx = arg1;\n sy = arg2;\n sWidth = arg3;\n sHeight = arg4;\n dx = arg5;\n dy = arg6;\n if (arg7 !== undefined) {\n dWidth = arg7;\n dHeight = arg8;\n }\n else {\n dWidth = sWidth;\n dHeight = sHeight;\n }\n }\n else {\n dx = arg1;\n dy = arg2;\n if (arg3 !== undefined) {\n dWidth = arg3;\n dHeight = arg4;\n }\n }\n if (!((typeof CanvasRenderingContext2D !== 'undefined' && context instanceof CanvasRenderingContext2D)\n || (typeof OffscreenCanvasRenderingContext2D !== 'undefined'\n && context instanceof OffscreenCanvasRenderingContext2D))) {\n throw new TypeError('context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.');\n }\n if (!Number.isFinite(sx)) {\n throw new TypeError('sx must be a number.');\n }\n if (!Number.isFinite(sy)) {\n throw new TypeError('sy must be a number.');\n }\n if (!Number.isFinite(sWidth) || sWidth < 0) {\n throw new TypeError('sWidth must be a non-negative number.');\n }\n if (!Number.isFinite(sHeight) || sHeight < 0) {\n throw new TypeError('sHeight must be a non-negative number.');\n }\n if (!Number.isFinite(dx)) {\n throw new TypeError('dx must be a number.');\n }\n if (!Number.isFinite(dy)) {\n throw new TypeError('dy must be a number.');\n }\n if (!Number.isFinite(dWidth) || dWidth < 0) {\n throw new TypeError('dWidth must be a non-negative number.');\n }\n if (!Number.isFinite(dHeight) || dHeight < 0) {\n throw new TypeError('dHeight must be a non-negative number.');\n }\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n // The provided sx,sy,sWidth,sHeight refer to the final rotated image, but that's not actually how the image is\n // stored. Therefore, we must map these back onto the original, pre-rotation image.\n if (this.rotation === 90) {\n [sx, sy, sWidth, sHeight] = [\n sy,\n this.codedHeight - sx - sWidth,\n sHeight,\n sWidth,\n ];\n }\n else if (this.rotation === 180) {\n [sx, sy] = [\n this.codedWidth - sx - sWidth,\n this.codedHeight - sy - sHeight,\n ];\n }\n else if (this.rotation === 270) {\n [sx, sy, sWidth, sHeight] = [\n this.codedWidth - sy - sHeight,\n sx,\n sHeight,\n sWidth,\n ];\n }\n const source = this.toCanvasImageSource();\n context.save();\n const centerX = dx + dWidth / 2;\n const centerY = dy + dHeight / 2;\n context.translate(centerX, centerY);\n context.rotate(this.rotation * Math.PI / 180);\n const aspectRatioChange = this.rotation % 180 === 0 ? 1 : dWidth / dHeight;\n // Scale to compensate for aspect ratio changes when rotated\n context.scale(1 / aspectRatioChange, aspectRatioChange);\n context.drawImage(source, sx, sy, sWidth, sHeight, -dWidth / 2, -dHeight / 2, dWidth, dHeight);\n // Restore the previous transformation state\n context.restore();\n }\n /**\n * Converts this video sample to a CanvasImageSource for drawing to a canvas.\n *\n * You must use the value returned by this method immediately, as any VideoFrame created internally will\n * automatically be closed in the next microtask.\n */\n toCanvasImageSource() {\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n assert(this._data !== null);\n if (this._data instanceof Uint8Array) {\n // Requires VideoFrame to be defined\n const videoFrame = this.toVideoFrame();\n queueMicrotask(() => videoFrame.close()); // Let's automatically close the frame in the next microtask\n return videoFrame;\n }\n else {\n return this._data;\n }\n }\n /** Sets the rotation metadata of this video sample. */\n setRotation(newRotation) {\n if (![0, 90, 180, 270].includes(newRotation)) {\n throw new TypeError('newRotation must be 0, 90, 180, or 270.');\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n this.rotation = newRotation;\n }\n /** Sets the presentation timestamp of this video sample, in seconds. */\n setTimestamp(newTimestamp) {\n if (!Number.isFinite(newTimestamp)) {\n throw new TypeError('newTimestamp must be a number.');\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n this.timestamp = newTimestamp;\n }\n /** Sets the duration of this video sample, in seconds. */\n setDuration(newDuration) {\n if (!Number.isFinite(newDuration) || newDuration < 0) {\n throw new TypeError('newDuration must be a non-negative number.');\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n this.duration = newDuration;\n }\n}\nconst isVideoFrame = (x) => {\n return typeof VideoFrame !== 'undefined' && x instanceof VideoFrame;\n};\nconst AUDIO_SAMPLE_FORMATS = new Set(['f32', 'f32-planar', 's16', 's16-planar', 's32', 's32-planar', 'u8', 'u8-planar']);\n/**\n * Represents a raw, unencoded audio sample. Mainly used as an expressive wrapper around WebCodecs API's AudioData,\n * but can also be used standalone.\n * @public\n */\nexport class AudioSample {\n /** The presentation timestamp of the sample in microseconds. */\n get microsecondTimestamp() {\n return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.timestamp);\n }\n /** The duration of the sample in microseconds. */\n get microsecondDuration() {\n return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.duration);\n }\n constructor(init) {\n /** @internal */\n this._closed = false;\n if (isAudioData(init)) {\n if (init.format === null) {\n throw new TypeError('AudioData with null format is not supported.');\n }\n this._data = init;\n this.format = init.format;\n this.sampleRate = init.sampleRate;\n this.numberOfFrames = init.numberOfFrames;\n this.numberOfChannels = init.numberOfChannels;\n this.timestamp = init.timestamp / 1e6;\n this.duration = init.numberOfFrames / init.sampleRate;\n }\n else {\n if (!init || typeof init !== 'object') {\n throw new TypeError('Invalid AudioDataInit: must be an object.');\n }\n if (!AUDIO_SAMPLE_FORMATS.has(init.format)) {\n throw new TypeError('Invalid AudioDataInit: invalid format.');\n }\n if (!Number.isFinite(init.sampleRate) || init.sampleRate <= 0) {\n throw new TypeError('Invalid AudioDataInit: sampleRate must be > 0.');\n }\n if (!Number.isInteger(init.numberOfChannels) || init.numberOfChannels === 0) {\n throw new TypeError('Invalid AudioDataInit: numberOfChannels must be an integer > 0.');\n }\n if (!Number.isFinite(init?.timestamp)) {\n throw new TypeError('init.timestamp must be a number.');\n }\n const numberOfFrames = init.data.byteLength / (getBytesPerSample(init.format) * init.numberOfChannels);\n if (!Number.isInteger(numberOfFrames)) {\n throw new TypeError('Invalid AudioDataInit: data size is not a multiple of frame size.');\n }\n this.format = init.format;\n this.sampleRate = init.sampleRate;\n this.numberOfFrames = numberOfFrames;\n this.numberOfChannels = init.numberOfChannels;\n this.timestamp = init.timestamp;\n this.duration = numberOfFrames / init.sampleRate;\n let dataBuffer;\n if (init.data instanceof ArrayBuffer) {\n dataBuffer = new Uint8Array(init.data);\n }\n else if (ArrayBuffer.isView(init.data)) {\n dataBuffer = new Uint8Array(init.data.buffer, init.data.byteOffset, init.data.byteLength);\n }\n else {\n throw new TypeError('Invalid AudioDataInit: data is not a BufferSource.');\n }\n const expectedSize = this.numberOfFrames * this.numberOfChannels * getBytesPerSample(this.format);\n if (dataBuffer.byteLength < expectedSize) {\n throw new TypeError('Invalid AudioDataInit: insufficient data size.');\n }\n this._data = dataBuffer;\n }\n }\n /** Returns the number of bytes required to hold the audio sample's data as specified by the given options. */\n allocationSize(options) {\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (!Number.isInteger(options.planeIndex) || options.planeIndex < 0) {\n throw new TypeError('planeIndex must be a non-negative integer.');\n }\n if (options.format !== undefined && !AUDIO_SAMPLE_FORMATS.has(options.format)) {\n throw new TypeError('Invalid format.');\n }\n if (options.frameOffset !== undefined && (!Number.isInteger(options.frameOffset) || options.frameOffset < 0)) {\n throw new TypeError('frameOffset must be a non-negative integer.');\n }\n if (options.frameCount !== undefined && (!Number.isInteger(options.frameCount) || options.frameCount < 0)) {\n throw new TypeError('frameCount must be a non-negative integer.');\n }\n if (this._closed) {\n throw new Error('AudioSample is closed.');\n }\n const destFormat = options.format ?? this.format;\n const frameOffset = options.frameOffset ?? 0;\n if (frameOffset >= this.numberOfFrames) {\n throw new RangeError('frameOffset out of range');\n }\n const copyFrameCount = options.frameCount !== undefined ? options.frameCount : (this.numberOfFrames - frameOffset);\n if (copyFrameCount > (this.numberOfFrames - frameOffset)) {\n throw new RangeError('frameCount out of range');\n }\n const bytesPerSample = getBytesPerSample(destFormat);\n const isPlanar = formatIsPlanar(destFormat);\n if (isPlanar && options.planeIndex >= this.numberOfChannels) {\n throw new RangeError('planeIndex out of range');\n }\n if (!isPlanar && options.planeIndex !== 0) {\n throw new RangeError('planeIndex out of range');\n }\n const elementCount = isPlanar ? copyFrameCount : copyFrameCount * this.numberOfChannels;\n return elementCount * bytesPerSample;\n }\n /** Copies the audio sample's data to an ArrayBuffer or ArrayBufferView as specified by the given options. */\n copyTo(destination, options) {\n if (!isAllowSharedBufferSource(destination)) {\n throw new TypeError('destination must be an ArrayBuffer or an ArrayBuffer view.');\n }\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (!Number.isInteger(options.planeIndex) || options.planeIndex < 0) {\n throw new TypeError('planeIndex must be a non-negative integer.');\n }\n if (options.format !== undefined && !AUDIO_SAMPLE_FORMATS.has(options.format)) {\n throw new TypeError('Invalid format.');\n }\n if (options.frameOffset !== undefined && (!Number.isInteger(options.frameOffset) || options.frameOffset < 0)) {\n throw new TypeError('frameOffset must be a non-negative integer.');\n }\n if (options.frameCount !== undefined && (!Number.isInteger(options.frameCount) || options.frameCount < 0)) {\n throw new TypeError('frameCount must be a non-negative integer.');\n }\n if (this._closed) {\n throw new Error('AudioSample is closed.');\n }\n const { planeIndex, format, frameCount: optFrameCount, frameOffset: optFrameOffset } = options;\n const destFormat = format ?? this.format;\n if (!destFormat)\n throw new Error('Destination format not determined');\n const numFrames = this.numberOfFrames;\n const numChannels = this.numberOfChannels;\n const frameOffset = optFrameOffset ?? 0;\n if (frameOffset >= numFrames) {\n throw new RangeError('frameOffset out of range');\n }\n const copyFrameCount = optFrameCount !== undefined ? optFrameCount : (numFrames - frameOffset);\n if (copyFrameCount > (numFrames - frameOffset)) {\n throw new RangeError('frameCount out of range');\n }\n const destBytesPerSample = getBytesPerSample(destFormat);\n const destIsPlanar = formatIsPlanar(destFormat);\n if (destIsPlanar && planeIndex >= numChannels) {\n throw new RangeError('planeIndex out of range');\n }\n if (!destIsPlanar && planeIndex !== 0) {\n throw new RangeError('planeIndex out of range');\n }\n const destElementCount = destIsPlanar ? copyFrameCount : copyFrameCount * numChannels;\n const requiredSize = destElementCount * destBytesPerSample;\n if (destination.byteLength < requiredSize) {\n throw new RangeError('Destination buffer is too small');\n }\n const destView = toDataView(destination);\n const writeFn = getWriteFunction(destFormat);\n if (isAudioData(this._data)) {\n if (destIsPlanar) {\n if (destFormat === 'f32-planar') {\n // Simple, since the browser must support f32-planar, we can just delegate here\n this._data.copyTo(destination, {\n planeIndex,\n frameOffset,\n frameCount: copyFrameCount,\n format: 'f32-planar',\n });\n }\n else {\n // Allocate temporary buffer for f32-planar data\n const tempBuffer = new ArrayBuffer(copyFrameCount * 4);\n const tempArray = new Float32Array(tempBuffer);\n this._data.copyTo(tempArray, {\n planeIndex,\n frameOffset,\n frameCount: copyFrameCount,\n format: 'f32-planar',\n });\n // Convert each f32 sample to destination format\n const tempView = new DataView(tempBuffer);\n for (let i = 0; i < copyFrameCount; i++) {\n const destOffset = i * destBytesPerSample;\n const sample = tempView.getFloat32(i * 4, true);\n writeFn(destView, destOffset, sample);\n }\n }\n }\n else {\n // Destination is interleaved.\n // Allocate a temporary Float32Array to hold one channel's worth of data.\n const numCh = numChannels;\n const temp = new Float32Array(copyFrameCount);\n for (let ch = 0; ch < numCh; ch++) {\n this._data.copyTo(temp, {\n planeIndex: ch,\n frameOffset,\n frameCount: copyFrameCount,\n format: 'f32-planar',\n });\n for (let i = 0; i < copyFrameCount; i++) {\n const destIndex = i * numCh + ch;\n const destOffset = destIndex * destBytesPerSample;\n writeFn(destView, destOffset, temp[i]);\n }\n }\n }\n }\n else {\n // Branch for Uint8Array data (non-AudioData)\n const uint8Data = this._data;\n const srcView = new DataView(uint8Data.buffer, uint8Data.byteOffset, uint8Data.byteLength);\n const srcFormat = this.format;\n const readFn = getReadFunction(srcFormat);\n const srcBytesPerSample = getBytesPerSample(srcFormat);\n const srcIsPlanar = formatIsPlanar(srcFormat);\n for (let i = 0; i < copyFrameCount; i++) {\n if (destIsPlanar) {\n const destOffset = i * destBytesPerSample;\n let srcOffset;\n if (srcIsPlanar) {\n srcOffset = (planeIndex * numFrames + (i + frameOffset)) * srcBytesPerSample;\n }\n else {\n srcOffset = (((i + frameOffset) * numChannels) + planeIndex) * srcBytesPerSample;\n }\n const normalized = readFn(srcView, srcOffset);\n writeFn(destView, destOffset, normalized);\n }\n else {\n for (let ch = 0; ch < numChannels; ch++) {\n const destIndex = i * numChannels + ch;\n const destOffset = destIndex * destBytesPerSample;\n let srcOffset;\n if (srcIsPlanar) {\n srcOffset = (ch * numFrames + (i + frameOffset)) * srcBytesPerSample;\n }\n else {\n srcOffset = (((i + frameOffset) * numChannels) + ch) * srcBytesPerSample;\n }\n const normalized = readFn(srcView, srcOffset);\n writeFn(destView, destOffset, normalized);\n }\n }\n }\n }\n }\n /** Clones this audio sample. */\n clone() {\n if (this._closed) {\n throw new Error('AudioSample is closed.');\n }\n if (isAudioData(this._data)) {\n const sample = new AudioSample(this._data.clone());\n sample.setTimestamp(this.timestamp); // Make sure the timestamp is precise (beyond microsecond accuracy)\n return sample;\n }\n else {\n return new AudioSample({\n format: this.format,\n sampleRate: this.sampleRate,\n numberOfFrames: this.numberOfFrames,\n numberOfChannels: this.numberOfChannels,\n timestamp: this.timestamp,\n data: this._data,\n });\n }\n }\n /**\n * Closes this audio sample, releasing held resources. Audio samples should be closed as soon as they are not\n * needed anymore.\n */\n close() {\n if (this._closed) {\n return;\n }\n if (isAudioData(this._data)) {\n this._data.close();\n }\n else {\n this._data = new Uint8Array(0);\n }\n this._closed = true;\n }\n /**\n * Converts this audio sample to an AudioData for use with the WebCodecs API. The AudioData returned by this\n * method *must* be closed separately from this audio sample.\n */\n toAudioData() {\n if (this._closed) {\n throw new Error('AudioSample is closed.');\n }\n if (isAudioData(this._data)) {\n if (this._data.timestamp === this.microsecondTimestamp) {\n // Timestamp matches, let's just return the data (but cloned)\n return this._data.clone();\n }\n else {\n // It's impossible to simply change an AudioData's timestamp, so we'll need to create a new one\n if (formatIsPlanar(this.format)) {\n const size = this.allocationSize({ planeIndex: 0, format: this.format });\n const data = new ArrayBuffer(size * this.numberOfChannels);\n // We gotta read out each plane individually\n for (let i = 0; i < this.numberOfChannels; i++) {\n this.copyTo(new Uint8Array(data, i * size, size), { planeIndex: i, format: this.format });\n }\n return new AudioData({\n format: this.format,\n sampleRate: this.sampleRate,\n numberOfFrames: this.numberOfFrames,\n numberOfChannels: this.numberOfChannels,\n timestamp: this.microsecondTimestamp,\n data,\n });\n }\n else {\n const data = new ArrayBuffer(this.allocationSize({ planeIndex: 0, format: this.format }));\n this.copyTo(data, { planeIndex: 0, format: this.format });\n return new AudioData({\n format: this.format,\n sampleRate: this.sampleRate,\n numberOfFrames: this.numberOfFrames,\n numberOfChannels: this.numberOfChannels,\n timestamp: this.microsecondTimestamp,\n data,\n });\n }\n }\n }\n else {\n return new AudioData({\n format: this.format,\n sampleRate: this.sampleRate,\n numberOfFrames: this.numberOfFrames,\n numberOfChannels: this.numberOfChannels,\n timestamp: this.microsecondTimestamp,\n data: this._data,\n });\n }\n }\n /** Convert this audio sample to an AudioBuffer for use with the Web Audio API. */\n toAudioBuffer() {\n if (this._closed) {\n throw new Error('AudioSample is closed.');\n }\n const audioBuffer = new AudioBuffer({\n numberOfChannels: this.numberOfChannels,\n length: this.numberOfFrames,\n sampleRate: this.sampleRate,\n });\n const dataBytes = new Float32Array(this.allocationSize({ planeIndex: 0, format: 'f32-planar' }) / 4);\n for (let i = 0; i < this.numberOfChannels; i++) {\n this.copyTo(dataBytes, { planeIndex: i, format: 'f32-planar' });\n audioBuffer.copyToChannel(dataBytes, i);\n }\n return audioBuffer;\n }\n /** Sets the presentation timestamp of this audio sample, in seconds. */\n setTimestamp(newTimestamp) {\n if (!Number.isFinite(newTimestamp)) {\n throw new TypeError('newTimestamp must be a number.');\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n this.timestamp = newTimestamp;\n }\n}\nconst getBytesPerSample = (format) => {\n switch (format) {\n case 'u8':\n case 'u8-planar':\n return 1;\n case 's16':\n case 's16-planar':\n return 2;\n case 's32':\n case 's32-planar':\n return 4;\n case 'f32':\n case 'f32-planar':\n return 4;\n default:\n throw new Error('Unknown AudioSampleFormat');\n }\n};\nconst formatIsPlanar = (format) => {\n switch (format) {\n case 'u8-planar':\n case 's16-planar':\n case 's32-planar':\n case 'f32-planar':\n return true;\n default:\n return false;\n }\n};\nconst getReadFunction = (format) => {\n switch (format) {\n case 'u8':\n case 'u8-planar':\n return (view, offset) => (view.getUint8(offset) - 128) / 128;\n case 's16':\n case 's16-planar':\n return (view, offset) => view.getInt16(offset, true) / 32768;\n case 's32':\n case 's32-planar':\n return (view, offset) => view.getInt32(offset, true) / 2147483648;\n case 'f32':\n case 'f32-planar':\n return (view, offset) => view.getFloat32(offset, true);\n }\n};\nconst getWriteFunction = (format) => {\n switch (format) {\n case 'u8':\n case 'u8-planar':\n return (view, offset, value) => view.setUint8(offset, clamp((value + 1) * 127.5, 0, 255));\n case 's16':\n case 's16-planar':\n return (view, offset, value) => view.setInt16(offset, clamp(Math.round(value * 32767), -32768, 32767), true);\n case 's32':\n case 's32-planar':\n return (view, offset, value) => view.setInt32(offset, clamp(Math.round(value * 2147483647), -2147483648, 2147483647), true);\n case 'f32':\n case 'f32-planar':\n return (view, offset, value) => view.setFloat32(offset, value, true);\n }\n};\nconst isAudioData = (x) => {\n return typeof AudioData !== 'undefined' && x instanceof AudioData;\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { parsePcmCodec, PCM_AUDIO_CODECS } from './codec.js';\nimport { customVideoDecoders, customAudioDecoders } from './custom-coder.js';\nimport { InputAudioTrack, InputTrack, InputVideoTrack } from './input-track.js';\nimport { assert, assertNever, binarySearchLessOrEqual, CallSerializer, getInt24, getUint24, last, mapAsyncGenerator, promiseWithResolvers, toAsyncIterator, toDataView, validateAnyIterable, } from './misc.js';\nimport { EncodedPacket } from './packet.js';\nimport { fromAlaw, fromUlaw } from './pcm.js';\nimport { AudioSample, VideoSample } from './sample.js';\nconst validatePacketRetrievalOptions = (options) => {\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.metadataOnly !== undefined && typeof options.metadataOnly !== 'boolean') {\n throw new TypeError('options.metadataOnly, when defined, must be a boolean.');\n }\n};\nconst validateTimestamp = (timestamp) => {\n if (typeof timestamp !== 'number' || Number.isNaN(timestamp)) {\n throw new TypeError('timestamp must be a number.'); // It can be non-finite, that's fine\n }\n};\n/**\n * Sink for retrieving encoded packets from an input track.\n * @public\n */\nexport class EncodedPacketSink {\n constructor(track) {\n if (!(track instanceof InputTrack)) {\n throw new TypeError('track must be an InputTrack.');\n }\n this._track = track;\n }\n /**\n * Retrieves the track's first packet (in decode order), or null if it has no packets. The first packet is very\n * likely to be a key packet.\n */\n getFirstPacket(options = {}) {\n validatePacketRetrievalOptions(options);\n return this._track._backing.getFirstPacket(options);\n }\n /**\n * Retrieves the packet corresponding to the given timestamp, in seconds. More specifically, returns the last packet\n * (in presentation order) with a start timestamp less than or equal to the given timestamp. This method can be\n * used to retrieve a track's last packet using `getPacket(Infinity)`. The method returns null if the timestamp\n * is before the first packet in the track.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n getPacket(timestamp, options = {}) {\n validateTimestamp(timestamp);\n validatePacketRetrievalOptions(options);\n return this._track._backing.getPacket(timestamp, options);\n }\n /**\n * Retrieves the packet following the given packet (in decode order), or null if the given packet is the\n * last packet.\n */\n getNextPacket(packet, options = {}) {\n if (!(packet instanceof EncodedPacket)) {\n throw new TypeError('packet must be an EncodedPacket.');\n }\n validatePacketRetrievalOptions(options);\n return this._track._backing.getNextPacket(packet, options);\n }\n /**\n * Retrieves the key packet corresponding to the given timestamp, in seconds. More specifically, returns the last\n * key packet (in presentation order) with a start timestamp less than or equal to the given timestamp. A key packet\n * is a packet that doesn't require previous packets to be decoded. This method can be used to retrieve a track's\n * last key packet using `getKeyPacket(Infinity)`. The method returns null if the timestamp is before the first\n * key packet in the track.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n getKeyPacket(timestamp, options = {}) {\n validateTimestamp(timestamp);\n validatePacketRetrievalOptions(options);\n return this._track._backing.getKeyPacket(timestamp, options);\n }\n /**\n * Retrieves the key packet following the given packet (in decode order), or null if the given packet is the last\n * key packet.\n */\n getNextKeyPacket(packet, options = {}) {\n if (!(packet instanceof EncodedPacket)) {\n throw new TypeError('packet must be an EncodedPacket.');\n }\n validatePacketRetrievalOptions(options);\n return this._track._backing.getNextKeyPacket(packet, options);\n }\n /**\n * Creates an async iterator that yields the packets in this track in decode order. To enable fast iteration, this\n * method will intelligently preload packets based on the speed of the consumer.\n *\n * @param startPacket - (optional) The packet from which iteration should begin. This packet will also be yielded.\n * @param endTimestamp - (optional) The timestamp at which iteration should end. This packet will _not_ be yielded.\n */\n packets(startPacket, endPacket, options = {}) {\n if (startPacket !== undefined && !(startPacket instanceof EncodedPacket)) {\n throw new TypeError('startPacket must be an EncodedPacket.');\n }\n if (startPacket !== undefined && startPacket.isMetadataOnly && !options?.metadataOnly) {\n throw new TypeError('startPacket can only be metadata-only if options.metadataOnly is enabled.');\n }\n if (endPacket !== undefined && !(endPacket instanceof EncodedPacket)) {\n throw new TypeError('endPacket must be an EncodedPacket.');\n }\n validatePacketRetrievalOptions(options);\n const packetQueue = [];\n let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers();\n let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers();\n let ended = false;\n let terminated = false;\n // This stores errors that are \"out of band\" in the sense that they didn't occur in the normal flow of this\n // method but instead in a different context. This error should not go unnoticed and must be bubbled up to\n // the consumer.\n let outOfBandError = null;\n const timestamps = [];\n // The queue should always be big enough to hold 1 second worth of packets\n const maxQueueSize = () => Math.max(2, timestamps.length);\n // The following is the \"pump\" process that keeps pumping packets into the queue\n (async () => {\n let packet = startPacket ?? await this.getFirstPacket(options);\n while (packet && !terminated) {\n if (endPacket && packet.sequenceNumber >= endPacket?.sequenceNumber) {\n break;\n }\n if (packetQueue.length > maxQueueSize()) {\n ({ promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers());\n await queueDequeue;\n continue;\n }\n packetQueue.push(packet);\n onQueueNotEmpty();\n ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers());\n packet = await this.getNextPacket(packet, options);\n }\n ended = true;\n onQueueNotEmpty();\n })().catch((error) => {\n if (!outOfBandError) {\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n return {\n async next() {\n while (true) {\n if (terminated) {\n return { value: undefined, done: true };\n }\n else if (outOfBandError) {\n throw outOfBandError;\n }\n else if (packetQueue.length > 0) {\n const value = packetQueue.shift();\n const now = performance.now();\n timestamps.push(now);\n while (timestamps.length > 0 && now - timestamps[0] >= 1000) {\n timestamps.shift();\n }\n onQueueDequeue();\n return { value, done: false };\n }\n else if (ended) {\n return { value: undefined, done: true };\n }\n else {\n await queueNotEmpty;\n }\n }\n },\n async return() {\n terminated = true;\n onQueueDequeue();\n onQueueNotEmpty();\n return { value: undefined, done: true };\n },\n async throw(error) {\n throw error;\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n }\n}\nclass DecoderWrapper {\n constructor(onSample, onError) {\n this.onSample = onSample;\n this.onError = onError;\n }\n}\n/**\n * Base class for decoded media sample sinks.\n * @public\n */\nexport class BaseMediaSampleSink {\n /** @internal */\n mediaSamplesInRange(startTimestamp = 0, endTimestamp = Infinity) {\n validateTimestamp(startTimestamp);\n validateTimestamp(endTimestamp);\n const sampleQueue = [];\n let firstSampleQueued = false;\n let lastSample = null;\n let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers();\n let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers();\n let decoderIsFlushed = false;\n let ended = false;\n let terminated = false;\n // This stores errors that are \"out of band\" in the sense that they didn't occur in the normal flow of this\n // method but instead in a different context. This error should not go unnoticed and must be bubbled up to\n // the consumer.\n let outOfBandError = null;\n // The following is the \"pump\" process that keeps pumping packets into the decoder\n (async () => {\n const decoderError = new Error();\n const decoder = await this._createDecoder((sample) => {\n onQueueDequeue();\n if (sample.timestamp >= endTimestamp) {\n ended = true;\n }\n if (ended) {\n sample.close();\n return;\n }\n if (lastSample) {\n if (sample.timestamp > startTimestamp) {\n // We don't know ahead of time what the first first is. This is because the first first is the\n // last first whose timestamp is less than or equal to the start timestamp. Therefore we need to\n // wait for the first first after the start timestamp, and then we'll know that the previous\n // first was the first first.\n sampleQueue.push(lastSample);\n firstSampleQueued = true;\n }\n else {\n lastSample.close();\n }\n }\n if (sample.timestamp >= startTimestamp) {\n sampleQueue.push(sample);\n firstSampleQueued = true;\n }\n lastSample = firstSampleQueued ? null : sample;\n if (sampleQueue.length > 0) {\n onQueueNotEmpty();\n ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers());\n }\n }, (error) => {\n if (!outOfBandError) {\n error.stack = decoderError.stack; // Provide a more useful stack trace\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n const packetSink = this._createPacketSink();\n const keyPacket = await packetSink.getKeyPacket(startTimestamp) ?? await packetSink.getFirstPacket();\n if (!keyPacket) {\n return;\n }\n let currentPacket = keyPacket;\n let endPacket = undefined;\n if (endTimestamp < Infinity) {\n // When an end timestamp is set, we cannot simply use that for the packet iterator due to out-of-order\n // frames (B-frames). Instead, we'll need to keep decoding packets until we get a frame that exceeds\n // this end time. However, we can still put a bound on it: Since key frames are by definition never\n // out of order, we can stop at the first key frame after the end timestamp.\n const packet = await packetSink.getPacket(endTimestamp);\n const keyPacket = !packet\n ? null\n : packet.type === 'key' && packet.timestamp === endTimestamp\n ? packet\n : await packetSink.getNextKeyPacket(packet);\n if (keyPacket) {\n endPacket = keyPacket;\n }\n }\n const packets = packetSink.packets(keyPacket, endPacket);\n await packets.next(); // Skip the start packet as we already have it\n while (currentPacket && !ended) {\n const maxQueueSize = computeMaxQueueSize(sampleQueue.length);\n if (sampleQueue.length + decoder.getDecodeQueueSize() > maxQueueSize) {\n ({ promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers());\n await queueDequeue;\n continue;\n }\n decoder.decode(currentPacket);\n const packetResult = await packets.next();\n if (packetResult.done) {\n break;\n }\n currentPacket = packetResult.value;\n }\n await packets.return();\n if (!terminated)\n await decoder.flush();\n decoder.close();\n if (!firstSampleQueued && lastSample) {\n sampleQueue.push(lastSample);\n }\n decoderIsFlushed = true;\n onQueueNotEmpty(); // To unstuck the generator\n })().catch((error) => {\n if (!outOfBandError) {\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n return {\n async next() {\n while (true) {\n if (terminated) {\n return { value: undefined, done: true };\n }\n else if (outOfBandError) {\n throw outOfBandError;\n }\n else if (sampleQueue.length > 0) {\n const value = sampleQueue.shift();\n onQueueDequeue();\n return { value, done: false };\n }\n else if (!decoderIsFlushed) {\n await queueNotEmpty;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n },\n async return() {\n terminated = true;\n ended = true;\n onQueueDequeue();\n onQueueNotEmpty();\n lastSample?.close();\n for (const sample of sampleQueue) {\n sample.close();\n }\n return { value: undefined, done: true };\n },\n async throw(error) {\n throw error;\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n }\n /** @internal */\n mediaSamplesAtTimestamps(timestamps) {\n validateAnyIterable(timestamps);\n const timestampIterator = toAsyncIterator(timestamps);\n const timestampsOfInterest = [];\n const sampleQueue = [];\n let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers();\n let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers();\n let decoderIsFlushed = false;\n let terminated = false;\n // This stores errors that are \"out of band\" in the sense that they didn't occur in the normal flow of this\n // method but instead in a different context. This error should not go unnoticed and must be bubbled up to\n // the consumer.\n let outOfBandError = null;\n const pushToQueue = (sample) => {\n sampleQueue.push(sample);\n onQueueNotEmpty();\n ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers());\n };\n // The following is the \"pump\" process that keeps pumping packets into the decoder\n (async () => {\n const decoderError = new Error();\n const decoder = await this._createDecoder((sample) => {\n onQueueDequeue();\n if (terminated) {\n sample.close();\n return;\n }\n let sampleUses = 0;\n while (timestampsOfInterest.length > 0\n && sample.timestamp - timestampsOfInterest[0] > -1e-10 // Give it a little epsilon\n ) {\n sampleUses++;\n timestampsOfInterest.shift();\n }\n if (sampleUses > 0) {\n for (let i = 0; i < sampleUses; i++) {\n // Clone the sample if we need to emit it multiple times\n pushToQueue((i < sampleUses - 1 ? sample.clone() : sample));\n }\n }\n else {\n sample.close();\n }\n }, (error) => {\n if (!outOfBandError) {\n error.stack = decoderError.stack; // Provide a more useful stack trace\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n const packetSink = this._createPacketSink();\n let lastPacket = null;\n let lastKeyPacket = null;\n // The end sequence number (inclusive) in the next batch of packets that will be decoded. The batch starts\n // at the last key frame and goes until this sequence number.\n let maxSequenceNumber = -1;\n const decodePackets = async () => {\n assert(lastKeyPacket);\n // Start at the current key packet\n let currentPacket = lastKeyPacket;\n decoder.decode(currentPacket);\n while (currentPacket.sequenceNumber < maxSequenceNumber) {\n const maxQueueSize = computeMaxQueueSize(sampleQueue.length);\n while (sampleQueue.length + decoder.getDecodeQueueSize() > maxQueueSize && !terminated) {\n ({ promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers());\n await queueDequeue;\n }\n if (terminated) {\n break;\n }\n const nextPacket = await packetSink.getNextPacket(currentPacket);\n assert(nextPacket);\n currentPacket = nextPacket;\n decoder.decode(nextPacket);\n }\n maxSequenceNumber = -1;\n };\n const flushDecoder = async () => {\n await decoder.flush();\n // We don't expect this list to have any elements in it anymore, but in case it does, let's emit\n // nulls for every remaining element, then clear it.\n for (let i = 0; i < timestampsOfInterest.length; i++) {\n pushToQueue(null);\n }\n timestampsOfInterest.length = 0;\n };\n for await (const timestamp of timestampIterator) {\n validateTimestamp(timestamp);\n if (terminated) {\n break;\n }\n const targetPacket = await packetSink.getPacket(timestamp);\n const keyPacket = targetPacket && await packetSink.getKeyPacket(timestamp);\n if (!keyPacket) {\n if (maxSequenceNumber !== -1) {\n await decodePackets();\n await flushDecoder();\n }\n pushToQueue(null);\n lastPacket = null;\n continue;\n }\n // Check if the key packet has changed or if we're going back in time\n if (lastPacket\n && (keyPacket.sequenceNumber !== lastKeyPacket.sequenceNumber\n || targetPacket.timestamp < lastPacket.timestamp)) {\n await decodePackets();\n await flushDecoder(); // Always flush here, improves decoder compatibility\n }\n timestampsOfInterest.push(targetPacket.timestamp);\n maxSequenceNumber = Math.max(targetPacket.sequenceNumber, maxSequenceNumber);\n lastPacket = targetPacket;\n lastKeyPacket = keyPacket;\n }\n if (!terminated) {\n if (maxSequenceNumber !== -1) {\n // We still need to decode packets\n await decodePackets();\n }\n await flushDecoder();\n }\n decoder.close();\n decoderIsFlushed = true;\n onQueueNotEmpty(); // To unstuck the generator\n })().catch((error) => {\n if (!outOfBandError) {\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n return {\n async next() {\n while (true) {\n if (terminated) {\n return { value: undefined, done: true };\n }\n else if (outOfBandError) {\n throw outOfBandError;\n }\n else if (sampleQueue.length > 0) {\n const value = sampleQueue.shift();\n assert(value !== undefined);\n onQueueDequeue();\n return { value, done: false };\n }\n else if (!decoderIsFlushed) {\n await queueNotEmpty;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n },\n async return() {\n terminated = true;\n onQueueDequeue();\n onQueueNotEmpty();\n for (const sample of sampleQueue) {\n sample?.close();\n }\n return { value: undefined, done: true };\n },\n async throw(error) {\n throw error;\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n }\n}\nconst computeMaxQueueSize = (decodedSampleQueueSize) => {\n // If we have decoded samples lying around, limit the total queue size to a small value (decoded samples can use up\n // a lot of memory). If not, we're fine with a much bigger queue of encoded packets waiting to be decoded. In fact,\n // some decoders only start flushing out decoded chunks when the packet queue is large enough.\n return decodedSampleQueueSize === 0 ? 40 : 8;\n};\nclass VideoDecoderWrapper extends DecoderWrapper {\n constructor(onSample, onError, codec, decoderConfig, rotation, timeResolution) {\n super(onSample, onError);\n this.rotation = rotation;\n this.timeResolution = timeResolution;\n this.decoder = null;\n this.customDecoder = null;\n this.customDecoderCallSerializer = new CallSerializer();\n this.customDecoderQueueSize = 0;\n this.sampleQueue = [];\n const sampleHandler = (sample) => {\n // For correct B-frame handling, we don't just hand over the frames directly but instead add them to a\n // queue, because we want to ensure frames are emitted in presentation order. We flush the queue each time\n // we receive a frame with a timestamp larger than the highest we've seen so far, as we can sure that is\n // not a B-frame. Typically, WebCodecs automatically guarantees that frames are emitted in presentation\n // order, but some browsers (Safari) don't always follow this rule.\n if (this.sampleQueue.length > 0 && (sample.timestamp >= last(this.sampleQueue).timestamp)) {\n for (const sample of this.sampleQueue) {\n this.finalizeAndEmitSample(sample);\n }\n this.sampleQueue.length = 0;\n }\n const insertionIndex = binarySearchLessOrEqual(this.sampleQueue, sample.timestamp, x => x.timestamp);\n this.sampleQueue.splice(insertionIndex + 1, 0, sample);\n };\n const MatchingCustomDecoder = customVideoDecoders.find(x => x.supports(codec, decoderConfig));\n if (MatchingCustomDecoder) {\n // @ts-expect-error \"Can't create instance of abstract class \uD83E\uDD13\"\n this.customDecoder = new MatchingCustomDecoder();\n // @ts-expect-error It's technically readonly\n this.customDecoder.codec = codec;\n // @ts-expect-error It's technically readonly\n this.customDecoder.config = decoderConfig;\n // @ts-expect-error It's technically readonly\n this.customDecoder.onSample = (sample) => {\n if (!(sample instanceof VideoSample)) {\n throw new TypeError('The argument passed to onSample must be a VideoSample.');\n }\n sampleHandler(sample);\n };\n void this.customDecoderCallSerializer.call(() => this.customDecoder.init());\n }\n else {\n this.decoder = new VideoDecoder({\n output: frame => sampleHandler(new VideoSample(frame)),\n error: onError,\n });\n this.decoder.configure(decoderConfig);\n }\n }\n finalizeAndEmitSample(sample) {\n // Round the timestamps to the time resolution\n sample.setTimestamp(Math.round(sample.timestamp * this.timeResolution) / this.timeResolution);\n sample.setDuration(Math.round(sample.duration * this.timeResolution) / this.timeResolution);\n sample.setRotation(this.rotation);\n this.onSample(sample);\n }\n getDecodeQueueSize() {\n if (this.customDecoder) {\n return this.customDecoderQueueSize;\n }\n else {\n assert(this.decoder);\n return this.decoder.decodeQueueSize;\n }\n }\n decode(packet) {\n if (this.customDecoder) {\n this.customDecoderQueueSize++;\n void this.customDecoderCallSerializer\n .call(() => this.customDecoder.decode(packet))\n .then(() => this.customDecoderQueueSize--);\n }\n else {\n assert(this.decoder);\n this.decoder.decode(packet.toEncodedVideoChunk());\n }\n }\n async flush() {\n if (this.customDecoder) {\n await this.customDecoderCallSerializer.call(() => this.customDecoder.flush());\n }\n else {\n assert(this.decoder);\n await this.decoder.flush();\n }\n for (const sample of this.sampleQueue) {\n this.finalizeAndEmitSample(sample);\n }\n this.sampleQueue.length = 0;\n }\n close() {\n if (this.customDecoder) {\n void this.customDecoderCallSerializer.call(() => this.customDecoder.close());\n }\n else {\n assert(this.decoder);\n this.decoder.close();\n }\n for (const sample of this.sampleQueue) {\n sample.close();\n }\n this.sampleQueue.length = 0;\n }\n}\n/**\n * A sink that retrieves decoded video samples (video frames) from a video track.\n * @public\n */\nexport class VideoSampleSink extends BaseMediaSampleSink {\n constructor(videoTrack) {\n if (!(videoTrack instanceof InputVideoTrack)) {\n throw new TypeError('videoTrack must be an InputVideoTrack.');\n }\n super();\n this._videoTrack = videoTrack;\n }\n /** @internal */\n async _createDecoder(onSample, onError) {\n if (!(await this._videoTrack.canDecode())) {\n throw new Error('This video track cannot be decoded by this browser. Make sure to check decodability before using'\n + ' a track.');\n }\n const codec = this._videoTrack.codec;\n const rotation = this._videoTrack.rotation;\n const decoderConfig = await this._videoTrack.getDecoderConfig();\n const timeResolution = this._videoTrack.timeResolution;\n assert(codec && decoderConfig);\n return new VideoDecoderWrapper(onSample, onError, codec, decoderConfig, rotation, timeResolution);\n }\n /** @internal */\n _createPacketSink() {\n return new EncodedPacketSink(this._videoTrack);\n }\n /**\n * Retrieves the video sample (frame) corresponding to the given timestamp, in seconds. More specifically, returns\n * the last video sample (in presentation order) with a start timestamp less than or equal to the given timestamp.\n * Returns null if the timestamp is before the track's first timestamp.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getSample(timestamp) {\n validateTimestamp(timestamp);\n for await (const sample of this.mediaSamplesAtTimestamps([timestamp])) {\n return sample;\n }\n throw new Error('Internal error: Iterator returned nothing.');\n }\n /**\n * Creates an async iterator that yields the video samples (frames) of this track in presentation order. This method\n * will intelligently pre-decode a few frames ahead to enable fast iteration.\n *\n * @param startTimestamp - The timestamp in seconds at which to start yielding samples (inclusive).\n * @param endTimestamp - The timestamp in seconds at which to stop yielding samples (exclusive).\n */\n samples(startTimestamp = 0, endTimestamp = Infinity) {\n return this.mediaSamplesInRange(startTimestamp, endTimestamp);\n }\n /**\n * Creates an async iterator that yields a video sample (frame) for each timestamp in the argument. This method\n * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most\n * once, and is therefore more efficient than manually getting the sample for every timestamp. The iterator may\n * yield null if no frame is available for a given timestamp.\n *\n * @param timestamps - An iterable or async iterable of timestamps in seconds.\n */\n samplesAtTimestamps(timestamps) {\n return this.mediaSamplesAtTimestamps(timestamps);\n }\n}\n/**\n * A sink that renders video samples (frames) of the given video track to canvases. This is often more useful than\n * directly retrieving frames, as it comes with common preprocessing steps such as resizing or applying rotation\n * metadata.\n *\n * This sink will yield HTMLCanvasElements when in a DOM context, and OffscreenCanvases otherwise.\n * @public\n */\nexport class CanvasSink {\n constructor(videoTrack, options = {}) {\n /** @internal */\n this._nextCanvasIndex = 0;\n if (!(videoTrack instanceof InputVideoTrack)) {\n throw new TypeError('videoTrack must be an InputVideoTrack.');\n }\n if (options && typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.width !== undefined && (!Number.isInteger(options.width) || options.width <= 0)) {\n throw new TypeError('options.width, when defined, must be a positive integer.');\n }\n if (options.height !== undefined && (!Number.isInteger(options.height) || options.height <= 0)) {\n throw new TypeError('options.height, when defined, must be a positive integer.');\n }\n if (options.fit !== undefined && !['fill', 'contain', 'cover'].includes(options.fit)) {\n throw new TypeError('options.fit, when provided, must be one of \"fill\", \"contain\", or \"cover\".');\n }\n if (options.width !== undefined\n && options.height !== undefined\n && options.fit === undefined) {\n throw new TypeError('When both options.width and options.height are provided, options.fit must also be provided.');\n }\n if (options.rotation !== undefined && ![0, 90, 180, 270].includes(options.rotation)) {\n throw new TypeError('options.rotation, when provided, must be 0, 90, 180 or 270.');\n }\n if (options.poolSize !== undefined\n && (typeof options.poolSize !== 'number' || !Number.isInteger(options.poolSize) || options.poolSize < 0)) {\n throw new TypeError('poolSize must be a non-negative integer.');\n }\n const rotation = options.rotation ?? videoTrack.rotation;\n let [width, height] = rotation % 180 === 0\n ? [videoTrack.codedWidth, videoTrack.codedHeight]\n : [videoTrack.codedHeight, videoTrack.codedWidth];\n const originalAspectRatio = width / height;\n // If width and height aren't defined together, deduce the missing value using the aspect ratio\n if (options.width !== undefined && options.height === undefined) {\n width = options.width;\n height = Math.round(width / originalAspectRatio);\n }\n else if (options.width === undefined && options.height !== undefined) {\n height = options.height;\n width = Math.round(height * originalAspectRatio);\n }\n else if (options.width !== undefined && options.height !== undefined) {\n width = options.width;\n height = options.height;\n }\n this._videoTrack = videoTrack;\n this._width = width;\n this._height = height;\n this._rotation = rotation;\n this._fit = options.fit ?? 'fill';\n this._videoSampleSink = new VideoSampleSink(videoTrack);\n this._canvasPool = Array.from({ length: options.poolSize ?? 0 }, () => null);\n }\n /** @internal */\n _videoSampleToWrappedCanvas(sample) {\n let canvas = this._canvasPool[this._nextCanvasIndex];\n if (!canvas) {\n if (typeof document !== 'undefined') {\n // Prefer an HTMLCanvasElement\n canvas = document.createElement('canvas');\n canvas.width = this._width;\n canvas.height = this._height;\n }\n else {\n canvas = new OffscreenCanvas(this._width, this._height);\n }\n if (this._canvasPool.length > 0) {\n this._canvasPool[this._nextCanvasIndex] = canvas;\n }\n }\n if (this._canvasPool.length > 0) {\n this._nextCanvasIndex = (this._nextCanvasIndex + 1) % this._canvasPool.length;\n }\n const context = canvas.getContext('2d', { alpha: false });\n assert(context);\n context.resetTransform();\n // These variables specify where the final sample will be drawn on the canvas\n let dx;\n let dy;\n let newWidth;\n let newHeight;\n if (this._fit === 'fill') {\n dx = 0;\n dy = 0;\n newWidth = this._width;\n newHeight = this._height;\n }\n else {\n const [sampleWidth, sampleHeight] = this._rotation % 180 === 0\n ? [sample.codedWidth, sample.codedHeight]\n : [sample.codedHeight, sample.codedWidth];\n const scale = this._fit === 'contain'\n ? Math.min(this._width / sampleWidth, this._height / sampleHeight)\n : Math.max(this._width / sampleWidth, this._height / sampleHeight);\n newWidth = sampleWidth * scale;\n newHeight = sampleHeight * scale;\n dx = (this._width - newWidth) / 2;\n dy = (this._height - newHeight) / 2;\n }\n const aspectRatioChange = this._rotation % 180 === 0 ? 1 : newWidth / newHeight;\n context.translate(this._width / 2, this._height / 2);\n context.rotate(this._rotation * Math.PI / 180);\n // This aspect ratio compensation is done so that we can draw the sample with the intended dimensions and\n // don't need to think about how those dimensions change after the rotation\n context.scale(1 / aspectRatioChange, aspectRatioChange);\n context.translate(-this._width / 2, -this._height / 2);\n context.drawImage(sample.toCanvasImageSource(), dx, dy, newWidth, newHeight);\n const result = {\n canvas,\n timestamp: sample.timestamp,\n duration: sample.duration,\n };\n sample.close();\n return result;\n }\n /**\n * Retrieves a canvas with the video frame corresponding to the given timestamp, in seconds. More specifically,\n * returns the last video frame (in presentation order) with a start timestamp less than or equal to the given\n * timestamp. Returns null if the timestamp is before the track's first timestamp.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getCanvas(timestamp) {\n validateTimestamp(timestamp);\n const sample = await this._videoSampleSink.getSample(timestamp);\n return sample && this._videoSampleToWrappedCanvas(sample);\n }\n /**\n * Creates an async iterator that yields canvases with the video frames of this track in presentation order. This\n * method will intelligently pre-decode a few frames ahead to enable fast iteration.\n *\n * @param startTimestamp - The timestamp in seconds at which to start yielding canvases (inclusive).\n * @param endTimestamp - The timestamp in seconds at which to stop yielding canvases (exclusive).\n */\n canvases(startTimestamp = 0, endTimestamp = Infinity) {\n return mapAsyncGenerator(this._videoSampleSink.samples(startTimestamp, endTimestamp), sample => this._videoSampleToWrappedCanvas(sample));\n }\n /**\n * Creates an async iterator that yields a canvas for each timestamp in the argument. This method uses an optimized\n * decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most once, and is\n * therefore more efficient than manually getting the canvas for every timestamp. The iterator may yield null if\n * no frame is available for a given timestamp.\n *\n * @param timestamps - An iterable or async iterable of timestamps in seconds.\n */\n canvasesAtTimestamps(timestamps) {\n return mapAsyncGenerator(this._videoSampleSink.samplesAtTimestamps(timestamps), sample => sample && this._videoSampleToWrappedCanvas(sample));\n }\n}\nclass AudioDecoderWrapper extends DecoderWrapper {\n constructor(onSample, onError, codec, decoderConfig) {\n super(onSample, onError);\n this.decoder = null;\n this.customDecoder = null;\n this.customDecoderCallSerializer = new CallSerializer();\n this.customDecoderQueueSize = 0;\n const sampleHandler = (sample) => {\n const sampleRate = decoderConfig.sampleRate;\n // Round the timestamp to the sample rate\n sample.setTimestamp(Math.round(sample.timestamp * sampleRate) / sampleRate);\n onSample(sample);\n };\n const MatchingCustomDecoder = customAudioDecoders.find(x => x.supports(codec, decoderConfig));\n if (MatchingCustomDecoder) {\n // @ts-expect-error \"Can't create instance of abstract class \uD83E\uDD13\"\n this.customDecoder = new MatchingCustomDecoder();\n // @ts-expect-error It's technically readonly\n this.customDecoder.codec = codec;\n // @ts-expect-error It's technically readonly\n this.customDecoder.config = decoderConfig;\n // @ts-expect-error It's technically readonly\n this.customDecoder.onSample = (sample) => {\n if (!(sample instanceof AudioSample)) {\n throw new TypeError('The argument passed to onSample must be an AudioSample.');\n }\n sampleHandler(sample);\n };\n void this.customDecoderCallSerializer.call(() => this.customDecoder.init());\n }\n else {\n this.decoder = new AudioDecoder({\n output: data => sampleHandler(new AudioSample(data)),\n error: onError,\n });\n this.decoder.configure(decoderConfig);\n }\n }\n getDecodeQueueSize() {\n if (this.customDecoder) {\n return this.customDecoderQueueSize;\n }\n else {\n assert(this.decoder);\n return this.decoder.decodeQueueSize;\n }\n }\n decode(packet) {\n if (this.customDecoder) {\n this.customDecoderQueueSize++;\n void this.customDecoderCallSerializer\n .call(() => this.customDecoder.decode(packet))\n .then(() => this.customDecoderQueueSize--);\n }\n else {\n assert(this.decoder);\n this.decoder.decode(packet.toEncodedAudioChunk());\n }\n }\n flush() {\n if (this.customDecoder) {\n return this.customDecoderCallSerializer.call(() => this.customDecoder.flush());\n }\n else {\n assert(this.decoder);\n return this.decoder.flush();\n }\n }\n close() {\n if (this.customDecoder) {\n void this.customDecoderCallSerializer.call(() => this.customDecoder.close());\n }\n else {\n assert(this.decoder);\n this.decoder.close();\n }\n }\n}\n// There are a lot of PCM variants not natively supported by the browser and by AudioData. Therefore we need a simple\n// decoder that maps any input PCM format into a PCM format supported by the browser.\nclass PcmAudioDecoderWrapper extends DecoderWrapper {\n constructor(onSample, onError, decoderConfig) {\n super(onSample, onError);\n this.decoderConfig = decoderConfig;\n // Internal state to accumulate a precise current timestamp based on audio durations, not the (potentially\n // inaccurate) sample timestamps.\n this.currentTimestamp = null;\n assert(PCM_AUDIO_CODECS.includes(decoderConfig.codec));\n this.codec = decoderConfig.codec;\n const { dataType, sampleSize, littleEndian } = parsePcmCodec(this.codec);\n this.inputSampleSize = sampleSize;\n switch (sampleSize) {\n case 1:\n {\n if (dataType === 'unsigned') {\n this.readInputValue = (view, byteOffset) => view.getUint8(byteOffset) - 2 ** 7;\n }\n else if (dataType === 'signed') {\n this.readInputValue = (view, byteOffset) => view.getInt8(byteOffset);\n }\n else if (dataType === 'ulaw') {\n this.readInputValue = (view, byteOffset) => fromUlaw(view.getUint8(byteOffset));\n }\n else if (dataType === 'alaw') {\n this.readInputValue = (view, byteOffset) => fromAlaw(view.getUint8(byteOffset));\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n case 2:\n {\n if (dataType === 'unsigned') {\n this.readInputValue = (view, byteOffset) => view.getUint16(byteOffset, littleEndian) - 2 ** 15;\n }\n else if (dataType === 'signed') {\n this.readInputValue = (view, byteOffset) => view.getInt16(byteOffset, littleEndian);\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n case 3:\n {\n if (dataType === 'unsigned') {\n this.readInputValue = (view, byteOffset) => getUint24(view, byteOffset, littleEndian) - 2 ** 23;\n }\n else if (dataType === 'signed') {\n this.readInputValue = (view, byteOffset) => getInt24(view, byteOffset, littleEndian);\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n case 4:\n {\n if (dataType === 'unsigned') {\n this.readInputValue = (view, byteOffset) => view.getUint32(byteOffset, littleEndian) - 2 ** 31;\n }\n else if (dataType === 'signed') {\n this.readInputValue = (view, byteOffset) => view.getInt32(byteOffset, littleEndian);\n }\n else if (dataType === 'float') {\n this.readInputValue = (view, byteOffset) => view.getFloat32(byteOffset, littleEndian);\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n case 8:\n {\n if (dataType === 'float') {\n this.readInputValue = (view, byteOffset) => view.getFloat64(byteOffset, littleEndian);\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n default:\n {\n assertNever(sampleSize);\n assert(false);\n }\n ;\n }\n switch (sampleSize) {\n case 1:\n {\n if (dataType === 'ulaw' || dataType === 'alaw') {\n this.outputSampleSize = 2;\n this.outputFormat = 's16';\n this.writeOutputValue = (view, byteOffset, value) => view.setInt16(byteOffset, value, true);\n }\n else {\n this.outputSampleSize = 1;\n this.outputFormat = 'u8';\n this.writeOutputValue = (view, byteOffset, value) => view.setUint8(byteOffset, value + 2 ** 7);\n }\n }\n ;\n break;\n case 2:\n {\n this.outputSampleSize = 2;\n this.outputFormat = 's16';\n this.writeOutputValue = (view, byteOffset, value) => view.setInt16(byteOffset, value, true);\n }\n ;\n break;\n case 3:\n {\n this.outputSampleSize = 4;\n this.outputFormat = 's32';\n // From https://www.w3.org/TR/webcodecs:\n // AudioData containing 24-bit samples SHOULD store those samples in s32 or f32. When samples are\n // stored in s32, each sample MUST be left-shifted by 8 bits.\n this.writeOutputValue = (view, byteOffset, value) => view.setInt32(byteOffset, value << 8, true);\n }\n ;\n break;\n case 4:\n {\n this.outputSampleSize = 4;\n if (dataType === 'float') {\n this.outputFormat = 'f32';\n this.writeOutputValue = (view, byteOffset, value) => view.setFloat32(byteOffset, value, true);\n }\n else {\n this.outputFormat = 's32';\n this.writeOutputValue = (view, byteOffset, value) => view.setInt32(byteOffset, value, true);\n }\n }\n ;\n break;\n case 8:\n {\n this.outputSampleSize = 4;\n this.outputFormat = 'f32';\n this.writeOutputValue = (view, byteOffset, value) => view.setFloat32(byteOffset, value, true);\n }\n ;\n break;\n default:\n {\n assertNever(sampleSize);\n assert(false);\n }\n ;\n }\n ;\n }\n getDecodeQueueSize() {\n return 0;\n }\n decode(packet) {\n const inputView = toDataView(packet.data);\n const numberOfFrames = packet.byteLength / this.decoderConfig.numberOfChannels / this.inputSampleSize;\n const outputBufferSize = numberOfFrames * this.decoderConfig.numberOfChannels * this.outputSampleSize;\n const outputBuffer = new ArrayBuffer(outputBufferSize);\n const outputView = new DataView(outputBuffer);\n for (let i = 0; i < numberOfFrames * this.decoderConfig.numberOfChannels; i++) {\n const inputIndex = i * this.inputSampleSize;\n const outputIndex = i * this.outputSampleSize;\n const value = this.readInputValue(inputView, inputIndex);\n this.writeOutputValue(outputView, outputIndex, value);\n }\n const preciseDuration = numberOfFrames / this.decoderConfig.sampleRate;\n if (this.currentTimestamp === null || Math.abs(packet.timestamp - this.currentTimestamp) >= preciseDuration) {\n // We need to sync with the packet timestamp again\n this.currentTimestamp = packet.timestamp;\n }\n const preciseTimestamp = this.currentTimestamp;\n this.currentTimestamp += preciseDuration;\n const audioSample = new AudioSample({\n format: this.outputFormat,\n data: outputBuffer,\n numberOfChannels: this.decoderConfig.numberOfChannels,\n sampleRate: this.decoderConfig.sampleRate,\n numberOfFrames,\n timestamp: preciseTimestamp,\n });\n this.onSample(audioSample);\n }\n async flush() {\n // Do nothing\n }\n close() {\n // Do nothing\n }\n}\n/**\n * Sink for retrieving decoded audio samples from an audio track.\n * @public\n */\nexport class AudioSampleSink extends BaseMediaSampleSink {\n constructor(audioTrack) {\n if (!(audioTrack instanceof InputAudioTrack)) {\n throw new TypeError('audioTrack must be an InputAudioTrack.');\n }\n super();\n this._audioTrack = audioTrack;\n }\n /** @internal */\n async _createDecoder(onSample, onError) {\n if (!(await this._audioTrack.canDecode())) {\n throw new Error('This audio track cannot be decoded by this browser. Make sure to check decodability before using'\n + ' a track.');\n }\n const codec = this._audioTrack.codec;\n const decoderConfig = await this._audioTrack.getDecoderConfig();\n assert(codec && decoderConfig);\n if (PCM_AUDIO_CODECS.includes(decoderConfig.codec)) {\n return new PcmAudioDecoderWrapper(onSample, onError, decoderConfig);\n }\n else {\n return new AudioDecoderWrapper(onSample, onError, codec, decoderConfig);\n }\n }\n /** @internal */\n _createPacketSink() {\n return new EncodedPacketSink(this._audioTrack);\n }\n /**\n * Retrieves the audio sample corresponding to the given timestamp, in seconds. More specifically, returns\n * the last audio sample (in presentation order) with a start timestamp less than or equal to the given timestamp.\n * Returns null if the timestamp is before the track's first timestamp.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getSample(timestamp) {\n validateTimestamp(timestamp);\n for await (const sample of this.mediaSamplesAtTimestamps([timestamp])) {\n return sample;\n }\n throw new Error('Internal error: Iterator returned nothing.');\n }\n /**\n * Creates an async iterator that yields the audio samples of this track in presentation order. This method\n * will intelligently pre-decode a few samples ahead to enable fast iteration.\n *\n * @param startTimestamp - The timestamp in seconds at which to start yielding samples (inclusive).\n * @param endTimestamp - The timestamp in seconds at which to stop yielding samples (exclusive).\n */\n samples(startTimestamp = 0, endTimestamp = Infinity) {\n return this.mediaSamplesInRange(startTimestamp, endTimestamp);\n }\n /**\n * Creates an async iterator that yields an audio sample for each timestamp in the argument. This method\n * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most\n * once, and is therefore more efficient than manually getting the sample for every timestamp. The iterator may\n * yield null if no sample is available for a given timestamp.\n *\n * @param timestamps - An iterable or async iterable of timestamps in seconds.\n */\n samplesAtTimestamps(timestamps) {\n return this.mediaSamplesAtTimestamps(timestamps);\n }\n}\n/**\n * A sink that retrieves decoded audio samples from an audio track and converts them to AudioBuffers. This is often\n * more useful than directly retrieving audio samples, as AudioBuffers can be directly used with the Web Audio API.\n * @public\n */\nexport class AudioBufferSink {\n constructor(audioTrack) {\n if (!(audioTrack instanceof InputAudioTrack)) {\n throw new TypeError('audioTrack must be an InputAudioTrack.');\n }\n this._audioSampleSink = new AudioSampleSink(audioTrack);\n }\n /** @internal */\n _audioSampleToWrappedArrayBuffer(sample) {\n return {\n buffer: sample.toAudioBuffer(),\n timestamp: sample.timestamp,\n duration: sample.duration,\n };\n }\n /**\n * Retrieves the audio buffer corresponding to the given timestamp, in seconds. More specifically, returns\n * the last audio buffer (in presentation order) with a start timestamp less than or equal to the given timestamp.\n * Returns null if the timestamp is before the track's first timestamp.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getBuffer(timestamp) {\n validateTimestamp(timestamp);\n const data = await this._audioSampleSink.getSample(timestamp);\n return data && this._audioSampleToWrappedArrayBuffer(data);\n }\n /**\n * Creates an async iterator that yields audio buffers of this track in presentation order. This method\n * will intelligently pre-decode a few buffers ahead to enable fast iteration.\n *\n * @param startTimestamp - The timestamp in seconds at which to start yielding buffers (inclusive).\n * @param endTimestamp - The timestamp in seconds at which to stop yielding buffers (exclusive).\n */\n buffers(startTimestamp = 0, endTimestamp = Infinity) {\n return mapAsyncGenerator(this._audioSampleSink.samples(startTimestamp, endTimestamp), data => this._audioSampleToWrappedArrayBuffer(data));\n }\n /**\n * Creates an async iterator that yields an audio buffer for each timestamp in the argument. This method\n * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most\n * once, and is therefore more efficient than manually getting the buffer for every timestamp. The iterator may\n * yield null if no buffer is available for a given timestamp.\n *\n * @param timestamps - An iterable or async iterable of timestamps in seconds.\n */\n buffersAtTimestamps(timestamps) {\n return mapAsyncGenerator(this._audioSampleSink.samplesAtTimestamps(timestamps), data => data && this._audioSampleToWrappedArrayBuffer(data));\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { customAudioDecoders, customVideoDecoders } from './custom-coder.js';\nimport { EncodedPacketSink } from './media-sink.js';\nimport { assert } from './misc.js';\n/**\n * Represents a media track in an input file.\n * @public\n */\nexport class InputTrack {\n /** @internal */\n constructor(backing) {\n this._backing = backing;\n }\n /** Returns true iff this track is a video track. */\n isVideoTrack() {\n return this instanceof InputVideoTrack;\n }\n /** Returns true iff this track is an audio track. */\n isAudioTrack() {\n return this instanceof InputAudioTrack;\n }\n /** The unique ID of this track in the input file. */\n get id() {\n return this._backing.getId();\n }\n /** The ISO 639-2/T language code for this track. If the language is unknown, this field is 'und' (undetermined). */\n get languageCode() {\n return this._backing.getLanguageCode();\n }\n /**\n * A positive number x such that all timestamps and durations of all packets of this track are\n * integer multiples of 1/x.\n */\n get timeResolution() {\n return this._backing.getTimeResolution();\n }\n /**\n * Returns the start timestamp of the first packet of this track, in seconds. While often near zero, this value\n * may be positive or even negative. A negative starting timestamp means the track's timing has been offset. Samples\n * with a negative timestamp should not be presented.\n */\n getFirstTimestamp() {\n return this._backing.getFirstTimestamp();\n }\n /** Returns the end timestamp of the last packet of this track, in seconds. */\n computeDuration() {\n return this._backing.computeDuration();\n }\n /**\n * Computes aggregate packet statistics for this track, such as average packet rate or bitrate.\n *\n * @param targetPacketCount - This optional parameter sets a target for how many packets this method must have\n * looked at before it can return early; this means, you can use it to aggregate only a subset (prefix) of all\n * packets. This is very useful for getting a great estimate of video frame rate without having to scan through the\n * entire file.\n */\n async computePacketStats(targetPacketCount = Infinity) {\n const sink = new EncodedPacketSink(this);\n let startTimestamp = Infinity;\n let endTimestamp = -Infinity;\n let packetCount = 0;\n let totalPacketBytes = 0;\n for await (const packet of sink.packets(undefined, undefined, { metadataOnly: true })) {\n if (packetCount >= targetPacketCount\n // This additional condition is needed to produce correct results with out-of-presentation-order packets\n && packet.timestamp >= endTimestamp) {\n break;\n }\n startTimestamp = Math.min(startTimestamp, packet.timestamp);\n endTimestamp = Math.max(endTimestamp, packet.timestamp + packet.duration);\n packetCount++;\n totalPacketBytes += packet.byteLength;\n }\n return {\n packetCount,\n averagePacketRate: packetCount\n ? Number((packetCount / (endTimestamp - startTimestamp)).toPrecision(16))\n : 0,\n averageBitrate: packetCount\n ? Number((8 * totalPacketBytes / (endTimestamp - startTimestamp)).toPrecision(16))\n : 0,\n };\n }\n}\n/**\n * Represents a video track in an input file.\n * @public\n */\nexport class InputVideoTrack extends InputTrack {\n /** @internal */\n constructor(backing) {\n super(backing);\n this._backing = backing;\n }\n get type() {\n return 'video';\n }\n get codec() {\n return this._backing.getCodec();\n }\n /** The width in pixels of the track's coded samples, before any transformations or rotations. */\n get codedWidth() {\n return this._backing.getCodedWidth();\n }\n /** The height in pixels of the track's coded samples, before any transformations or rotations. */\n get codedHeight() {\n return this._backing.getCodedHeight();\n }\n /** The angle in degrees by which the track's frames should be rotated (clockwise). */\n get rotation() {\n return this._backing.getRotation();\n }\n /** The width in pixels of the track's frames after rotation. */\n get displayWidth() {\n const rotation = this._backing.getRotation();\n return rotation % 180 === 0 ? this._backing.getCodedWidth() : this._backing.getCodedHeight();\n }\n /** The height in pixels of the track's frames after rotation. */\n get displayHeight() {\n const rotation = this._backing.getRotation();\n return rotation % 180 === 0 ? this._backing.getCodedHeight() : this._backing.getCodedWidth();\n }\n /** Returns the color space of the track's samples. */\n getColorSpace() {\n return this._backing.getColorSpace();\n }\n /** If this method returns true, the track's samples use a high dynamic range (HDR). */\n async hasHighDynamicRange() {\n const colorSpace = await this._backing.getColorSpace();\n return colorSpace.primaries === 'bt2020' || colorSpace.primaries === 'smpte432'\n || colorSpace.transfer === 'pg' || colorSpace.transfer === 'hlg'\n || colorSpace.matrix === 'bt2020-ncl';\n }\n /** Returns the decoder configuration for decoding the track's packets using a VideoDecoder. */\n getDecoderConfig() {\n return this._backing.getDecoderConfig();\n }\n async getCodecParameterString() {\n const decoderConfig = await this._backing.getDecoderConfig();\n return decoderConfig?.codec ?? null;\n }\n async canDecode() {\n try {\n const decoderConfig = await this._backing.getDecoderConfig();\n if (!decoderConfig) {\n return false;\n }\n const codec = this._backing.getCodec();\n assert(codec !== null);\n if (customVideoDecoders.some(x => x.supports(codec, decoderConfig))) {\n return true;\n }\n if (typeof VideoDecoder === 'undefined') {\n return false;\n }\n const support = await VideoDecoder.isConfigSupported(decoderConfig);\n return support.supported === true;\n }\n catch (error) {\n console.error('Error during decodability check:', error);\n return false;\n }\n }\n}\n/**\n * Represents an audio track in an input file.\n * @public\n */\nexport class InputAudioTrack extends InputTrack {\n /** @internal */\n constructor(backing) {\n super(backing);\n this._backing = backing;\n }\n get type() {\n return 'audio';\n }\n get codec() {\n return this._backing.getCodec();\n }\n /** The number of audio channels in the track. */\n get numberOfChannels() {\n return this._backing.getNumberOfChannels();\n }\n /** The track's audio sample rate in hertz. */\n get sampleRate() {\n return this._backing.getSampleRate();\n }\n /** Returns the decoder configuration for decoding the track's packets using an AudioDecoder. */\n getDecoderConfig() {\n return this._backing.getDecoderConfig();\n }\n async getCodecParameterString() {\n const decoderConfig = await this._backing.getDecoderConfig();\n return decoderConfig?.codec ?? null;\n }\n async canDecode() {\n try {\n const decoderConfig = await this._backing.getDecoderConfig();\n if (!decoderConfig) {\n return false;\n }\n const codec = this._backing.getCodec();\n assert(codec !== null);\n if (customAudioDecoders.some(x => x.supports(codec, decoderConfig))) {\n return true;\n }\n if (decoderConfig.codec.startsWith('pcm-')) {\n return true; // Since we decode it ourselves\n }\n else {\n if (typeof AudioDecoder === 'undefined') {\n return false;\n }\n const support = await AudioDecoder.isConfigSupported(decoderConfig);\n return support.supported === true;\n }\n }\n catch (error) {\n console.error('Error during decodability check:', error);\n return false;\n }\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { assert, binarySearchLessOrEqual, removeItem } from './misc.js';\nexport class Reader {\n constructor(source, maxStorableBytes = Infinity) {\n this.source = source;\n this.maxStorableBytes = maxStorableBytes;\n this.loadedSegments = [];\n this.loadingSegments = [];\n this.sourceSizePromise = null;\n this.nextAge = 0;\n this.totalStoredBytes = 0;\n }\n async loadRange(start, end) {\n end = Math.min(end, await this.source.getSize());\n if (start >= end) {\n return;\n }\n const matchingLoadingSegment = this.loadingSegments.find(x => x.start <= start && x.end >= end);\n if (matchingLoadingSegment) {\n // Simply wait for the existing promise to finish to avoid loading the same range twice\n await matchingLoadingSegment.promise;\n return;\n }\n const index = binarySearchLessOrEqual(this.loadedSegments, start, x => x.start);\n if (index !== -1) {\n for (let i = index; i < this.loadedSegments.length; i++) {\n const segment = this.loadedSegments[i];\n if (segment.start > start) {\n break;\n }\n const segmentEncasesRequestedRange = segment.end >= end;\n if (segmentEncasesRequestedRange) {\n // Nothing to load\n return;\n }\n }\n }\n this.source.onread?.(start, end);\n const bytesPromise = this.source._read(start, end);\n const loadingSegment = { start, end, promise: bytesPromise };\n this.loadingSegments.push(loadingSegment);\n const bytes = await bytesPromise;\n removeItem(this.loadingSegments, loadingSegment);\n this.insertIntoLoadedSegments(start, bytes);\n }\n rangeIsLoaded(start, end) {\n if (end <= start) {\n return true;\n }\n const index = binarySearchLessOrEqual(this.loadedSegments, start, x => x.start);\n if (index === -1) {\n return false;\n }\n for (let i = index; i < this.loadedSegments.length; i++) {\n const segment = this.loadedSegments[i];\n if (segment.start > start) {\n break;\n }\n const segmentEncasesRequestedRange = segment.end >= end;\n if (segmentEncasesRequestedRange) {\n return true;\n }\n }\n return false;\n }\n insertIntoLoadedSegments(start, bytes) {\n const segment = {\n start,\n end: start + bytes.byteLength,\n bytes,\n view: new DataView(bytes.buffer),\n age: this.nextAge++,\n };\n let index = binarySearchLessOrEqual(this.loadedSegments, start, x => x.start);\n if (index === -1 || this.loadedSegments[index].start < segment.start) {\n index++;\n }\n // Insert the segment at the right place so that the array remains sorted by start offset\n this.loadedSegments.splice(index, 0, segment);\n this.totalStoredBytes += bytes.byteLength;\n // Remove all other segments from the array that are completely covered by the newly-inserted segment\n for (let i = index + 1; i < this.loadedSegments.length; i++) {\n const otherSegment = this.loadedSegments[i];\n if (otherSegment.start >= segment.end) {\n break;\n }\n if (segment.start <= otherSegment.start && otherSegment.end <= segment.end) {\n this.loadedSegments.splice(i, 1);\n i--;\n }\n }\n // If we overshoot the max amount of permitted bytes, let's start evicting the oldest segments\n while (this.totalStoredBytes > this.maxStorableBytes && this.loadedSegments.length > 1) {\n let oldestSegment = null;\n let oldestSegmentIndex = -1;\n for (let i = 0; i < this.loadedSegments.length; i++) {\n const candidate = this.loadedSegments[i];\n if (!oldestSegment || candidate.age < oldestSegment.age) {\n oldestSegment = candidate;\n oldestSegmentIndex = i;\n }\n }\n assert(oldestSegment);\n this.totalStoredBytes -= oldestSegment.bytes.byteLength;\n this.loadedSegments.splice(oldestSegmentIndex, 1);\n }\n }\n getViewAndOffset(start, end) {\n const startIndex = binarySearchLessOrEqual(this.loadedSegments, start, x => x.start);\n let segment = null;\n if (startIndex !== -1) {\n for (let i = startIndex; i < this.loadedSegments.length; i++) {\n const candidate = this.loadedSegments[i];\n if (candidate.start > start) {\n break;\n }\n if (end <= candidate.end) {\n segment = candidate;\n break;\n }\n }\n }\n if (!segment) {\n throw new Error(`No segment loaded for range [${start}, ${end}).`);\n }\n segment.age = this.nextAge++;\n return {\n view: segment.view,\n offset: segment.bytes.byteOffset + start - segment.start,\n };\n }\n forgetRange(start, end) {\n if (end <= start) {\n return;\n }\n const startIndex = binarySearchLessOrEqual(this.loadedSegments, start, x => x.start);\n if (startIndex === -1) {\n return;\n }\n const segment = this.loadedSegments[startIndex];\n if (segment.start !== start || segment.end !== end) {\n return;\n }\n this.loadedSegments.splice(startIndex, 1);\n this.totalStoredBytes -= segment.bytes.byteLength;\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nexport class RiffReader {\n constructor(reader) {\n this.reader = reader;\n this.pos = 0;\n this.littleEndian = true;\n }\n readBytes(length) {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + length);\n this.pos += length;\n return new Uint8Array(view.buffer, offset, length);\n }\n readU16() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 2);\n this.pos += 2;\n return view.getUint16(offset, this.littleEndian);\n }\n readU32() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 4);\n this.pos += 4;\n return view.getUint32(offset, this.littleEndian);\n }\n readAscii(length) {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + length);\n this.pos += length;\n let str = '';\n for (let i = 0; i < length; i++) {\n str += String.fromCharCode(view.getUint8(offset + i));\n }\n return str;\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack } from '../input-track.js';\nimport { assert, UNDETERMINED_LANGUAGE } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { Reader } from '../reader.js';\nimport { RiffReader } from './riff-reader.js';\nexport var WaveFormat;\n(function (WaveFormat) {\n WaveFormat[WaveFormat[\"PCM\"] = 1] = \"PCM\";\n WaveFormat[WaveFormat[\"IEEE_FLOAT\"] = 3] = \"IEEE_FLOAT\";\n WaveFormat[WaveFormat[\"ALAW\"] = 6] = \"ALAW\";\n WaveFormat[WaveFormat[\"MULAW\"] = 7] = \"MULAW\";\n WaveFormat[WaveFormat[\"EXTENSIBLE\"] = 65534] = \"EXTENSIBLE\";\n})(WaveFormat || (WaveFormat = {}));\nexport class WaveDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.metadataPromise = null;\n this.dataStart = -1;\n this.dataSize = -1;\n this.audioInfo = null;\n this.tracks = [];\n this.metadataReader = new RiffReader(input._mainReader);\n this.chunkReader = new RiffReader(new Reader(input.source, 64 * 2 ** 20));\n }\n async readMetadata() {\n return this.metadataPromise ??= (async () => {\n const actualFileSize = await this.metadataReader.reader.source.getSize();\n const riffType = this.metadataReader.readAscii(4);\n this.metadataReader.littleEndian = riffType === 'RIFF';\n const totalFileSize = Math.min(this.metadataReader.readU32() + 8, actualFileSize);\n const format = this.metadataReader.readAscii(4);\n if (format !== 'WAVE') {\n throw new Error('Invalid WAVE file - wrong format');\n }\n this.metadataReader.pos = 12;\n while (this.metadataReader.pos < totalFileSize) {\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + 8);\n const chunkId = this.metadataReader.readAscii(4);\n const chunkSize = this.metadataReader.readU32();\n const startPos = this.metadataReader.pos;\n if (chunkId === 'fmt ') {\n await this.parseFmtChunk(chunkSize);\n }\n else if (chunkId === 'data') {\n this.dataStart = this.metadataReader.pos;\n this.dataSize = Math.min(chunkSize, totalFileSize - this.dataStart);\n }\n this.metadataReader.pos = startPos + chunkSize + (chunkSize & 1); // Handle padding\n }\n if (!this.audioInfo) {\n throw new Error('Invalid WAVE file - missing \"fmt \" chunk');\n }\n if (this.dataStart === -1) {\n throw new Error('Invalid WAVE file - missing \"data\" chunk');\n }\n const blockSize = this.audioInfo.blockSizeInBytes;\n this.dataSize = Math.floor(this.dataSize / blockSize) * blockSize;\n this.tracks.push(new InputAudioTrack(new WaveAudioTrackBacking(this)));\n })();\n }\n async parseFmtChunk(size) {\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + size);\n let formatTag = this.metadataReader.readU16();\n const numChannels = this.metadataReader.readU16();\n const sampleRate = this.metadataReader.readU32();\n this.metadataReader.pos += 4; // Bytes per second\n const blockAlign = this.metadataReader.readU16();\n let bitsPerSample;\n if (size === 14) { // Plain WAVEFORMAT\n bitsPerSample = 8;\n }\n else {\n bitsPerSample = this.metadataReader.readU16();\n }\n // Handle WAVEFORMATEXTENSIBLE\n if (size >= 18 && formatTag !== 0x0165) {\n const cbSize = this.metadataReader.readU16();\n const remainingSize = size - 18;\n const extensionSize = Math.min(remainingSize, cbSize);\n if (extensionSize >= 22 && formatTag === WaveFormat.EXTENSIBLE) {\n // Parse WAVEFORMATEXTENSIBLE\n this.metadataReader.pos += 2 + 4;\n const subFormat = this.metadataReader.readBytes(16);\n // Get actual format from subFormat GUID\n formatTag = subFormat[0] | (subFormat[1] << 8);\n }\n }\n if (formatTag === WaveFormat.MULAW || formatTag === WaveFormat.ALAW) {\n bitsPerSample = 8;\n }\n this.audioInfo = {\n format: formatTag,\n numberOfChannels: numChannels,\n sampleRate,\n sampleSizeInBytes: Math.ceil(bitsPerSample / 8),\n blockSizeInBytes: blockAlign,\n };\n }\n getCodec() {\n assert(this.audioInfo);\n if (this.audioInfo.format === WaveFormat.MULAW) {\n return 'ulaw';\n }\n if (this.audioInfo.format === WaveFormat.ALAW) {\n return 'alaw';\n }\n if (this.audioInfo.format === WaveFormat.PCM) {\n // All formats are little-endian\n if (this.audioInfo.sampleSizeInBytes === 1) {\n return 'pcm-u8';\n }\n else if (this.audioInfo.sampleSizeInBytes === 2) {\n return 'pcm-s16';\n }\n else if (this.audioInfo.sampleSizeInBytes === 3) {\n return 'pcm-s24';\n }\n else if (this.audioInfo.sampleSizeInBytes === 4) {\n return 'pcm-s32';\n }\n }\n if (this.audioInfo.format === WaveFormat.IEEE_FLOAT) {\n if (this.audioInfo.sampleSizeInBytes === 4) {\n return 'pcm-f32';\n }\n }\n return null;\n }\n async getMimeType() {\n return 'audio/wav';\n }\n async computeDuration() {\n await this.readMetadata();\n assert(this.audioInfo);\n const numberOfBlocks = this.dataSize / this.audioInfo.blockSizeInBytes;\n return numberOfBlocks / this.audioInfo.sampleRate;\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks;\n }\n}\nconst PACKET_SIZE_IN_FRAMES = 2048;\nclass WaveAudioTrackBacking {\n constructor(demuxer) {\n this.demuxer = demuxer;\n }\n getId() {\n return 1;\n }\n getCodec() {\n return this.demuxer.getCodec();\n }\n async getDecoderConfig() {\n const codec = this.demuxer.getCodec();\n if (!codec) {\n return null;\n }\n assert(this.demuxer.audioInfo);\n return {\n codec,\n numberOfChannels: this.demuxer.audioInfo.numberOfChannels,\n sampleRate: this.demuxer.audioInfo.sampleRate,\n };\n }\n computeDuration() {\n return this.demuxer.computeDuration();\n }\n getNumberOfChannels() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.numberOfChannels;\n }\n getSampleRate() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.sampleRate;\n }\n getTimeResolution() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.sampleRate;\n }\n getLanguageCode() {\n return UNDETERMINED_LANGUAGE;\n }\n async getFirstTimestamp() {\n return 0;\n }\n async getPacketAtIndex(packetIndex, options) {\n assert(this.demuxer.audioInfo);\n const startOffset = packetIndex * PACKET_SIZE_IN_FRAMES * this.demuxer.audioInfo.blockSizeInBytes;\n if (startOffset >= this.demuxer.dataSize) {\n return null;\n }\n const sizeInBytes = Math.min(PACKET_SIZE_IN_FRAMES * this.demuxer.audioInfo.blockSizeInBytes, this.demuxer.dataSize - startOffset);\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n const sizeOfOnePacket = PACKET_SIZE_IN_FRAMES * this.demuxer.audioInfo.blockSizeInBytes;\n const chunkSize = Math.ceil(2 ** 19 / sizeOfOnePacket) * sizeOfOnePacket;\n const chunkStart = Math.floor(startOffset / chunkSize) * chunkSize;\n const chunkEnd = chunkStart + chunkSize;\n // Always load large 0.5 MiB chunks instead of just the required packet\n await this.demuxer.chunkReader.reader.loadRange(this.demuxer.dataStart + chunkStart, this.demuxer.dataStart + chunkEnd);\n this.demuxer.chunkReader.pos = this.demuxer.dataStart + startOffset;\n data = this.demuxer.chunkReader.readBytes(sizeInBytes);\n }\n const timestamp = packetIndex * PACKET_SIZE_IN_FRAMES / this.demuxer.audioInfo.sampleRate;\n const duration = sizeInBytes / this.demuxer.audioInfo.blockSizeInBytes / this.demuxer.audioInfo.sampleRate;\n return new EncodedPacket(data, 'key', timestamp, duration, packetIndex, sizeInBytes);\n }\n getFirstPacket(options) {\n return this.getPacketAtIndex(0, options);\n }\n getPacket(timestamp, options) {\n assert(this.demuxer.audioInfo);\n const packetIndex = Math.floor(timestamp * this.demuxer.audioInfo.sampleRate / PACKET_SIZE_IN_FRAMES);\n return this.getPacketAtIndex(packetIndex, options);\n }\n getNextPacket(packet, options) {\n assert(this.demuxer.audioInfo);\n const packetIndex = Math.round(packet.timestamp * this.demuxer.audioInfo.sampleRate / PACKET_SIZE_IN_FRAMES);\n return this.getPacketAtIndex(packetIndex + 1, options);\n }\n getKeyPacket(timestamp, options) {\n return this.getPacket(timestamp, options);\n }\n getNextKeyPacket(packet, options) {\n return this.getNextPacket(packet, options);\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { mergeObjectsDeeply, retriedFetch } from './misc.js';\n/**\n * The source base class, representing a resource from which bytes can be read.\n * @public\n */\nexport class Source {\n constructor() {\n /** @internal */\n this._sizePromise = null;\n /** Called each time data is requested from the source. */\n this.onread = null;\n }\n /**\n * Resolves with the total size of the file in bytes. This function is memoized, meaning only the first call\n * will retrieve the size.\n */\n getSize() {\n return this._sizePromise ??= this._retrieveSize();\n }\n}\n/**\n * A source backed by an ArrayBuffer or ArrayBufferView, with the entire file held in memory.\n * @public\n */\nexport class BufferSource extends Source {\n constructor(buffer) {\n if (!(buffer instanceof ArrayBuffer) && !(buffer instanceof Uint8Array)) {\n throw new TypeError('buffer must be an ArrayBuffer or Uint8Array.');\n }\n super();\n this._bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n }\n /** @internal */\n async _read(start, end) {\n return this._bytes.subarray(start, end);\n }\n /** @internal */\n async _retrieveSize() {\n return this._bytes.byteLength;\n }\n}\n/**\n * A general-purpose, callback-driven source that can get its data from anywhere.\n * @public\n */\nexport class StreamSource extends Source {\n constructor(options) {\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (typeof options.read !== 'function') {\n throw new TypeError('options.read must be a function.');\n }\n if (typeof options.getSize !== 'function') {\n throw new TypeError('options.getSize must be a function.');\n }\n super();\n this._options = options;\n }\n /** @internal */\n async _read(start, end) {\n return this._options.read(start, end);\n }\n /** @internal */\n async _retrieveSize() {\n return this._options.getSize();\n }\n}\n/**\n * A source backed by a Blob. Since Files are also Blobs, this is the source to use when reading files off the disk.\n * @public\n */\nexport class BlobSource extends Source {\n constructor(blob) {\n if (!(blob instanceof Blob)) {\n throw new TypeError('blob must be a Blob.');\n }\n super();\n this._blob = blob;\n }\n /** @internal */\n async _read(start, end) {\n const slice = this._blob.slice(start, end);\n const buffer = await slice.arrayBuffer();\n return new Uint8Array(buffer);\n }\n /** @internal */\n async _retrieveSize() {\n return this._blob.size;\n }\n}\n/**\n * A source backed by a URL. This is useful for reading data from the network. Be careful using this source however,\n * as it typically comes with increased latency.\n * @beta\n */\nexport class UrlSource extends Source {\n constructor(url, options = {}) {\n if (typeof url !== 'string' && !(url instanceof URL)) {\n throw new TypeError('url must be a string or URL.');\n }\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.requestInit !== undefined && (!options.requestInit || typeof options.requestInit !== 'object')) {\n throw new TypeError('options.requestInit, when provided, must be an object.');\n }\n if (options.getRetryDelay !== undefined && typeof options.getRetryDelay !== 'function') {\n throw new TypeError('options.getRetryDelay, when provided, must be a function.');\n }\n super();\n /** @internal */\n this._fullData = null;\n this._url = url;\n this._options = options;\n }\n /** @internal */\n async _makeRequest(range) {\n const headers = {};\n if (range) {\n headers['Range'] = `bytes=${range.start}-${range.end - 1}`;\n }\n const response = await retriedFetch(this._url, mergeObjectsDeeply(this._options.requestInit ?? {}, {\n method: 'GET',\n headers,\n }), this._options.getRetryDelay ?? (() => null));\n if (!response.ok) {\n throw new Error(`Error fetching ${this._url}: ${response.status} ${response.statusText}`);\n }\n const buffer = await response.arrayBuffer();\n if (!range) {\n this._fullData = buffer;\n }\n return {\n response: buffer,\n statusCode: response.status,\n };\n }\n /** @internal */\n async _read(start, end) {\n if (this._fullData) {\n return new Uint8Array(this._fullData, start, end - start);\n }\n const { response, statusCode } = await this._makeRequest({ start, end });\n // If server doesn't support range requests, it will return 200 instead of 206. In that case, let's manually\n // slice the response.\n if (statusCode === 200) {\n const fullData = new Uint8Array(response);\n return fullData.subarray(start, end);\n }\n return new Uint8Array(response);\n }\n /** @internal */\n async _retrieveSize() {\n if (this._fullData) {\n return this._fullData.byteLength;\n }\n // Try a range request to get the Content-Range header\n const rangeResponse = await retriedFetch(this._url, mergeObjectsDeeply(this._options.requestInit ?? {}, {\n method: 'GET',\n headers: { Range: 'bytes=0-0' },\n }), this._options.getRetryDelay ?? (() => null));\n if (rangeResponse.status === 206) {\n const contentRange = rangeResponse.headers.get('Content-Range');\n if (contentRange) {\n const match = contentRange.match(/bytes \\d+-\\d+\\/(\\d+)/);\n if (match && match[1]) {\n return parseInt(match[1], 10);\n }\n }\n }\n // If the range request didn't provide the size, make a full GET request\n const { response } = await this._makeRequest();\n return response.byteLength;\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nexport const MIN_BOX_HEADER_SIZE = 8;\nexport const MAX_BOX_HEADER_SIZE = 16;\nexport class IsobmffReader {\n constructor(reader) {\n this.reader = reader;\n this.pos = 0;\n }\n readBytes(length) {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + length);\n this.pos += length;\n return new Uint8Array(view.buffer, offset, length);\n }\n readU8() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 1);\n this.pos++;\n return view.getUint8(offset);\n }\n readU16() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 2);\n this.pos += 2;\n return view.getUint16(offset, false);\n }\n readI16() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 2);\n this.pos += 2;\n return view.getInt16(offset, false);\n }\n readU24() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 3);\n this.pos += 3;\n const high = view.getUint16(offset, false);\n const low = view.getUint8(offset + 2);\n return high * 0x100 + low;\n }\n readU32() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 4);\n this.pos += 4;\n return view.getUint32(offset, false);\n }\n readI32() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 4);\n this.pos += 4;\n return view.getInt32(offset, false);\n }\n readU64() {\n const high = this.readU32();\n const low = this.readU32();\n return high * 0x100000000 + low;\n }\n readI64() {\n const high = this.readI32();\n const low = this.readU32();\n return high * 0x100000000 + low;\n }\n readF64() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 8);\n this.pos += 8;\n return view.getFloat64(offset, false);\n }\n readFixed_16_16() {\n return this.readI32() / 0x10000;\n }\n readFixed_2_30() {\n return this.readI32() / 0x40000000;\n }\n readAscii(length) {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + length);\n this.pos += length;\n let str = '';\n for (let i = 0; i < length; i++) {\n str += String.fromCharCode(view.getUint8(offset + i));\n }\n return str;\n }\n readIsomVariableInteger() {\n let result = 0;\n for (let i = 0; i < 4; i++) {\n result <<= 7;\n const nextByte = this.readU8();\n result |= nextByte & 0x7f;\n if ((nextByte & 0x80) === 0) {\n break;\n }\n }\n return result;\n }\n readBoxHeader() {\n let totalSize = this.readU32();\n const name = this.readAscii(4);\n let headerSize = 8;\n const hasLargeSize = totalSize === 1;\n if (hasLargeSize) {\n totalSize = this.readU64();\n headerSize = 16;\n }\n return { name, totalSize, headerSize, contentSize: totalSize - headerSize };\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { extractAudioCodecString, extractVideoCodecString, parseAacAudioSpecificConfig, parsePcmCodec, PCM_AUDIO_CODECS, } from '../codec.js';\nimport { extractVp9CodecInfoFromPacket, extractAv1CodecInfoFromPacket, } from '../codec-data.js';\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack, InputVideoTrack, } from '../input-track.js';\nimport { assert, COLOR_PRIMARIES_MAP_INVERSE, MATRIX_COEFFICIENTS_MAP_INVERSE, TRANSFER_CHARACTERISTICS_MAP_INVERSE, binarySearchLessOrEqual, binarySearchExact, last, AsyncMutex, findLastIndex, UNDETERMINED_LANGUAGE, roundToPrecision, isIso639Dash2LanguageCode, roundToMultiple, normalizeRotation, Bitstream, } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { Reader } from '../reader.js';\nimport { buildIsobmffMimeType } from './isobmff-misc.js';\nimport { IsobmffReader, MAX_BOX_HEADER_SIZE, MIN_BOX_HEADER_SIZE } from './isobmff-reader.js';\nexport class IsobmffDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.currentTrack = null;\n this.tracks = [];\n this.metadataPromise = null;\n this.movieTimescale = -1;\n this.movieDurationInTimescale = -1;\n this.isQuickTime = false;\n this.isFragmented = false;\n this.fragmentTrackDefaults = [];\n this.fragments = [];\n this.currentFragment = null;\n this.fragmentLookupMutex = new AsyncMutex();\n this.metadataReader = new IsobmffReader(input._mainReader);\n this.chunkReader = new IsobmffReader(new Reader(input.source, 64 * 2 ** 20)); // Max 64 MiB of stored chunks\n }\n async computeDuration() {\n const tracks = await this.getTracks();\n const trackDurations = await Promise.all(tracks.map(x => x.computeDuration()));\n return Math.max(0, ...trackDurations);\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks.map(track => track.inputTrack);\n }\n async getMimeType() {\n await this.readMetadata();\n const codecStrings = await Promise.all(this.tracks.map(x => x.inputTrack.getCodecParameterString()));\n return buildIsobmffMimeType({\n isQuickTime: this.isQuickTime,\n hasVideo: this.tracks.some(x => x.info?.type === 'video'),\n hasAudio: this.tracks.some(x => x.info?.type === 'audio'),\n codecStrings: codecStrings.filter(Boolean),\n });\n }\n readMetadata() {\n return this.metadataPromise ??= (async () => {\n const sourceSize = await this.metadataReader.reader.source.getSize();\n while (this.metadataReader.pos < sourceSize) {\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + MAX_BOX_HEADER_SIZE);\n const startPos = this.metadataReader.pos;\n const boxInfo = this.metadataReader.readBoxHeader();\n if (boxInfo.name === 'ftyp') {\n const majorBrand = this.metadataReader.readAscii(4);\n this.isQuickTime = majorBrand === 'qt ';\n }\n else if (boxInfo.name === 'moov') {\n // Found moov, load it\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + boxInfo.contentSize);\n this.readContiguousBoxes(boxInfo.contentSize);\n for (const track of this.tracks) {\n // Modify the edit list offset based on the previous segment durations. They are in different\n // timescales, so we first convert to seconds and then into the track timescale.\n const previousSegmentDurationsInSeconds = track.editListPreviousSegmentDurations / this.movieTimescale;\n track.editListOffset -= Math.round(previousSegmentDurationsInSeconds * track.timescale);\n }\n break;\n }\n this.metadataReader.pos = startPos + boxInfo.totalSize;\n }\n if (this.isFragmented) {\n // The last 4 bytes may contain the size of the mfra box at the end of the file\n await this.metadataReader.reader.loadRange(sourceSize - 4, sourceSize);\n this.metadataReader.pos = sourceSize - 4;\n const lastWord = this.metadataReader.readU32();\n const potentialMfraPos = sourceSize - lastWord;\n if (potentialMfraPos >= 0 && potentialMfraPos < sourceSize) {\n await this.metadataReader.reader.loadRange(potentialMfraPos, sourceSize);\n this.metadataReader.pos = potentialMfraPos;\n const boxInfo = this.metadataReader.readBoxHeader();\n if (boxInfo.name === 'mfra') {\n // We found the mfra box, allowing for much better random access. Let's parse it:\n this.readContiguousBoxes(boxInfo.contentSize);\n }\n }\n }\n })();\n }\n getSampleTableForTrack(internalTrack) {\n if (internalTrack.sampleTable) {\n return internalTrack.sampleTable;\n }\n const sampleTable = {\n sampleTimingEntries: [],\n sampleCompositionTimeOffsets: [],\n sampleSizes: [],\n keySampleIndices: null,\n chunkOffsets: [],\n sampleToChunk: [],\n presentationTimestamps: null,\n presentationTimestampIndexMap: null,\n };\n internalTrack.sampleTable = sampleTable;\n this.metadataReader.pos = internalTrack.sampleTableByteOffset;\n this.currentTrack = internalTrack;\n this.traverseBox();\n this.currentTrack = null;\n const isPcmCodec = internalTrack.info?.type === 'audio'\n && internalTrack.info.codec\n && PCM_AUDIO_CODECS.includes(internalTrack.info.codec);\n if (isPcmCodec && sampleTable.sampleCompositionTimeOffsets.length === 0) {\n // If the audio has PCM samples, the way the samples are defined in the sample table is somewhat\n // suboptimal: Each individual audio sample is its own sample, meaning we can have 48000 samples per second.\n // Because we treat each sample as its own atomic unit that can be decoded, this would lead to a huge\n // amount of very short samples for PCM audio. So instead, we make a transformation: If the audio is in PCM,\n // we say that each chunk (that normally holds many samples) now is one big sample. We can this because\n // the samples in the chunk are contiguous and the format is PCM, so the entire chunk as one thing still\n // encodes valid audio information.\n assert(internalTrack.info?.type === 'audio');\n const pcmInfo = parsePcmCodec(internalTrack.info.codec);\n const newSampleTimingEntries = [];\n const newSampleSizes = [];\n for (let i = 0; i < sampleTable.sampleToChunk.length; i++) {\n const chunkEntry = sampleTable.sampleToChunk[i];\n const nextEntry = sampleTable.sampleToChunk[i + 1];\n const chunkCount = (nextEntry ? nextEntry.startChunkIndex : sampleTable.chunkOffsets.length)\n - chunkEntry.startChunkIndex;\n for (let j = 0; j < chunkCount; j++) {\n const startSampleIndex = chunkEntry.startSampleIndex + j * chunkEntry.samplesPerChunk;\n const endSampleIndex = startSampleIndex + chunkEntry.samplesPerChunk; // Exclusive, outside of chunk\n const startTimingEntryIndex = binarySearchLessOrEqual(sampleTable.sampleTimingEntries, startSampleIndex, x => x.startIndex);\n const startTimingEntry = sampleTable.sampleTimingEntries[startTimingEntryIndex];\n const endTimingEntryIndex = binarySearchLessOrEqual(sampleTable.sampleTimingEntries, endSampleIndex, x => x.startIndex);\n const endTimingEntry = sampleTable.sampleTimingEntries[endTimingEntryIndex];\n const firstSampleTimestamp = startTimingEntry.startDecodeTimestamp\n + (startSampleIndex - startTimingEntry.startIndex) * startTimingEntry.delta;\n const lastSampleTimestamp = endTimingEntry.startDecodeTimestamp\n + (endSampleIndex - endTimingEntry.startIndex) * endTimingEntry.delta;\n const delta = lastSampleTimestamp - firstSampleTimestamp;\n const lastSampleTimingEntry = last(newSampleTimingEntries);\n if (lastSampleTimingEntry && lastSampleTimingEntry.delta === delta) {\n lastSampleTimingEntry.count++;\n }\n else {\n // One sample for the entire chunk\n newSampleTimingEntries.push({\n startIndex: chunkEntry.startChunkIndex + j,\n startDecodeTimestamp: firstSampleTimestamp,\n count: 1,\n delta,\n });\n }\n // Instead of determining the chunk's size by looping over the samples sizes in the sample table, we\n // can directly compute it as we know how many PCM frames are in this chunk, and the size of each\n // PCM frame. This also improves compatibility with some files which fail to write proper sample\n // size values into their sample tables in the PCM case.\n const chunkSize = chunkEntry.samplesPerChunk\n * pcmInfo.sampleSize\n * internalTrack.info.numberOfChannels;\n newSampleSizes.push(chunkSize);\n }\n chunkEntry.startSampleIndex = chunkEntry.startChunkIndex;\n chunkEntry.samplesPerChunk = 1;\n }\n sampleTable.sampleTimingEntries = newSampleTimingEntries;\n sampleTable.sampleSizes = newSampleSizes;\n }\n if (sampleTable.sampleCompositionTimeOffsets.length > 0) {\n // If composition time offsets are defined, we must build a list of all presentation timestamps and then\n // sort them\n sampleTable.presentationTimestamps = [];\n for (const entry of sampleTable.sampleTimingEntries) {\n for (let i = 0; i < entry.count; i++) {\n sampleTable.presentationTimestamps.push({\n presentationTimestamp: entry.startDecodeTimestamp + i * entry.delta,\n sampleIndex: entry.startIndex + i,\n });\n }\n }\n for (const entry of sampleTable.sampleCompositionTimeOffsets) {\n for (let i = 0; i < entry.count; i++) {\n const sampleIndex = entry.startIndex + i;\n const sample = sampleTable.presentationTimestamps[sampleIndex];\n if (!sample) {\n continue;\n }\n sample.presentationTimestamp += entry.offset;\n }\n }\n sampleTable.presentationTimestamps.sort((a, b) => a.presentationTimestamp - b.presentationTimestamp);\n sampleTable.presentationTimestampIndexMap = Array(sampleTable.presentationTimestamps.length).fill(-1);\n for (let i = 0; i < sampleTable.presentationTimestamps.length; i++) {\n sampleTable.presentationTimestampIndexMap[sampleTable.presentationTimestamps[i].sampleIndex] = i;\n }\n }\n else {\n // If they're not defined, we can simply use the decode timestamps as presentation timestamps\n }\n return sampleTable;\n }\n async readFragment() {\n const startPos = this.metadataReader.pos;\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + MAX_BOX_HEADER_SIZE);\n const moofBoxInfo = this.metadataReader.readBoxHeader();\n assert(moofBoxInfo.name === 'moof');\n const contentStart = this.metadataReader.pos;\n await this.metadataReader.reader.loadRange(contentStart, contentStart + moofBoxInfo.contentSize);\n this.metadataReader.pos = startPos;\n this.traverseBox();\n const index = binarySearchExact(this.fragments, startPos, x => x.moofOffset);\n assert(index !== -1);\n const fragment = this.fragments[index];\n assert(fragment.moofOffset === startPos);\n // We have read everything in the moof box, there's no need to keep the data around anymore\n // (keep the header tho)\n this.metadataReader.reader.forgetRange(contentStart, contentStart + moofBoxInfo.contentSize);\n // It may be that some tracks don't define the base decode time, i.e. when the fragment begins. This means the\n // only other option is to sum up the duration of all previous fragments.\n for (const [trackId, trackData] of fragment.trackData) {\n if (trackData.startTimestampIsFinal) {\n continue;\n }\n const internalTrack = this.tracks.find(x => x.id === trackId);\n this.metadataReader.pos = 0;\n let currentFragment = null;\n let lastFragment = null;\n const index = binarySearchLessOrEqual(internalTrack.fragments, startPos - 1, x => x.moofOffset);\n if (index !== -1) {\n // Instead of starting at the start of the file, let's start at the previous fragment instead (which\n // already has final timestamps).\n currentFragment = internalTrack.fragments[index];\n lastFragment = currentFragment;\n this.metadataReader.pos = currentFragment.moofOffset + currentFragment.moofSize;\n }\n let nextFragmentIsFirstFragment = this.metadataReader.pos === 0;\n while (this.metadataReader.pos < startPos) {\n if (currentFragment?.nextFragment) {\n currentFragment = currentFragment.nextFragment;\n this.metadataReader.pos = currentFragment.moofOffset + currentFragment.moofSize;\n }\n else {\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + MAX_BOX_HEADER_SIZE);\n const startPos = this.metadataReader.pos;\n const boxInfo = this.metadataReader.readBoxHeader();\n if (boxInfo.name === 'moof') {\n const index = binarySearchExact(this.fragments, startPos, x => x.moofOffset);\n let fragment;\n if (index === -1) {\n this.metadataReader.pos = startPos;\n fragment = await this.readFragment(); // Recursive call\n }\n else {\n // We already know this fragment\n fragment = this.fragments[index];\n }\n // Even if we already know the fragment, we might not yet know its predecessor; always do this\n if (currentFragment)\n currentFragment.nextFragment = fragment;\n currentFragment = fragment;\n if (nextFragmentIsFirstFragment) {\n fragment.isKnownToBeFirstFragment = true;\n nextFragmentIsFirstFragment = false;\n }\n }\n this.metadataReader.pos = startPos + boxInfo.totalSize;\n }\n if (currentFragment && currentFragment.trackData.has(trackId)) {\n lastFragment = currentFragment;\n }\n }\n if (lastFragment) {\n const otherTrackData = lastFragment.trackData.get(trackId);\n assert(otherTrackData.startTimestampIsFinal);\n offsetFragmentTrackDataByTimestamp(trackData, otherTrackData.endTimestamp);\n }\n trackData.startTimestampIsFinal = true;\n }\n return fragment;\n }\n readContiguousBoxes(totalSize) {\n const startIndex = this.metadataReader.pos;\n while (this.metadataReader.pos - startIndex <= totalSize - MIN_BOX_HEADER_SIZE) {\n this.traverseBox();\n }\n }\n traverseBox() {\n const startPos = this.metadataReader.pos;\n const boxInfo = this.metadataReader.readBoxHeader();\n const boxEndPos = startPos + boxInfo.totalSize;\n switch (boxInfo.name) {\n case 'mdia':\n case 'minf':\n case 'dinf':\n case 'mfra':\n case 'edts':\n {\n this.readContiguousBoxes(boxInfo.contentSize);\n }\n ;\n break;\n case 'mvhd':\n {\n const version = this.metadataReader.readU8();\n this.metadataReader.pos += 3; // Flags\n if (version === 1) {\n this.metadataReader.pos += 8 + 8;\n this.movieTimescale = this.metadataReader.readU32();\n this.movieDurationInTimescale = this.metadataReader.readU64();\n }\n else {\n this.metadataReader.pos += 4 + 4;\n this.movieTimescale = this.metadataReader.readU32();\n this.movieDurationInTimescale = this.metadataReader.readU32();\n }\n }\n ;\n break;\n case 'trak':\n {\n const track = {\n id: -1,\n demuxer: this,\n inputTrack: null,\n info: null,\n timescale: -1,\n durationInMovieTimescale: -1,\n durationInMediaTimescale: -1,\n rotation: 0,\n languageCode: UNDETERMINED_LANGUAGE,\n sampleTableByteOffset: -1,\n sampleTable: null,\n fragmentLookupTable: null,\n currentFragmentState: null,\n fragments: [],\n fragmentsWithKeyFrame: [],\n editListPreviousSegmentDurations: 0,\n editListOffset: 0,\n };\n this.currentTrack = track;\n this.readContiguousBoxes(boxInfo.contentSize);\n if (track.id !== -1 && track.timescale !== -1 && track.info !== null) {\n if (track.info.type === 'video' && track.info.width !== -1) {\n const videoTrack = track;\n track.inputTrack = new InputVideoTrack(new IsobmffVideoTrackBacking(videoTrack));\n this.tracks.push(track);\n }\n else if (track.info.type === 'audio' && track.info.numberOfChannels !== -1) {\n const audioTrack = track;\n track.inputTrack = new InputAudioTrack(new IsobmffAudioTrackBacking(audioTrack));\n this.tracks.push(track);\n }\n }\n this.currentTrack = null;\n }\n ;\n break;\n case 'tkhd':\n {\n const track = this.currentTrack;\n assert(track);\n const version = this.metadataReader.readU8();\n const flags = this.metadataReader.readU24();\n const trackEnabled = (flags & 0x1) !== 0;\n if (!trackEnabled) {\n break;\n }\n // Skip over creation & modification time to reach the track ID\n if (version === 0) {\n this.metadataReader.pos += 8;\n track.id = this.metadataReader.readU32();\n this.metadataReader.pos += 4;\n track.durationInMovieTimescale = this.metadataReader.readU32();\n }\n else if (version === 1) {\n this.metadataReader.pos += 16;\n track.id = this.metadataReader.readU32();\n this.metadataReader.pos += 4;\n track.durationInMovieTimescale = this.metadataReader.readU64();\n }\n else {\n throw new Error(`Incorrect track header version ${version}.`);\n }\n this.metadataReader.pos += 2 * 4 + 2 + 2 + 2 + 2;\n const matrix = [\n this.metadataReader.readFixed_16_16(),\n this.metadataReader.readFixed_16_16(),\n this.metadataReader.readFixed_2_30(),\n this.metadataReader.readFixed_16_16(),\n this.metadataReader.readFixed_16_16(),\n this.metadataReader.readFixed_2_30(),\n this.metadataReader.readFixed_16_16(),\n this.metadataReader.readFixed_16_16(),\n this.metadataReader.readFixed_2_30(),\n ];\n const rotation = normalizeRotation(roundToMultiple(extractRotationFromMatrix(matrix), 90));\n assert(rotation === 0 || rotation === 90 || rotation === 180 || rotation === 270);\n track.rotation = rotation;\n }\n ;\n break;\n case 'elst':\n {\n const track = this.currentTrack;\n assert(track);\n const version = this.metadataReader.readU8();\n this.metadataReader.pos += 3; // Flags\n let relevantEntryFound = false;\n let previousSegmentDurations = 0;\n const entryCount = this.metadataReader.readU32();\n for (let i = 0; i < entryCount; i++) {\n const segmentDuration = version === 1\n ? this.metadataReader.readU64()\n : this.metadataReader.readU32();\n const mediaTime = version === 1\n ? this.metadataReader.readI64()\n : this.metadataReader.readI32();\n const mediaRate = this.metadataReader.readFixed_16_16();\n if (segmentDuration === 0) {\n // Don't care\n continue;\n }\n if (relevantEntryFound) {\n console.warn('Unsupported edit list: multiple edits are not currently supported. Only using first edit.');\n break;\n }\n if (mediaTime === -1) {\n previousSegmentDurations += segmentDuration;\n continue;\n }\n if (mediaRate !== 1) {\n console.warn('Unsupported edit list entry: media rate must be 1.');\n break;\n }\n track.editListPreviousSegmentDurations = previousSegmentDurations;\n track.editListOffset = mediaTime;\n relevantEntryFound = true;\n }\n }\n ;\n break;\n case 'mdhd':\n {\n const track = this.currentTrack;\n assert(track);\n const version = this.metadataReader.readU8();\n this.metadataReader.pos += 3; // Flags\n if (version === 0) {\n this.metadataReader.pos += 8;\n track.timescale = this.metadataReader.readU32();\n track.durationInMediaTimescale = this.metadataReader.readU32();\n }\n else if (version === 1) {\n this.metadataReader.pos += 16;\n track.timescale = this.metadataReader.readU32();\n track.durationInMediaTimescale = this.metadataReader.readU64();\n }\n let language = this.metadataReader.readU16();\n if (language > 0) {\n track.languageCode = '';\n for (let i = 0; i < 3; i++) {\n track.languageCode = String.fromCharCode(0x60 + (language & 0b11111)) + track.languageCode;\n language >>= 5;\n }\n if (!isIso639Dash2LanguageCode(track.languageCode)) {\n // Sometimes the bytes are garbage\n track.languageCode = UNDETERMINED_LANGUAGE;\n }\n }\n }\n ;\n break;\n case 'hdlr':\n {\n const track = this.currentTrack;\n assert(track);\n this.metadataReader.pos += 8; // Version + flags + pre-defined\n const handlerType = this.metadataReader.readAscii(4);\n if (handlerType === 'vide') {\n track.info = {\n type: 'video',\n width: -1,\n height: -1,\n codec: null,\n codecDescription: null,\n colorSpace: null,\n avcCodecInfo: null,\n hevcCodecInfo: null,\n vp9CodecInfo: null,\n av1CodecInfo: null,\n };\n }\n else if (handlerType === 'soun') {\n track.info = {\n type: 'audio',\n numberOfChannels: -1,\n sampleRate: -1,\n codec: null,\n codecDescription: null,\n aacCodecInfo: null,\n };\n }\n }\n ;\n break;\n case 'stbl':\n {\n const track = this.currentTrack;\n assert(track);\n track.sampleTableByteOffset = startPos;\n this.readContiguousBoxes(boxInfo.contentSize);\n }\n ;\n break;\n case 'stsd':\n {\n const track = this.currentTrack;\n assert(track);\n if (track.info === null || track.sampleTable) {\n break;\n }\n const stsdVersion = this.metadataReader.readU8();\n this.metadataReader.pos += 3; // Flags\n const entries = this.metadataReader.readU32();\n for (let i = 0; i < entries; i++) {\n const startPos = this.metadataReader.pos;\n const sampleBoxInfo = this.metadataReader.readBoxHeader();\n const lowercaseBoxName = sampleBoxInfo.name.toLowerCase();\n if (track.info.type === 'video') {\n if (lowercaseBoxName === 'avc1') {\n track.info.codec = 'avc';\n }\n else if (lowercaseBoxName === 'hvc1' || lowercaseBoxName === 'hev1') {\n track.info.codec = 'hevc';\n }\n else if (lowercaseBoxName === 'vp08') {\n track.info.codec = 'vp8';\n }\n else if (lowercaseBoxName === 'vp09') {\n track.info.codec = 'vp9';\n }\n else if (lowercaseBoxName === 'av01') {\n track.info.codec = 'av1';\n }\n else {\n console.warn(`Unsupported video codec (sample entry type '${sampleBoxInfo.name}').`);\n }\n this.metadataReader.pos += 6 * 1 + 2 + 2 + 2 + 3 * 4;\n track.info.width = this.metadataReader.readU16();\n track.info.height = this.metadataReader.readU16();\n this.metadataReader.pos += 4 + 4 + 4 + 2 + 32 + 2 + 2;\n this.readContiguousBoxes((startPos + sampleBoxInfo.totalSize) - this.metadataReader.pos);\n }\n else {\n if (lowercaseBoxName === 'mp4a') {\n // We don't know the codec yet (might be AAC, might be MP3), need to read the esds box\n }\n else if (lowercaseBoxName === 'opus') {\n track.info.codec = 'opus';\n }\n else if (lowercaseBoxName === 'flac') {\n track.info.codec = 'flac';\n }\n else if (lowercaseBoxName === 'twos'\n || lowercaseBoxName === 'sowt'\n || lowercaseBoxName === 'raw '\n || lowercaseBoxName === 'in24'\n || lowercaseBoxName === 'in32'\n || lowercaseBoxName === 'fl32'\n || lowercaseBoxName === 'fl64'\n || lowercaseBoxName === 'lpcm'\n || lowercaseBoxName === 'ipcm' // ISO/IEC 23003-5\n || lowercaseBoxName === 'fpcm' // \"\n ) {\n // It's PCM\n // developer.apple.com/documentation/quicktime-file-format/sound_sample_descriptions/\n }\n else if (lowercaseBoxName === 'ulaw') {\n track.info.codec = 'ulaw';\n }\n else if (lowercaseBoxName === 'alaw') {\n track.info.codec = 'alaw';\n }\n else {\n console.warn(`Unsupported audio codec (sample entry type '${sampleBoxInfo.name}').`);\n }\n this.metadataReader.pos += 6 * 1 + 2;\n const version = this.metadataReader.readU16();\n this.metadataReader.pos += 3 * 2;\n let channelCount = this.metadataReader.readU16();\n let sampleSize = this.metadataReader.readU16();\n this.metadataReader.pos += 2 * 2;\n // Can't use fixed16_16 as that's signed\n let sampleRate = this.metadataReader.readU32() / 0x10000;\n if (stsdVersion === 0 && version > 0) {\n // Additional QuickTime fields\n if (version === 1) {\n this.metadataReader.pos += 4;\n sampleSize = 8 * this.metadataReader.readU32();\n this.metadataReader.pos += 2 * 4;\n }\n else if (version === 2) {\n this.metadataReader.pos += 4;\n sampleRate = this.metadataReader.readF64();\n channelCount = this.metadataReader.readU32();\n this.metadataReader.pos += 4; // Always 0x7f000000\n sampleSize = this.metadataReader.readU32();\n const flags = this.metadataReader.readU32();\n this.metadataReader.pos += 2 * 4;\n if (lowercaseBoxName === 'lpcm') {\n const bytesPerSample = (sampleSize + 7) >> 3;\n const isFloat = Boolean(flags & 1);\n const isBigEndian = Boolean(flags & 2);\n const sFlags = flags & 4 ? -1 : 0; // I guess it means \"signed flags\" or something?\n if (sampleSize > 0 && sampleSize <= 64) {\n if (isFloat) {\n if (sampleSize === 32) {\n track.info.codec = isBigEndian ? 'pcm-f32be' : 'pcm-f32';\n }\n }\n else {\n if (sFlags & (1 << (bytesPerSample - 1))) {\n if (bytesPerSample === 1) {\n track.info.codec = 'pcm-s8';\n }\n else if (bytesPerSample === 2) {\n track.info.codec = isBigEndian ? 'pcm-s16be' : 'pcm-s16';\n }\n else if (bytesPerSample === 3) {\n track.info.codec = isBigEndian ? 'pcm-s24be' : 'pcm-s24';\n }\n else if (bytesPerSample === 4) {\n track.info.codec = isBigEndian ? 'pcm-s32be' : 'pcm-s32';\n }\n }\n else {\n if (bytesPerSample === 1) {\n track.info.codec = 'pcm-u8';\n }\n }\n }\n }\n if (track.info.codec === null) {\n console.warn('Unsupported PCM format.');\n }\n }\n }\n }\n track.info.numberOfChannels = channelCount;\n track.info.sampleRate = sampleRate;\n // PCM codec assignments\n if (lowercaseBoxName === 'twos') {\n if (sampleSize === 8) {\n track.info.codec = 'pcm-s8';\n }\n else if (sampleSize === 16) {\n track.info.codec = 'pcm-s16be';\n }\n else {\n console.warn(`Unsupported sample size ${sampleSize} for codec 'twos'.`);\n track.info.codec = null;\n }\n }\n else if (lowercaseBoxName === 'sowt') {\n if (sampleSize === 8) {\n track.info.codec = 'pcm-s8';\n }\n else if (sampleSize === 16) {\n track.info.codec = 'pcm-s16';\n }\n else {\n console.warn(`Unsupported sample size ${sampleSize} for codec 'sowt'.`);\n track.info.codec = null;\n }\n }\n else if (lowercaseBoxName === 'raw ') {\n track.info.codec = 'pcm-u8';\n }\n else if (lowercaseBoxName === 'in24') {\n track.info.codec = 'pcm-s24be';\n }\n else if (lowercaseBoxName === 'in32') {\n track.info.codec = 'pcm-s32be';\n }\n else if (lowercaseBoxName === 'fl32') {\n track.info.codec = 'pcm-f32be';\n }\n else if (lowercaseBoxName === 'fl64') {\n track.info.codec = 'pcm-f64be';\n }\n else if (lowercaseBoxName === 'ipcm') {\n track.info.codec = 'pcm-s16be'; // Placeholder, will be adjusted by the pcmC box\n }\n else if (lowercaseBoxName === 'fpcm') {\n track.info.codec = 'pcm-f32be'; // Placeholder, will be adjusted by the pcmC box\n }\n this.readContiguousBoxes((startPos + sampleBoxInfo.totalSize) - this.metadataReader.pos);\n }\n }\n }\n ;\n break;\n case 'avcC':\n {\n const track = this.currentTrack;\n assert(track && track.info);\n track.info.codecDescription = this.metadataReader.readBytes(boxInfo.contentSize);\n }\n ;\n break;\n case 'hvcC':\n {\n const track = this.currentTrack;\n assert(track && track.info);\n track.info.codecDescription = this.metadataReader.readBytes(boxInfo.contentSize);\n }\n ;\n break;\n case 'vpcC':\n {\n const track = this.currentTrack;\n assert(track && track.info?.type === 'video');\n this.metadataReader.pos += 4; // Version + flags\n const profile = this.metadataReader.readU8();\n const level = this.metadataReader.readU8();\n const thirdByte = this.metadataReader.readU8();\n const bitDepth = thirdByte >> 4;\n const chromaSubsampling = (thirdByte >> 1) & 0b111;\n const videoFullRangeFlag = thirdByte & 1;\n const colourPrimaries = this.metadataReader.readU8();\n const transferCharacteristics = this.metadataReader.readU8();\n const matrixCoefficients = this.metadataReader.readU8();\n track.info.vp9CodecInfo = {\n profile,\n level,\n bitDepth,\n chromaSubsampling,\n videoFullRangeFlag,\n colourPrimaries,\n transferCharacteristics,\n matrixCoefficients,\n };\n }\n ;\n break;\n case 'av1C':\n {\n const track = this.currentTrack;\n assert(track && track.info?.type === 'video');\n this.metadataReader.pos += 1; // Marker + version\n const secondByte = this.metadataReader.readU8();\n const profile = secondByte >> 5;\n const level = secondByte & 0b11111;\n const thirdByte = this.metadataReader.readU8();\n const tier = thirdByte >> 7;\n const highBitDepth = (thirdByte >> 6) & 1;\n const twelveBit = (thirdByte >> 5) & 1;\n const monochrome = (thirdByte >> 4) & 1;\n const chromaSubsamplingX = (thirdByte >> 3) & 1;\n const chromaSubsamplingY = (thirdByte >> 2) & 1;\n const chromaSamplePosition = thirdByte & 0b11;\n // Logic from https://aomediacodec.github.io/av1-spec/av1-spec.pdf\n const bitDepth = profile == 2 && highBitDepth ? (twelveBit ? 12 : 10) : (highBitDepth ? 10 : 8);\n track.info.av1CodecInfo = {\n profile,\n level,\n tier,\n bitDepth,\n monochrome,\n chromaSubsamplingX,\n chromaSubsamplingY,\n chromaSamplePosition,\n };\n }\n ;\n break;\n case 'colr':\n {\n const track = this.currentTrack;\n assert(track && track.info?.type === 'video');\n const colourType = this.metadataReader.readAscii(4);\n if (colourType !== 'nclx') {\n break;\n }\n const colourPrimaries = this.metadataReader.readU16();\n const transferCharacteristics = this.metadataReader.readU16();\n const matrixCoefficients = this.metadataReader.readU16();\n const fullRangeFlag = Boolean(this.metadataReader.readU8() & 0x80);\n track.info.colorSpace = {\n primaries: COLOR_PRIMARIES_MAP_INVERSE[colourPrimaries],\n transfer: TRANSFER_CHARACTERISTICS_MAP_INVERSE[transferCharacteristics],\n matrix: MATRIX_COEFFICIENTS_MAP_INVERSE[matrixCoefficients],\n fullRange: fullRangeFlag,\n };\n }\n ;\n break;\n case 'wave':\n {\n this.readContiguousBoxes(boxInfo.contentSize);\n }\n ;\n break;\n case 'esds':\n {\n const track = this.currentTrack;\n assert(track && track.info?.type === 'audio');\n this.metadataReader.pos += 4; // Version + flags\n const tag = this.metadataReader.readU8();\n assert(tag === 0x03); // ES Descriptor\n this.metadataReader.readIsomVariableInteger(); // Length\n this.metadataReader.pos += 2; // ES ID\n const mixed = this.metadataReader.readU8();\n const streamDependenceFlag = (mixed & 0x80) !== 0;\n const urlFlag = (mixed & 0x40) !== 0;\n const ocrStreamFlag = (mixed & 0x20) !== 0;\n if (streamDependenceFlag) {\n this.metadataReader.pos += 2;\n }\n if (urlFlag) {\n const urlLength = this.metadataReader.readU8();\n this.metadataReader.pos += urlLength;\n }\n if (ocrStreamFlag) {\n this.metadataReader.pos += 2;\n }\n const decoderConfigTag = this.metadataReader.readU8();\n assert(decoderConfigTag === 0x04); // DecoderConfigDescriptor\n const decoderConfigDescriptorLength = this.metadataReader.readIsomVariableInteger(); // Length\n const payloadStart = this.metadataReader.pos;\n const objectTypeIndication = this.metadataReader.readU8();\n if (objectTypeIndication === 0x40 || objectTypeIndication === 0x67) {\n track.info.codec = 'aac';\n track.info.aacCodecInfo = { isMpeg2: objectTypeIndication === 0x67 };\n }\n else if (objectTypeIndication === 0x69 || objectTypeIndication === 0x6b) {\n track.info.codec = 'mp3';\n }\n else if (objectTypeIndication === 0xdd) {\n track.info.codec = 'vorbis'; // \"nonstandard, gpac uses it\" - FFmpeg\n }\n else {\n console.warn(`Unsupported audio codec (objectTypeIndication ${objectTypeIndication}) - discarding track.`);\n }\n this.metadataReader.pos += 1 + 3 + 4 + 4;\n if (decoderConfigDescriptorLength > this.metadataReader.pos - payloadStart) {\n // There's a DecoderSpecificInfo at the end, let's read it\n const decoderSpecificInfoTag = this.metadataReader.readU8();\n assert(decoderSpecificInfoTag === 0x05); // DecoderSpecificInfo\n const decoderSpecificInfoLength = this.metadataReader.readIsomVariableInteger();\n track.info.codecDescription = this.metadataReader.readBytes(decoderSpecificInfoLength);\n if (track.info.codec === 'aac') {\n // Let's try to deduce more accurate values directly from the AudioSpecificConfig:\n const audioSpecificConfig = parseAacAudioSpecificConfig(track.info.codecDescription);\n if (audioSpecificConfig.numberOfChannels !== null) {\n track.info.numberOfChannels = audioSpecificConfig.numberOfChannels;\n }\n if (audioSpecificConfig.sampleRate !== null) {\n track.info.sampleRate = audioSpecificConfig.sampleRate;\n }\n }\n }\n }\n ;\n break;\n case 'enda':\n {\n const track = this.currentTrack;\n assert(track && track.info?.type === 'audio');\n const littleEndian = this.metadataReader.readU16() & 0xff; // 0xff is from FFmpeg\n if (littleEndian) {\n if (track.info.codec === 'pcm-s16be') {\n track.info.codec = 'pcm-s16';\n }\n else if (track.info.codec === 'pcm-s24be') {\n track.info.codec = 'pcm-s24';\n }\n else if (track.info.codec === 'pcm-s32be') {\n track.info.codec = 'pcm-s32';\n }\n else if (track.info.codec === 'pcm-f32be') {\n track.info.codec = 'pcm-f32';\n }\n else if (track.info.codec === 'pcm-f64be') {\n track.info.codec = 'pcm-f64';\n }\n }\n }\n ;\n break;\n case 'pcmC':\n {\n const track = this.currentTrack;\n assert(track && track.info?.type === 'audio');\n this.metadataReader.pos += 1 + 3; // Version + flags\n // ISO/IEC 23003-5\n const formatFlags = this.metadataReader.readU8();\n const isLittleEndian = Boolean(formatFlags & 0x01);\n const pcmSampleSize = this.metadataReader.readU8();\n if (track.info.codec === 'pcm-s16be') {\n // ipcm\n if (isLittleEndian) {\n if (pcmSampleSize === 16) {\n track.info.codec = 'pcm-s16';\n }\n else if (pcmSampleSize === 24) {\n track.info.codec = 'pcm-s24';\n }\n else if (pcmSampleSize === 32) {\n track.info.codec = 'pcm-s32';\n }\n else {\n console.warn(`Invalid ipcm sample size ${pcmSampleSize}.`);\n track.info.codec = null;\n }\n }\n else {\n if (pcmSampleSize === 16) {\n track.info.codec = 'pcm-s16be';\n }\n else if (pcmSampleSize === 24) {\n track.info.codec = 'pcm-s24be';\n }\n else if (pcmSampleSize === 32) {\n track.info.codec = 'pcm-s32be';\n }\n else {\n console.warn(`Invalid ipcm sample size ${pcmSampleSize}.`);\n track.info.codec = null;\n }\n }\n }\n else if (track.info.codec === 'pcm-f32be') {\n // fpcm\n if (isLittleEndian) {\n if (pcmSampleSize === 32) {\n track.info.codec = 'pcm-f32';\n }\n else if (pcmSampleSize === 64) {\n track.info.codec = 'pcm-f64';\n }\n else {\n console.warn(`Invalid fpcm sample size ${pcmSampleSize}.`);\n track.info.codec = null;\n }\n }\n else {\n if (pcmSampleSize === 32) {\n track.info.codec = 'pcm-f32be';\n }\n else if (pcmSampleSize === 64) {\n track.info.codec = 'pcm-f64be';\n }\n else {\n console.warn(`Invalid fpcm sample size ${pcmSampleSize}.`);\n track.info.codec = null;\n }\n }\n }\n break;\n }\n ;\n case 'dOps':\n { // Used for Opus audio\n const track = this.currentTrack;\n assert(track && track.info?.type === 'audio');\n this.metadataReader.pos += 1; // Version\n // https://www.opus-codec.org/docs/opus_in_isobmff.html\n const outputChannelCount = this.metadataReader.readU8();\n const preSkip = this.metadataReader.readU16();\n const inputSampleRate = this.metadataReader.readU32();\n const outputGain = this.metadataReader.readI16();\n const channelMappingFamily = this.metadataReader.readU8();\n let channelMappingTable;\n if (channelMappingFamily !== 0) {\n channelMappingTable = this.metadataReader.readBytes(2 + outputChannelCount);\n }\n else {\n channelMappingTable = new Uint8Array(0);\n }\n // https://datatracker.ietf.org/doc/html/draft-ietf-codec-oggopus-06\n const description = new Uint8Array(8 + 1 + 1 + 2 + 4 + 2 + 1 + channelMappingTable.byteLength);\n const view = new DataView(description.buffer);\n view.setUint32(0, 0x4f707573, false); // 'Opus'\n view.setUint32(4, 0x48656164, false); // 'Head'\n view.setUint8(8, 1); // Version\n view.setUint8(9, outputChannelCount);\n view.setUint16(10, preSkip, true);\n view.setUint32(12, inputSampleRate, true);\n view.setInt16(16, outputGain, true);\n view.setUint8(18, channelMappingFamily);\n description.set(channelMappingTable, 19);\n track.info.codecDescription = description;\n track.info.numberOfChannels = outputChannelCount;\n track.info.sampleRate = inputSampleRate;\n }\n ;\n break;\n case 'dfLa':\n { // Used for FLAC audio\n const track = this.currentTrack;\n assert(track && track.info?.type === 'audio');\n this.metadataReader.pos += 4; // Version + flags\n // https://datatracker.ietf.org/doc/rfc9639/\n const BLOCK_TYPE_MASK = 0x7f;\n const LAST_METADATA_BLOCK_FLAG_MASK = 0x80;\n const startPos = this.metadataReader.pos;\n while (this.metadataReader.pos < boxEndPos) {\n const flagAndType = this.metadataReader.readU8();\n const metadataBlockLength = this.metadataReader.readU24();\n const type = flagAndType & BLOCK_TYPE_MASK;\n // It's a STREAMINFO block; let's extract the actual sample rate and channel count\n if (type === 0) {\n this.metadataReader.pos += 10;\n // Extract sample rate\n const word = this.metadataReader.readU32();\n const sampleRate = word >>> 12;\n const numberOfChannels = ((word >> 9) & 0b111) + 1;\n track.info.sampleRate = sampleRate;\n track.info.numberOfChannels = numberOfChannels;\n this.metadataReader.pos += 20;\n }\n else {\n // Simply skip ahead to the next block\n this.metadataReader.pos += metadataBlockLength;\n }\n if (flagAndType & LAST_METADATA_BLOCK_FLAG_MASK) {\n break;\n }\n }\n const endPos = this.metadataReader.pos;\n this.metadataReader.pos = startPos;\n const bytes = this.metadataReader.readBytes(endPos - startPos);\n const description = new Uint8Array(4 + bytes.byteLength);\n const view = new DataView(description.buffer);\n view.setUint32(0, 0x664c6143, false); // 'fLaC'\n description.set(bytes, 4);\n // Set the codec description to be 'fLaC' + all metadata blocks\n track.info.codecDescription = description;\n }\n ;\n break;\n case 'stts':\n {\n const track = this.currentTrack;\n assert(track);\n if (!track.sampleTable) {\n break;\n }\n this.metadataReader.pos += 4; // Version + flags\n const entryCount = this.metadataReader.readU32();\n let currentIndex = 0;\n let currentTimestamp = 0;\n for (let i = 0; i < entryCount; i++) {\n const sampleCount = this.metadataReader.readU32();\n const sampleDelta = this.metadataReader.readU32();\n track.sampleTable.sampleTimingEntries.push({\n startIndex: currentIndex,\n startDecodeTimestamp: currentTimestamp,\n count: sampleCount,\n delta: sampleDelta,\n });\n currentIndex += sampleCount;\n currentTimestamp += sampleCount * sampleDelta;\n }\n }\n ;\n break;\n case 'ctts':\n {\n const track = this.currentTrack;\n assert(track);\n if (!track.sampleTable) {\n break;\n }\n this.metadataReader.pos += 1 + 3; // Version + flags\n const entryCount = this.metadataReader.readU32();\n let sampleIndex = 0;\n for (let i = 0; i < entryCount; i++) {\n const sampleCount = this.metadataReader.readU32();\n const sampleOffset = this.metadataReader.readI32();\n track.sampleTable.sampleCompositionTimeOffsets.push({\n startIndex: sampleIndex,\n count: sampleCount,\n offset: sampleOffset,\n });\n sampleIndex += sampleCount;\n }\n }\n ;\n break;\n case 'stsz':\n {\n const track = this.currentTrack;\n assert(track);\n if (!track.sampleTable) {\n break;\n }\n this.metadataReader.pos += 4; // Version + flags\n const sampleSize = this.metadataReader.readU32();\n const sampleCount = this.metadataReader.readU32();\n if (sampleSize === 0) {\n for (let i = 0; i < sampleCount; i++) {\n const sampleSize = this.metadataReader.readU32();\n track.sampleTable.sampleSizes.push(sampleSize);\n }\n }\n else {\n track.sampleTable.sampleSizes.push(sampleSize);\n }\n }\n ;\n break;\n case 'stz2':\n {\n const track = this.currentTrack;\n assert(track);\n if (!track.sampleTable) {\n break;\n }\n this.metadataReader.pos += 4; // Version + flags\n this.metadataReader.pos += 3; // Reserved\n const fieldSize = this.metadataReader.readU8(); // in bits\n const sampleCount = this.metadataReader.readU32();\n const bytes = this.metadataReader.readBytes(Math.ceil(sampleCount * fieldSize / 8));\n const bitstream = new Bitstream(bytes);\n for (let i = 0; i < sampleCount; i++) {\n const sampleSize = bitstream.readBits(fieldSize);\n track.sampleTable.sampleSizes.push(sampleSize);\n }\n }\n ;\n break;\n case 'stss':\n {\n const track = this.currentTrack;\n assert(track);\n if (!track.sampleTable) {\n break;\n }\n this.metadataReader.pos += 4; // Version + flags\n track.sampleTable.keySampleIndices = [];\n const entryCount = this.metadataReader.readU32();\n for (let i = 0; i < entryCount; i++) {\n const sampleIndex = this.metadataReader.readU32() - 1; // Convert to 0-indexed\n track.sampleTable.keySampleIndices.push(sampleIndex);\n }\n }\n ;\n break;\n case 'stsc':\n {\n const track = this.currentTrack;\n assert(track);\n if (!track.sampleTable) {\n break;\n }\n this.metadataReader.pos += 4;\n const entryCount = this.metadataReader.readU32();\n for (let i = 0; i < entryCount; i++) {\n const startChunkIndex = this.metadataReader.readU32() - 1; // Convert to 0-indexed\n const samplesPerChunk = this.metadataReader.readU32();\n const sampleDescriptionIndex = this.metadataReader.readU32();\n track.sampleTable.sampleToChunk.push({\n startSampleIndex: -1,\n startChunkIndex,\n samplesPerChunk,\n sampleDescriptionIndex,\n });\n }\n let startSampleIndex = 0;\n for (let i = 0; i < track.sampleTable.sampleToChunk.length; i++) {\n track.sampleTable.sampleToChunk[i].startSampleIndex = startSampleIndex;\n if (i < track.sampleTable.sampleToChunk.length - 1) {\n const nextChunk = track.sampleTable.sampleToChunk[i + 1];\n const chunkCount = nextChunk.startChunkIndex\n - track.sampleTable.sampleToChunk[i].startChunkIndex;\n startSampleIndex += chunkCount * track.sampleTable.sampleToChunk[i].samplesPerChunk;\n }\n }\n }\n ;\n break;\n case 'stco':\n {\n const track = this.currentTrack;\n assert(track);\n if (!track.sampleTable) {\n break;\n }\n this.metadataReader.pos += 4; // Version + flags\n const entryCount = this.metadataReader.readU32();\n for (let i = 0; i < entryCount; i++) {\n const chunkOffset = this.metadataReader.readU32();\n track.sampleTable.chunkOffsets.push(chunkOffset);\n }\n }\n ;\n break;\n case 'co64':\n {\n const track = this.currentTrack;\n assert(track);\n if (!track.sampleTable) {\n break;\n }\n this.metadataReader.pos += 4; // Version + flags\n const entryCount = this.metadataReader.readU32();\n for (let i = 0; i < entryCount; i++) {\n const chunkOffset = this.metadataReader.readU64();\n track.sampleTable.chunkOffsets.push(chunkOffset);\n }\n }\n ;\n break;\n case 'mvex':\n {\n this.isFragmented = true;\n this.readContiguousBoxes(boxInfo.contentSize);\n }\n ;\n break;\n case 'mehd':\n {\n const version = this.metadataReader.readU8();\n this.metadataReader.pos += 3; // Flags\n const fragmentDuration = version === 1 ? this.metadataReader.readU64() : this.metadataReader.readU32();\n this.movieDurationInTimescale = fragmentDuration;\n }\n ;\n break;\n case 'trex':\n {\n this.metadataReader.pos += 4; // Version + flags\n const trackId = this.metadataReader.readU32();\n const defaultSampleDescriptionIndex = this.metadataReader.readU32();\n const defaultSampleDuration = this.metadataReader.readU32();\n const defaultSampleSize = this.metadataReader.readU32();\n const defaultSampleFlags = this.metadataReader.readU32();\n // We store these separately rather than in the tracks since the tracks may not exist yet\n this.fragmentTrackDefaults.push({\n trackId,\n defaultSampleDescriptionIndex,\n defaultSampleDuration,\n defaultSampleSize,\n defaultSampleFlags,\n });\n }\n ;\n break;\n case 'tfra':\n {\n const version = this.metadataReader.readU8();\n this.metadataReader.pos += 3; // Flags\n const trackId = this.metadataReader.readU32();\n const track = this.tracks.find(x => x.id === trackId);\n if (!track) {\n break;\n }\n track.fragmentLookupTable = [];\n const word = this.metadataReader.readU32();\n const lengthSizeOfTrafNum = (word & 0b110000) >> 4;\n const lengthSizeOfTrunNum = (word & 0b001100) >> 2;\n const lengthSizeOfSampleNum = word & 0b000011;\n const x = this.metadataReader;\n const functions = [x.readU8.bind(x), x.readU16.bind(x), x.readU24.bind(x), x.readU32.bind(x)];\n const readTrafNum = functions[lengthSizeOfTrafNum];\n const readTrunNum = functions[lengthSizeOfTrunNum];\n const readSampleNum = functions[lengthSizeOfSampleNum];\n const numberOfEntries = this.metadataReader.readU32();\n for (let i = 0; i < numberOfEntries; i++) {\n const time = version === 1 ? this.metadataReader.readU64() : this.metadataReader.readU32();\n const moofOffset = version === 1 ? this.metadataReader.readU64() : this.metadataReader.readU32();\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const trafNumber = readTrafNum();\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const trunNumber = readTrunNum();\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const sampleNumber = readSampleNum();\n track.fragmentLookupTable.push({\n timestamp: time,\n moofOffset,\n });\n }\n }\n ;\n break;\n case 'moof':\n {\n this.currentFragment = {\n moofOffset: startPos,\n moofSize: boxInfo.totalSize,\n implicitBaseDataOffset: startPos,\n trackData: new Map(),\n dataStart: Infinity,\n dataEnd: 0,\n nextFragment: null,\n isKnownToBeFirstFragment: false,\n };\n this.readContiguousBoxes(boxInfo.contentSize);\n const insertionIndex = binarySearchLessOrEqual(this.fragments, this.currentFragment.moofOffset, x => x.moofOffset);\n this.fragments.splice(insertionIndex + 1, 0, this.currentFragment);\n // Compute the byte range of the sample data in this fragment, so we can load the whole fragment at once\n for (const [, trackData] of this.currentFragment.trackData) {\n const firstSample = trackData.samples[0];\n const lastSample = last(trackData.samples);\n this.currentFragment.dataStart = Math.min(this.currentFragment.dataStart, firstSample.byteOffset);\n this.currentFragment.dataEnd = Math.max(this.currentFragment.dataEnd, lastSample.byteOffset + lastSample.byteSize);\n }\n this.currentFragment = null;\n }\n ;\n break;\n case 'traf':\n {\n assert(this.currentFragment);\n this.readContiguousBoxes(boxInfo.contentSize);\n // It is possible that there is no current track, for example when we don't care about the track\n // referenced in the track fragment header.\n if (this.currentTrack) {\n const trackData = this.currentFragment.trackData.get(this.currentTrack.id);\n if (trackData) {\n // We know there is sample data for this track in this fragment, so let's add it to the\n // track's fragments:\n const insertionIndex = binarySearchLessOrEqual(this.currentTrack.fragments, this.currentFragment.moofOffset, x => x.moofOffset);\n this.currentTrack.fragments.splice(insertionIndex + 1, 0, this.currentFragment);\n const hasKeyFrame = trackData.firstKeyFrameTimestamp !== null;\n if (hasKeyFrame) {\n const insertionIndex = binarySearchLessOrEqual(this.currentTrack.fragmentsWithKeyFrame, this.currentFragment.moofOffset, x => x.moofOffset);\n this.currentTrack.fragmentsWithKeyFrame.splice(insertionIndex + 1, 0, this.currentFragment);\n }\n const { currentFragmentState } = this.currentTrack;\n assert(currentFragmentState);\n if (currentFragmentState.startTimestamp !== null) {\n offsetFragmentTrackDataByTimestamp(trackData, currentFragmentState.startTimestamp);\n trackData.startTimestampIsFinal = true;\n }\n }\n this.currentTrack.currentFragmentState = null;\n this.currentTrack = null;\n }\n }\n ;\n break;\n case 'tfhd':\n {\n assert(this.currentFragment);\n this.metadataReader.pos += 1; // Version\n const flags = this.metadataReader.readU24();\n const baseDataOffsetPresent = Boolean(flags & 0x000001);\n const sampleDescriptionIndexPresent = Boolean(flags & 0x000002);\n const defaultSampleDurationPresent = Boolean(flags & 0x000008);\n const defaultSampleSizePresent = Boolean(flags & 0x000010);\n const defaultSampleFlagsPresent = Boolean(flags & 0x000020);\n const durationIsEmpty = Boolean(flags & 0x010000);\n const defaultBaseIsMoof = Boolean(flags & 0x020000);\n const trackId = this.metadataReader.readU32();\n const track = this.tracks.find(x => x.id === trackId);\n if (!track) {\n // We don't care about this track\n break;\n }\n const defaults = this.fragmentTrackDefaults.find(x => x.trackId === trackId);\n this.currentTrack = track;\n track.currentFragmentState = {\n baseDataOffset: this.currentFragment.implicitBaseDataOffset,\n sampleDescriptionIndex: defaults?.defaultSampleDescriptionIndex ?? null,\n defaultSampleDuration: defaults?.defaultSampleDuration ?? null,\n defaultSampleSize: defaults?.defaultSampleSize ?? null,\n defaultSampleFlags: defaults?.defaultSampleFlags ?? null,\n startTimestamp: null,\n };\n if (baseDataOffsetPresent) {\n track.currentFragmentState.baseDataOffset = this.metadataReader.readU64();\n }\n else if (defaultBaseIsMoof) {\n track.currentFragmentState.baseDataOffset = this.currentFragment.moofOffset;\n }\n if (sampleDescriptionIndexPresent) {\n track.currentFragmentState.sampleDescriptionIndex = this.metadataReader.readU32();\n }\n if (defaultSampleDurationPresent) {\n track.currentFragmentState.defaultSampleDuration = this.metadataReader.readU32();\n }\n if (defaultSampleSizePresent) {\n track.currentFragmentState.defaultSampleSize = this.metadataReader.readU32();\n }\n if (defaultSampleFlagsPresent) {\n track.currentFragmentState.defaultSampleFlags = this.metadataReader.readU32();\n }\n if (durationIsEmpty) {\n track.currentFragmentState.defaultSampleDuration = 0;\n }\n }\n ;\n break;\n case 'tfdt':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.currentFragmentState);\n // break;\n const version = this.metadataReader.readU8();\n this.metadataReader.pos += 3; // Flags\n const baseMediaDecodeTime = version === 0\n ? this.metadataReader.readU32()\n : this.metadataReader.readU64();\n track.currentFragmentState.startTimestamp = baseMediaDecodeTime;\n }\n ;\n break;\n case 'trun':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(this.currentFragment);\n assert(track.currentFragmentState);\n if (this.currentFragment.trackData.has(track.id)) {\n console.warn('Can\\'t have two trun boxes for the same track in one fragment. Ignoring...');\n break;\n }\n const version = this.metadataReader.readU8();\n const flags = this.metadataReader.readU24();\n const dataOffsetPresent = Boolean(flags & 0x000001);\n const firstSampleFlagsPresent = Boolean(flags & 0x000004);\n const sampleDurationPresent = Boolean(flags & 0x000100);\n const sampleSizePresent = Boolean(flags & 0x000200);\n const sampleFlagsPresent = Boolean(flags & 0x000400);\n const sampleCompositionTimeOffsetsPresent = Boolean(flags & 0x000800);\n const sampleCount = this.metadataReader.readU32();\n let dataOffset = track.currentFragmentState.baseDataOffset;\n if (dataOffsetPresent) {\n dataOffset += this.metadataReader.readI32();\n }\n let firstSampleFlags = null;\n if (firstSampleFlagsPresent) {\n firstSampleFlags = this.metadataReader.readU32();\n }\n let currentOffset = dataOffset;\n if (sampleCount === 0) {\n // Don't associate the fragment with the track if it has no samples, this simplifies other code\n this.currentFragment.implicitBaseDataOffset = currentOffset;\n break;\n }\n let currentTimestamp = 0;\n const trackData = {\n startTimestamp: 0,\n endTimestamp: 0,\n firstKeyFrameTimestamp: null,\n samples: [],\n presentationTimestamps: [],\n startTimestampIsFinal: false,\n };\n this.currentFragment.trackData.set(track.id, trackData);\n for (let i = 0; i < sampleCount; i++) {\n let sampleDuration;\n if (sampleDurationPresent) {\n sampleDuration = this.metadataReader.readU32();\n }\n else {\n assert(track.currentFragmentState.defaultSampleDuration !== null);\n sampleDuration = track.currentFragmentState.defaultSampleDuration;\n }\n let sampleSize;\n if (sampleSizePresent) {\n sampleSize = this.metadataReader.readU32();\n }\n else {\n assert(track.currentFragmentState.defaultSampleSize !== null);\n sampleSize = track.currentFragmentState.defaultSampleSize;\n }\n let sampleFlags;\n if (sampleFlagsPresent) {\n sampleFlags = this.metadataReader.readU32();\n }\n else {\n assert(track.currentFragmentState.defaultSampleFlags !== null);\n sampleFlags = track.currentFragmentState.defaultSampleFlags;\n }\n if (i === 0 && firstSampleFlags !== null) {\n sampleFlags = firstSampleFlags;\n }\n let sampleCompositionTimeOffset = 0;\n if (sampleCompositionTimeOffsetsPresent) {\n if (version === 0) {\n sampleCompositionTimeOffset = this.metadataReader.readU32();\n }\n else {\n sampleCompositionTimeOffset = this.metadataReader.readI32();\n }\n }\n const isKeyFrame = !(sampleFlags & 0x00010000);\n trackData.samples.push({\n presentationTimestamp: currentTimestamp + sampleCompositionTimeOffset,\n duration: sampleDuration,\n byteOffset: currentOffset,\n byteSize: sampleSize,\n isKeyFrame,\n });\n currentOffset += sampleSize;\n currentTimestamp += sampleDuration;\n }\n trackData.presentationTimestamps = trackData.samples\n .map((x, i) => ({ presentationTimestamp: x.presentationTimestamp, sampleIndex: i }))\n .sort((a, b) => a.presentationTimestamp - b.presentationTimestamp);\n for (let i = 0; i < trackData.presentationTimestamps.length; i++) {\n const currentEntry = trackData.presentationTimestamps[i];\n const currentSample = trackData.samples[currentEntry.sampleIndex];\n if (trackData.firstKeyFrameTimestamp === null && currentSample.isKeyFrame) {\n trackData.firstKeyFrameTimestamp = currentSample.presentationTimestamp;\n }\n if (i < trackData.presentationTimestamps.length - 1) {\n // Update sample durations based on presentation order\n const nextEntry = trackData.presentationTimestamps[i + 1];\n currentSample.duration = nextEntry.presentationTimestamp - currentEntry.presentationTimestamp;\n }\n }\n const firstSample = trackData.samples[trackData.presentationTimestamps[0].sampleIndex];\n const lastSample = trackData.samples[last(trackData.presentationTimestamps).sampleIndex];\n trackData.startTimestamp = firstSample.presentationTimestamp;\n trackData.endTimestamp = lastSample.presentationTimestamp + lastSample.duration;\n this.currentFragment.implicitBaseDataOffset = currentOffset;\n }\n ;\n break;\n }\n this.metadataReader.pos = boxEndPos;\n }\n}\nclass IsobmffTrackBacking {\n constructor(internalTrack) {\n this.internalTrack = internalTrack;\n this.packetToSampleIndex = new WeakMap();\n this.packetToFragmentLocation = new WeakMap();\n }\n getId() {\n return this.internalTrack.id;\n }\n getCodec() {\n throw new Error('Not implemented on base class.');\n }\n getLanguageCode() {\n return this.internalTrack.languageCode;\n }\n getTimeResolution() {\n return this.internalTrack.timescale;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n async getFirstTimestamp() {\n const firstPacket = await this.getFirstPacket({ metadataOnly: true });\n return firstPacket?.timestamp ?? 0;\n }\n async getFirstPacket(options) {\n if (this.internalTrack.demuxer.isFragmented) {\n return this.performFragmentedLookup(() => {\n const startFragment = this.internalTrack.demuxer.fragments[0] ?? null;\n if (startFragment?.isKnownToBeFirstFragment) {\n // Walk from the very first fragment in the file until we find one with our track in it\n let currentFragment = startFragment;\n while (currentFragment) {\n const trackData = currentFragment.trackData.get(this.internalTrack.id);\n if (trackData) {\n return {\n fragmentIndex: binarySearchExact(this.internalTrack.fragments, currentFragment.moofOffset, x => x.moofOffset),\n sampleIndex: 0,\n correctSampleFound: true,\n };\n }\n currentFragment = currentFragment.nextFragment;\n }\n }\n return {\n fragmentIndex: -1,\n sampleIndex: -1,\n correctSampleFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the lookup entries\n Infinity, options);\n }\n return this.fetchPacketForSampleIndex(0, options);\n }\n mapTimestampIntoTimescale(timestamp) {\n // Do a little rounding to catch cases where the result is very close to an integer. If it is, it's likely\n // that the number was originally an integer divided by the timescale. For stability, it's best\n // to return the integer in this case.\n return roundToPrecision(timestamp * this.internalTrack.timescale, 14) + this.internalTrack.editListOffset;\n }\n async getPacket(timestamp, options) {\n const timestampInTimescale = this.mapTimestampIntoTimescale(timestamp);\n if (this.internalTrack.demuxer.isFragmented) {\n return this.performFragmentedLookup(() => this.findSampleInFragmentsForTimestamp(timestampInTimescale), timestampInTimescale, timestampInTimescale, options);\n }\n else {\n const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack);\n const sampleIndex = getSampleIndexForTimestamp(sampleTable, timestampInTimescale);\n return this.fetchPacketForSampleIndex(sampleIndex, options);\n }\n }\n async getNextPacket(packet, options) {\n if (this.internalTrack.demuxer.isFragmented) {\n const locationInFragment = this.packetToFragmentLocation.get(packet);\n if (locationInFragment === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n const trackData = locationInFragment.fragment.trackData.get(this.internalTrack.id);\n const fragmentSample = trackData.samples[locationInFragment.sampleIndex];\n const fragmentIndex = binarySearchExact(this.internalTrack.fragments, locationInFragment.fragment.moofOffset, x => x.moofOffset);\n assert(fragmentIndex !== -1);\n return this.performFragmentedLookup(() => {\n if (locationInFragment.sampleIndex + 1 < trackData.samples.length) {\n // We can simply take the next sample in the fragment\n return {\n fragmentIndex,\n sampleIndex: locationInFragment.sampleIndex + 1,\n correctSampleFound: true,\n };\n }\n else {\n // Walk the list of fragments until we find the next fragment for this track\n let currentFragment = locationInFragment.fragment;\n while (currentFragment.nextFragment) {\n currentFragment = currentFragment.nextFragment;\n const trackData = currentFragment.trackData.get(this.internalTrack.id);\n if (trackData) {\n const fragmentIndex = binarySearchExact(this.internalTrack.fragments, currentFragment.moofOffset, x => x.moofOffset);\n assert(fragmentIndex !== -1);\n return {\n fragmentIndex,\n sampleIndex: 0,\n correctSampleFound: true,\n };\n }\n }\n return {\n fragmentIndex,\n sampleIndex: -1,\n correctSampleFound: false,\n };\n }\n }, fragmentSample.presentationTimestamp, Infinity, options);\n }\n const sampleIndex = this.packetToSampleIndex.get(packet);\n if (sampleIndex === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n return this.fetchPacketForSampleIndex(sampleIndex + 1, options);\n }\n async getKeyPacket(timestamp, options) {\n const timestampInTimescale = this.mapTimestampIntoTimescale(timestamp);\n if (this.internalTrack.demuxer.isFragmented) {\n return this.performFragmentedLookup(() => this.findKeySampleInFragmentsForTimestamp(timestampInTimescale), timestampInTimescale, timestampInTimescale, options);\n }\n const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack);\n const sampleIndex = getSampleIndexForTimestamp(sampleTable, timestampInTimescale);\n const keyFrameSampleIndex = sampleIndex === -1\n ? -1\n : getRelevantKeyframeIndexForSample(sampleTable, sampleIndex);\n return this.fetchPacketForSampleIndex(keyFrameSampleIndex, options);\n }\n async getNextKeyPacket(packet, options) {\n if (this.internalTrack.demuxer.isFragmented) {\n const locationInFragment = this.packetToFragmentLocation.get(packet);\n if (locationInFragment === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n const trackData = locationInFragment.fragment.trackData.get(this.internalTrack.id);\n const fragmentSample = trackData.samples[locationInFragment.sampleIndex];\n const fragmentIndex = binarySearchExact(this.internalTrack.fragments, locationInFragment.fragment.moofOffset, x => x.moofOffset);\n assert(fragmentIndex !== -1);\n return this.performFragmentedLookup(() => {\n const nextKeyFrameIndex = trackData.samples.findIndex((x, i) => x.isKeyFrame && i > locationInFragment.sampleIndex);\n if (nextKeyFrameIndex !== -1) {\n // We can simply take the next key frame in the fragment\n return {\n fragmentIndex,\n sampleIndex: nextKeyFrameIndex,\n correctSampleFound: true,\n };\n }\n else {\n // Walk the list of fragments until we find the next fragment for this track with a key frame\n let currentFragment = locationInFragment.fragment;\n while (currentFragment.nextFragment) {\n currentFragment = currentFragment.nextFragment;\n const trackData = currentFragment.trackData.get(this.internalTrack.id);\n if (trackData && trackData.firstKeyFrameTimestamp !== null) {\n const fragmentIndex = binarySearchExact(this.internalTrack.fragments, currentFragment.moofOffset, x => x.moofOffset);\n assert(fragmentIndex !== -1);\n const keyFrameIndex = trackData.samples.findIndex(x => x.isKeyFrame);\n assert(keyFrameIndex !== -1); // There must be one\n return {\n fragmentIndex,\n sampleIndex: keyFrameIndex,\n correctSampleFound: true,\n };\n }\n }\n return {\n fragmentIndex,\n sampleIndex: -1,\n correctSampleFound: false,\n };\n }\n }, fragmentSample.presentationTimestamp, Infinity, options);\n }\n const sampleIndex = this.packetToSampleIndex.get(packet);\n if (sampleIndex === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack);\n const nextKeyFrameSampleIndex = getNextKeyframeIndexForSample(sampleTable, sampleIndex);\n return this.fetchPacketForSampleIndex(nextKeyFrameSampleIndex, options);\n }\n async fetchPacketForSampleIndex(sampleIndex, options) {\n if (sampleIndex === -1) {\n return null;\n }\n const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack);\n const sampleInfo = getSampleInfo(sampleTable, sampleIndex);\n if (!sampleInfo) {\n return null;\n }\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n // Load the entire chunk\n await this.internalTrack.demuxer.chunkReader.reader.loadRange(sampleInfo.chunkOffset, sampleInfo.chunkOffset + sampleInfo.chunkSize);\n this.internalTrack.demuxer.chunkReader.pos = sampleInfo.sampleOffset;\n data = this.internalTrack.demuxer.chunkReader.readBytes(sampleInfo.sampleSize);\n }\n const timestamp = (sampleInfo.presentationTimestamp - this.internalTrack.editListOffset)\n / this.internalTrack.timescale;\n const duration = sampleInfo.duration / this.internalTrack.timescale;\n const packet = new EncodedPacket(data, sampleInfo.isKeyFrame ? 'key' : 'delta', timestamp, duration, sampleIndex, sampleInfo.sampleSize);\n this.packetToSampleIndex.set(packet, sampleIndex);\n return packet;\n }\n async fetchPacketInFragment(fragment, sampleIndex, options) {\n if (sampleIndex === -1) {\n return null;\n }\n const trackData = fragment.trackData.get(this.internalTrack.id);\n const fragmentSample = trackData.samples[sampleIndex];\n assert(fragmentSample);\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n // Load the entire fragment\n await this.internalTrack.demuxer.chunkReader.reader.loadRange(fragment.dataStart, fragment.dataEnd);\n this.internalTrack.demuxer.chunkReader.pos = fragmentSample.byteOffset;\n data = this.internalTrack.demuxer.chunkReader.readBytes(fragmentSample.byteSize);\n }\n const timestamp = (fragmentSample.presentationTimestamp - this.internalTrack.editListOffset)\n / this.internalTrack.timescale;\n const duration = fragmentSample.duration / this.internalTrack.timescale;\n const packet = new EncodedPacket(data, fragmentSample.isKeyFrame ? 'key' : 'delta', timestamp, duration, fragment.moofOffset + sampleIndex, fragmentSample.byteSize);\n this.packetToFragmentLocation.set(packet, { fragment, sampleIndex });\n return packet;\n }\n findSampleInFragmentsForTimestamp(timestampInTimescale) {\n const fragmentIndex = binarySearchLessOrEqual(\n // This array is technically not sorted by start timestamp, but for any reasonable file, it basically is.\n this.internalTrack.fragments, timestampInTimescale, x => x.trackData.get(this.internalTrack.id).startTimestamp);\n let sampleIndex = -1;\n let correctSampleFound = false;\n if (fragmentIndex !== -1) {\n const fragment = this.internalTrack.fragments[fragmentIndex];\n const trackData = fragment.trackData.get(this.internalTrack.id);\n const index = binarySearchLessOrEqual(trackData.presentationTimestamps, timestampInTimescale, x => x.presentationTimestamp);\n assert(index !== -1);\n sampleIndex = trackData.presentationTimestamps[index].sampleIndex;\n correctSampleFound = timestampInTimescale < trackData.endTimestamp;\n }\n return { fragmentIndex, sampleIndex, correctSampleFound };\n }\n findKeySampleInFragmentsForTimestamp(timestampInTimescale) {\n const indexInKeyFrameFragments = binarySearchLessOrEqual(\n // This array is technically not sorted by start timestamp, but for any reasonable file, it basically is.\n this.internalTrack.fragmentsWithKeyFrame, timestampInTimescale, x => x.trackData.get(this.internalTrack.id).startTimestamp);\n let fragmentIndex = -1;\n let sampleIndex = -1;\n let correctSampleFound = false;\n if (indexInKeyFrameFragments !== -1) {\n const fragment = this.internalTrack.fragmentsWithKeyFrame[indexInKeyFrameFragments];\n // Now, let's find the actual index of the fragment in the list of ALL fragments, not just key frame ones\n fragmentIndex = binarySearchExact(this.internalTrack.fragments, fragment.moofOffset, x => x.moofOffset);\n assert(fragmentIndex !== -1);\n const trackData = fragment.trackData.get(this.internalTrack.id);\n const index = findLastIndex(trackData.presentationTimestamps, (x) => {\n const sample = trackData.samples[x.sampleIndex];\n return sample.isKeyFrame && x.presentationTimestamp <= timestampInTimescale;\n });\n assert(index !== -1); // It's a key frame fragment, so there must be a key frame\n const entry = trackData.presentationTimestamps[index];\n sampleIndex = entry.sampleIndex;\n correctSampleFound = timestampInTimescale < trackData.endTimestamp;\n }\n return { fragmentIndex, sampleIndex, correctSampleFound };\n }\n /** Looks for a packet in the fragments while trying to load as few fragments as possible to retrieve it. */\n async performFragmentedLookup(getBestMatch, searchTimestamp, latestTimestamp, options) {\n const demuxer = this.internalTrack.demuxer;\n const release = await demuxer.fragmentLookupMutex.acquire(); // The algorithm requires exclusivity\n try {\n const { fragmentIndex, sampleIndex, correctSampleFound } = getBestMatch();\n if (correctSampleFound) {\n // The correct sample already exists, easy path.\n const fragment = this.internalTrack.fragments[fragmentIndex];\n return this.fetchPacketInFragment(fragment, sampleIndex, options);\n }\n const metadataReader = demuxer.metadataReader;\n const sourceSize = await metadataReader.reader.source.getSize();\n let prevFragment = null;\n let bestFragmentIndex = fragmentIndex;\n let bestSampleIndex = sampleIndex;\n // Search for a lookup entry; this way, we won't need to start searching from the start of the file\n // but can jump right into the correct fragment (or at least nearby).\n const lookupEntryIndex = this.internalTrack.fragmentLookupTable\n ? binarySearchLessOrEqual(this.internalTrack.fragmentLookupTable, searchTimestamp, x => x.timestamp)\n : -1;\n const lookupEntry = lookupEntryIndex !== -1\n ? this.internalTrack.fragmentLookupTable[lookupEntryIndex]\n : null;\n let nextFragmentIsFirstFragment = false;\n if (fragmentIndex === -1) {\n metadataReader.pos = lookupEntry?.moofOffset ?? 0;\n nextFragmentIsFirstFragment = metadataReader.pos === 0;\n }\n else {\n const fragment = this.internalTrack.fragments[fragmentIndex];\n if (!lookupEntry || fragment.moofOffset >= lookupEntry.moofOffset) {\n metadataReader.pos = fragment.moofOffset + fragment.moofSize;\n prevFragment = fragment;\n }\n else {\n // Use the lookup entry\n metadataReader.pos = lookupEntry.moofOffset;\n }\n }\n while (metadataReader.pos < sourceSize) {\n if (prevFragment) {\n const trackData = prevFragment.trackData.get(this.internalTrack.id);\n if (trackData && trackData.startTimestamp > latestTimestamp) {\n // We're already past the upper bound, no need to keep searching\n break;\n }\n if (prevFragment.nextFragment) {\n // Skip ahead quickly without needing to read the file again\n metadataReader.pos = prevFragment.nextFragment.moofOffset + prevFragment.nextFragment.moofSize;\n prevFragment = prevFragment.nextFragment;\n continue;\n }\n }\n // Load the header\n await metadataReader.reader.loadRange(metadataReader.pos, metadataReader.pos + MAX_BOX_HEADER_SIZE);\n const startPos = metadataReader.pos;\n const boxInfo = metadataReader.readBoxHeader();\n if (boxInfo.name === 'moof') {\n const index = binarySearchExact(demuxer.fragments, startPos, x => x.moofOffset);\n let fragment;\n if (index === -1) {\n // This is the first time we've seen this fragment\n metadataReader.pos = startPos;\n fragment = await demuxer.readFragment();\n }\n else {\n // We already know this fragment\n fragment = demuxer.fragments[index];\n }\n // Even if we already know the fragment, we might not yet know its predecessor, so always do this\n if (prevFragment)\n prevFragment.nextFragment = fragment;\n prevFragment = fragment;\n if (nextFragmentIsFirstFragment) {\n fragment.isKnownToBeFirstFragment = true;\n nextFragmentIsFirstFragment = false;\n }\n const { fragmentIndex, sampleIndex, correctSampleFound } = getBestMatch();\n if (correctSampleFound) {\n const fragment = this.internalTrack.fragments[fragmentIndex];\n return this.fetchPacketInFragment(fragment, sampleIndex, options);\n }\n if (fragmentIndex !== -1) {\n bestFragmentIndex = fragmentIndex;\n bestSampleIndex = sampleIndex;\n }\n }\n metadataReader.pos = startPos + boxInfo.totalSize;\n }\n let result = null;\n const bestFragment = bestFragmentIndex !== -1 ? this.internalTrack.fragments[bestFragmentIndex] : null;\n if (bestFragment) {\n // If we finished looping but didn't find a perfect match, still return the best match we found\n result = await this.fetchPacketInFragment(bestFragment, bestSampleIndex, options);\n }\n // Catch faulty lookup table entries\n if (!result && lookupEntry && (!bestFragment || bestFragment.moofOffset < lookupEntry.moofOffset)) {\n // The lookup table entry lied to us! We found a lookup entry but no fragment there that satisfied\n // the match. In this case, let's search again but using the lookup entry before that.\n const previousLookupEntry = this.internalTrack.fragmentLookupTable[lookupEntryIndex - 1];\n const newSearchTimestamp = previousLookupEntry?.timestamp ?? -Infinity;\n return this.performFragmentedLookup(getBestMatch, newSearchTimestamp, latestTimestamp, options);\n }\n return result;\n }\n finally {\n release();\n }\n }\n}\nclass IsobmffVideoTrackBacking extends IsobmffTrackBacking {\n constructor(internalTrack) {\n super(internalTrack);\n this.decoderConfigPromise = null;\n this.internalTrack = internalTrack;\n }\n getCodec() {\n return this.internalTrack.info.codec;\n }\n getCodedWidth() {\n return this.internalTrack.info.width;\n }\n getCodedHeight() {\n return this.internalTrack.info.height;\n }\n getRotation() {\n return this.internalTrack.rotation;\n }\n async getColorSpace() {\n return {\n primaries: this.internalTrack.info.colorSpace?.primaries,\n transfer: this.internalTrack.info.colorSpace?.transfer,\n matrix: this.internalTrack.info.colorSpace?.matrix,\n fullRange: this.internalTrack.info.colorSpace?.fullRange,\n };\n }\n async getDecoderConfig() {\n if (!this.internalTrack.info.codec) {\n return null;\n }\n return this.decoderConfigPromise ??= (async () => {\n if (this.internalTrack.info.codec === 'vp9' && !this.internalTrack.info.vp9CodecInfo) {\n const firstPacket = await this.getFirstPacket({});\n this.internalTrack.info.vp9CodecInfo = firstPacket && extractVp9CodecInfoFromPacket(firstPacket.data);\n }\n else if (this.internalTrack.info.codec === 'av1' && !this.internalTrack.info.av1CodecInfo) {\n const firstPacket = await this.getFirstPacket({});\n this.internalTrack.info.av1CodecInfo = firstPacket && extractAv1CodecInfoFromPacket(firstPacket.data);\n }\n return {\n codec: extractVideoCodecString(this.internalTrack.info),\n codedWidth: this.internalTrack.info.width,\n codedHeight: this.internalTrack.info.height,\n description: this.internalTrack.info.codecDescription ?? undefined,\n colorSpace: this.internalTrack.info.colorSpace ?? undefined,\n };\n })();\n }\n}\nclass IsobmffAudioTrackBacking extends IsobmffTrackBacking {\n constructor(internalTrack) {\n super(internalTrack);\n this.decoderConfig = null;\n this.internalTrack = internalTrack;\n }\n getCodec() {\n return this.internalTrack.info.codec;\n }\n getNumberOfChannels() {\n return this.internalTrack.info.numberOfChannels;\n }\n getSampleRate() {\n return this.internalTrack.info.sampleRate;\n }\n async getDecoderConfig() {\n if (!this.internalTrack.info.codec) {\n return null;\n }\n return this.decoderConfig ??= {\n codec: extractAudioCodecString(this.internalTrack.info),\n numberOfChannels: this.internalTrack.info.numberOfChannels,\n sampleRate: this.internalTrack.info.sampleRate,\n description: this.internalTrack.info.codecDescription ?? undefined,\n };\n }\n}\nconst getSampleIndexForTimestamp = (sampleTable, timescaleUnits) => {\n if (sampleTable.presentationTimestamps) {\n const index = binarySearchLessOrEqual(sampleTable.presentationTimestamps, timescaleUnits, x => x.presentationTimestamp);\n if (index === -1) {\n return -1;\n }\n return sampleTable.presentationTimestamps[index].sampleIndex;\n }\n else {\n const index = binarySearchLessOrEqual(sampleTable.sampleTimingEntries, timescaleUnits, x => x.startDecodeTimestamp);\n if (index === -1) {\n return -1;\n }\n const entry = sampleTable.sampleTimingEntries[index];\n return entry.startIndex\n + Math.min(Math.floor((timescaleUnits - entry.startDecodeTimestamp) / entry.delta), entry.count - 1);\n }\n};\nconst getSampleInfo = (sampleTable, sampleIndex) => {\n const timingEntryIndex = binarySearchLessOrEqual(sampleTable.sampleTimingEntries, sampleIndex, x => x.startIndex);\n const timingEntry = sampleTable.sampleTimingEntries[timingEntryIndex];\n if (!timingEntry || timingEntry.startIndex + timingEntry.count <= sampleIndex) {\n return null;\n }\n const decodeTimestamp = timingEntry.startDecodeTimestamp\n + (sampleIndex - timingEntry.startIndex) * timingEntry.delta;\n let presentationTimestamp = decodeTimestamp;\n const offsetEntryIndex = binarySearchLessOrEqual(sampleTable.sampleCompositionTimeOffsets, sampleIndex, x => x.startIndex);\n const offsetEntry = sampleTable.sampleCompositionTimeOffsets[offsetEntryIndex];\n if (offsetEntry && sampleIndex - offsetEntry.startIndex < offsetEntry.count) {\n presentationTimestamp += offsetEntry.offset;\n }\n const sampleSize = sampleTable.sampleSizes[Math.min(sampleIndex, sampleTable.sampleSizes.length - 1)];\n const chunkEntryIndex = binarySearchLessOrEqual(sampleTable.sampleToChunk, sampleIndex, x => x.startSampleIndex);\n const chunkEntry = sampleTable.sampleToChunk[chunkEntryIndex];\n assert(chunkEntry);\n const chunkIndex = chunkEntry.startChunkIndex\n + Math.floor((sampleIndex - chunkEntry.startSampleIndex) / chunkEntry.samplesPerChunk);\n const chunkOffset = sampleTable.chunkOffsets[chunkIndex];\n const startSampleIndexOfChunk = chunkEntry.startSampleIndex\n + (chunkIndex - chunkEntry.startChunkIndex) * chunkEntry.samplesPerChunk;\n let chunkSize = 0;\n let sampleOffset = chunkOffset;\n if (sampleTable.sampleSizes.length === 1) {\n sampleOffset += sampleSize * (sampleIndex - startSampleIndexOfChunk);\n chunkSize += sampleSize * chunkEntry.samplesPerChunk;\n }\n else {\n for (let i = startSampleIndexOfChunk; i < startSampleIndexOfChunk + chunkEntry.samplesPerChunk; i++) {\n const sampleSize = sampleTable.sampleSizes[i];\n if (i < sampleIndex) {\n sampleOffset += sampleSize;\n }\n chunkSize += sampleSize;\n }\n }\n let duration = timingEntry.delta;\n if (sampleTable.presentationTimestamps) {\n // In order to accurately compute the duration, we need to take the duration to the next sample in presentation\n // order, not in decode order\n const presentationIndex = sampleTable.presentationTimestampIndexMap[sampleIndex];\n assert(presentationIndex !== undefined);\n if (presentationIndex < sampleTable.presentationTimestamps.length - 1) {\n const nextEntry = sampleTable.presentationTimestamps[presentationIndex + 1];\n const nextPresentationTimestamp = nextEntry.presentationTimestamp;\n duration = nextPresentationTimestamp - presentationTimestamp;\n }\n }\n return {\n presentationTimestamp,\n duration,\n sampleOffset,\n sampleSize,\n chunkOffset,\n chunkSize,\n isKeyFrame: sampleTable.keySampleIndices\n ? binarySearchExact(sampleTable.keySampleIndices, sampleIndex, x => x) !== -1\n : true,\n };\n};\nconst getRelevantKeyframeIndexForSample = (sampleTable, sampleIndex) => {\n if (!sampleTable.keySampleIndices) {\n return sampleIndex;\n }\n const index = binarySearchLessOrEqual(sampleTable.keySampleIndices, sampleIndex, x => x);\n return sampleTable.keySampleIndices[index] ?? -1;\n};\nconst getNextKeyframeIndexForSample = (sampleTable, sampleIndex) => {\n if (!sampleTable.keySampleIndices) {\n return sampleIndex + 1;\n }\n const index = binarySearchLessOrEqual(sampleTable.keySampleIndices, sampleIndex, x => x);\n return sampleTable.keySampleIndices[index + 1] ?? -1;\n};\nconst offsetFragmentTrackDataByTimestamp = (trackData, timestamp) => {\n trackData.startTimestamp += timestamp;\n trackData.endTimestamp += timestamp;\n for (const sample of trackData.samples) {\n sample.presentationTimestamp += timestamp;\n }\n for (const entry of trackData.presentationTimestamps) {\n entry.presentationTimestamp += timestamp;\n }\n};\n/** Extracts the rotation component from a transformation matrix, in degrees. */\nconst extractRotationFromMatrix = (matrix) => {\n const [m11, , , m21] = matrix;\n const scaleX = Math.hypot(m11, m21);\n const cosTheta = m11 / scaleX;\n const sinTheta = m21 / scaleX;\n // Invert the rotation because matrices are post-multiplied in ISOBMFF\n return -Math.atan2(sinTheta, cosTheta) * (180 / Math.PI);\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { extractAv1CodecInfoFromPacket, extractAvcDecoderConfigurationRecord, extractHevcDecoderConfigurationRecord, extractVp9CodecInfoFromPacket, } from '../codec-data.js';\nimport { extractAudioCodecString, extractVideoCodecString, } from '../codec.js';\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack, InputVideoTrack, } from '../input-track.js';\nimport { assert, AsyncMutex, binarySearchExact, binarySearchLessOrEqual, COLOR_PRIMARIES_MAP_INVERSE, findLastIndex, isIso639Dash2LanguageCode, last, MATRIX_COEFFICIENTS_MAP_INVERSE, normalizeRotation, roundToPrecision, TRANSFER_CHARACTERISTICS_MAP_INVERSE, UNDETERMINED_LANGUAGE, } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { Reader } from '../reader.js';\nimport { assertDefinedSize, CODEC_STRING_MAP, EBMLId, EBMLReader, LEVEL_0_AND_1_EBML_IDS, MAX_HEADER_SIZE, MIN_HEADER_SIZE, } from './ebml.js';\nimport { buildMatroskaMimeType } from './matroska-misc.js';\nconst METADATA_ELEMENTS = [\n { id: EBMLId.SeekHead, flag: 'seekHeadSeen' },\n { id: EBMLId.Info, flag: 'infoSeen' },\n { id: EBMLId.Tracks, flag: 'tracksSeen' },\n { id: EBMLId.Cues, flag: 'cuesSeen' },\n];\nexport class MatroskaDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.readMetadataPromise = null;\n this.segments = [];\n this.currentSegment = null;\n this.currentTrack = null;\n this.currentCluster = null;\n this.currentBlock = null;\n this.currentCueTime = null;\n this.isWebM = false;\n this.metadataReader = new EBMLReader(input._mainReader);\n // Max 64 MiB of stored clusters\n this.clusterReader = new EBMLReader(new Reader(input.source, 64 * 2 ** 20));\n }\n async computeDuration() {\n const tracks = await this.getTracks();\n const trackDurations = await Promise.all(tracks.map(x => x.computeDuration()));\n return Math.max(0, ...trackDurations);\n }\n async getTracks() {\n await this.readMetadata();\n return this.segments.flatMap(segment => segment.tracks.map(track => track.inputTrack));\n }\n async getMimeType() {\n await this.readMetadata();\n const tracks = await this.getTracks();\n const codecStrings = await Promise.all(tracks.map(x => x.getCodecParameterString()));\n return buildMatroskaMimeType({\n isWebM: this.isWebM,\n hasVideo: this.segments.some(segment => segment.tracks.some(x => x.info?.type === 'video')),\n hasAudio: this.segments.some(segment => segment.tracks.some(x => x.info?.type === 'audio')),\n codecStrings: codecStrings.filter(Boolean),\n });\n }\n readMetadata() {\n return this.readMetadataPromise ??= (async () => {\n this.metadataReader.pos = 0;\n const fileSize = await this.input.source.getSize();\n while (this.metadataReader.pos <= fileSize - MIN_HEADER_SIZE) {\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + MAX_HEADER_SIZE);\n const { id, size } = this.metadataReader.readElementHeader();\n const startPos = this.metadataReader.pos;\n if (id === EBMLId.EBML) {\n assertDefinedSize(size);\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + size);\n this.readContiguousElements(this.metadataReader, size);\n }\n else if (id === EBMLId.Segment) { // Segment found!\n await this.readSegment(size);\n if (size === null) {\n // Segment sizes can be undefined (common in livestreamed files), so assume this is the last\n // and only segment\n break;\n }\n }\n assertDefinedSize(size);\n this.metadataReader.pos = startPos + size;\n }\n })();\n }\n async readSegment(dataSize) {\n const segmentDataStart = this.metadataReader.pos;\n this.currentSegment = {\n seekHeadSeen: false,\n infoSeen: false,\n tracksSeen: false,\n cuesSeen: false,\n timestampScale: -1,\n timestampFactor: -1,\n duration: -1,\n seekEntries: [],\n tracks: [],\n cuePoints: [],\n dataStartPos: segmentDataStart,\n elementEndPos: dataSize === null\n ? await this.input.source.getSize() // Assume it goes until the end of the file\n : segmentDataStart + dataSize,\n clusterSeekStartPos: segmentDataStart,\n clusters: [],\n clusterLookupMutex: new AsyncMutex(),\n };\n this.segments.push(this.currentSegment);\n // Let's load a good amount of data, enough for all segment metadata to likely fit into (minus cues)\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + 2 ** 14);\n let clusterEncountered = false;\n while (this.metadataReader.pos < this.currentSegment.elementEndPos) {\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + MAX_HEADER_SIZE);\n const elementStartPos = this.metadataReader.pos;\n const { id, size } = this.metadataReader.readElementHeader();\n const dataStartPos = this.metadataReader.pos;\n const metadataElementIndex = METADATA_ELEMENTS.findIndex(x => x.id === id);\n if (metadataElementIndex !== -1) {\n const field = METADATA_ELEMENTS[metadataElementIndex].flag;\n this.currentSegment[field] = true;\n assertDefinedSize(size);\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + size);\n this.readContiguousElements(this.metadataReader, size);\n }\n else if (id === EBMLId.Cluster) {\n if (!clusterEncountered) {\n clusterEncountered = true;\n this.currentSegment.clusterSeekStartPos = elementStartPos;\n }\n }\n if (this.currentSegment.infoSeen && this.currentSegment.tracksSeen && this.currentSegment.cuesSeen) {\n // No need to search anymore, we have everything\n break;\n }\n if (this.currentSegment.seekHeadSeen) {\n let hasInfo = this.currentSegment.infoSeen;\n let hasTracks = this.currentSegment.tracksSeen;\n let hasCues = this.currentSegment.cuesSeen;\n for (const entry of this.currentSegment.seekEntries) {\n if (entry.id === EBMLId.Info) {\n hasInfo = true;\n }\n else if (entry.id === EBMLId.Tracks) {\n hasTracks = true;\n }\n else if (entry.id === EBMLId.Cues) {\n hasCues = true;\n }\n }\n if (hasInfo && hasTracks && hasCues) {\n // No need to search sequentially anymore, we can use the seek head\n break;\n }\n }\n if (size === null) {\n break;\n }\n this.metadataReader.pos = dataStartPos + size;\n if (!clusterEncountered) {\n this.currentSegment.clusterSeekStartPos = this.metadataReader.pos;\n }\n }\n // Use the seek head to read missing metadata elements\n for (const target of METADATA_ELEMENTS) {\n if (this.currentSegment[target.flag])\n continue;\n const seekEntry = this.currentSegment.seekEntries.find(entry => entry.id === target.id);\n if (!seekEntry)\n continue;\n this.metadataReader.pos = segmentDataStart + seekEntry.segmentPosition;\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + 2 ** 12);\n const { id, size } = this.metadataReader.readElementHeader();\n if (id !== target.id)\n continue;\n assertDefinedSize(size);\n this.currentSegment[target.flag] = true;\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + size);\n this.readContiguousElements(this.metadataReader, size);\n }\n // Put default tracks first\n this.currentSegment.tracks.sort((a, b) => Number(b.isDefault) - Number(a.isDefault));\n // Sort cue points by cluster position (required for the next algorithm)\n this.currentSegment.cuePoints.sort((a, b) => a.clusterPosition - b.clusterPosition);\n // Now, let's distribute the cue points to each track. Ideally, each track has their own cue point, but some\n // Matroska files may only specify cue points for a single track. In this case, we still wanna use those cue\n // points for all tracks.\n const allTrackIds = this.currentSegment.tracks.map(x => x.id);\n const remainingTrackIds = new Set();\n let lastClusterPosition = null;\n let lastCuePoint = null;\n for (const cuePoint of this.currentSegment.cuePoints) {\n if (cuePoint.clusterPosition !== lastClusterPosition) {\n for (const id of remainingTrackIds) {\n // These tracks didn't receive a cue point for the last cluster, so let's give them one\n assert(lastCuePoint);\n const track = this.currentSegment.tracks.find(x => x.id === id);\n track.cuePoints.push(lastCuePoint);\n }\n for (const id of allTrackIds) {\n remainingTrackIds.add(id);\n }\n }\n lastCuePoint = cuePoint;\n if (!remainingTrackIds.has(cuePoint.trackId)) {\n continue;\n }\n const track = this.currentSegment.tracks.find(x => x.id === cuePoint.trackId);\n track.cuePoints.push(cuePoint);\n remainingTrackIds.delete(cuePoint.trackId);\n lastClusterPosition = cuePoint.clusterPosition;\n }\n for (const id of remainingTrackIds) {\n assert(lastCuePoint);\n const track = this.currentSegment.tracks.find(x => x.id === id);\n track.cuePoints.push(lastCuePoint);\n }\n for (const track of this.currentSegment.tracks) {\n // Sort cue points by time\n track.cuePoints.sort((a, b) => a.time - b.time);\n }\n this.currentSegment = null;\n }\n async readCluster(segment) {\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + MAX_HEADER_SIZE);\n const elementStartPos = this.metadataReader.pos;\n const elementHeader = this.metadataReader.readElementHeader();\n const id = elementHeader.id;\n let size = elementHeader.size;\n const dataStartPos = this.metadataReader.pos;\n if (size === null) {\n // The cluster's size is undefined (can happen in livestreamed files). We'd still like to know the size of\n // it, so we have no other choice but to iterate over the EBML structure until we find an element at level\n // 0 or 1, indicating the end of the cluster (all elements inside the cluster are at level 2).\n this.clusterReader.pos = dataStartPos;\n const nextElementPos = await this.clusterReader.searchForNextElementId(LEVEL_0_AND_1_EBML_IDS, segment.elementEndPos);\n size = (nextElementPos ?? segment.elementEndPos) - dataStartPos;\n }\n assert(id === EBMLId.Cluster);\n // Load the entire cluster\n this.clusterReader.pos = dataStartPos;\n await this.clusterReader.reader.loadRange(this.clusterReader.pos, this.clusterReader.pos + size);\n const cluster = {\n elementStartPos,\n elementEndPos: dataStartPos + size,\n dataStartPos,\n timestamp: -1,\n trackData: new Map(),\n nextCluster: null,\n isKnownToBeFirstCluster: false,\n };\n this.currentCluster = cluster;\n this.readContiguousElements(this.clusterReader, size);\n for (const [trackId, trackData] of cluster.trackData) {\n let blockReferencesExist = false;\n // This must hold, as track datas only get created if a block for that track is encountered\n assert(trackData.blocks.length > 0);\n for (let i = 0; i < trackData.blocks.length; i++) {\n const block = trackData.blocks[i];\n block.timestamp += cluster.timestamp;\n blockReferencesExist ||= block.referencedTimestamps.length > 0;\n }\n if (blockReferencesExist) {\n trackData.blocks = sortBlocksByReferences(trackData.blocks);\n }\n trackData.presentationTimestamps = trackData.blocks\n .map((block, i) => ({ timestamp: block.timestamp, blockIndex: i }))\n .sort((a, b) => a.timestamp - b.timestamp);\n for (let i = 0; i < trackData.presentationTimestamps.length; i++) {\n const currentEntry = trackData.presentationTimestamps[i];\n const currentBlock = trackData.blocks[currentEntry.blockIndex];\n if (trackData.firstKeyFrameTimestamp === null && currentBlock.isKeyFrame) {\n trackData.firstKeyFrameTimestamp = currentBlock.timestamp;\n }\n if (i < trackData.presentationTimestamps.length - 1) {\n // Update block durations based on presentation order\n const nextEntry = trackData.presentationTimestamps[i + 1];\n currentBlock.duration = nextEntry.timestamp - currentBlock.timestamp;\n }\n }\n const firstBlock = trackData.blocks[trackData.presentationTimestamps[0].blockIndex];\n const lastBlock = trackData.blocks[last(trackData.presentationTimestamps).blockIndex];\n trackData.startTimestamp = firstBlock.timestamp;\n trackData.endTimestamp = lastBlock.timestamp + lastBlock.duration;\n const track = segment.tracks.find(x => x.id === trackId);\n if (track) {\n const insertionIndex = binarySearchLessOrEqual(track.clusters, cluster.elementStartPos, x => x.elementStartPos);\n track.clusters.splice(insertionIndex + 1, 0, cluster);\n const hasKeyFrame = trackData.firstKeyFrameTimestamp !== null;\n if (hasKeyFrame) {\n const insertionIndex = binarySearchLessOrEqual(track.clustersWithKeyFrame, cluster.elementStartPos, x => x.elementStartPos);\n track.clustersWithKeyFrame.splice(insertionIndex + 1, 0, cluster);\n }\n }\n }\n const insertionIndex = binarySearchLessOrEqual(segment.clusters, elementStartPos, x => x.elementStartPos);\n segment.clusters.splice(insertionIndex + 1, 0, cluster);\n this.currentCluster = null;\n return cluster;\n }\n getTrackDataInCluster(cluster, trackNumber) {\n let trackData = cluster.trackData.get(trackNumber);\n if (!trackData) {\n trackData = {\n startTimestamp: 0,\n endTimestamp: 0,\n firstKeyFrameTimestamp: null,\n blocks: [],\n presentationTimestamps: [],\n };\n cluster.trackData.set(trackNumber, trackData);\n }\n return trackData;\n }\n readContiguousElements(reader, totalSize) {\n const startIndex = reader.pos;\n while (reader.pos - startIndex <= totalSize - MIN_HEADER_SIZE) {\n this.traverseElement(reader);\n }\n }\n traverseElement(reader) {\n const { id, size } = reader.readElementHeader();\n const dataStartPos = reader.pos;\n assertDefinedSize(size);\n switch (id) {\n case EBMLId.DocType:\n {\n this.isWebM = reader.readString(size) === 'webm';\n }\n ;\n break;\n case EBMLId.Seek:\n {\n if (!this.currentSegment)\n break;\n const seekEntry = { id: -1, segmentPosition: -1 };\n this.currentSegment.seekEntries.push(seekEntry);\n this.readContiguousElements(reader, size);\n if (seekEntry.id === -1 || seekEntry.segmentPosition === -1) {\n this.currentSegment.seekEntries.pop();\n }\n }\n ;\n break;\n case EBMLId.SeekID:\n {\n const lastSeekEntry = this.currentSegment?.seekEntries[this.currentSegment.seekEntries.length - 1];\n if (!lastSeekEntry)\n break;\n lastSeekEntry.id = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.SeekPosition:\n {\n const lastSeekEntry = this.currentSegment?.seekEntries[this.currentSegment.seekEntries.length - 1];\n if (!lastSeekEntry)\n break;\n lastSeekEntry.segmentPosition = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.TimestampScale:\n {\n if (!this.currentSegment)\n break;\n this.currentSegment.timestampScale = reader.readUnsignedInt(size);\n this.currentSegment.timestampFactor = 1e9 / this.currentSegment.timestampScale;\n }\n ;\n break;\n case EBMLId.Duration:\n {\n if (!this.currentSegment)\n break;\n this.currentSegment.duration = reader.readFloat(size);\n }\n ;\n break;\n case EBMLId.TrackEntry:\n {\n if (!this.currentSegment)\n break;\n this.currentTrack = {\n id: -1,\n segment: this.currentSegment,\n demuxer: this,\n clusters: [],\n clustersWithKeyFrame: [],\n cuePoints: [],\n isDefault: false,\n inputTrack: null,\n codecId: null,\n codecPrivate: null,\n languageCode: UNDETERMINED_LANGUAGE,\n info: null,\n };\n this.readContiguousElements(reader, size);\n if (this.currentTrack\n && this.currentTrack.id !== -1\n && this.currentTrack.codecId\n && this.currentTrack.info) {\n const slashIndex = this.currentTrack.codecId.indexOf('/');\n const codecIdWithoutSuffix = slashIndex === -1\n ? this.currentTrack.codecId\n : this.currentTrack.codecId.slice(0, slashIndex);\n if (this.currentTrack.info.type === 'video'\n && this.currentTrack.info.width !== -1\n && this.currentTrack.info.height !== -1) {\n if (this.currentTrack.codecId === CODEC_STRING_MAP.avc) {\n this.currentTrack.info.codec = 'avc';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (this.currentTrack.codecId === CODEC_STRING_MAP.hevc) {\n this.currentTrack.info.codec = 'hevc';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.vp8) {\n this.currentTrack.info.codec = 'vp8';\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.vp9) {\n this.currentTrack.info.codec = 'vp9';\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.av1) {\n this.currentTrack.info.codec = 'av1';\n }\n const videoTrack = this.currentTrack;\n const inputTrack = new InputVideoTrack(new MatroskaVideoTrackBacking(videoTrack));\n this.currentTrack.inputTrack = inputTrack;\n this.currentSegment.tracks.push(this.currentTrack);\n }\n else if (this.currentTrack.info.type === 'audio'\n && this.currentTrack.info.numberOfChannels !== -1\n && this.currentTrack.info.sampleRate !== -1) {\n if (codecIdWithoutSuffix === CODEC_STRING_MAP.aac) {\n this.currentTrack.info.codec = 'aac';\n this.currentTrack.info.aacCodecInfo = {\n isMpeg2: this.currentTrack.codecId.includes('MPEG2'),\n };\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (this.currentTrack.codecId === CODEC_STRING_MAP.mp3) {\n this.currentTrack.info.codec = 'mp3';\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.opus) {\n this.currentTrack.info.codec = 'opus';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.vorbis) {\n this.currentTrack.info.codec = 'vorbis';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.flac) {\n this.currentTrack.info.codec = 'flac';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (this.currentTrack.codecId === 'A_PCM/INT/LIT') {\n if (this.currentTrack.info.bitDepth === 8) {\n this.currentTrack.info.codec = 'pcm-u8';\n }\n else if (this.currentTrack.info.bitDepth === 16) {\n this.currentTrack.info.codec = 'pcm-s16';\n }\n else if (this.currentTrack.info.bitDepth === 24) {\n this.currentTrack.info.codec = 'pcm-s24';\n }\n else if (this.currentTrack.info.bitDepth === 32) {\n this.currentTrack.info.codec = 'pcm-s32';\n }\n }\n else if (this.currentTrack.codecId === 'A_PCM/INT/BIG') {\n if (this.currentTrack.info.bitDepth === 8) {\n this.currentTrack.info.codec = 'pcm-u8';\n }\n else if (this.currentTrack.info.bitDepth === 16) {\n this.currentTrack.info.codec = 'pcm-s16be';\n }\n else if (this.currentTrack.info.bitDepth === 24) {\n this.currentTrack.info.codec = 'pcm-s24be';\n }\n else if (this.currentTrack.info.bitDepth === 32) {\n this.currentTrack.info.codec = 'pcm-s32be';\n }\n }\n else if (this.currentTrack.codecId === 'A_PCM/FLOAT/IEEE') {\n if (this.currentTrack.info.bitDepth === 32) {\n this.currentTrack.info.codec = 'pcm-f32';\n }\n else if (this.currentTrack.info.bitDepth === 64) {\n this.currentTrack.info.codec = 'pcm-f64';\n }\n }\n const audioTrack = this.currentTrack;\n const inputTrack = new InputAudioTrack(new MatroskaAudioTrackBacking(audioTrack));\n this.currentTrack.inputTrack = inputTrack;\n this.currentSegment.tracks.push(this.currentTrack);\n }\n }\n this.currentTrack = null;\n }\n ;\n break;\n case EBMLId.TrackNumber:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.id = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.TrackType:\n {\n if (!this.currentTrack)\n break;\n const type = reader.readUnsignedInt(size);\n if (type === 1) {\n this.currentTrack.info = {\n type: 'video',\n width: -1,\n height: -1,\n rotation: 0,\n codec: null,\n codecDescription: null,\n colorSpace: null,\n };\n }\n else if (type === 2) {\n this.currentTrack.info = {\n type: 'audio',\n numberOfChannels: -1,\n sampleRate: -1,\n bitDepth: -1,\n codec: null,\n codecDescription: null,\n aacCodecInfo: null,\n };\n }\n }\n ;\n break;\n case EBMLId.FlagEnabled:\n {\n if (!this.currentTrack)\n break;\n const enabled = reader.readUnsignedInt(size);\n if (!enabled) {\n this.currentSegment.tracks.pop();\n this.currentTrack = null;\n }\n }\n ;\n break;\n case EBMLId.FlagDefault:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.isDefault = !!reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.CodecID:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.codecId = reader.readString(size);\n }\n ;\n break;\n case EBMLId.CodecPrivate:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.codecPrivate = reader.readBytes(size);\n }\n ;\n break;\n case EBMLId.Language:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.languageCode = reader.readString(size);\n if (!isIso639Dash2LanguageCode(this.currentTrack.languageCode)) {\n this.currentTrack.languageCode = UNDETERMINED_LANGUAGE;\n }\n }\n ;\n break;\n case EBMLId.Video:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.readContiguousElements(reader, size);\n }\n ;\n break;\n case EBMLId.PixelWidth:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.currentTrack.info.width = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.PixelHeight:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.currentTrack.info.height = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.Colour:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.currentTrack.info.colorSpace = {};\n this.readContiguousElements(reader, size);\n }\n ;\n break;\n case EBMLId.MatrixCoefficients:\n {\n if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace)\n break;\n const matrixCoefficients = reader.readUnsignedInt(size);\n const mapped = MATRIX_COEFFICIENTS_MAP_INVERSE[matrixCoefficients] ?? null;\n this.currentTrack.info.colorSpace.matrix = mapped;\n }\n ;\n break;\n case EBMLId.Range:\n {\n if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace)\n break;\n this.currentTrack.info.colorSpace.fullRange = reader.readUnsignedInt(size) === 2;\n }\n ;\n break;\n case EBMLId.TransferCharacteristics:\n {\n if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace)\n break;\n const transferCharacteristics = reader.readUnsignedInt(size);\n const mapped = TRANSFER_CHARACTERISTICS_MAP_INVERSE[transferCharacteristics] ?? null;\n this.currentTrack.info.colorSpace.transfer = mapped;\n }\n ;\n break;\n case EBMLId.Primaries:\n {\n if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace)\n break;\n const primaries = reader.readUnsignedInt(size);\n const mapped = COLOR_PRIMARIES_MAP_INVERSE[primaries] ?? null;\n this.currentTrack.info.colorSpace.primaries = mapped;\n }\n ;\n break;\n case EBMLId.Projection:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.readContiguousElements(reader, size);\n }\n ;\n break;\n case EBMLId.ProjectionPoseRoll:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n const rotation = reader.readFloat(size);\n const flippedRotation = -rotation; // Convert counter-clockwise to clockwise\n try {\n this.currentTrack.info.rotation = normalizeRotation(flippedRotation);\n }\n catch {\n // It wasn't a valid rotation\n }\n }\n ;\n break;\n case EBMLId.Audio:\n {\n if (this.currentTrack?.info?.type !== 'audio')\n break;\n this.readContiguousElements(reader, size);\n }\n ;\n break;\n case EBMLId.SamplingFrequency:\n {\n if (this.currentTrack?.info?.type !== 'audio')\n break;\n this.currentTrack.info.sampleRate = reader.readFloat(size);\n }\n ;\n break;\n case EBMLId.Channels:\n {\n if (this.currentTrack?.info?.type !== 'audio')\n break;\n this.currentTrack.info.numberOfChannels = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.BitDepth:\n {\n if (this.currentTrack?.info?.type !== 'audio')\n break;\n this.currentTrack.info.bitDepth = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.CuePoint:\n {\n if (!this.currentSegment)\n break;\n this.readContiguousElements(reader, size);\n this.currentCueTime = null;\n }\n ;\n break;\n case EBMLId.CueTime:\n {\n this.currentCueTime = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.CueTrackPositions:\n {\n if (this.currentCueTime === null)\n break;\n assert(this.currentSegment);\n const cuePoint = { time: this.currentCueTime, trackId: -1, clusterPosition: -1 };\n this.currentSegment.cuePoints.push(cuePoint);\n this.readContiguousElements(reader, size);\n if (cuePoint.trackId === -1 || cuePoint.clusterPosition === -1) {\n this.currentSegment.cuePoints.pop();\n }\n }\n ;\n break;\n case EBMLId.CueTrack:\n {\n const lastCuePoint = this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length - 1];\n if (!lastCuePoint)\n break;\n lastCuePoint.trackId = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.CueClusterPosition:\n {\n const lastCuePoint = this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length - 1];\n if (!lastCuePoint)\n break;\n assert(this.currentSegment);\n lastCuePoint.clusterPosition = this.currentSegment.dataStartPos + reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.Timestamp:\n {\n if (!this.currentCluster)\n break;\n this.currentCluster.timestamp = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.SimpleBlock:\n {\n if (!this.currentCluster)\n break;\n const trackNumber = reader.readVarInt();\n const relativeTimestamp = reader.readS16();\n const flags = reader.readU8();\n const isKeyFrame = !!(flags & 0x80);\n const trackData = this.getTrackDataInCluster(this.currentCluster, trackNumber);\n trackData.blocks.push({\n timestamp: relativeTimestamp, // We'll add the cluster's timestamp to this later\n duration: 0,\n isKeyFrame,\n referencedTimestamps: [],\n data: reader.readBytes(size - (reader.pos - dataStartPos)),\n });\n }\n ;\n break;\n case EBMLId.BlockGroup:\n {\n if (!this.currentCluster)\n break;\n this.readContiguousElements(reader, size);\n if (this.currentBlock) {\n for (let i = 0; i < this.currentBlock.referencedTimestamps.length; i++) {\n this.currentBlock.referencedTimestamps[i] += this.currentBlock.timestamp;\n }\n this.currentBlock = null;\n }\n }\n ;\n break;\n case EBMLId.Block:\n {\n if (!this.currentCluster)\n break;\n const trackNumber = reader.readVarInt();\n const relativeTimestamp = reader.readS16();\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const flags = reader.readU8();\n const trackData = this.getTrackDataInCluster(this.currentCluster, trackNumber);\n this.currentBlock = {\n timestamp: relativeTimestamp, // We'll add the cluster's timestamp to this later\n duration: 0,\n isKeyFrame: true,\n referencedTimestamps: [],\n data: reader.readBytes(size - (reader.pos - dataStartPos)),\n };\n trackData.blocks.push(this.currentBlock);\n }\n ;\n break;\n case EBMLId.BlockDuration:\n {\n if (!this.currentBlock)\n break;\n this.currentBlock.duration = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.ReferenceBlock:\n {\n if (!this.currentBlock)\n break;\n this.currentBlock.isKeyFrame = false;\n const relativeTimestamp = reader.readSignedInt(size);\n // We'll offset this by the block's timestamp later\n this.currentBlock.referencedTimestamps.push(relativeTimestamp);\n }\n ;\n break;\n }\n reader.pos = dataStartPos + size;\n }\n}\nclass MatroskaTrackBacking {\n constructor(internalTrack) {\n this.internalTrack = internalTrack;\n this.packetToClusterLocation = new WeakMap();\n }\n getId() {\n return this.internalTrack.id;\n }\n getCodec() {\n throw new Error('Not implemented on base class.');\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n getLanguageCode() {\n return this.internalTrack.languageCode;\n }\n async getFirstTimestamp() {\n const firstPacket = await this.getFirstPacket({ metadataOnly: true });\n return firstPacket?.timestamp ?? 0;\n }\n getTimeResolution() {\n return this.internalTrack.segment.timestampFactor;\n }\n async getFirstPacket(options) {\n return this.performClusterLookup(() => {\n const startCluster = this.internalTrack.segment.clusters[0] ?? null;\n if (startCluster?.isKnownToBeFirstCluster) {\n // Walk from the very first cluster in the file until we find one with our track in it\n let currentCluster = startCluster;\n while (currentCluster) {\n const trackData = currentCluster.trackData.get(this.internalTrack.id);\n if (trackData) {\n return {\n clusterIndex: binarySearchExact(this.internalTrack.clusters, currentCluster.elementStartPos, x => x.elementStartPos),\n blockIndex: 0,\n correctBlockFound: true,\n };\n }\n currentCluster = currentCluster.nextCluster;\n }\n }\n return {\n clusterIndex: -1,\n blockIndex: -1,\n correctBlockFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the cues\n Infinity, options);\n }\n intoTimescale(timestamp) {\n // Do a little rounding to catch cases where the result is very close to an integer. If it is, it's likely\n // that the number was originally an integer divided by the timescale. For stability, it's best\n // to return the integer in this case.\n return roundToPrecision(timestamp * this.internalTrack.segment.timestampFactor, 14);\n }\n async getPacket(timestamp, options) {\n const timestampInTimescale = this.intoTimescale(timestamp);\n return this.performClusterLookup(() => this.findBlockInClustersForTimestamp(timestampInTimescale), timestampInTimescale, timestampInTimescale, options);\n }\n async getNextPacket(packet, options) {\n const locationInCluster = this.packetToClusterLocation.get(packet);\n if (locationInCluster === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n const trackData = locationInCluster.cluster.trackData.get(this.internalTrack.id);\n const block = trackData.blocks[locationInCluster.blockIndex];\n const clusterIndex = binarySearchExact(this.internalTrack.clusters, locationInCluster.cluster.elementStartPos, x => x.elementStartPos);\n assert(clusterIndex !== -1);\n return this.performClusterLookup(() => {\n if (locationInCluster.blockIndex + 1 < trackData.blocks.length) {\n // We can simply take the next block in the cluster\n return {\n clusterIndex,\n blockIndex: locationInCluster.blockIndex + 1,\n correctBlockFound: true,\n };\n }\n else {\n // Walk the list of clusters until we find the next cluster for this track\n let currentCluster = locationInCluster.cluster;\n while (currentCluster.nextCluster) {\n currentCluster = currentCluster.nextCluster;\n const trackData = currentCluster.trackData.get(this.internalTrack.id);\n if (trackData) {\n const clusterIndex = binarySearchExact(this.internalTrack.clusters, currentCluster.elementStartPos, x => x.elementStartPos);\n assert(clusterIndex !== -1);\n return {\n clusterIndex,\n blockIndex: 0,\n correctBlockFound: true,\n };\n }\n }\n return {\n clusterIndex,\n blockIndex: -1,\n correctBlockFound: false,\n };\n }\n }, block.timestamp, Infinity, options);\n }\n async getKeyPacket(timestamp, options) {\n const timestampInTimescale = this.intoTimescale(timestamp);\n return this.performClusterLookup(() => this.findKeyBlockInClustersForTimestamp(timestampInTimescale), timestampInTimescale, timestampInTimescale, options);\n }\n async getNextKeyPacket(packet, options) {\n const locationInCluster = this.packetToClusterLocation.get(packet);\n if (locationInCluster === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n const trackData = locationInCluster.cluster.trackData.get(this.internalTrack.id);\n const block = trackData.blocks[locationInCluster.blockIndex];\n const clusterIndex = binarySearchExact(this.internalTrack.clusters, locationInCluster.cluster.elementStartPos, x => x.elementStartPos);\n assert(clusterIndex !== -1);\n return this.performClusterLookup(() => {\n const nextKeyFrameIndex = trackData.blocks.findIndex((x, i) => x.isKeyFrame && i > locationInCluster.blockIndex);\n if (nextKeyFrameIndex !== -1) {\n // We can simply take the next key frame in the cluster\n return {\n clusterIndex,\n blockIndex: nextKeyFrameIndex,\n correctBlockFound: true,\n };\n }\n else {\n // Walk the list of clusters until we find the next cluster for this track with a key frame\n let currentCluster = locationInCluster.cluster;\n while (currentCluster.nextCluster) {\n currentCluster = currentCluster.nextCluster;\n const trackData = currentCluster.trackData.get(this.internalTrack.id);\n if (trackData && trackData.firstKeyFrameTimestamp !== null) {\n const clusterIndex = binarySearchExact(this.internalTrack.clusters, currentCluster.elementStartPos, x => x.elementStartPos);\n assert(clusterIndex !== -1);\n const keyFrameIndex = trackData.blocks.findIndex(x => x.isKeyFrame);\n assert(keyFrameIndex !== -1); // There must be one\n return {\n clusterIndex,\n blockIndex: keyFrameIndex,\n correctBlockFound: true,\n };\n }\n }\n return {\n clusterIndex,\n blockIndex: -1,\n correctBlockFound: false,\n };\n }\n }, block.timestamp, Infinity, options);\n }\n async fetchPacketInCluster(cluster, blockIndex, options) {\n if (blockIndex === -1) {\n return null;\n }\n const trackData = cluster.trackData.get(this.internalTrack.id);\n const block = trackData.blocks[blockIndex];\n assert(block);\n const data = options.metadataOnly ? PLACEHOLDER_DATA : block.data;\n const timestamp = block.timestamp / this.internalTrack.segment.timestampFactor;\n const duration = block.duration / this.internalTrack.segment.timestampFactor;\n const packet = new EncodedPacket(data, block.isKeyFrame ? 'key' : 'delta', timestamp, duration, cluster.dataStartPos + blockIndex, block.data.byteLength);\n this.packetToClusterLocation.set(packet, { cluster, blockIndex });\n return packet;\n }\n findBlockInClustersForTimestamp(timestampInTimescale) {\n const clusterIndex = binarySearchLessOrEqual(\n // This array is technically not sorted by start timestamp, but for any reasonable file, it basically is.\n this.internalTrack.clusters, timestampInTimescale, x => x.trackData.get(this.internalTrack.id).startTimestamp);\n let blockIndex = -1;\n let correctBlockFound = false;\n if (clusterIndex !== -1) {\n const cluster = this.internalTrack.clusters[clusterIndex];\n const trackData = cluster.trackData.get(this.internalTrack.id);\n const index = binarySearchLessOrEqual(trackData.presentationTimestamps, timestampInTimescale, x => x.timestamp);\n assert(index !== -1);\n blockIndex = trackData.presentationTimestamps[index].blockIndex;\n correctBlockFound = timestampInTimescale < trackData.endTimestamp;\n }\n return { clusterIndex, blockIndex, correctBlockFound };\n }\n findKeyBlockInClustersForTimestamp(timestampInTimescale) {\n const indexInKeyFrameClusters = binarySearchLessOrEqual(\n // This array is technically not sorted by start timestamp, but for any reasonable file, it basically is.\n this.internalTrack.clustersWithKeyFrame, timestampInTimescale, x => x.trackData.get(this.internalTrack.id).firstKeyFrameTimestamp);\n let clusterIndex = -1;\n let blockIndex = -1;\n let correctBlockFound = false;\n if (indexInKeyFrameClusters !== -1) {\n const cluster = this.internalTrack.clustersWithKeyFrame[indexInKeyFrameClusters];\n // Now, let's find the actual index of the cluster in the list of ALL clusters, not just key frame ones\n clusterIndex = binarySearchExact(this.internalTrack.clusters, cluster.elementStartPos, x => x.elementStartPos);\n assert(clusterIndex !== -1);\n const trackData = cluster.trackData.get(this.internalTrack.id);\n const index = findLastIndex(trackData.presentationTimestamps, (x) => {\n const block = trackData.blocks[x.blockIndex];\n return block.isKeyFrame && x.timestamp <= timestampInTimescale;\n });\n assert(index !== -1); // It's a key frame cluster, so there must be a key frame\n const entry = trackData.presentationTimestamps[index];\n blockIndex = entry.blockIndex;\n correctBlockFound = timestampInTimescale < trackData.endTimestamp;\n }\n return { clusterIndex, blockIndex, correctBlockFound };\n }\n /** Looks for a packet in the clusters while trying to load as few clusters as possible to retrieve it. */\n async performClusterLookup(\n // This function returns the best-matching block that is currently loaded. Based on this information, we know\n // which clusters we need to load to find the actual match.\n getBestMatch, \n // The timestamp with which we can search the lookup table\n searchTimestamp, \n // The timestamp for which we know the correct block will not come after it\n latestTimestamp, options) {\n const { demuxer, segment } = this.internalTrack;\n const release = await segment.clusterLookupMutex.acquire(); // The algorithm requires exclusivity\n try {\n const { clusterIndex, blockIndex, correctBlockFound } = getBestMatch();\n if (correctBlockFound) {\n // The correct block already exists, easy path.\n const cluster = this.internalTrack.clusters[clusterIndex];\n return this.fetchPacketInCluster(cluster, blockIndex, options);\n }\n // We use the metadata reader to find the cluster, but the cluster reader to load the cluster\n const metadataReader = demuxer.metadataReader;\n const clusterReader = demuxer.clusterReader;\n let prevCluster = null;\n let bestClusterIndex = clusterIndex;\n let bestBlockIndex = blockIndex;\n // Search for a cue point; this way, we won't need to start searching from the start of the file\n // but can jump right into the correct cluster (or at least nearby).\n const cuePointIndex = binarySearchLessOrEqual(this.internalTrack.cuePoints, searchTimestamp, x => x.time);\n const cuePoint = cuePointIndex !== -1 ? this.internalTrack.cuePoints[cuePointIndex] : null;\n let nextClusterIsFirstCluster = false;\n if (clusterIndex === -1) {\n metadataReader.pos = cuePoint?.clusterPosition ?? segment.clusterSeekStartPos;\n nextClusterIsFirstCluster = metadataReader.pos === segment.clusterSeekStartPos;\n }\n else {\n const cluster = this.internalTrack.clusters[clusterIndex];\n if (!cuePoint || cluster.elementStartPos >= cuePoint.clusterPosition) {\n metadataReader.pos = cluster.elementEndPos;\n prevCluster = cluster;\n }\n else {\n // Use the lookup entry\n metadataReader.pos = cuePoint.clusterPosition;\n }\n }\n while (metadataReader.pos < segment.elementEndPos) {\n if (prevCluster) {\n const trackData = prevCluster.trackData.get(this.internalTrack.id);\n if (trackData && trackData.startTimestamp > latestTimestamp) {\n // We're already past the upper bound, no need to keep searching\n break;\n }\n if (prevCluster.nextCluster) {\n // Skip ahead quickly without needing to read the file again\n metadataReader.pos = prevCluster.nextCluster.elementEndPos;\n prevCluster = prevCluster.nextCluster;\n continue;\n }\n }\n // Load the header\n await metadataReader.reader.loadRange(metadataReader.pos, metadataReader.pos + MAX_HEADER_SIZE);\n const elementStartPos = metadataReader.pos;\n const elementHeader = metadataReader.readElementHeader();\n const id = elementHeader.id;\n let size = elementHeader.size;\n const dataStartPos = metadataReader.pos;\n if (id === EBMLId.Cluster) {\n const index = binarySearchExact(segment.clusters, elementStartPos, x => x.elementStartPos);\n let cluster;\n if (index === -1) {\n // This is the first time we've seen this cluster\n metadataReader.pos = elementStartPos;\n cluster = await demuxer.readCluster(segment);\n }\n else {\n // We already know this cluster\n cluster = segment.clusters[index];\n }\n // Even if we already know the cluster, we might not yet know its predecessor, so always do this\n if (prevCluster)\n prevCluster.nextCluster = cluster;\n prevCluster = cluster;\n if (nextClusterIsFirstCluster) {\n cluster.isKnownToBeFirstCluster = true;\n nextClusterIsFirstCluster = false;\n }\n const { clusterIndex, blockIndex, correctBlockFound } = getBestMatch();\n if (correctBlockFound) {\n const cluster = this.internalTrack.clusters[clusterIndex];\n return this.fetchPacketInCluster(cluster, blockIndex, options);\n }\n if (clusterIndex !== -1) {\n bestClusterIndex = clusterIndex;\n bestBlockIndex = blockIndex;\n }\n }\n if (size === null) {\n // Undefined element size (can happen in livestreamed files). In this case, we need to do some\n // searching to determine the actual size of the element.\n if (id === EBMLId.Cluster) {\n // The cluster should have already computed its length, we can just copy that result\n assert(prevCluster);\n size = prevCluster.elementEndPos - dataStartPos;\n }\n else {\n // Search for the next element at level 0 or 1\n clusterReader.pos = dataStartPos;\n const nextElementPos = await clusterReader.searchForNextElementId(LEVEL_0_AND_1_EBML_IDS, segment.elementEndPos);\n size = (nextElementPos ?? segment.elementEndPos) - dataStartPos;\n }\n const endPos = dataStartPos + size;\n if (endPos > segment.elementEndPos - MIN_HEADER_SIZE) {\n // No more elements fit in this segment\n break;\n }\n else {\n // Check the next element. If it's a new segment, we know this segment ends here. The new\n // segment is just ignored, since we're likely in a livestreamed file and thus only care about\n // the first segment.\n clusterReader.pos = endPos;\n const elementId = clusterReader.readElementId();\n if (elementId === EBMLId.Segment) {\n segment.elementEndPos = endPos;\n break;\n }\n }\n }\n metadataReader.pos = dataStartPos + size;\n }\n let result = null;\n const bestCluster = bestClusterIndex !== -1 ? this.internalTrack.clusters[bestClusterIndex] : null;\n if (bestCluster) {\n // If we finished looping but didn't find a perfect match, still return the best match we found\n result = await this.fetchPacketInCluster(bestCluster, bestBlockIndex, options);\n }\n // Catch faulty cue points\n if (!result && cuePoint && (!bestCluster || bestCluster.elementStartPos < cuePoint.clusterPosition)) {\n // The cue point lied to us! We found a cue point but no cluster there that satisfied the match. In this\n // case, let's search again but using the cue point before that.\n const previousCuePoint = this.internalTrack.cuePoints[cuePointIndex - 1];\n const newSearchTimestamp = previousCuePoint?.time ?? -Infinity;\n return this.performClusterLookup(getBestMatch, newSearchTimestamp, latestTimestamp, options);\n }\n return result;\n }\n finally {\n release();\n }\n }\n}\nclass MatroskaVideoTrackBacking extends MatroskaTrackBacking {\n constructor(internalTrack) {\n super(internalTrack);\n this.decoderConfigPromise = null;\n this.internalTrack = internalTrack;\n }\n getCodec() {\n return this.internalTrack.info.codec;\n }\n getCodedWidth() {\n return this.internalTrack.info.width;\n }\n getCodedHeight() {\n return this.internalTrack.info.height;\n }\n getRotation() {\n return this.internalTrack.info.rotation;\n }\n async getColorSpace() {\n return {\n primaries: this.internalTrack.info.colorSpace?.primaries,\n transfer: this.internalTrack.info.colorSpace?.transfer,\n matrix: this.internalTrack.info.colorSpace?.matrix,\n fullRange: this.internalTrack.info.colorSpace?.fullRange,\n };\n }\n async getDecoderConfig() {\n if (!this.internalTrack.info.codec) {\n return null;\n }\n return this.decoderConfigPromise ??= (async () => {\n let firstPacket = null;\n const needsPacketForAdditionalInfo = this.internalTrack.info.codec === 'vp9'\n || this.internalTrack.info.codec === 'av1'\n // Packets are in Annex B format:\n || (this.internalTrack.info.codec === 'avc' && !this.internalTrack.info.codecDescription)\n // Packets are in Annex B format:\n || (this.internalTrack.info.codec === 'hevc' && !this.internalTrack.info.codecDescription);\n if (needsPacketForAdditionalInfo) {\n firstPacket = await this.getFirstPacket({});\n }\n return {\n codec: extractVideoCodecString({\n width: this.internalTrack.info.width,\n height: this.internalTrack.info.height,\n codec: this.internalTrack.info.codec,\n codecDescription: this.internalTrack.info.codecDescription,\n colorSpace: this.internalTrack.info.colorSpace,\n avcCodecInfo: this.internalTrack.info.codec === 'avc' && firstPacket\n ? extractAvcDecoderConfigurationRecord(firstPacket.data)\n : null,\n hevcCodecInfo: this.internalTrack.info.codec === 'hevc' && firstPacket\n ? extractHevcDecoderConfigurationRecord(firstPacket.data)\n : null,\n vp9CodecInfo: this.internalTrack.info.codec === 'vp9' && firstPacket\n ? extractVp9CodecInfoFromPacket(firstPacket.data)\n : null,\n av1CodecInfo: this.internalTrack.info.codec === 'av1' && firstPacket\n ? extractAv1CodecInfoFromPacket(firstPacket.data)\n : null,\n }),\n codedWidth: this.internalTrack.info.width,\n codedHeight: this.internalTrack.info.height,\n description: this.internalTrack.info.codecDescription ?? undefined,\n colorSpace: this.internalTrack.info.colorSpace ?? undefined,\n };\n })();\n }\n}\nclass MatroskaAudioTrackBacking extends MatroskaTrackBacking {\n constructor(internalTrack) {\n super(internalTrack);\n this.decoderConfig = null;\n this.internalTrack = internalTrack;\n }\n getCodec() {\n return this.internalTrack.info.codec;\n }\n getNumberOfChannels() {\n return this.internalTrack.info.numberOfChannels;\n }\n getSampleRate() {\n return this.internalTrack.info.sampleRate;\n }\n async getDecoderConfig() {\n if (!this.internalTrack.info.codec) {\n return null;\n }\n return this.decoderConfig ??= {\n codec: extractAudioCodecString({\n codec: this.internalTrack.info.codec,\n codecDescription: this.internalTrack.info.codecDescription,\n aacCodecInfo: this.internalTrack.info.aacCodecInfo,\n }),\n numberOfChannels: this.internalTrack.info.numberOfChannels,\n sampleRate: this.internalTrack.info.sampleRate,\n description: this.internalTrack.info.codecDescription ?? undefined,\n };\n }\n}\n/** Sorts blocks such that referenced blocks come before the blocks that reference them. */\nconst sortBlocksByReferences = (blocks) => {\n const timestampToBlock = new Map();\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i];\n timestampToBlock.set(block.timestamp, block);\n }\n const processedBlocks = new Set();\n const result = [];\n const processBlock = (block) => {\n if (processedBlocks.has(block)) {\n return;\n }\n // Marking the block as processed here already; prevents this algorithm from dying on cycles\n processedBlocks.add(block);\n for (let j = 0; j < block.referencedTimestamps.length; j++) {\n const timestamp = block.referencedTimestamps[j];\n const otherBlock = timestampToBlock.get(timestamp);\n if (!otherBlock) {\n continue;\n }\n processBlock(otherBlock);\n }\n result.push(block);\n };\n for (let i = 0; i < blocks.length; i++) {\n processBlock(blocks[i]);\n }\n return result;\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { assert } from '../misc.js';\nimport { FRAME_HEADER_SIZE, readFrameHeader } from './mp3-misc.js';\nexport class Mp3Reader {\n constructor(reader) {\n this.reader = reader;\n this.pos = 0;\n this.fileSize = null;\n }\n readBytes(length) {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + length);\n this.pos += length;\n return new Uint8Array(view.buffer, offset, length);\n }\n readU16() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 2);\n this.pos += 2;\n return view.getUint16(offset, false);\n }\n readU32() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 4);\n this.pos += 4;\n return view.getUint32(offset, false);\n }\n readAscii(length) {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + length);\n this.pos += length;\n let str = '';\n for (let i = 0; i < length; i++) {\n str += String.fromCharCode(view.getUint8(offset + i));\n }\n return str;\n }\n readId3() {\n const tag = this.readAscii(3);\n if (tag !== 'ID3') {\n this.pos -= 3;\n return null;\n }\n this.pos += 3;\n const size = decodeSynchsafe(this.readU32());\n return { size };\n }\n readNextFrameHeader(until) {\n assert(this.fileSize);\n until ??= this.fileSize;\n while (this.pos <= until - FRAME_HEADER_SIZE) {\n const word = this.readU32();\n this.pos -= 4;\n const header = readFrameHeader(word, this);\n if (header) {\n return header;\n }\n }\n return null;\n }\n}\nexport const decodeSynchsafe = (synchsafed) => {\n let mask = 0x7f000000;\n let unsynchsafed = 0;\n while (mask !== 0) {\n unsynchsafed >>= 1;\n unsynchsafed |= synchsafed & mask;\n mask >>= 8;\n }\n return unsynchsafed;\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack } from '../input-track.js';\nimport { assert, binarySearchExact, binarySearchLessOrEqual, last, UNDETERMINED_LANGUAGE } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { getXingOffset, INFO, XING } from './mp3-misc.js';\nimport { Mp3Reader } from './mp3-reader.js';\nexport class Mp3Demuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.metadataPromise = null;\n this.firstFrameHeader = null;\n this.allSamples = [];\n this.tracks = [];\n this.reader = new Mp3Reader(input._mainReader);\n }\n async readMetadata() {\n return this.metadataPromise ??= (async () => {\n const fileSize = await this.input.source.getSize();\n this.reader.fileSize = fileSize;\n // Just load the entire file. Primitive, but the only way to actually ensure 100% correct timestamps.\n // Random access in MP3 can be flaky and unreliable.\n await this.reader.reader.loadRange(0, fileSize);\n const id3Tag = this.reader.readId3();\n if (id3Tag) {\n this.reader.pos += id3Tag.size;\n }\n let nextTimestampInSamples = 0;\n // Let's read all samples\n while (true) {\n const header = this.reader.readNextFrameHeader();\n if (!header) {\n break;\n }\n const xingOffset = getXingOffset(header.mpegVersionId, header.channel);\n this.reader.pos = header.startPos + xingOffset;\n const word = this.reader.readU32();\n const isXing = word === XING || word === INFO;\n this.reader.pos = header.startPos + header.totalSize - 1; // -1 in case the frame is 1 byte too short\n if (isXing) {\n // There's no actual audio data in this frame, so let's skip it\n continue;\n }\n if (!this.firstFrameHeader) {\n this.firstFrameHeader = header;\n }\n const sampleDuration = header.audioSamplesInFrame / header.sampleRate;\n const sample = {\n timestamp: nextTimestampInSamples / header.sampleRate,\n duration: sampleDuration,\n dataStart: header.startPos,\n dataSize: header.totalSize,\n };\n this.allSamples.push(sample);\n nextTimestampInSamples += header.audioSamplesInFrame;\n }\n if (!this.firstFrameHeader) {\n throw new Error('No MP3 frames found.');\n }\n this.tracks = [new InputAudioTrack(new Mp3AudioTrackBacking(this))];\n })();\n }\n async getMimeType() {\n return 'audio/mpeg';\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks;\n }\n async computeDuration() {\n await this.readMetadata();\n const lastSample = last(this.allSamples);\n assert(lastSample);\n return lastSample.timestamp + lastSample.duration;\n }\n}\nclass Mp3AudioTrackBacking {\n constructor(demuxer) {\n this.demuxer = demuxer;\n }\n getId() {\n return 1;\n }\n async getFirstTimestamp() {\n return 0;\n }\n getTimeResolution() {\n assert(this.demuxer.firstFrameHeader);\n return this.demuxer.firstFrameHeader.sampleRate / this.demuxer.firstFrameHeader.audioSamplesInFrame;\n }\n computeDuration() {\n return this.demuxer.computeDuration();\n }\n getLanguageCode() {\n return UNDETERMINED_LANGUAGE;\n }\n getCodec() {\n return 'mp3';\n }\n getNumberOfChannels() {\n assert(this.demuxer.firstFrameHeader);\n return this.demuxer.firstFrameHeader.channel === 3 ? 1 : 2;\n }\n getSampleRate() {\n assert(this.demuxer.firstFrameHeader);\n return this.demuxer.firstFrameHeader.sampleRate;\n }\n async getDecoderConfig() {\n assert(this.demuxer.firstFrameHeader);\n return {\n codec: 'mp3',\n numberOfChannels: this.demuxer.firstFrameHeader.channel === 3 ? 1 : 2,\n sampleRate: this.demuxer.firstFrameHeader.sampleRate,\n };\n }\n getPacketAtIndex(sampleIndex, options) {\n if (sampleIndex === -1) {\n return null;\n }\n const rawSample = this.demuxer.allSamples[sampleIndex];\n if (!rawSample) {\n return null;\n }\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n this.demuxer.reader.pos = rawSample.dataStart;\n data = this.demuxer.reader.readBytes(rawSample.dataSize);\n }\n return new EncodedPacket(data, 'key', rawSample.timestamp, rawSample.duration, sampleIndex, rawSample.dataSize);\n }\n async getFirstPacket(options) {\n return this.getPacketAtIndex(0, options);\n }\n async getNextPacket(packet, options) {\n const sampleIndex = binarySearchExact(this.demuxer.allSamples, packet.timestamp, x => x.timestamp);\n if (sampleIndex === -1) {\n throw new Error('Packet was not created from this track.');\n }\n return this.getPacketAtIndex(sampleIndex + 1, options);\n }\n async getPacket(timestamp, options) {\n const index = binarySearchLessOrEqual(this.demuxer.allSamples, timestamp, x => x.timestamp);\n return this.getPacketAtIndex(index, options);\n }\n getKeyPacket(timestamp, options) {\n return this.getPacket(timestamp, options);\n }\n getNextKeyPacket(packet, options) {\n return this.getNextPacket(packet, options);\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { OPUS_INTERNAL_SAMPLE_RATE } from '../codec.js';\nimport { parseModesFromVorbisSetupPacket, parseOpusIdentificationHeader } from '../codec-data.js';\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack } from '../input-track.js';\nimport { assert, AsyncMutex, findLast, roundToPrecision, toDataView, UNDETERMINED_LANGUAGE } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { Reader } from '../reader.js';\nimport { buildOggMimeType, computeOggPageCrc, extractSampleMetadata } from './ogg-misc.js';\nimport { MAX_PAGE_HEADER_SIZE, MAX_PAGE_SIZE, MIN_PAGE_HEADER_SIZE, OggReader } from './ogg-reader.js';\nexport class OggDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n /**\n * Lots of reading operations require multiple async reads and thus need to be mutually exclusive to avoid\n * conflicts in reader position.\n */\n this.readingMutex = new AsyncMutex();\n this.metadataPromise = null;\n this.fileSize = null;\n this.bitstreams = [];\n this.tracks = [];\n // We don't need a persistent metadata reader as we read all metadata once at the start and then never again\n this.reader = new OggReader(new Reader(input.source, 64 * 2 ** 20));\n }\n async readMetadata() {\n return this.metadataPromise ??= (async () => {\n this.fileSize = await this.input.source.getSize();\n while (this.reader.pos < this.fileSize - MIN_PAGE_HEADER_SIZE) {\n await this.reader.reader.loadRange(this.reader.pos, this.reader.pos + MAX_PAGE_HEADER_SIZE);\n const page = this.reader.readPageHeader();\n if (!page) {\n break;\n }\n const isBos = !!(page.headerType & 0x02);\n if (!isBos) {\n // All bos pages for all bitstreams are required to be at the start, so if the page is not bos then\n // we know we've seen all bitstreams (minus chaining)\n break;\n }\n this.bitstreams.push({\n serialNumber: page.serialNumber,\n bosPage: page,\n description: null,\n numberOfChannels: -1,\n sampleRate: -1,\n codecInfo: {\n codec: null,\n vorbisInfo: null,\n opusInfo: null,\n },\n lastMetadataPacket: null,\n });\n this.reader.pos = page.headerStartPos + page.totalSize;\n }\n for (const bitstream of this.bitstreams) {\n const firstPacket = await this.readPacket(this.reader, bitstream.bosPage, 0);\n if (!firstPacket) {\n continue;\n }\n if (\n // Check for Vorbis\n firstPacket.data.byteLength >= 7\n && firstPacket.data[0] === 0x01 // Packet type 1 = identification header\n && firstPacket.data[1] === 0x76 // 'v'\n && firstPacket.data[2] === 0x6f // 'o'\n && firstPacket.data[3] === 0x72 // 'r'\n && firstPacket.data[4] === 0x62 // 'b'\n && firstPacket.data[5] === 0x69 // 'i'\n && firstPacket.data[6] === 0x73 // 's'\n ) {\n await this.readVorbisMetadata(firstPacket, bitstream);\n }\n else if (\n // Check for Opus\n firstPacket.data.byteLength >= 8\n && firstPacket.data[0] === 0x4f // 'O'\n && firstPacket.data[1] === 0x70 // 'p'\n && firstPacket.data[2] === 0x75 // 'u'\n && firstPacket.data[3] === 0x73 // 's'\n && firstPacket.data[4] === 0x48 // 'H'\n && firstPacket.data[5] === 0x65 // 'e'\n && firstPacket.data[6] === 0x61 // 'a'\n && firstPacket.data[7] === 0x64 // 'd'\n ) {\n await this.readOpusMetadata(firstPacket, bitstream);\n }\n if (bitstream.codecInfo.codec !== null) {\n this.tracks.push(new InputAudioTrack(new OggAudioTrackBacking(bitstream, this)));\n }\n }\n })();\n }\n async readVorbisMetadata(firstPacket, bitstream) {\n let nextPacketPosition = await this.findNextPacketStart(this.reader, firstPacket);\n if (!nextPacketPosition) {\n return;\n }\n const secondPacket = await this.readPacket(this.reader, nextPacketPosition.startPage, nextPacketPosition.startSegmentIndex);\n if (!secondPacket) {\n return;\n }\n nextPacketPosition = await this.findNextPacketStart(this.reader, secondPacket);\n if (!nextPacketPosition) {\n return;\n }\n const thirdPacket = await this.readPacket(this.reader, nextPacketPosition.startPage, nextPacketPosition.startSegmentIndex);\n if (!thirdPacket) {\n return;\n }\n if (secondPacket.data[0] !== 0x03 || thirdPacket.data[0] !== 0x05) {\n return;\n }\n const lacingValues = [];\n const addBytesToSegmentTable = (bytes) => {\n while (true) {\n lacingValues.push(Math.min(255, bytes));\n if (bytes < 255) {\n break;\n }\n bytes -= 255;\n }\n };\n addBytesToSegmentTable(firstPacket.data.length);\n addBytesToSegmentTable(secondPacket.data.length);\n // We don't add the last packet to the segment table, as it is assumed to be whatever bytes remain\n const description = new Uint8Array(1 + lacingValues.length\n + firstPacket.data.length + secondPacket.data.length + thirdPacket.data.length);\n description[0] = lacingValues.length;\n description.set(lacingValues, 1);\n description.set(firstPacket.data, 1 + lacingValues.length);\n description.set(secondPacket.data, 1 + lacingValues.length + firstPacket.data.length);\n description.set(thirdPacket.data, 1 + lacingValues.length + firstPacket.data.length + secondPacket.data.length);\n bitstream.codecInfo.codec = 'vorbis';\n bitstream.description = description;\n bitstream.lastMetadataPacket = thirdPacket;\n const view = toDataView(firstPacket.data);\n bitstream.numberOfChannels = view.getUint8(11);\n bitstream.sampleRate = view.getUint32(12, true);\n const blockSizeByte = view.getUint8(28);\n bitstream.codecInfo.vorbisInfo = {\n blocksizes: [\n 1 << (blockSizeByte & 0xf),\n 1 << (blockSizeByte >> 4),\n ],\n modeBlockflags: parseModesFromVorbisSetupPacket(thirdPacket.data).modeBlockflags,\n };\n }\n async readOpusMetadata(firstPacket, bitstream) {\n // From https://datatracker.ietf.org/doc/html/rfc7845#section-5:\n // \"An Ogg Opus logical stream contains exactly two mandatory header packets: an identification header and a\n // comment header.\"\n const nextPacketPosition = await this.findNextPacketStart(this.reader, firstPacket);\n if (!nextPacketPosition) {\n return;\n }\n const secondPacket = await this.readPacket(this.reader, nextPacketPosition.startPage, nextPacketPosition.startSegmentIndex);\n if (!secondPacket) {\n return;\n }\n // We don't make use of the comment header's data\n bitstream.codecInfo.codec = 'opus';\n bitstream.description = firstPacket.data;\n bitstream.lastMetadataPacket = secondPacket;\n const header = parseOpusIdentificationHeader(firstPacket.data);\n bitstream.numberOfChannels = header.outputChannelCount;\n bitstream.sampleRate = header.inputSampleRate;\n bitstream.codecInfo.opusInfo = {\n preSkip: header.preSkip,\n };\n }\n async readPacket(reader, startPage, startSegmentIndex) {\n assert(startSegmentIndex < startPage.lacingValues.length);\n assert(this.fileSize);\n let startDataOffset = 0;\n for (let i = 0; i < startSegmentIndex; i++) {\n startDataOffset += startPage.lacingValues[i];\n }\n let currentPage = startPage;\n let currentDataOffset = startDataOffset;\n let currentSegmentIndex = startSegmentIndex;\n const chunks = [];\n outer: while (true) {\n // Load the entire page data\n await reader.reader.loadRange(currentPage.dataStartPos, currentPage.dataStartPos + currentPage.dataSize);\n reader.pos = currentPage.dataStartPos;\n const pageData = reader.readBytes(currentPage.dataSize);\n while (true) {\n if (currentSegmentIndex === currentPage.lacingValues.length) {\n chunks.push(pageData.subarray(startDataOffset, currentDataOffset));\n break;\n }\n const lacingValue = currentPage.lacingValues[currentSegmentIndex];\n currentDataOffset += lacingValue;\n if (lacingValue < 255) {\n chunks.push(pageData.subarray(startDataOffset, currentDataOffset));\n break outer;\n }\n currentSegmentIndex++;\n }\n // The packet extends to the next page; let's find it\n while (true) {\n reader.pos = currentPage.headerStartPos + currentPage.totalSize;\n if (reader.pos >= this.fileSize - MIN_PAGE_HEADER_SIZE) {\n return null;\n }\n await reader.reader.loadRange(reader.pos, reader.pos + MAX_PAGE_HEADER_SIZE);\n const nextPage = reader.readPageHeader();\n if (!nextPage) {\n return null;\n }\n currentPage = nextPage;\n if (currentPage.serialNumber === startPage.serialNumber) {\n break;\n }\n }\n startDataOffset = 0;\n currentDataOffset = 0;\n currentSegmentIndex = 0;\n }\n const totalPacketSize = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const packetData = new Uint8Array(totalPacketSize);\n let offset = 0;\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n packetData.set(chunk, offset);\n offset += chunk.length;\n }\n return {\n data: packetData,\n endPage: currentPage,\n endSegmentIndex: currentSegmentIndex,\n };\n }\n async findNextPacketStart(reader, lastPacket) {\n assert(this.fileSize !== null);\n // If there's another segment in the same page, return it\n if (lastPacket.endSegmentIndex < lastPacket.endPage.lacingValues.length - 1) {\n return { startPage: lastPacket.endPage, startSegmentIndex: lastPacket.endSegmentIndex + 1 };\n }\n const isEos = !!(lastPacket.endPage.headerType & 0x04);\n if (isEos) {\n // The page is marked as the last page of the logical bitstream, so we won't find anything beyond it\n return null;\n }\n // Otherwise, search for the next page belonging to the same bitstream\n reader.pos = lastPacket.endPage.headerStartPos + lastPacket.endPage.totalSize;\n while (true) {\n if (reader.pos >= this.fileSize - MIN_PAGE_HEADER_SIZE) {\n return null;\n }\n await reader.reader.loadRange(reader.pos, reader.pos + MAX_PAGE_HEADER_SIZE);\n const nextPage = reader.readPageHeader();\n if (!nextPage) {\n return null;\n }\n if (nextPage.serialNumber === lastPacket.endPage.serialNumber) {\n return { startPage: nextPage, startSegmentIndex: 0 };\n }\n reader.pos = nextPage.headerStartPos + nextPage.totalSize;\n }\n }\n async getMimeType() {\n await this.readMetadata();\n const codecStrings = await Promise.all(this.tracks.map(x => x.getCodecParameterString()));\n return buildOggMimeType({\n codecStrings: codecStrings.filter(Boolean),\n });\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks;\n }\n async computeDuration() {\n const tracks = await this.getTracks();\n const trackDurations = await Promise.all(tracks.map(x => x.computeDuration()));\n return Math.max(0, ...trackDurations);\n }\n}\nclass OggAudioTrackBacking {\n constructor(bitstream, demuxer) {\n this.bitstream = bitstream;\n this.demuxer = demuxer;\n this.encodedPacketToMetadata = new WeakMap();\n // Opus always uses a fixed sample rate for its internal calculations, even if the actual rate is different\n this.internalSampleRate = bitstream.codecInfo.codec === 'opus'\n ? OPUS_INTERNAL_SAMPLE_RATE\n : bitstream.sampleRate;\n }\n getId() {\n return this.bitstream.serialNumber;\n }\n getNumberOfChannels() {\n return this.bitstream.numberOfChannels;\n }\n getSampleRate() {\n return this.bitstream.sampleRate;\n }\n getTimeResolution() {\n return this.bitstream.sampleRate;\n }\n getCodec() {\n return this.bitstream.codecInfo.codec;\n }\n async getDecoderConfig() {\n assert(this.bitstream.codecInfo.codec);\n return {\n codec: this.bitstream.codecInfo.codec,\n numberOfChannels: this.bitstream.numberOfChannels,\n sampleRate: this.bitstream.sampleRate,\n description: this.bitstream.description ?? undefined,\n };\n }\n getLanguageCode() {\n return UNDETERMINED_LANGUAGE;\n }\n async getFirstTimestamp() {\n return 0;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n granulePositionToTimestampInSamples(granulePosition) {\n if (this.bitstream.codecInfo.codec === 'opus') {\n assert(this.bitstream.codecInfo.opusInfo);\n return granulePosition - this.bitstream.codecInfo.opusInfo.preSkip;\n }\n return granulePosition;\n }\n createEncodedPacketFromOggPacket(packet, additional, options) {\n if (!packet) {\n return null;\n }\n const { durationInSamples, vorbisBlockSize } = extractSampleMetadata(packet.data, this.bitstream.codecInfo, additional.vorbisLastBlocksize);\n const encodedPacket = new EncodedPacket(options.metadataOnly ? PLACEHOLDER_DATA : packet.data, 'key', Math.max(0, additional.timestampInSamples) / this.internalSampleRate, durationInSamples / this.internalSampleRate, packet.endPage.headerStartPos + packet.endSegmentIndex, packet.data.byteLength);\n this.encodedPacketToMetadata.set(encodedPacket, {\n packet,\n timestampInSamples: additional.timestampInSamples,\n durationInSamples,\n vorbisBlockSize,\n });\n return encodedPacket;\n }\n async getFirstPacket(options, exclusive = true) {\n const release = exclusive ? await this.demuxer.readingMutex.acquire() : null;\n try {\n assert(this.bitstream.lastMetadataPacket);\n const packetPosition = await this.demuxer.findNextPacketStart(this.demuxer.reader, this.bitstream.lastMetadataPacket);\n if (!packetPosition) {\n return null;\n }\n let timestampInSamples = 0;\n if (this.bitstream.codecInfo.codec === 'opus') {\n assert(this.bitstream.codecInfo.opusInfo);\n timestampInSamples -= this.bitstream.codecInfo.opusInfo.preSkip;\n }\n const packet = await this.demuxer.readPacket(this.demuxer.reader, packetPosition.startPage, packetPosition.startSegmentIndex);\n return this.createEncodedPacketFromOggPacket(packet, {\n timestampInSamples,\n vorbisLastBlocksize: null,\n }, options);\n }\n finally {\n release?.();\n }\n }\n async getNextPacket(prevPacket, options) {\n const release = await this.demuxer.readingMutex.acquire();\n try {\n const prevMetadata = this.encodedPacketToMetadata.get(prevPacket);\n if (!prevMetadata) {\n throw new Error('Packet was not created from this track.');\n }\n const packetPosition = await this.demuxer.findNextPacketStart(this.demuxer.reader, prevMetadata.packet);\n if (!packetPosition) {\n return null;\n }\n const timestampInSamples = prevMetadata.timestampInSamples + prevMetadata.durationInSamples;\n const packet = await this.demuxer.readPacket(this.demuxer.reader, packetPosition.startPage, packetPosition.startSegmentIndex);\n return this.createEncodedPacketFromOggPacket(packet, {\n timestampInSamples,\n vorbisLastBlocksize: prevMetadata.vorbisBlockSize,\n }, options);\n }\n finally {\n release();\n }\n }\n async getPacket(timestamp, options) {\n const release = await this.demuxer.readingMutex.acquire();\n try {\n assert(this.demuxer.fileSize !== null);\n const timestampInSamples = roundToPrecision(timestamp * this.internalSampleRate, 14);\n if (timestampInSamples === 0) {\n // Fast path for timestamp 0 - avoids binary search when playing back from the start\n return this.getFirstPacket(options, false);\n }\n if (timestampInSamples < 0) {\n // There's nothing here\n return null;\n }\n const reader = this.demuxer.reader;\n assert(this.bitstream.lastMetadataPacket);\n const startPosition = await this.demuxer.findNextPacketStart(reader, this.bitstream.lastMetadataPacket);\n if (!startPosition) {\n return null;\n }\n let lowPage = startPosition.startPage;\n let high = this.demuxer.fileSize;\n const lowPages = [lowPage];\n // First, let's perform a binary serach (bisection search) on the file to find the approximate page where\n // we'll find the packet. We want to find a page whose end packet position is less than or equal to the\n // packet position we're searching for.\n // Outer loop: Does the binary serach\n outer: while (lowPage.headerStartPos + lowPage.totalSize < high) {\n const low = lowPage.headerStartPos;\n const mid = Math.floor((low + high) / 2);\n let searchStartPos = mid;\n // Inner loop: Does a linear forward scan if the page cannot be found immediately\n while (true) {\n const until = Math.min(searchStartPos + MAX_PAGE_SIZE, high - MIN_PAGE_HEADER_SIZE);\n await reader.reader.loadRange(searchStartPos, until);\n reader.pos = searchStartPos;\n const found = reader.findNextPageHeader(until);\n if (!found) {\n high = mid + MIN_PAGE_HEADER_SIZE;\n continue outer;\n }\n await reader.reader.loadRange(reader.pos, reader.pos + MAX_PAGE_HEADER_SIZE);\n const page = reader.readPageHeader();\n assert(page);\n let pageValid = false;\n if (page.serialNumber === this.bitstream.serialNumber) {\n // Serial numbers are basically random numbers, and the chance of finding a fake page with\n // matching serial number is astronomically low, so we can be pretty sure this page is legit.\n pageValid = true;\n }\n else {\n await reader.reader.loadRange(page.headerStartPos, page.headerStartPos + page.totalSize);\n // Validate the page by checking checksum\n reader.pos = page.headerStartPos;\n const bytes = reader.readBytes(page.totalSize);\n const crc = computeOggPageCrc(bytes);\n pageValid = crc === page.checksum;\n }\n if (!pageValid) {\n // Keep searching for a valid page\n searchStartPos = page.headerStartPos + 4; // 'OggS' is 4 bytes\n continue;\n }\n if (pageValid && page.serialNumber !== this.bitstream.serialNumber) {\n // Page is valid but from a different bitstream, so keep searching forward until we find one\n // belonging to the our bitstream\n searchStartPos = page.headerStartPos + page.totalSize;\n continue;\n }\n const isContinuationPage = page.granulePosition === -1;\n if (isContinuationPage) {\n // No packet ends on this page - keep looking\n searchStartPos = page.headerStartPos + page.totalSize;\n continue;\n }\n // The page is valid and belongs to our bitstream; let's check its granule position to see where we\n // need to take the bisection search.\n if (this.granulePositionToTimestampInSamples(page.granulePosition) > timestampInSamples) {\n high = page.headerStartPos;\n }\n else {\n lowPage = page;\n lowPages.push(page);\n }\n continue outer;\n }\n }\n // Now we have the last page with a packet position <= the packet position we're looking for, but there\n // might be multiple pages with the packet position, in which case we actually need to find the first of\n // such pages. We'll do this in two steps: First, let's find the latest page we know with an earlier packet\n // position, and then linear scan ourselves forward until we find the correct page.\n let lowerPage = startPosition.startPage;\n for (const otherLowPage of lowPages) {\n if (otherLowPage.granulePosition === lowPage.granulePosition) {\n break;\n }\n if (!lowerPage || otherLowPage.headerStartPos > lowerPage.headerStartPos) {\n lowerPage = otherLowPage;\n }\n }\n let currentPage = lowerPage;\n // Keep track of the pages we traversed, we need these later for backwards seeking\n const previousPages = [currentPage];\n while (true) {\n // This loop must terminate as we'll eventually reach lowPage\n if (currentPage.serialNumber === this.bitstream.serialNumber\n && currentPage.granulePosition === lowPage.granulePosition) {\n break;\n }\n reader.pos = currentPage.headerStartPos + currentPage.totalSize;\n await reader.reader.loadRange(reader.pos, reader.pos + MAX_PAGE_HEADER_SIZE);\n const nextPage = reader.readPageHeader();\n assert(nextPage);\n currentPage = nextPage;\n if (currentPage.serialNumber === this.bitstream.serialNumber) {\n previousPages.push(currentPage);\n }\n }\n assert(currentPage.granulePosition !== -1);\n let currentSegmentIndex = null;\n let currentTimestampInSamples;\n let currentTimestampIsCorrect;\n // These indicate the end position of the packet that the granule position belongs to\n let endPage = currentPage;\n let endSegmentIndex = 0;\n if (currentPage.headerStartPos === startPosition.startPage.headerStartPos) {\n currentTimestampInSamples = this.granulePositionToTimestampInSamples(0);\n currentTimestampIsCorrect = true;\n currentSegmentIndex = 0;\n }\n else {\n currentTimestampInSamples = 0; // Placeholder value! We'll refine it once we can\n currentTimestampIsCorrect = false;\n // Find the segment index of the next packet\n for (let i = currentPage.lacingValues.length - 1; i >= 0; i--) {\n const value = currentPage.lacingValues[i];\n if (value < 255) {\n // We know the last packet ended at i, so the next one starts at i + 1\n currentSegmentIndex = i + 1;\n break;\n }\n }\n // This must hold: Since this page has a granule position set, that means there must be a packet that\n // ends in this page.\n if (currentSegmentIndex === null) {\n throw new Error('Invalid page with granule position: no packets end on this page.');\n }\n endSegmentIndex = currentSegmentIndex - 1;\n const pseudopacket = {\n data: PLACEHOLDER_DATA,\n endPage,\n endSegmentIndex,\n };\n const nextPosition = await this.demuxer.findNextPacketStart(reader, pseudopacket);\n if (nextPosition) {\n // Let's rewind a single step (packet) - this previous packet ensures that we'll correctly compute\n // the duration for the packet we're looking for.\n const endPosition = findPreviousPacketEndPosition(previousPages, currentPage, currentSegmentIndex);\n assert(endPosition);\n const startPosition = findPacketStartPosition(previousPages, endPosition.page, endPosition.segmentIndex);\n if (startPosition) {\n currentPage = startPosition.page;\n currentSegmentIndex = startPosition.segmentIndex;\n }\n }\n else {\n // There is no next position, which means we're looking for the last packet in the bitstream. The\n // granule position on the last page tends to be fucky, so let's instead start the search on the\n // page before that. So let's loop until we find a packet that ends in a previous page.\n while (true) {\n const endPosition = findPreviousPacketEndPosition(previousPages, currentPage, currentSegmentIndex);\n if (!endPosition) {\n break;\n }\n const startPosition = findPacketStartPosition(previousPages, endPosition.page, endPosition.segmentIndex);\n if (!startPosition) {\n break;\n }\n currentPage = startPosition.page;\n currentSegmentIndex = startPosition.segmentIndex;\n if (endPosition.page.headerStartPos !== endPage.headerStartPos) {\n endPage = endPosition.page;\n endSegmentIndex = endPosition.segmentIndex;\n break;\n }\n }\n }\n }\n let lastEncodedPacket = null;\n let lastEncodedPacketMetadata = null;\n // Alright, now it's time for the final, granular seek: We keep iterating over packets until we've found the\n // one with the correct timestamp - i.e., the last one with a timestamp <= the timestamp we're looking for.\n while (currentPage !== null) {\n assert(currentSegmentIndex !== null);\n const packet = await this.demuxer.readPacket(reader, currentPage, currentSegmentIndex);\n if (!packet) {\n break;\n }\n // We might need to skip the packet if it's a metadata one\n const skipPacket = currentPage.headerStartPos === startPosition.startPage.headerStartPos\n && currentSegmentIndex < startPosition.startSegmentIndex;\n if (!skipPacket) {\n let encodedPacket = this.createEncodedPacketFromOggPacket(packet, {\n timestampInSamples: currentTimestampInSamples,\n vorbisLastBlocksize: lastEncodedPacketMetadata?.vorbisBlockSize ?? null,\n }, options);\n assert(encodedPacket);\n let encodedPacketMetadata = this.encodedPacketToMetadata.get(encodedPacket);\n assert(encodedPacketMetadata);\n if (!currentTimestampIsCorrect\n && packet.endPage.headerStartPos === endPage.headerStartPos\n && packet.endSegmentIndex === endSegmentIndex) {\n // We know this packet end timestamp can be derived from the page's granule position\n currentTimestampInSamples = this.granulePositionToTimestampInSamples(currentPage.granulePosition);\n currentTimestampIsCorrect = true;\n // Let's backpatch the packet we just created with the correct timestamp\n encodedPacket = this.createEncodedPacketFromOggPacket(packet, {\n timestampInSamples: currentTimestampInSamples - encodedPacketMetadata.durationInSamples,\n vorbisLastBlocksize: lastEncodedPacketMetadata?.vorbisBlockSize ?? null,\n }, options);\n assert(encodedPacket);\n encodedPacketMetadata = this.encodedPacketToMetadata.get(encodedPacket);\n assert(encodedPacketMetadata);\n }\n else {\n currentTimestampInSamples += encodedPacketMetadata.durationInSamples;\n }\n lastEncodedPacket = encodedPacket;\n lastEncodedPacketMetadata = encodedPacketMetadata;\n if (currentTimestampIsCorrect\n && (\n // Next timestamp will be too late\n Math.max(currentTimestampInSamples, 0) > timestampInSamples\n // This timestamp already matches\n || Math.max(encodedPacketMetadata.timestampInSamples, 0) === timestampInSamples)) {\n break;\n }\n }\n const nextPosition = await this.demuxer.findNextPacketStart(reader, packet);\n if (!nextPosition) {\n break;\n }\n currentPage = nextPosition.startPage;\n currentSegmentIndex = nextPosition.startSegmentIndex;\n }\n return lastEncodedPacket;\n }\n finally {\n release();\n }\n }\n getKeyPacket(timestamp, options) {\n return this.getPacket(timestamp, options);\n }\n getNextKeyPacket(packet, options) {\n return this.getNextPacket(packet, options);\n }\n}\n/** Finds the start position of a packet given its end position. */\nconst findPacketStartPosition = (pageList, endPage, endSegmentIndex) => {\n let page = endPage;\n let segmentIndex = endSegmentIndex;\n outer: while (true) {\n segmentIndex--;\n for (segmentIndex; segmentIndex >= 0; segmentIndex--) {\n const lacingValue = page.lacingValues[segmentIndex];\n if (lacingValue < 255) {\n segmentIndex++; // We know the last packet starts here\n break outer;\n }\n }\n assert(segmentIndex === -1);\n const pageStartsWithFreshPacket = !(page.headerType & 0x01);\n if (pageStartsWithFreshPacket) {\n // Fast exit: We know we don't need to look in the previous page\n segmentIndex = 0;\n break;\n }\n const previousPage = findLast(pageList, x => x.headerStartPos < page.headerStartPos);\n if (!previousPage) {\n return null;\n }\n page = previousPage;\n segmentIndex = page.lacingValues.length;\n }\n assert(segmentIndex !== -1);\n if (segmentIndex === page.lacingValues.length) {\n // Wrap back around to the first segment of the next page\n const nextPage = pageList[pageList.indexOf(page) + 1];\n assert(nextPage);\n page = nextPage;\n segmentIndex = 0;\n }\n return { page, segmentIndex };\n};\n/** Finds the end position of a packet given the start position of the following packet. */\nconst findPreviousPacketEndPosition = (pageList, startPage, startSegmentIndex) => {\n if (startSegmentIndex > 0) {\n // Easy\n return { page: startPage, segmentIndex: startSegmentIndex - 1 };\n }\n const previousPage = findLast(pageList, x => x.headerStartPos < startPage.headerStartPos);\n if (!previousPage) {\n return null;\n }\n return { page: previousPage, segmentIndex: previousPage.lacingValues.length - 1 };\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { IsobmffDemuxer } from './isobmff/isobmff-demuxer.js';\nimport { IsobmffReader } from './isobmff/isobmff-reader.js';\nimport { EBMLId, EBMLReader } from './matroska/ebml.js';\nimport { MatroskaDemuxer } from './matroska/matroska-demuxer.js';\nimport { Mp3Demuxer } from './mp3/mp3-demuxer.js';\nimport { FRAME_HEADER_SIZE } from './mp3/mp3-misc.js';\nimport { Mp3Reader } from './mp3/mp3-reader.js';\nimport { OggDemuxer } from './ogg/ogg-demuxer.js';\nimport { OggReader } from './ogg/ogg-reader.js';\nimport { RiffReader } from './wave/riff-reader.js';\nimport { WaveDemuxer } from './wave/wave-demuxer.js';\n/**\n * Base class representing an input media file format.\n * @public\n */\nexport class InputFormat {\n}\n/**\n * Format representing files compatible with the ISO base media file format (ISOBMFF), like MP4 or MOV files.\n * @public\n */\nexport class IsobmffInputFormat extends InputFormat {\n /** @internal */\n async _getMajorBrand(input) {\n const sourceSize = await input._mainReader.source.getSize();\n if (sourceSize < 12) {\n return null;\n }\n const isobmffReader = new IsobmffReader(input._mainReader);\n isobmffReader.pos = 4;\n const fourCc = isobmffReader.readAscii(4);\n if (fourCc !== 'ftyp') {\n return null;\n }\n return isobmffReader.readAscii(4);\n }\n /** @internal */\n _createDemuxer(input) {\n return new IsobmffDemuxer(input);\n }\n}\n/**\n * MPEG-4 Part 14 (MP4) file format.\n * @public\n */\nexport class Mp4InputFormat extends IsobmffInputFormat {\n /** @internal */\n async _canReadInput(input) {\n const majorBrand = await this._getMajorBrand(input);\n return !!majorBrand && majorBrand !== 'qt ';\n }\n get name() {\n return 'MP4';\n }\n get mimeType() {\n return 'video/mp4';\n }\n}\n/**\n * QuickTime File Format (QTFF), often called MOV.\n * @public\n */\nexport class QuickTimeInputFormat extends IsobmffInputFormat {\n /** @internal */\n async _canReadInput(input) {\n const majorBrand = await this._getMajorBrand(input);\n return majorBrand === 'qt ';\n }\n get name() {\n return 'QuickTime File Format';\n }\n get mimeType() {\n return 'video/quicktime';\n }\n}\n/**\n * Matroska file format.\n * @public\n */\nexport class MatroskaInputFormat extends InputFormat {\n /** @internal */\n async isSupportedEBMLOfDocType(input, desiredDocType) {\n const sourceSize = await input._mainReader.source.getSize();\n if (sourceSize < 8) {\n return false;\n }\n const ebmlReader = new EBMLReader(input._mainReader);\n const varIntSize = ebmlReader.readVarIntSize();\n if (varIntSize < 1 || varIntSize > 8) {\n return false;\n }\n const id = ebmlReader.readUnsignedInt(varIntSize);\n if (id !== EBMLId.EBML) {\n return false;\n }\n const dataSize = ebmlReader.readElementSize();\n if (dataSize === null) {\n return false; // Miss me with that shit\n }\n const startPos = ebmlReader.pos;\n while (ebmlReader.pos < startPos + dataSize) {\n const { id, size } = ebmlReader.readElementHeader();\n const dataStartPos = ebmlReader.pos;\n if (size === null)\n return false;\n switch (id) {\n case EBMLId.EBMLVersion:\n {\n const ebmlVersion = ebmlReader.readUnsignedInt(size);\n if (ebmlVersion !== 1) {\n return false;\n }\n }\n ;\n break;\n case EBMLId.EBMLReadVersion:\n {\n const ebmlReadVersion = ebmlReader.readUnsignedInt(size);\n if (ebmlReadVersion !== 1) {\n return false;\n }\n }\n ;\n break;\n case EBMLId.DocType:\n {\n const docType = ebmlReader.readString(size);\n if (docType !== desiredDocType) {\n return false;\n }\n }\n ;\n break;\n case EBMLId.DocTypeVersion:\n {\n const docTypeVersion = ebmlReader.readUnsignedInt(size);\n if (docTypeVersion > 4) { // Support up to Matroska v4\n return false;\n }\n }\n ;\n break;\n }\n ebmlReader.pos = dataStartPos + size;\n }\n return true;\n }\n /** @internal */\n _canReadInput(input) {\n return this.isSupportedEBMLOfDocType(input, 'matroska');\n }\n /** @internal */\n _createDemuxer(input) {\n return new MatroskaDemuxer(input);\n }\n get name() {\n return 'Matroska';\n }\n get mimeType() {\n return 'video/x-matroska';\n }\n}\n/**\n * WebM file format, based on Matroska.\n * @public\n */\nexport class WebMInputFormat extends MatroskaInputFormat {\n /** @internal */\n _canReadInput(input) {\n return this.isSupportedEBMLOfDocType(input, 'webm');\n }\n get name() {\n return 'WebM';\n }\n get mimeType() {\n return 'video/webm';\n }\n}\n/**\n * MP3 file format.\n * @public\n */\nexport class Mp3InputFormat extends InputFormat {\n /** @internal */\n async _canReadInput(input) {\n const sourceSize = await input._mainReader.source.getSize();\n if (sourceSize < 4) {\n return false;\n }\n const mp3Reader = new Mp3Reader(input._mainReader);\n mp3Reader.fileSize = sourceSize;\n const id3Tag = mp3Reader.readId3();\n if (id3Tag) {\n mp3Reader.pos += id3Tag.size;\n }\n const framesStartPos = mp3Reader.pos;\n await mp3Reader.reader.loadRange(mp3Reader.pos, mp3Reader.pos + 4096);\n const firstHeader = mp3Reader.readNextFrameHeader(Math.min(framesStartPos + 4096, sourceSize));\n if (!firstHeader) {\n return false;\n }\n if (id3Tag) {\n // If there was an ID3 tag at the start, we can be pretty sure this is MP3 by now\n return true;\n }\n // Fine, we found one frame header, but we're still not entirely sure this is MP3. Let's check if we can find\n // another header right after it:\n mp3Reader.pos = firstHeader.startPos + firstHeader.totalSize;\n await mp3Reader.reader.loadRange(mp3Reader.pos, mp3Reader.pos + FRAME_HEADER_SIZE);\n const secondHeader = mp3Reader.readNextFrameHeader(mp3Reader.pos + FRAME_HEADER_SIZE);\n if (!secondHeader) {\n return false;\n }\n // In a well-formed MP3 file, we'd expect these two frames to share some similarities:\n if (firstHeader.channel !== secondHeader.channel || firstHeader.sampleRate !== secondHeader.sampleRate) {\n return false;\n }\n // We have found two matching consecutive MP3 frames, a strong indicator that this is an MP3 file\n return true;\n }\n /** @internal */\n _createDemuxer(input) {\n return new Mp3Demuxer(input);\n }\n get name() {\n return 'MP3';\n }\n get mimeType() {\n return 'audio/mpeg';\n }\n}\n/**\n * WAVE file format, based on RIFF.\n * @public\n */\nexport class WaveInputFormat extends InputFormat {\n /** @internal */\n async _canReadInput(input) {\n const sourceSize = await input._mainReader.source.getSize();\n if (sourceSize < 12) {\n return false;\n }\n const riffReader = new RiffReader(input._mainReader);\n const riffType = riffReader.readAscii(4);\n if (riffType !== 'RIFF' && riffType !== 'RIFX') {\n return false;\n }\n riffReader.pos = 8;\n const format = riffReader.readAscii(4);\n return format === 'WAVE';\n }\n /** @internal */\n _createDemuxer(input) {\n return new WaveDemuxer(input);\n }\n get name() {\n return 'WAVE';\n }\n get mimeType() {\n return 'audio/wav';\n }\n}\n/**\n * Ogg file format.\n * @public\n */\nexport class OggInputFormat extends InputFormat {\n /** @internal */\n async _canReadInput(input) {\n const sourceSize = await input._mainReader.source.getSize();\n if (sourceSize < 4) {\n return false;\n }\n const oggReader = new OggReader(input._mainReader);\n return oggReader.readAscii(4) === 'OggS';\n }\n /** @internal */\n _createDemuxer(input) {\n return new OggDemuxer(input);\n }\n get name() {\n return 'Ogg';\n }\n get mimeType() {\n return 'application/ogg';\n }\n}\n/**\n * MP4 input format singleton.\n * @public\n */\nexport const MP4 = new Mp4InputFormat();\n/**\n * QuickTime File Format input format singleton.\n * @public\n */\nexport const QTFF = new QuickTimeInputFormat();\n/**\n * Matroska input format singleton.\n * @public\n */\nexport const MATROSKA = new MatroskaInputFormat();\n/**\n * WebM input format singleton.\n * @public\n */\nexport const WEBM = new WebMInputFormat();\n/**\n * MP3 input format singleton.\n * @public\n */\nexport const MP3 = new Mp3InputFormat();\n/**\n * WAVE input format singleton.\n * @public\n */\nexport const WAVE = new WaveInputFormat();\n/**\n * Ogg input format singleton.\n * @public\n */\nexport const OGG = new OggInputFormat();\n/**\n * List of all input format singletons. If you don't need to support all input formats, you should specify the\n * formats individually for better tree shaking.\n * @public\n */\nexport const ALL_FORMATS = [MP4, QTFF, MATROSKA, WEBM, WAVE, OGG, MP3];\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { InputFormat } from './input-format.js';\nimport { assert } from './misc.js';\nimport { Reader } from './reader.js';\nimport { Source } from './source.js';\n/**\n * Represents an input media file. This is the root object from which all media read operations start.\n * @public\n */\nexport class Input {\n constructor(options) {\n /** @internal */\n this._demuxerPromise = null;\n /** @internal */\n this._format = null;\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (!Array.isArray(options.formats) || options.formats.some(x => !(x instanceof InputFormat))) {\n throw new TypeError('options.formats must be an array of InputFormat.');\n }\n if (!(options.source instanceof Source)) {\n throw new TypeError('options.source must be a Source.');\n }\n this._formats = options.formats;\n this._source = options.source;\n this._mainReader = new Reader(options.source);\n }\n /** @internal */\n _getDemuxer() {\n return this._demuxerPromise ??= (async () => {\n await this._mainReader.loadRange(0, 4096); // Load the first 4 kiB so we can determine the format\n for (const format of this._formats) {\n const canRead = await format._canReadInput(this);\n if (canRead) {\n this._format = format;\n return format._createDemuxer(this);\n }\n }\n throw new Error('Input has an unsupported or unrecognizable format.');\n })();\n }\n /**\n * Returns the source from which this input file reads its data. This is the same source that was passed to the\n * constructor.\n */\n get source() {\n return this._source;\n }\n /**\n * Returns the format of the input file. You can compare this result directly to the InputFormat singletons or use\n * `instanceof` checks for subset-aware logic (for example, `format instanceof MatroskaInputFormat` is true for\n * both MKV and WebM).\n */\n async getFormat() {\n await this._getDemuxer();\n assert(this._format);\n return this._format;\n }\n /**\n * Computes the duration of the input file, in seconds. More precisely, returns the largest end timestamp among\n * all tracks.\n */\n async computeDuration() {\n const demuxer = await this._getDemuxer();\n return demuxer.computeDuration();\n }\n /** Returns the list of all tracks of this input file. */\n async getTracks() {\n const demuxer = await this._getDemuxer();\n return demuxer.getTracks();\n }\n /** Returns the list of all video tracks of this input file. */\n async getVideoTracks() {\n const tracks = await this.getTracks();\n return tracks.filter(x => x.isVideoTrack());\n }\n /** Returns the primary video track of this input file, or null if there are no video tracks. */\n async getPrimaryVideoTrack() {\n const tracks = await this.getTracks();\n return tracks.find(x => x.isVideoTrack()) ?? null;\n }\n /** Returns the list of all audio tracks of this input file. */\n async getAudioTracks() {\n const tracks = await this.getTracks();\n return tracks.filter(x => x.isAudioTrack());\n }\n /** Returns the primary audio track of this input file, or null if there are no audio tracks. */\n async getPrimaryAudioTrack() {\n const tracks = await this.getTracks();\n return tracks.find(x => x.isAudioTrack()) ?? null;\n }\n /** Returns the full MIME type of this input file, including track codecs. */\n async getMimeType() {\n const demuxer = await this._getDemuxer();\n return demuxer.getMimeType();\n }\n}\n", "import {WebMediaInfo} from \"web-demuxer\"\n\ntype Events =\n\t| {type: \"config\", config: {audio: AudioDecoderConfig, video: VideoDecoderConfig}}\n\t| {type: \"info\", data: WebMediaInfo}\n\t| {type: \"encoderQueueSize\", size: number}\n\ntype Handler = (event: Events) => void\n\nexport class Machina {\n\tcount = 0\n\n\t#handlers = new Map<number, Handler>()\n\n\tregister(id: number, handler: Handler) {\n\t\tthis.#handlers.set(id, handler)\n\t}\n\n\tunregister(id: number) {\n\t\tthis.#handlers.delete(id)\n\t}\n\n\tdispatch(id: number, event: Events) {\n\t\tthis.#handlers.get(id)?.(event)\n\t}\n}\n\n", "\nimport {Comrade} from \"@e280/comrade\"\nimport {Machina} from \"../parts/machina.js\"\nimport {DriverSchematic} from \"./schematic.js\"\n\nexport const setupDriverHost = (machina: Machina) => Comrade.host<DriverSchematic>(({work}, rig) => ({\n\n\tasync world() {\n\t\tmachina.count++\n\t}\n}))\n\n", "import {BlobSource, UrlSource} from \"mediabunny\"\nimport {DecoderSource} from \"../fns/schematic.js\"\n\n// only streamable sources\nexport async function loadDecoderSource(source: DecoderSource) {\n\tif(source instanceof FileSystemFileHandle) {\n\t\tconst file = await source.getFile()\n\t\treturn new BlobSource(file)\n\t} else {\n\t\treturn new UrlSource(source)\n\t}\n}\n\n", "import {Comrade, tune, Thread} from \"@e280/comrade\"\nimport {ALL_FORMATS, Input, type StreamTargetChunk} from \"mediabunny\"\n\nimport {Machina} from \"./parts/machina.js\"\nimport {setupDriverHost} from \"./fns/host.js\"\nimport {loadDecoderSource} from \"./utils/load-decoder-source.js\"\nimport {DecoderInput, DriverSchematic, Composition, EncoderInput, DecoderSource} from \"./fns/schematic.js\"\n\nexport type DriverOptions = {\n\tworkerUrl: URL | string\n}\n\nexport class Driver {\n\tstatic async setup(options: DriverOptions) {\n\t\tconst machina = new Machina()\n\t\tconst thread = await Comrade.thread<DriverSchematic>({\n\t\t\tlabel: \"OmnitoolDriver\",\n\t\t\tworkerUrl: options.workerUrl,\n\t\t\tsetupHost: setupDriverHost(machina),\n\t\t})\n\t\treturn new this(machina, thread)\n\t}\n\n\tconstructor(\n\t\tpublic machina: Machina,\n\t\tpublic thread: Thread<DriverSchematic>\n\t) {}\n\n\tasync hello() {\n\t\treturn this.thread.work.hello()\n\t}\n\n\tasync getAudioDuration(source: DecoderSource) {\n\t\tconst input = new Input({\n\t\t\tsource: await loadDecoderSource(source),\n\t\t\tformats: ALL_FORMATS\n\t\t})\n\n\t\tconst audioTrack = await input.getPrimaryAudioTrack()\n\t\treturn await audioTrack?.computeDuration()\n\t}\n\n\tasync getVideoDuration(source: DecoderSource) {\n\t\tconst input = new Input({\n\t\t\tsource: await loadDecoderSource(source),\n\t\t\tformats: ALL_FORMATS\n\t\t})\n\n\t\tconst videoTrack = await input.getPrimaryVideoTrack()\n\t\treturn await videoTrack?.computeDuration()\n\t}\n\n\tdecode(input: DecoderInput) {\n\t\tlet lastFrame: VideoFrame | null = null\n\t\tconst videoTransform = new TransformStream<VideoFrame, VideoFrame>({\n\t\t\tasync transform(chunk, controller) {\n\t\t\t\tconst frame = await input.onFrame?.(chunk) ?? chunk\n\t\t\t\t// below code is to prevent mem leaks and hardware accelerated decoder stall\n\t\t\t\tlastFrame?.close()\n\t\t\t\tcontroller.enqueue(frame)\n\t\t\t\tlastFrame = frame\n\t\t\t}\n\t\t})\n\t\tconst audioTransform = new TransformStream<AudioData, AudioData>()\n\t\tthis.thread.work.decode[tune]({transfer: [videoTransform.writable, audioTransform.writable]})({\n\t\t\tsource: input.source,\n\t\t\tvideo: videoTransform.writable,\n\t\t\taudio: audioTransform.writable,\n\t\t})\n\t\treturn {\n\t\t\taudio: audioTransform.readable,\n\t\t\tvideo: videoTransform.readable\n\t\t}\n\t}\n\n\tasync encode({readables, config}: EncoderInput) {\n\t\tconst handle = await window.showSaveFilePicker()\n\t\tconst writable = await handle.createWritable()\n\t\t// making bridge because file picker writable is not transferable\n\t\tconst bridge = new WritableStream<StreamTargetChunk>({\n\t\t\tasync write(chunk) {\n\t\t\t\tawait writable.write(chunk)\n\t\t\t},\n\t\t\tasync close() {\n\t\t\t\tawait writable.close()\n\t\t\t}\n\t\t})\n\t\treturn await this.thread.work.encode[tune]({transfer: [readables.audio, readables.video, bridge]})({readables, config, bridge})\n\t}\n\n\tasync composite(\n\t\tcomposition: Composition,\n\t) {\n\t\tconst transfer = this.#collectTransferablesFromComposition(composition)\n\t\treturn await this.thread.work.composite[tune]({transfer})(composition)\n\t}\n\n\t#collectTransferablesFromComposition(composition: Composition) {\n\t\tconst transferables: Transferable[] = []\n\n\t\tconst visit = (node: Composition) => {\n\t\t\tif (Array.isArray(node)) {\n\t\t\t\tfor (const child of node)\n\t\t\t\t\tvisit(child)\n\t\t\t}\n\t\t\telse if (node && typeof node === 'object' && 'kind' in node) {\n\t\t\t\tif (node.kind === 'image' && node.frame instanceof VideoFrame)\n\t\t\t\t\ttransferables.push(node.frame)\n\t\t\t}\n\t\t}\n\n\t\tvisit(composition)\n\t\treturn transferables\n\t}\n}\n\n", "import {Driver} from \"./driver/driver.js\"\n\nconst workerUrl = new URL(\"../driver/driver.worker.bundle.js\", import.meta.url)\n\nexport const context = {\n\tdriver: Driver.setup({workerUrl})\n}\n", "function t(t,e,i,s){return new(i||(i=Promise))((function(n,r){function o(t){try{h(s.next(t))}catch(t){r(t)}}function a(t){try{h(s.throw(t))}catch(t){r(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(o,a)}h((s=s.apply(t,e||[])).next())}))}\"function\"==typeof SuppressedError&&SuppressedError;class e{constructor(){this.listeners={}}on(t,e,i){if(this.listeners[t]||(this.listeners[t]=new Set),this.listeners[t].add(e),null==i?void 0:i.once){const i=()=>{this.un(t,i),this.un(t,e)};return this.on(t,i),i}return()=>this.un(t,e)}un(t,e){var i;null===(i=this.listeners[t])||void 0===i||i.delete(e)}once(t,e){return this.on(t,e,{once:!0})}unAll(){this.listeners={}}emit(t,...e){this.listeners[t]&&this.listeners[t].forEach((t=>t(...e)))}}const i={decode:function(e,i){return t(this,void 0,void 0,(function*(){const t=new AudioContext({sampleRate:i});return t.decodeAudioData(e).finally((()=>t.close()))}))},createBuffer:function(t,e){return\"number\"==typeof t[0]&&(t=[t]),function(t){const e=t[0];if(e.some((t=>t>1||t<-1))){const i=e.length;let s=0;for(let t=0;t<i;t++){const i=Math.abs(e[t]);i>s&&(s=i)}for(const e of t)for(let t=0;t<i;t++)e[t]/=s}}(t),{duration:e,length:t[0].length,sampleRate:t[0].length/e,numberOfChannels:t.length,getChannelData:e=>null==t?void 0:t[e],copyFromChannel:AudioBuffer.prototype.copyFromChannel,copyToChannel:AudioBuffer.prototype.copyToChannel}}};function s(t,e){const i=e.xmlns?document.createElementNS(e.xmlns,t):document.createElement(t);for(const[t,n]of Object.entries(e))if(\"children\"===t&&n)for(const[t,e]of Object.entries(n))e instanceof Node?i.appendChild(e):\"string\"==typeof e?i.appendChild(document.createTextNode(e)):i.appendChild(s(t,e));else\"style\"===t?Object.assign(i.style,n):\"textContent\"===t?i.textContent=n:i.setAttribute(t,n.toString());return i}function n(t,e,i){const n=s(t,e||{});return null==i||i.appendChild(n),n}var r=Object.freeze({__proto__:null,createElement:n,default:n});const o={fetchBlob:function(e,i,s){return t(this,void 0,void 0,(function*(){const n=yield fetch(e,s);if(n.status>=400)throw new Error(`Failed to fetch ${e}: ${n.status} (${n.statusText})`);return function(e,i){t(this,void 0,void 0,(function*(){if(!e.body||!e.headers)return;const s=e.body.getReader(),n=Number(e.headers.get(\"Content-Length\"))||0;let r=0;const o=e=>t(this,void 0,void 0,(function*(){r+=(null==e?void 0:e.length)||0;const t=Math.round(r/n*100);i(t)})),a=()=>t(this,void 0,void 0,(function*(){let t;try{t=yield s.read()}catch(t){return}t.done||(o(t.value),yield a())}));a()}))}(n.clone(),i),n.blob()}))}};class a extends e{constructor(t){super(),this.isExternalMedia=!1,t.media?(this.media=t.media,this.isExternalMedia=!0):this.media=document.createElement(\"audio\"),t.mediaControls&&(this.media.controls=!0),t.autoplay&&(this.media.autoplay=!0),null!=t.playbackRate&&this.onMediaEvent(\"canplay\",(()=>{null!=t.playbackRate&&(this.media.playbackRate=t.playbackRate)}),{once:!0})}onMediaEvent(t,e,i){return this.media.addEventListener(t,e,i),()=>this.media.removeEventListener(t,e,i)}getSrc(){return this.media.currentSrc||this.media.src||\"\"}revokeSrc(){const t=this.getSrc();t.startsWith(\"blob:\")&&URL.revokeObjectURL(t)}canPlayType(t){return\"\"!==this.media.canPlayType(t)}setSrc(t,e){const i=this.getSrc();if(t&&i===t)return;this.revokeSrc();const s=e instanceof Blob&&(this.canPlayType(e.type)||!t)?URL.createObjectURL(e):t;if(i&&this.media.removeAttribute(\"src\"),s||t)try{this.media.src=s}catch(e){this.media.src=t}}destroy(){this.isExternalMedia||(this.media.pause(),this.media.remove(),this.revokeSrc(),this.media.removeAttribute(\"src\"),this.media.load())}setMediaElement(t){this.media=t}play(){return t(this,void 0,void 0,(function*(){return this.media.play()}))}pause(){this.media.pause()}isPlaying(){return!this.media.paused&&!this.media.ended}setTime(t){this.media.currentTime=Math.max(0,Math.min(t,this.getDuration()))}getDuration(){return this.media.duration}getCurrentTime(){return this.media.currentTime}getVolume(){return this.media.volume}setVolume(t){this.media.volume=t}getMuted(){return this.media.muted}setMuted(t){this.media.muted=t}getPlaybackRate(){return this.media.playbackRate}isSeeking(){return this.media.seeking}setPlaybackRate(t,e){null!=e&&(this.media.preservesPitch=e),this.media.playbackRate=t}getMediaElement(){return this.media}setSinkId(t){return this.media.setSinkId(t)}}class h extends e{constructor(t,e){super(),this.timeouts=[],this.isScrollable=!1,this.audioData=null,this.resizeObserver=null,this.lastContainerWidth=0,this.isDragging=!1,this.subscriptions=[],this.unsubscribeOnScroll=[],this.subscriptions=[],this.options=t;const i=this.parentFromOptionsContainer(t.container);this.parent=i;const[s,n]=this.initHtml();i.appendChild(s),this.container=s,this.scrollContainer=n.querySelector(\".scroll\"),this.wrapper=n.querySelector(\".wrapper\"),this.canvasWrapper=n.querySelector(\".canvases\"),this.progressWrapper=n.querySelector(\".progress\"),this.cursor=n.querySelector(\".cursor\"),e&&n.appendChild(e),this.initEvents()}parentFromOptionsContainer(t){let e;if(\"string\"==typeof t?e=document.querySelector(t):t instanceof HTMLElement&&(e=t),!e)throw new Error(\"Container not found\");return e}initEvents(){const t=t=>{const e=this.wrapper.getBoundingClientRect(),i=t.clientX-e.left,s=t.clientY-e.top;return[i/e.width,s/e.height]};if(this.wrapper.addEventListener(\"click\",(e=>{const[i,s]=t(e);this.emit(\"click\",i,s)})),this.wrapper.addEventListener(\"dblclick\",(e=>{const[i,s]=t(e);this.emit(\"dblclick\",i,s)})),!0!==this.options.dragToSeek&&\"object\"!=typeof this.options.dragToSeek||this.initDrag(),this.scrollContainer.addEventListener(\"scroll\",(()=>{const{scrollLeft:t,scrollWidth:e,clientWidth:i}=this.scrollContainer,s=t/e,n=(t+i)/e;this.emit(\"scroll\",s,n,t,t+i)})),\"function\"==typeof ResizeObserver){const t=this.createDelay(100);this.resizeObserver=new ResizeObserver((()=>{t().then((()=>this.onContainerResize())).catch((()=>{}))})),this.resizeObserver.observe(this.scrollContainer)}}onContainerResize(){const t=this.parent.clientWidth;t===this.lastContainerWidth&&\"auto\"!==this.options.height||(this.lastContainerWidth=t,this.reRender())}initDrag(){this.subscriptions.push(function(t,e,i,s,n=3,r=0,o=100){if(!t)return()=>{};const a=matchMedia(\"(pointer: coarse)\").matches;let h=()=>{};const l=l=>{if(l.button!==r)return;l.preventDefault(),l.stopPropagation();let d=l.clientX,c=l.clientY,u=!1;const p=Date.now(),m=s=>{if(s.preventDefault(),s.stopPropagation(),a&&Date.now()-p<o)return;const r=s.clientX,h=s.clientY,l=r-d,m=h-c;if(u||Math.abs(l)>n||Math.abs(m)>n){const s=t.getBoundingClientRect(),{left:n,top:o}=s;u||(null==i||i(d-n,c-o),u=!0),e(l,m,r-n,h-o),d=r,c=h}},f=e=>{if(u){const i=e.clientX,n=e.clientY,r=t.getBoundingClientRect(),{left:o,top:a}=r;null==s||s(i-o,n-a)}h()},g=t=>{t.relatedTarget&&t.relatedTarget!==document.documentElement||f(t)},v=t=>{u&&(t.stopPropagation(),t.preventDefault())},b=t=>{u&&t.preventDefault()};document.addEventListener(\"pointermove\",m),document.addEventListener(\"pointerup\",f),document.addEventListener(\"pointerout\",g),document.addEventListener(\"pointercancel\",g),document.addEventListener(\"touchmove\",b,{passive:!1}),document.addEventListener(\"click\",v,{capture:!0}),h=()=>{document.removeEventListener(\"pointermove\",m),document.removeEventListener(\"pointerup\",f),document.removeEventListener(\"pointerout\",g),document.removeEventListener(\"pointercancel\",g),document.removeEventListener(\"touchmove\",b),setTimeout((()=>{document.removeEventListener(\"click\",v,{capture:!0})}),10)}};return t.addEventListener(\"pointerdown\",l),()=>{h(),t.removeEventListener(\"pointerdown\",l)}}(this.wrapper,((t,e,i)=>{this.emit(\"drag\",Math.max(0,Math.min(1,i/this.wrapper.getBoundingClientRect().width)))}),(t=>{this.isDragging=!0,this.emit(\"dragstart\",Math.max(0,Math.min(1,t/this.wrapper.getBoundingClientRect().width)))}),(t=>{this.isDragging=!1,this.emit(\"dragend\",Math.max(0,Math.min(1,t/this.wrapper.getBoundingClientRect().width)))})))}getHeight(t,e){var i;const s=(null===(i=this.audioData)||void 0===i?void 0:i.numberOfChannels)||1;if(null==t)return 128;if(!isNaN(Number(t)))return Number(t);if(\"auto\"===t){const t=this.parent.clientHeight||128;return(null==e?void 0:e.every((t=>!t.overlay)))?t/s:t}return 128}initHtml(){const t=document.createElement(\"div\"),e=t.attachShadow({mode:\"open\"}),i=this.options.cspNonce&&\"string\"==typeof this.options.cspNonce?this.options.cspNonce.replace(/\"/g,\"\"):\"\";return e.innerHTML=`\\n <style${i?` nonce=\"${i}\"`:\"\"}>\\n :host {\\n user-select: none;\\n min-width: 1px;\\n }\\n :host audio {\\n display: block;\\n width: 100%;\\n }\\n :host .scroll {\\n overflow-x: auto;\\n overflow-y: hidden;\\n width: 100%;\\n position: relative;\\n }\\n :host .noScrollbar {\\n scrollbar-color: transparent;\\n scrollbar-width: none;\\n }\\n :host .noScrollbar::-webkit-scrollbar {\\n display: none;\\n -webkit-appearance: none;\\n }\\n :host .wrapper {\\n position: relative;\\n overflow: visible;\\n z-index: 2;\\n }\\n :host .canvases {\\n min-height: ${this.getHeight(this.options.height,this.options.splitChannels)}px;\\n }\\n :host .canvases > div {\\n position: relative;\\n }\\n :host canvas {\\n display: block;\\n position: absolute;\\n top: 0;\\n image-rendering: pixelated;\\n }\\n :host .progress {\\n pointer-events: none;\\n position: absolute;\\n z-index: 2;\\n top: 0;\\n left: 0;\\n width: 0;\\n height: 100%;\\n overflow: hidden;\\n }\\n :host .progress > div {\\n position: relative;\\n }\\n :host .cursor {\\n pointer-events: none;\\n position: absolute;\\n z-index: 5;\\n top: 0;\\n left: 0;\\n height: 100%;\\n border-radius: 2px;\\n }\\n </style>\\n\\n <div class=\"scroll\" part=\"scroll\">\\n <div class=\"wrapper\" part=\"wrapper\">\\n <div class=\"canvases\" part=\"canvases\"></div>\\n <div class=\"progress\" part=\"progress\"></div>\\n <div class=\"cursor\" part=\"cursor\"></div>\\n </div>\\n </div>\\n `,[t,e]}setOptions(t){if(this.options.container!==t.container){const e=this.parentFromOptionsContainer(t.container);e.appendChild(this.container),this.parent=e}!0!==t.dragToSeek&&\"object\"!=typeof this.options.dragToSeek||this.initDrag(),this.options=t,this.reRender()}getWrapper(){return this.wrapper}getWidth(){return this.scrollContainer.clientWidth}getScroll(){return this.scrollContainer.scrollLeft}setScroll(t){this.scrollContainer.scrollLeft=t}setScrollPercentage(t){const{scrollWidth:e}=this.scrollContainer,i=e*t;this.setScroll(i)}destroy(){var t,e;this.subscriptions.forEach((t=>t())),this.container.remove(),null===(t=this.resizeObserver)||void 0===t||t.disconnect(),null===(e=this.unsubscribeOnScroll)||void 0===e||e.forEach((t=>t())),this.unsubscribeOnScroll=[]}createDelay(t=10){let e,i;const s=()=>{e&&clearTimeout(e),i&&i()};return this.timeouts.push(s),()=>new Promise(((n,r)=>{s(),i=r,e=setTimeout((()=>{e=void 0,i=void 0,n()}),t)}))}convertColorValues(t){if(!Array.isArray(t))return t||\"\";if(t.length<2)return t[0]||\"\";const e=document.createElement(\"canvas\"),i=e.getContext(\"2d\"),s=e.height*(window.devicePixelRatio||1),n=i.createLinearGradient(0,0,0,s),r=1/(t.length-1);return t.forEach(((t,e)=>{const i=e*r;n.addColorStop(i,t)})),n}getPixelRatio(){return Math.max(1,window.devicePixelRatio||1)}renderBarWaveform(t,e,i,s){const n=t[0],r=t[1]||t[0],o=n.length,{width:a,height:h}=i.canvas,l=h/2,d=this.getPixelRatio(),c=e.barWidth?e.barWidth*d:1,u=e.barGap?e.barGap*d:e.barWidth?c/2:0,p=e.barRadius||0,m=a/(c+u)/o,f=p&&\"roundRect\"in i?\"roundRect\":\"rect\";i.beginPath();let g=0,v=0,b=0;for(let t=0;t<=o;t++){const o=Math.round(t*m);if(o>g){const t=Math.round(v*l*s),n=t+Math.round(b*l*s)||1;let r=l-t;\"top\"===e.barAlign?r=0:\"bottom\"===e.barAlign&&(r=h-n),i[f](g*(c+u),r,c,n,p),g=o,v=0,b=0}const a=Math.abs(n[t]||0),d=Math.abs(r[t]||0);a>v&&(v=a),d>b&&(b=d)}i.fill(),i.closePath()}renderLineWaveform(t,e,i,s){const n=e=>{const n=t[e]||t[0],r=n.length,{height:o}=i.canvas,a=o/2,h=i.canvas.width/r;i.moveTo(0,a);let l=0,d=0;for(let t=0;t<=r;t++){const r=Math.round(t*h);if(r>l){const t=a+(Math.round(d*a*s)||1)*(0===e?-1:1);i.lineTo(l,t),l=r,d=0}const o=Math.abs(n[t]||0);o>d&&(d=o)}i.lineTo(l,a)};i.beginPath(),n(0),n(1),i.fill(),i.closePath()}renderWaveform(t,e,i){if(i.fillStyle=this.convertColorValues(e.waveColor),e.renderFunction)return void e.renderFunction(t,i);let s=e.barHeight||1;if(e.normalize){const e=Array.from(t[0]).reduce(((t,e)=>Math.max(t,Math.abs(e))),0);s=e?1/e:1}e.barWidth||e.barGap||e.barAlign?this.renderBarWaveform(t,e,i,s):this.renderLineWaveform(t,e,i,s)}renderSingleCanvas(t,e,i,s,n,r,o){const a=this.getPixelRatio(),h=document.createElement(\"canvas\");h.width=Math.round(i*a),h.height=Math.round(s*a),h.style.width=`${i}px`,h.style.height=`${s}px`,h.style.left=`${Math.round(n)}px`,r.appendChild(h);const l=h.getContext(\"2d\");if(this.renderWaveform(t,e,l),h.width>0&&h.height>0){const t=h.cloneNode(),i=t.getContext(\"2d\");i.drawImage(h,0,0),i.globalCompositeOperation=\"source-in\",i.fillStyle=this.convertColorValues(e.progressColor),i.fillRect(0,0,h.width,h.height),o.appendChild(t)}}renderMultiCanvas(t,e,i,s,n,r){const o=this.getPixelRatio(),{clientWidth:a}=this.scrollContainer,l=i/o;let d=Math.min(h.MAX_CANVAS_WIDTH,a,l),c={};if(e.barWidth||e.barGap){const t=e.barWidth||.5,i=t+(e.barGap||t/2);d%i!=0&&(d=Math.floor(d/i)*i)}if(0===d)return;const u=i=>{if(i<0||i>=p)return;if(c[i])return;c[i]=!0;const o=i*d;let a=Math.min(l-o,d);if(e.barWidth||e.barGap){const t=e.barWidth||.5,i=t+(e.barGap||t/2);a=Math.floor(a/i)*i}if(a<=0)return;const h=t.map((t=>{const e=Math.floor(o/l*t.length),i=Math.floor((o+a)/l*t.length);return t.slice(e,i)}));this.renderSingleCanvas(h,e,a,s,o,n,r)},p=Math.ceil(l/d);if(!this.isScrollable){for(let t=0;t<p;t++)u(t);return}const m=this.scrollContainer.scrollLeft/l,f=Math.floor(m*p);if(u(f-1),u(f),u(f+1),p>1){const t=this.on(\"scroll\",(()=>{const{scrollLeft:t}=this.scrollContainer,e=Math.floor(t/l*p);Object.keys(c).length>h.MAX_NODES&&(n.innerHTML=\"\",r.innerHTML=\"\",c={}),u(e-1),u(e),u(e+1)}));this.unsubscribeOnScroll.push(t)}}renderChannel(t,e,i,s){var{overlay:n}=e,r=function(t,e){var i={};for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&e.indexOf(s)<0&&(i[s]=t[s]);if(null!=t&&\"function\"==typeof Object.getOwnPropertySymbols){var n=0;for(s=Object.getOwnPropertySymbols(t);n<s.length;n++)e.indexOf(s[n])<0&&Object.prototype.propertyIsEnumerable.call(t,s[n])&&(i[s[n]]=t[s[n]])}return i}(e,[\"overlay\"]);const o=document.createElement(\"div\"),a=this.getHeight(r.height,r.splitChannels);o.style.height=`${a}px`,n&&s>0&&(o.style.marginTop=`-${a}px`),this.canvasWrapper.style.minHeight=`${a}px`,this.canvasWrapper.appendChild(o);const h=o.cloneNode();this.progressWrapper.appendChild(h),this.renderMultiCanvas(t,r,i,a,o,h)}render(e){return t(this,void 0,void 0,(function*(){var t;this.timeouts.forEach((t=>t())),this.timeouts=[],this.canvasWrapper.innerHTML=\"\",this.progressWrapper.innerHTML=\"\",null!=this.options.width&&(this.scrollContainer.style.width=\"number\"==typeof this.options.width?`${this.options.width}px`:this.options.width);const i=this.getPixelRatio(),s=this.scrollContainer.clientWidth,n=Math.ceil(e.duration*(this.options.minPxPerSec||0));this.isScrollable=n>s;const r=this.options.fillParent&&!this.isScrollable,o=(r?s:n)*i;if(this.wrapper.style.width=r?\"100%\":`${n}px`,this.scrollContainer.style.overflowX=this.isScrollable?\"auto\":\"hidden\",this.scrollContainer.classList.toggle(\"noScrollbar\",!!this.options.hideScrollbar),this.cursor.style.backgroundColor=`${this.options.cursorColor||this.options.progressColor}`,this.cursor.style.width=`${this.options.cursorWidth}px`,this.audioData=e,this.emit(\"render\"),this.options.splitChannels)for(let i=0;i<e.numberOfChannels;i++){const s=Object.assign(Object.assign({},this.options),null===(t=this.options.splitChannels)||void 0===t?void 0:t[i]);this.renderChannel([e.getChannelData(i)],s,o,i)}else{const t=[e.getChannelData(0)];e.numberOfChannels>1&&t.push(e.getChannelData(1)),this.renderChannel(t,this.options,o,0)}Promise.resolve().then((()=>this.emit(\"rendered\")))}))}reRender(){if(this.unsubscribeOnScroll.forEach((t=>t())),this.unsubscribeOnScroll=[],!this.audioData)return;const{scrollWidth:t}=this.scrollContainer,{right:e}=this.progressWrapper.getBoundingClientRect();if(this.render(this.audioData),this.isScrollable&&t!==this.scrollContainer.scrollWidth){const{right:t}=this.progressWrapper.getBoundingClientRect();let i=t-e;i*=2,i=i<0?Math.floor(i):Math.ceil(i),i/=2,this.scrollContainer.scrollLeft+=i}}zoom(t){this.options.minPxPerSec=t,this.reRender()}scrollIntoView(t,e=!1){const{scrollLeft:i,scrollWidth:s,clientWidth:n}=this.scrollContainer,r=t*s,o=i,a=i+n,h=n/2;if(this.isDragging){const t=30;r+t>a?this.scrollContainer.scrollLeft+=t:r-t<o&&(this.scrollContainer.scrollLeft-=t)}else{(r<o||r>a)&&(this.scrollContainer.scrollLeft=r-(this.options.autoCenter?h:0));const t=r-i-h;e&&this.options.autoCenter&&t>0&&(this.scrollContainer.scrollLeft+=Math.min(t,10))}{const t=this.scrollContainer.scrollLeft,e=t/s,i=(t+n)/s;this.emit(\"scroll\",e,i,t,t+n)}}renderProgress(t,e){if(isNaN(t))return;const i=100*t;this.canvasWrapper.style.clipPath=`polygon(${i}% 0%, 100% 0%, 100% 100%, ${i}% 100%)`,this.progressWrapper.style.width=`${i}%`,this.cursor.style.left=`${i}%`,this.cursor.style.transform=`translateX(-${100===Math.round(i)?this.options.cursorWidth:0}px)`,this.isScrollable&&this.options.autoScroll&&this.scrollIntoView(t,e)}exportImage(e,i,s){return t(this,void 0,void 0,(function*(){const t=this.canvasWrapper.querySelectorAll(\"canvas\");if(!t.length)throw new Error(\"No waveform data\");if(\"dataURL\"===s){const s=Array.from(t).map((t=>t.toDataURL(e,i)));return Promise.resolve(s)}return Promise.all(Array.from(t).map((t=>new Promise(((s,n)=>{t.toBlob((t=>{t?s(t):n(new Error(\"Could not export image\"))}),e,i)})))))}))}}h.MAX_CANVAS_WIDTH=8e3,h.MAX_NODES=10;class l extends e{constructor(){super(...arguments),this.unsubscribe=()=>{}}start(){this.unsubscribe=this.on(\"tick\",(()=>{requestAnimationFrame((()=>{this.emit(\"tick\")}))})),this.emit(\"tick\")}stop(){this.unsubscribe()}destroy(){this.unsubscribe()}}class d extends e{constructor(t=new AudioContext){super(),this.bufferNode=null,this.playStartTime=0,this.playedDuration=0,this._muted=!1,this._playbackRate=1,this._duration=void 0,this.buffer=null,this.currentSrc=\"\",this.paused=!0,this.crossOrigin=null,this.seeking=!1,this.autoplay=!1,this.addEventListener=this.on,this.removeEventListener=this.un,this.audioContext=t,this.gainNode=this.audioContext.createGain(),this.gainNode.connect(this.audioContext.destination)}load(){return t(this,void 0,void 0,(function*(){}))}get src(){return this.currentSrc}set src(t){if(this.currentSrc=t,this._duration=void 0,!t)return this.buffer=null,void this.emit(\"emptied\");fetch(t).then((e=>{if(e.status>=400)throw new Error(`Failed to fetch ${t}: ${e.status} (${e.statusText})`);return e.arrayBuffer()})).then((e=>this.currentSrc!==t?null:this.audioContext.decodeAudioData(e))).then((e=>{this.currentSrc===t&&(this.buffer=e,this.emit(\"loadedmetadata\"),this.emit(\"canplay\"),this.autoplay&&this.play())}))}_play(){var t;if(!this.paused)return;this.paused=!1,null===(t=this.bufferNode)||void 0===t||t.disconnect(),this.bufferNode=this.audioContext.createBufferSource(),this.buffer&&(this.bufferNode.buffer=this.buffer),this.bufferNode.playbackRate.value=this._playbackRate,this.bufferNode.connect(this.gainNode);let e=this.playedDuration*this._playbackRate;(e>=this.duration||e<0)&&(e=0,this.playedDuration=0),this.bufferNode.start(this.audioContext.currentTime,e),this.playStartTime=this.audioContext.currentTime,this.bufferNode.onended=()=>{this.currentTime>=this.duration&&(this.pause(),this.emit(\"ended\"))}}_pause(){var t;this.paused=!0,null===(t=this.bufferNode)||void 0===t||t.stop(),this.playedDuration+=this.audioContext.currentTime-this.playStartTime}play(){return t(this,void 0,void 0,(function*(){this.paused&&(this._play(),this.emit(\"play\"))}))}pause(){this.paused||(this._pause(),this.emit(\"pause\"))}stopAt(t){const e=t-this.currentTime,i=this.bufferNode;null==i||i.stop(this.audioContext.currentTime+e),null==i||i.addEventListener(\"ended\",(()=>{i===this.bufferNode&&(this.bufferNode=null,this.pause())}),{once:!0})}setSinkId(e){return t(this,void 0,void 0,(function*(){return this.audioContext.setSinkId(e)}))}get playbackRate(){return this._playbackRate}set playbackRate(t){this._playbackRate=t,this.bufferNode&&(this.bufferNode.playbackRate.value=t)}get currentTime(){return(this.paused?this.playedDuration:this.playedDuration+(this.audioContext.currentTime-this.playStartTime))*this._playbackRate}set currentTime(t){const e=!this.paused;e&&this._pause(),this.playedDuration=t/this._playbackRate,e&&this._play(),this.emit(\"seeking\"),this.emit(\"timeupdate\")}get duration(){var t,e;return null!==(t=this._duration)&&void 0!==t?t:(null===(e=this.buffer)||void 0===e?void 0:e.duration)||0}set duration(t){this._duration=t}get volume(){return this.gainNode.gain.value}set volume(t){this.gainNode.gain.value=t,this.emit(\"volumechange\")}get muted(){return this._muted}set muted(t){this._muted!==t&&(this._muted=t,this._muted?this.gainNode.disconnect():this.gainNode.connect(this.audioContext.destination))}canPlayType(t){return/^(audio|video)\\//.test(t)}getGainNode(){return this.gainNode}getChannelData(){const t=[];if(!this.buffer)return t;const e=this.buffer.numberOfChannels;for(let i=0;i<e;i++)t.push(this.buffer.getChannelData(i));return t}}const c={waveColor:\"#999\",progressColor:\"#555\",cursorWidth:1,minPxPerSec:0,fillParent:!0,interact:!0,dragToSeek:!1,autoScroll:!0,autoCenter:!0,sampleRate:8e3};class u extends a{static create(t){return new u(t)}constructor(t){const e=t.media||(\"WebAudio\"===t.backend?new d:void 0);super({media:e,mediaControls:t.mediaControls,autoplay:t.autoplay,playbackRate:t.audioRate}),this.plugins=[],this.decodedData=null,this.stopAtPosition=null,this.subscriptions=[],this.mediaSubscriptions=[],this.abortController=null,this.options=Object.assign({},c,t),this.timer=new l;const i=e?void 0:this.getMediaElement();this.renderer=new h(this.options,i),this.initPlayerEvents(),this.initRendererEvents(),this.initTimerEvents(),this.initPlugins();const s=this.options.url||this.getSrc()||\"\";Promise.resolve().then((()=>{this.emit(\"init\");const{peaks:t,duration:e}=this.options;(s||t&&e)&&this.load(s,t,e).catch((()=>null))}))}updateProgress(t=this.getCurrentTime()){return this.renderer.renderProgress(t/this.getDuration(),this.isPlaying()),t}initTimerEvents(){this.subscriptions.push(this.timer.on(\"tick\",(()=>{if(!this.isSeeking()){const t=this.updateProgress();this.emit(\"timeupdate\",t),this.emit(\"audioprocess\",t),null!=this.stopAtPosition&&this.isPlaying()&&t>=this.stopAtPosition&&this.pause()}})))}initPlayerEvents(){this.isPlaying()&&(this.emit(\"play\"),this.timer.start()),this.mediaSubscriptions.push(this.onMediaEvent(\"timeupdate\",(()=>{const t=this.updateProgress();this.emit(\"timeupdate\",t)})),this.onMediaEvent(\"play\",(()=>{this.emit(\"play\"),this.timer.start()})),this.onMediaEvent(\"pause\",(()=>{this.emit(\"pause\"),this.timer.stop(),this.stopAtPosition=null})),this.onMediaEvent(\"emptied\",(()=>{this.timer.stop(),this.stopAtPosition=null})),this.onMediaEvent(\"ended\",(()=>{this.emit(\"timeupdate\",this.getDuration()),this.emit(\"finish\"),this.stopAtPosition=null})),this.onMediaEvent(\"seeking\",(()=>{this.emit(\"seeking\",this.getCurrentTime())})),this.onMediaEvent(\"error\",(()=>{var t;this.emit(\"error\",null!==(t=this.getMediaElement().error)&&void 0!==t?t:new Error(\"Media error\")),this.stopAtPosition=null})))}initRendererEvents(){this.subscriptions.push(this.renderer.on(\"click\",((t,e)=>{this.options.interact&&(this.seekTo(t),this.emit(\"interaction\",t*this.getDuration()),this.emit(\"click\",t,e))})),this.renderer.on(\"dblclick\",((t,e)=>{this.emit(\"dblclick\",t,e)})),this.renderer.on(\"scroll\",((t,e,i,s)=>{const n=this.getDuration();this.emit(\"scroll\",t*n,e*n,i,s)})),this.renderer.on(\"render\",(()=>{this.emit(\"redraw\")})),this.renderer.on(\"rendered\",(()=>{this.emit(\"redrawcomplete\")})),this.renderer.on(\"dragstart\",(t=>{this.emit(\"dragstart\",t)})),this.renderer.on(\"dragend\",(t=>{this.emit(\"dragend\",t)})));{let t;this.subscriptions.push(this.renderer.on(\"drag\",(e=>{if(!this.options.interact)return;let i;this.renderer.renderProgress(e),clearTimeout(t),this.isPlaying()?i=0:!0===this.options.dragToSeek?i=200:\"object\"==typeof this.options.dragToSeek&&void 0!==this.options.dragToSeek&&(i=this.options.dragToSeek.debounceTime),t=setTimeout((()=>{this.seekTo(e)}),i),this.emit(\"interaction\",e*this.getDuration()),this.emit(\"drag\",e)})))}}initPlugins(){var t;(null===(t=this.options.plugins)||void 0===t?void 0:t.length)&&this.options.plugins.forEach((t=>{this.registerPlugin(t)}))}unsubscribePlayerEvents(){this.mediaSubscriptions.forEach((t=>t())),this.mediaSubscriptions=[]}setOptions(t){this.options=Object.assign({},this.options,t),t.duration&&!t.peaks&&(this.decodedData=i.createBuffer(this.exportPeaks(),t.duration)),t.peaks&&t.duration&&(this.decodedData=i.createBuffer(t.peaks,t.duration)),this.renderer.setOptions(this.options),t.audioRate&&this.setPlaybackRate(t.audioRate),null!=t.mediaControls&&(this.getMediaElement().controls=t.mediaControls)}registerPlugin(t){if(this.plugins.includes(t))return t;t._init(this),this.plugins.push(t);const e=t.once(\"destroy\",(()=>{this.plugins=this.plugins.filter((e=>e!==t)),this.subscriptions=this.subscriptions.filter((t=>t!==e))}));return this.subscriptions.push(e),t}unregisterPlugin(t){this.plugins=this.plugins.filter((e=>e!==t)),t.destroy()}getWrapper(){return this.renderer.getWrapper()}getWidth(){return this.renderer.getWidth()}getScroll(){return this.renderer.getScroll()}setScroll(t){return this.renderer.setScroll(t)}setScrollTime(t){const e=t/this.getDuration();this.renderer.setScrollPercentage(e)}getActivePlugins(){return this.plugins}loadAudio(e,s,n,r){return t(this,void 0,void 0,(function*(){var t;if(this.emit(\"load\",e),!this.options.media&&this.isPlaying()&&this.pause(),this.decodedData=null,this.stopAtPosition=null,!s&&!n){const i=this.options.fetchParams||{};window.AbortController&&!i.signal&&(this.abortController=new AbortController,i.signal=null===(t=this.abortController)||void 0===t?void 0:t.signal);const n=t=>this.emit(\"loading\",t);s=yield o.fetchBlob(e,n,i);const r=this.options.blobMimeType;r&&(s=new Blob([s],{type:r}))}this.setSrc(e,s);const a=yield new Promise((t=>{const e=r||this.getDuration();e?t(e):this.mediaSubscriptions.push(this.onMediaEvent(\"loadedmetadata\",(()=>t(this.getDuration())),{once:!0}))}));if(!e&&!s){const t=this.getMediaElement();t instanceof d&&(t.duration=a)}if(n)this.decodedData=i.createBuffer(n,a||0);else if(s){const t=yield s.arrayBuffer();this.decodedData=yield i.decode(t,this.options.sampleRate)}this.decodedData&&(this.emit(\"decode\",this.getDuration()),this.renderer.render(this.decodedData)),this.emit(\"ready\",this.getDuration())}))}load(e,i,s){return t(this,void 0,void 0,(function*(){try{return yield this.loadAudio(e,void 0,i,s)}catch(t){throw this.emit(\"error\",t),t}}))}loadBlob(e,i,s){return t(this,void 0,void 0,(function*(){try{return yield this.loadAudio(\"\",e,i,s)}catch(t){throw this.emit(\"error\",t),t}}))}zoom(t){if(!this.decodedData)throw new Error(\"No audio loaded\");this.renderer.zoom(t),this.emit(\"zoom\",t)}getDecodedData(){return this.decodedData}exportPeaks({channels:t=2,maxLength:e=8e3,precision:i=1e4}={}){if(!this.decodedData)throw new Error(\"The audio has not been decoded yet\");const s=Math.min(t,this.decodedData.numberOfChannels),n=[];for(let t=0;t<s;t++){const s=this.decodedData.getChannelData(t),r=[],o=s.length/e;for(let t=0;t<e;t++){const e=s.slice(Math.floor(t*o),Math.ceil((t+1)*o));let n=0;for(let t=0;t<e.length;t++){const i=e[t];Math.abs(i)>Math.abs(n)&&(n=i)}r.push(Math.round(n*i)/i)}n.push(r)}return n}getDuration(){let t=super.getDuration()||0;return 0!==t&&t!==1/0||!this.decodedData||(t=this.decodedData.duration),t}toggleInteraction(t){this.options.interact=t}setTime(t){this.stopAtPosition=null,super.setTime(t),this.updateProgress(t),this.emit(\"timeupdate\",t)}seekTo(t){const e=this.getDuration()*t;this.setTime(e)}play(e,i){const s=Object.create(null,{play:{get:()=>super.play}});return t(this,void 0,void 0,(function*(){null!=e&&this.setTime(e);const t=yield s.play.call(this);return null!=i&&(this.media instanceof d?this.media.stopAt(i):this.stopAtPosition=i),t}))}playPause(){return t(this,void 0,void 0,(function*(){return this.isPlaying()?this.pause():this.play()}))}stop(){this.pause(),this.setTime(0)}skip(t){this.setTime(this.getCurrentTime()+t)}empty(){this.load(\"\",[[0]],.001)}setMediaElement(t){this.unsubscribePlayerEvents(),super.setMediaElement(t),this.initPlayerEvents()}exportImage(){return t(this,arguments,void 0,(function*(t=\"image/png\",e=1,i=\"dataURL\"){return this.renderer.exportImage(t,e,i)}))}destroy(){var t;this.emit(\"destroy\"),null===(t=this.abortController)||void 0===t||t.abort(),this.plugins.forEach((t=>t.destroy())),this.subscriptions.forEach((t=>t())),this.unsubscribePlayerEvents(),this.timer.destroy(),this.renderer.destroy(),super.destroy()}}u.BasePlugin=class extends e{constructor(t){super(),this.subscriptions=[],this.isDestroyed=!1,this.options=t}onInit(){}_init(t){this.isDestroyed&&(this.subscriptions=[],this.isDestroyed=!1),this.wavesurfer=t,this.onInit()}destroy(){this.emit(\"destroy\"),this.subscriptions.forEach((t=>t())),this.subscriptions=[],this.isDestroyed=!0,this.wavesurfer=void 0}},u.dom=r;export{u as default};\n", "import WaveSurfer from \"wavesurfer.js\"\n\nimport {context} from \"../../context.js\"\nimport {DecoderSource} from \"../../driver/fns/schematic.js\"\n\nexport class Waveform {\n\twavesurfer: WaveSurfer\n\n\tconstructor(peaks: number[], container: HTMLElement, duration: number) {\n\t\tthis.wavesurfer = WaveSurfer.create({\n \t\tcontainer,\n \t\twaveColor: 'rgb(200, 0, 200)',\n \t\tprogressColor: 'rgb(100, 0, 100)',\n \t\tbarWidth: 10,\n \t\tbarRadius: 10,\n \t\tbarGap: 2,\n \t\tpeaks: [peaks],\n \t\tduration\n\t\t})\n\t}\n\n\tstatic async init(source: DecoderSource, container: HTMLElement) {\n\t\tconst driver = await context.driver\n\t\tconst reader = driver.decode({ source }).audio.getReader()\n\n\t\tconst peaks: number[] = []\n\t\tlet buffer: number[] = []\n\t\tconst samplesPerPeak = 1024\n\t\tconst duration = await driver.getAudioDuration(source)\n\n\t\twhile (true) {\n\t\t\tconst {done, value: audioData} = await reader.read()\n\t\t\tif (done) break\n\n\t\t\tconst frames = audioData.numberOfFrames\n\t\t\tconst plane = new Float32Array(frames)\n\t\t\taudioData.copyTo(plane, {planeIndex: 0}) // Use left channel only\n\n\t\t\tfor (let i = 0; i < plane.length; i++) {\n\t\t\t\tbuffer.push(plane[i])\n\t\t\t\tif (buffer.length >= samplesPerPeak) {\n\t\t\t\t\tconst chunk = buffer.splice(0, samplesPerPeak)\n\t\t\t\t\tconst min = Math.min(...chunk)\n\t\t\t\t\tconst max = Math.max(...chunk)\n\t\t\t\t\tpeaks.push(min, max)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\taudioData.close()\n\t\t}\n\n\t\treturn new Waveform(peaks, container, duration ?? 0)\n\t}\n\n\t// set zoom(value: number) {\n\t// \tthis.wavesurfer.zoom(value)\n\t// }\n\n\tset width(value: number) {\n\t\tthis.wavesurfer.setOptions({width: value})\n\t}\n}\n", "import {Waveform} from \"../../timeline/parts/waveform.js\"\n\nexport async function waveformTest() {\n\tconst container = document.querySelector(\".waveform-demo\") as HTMLElement\n\tconst widthSlider = document.querySelector(\".width\") as HTMLInputElement\n\tconst waveform = await Waveform.init(\"/assets/temp/gl.mp4\", container)\n\n\twidthSlider.addEventListener(\"change\", () => {\n\t\tconst width = +widthSlider.value\n\t\twaveform.width = width\n\t})\n}\n", "import {\n\tALL_FORMATS,\n\tCanvasSink,\n\tCanvasSinkOptions,\n\tInput,\n\tInputVideoTrack,\n\tWrappedCanvas,\n} from \"mediabunny\"\n\nimport {DecoderSource} from '../../driver/fns/schematic.js'\nimport {loadDecoderSource} from '../../driver/utils/load-decoder-source.js'\n\nexport class Filmstrip {\n\t#sink: CanvasSink\n\t#cache: Map<number, WrappedCanvas> = new Map()\n\t#activeRange: TimeRange = [0, 0]\n\n\tprivate constructor(\n\t\tprivate videoTrack: InputVideoTrack,\n\t\tprivate options: Required<FilmstripOptions>\n\t) {\n\t\tthis.#sink = new CanvasSink(videoTrack, options.canvasSinkOptions)\n\t}\n\n\tstatic async init(source: DecoderSource, options: FilmstripOptions) {\n\t\tconst input = new Input({\n\t\t\tformats: ALL_FORMATS,\n\t\t\tsource: await loadDecoderSource(source)\n\t\t})\n\t\tconst videoTrack = await input.getPrimaryVideoTrack()\n\t\tif(videoTrack)\n\t\t\treturn new Filmstrip(\n\t\t\t\tvideoTrack, {\n\t\t\t\t\tfrequency: options.frequency ?? 1,\n\t\t\t\t\tcanvasSinkOptions: options.canvasSinkOptions ?? {width: 80, height: 50, fit: \"fill\"},\n\t\t\t\t\tonChange: options.onChange\n\t\t\t})\n\t\telse throw new Error(\"Source has no video track\")\n\t}\n\n\t/**\n \t* Sets the frequency (granularity) of filmstrip thumbnails.\n \t* Changing this triggers a filmstrip refresh after any ongoing update finishes.\n \t* @param value - The new frequency in seconds.\n \t*/\n\tset frequency(value: number) {\n\t\tif(value !== this.options.frequency) {\n\t\t\tthis.options.frequency = value\n\t\t\tthis.#update()\n\t\t}\n\t}\n\n\tget frequency() {\n\t\treturn this.options.frequency\n\t}\n\n\t#computeActiveRange([start, end]: TimeRange): TimeRange {\n\t\tconst tileSize = end - start\n\t\treturn [start - tileSize, end + tileSize]\n\t}\n\n\tasync #generateTiles() {\n\t\tconst [rangeStart, rangeEnd] = this.#activeRange\n\t\tconst neededTimestamps = new Set<number>()\n\n\t\t// duration should be computed but with trim etc also\n\t\tconst duration = await this.videoTrack.computeDuration()\n\t\tfor (\n\t\t\tlet timestamp = rangeStart;\n\t\t\ttimestamp <= rangeEnd;\n\t\t\ttimestamp += this.options.frequency\n\t\t) {\n\t\t\t// Clamp to valid time range\n\t\t\tif (timestamp >= 0 && timestamp <= duration)\n\t\t\t\tneededTimestamps.add(+timestamp.toFixed(3))\n\t\t}\n\n\t\tconst missingTimestamps = [...neededTimestamps]\n\t\t\t.filter(t => !this.#cache.has(t))\n\n\t\tlet i = 0\n\t\tfor await (const canvas of this.#sink.canvasesAtTimestamps(missingTimestamps)) {\n\t\t\tif(canvas) {\n\t\t\t\tconst requestedTime = missingTimestamps[i++]\n\t\t\t\tthis.#cache.set(requestedTime, canvas)\n\t\t\t}\n\t\t}\n\n\t\t// Dispose canvases outside the new range\n\t\tfor (const key of this.#cache.keys()) {\n\t\t\tif (!neededTimestamps.has(key)) {\n\t\t\t\tthis.#cache.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst tiles = [...this.#cache.entries()]\n\t\t\t.map(([time, canvas]) => ({time, canvas}))\n\t\tthis.options.onChange(tiles)\n\t}\n\n\t/**\n \t* Updates the visible time range for the filmstrip.\n \t*\n \t* Triggers a thumbnails update, with extended margins to preload\n \t* thumbnails slightly outside the visible range.\n \t* @param visibleRange - The current timeline viewport as a [start, end] tuple in seconds.\n \t*/\n\tset range(visibleRange: TimeRange) {\n\t\tconst newRange = this.#computeActiveRange(visibleRange)\n\t\t// Avoid redundant updates\n\t\tif (\n\t\t\tthis.#activeRange[0] === newRange[0] &&\n\t\t\tthis.#activeRange[1] === newRange[1]\n\t\t)\n\t\t\treturn\n\n\t\tthis.#activeRange = newRange\n\t\tthis.#update()\n\t}\n\n\t#updating: Promise<void> | null = null\n\t#shouldRunAgain = false\n\n\tasync #update() {\n\t\t// Perform update immediately. If multiple updates are requested while updating,\n\t\t// only the latest one will run after the current finishes (skips intermediate ones).\n\t\tif(this.#updating) {\n\t\t\tthis.#shouldRunAgain = true\n\t\t\treturn\n\t\t}\n\n\t\tthis.#updating = this.#generateTiles()\n\t\tawait this.#updating\n\t\tthis.#updating = null\n\n\t\tif(this.#shouldRunAgain) {\n\t\t\tthis.#shouldRunAgain = false\n\t\t\tawait this.#update()\n\t\t}\n\t}\n\t/**\n \t* Returns the cached thumbnail (if any) for a given timestamp.\n \t* @param time - The timestamp to retrieve the canvas for.\n \t*/\n\tgetThumbnail(time: number) {\n\t\treturn this.#cache.get(time)\n\t}\n}\n\ntype TimeRange = [number, number]\n\ninterface FilmstripOptions {\n\tfrequency?: number\n\tcanvasSinkOptions?: CanvasSinkOptions\n\tonChange: (tiles: {\n\t\ttime: number\n\t\tcanvas: WrappedCanvas\n\t}[]) => void\n}\n", "import {Filmstrip} from \"../../timeline/parts/filmstrip.js\"\n\nexport async function filmstripTest(fileHandle: FileSystemFileHandle) {\n\tconst rangeSlider = document.querySelector(\".range\") as HTMLInputElement\n\tconst rangeView = document.querySelector(\".range-view\")!\n\tconst rangeSizeSlider = document.querySelector(\".range-size\")! as HTMLInputElement\n\tconst frequencySlider = document.querySelector(\".frequency\")! as HTMLInputElement\n\tconst frequencyView = document.querySelector(\".frequency-view\")!\n\tconst container = document.querySelector(\"#filmstrip\")!\n\tconst FPS_10 = 1000/10 / 1000\n\tlet rangeSize = 0.5\n\tconst filmstrip = await Filmstrip.init(\n\t\t\tfileHandle,\n\t\t\t{\n\t\t\t\tonChange(tiles) {\n\t\t\t\t\t// Sort by time (optional, for clean ordering)\n\t\t\t\t\tconst sorted = tiles.sort((a, b) => a.time - b.time)\n\t\t\t\t\t// Clear previous thumbnails\n\t\t\t\t\tcontainer.replaceChildren(\n\t\t\t\t\t\t...sorted.map(({ time, canvas }) => createLabeledCanvas(time, canvas.canvas as HTMLCanvasElement))\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\tfrequency: FPS_10,\n\t\t\t\tcanvasSinkOptions: {\n\t\t\t\t\twidth: 80,\n\t\t\t\t\theight: 50,\n\t\t\t\t\tfit: \"fill\"\n\t\t\t\t}\n\t\t\t}\n\t\t)\n\trangeSizeSlider.addEventListener(\"change\", () => {\n\t\trangeSize = +rangeSizeSlider.value\n\t\tconst [start, end] = [+rangeSlider.value, +rangeSlider.value+rangeSize]\n\t\tfilmstrip.range = [start, end]\n\t\trangeView.textContent = `visible time range: [${start}, ${end}]`\n\t})\n\trangeSlider.addEventListener(\"change\", () => {\n\t\tconst [start, end] = [+rangeSlider.value, +rangeSlider.value+rangeSize]\n\t\tfilmstrip.range = [start, end]\n\t\trangeView.textContent = `visible time range: [${start}, ${end}]`\n\t})\n\tfrequencySlider.addEventListener(\"change\", () => {\n\t\tfilmstrip.frequency = 1000/+frequencySlider.value/1000\n\t\tfrequencyView.textContent = `frame every ${filmstrip.frequency.toFixed(3)} second (${frequencySlider.value} frames per second)`\n\t})\n\tfilmstrip.range = [10, 10.5]\n}\n\nfunction createLabeledCanvas(time: number, canvas: HTMLCanvasElement) {\n\tconst wrapper = document.createElement('div')\n\twrapper.style.position = 'relative'\n\twrapper.style.display = 'inline-block'\n\twrapper.style.marginRight = '4px'\n\twrapper.appendChild(canvas)\n\tconst label = document.createElement('div')\n\tlabel.textContent = `${time.toFixed(2)}s`\n\tlabel.style.position = 'absolute'\n\tlabel.style.top = '2px'\n\tlabel.style.right = '4px'\n\tlabel.style.fontSize = '10px'\n\tlabel.style.color = 'white'\n\tlabel.style.background = 'rgba(0,0,0,0.6)'\n\tlabel.style.padding = '2px 4px'\n\tlabel.style.borderRadius = '4px'\n\tlabel.style.pointerEvents = 'none'\n\twrapper.appendChild(label)\n\treturn wrapper\n}\n", "import {Driver} from \"../../driver/driver.js\"\nimport {DecoderSource} from \"../../driver/fns/schematic.js\"\n\nexport function setupTranscodeTest(driver: Driver, source: DecoderSource) {\n\tconst dimensions = {width: 1920, height: 1080}\n\n\tconst canvas = document.createElement(\"canvas\")\n\tcanvas.width = dimensions.width\n\tcanvas.height = dimensions.height\n\tconst ctx = canvas.getContext(\"2d\")\n\n\tasync function run() {\n\t\tconst readables = driver.decode({\n\t\t\tsource,\n\t\t\tasync onFrame(frame) {\n\t\t\t\tconst composed = await driver.composite([\n\t\t\t\t\t{\n\t\t\t\t\t\tkind: \"image\",\n\t\t\t\t\t\tframe\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\tcontent: \"omnitool\",\n\t\t\t\t\t\tfontSize: 50,\n\t\t\t\t\t\tcolor: \"green\"\n\t\t\t\t\t}\n\t\t\t\t])\n\t\t\t\tframe.close()\n\t\t\t\tctx?.drawImage(composed, 0, 0)\n\t\t\t\treturn composed\n\t\t\t}\n\t\t})\n\n\t\tawait driver.encode({\n\t\t\treadables,\n\t\t\tconfig: {\n\t\t\t\taudio: {codec: \"opus\", bitrate: 128000},\n\t\t\t\tvideo: {codec: \"vp9\", bitrate: 1000000}\n\t\t\t}\n\t\t})\n\t}\n\n\treturn {canvas, run}\n}\n", "\nimport {context} from \"../context.js\"\nimport {waveformTest} from \"./routines/waveform-test.js\"\nimport {filmstripTest} from \"./routines/filmstrip-test.js\"\nimport {setupTranscodeTest} from \"./routines/transcode-test.js\"\n\nconst driver = await context.driver\nconst results = document.querySelector(\".results\")!\n\nconst fetchButton = document.querySelector(\".fetch\")\nconst importButton = document.querySelector(\".import\") as HTMLButtonElement\n\nfetchButton?.addEventListener(\"click\", startDemoFetch)\nimportButton?.addEventListener(\"click\", startDemoImport)\n\nwaveformTest()\n\n// hello world test\n{\n\tawait driver.thread.work.hello()\n\tif (driver.machina.count === 1) console.log(\"\u2705 driver works\")\n\telse console.error(\"\u274C FAIL driver call didn't work\")\n}\n\n// transcoding tests\nasync function startDemoImport()\n{\n\tconst [fileHandle] = await window.showOpenFilePicker()\n\tconst transcode = setupTranscodeTest(driver, fileHandle)\n\tawait filmstripTest(fileHandle)\n\trun(transcode, fileHandle.name)\n}\n\nasync function startDemoFetch()\n{\n\n\t// which videos to run tests on\n\tconst videos = [\n\t\t\"/assets/temp/gl.mp4\",\n\t]\n\n\t// running each test in sequence\n\tfor (const url of videos) {\n\t\tconst transcode = setupTranscodeTest(driver, \"/assets/temp/gl.mp4\")\n\t\trun(transcode, url)\n\t}\n}\n\nasync function run(transcode: ReturnType<typeof setupTranscodeTest>, label: string) {\n\t// create result div\n\tconst div = document.createElement(\"div\")\n\tresults.append(div)\n\n\t// add video label\n\tconst p = document.createElement(\"p\")\n\tp.textContent = label\n\tdiv.append(p)\n\n\t// add the canvas to dom\n\tdiv.append(transcode.canvas)\n\n\t// run the test\n\tawait transcode.run()\n}\n"],
5
- "mappings": "AACM,IAAWA,GAAjB,SAAiBA,EAAO,CAOVA,EAAA,QAAU,MA6DvB,SAAgBC,EAAMC,EAAgB,CACrC,MAAO,OAAQA,EACZA,EAAQ,GACR,IACJ,CAJgBF,EAAA,MAAKC,EAMRD,EAAA,WAAa,CACzB,YAAa,MACb,eAAgB,OAElB,GA9EiBA,IAAAA,EAAO,CAAA,EAAA,ECKlB,IAAOG,GAAP,cAA4B,KAAK,CAC7B,KAAO,KAAK,YAAY,MAKrBC,GAAP,cAA2B,KAAK,CAC5B,KAAO,KAAK,YAAY,MCRlC,eAAsBC,GAAW,CAC/B,IAAAC,EACA,QAAAC,EACA,OAAAC,CAAM,EAKN,CAED,IAAMC,EAAKC,EAAQ,MAAMH,CAAO,EAEhC,GAAI,CACH,IAAMI,EAAS,MAAMH,EAAM,EAE3B,OAAIC,IAAO,KACH,KAED,CACN,GAAAA,EACA,OAAAE,EACA,QAASD,EAAQ,QAEnB,OAEOE,EAAO,CAGb,OAFAN,EAAI,SAAS,CAAC,QAAAC,EAAS,MAAAK,CAAK,CAAC,EAEzBH,IAAO,KACH,KAED,CACN,GAAAA,EACA,QAASC,EAAQ,QACjB,MAAQE,aAAiBC,GACtB,CACD,KAAMH,EAAQ,WAAW,YACzB,QAASE,EAAM,SAEd,CACD,KAAMF,EAAQ,WAAW,eACzB,QAAS,mBAGb,CACD,CC/CO,IAAMI,GAAa,IAAcC,IAAW,CAClD,MAAOA,EAAO,KACd,WAAYA,EAAO,IAAIA,EAAO,UAAWA,EAAO,IAAI,EACpD,QAASA,EAAO,IAChB,SAAUA,EAAO,IAAIA,EAAO,IAAKA,EAAO,GAAG,EAC3C,UAAWA,EAAO,KAClB,aAAcA,EAAO,MCNhB,SAAUC,IAAS,CACxB,OAAOC,GAAU,CAClB,CCJO,IAAMC,GAAQ,OAAO,OAAO,CAGlC,MAAO,WACP,IAAK,WACL,MAAO,WACP,OAAQ,WACR,KAAM,WACN,QAAS,WACT,KAAM,WACN,MAAO,WAGP,YAAa,WACb,UAAW,WACX,YAAa,WACb,aAAc,WACd,WAAY,WACZ,cAAe,WACf,WAAY,WACZ,YAAa,WAGb,QAAS,WACT,MAAO,WACP,QAAS,WACT,SAAU,WACV,OAAQ,WACR,UAAW,WACX,OAAQ,WACR,QAAS,WAGT,cAAe,YACf,YAAa,YACb,cAAe,YACf,eAAgB,YAChB,aAAc,YACd,gBAAiB,YACjB,aAAc,YACd,cAAe,YAGf,KAAM,UACN,IAAK,UACL,OAAQ,UACR,UAAW,UACX,QAAS,UACT,OAAQ,UACR,cAAe,UAGf,MAAO,UACP,ECjDM,IAAMC,GAAW,KAAO,CAC9B,KAAOC,GAAcA,EACrB,QAAAC,GACA,IAAAC,GACA,IAAAC,GACA,IAAAC,GACA,MAAAC,KAGK,SAAUJ,GAAQD,EAAS,CAChC,OAAOA,EAAE,QACR,8EACA,EAAE,CAEJ,CAEM,SAAUE,MAAOH,EAAmB,CACzC,OAAQC,GAAa,CACpB,QAAWM,KAAMP,EAChBC,EAAIM,EAAGN,CAAC,EACT,OAAOA,CACR,CACD,CAEM,SAAUG,GAAIA,EAAW,CAC9BA,EAAMA,EAAI,QAAQ,KAAM,EAAE,EAC1B,IAAII,EACAC,EACAC,EACAC,EAEJ,GAAIP,EAAI,SAAW,EAClBI,EAAS,SAASJ,EAAI,MAAM,EAAE,EAAE,IAAIQ,GAAKA,EAAIA,CAAC,EAAE,KAAK,EAAE,EAAG,EAAE,UACpDR,EAAI,SAAW,EACvBI,EAAS,SAASJ,EAAK,EAAE,MAEzB,OAAM,IAAI,MAAM,mBAAmB,EAEpC,OAAAK,EAAKD,GAAU,GAAM,IACrBE,EAAKF,GAAU,EAAK,IACpBG,EAAIH,EAAS,IACNH,GAAII,EAAGC,EAAGC,CAAC,CACnB,CAEM,SAAUN,GAAII,EAAWC,EAAWC,EAAS,CAClD,IAAME,EAAO,aAAeJ,CAAC,IAAIC,CAAC,IAAIC,CAAC,IACvC,OAAQ,GAAc,GAAGE,CAAI,GAAG,CAAC,GAAGC,GAAM,KAAK,EAChD,CAEM,SAAUR,GAAMG,EAAWC,EAAWC,EAAS,CACpD,IAAME,EAAO,aAAeJ,CAAC,IAAIC,CAAC,IAAIC,CAAC,IACvC,OAAQ,GAAc,GAAGE,CAAI,GAAG,CAAC,GAAGC,GAAM,KAAK,EAChD,CCpDO,IAAMC,GAAY,CACxB,GACC,OAAO,YACN,OAAO,QAAQC,EAAK,EAClB,IAAI,CAAC,CAACC,CAAG,IAAM,CACfA,EACCC,GAAcA,EACf,CAAC,EAGL,GAAGC,GAAQ,GCTL,IAAMC,GAAW,CACvB,GACC,OAAO,YACN,OAAO,QAAQC,EAAK,EAClB,IAAI,CAAC,CAACC,EAAKC,CAAI,IAAM,CACrBD,EACCE,GAAc,GAAGD,CAAI,GAAGC,CAAC,GAAGH,GAAM,KAAK,GACxC,CAAC,EAGL,GAAGI,GAAQ,GCbN,SAAUC,IAAM,CACrB,OAAO,OAAO,KAAS,KAAe,OAAO,KAAK,QAAY,GAC/D,CAEM,SAAUC,IAAM,CACrB,OACC,OAAO,QAAY,KACnB,QAAQ,UACR,QAAQ,SAAS,IAEnB,CAEM,SAAUC,IAAgB,CAC/B,OAAID,GAAM,EACD,QAAQ,IAAI,aACnB,QAAQ,OAAO,OACf,QAAQ,IAAI,OAAS,OAGdD,GAAM,EACN,KAAK,IAAI,IAAI,aAAa,GACjC,KAAK,OAAO,KAAK,OAAO,GAAG,GAC3B,KAAK,IAAI,IAAI,MAAM,IAAM,OAInB,EACT,CCzBO,IAAMG,GAAa,IAClBC,GAAgB,EACpBC,GACAC,GCLG,IAAMC,GAAe,IAAc,CAAC,CAAC,OAAAC,EAAQ,MAAAC,CAAK,IAAK,CAC7D,IAAMC,EAAUD,EAAMD,CAAM,EAE5B,SAASG,EAAUC,EAAY,CAC9B,IAAMC,EAAQD,EAAM,MACjB;EAAOA,EAAM,MAAQ;EACrB,GACH,MAAO,CACNF,EAAQ,QAAQE,EAAM,KAAO,GAAG,EAChCF,EAAQ,WAAWE,EAAM,OAAO,GAC/B,KAAK,GAAG,EAAIF,EAAQ,SAASG,CAAK,CACrC,CAEA,SAASC,EAAcC,EAAS,CAC/B,OAAQA,GAAQA,aAAgB,MAC7BJ,EAAUI,CAAI,EACdA,CACJ,CAEA,SAASC,EAAWD,EAAS,CAC5B,OAAQA,GAAQA,aAAgB,MAC7BJ,EAAUI,CAAI,EACdL,EAAQ,WAAWK,CAAI,CAC3B,CAEA,MAAO,CACN,OAAQE,GAASA,EAAM,IAAIH,CAAa,EACxC,OAAQG,GAASA,EAAM,IAAID,CAAU,EAEvC,ECZM,SAAUE,MAAkBC,EAAiB,CAClD,OAAOC,IAAY,CAClB,OAAQC,GAAQ,CACf,QAAWC,KAAUH,EACpBE,EAAQC,EAAOF,CAAO,EAAE,OAAOC,CAAK,EACrC,OAAOA,CACR,EACA,OAAQA,GAAQ,CACf,QAAWC,KAAUH,EACpBE,EAAQC,EAAOF,CAAO,EAAE,OAAOC,CAAK,EACrC,OAAOA,CACR,GAEF,CCzBA,SAASE,IAAuB,CAC/B,MAAO,CACN,KAAM,YACN,IAAK,IAAM,KAAK,IAAG,EAErB,CAEO,IAAMC,GAAmBC,GAAgD,CAAC,CAAC,OAAAC,EAAQ,MAAAC,CAAK,IAAK,CACnG,IAAMC,EAAO,CAAC,GAAGL,GAAuB,EAAI,GAAGE,CAAO,EAChDI,EAAUF,EAAMD,CAAM,EAEtBI,EAAO,IAAI,KAAKF,EAAK,IAAG,CAAE,EAE1BG,EAAOD,EAAK,eAAc,EAAG,SAAQ,EAAG,SAAS,EAAG,GAAG,EACvDE,GAASF,EAAK,YAAW,EAAK,GAAG,SAAQ,EAAG,SAAS,EAAG,GAAG,EAC3DG,EAAMH,EAAK,WAAU,EAAG,SAAQ,EAAG,SAAS,EAAG,GAAG,EAClDI,EAAW,GAAGH,CAAI,IAAIC,CAAK,IAAIC,CAAG,GAElCE,EAAOL,EAAK,YAAW,EAAG,SAAQ,EAAG,SAAS,EAAG,GAAG,EACpDM,EAASN,EAAK,cAAa,EAAG,SAAQ,EAAG,SAAS,EAAG,GAAG,EACxDO,EAASP,EAAK,cAAa,EAAG,SAAQ,EAAG,SAAS,EAAG,GAAG,EACxDQ,EAAeR,EAAK,mBAAkB,EAAG,SAAQ,EAAG,SAAS,EAAG,GAAG,EACnES,EAAQ,GAAGJ,CAAI,IAAIC,CAAM,IAAIC,CAAM,IAAIC,CAAY,GAEnDE,EAAQ,GAAGN,CAAQ,KAAKK,CAAK,GAEnC,MAAO,CACN,OAAQE,GAAS,CAChBZ,EAAQ,UAAUW,CAAK,EACvB,GAAGC,GAEJ,OAAQA,GAAS,CAChBZ,EAAQ,aAAaW,CAAK,EAC1B,GAAG,CAACZ,EAAK,IAAI,EAAE,OAAO,OAAO,EAC7B,GAAGa,GAGN,ECxCM,SAAUC,IAAU,CACzB,OAAOC,GACNC,GAAY,EACZC,GAAe,CAAE,CAEnB,CCLO,IAAMC,GAAa,KAAe,CACxC,OAAQ,MAAMC,GAAO,CACpB,MAAM,KAAK,OAAO,MAAM,IAAI,YAAW,EAAG,OAAOA,EAAO;CAAI,CAAC,CAC9D,EACA,OAAQ,MAAMA,GAAO,CACpB,MAAM,KAAK,OAAO,MAAM,IAAI,YAAW,EAAG,OAAOA,EAAO;CAAI,CAAC,CAC9D,ICRM,IAAMC,GAAa,KAAe,CACxC,OAAQ,MAAMC,GAAiB,KAAK,QAAQ,OAAO,MAAMA,EAAO;CAAI,EACpE,OAAQ,MAAMA,GAAiB,KAAK,QAAQ,OAAO,MAAMA,EAAO;CAAI,ICF9D,IAAMC,GAAgB,KAAe,CAC3C,OAAQ,MAAMC,GAAQ,QAAQ,IAAIA,CAAI,EACtC,OAAQ,MAAMA,GAAQ,QAAQ,MAAMA,CAAI,ICElC,IAAMC,GAAa,IACrBC,GAAM,EAAWC,GAAU,EACtBC,GAAM,EAAWC,GAAU,EACxBC,GAAa,ECPnB,IAAMC,GAAa,KAAe,CACxC,OAAQ,SAAQ,GAChB,OAAQ,SAAQ,KCFX,SAAUC,IAAU,CACzB,MAAO,KAAO,CACb,OAAQC,GAASA,EACjB,OAAQA,GAASA,GAEnB,CCWM,IAAOC,GAAP,MAAOC,CAAM,CAClB,OAAO,QAAU,CAChB,KAAMC,GACN,KAAMC,GACN,KAAMC,GACN,KAAMC,GACN,QAASC,IAGV,OAAO,OAAS,CACf,KAAMC,GACN,SAAU,IAAMC,GAChB,UAAW,IAAMC,IAGlB,OAAO,OAAS,CACf,KAAMC,GACN,MAAOC,IAGR,OAAO,QAAU,CAChB,KAAMC,GACN,KAAMC,GACN,OAAQC,GACR,UAAWC,IAGZ,OAAiBd,EAAO,QAAQ,KAAI,EACpC,OAAiBA,EAAO,OAAO,KAAI,EACnC,MAAeA,EAAO,OAAO,KAAI,EACjC,OAAiBA,EAAO,QAAQ,KAAI,EAEpC,MAAM,OAAOe,EAAY,CACxB,MAAM,KAAK,OAAO,OACjB,KAAK,OAAO,IAAI,EAAE,OAAOA,CAAK,EAAE,KAAK,GAAG,CAAC,CAE3C,CAEA,MAAM,SAASA,EAAY,CAC1B,MAAM,KAAK,OAAO,OACjB,KAAK,OAAO,IAAI,EAAE,OAAOA,CAAK,EAAE,KAAK,GAAG,CAAC,CAE3C,CAEA,UAAUC,EAAc,CACvB,YAAK,OAASA,EACP,IACR,CAEA,UAAUC,EAAc,CACvB,YAAK,OAASA,EACP,IACR,CAEA,SAASC,EAAY,CACpB,YAAK,MAAQA,EACN,IACR,CAEA,aAAaC,EAAiB,CAC7B,YAAK,OAASC,GAAe,GAAGD,CAAO,EAChC,IACR,GChFM,IAAME,EAAQ,OAAO,OAAO,CAClC,GAAGC,EAAeC,EAAa,CAC9B,GAAID,EAAE,SAAWC,EAAE,OAClB,MAAO,GACR,QAASC,EAAI,EAAGA,GAAKF,EAAE,OAAQE,IAC9B,GAAIF,EAAE,GAAGE,CAAC,IAAMD,EAAE,GAAGC,CAAC,EACrB,MAAO,GAET,MAAO,EACR,EAEA,OAAOC,EAAa,CACnB,OAAO,OAAO,gBAAgB,IAAI,WAAWA,CAAK,CAAC,CACpD,EACA,ECFM,IAAMC,GAAM,OAAO,OAAO,CAChC,UAAUC,EAAiB,CAC1B,MAAO,CAAC,GAAGA,CAAK,EACd,IAAIC,GAAQA,EAAK,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAC9C,KAAK,EAAE,CACV,EAEA,QAAQC,EAAc,CACrB,GAAIA,EAAO,OAAS,IAAM,EACzB,MAAM,IAAI,MAAM,yCAAyC,EAC1D,IAAMF,EAAQ,IAAI,WAAWE,EAAO,OAAS,CAAC,EAC9C,QAASC,EAAI,EAAGA,EAAID,EAAO,OAAQC,GAAK,EACvCH,EAAMG,EAAI,CAAC,EAAI,SAASD,EAAO,MAAMC,EAAGA,EAAI,CAAC,EAAG,EAAE,EACnD,OAAOH,CACR,EAGA,OAAOI,EAAY,GAAE,CACpB,OAAO,KAAK,UAAUC,EAAM,OAAOD,CAAS,CAAC,CAC9C,EAGA,OAAOJ,EAAiB,CACvB,OAAOD,GAAI,UAAUC,CAAK,CAC3B,EAGA,MAAME,EAAc,CACnB,OAAOH,GAAI,QAAQG,CAAM,CAC1B,EACA,EC7BD,IAAMI,GAAO,GACPC,GAAa,6DAENC,GAAS,OAAO,OAAO,CACnC,UAAUC,EAAiB,CAC1B,IAAIC,EAAS,OAAO,KAAOC,GAAI,UAAUF,CAAK,CAAC,EAC3CG,EAAU,GAEd,KAAOF,EAAS,GAAG,CAClB,IAAMG,EAAYH,EAAS,OAAOJ,EAAI,EACtCI,EAASA,EAAS,OAAOJ,EAAI,EAC7BM,EAAUL,GAAW,OAAOM,CAAS,CAAC,EAAID,CAC3C,CAEA,QAAWE,KAAQL,EAClB,GAAIK,IAAS,EAAGF,EAAUL,GAAW,CAAC,EAAIK,MACrC,OAGN,OAAOA,CACR,EAEA,QAAQG,EAAc,CACrB,IAAIL,EAAS,OAAO,CAAC,EAErB,QAAWM,KAAQD,EAAQ,CAC1B,IAAME,EAAQV,GAAW,QAAQS,CAAI,EACrC,GAAIC,IAAU,GAAI,MAAM,IAAI,MAAM,sBAAsBD,CAAI,oBAAoB,EAChFN,EAASA,EAAS,OAAOJ,EAAI,EAAI,OAAOW,CAAK,CAC9C,CAEA,IAAIC,EAAMR,EAAO,SAAS,EAAE,EACxBQ,EAAI,OAAS,IAAM,IAAGA,EAAM,IAAMA,GACtC,IAAMT,EAAQE,GAAI,QAAQO,CAAG,EAEzBC,EAAgB,EACpB,QAAWH,KAAQD,EAClB,GAAIC,IAAST,GAAW,CAAC,EAAGY,QACvB,OAGN,IAAMC,EAAU,IAAI,WAAWD,EAAgBV,EAAM,MAAM,EAC3D,OAAAW,EAAQ,IAAIX,EAAOU,CAAa,EACzBC,CACR,EAEA,OAAOC,EAAQ,GAAE,CAChB,OAAO,KAAK,UAAUC,EAAM,OAAOD,CAAK,CAAC,CAC1C,EAGA,OAAOZ,EAAiB,CACvB,OAAOD,GAAO,UAAUC,CAAK,CAC9B,EAGA,MAAMM,EAAc,CACnB,OAAOP,GAAO,QAAQO,CAAM,CAC7B,EACA,EC7DK,IAAOQ,GAAP,KAAY,CAoBE,QAnBnB,OAAO,SAAW,OAAO,OAAO,CAC/B,MAAO,CAAC,WAAY,IAAI,EACxB,IAAK,CAAC,WAAY,kBAAkB,EACpC,OAAQ,CAAC,WAAY,sCAAsC,EAC3D,OAAQ,CAAC,WAAY,4DAA4D,EACjF,OAAQ,CAAC,WAAY,gEAAgE,EACrF,UAAW,CACV,eAAgB,IAChB,WAAY,oEAEb,OAAQ,CACP,WAAY,mEACZ,QAAS,CAAC,UAAW,IAAK,KAAM,CAAC,GAElC,EAEO,OACA,eAER,YAAmBC,EAAgB,CAAhB,KAAA,QAAAA,EAClB,KAAK,OAAS,OAAO,YACpB,CAAC,GAAGA,EAAQ,UAAU,EAAE,IAAI,CAACC,EAAMC,IAAM,CAACD,EAAMC,CAAC,CAAC,CAAC,EAEpD,KAAK,eAAiBF,EAAQ,gBAAkB,GACjD,CAEA,QAAQG,EAAS,CAChB,IAAMC,EAAc,KAAK,KAAK,KAAK,QAAQ,WAAW,MAAM,EAC5D,GAAI,OAAO,UAAUA,CAAW,EAAG,CAElC,IAAIC,EAAY,EACZC,EAAW,EACTC,EAAmB,CAAA,EAEzB,QAAWN,KAAQE,EAAG,CACrB,GAAIF,IAAS,KAAK,QAAQ,SAAS,UAAW,SAC9C,IAAMO,EAAM,KAAK,OAAOP,CAAI,EAC5B,GAAIO,IAAQ,OAAW,MAAM,IAAI,MAAM,sBAAsBP,CAAI,EAAE,EAInE,IAHAI,EAAaA,GAAaD,EAAeI,EACzCF,GAAYF,EAELE,GAAY,GAClBA,GAAY,EACZC,EAAO,KAAMF,GAAaC,EAAY,GAAI,CAE5C,CAEA,OAAO,IAAI,WAAWC,CAAM,CAC7B,CAGA,IAAIE,EAAM,GACJC,EAAO,OAAO,KAAK,QAAQ,WAAW,MAAM,EAC9CC,EAAW,GACXR,EAAE,WAAW,KAAK,cAAc,IACnCA,EAAIA,EAAE,MAAM,KAAK,eAAe,MAAM,EACtCQ,EAAW,IAEZ,QAAWV,KAAQE,EAAG,CACrB,IAAMK,EAAM,KAAK,OAAOP,CAAI,EAC5B,GAAIO,IAAQ,OAAW,MAAM,IAAI,MAAM,sBAAsBP,CAAI,EAAE,EACnEQ,EAAMA,EAAMC,EAAO,OAAOF,CAAG,CAC9B,CACA,IAAMI,EAAgB,CAAA,EACtB,KAAOH,EAAM,IACZG,EAAI,QAAQ,OAAOH,EAAM,IAAI,CAAC,EAC9BA,EAAMA,EAAM,KAEb,OAAO,IAAI,WAAWG,CAAG,CAC1B,CAEA,UAAUC,EAAiB,CAC1B,IAAMT,EAAc,KAAK,KAAK,KAAK,QAAQ,WAAW,MAAM,EAC5D,GAAI,OAAO,UAAUA,CAAW,EAAG,CAElC,IAAIC,EAAY,EACZC,EAAW,EACXM,EAAM,GAEV,QAAWE,KAAQD,EAIlB,IAHAR,EAAaA,GAAa,EAAKS,EAC/BR,GAAY,EAELA,GAAYF,GAAa,CAC/BE,GAAYF,EACZ,IAAMW,EAASV,GAAaC,GAAc,GAAKF,GAAe,EAC9DQ,GAAO,KAAK,QAAQ,WAAWG,CAAK,CACrC,CAID,GAAIT,EAAW,EAAG,CACjB,IAAMS,EAASV,GAAcD,EAAcE,GAAe,GAAKF,GAAe,EAC9EQ,GAAO,KAAK,QAAQ,WAAWG,CAAK,CACrC,CAGA,GAAI,KAAK,QAAQ,QAChB,KAAOH,EAAI,OAAS,KAAK,QAAQ,QAAQ,OAAS,GACjDA,GAAO,KAAK,QAAQ,QAAQ,UAG9B,OAAOA,CACR,CAGA,IAAIH,EAAM,GACV,QAAWK,KAAQD,EAClBJ,GAAOA,GAAO,IAAM,OAAOK,CAAI,EAEhC,GAAIL,IAAQ,GAAI,OAAO,KAAK,QAAQ,WAAW,CAAC,EAEhD,IAAMC,EAAO,OAAO,KAAK,QAAQ,WAAW,MAAM,EAC9CE,EAAM,GACV,KAAOH,EAAM,IACZG,EAAM,KAAK,QAAQ,WAAW,OAAOH,EAAMC,CAAI,CAAC,EAAIE,EACpDH,EAAMA,EAAMC,EAEb,OAAOE,CACR,CAEA,UAAUT,EAAS,CAClB,GAAI,CAACA,EAAG,MAAO,GACf,IAAIa,EAAI,GACJL,EAAW,GACTD,EAAO,OAAO,KAAK,QAAQ,WAAW,MAAM,EAC9CP,EAAE,WAAW,KAAK,cAAc,IACnCA,EAAIA,EAAE,MAAM,KAAK,eAAe,MAAM,EACtCQ,EAAW,IAEZ,QAAWV,KAAQE,EAAG,CACrB,IAAMc,EAAQ,KAAK,OAAOhB,CAAI,EAC9B,GAAIgB,IAAU,OAAW,MAAM,IAAI,MAAM,sBAAsBhB,CAAI,EAAE,EACrEe,EAAIA,EAAIN,EAAO,OAAOO,CAAK,CAC5B,CACA,OAAO,OAAON,EAAW,CAACK,EAAIA,CAAC,CAChC,CAEA,YAAYA,EAAS,CACpBA,EAAI,KAAK,MAAMA,CAAC,EAChB,IAAML,EAAWK,EAAI,EACjBP,EAAM,OAAOE,EAAW,CAACK,EAAIA,CAAC,EAClC,GAAIP,IAAQ,GAAI,OAAO,KAAK,QAAQ,WAAW,CAAC,EAChD,IAAMC,EAAO,OAAO,KAAK,QAAQ,WAAW,MAAM,EAC9CE,EAAM,GACV,KAAOH,EAAM,IACZG,EAAM,KAAK,QAAQ,WAAW,OAAOH,EAAMC,CAAI,CAAC,EAAIE,EACpDH,EAAMA,EAAMC,EAEb,OAAOC,EAAW,GAAG,KAAK,cAAc,GAAGC,CAAG,GAAKA,CACpD,CAEA,OAAOM,EAAQ,GAAE,CAChB,OAAO,KAAK,UAAUC,EAAM,OAAOD,CAAK,CAAC,CAC1C,GCpKM,IAAME,GAAS,OAAO,OAAO,CACnC,UAAUC,EAAiB,CAC1B,OAAQ,OAAO,MAAS,WACrB,KAAK,OAAO,aAAa,GAAGA,CAAK,CAAC,EAClC,OAAO,KAAKA,CAAK,EAAE,SAAS,QAAQ,CACxC,EAEA,QAAQC,EAAc,CACrB,OAAQ,OAAO,MAAS,WACrB,WAAW,KAAK,KAAKA,CAAM,EAAGC,GAAQA,EAAK,WAAW,CAAC,CAAC,EACxD,WAAW,KAAK,OAAO,KAAKD,EAAQ,QAAQ,CAAC,CACjD,EAEA,OAAOE,EAAQ,GAAE,CAChB,OAAO,KAAK,UAAUC,EAAM,OAAOD,CAAK,CAAC,CAC1C,EAGA,OAAOH,EAAiB,CACvB,OAAOD,GAAO,UAAUC,CAAK,CAC9B,EAGA,MAAMC,EAAc,CACnB,OAAOF,GAAO,QAAQE,CAAM,CAC7B,EACA,EC5BM,IAAMI,GAAM,OAAO,OAAO,CAChC,UAAUC,EAAiB,CAC1B,OAAO,IAAI,YAAW,EAAG,OAAOA,CAAK,CACtC,EAEA,QAAQC,EAAc,CACrB,OAAO,IAAI,YAAW,EAAG,OAAOA,CAAM,CACvC,EAGA,OAAOD,EAAiB,CACvB,OAAOD,GAAI,UAAUC,CAAK,CAC3B,EAGA,MAAMC,EAAc,CACnB,OAAOF,GAAI,QAAQE,CAAM,CAC1B,EACA,EClBM,IAAMC,GAAK,OAAO,OAAO,CAC/B,IAASC,GACWA,GAAM,KAE1B,MAAQA,GACYA,GAAM,KAE1B,QAAUA,GACT,OAAOA,GAAM,UAEd,OAASA,GACR,OAAOA,GAAM,SAEd,OAASA,GACR,OAAOA,GAAM,SAEd,OAASA,GACR,OAAOA,GAAM,SAEd,OAAYA,GACX,OAAOA,GAAM,UAAYA,IAAM,KAEhC,MAAQA,GACP,MAAM,QAAQA,CAAC,EAEhB,GAAKA,GACJ,OAAOA,GAAM,WAEd,OAASA,GACR,OAAOA,GAAM,SACd,EC9BK,IAAOC,GAAP,cAA6B,KAAK,CAEpB,aADnB,KAAO,KAAK,YAAY,KACxB,YAAmBC,EAAsBC,EAAe,CACvD,MAAM,GAAGA,CAAO,mBAAmBD,EAAe,KAAM,QAAQ,CAAC,CAAC,UAAU,EAD1D,KAAA,aAAAA,CAEnB,GAIK,SAAUE,GAAYF,EAAsBC,EAAiBE,EAAoB,CACtF,OAAIH,GAAgB,GAAKA,IAAiB,IAClCG,EAAE,EAEH,IAAI,QAAW,CAACC,EAASC,IAAU,CAEzC,IAAMC,EAAK,WACV,IAAMD,EAAO,IAAIN,GAAcC,EAAcC,CAAO,CAAC,EACrDD,CAAY,EAGbG,EAAE,EACA,KAAKC,CAAO,EACZ,MAAMC,CAAM,EACZ,QAAQ,IAAM,aAAaC,CAAE,CAAC,CACjC,CAAC,CACF,CCbM,SAAUC,GAAK,CACpB,IAAIC,EACAC,EAEEC,EAAU,IAAI,QAAW,CAACC,EAAKC,IAAO,CAC3CJ,EAAUG,EACVF,EAASG,CACV,CAAC,EAED,SAASC,EAASC,EAAmB,CACpC,OAAAA,EAAQ,KAAKN,CAAO,EAAE,MAAMC,CAAM,EAC3BC,CACR,CAEA,MAAO,CAAC,QAAAA,EAAS,QAAAF,EAAS,OAAAC,EAAQ,SAAAI,CAAQ,CAC3C,CCvBM,SAAUE,GACdC,EACAC,EAAc,CAGf,IAAIC,EAAeF,EAEnB,QAAWG,KAAOF,EAEjB,GADAC,EAAUA,EAAQC,CAAG,EACjBC,GAAG,MAAMF,CAAO,EACnB,MAGF,OAAOA,CACR,CCjBM,IAAOG,GAAP,KAAU,CAGI,MAFnBC,GAAgB,CAAA,EAEhB,YAAmBC,EAAU,CAAV,KAAA,MAAAA,EAClB,KAAKD,GAAW,CAAC,GAAGC,CAAK,CAC1B,CAEA,MAAI,CACC,KAAKD,GAAS,SAAW,IAC5B,KAAKA,GAAW,CAAC,GAAG,KAAK,KAAK,GAC/B,IAAME,EAAQ,KAAK,MAAM,KAAK,OAAM,EAAK,KAAKF,GAAS,MAAM,EACvD,CAACG,CAAI,EAAI,KAAKH,GAAS,OAAOE,EAAO,CAAC,EAC5C,OAAOC,CACR,GCbK,SAAUC,GAAsBC,EAAK,CAC1C,MAAO,CACN,IAAaC,GACZC,GAAMF,EAAGC,CAAS,EAEnB,OAASE,GACRC,GAASJ,EAAGG,CAAS,EAGxB,CAKAJ,GAAG,KAAO,OAAO,OAAO,CACvB,IACEE,GAEAD,GAASE,GAAMF,EAAGC,CAAS,EAE7B,OACEA,GAEAD,GAASI,GAASJ,EAAGC,CAAS,EAEhC,EAgBD,IAAMC,GAAQ,CACZF,EACAC,IAGM,OAAO,YACb,OAAO,QAAQD,CAAC,EAAE,IACjB,CAAC,CAACK,EAAKC,CAAK,IAAW,CAACD,EAAKJ,EAAUK,EAAOD,CAAG,CAAC,CAAC,CACnD,EAIGD,GAAW,CACfJ,EACAG,IAGM,OAAO,YACb,OAAO,QAAQH,CAAC,EAAE,OACjB,CAAC,CAACK,EAAKC,CAAK,IAAWH,EAAUG,EAAOD,CAAG,CAAC,CAC5C,EC1BG,SAAUE,IAAG,CAClB,IAAMC,EAAM,IAAI,IAEhB,SAASC,EAAIC,EAAe,CAC3B,OAAAF,EAAI,IAAIE,CAAE,EACH,IAAK,CAAGF,EAAI,OAAOE,CAAE,CAAE,CAC/B,CAEA,eAAeC,KAAOC,EAAI,CACzB,MAAM,QAAQ,IAAI,CAAC,GAAGJ,CAAG,EAAE,IAAIE,GAAMA,EAAG,GAAGE,CAAC,CAAC,CAAC,CAC/C,CAEA,eAAeC,GAAI,CAClB,GAAM,CAAC,QAAAC,EAAS,QAAAC,CAAO,EAAIC,EAAK,EAC1BC,EAAcR,EAAI,IAAIG,IAAK,CAChCG,EAAQH,CAAC,EACTK,EAAW,CACZ,CAAC,EACD,OAAOH,CACR,CAEA,SAASI,GAAK,CACbV,EAAI,MAAK,CACV,CAEA,OAAAC,EAAI,IAAME,EACVF,EAAI,IAAMA,EACVA,EAAI,GAAKA,EACTA,EAAI,KAAOI,EACXJ,EAAI,MAAQS,EAEZP,EAAI,IAAMA,EACVA,EAAI,IAAMF,EACVE,EAAI,GAAKF,EACTE,EAAI,KAAOE,EACXF,EAAI,MAAQO,EAEL,CAACP,EAAKF,CAAG,CACjB,CAWM,SAAUU,GAA0BC,EAAsB,CAC/D,IAAMC,EAAKC,GAAG,EAAM,CAAC,EACrB,OAAIF,GACHC,EAAG,IAAID,CAAQ,EACTC,CACR,CCxFM,IAAOE,GAAP,KAAY,CACjBC,GAAuB,CAAA,EAGvB,OAAOC,EAAmB,CACzB,YAAKD,GAAK,KAAK,GAAGC,CAAG,EACd,IACR,CAGA,WAA4CC,EAAI,CAC/C,OAAO,KAAK,IAAIA,EAAG,IAAMA,EAAE,QAAO,CAAE,CACrC,CAGA,IAAOA,EAAMC,EAAkB,CAC9B,YAAK,IAAI,IAAMA,EAAGD,CAAC,CAAC,EACbA,CACR,CAGA,SAAO,CACN,QAAWC,KAAM,KAAKH,GAAK,QAAO,EACjCG,EAAE,EACH,KAAKH,GAAO,CAAA,CACb,GCxBK,IAAOI,GAAP,cAAgCC,EAAW,CAChD,aAAA,CACC,MAAM,CACL,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,kBACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,CACF,GCpFK,IAAOC,GAAP,cAAyBC,EAAM,CACpC,OAAO,OAAK,CACX,OAAO,IAAI,KAAI,EAAG,UAAUA,GAAO,QAAQ,KAAI,CAAE,CAClD,CAEA,QAA0B,MAAM,CAAC,QAAAC,EAAS,MAAAC,CAAK,IAAK,CACnD,IAAMC,EAAI,KAAK,OAAO,KACtB,KAAK,IACJ,GAAG,CAACD,CAAK,EAAE,OAAO,OAAO,EACzBC,EAAE,GAAGF,EAAQ,MAAM,IAAI,CAAC,CAE1B,EAEA,SAA4B,MAAM,CAAC,QAAAA,EAAS,MAAAG,EAAO,MAAAF,CAAK,IAAK,CAC5D,KAAK,MACJ,GAAG,CAACA,CAAK,EAAE,OAAO,OAAO,EACzB,GAAGD,EAAQ,MAAM,KACjBG,CAAK,CAEP,EAEAC,GAAU,IAAIC,GAEdC,GAAaC,EAAc,CAC1B,MAAO,CACN,KAAK,OAAO,OAAO,IAAIA,EAAK,EAAE,GAAG,EACjC,KAAK,OAAO,MAAMA,EAAK,QAAQ,OAAQA,EAAK,QAAQ,OAAQ,aAAa,GACxE,KAAK,GAAG,CACX,CAEA,KAAKA,EAAc,CAClB,IAAMN,EAAQ,KAAKK,GAAaC,CAAI,EACpC,MAAO,CACN,MAAO,KAAK,MAAM,KAAK,IAAI,EAC3B,QAASC,GAAK,KAAK,QAAQ,CAAC,GAAGA,EAAG,MAAAP,CAAK,CAAC,EACxC,SAAUO,GAAK,KAAK,SAAS,CAAC,GAAGA,EAAG,MAAAP,CAAK,CAAC,EAE5C,CAEA,UAAUM,EAAc,CACvB,IAAME,EAAO,KAAKH,GAAaC,CAAI,EAC7BG,EAAQ,KAAKN,GAAQ,KAAI,EACzBF,EAAI,KAAK,OAAO,OAChBS,EAAQC,GAA0B,CACvC,IAAMX,EAAQQ,EAAO,KACpBG,EACGF,EAAQR,EAAE,KAAK,EACfQ,EAAQR,EAAE,KAAK,GAEnB,MAAO,CACN,MAAO,KAAK,MAAM,KAAK,IAAI,EAC3B,QAASM,GAAK,KAAK,QAAQ,CAAC,GAAGA,EAAG,MAAAP,CAAK,CAAC,EACxC,SAAUO,GAAK,KAAK,SAAS,CAAC,GAAGA,EAAG,MAAAP,CAAK,CAAC,EAE5C,EACA,MAAO,CACN,OAAQU,EAAK,EAAI,EACjB,MAAOA,EAAK,EAAK,EAEnB,GC5DK,IAAOE,GAAP,cAAwBC,EAAS,CACtC,QAA0B,SAAU,CAAE,GCFhC,IAAMC,GAAa,IAAIC,GCcxB,SAAUC,GAAwB,CAAC,IAAAC,EAAK,IAAAC,EAAMC,EAAU,EAAqB,CAClF,MAAO,OAAMC,GAAU,CACtB,IAAMC,EAAOD,EAAQ,OAAO,MAAM,GAAG,EAC/BE,EAAKC,GAAMN,EAAKI,CAAI,EACpBG,EAAS,SAAW,MAAMF,EAAG,GAAGF,EAAQ,MAAM,EAEpD,OAAAF,EAAI,QAAQ,CAAC,QAAAE,CAAO,CAAC,EAEJ,MAAMK,GAAQ,CAC9B,IAAAP,EACA,QAAAE,EACA,OAAAI,EACA,CAGF,CACD,CC9BO,IAAME,GAAO,OAAO,MAAM,EACpBC,GAAQ,OAAO,OAAO,EACtBC,GAAS,OAAO,QAAQ,EACxBC,GAAW,OAAO,UAAU,EA+BnC,SAAUC,GAA2BC,EAAkB,CAE5D,SAASC,EAAQC,EAAc,CAC9B,IAAMC,EAA4B,CAAC,OAAQ,MAAS,EAEpD,OAAO,IAAI,MAAO,IAAK,CAAE,EAAW,CACnC,MAAO,CAACC,EAAGC,EAAOC,IACVN,EAASE,EAAMI,EAAMH,CAAe,EAE5C,IAAK,CAACI,EAAQC,IAA0E,CAEvF,GAAIA,IAAQ,OAGZ,OAAIA,IAAQb,GACHG,GAAuB,IAAIQ,IAAgBN,EAASE,EAAMI,EAAM,CACvE,GAAGH,EACH,GAAGL,EACH,EAEEU,IAAQX,GACJ,IAAIS,IAAgBN,EAASE,EAAMI,EAAM,CAC/C,GAAGH,EACH,OAAQ,GACR,EAEEK,IAAQZ,GACJ,IAAIU,IAAgBN,EAASE,EAAMI,EAAM,CAC/C,GAAGH,EACH,OAAQ,GACR,EAEEK,IAAQV,GACJK,GAEHI,EAAOC,CAAG,IACdD,EAAOC,CAAG,EAAIP,EAAQ,CAAC,GAAGC,EAAMM,CAAG,CAAC,GAE9BD,EAAOC,CAAG,EAClB,EACA,IAAK,CAACD,EAAQC,EAAaC,KAC1BF,EAAOC,CAAG,EAAIC,EACP,IAER,CACF,CAEA,OAAOR,EAAQ,CAAA,CAAE,CAClB,CCjEM,SAAUS,GAAsBC,EAAsB,CAC3D,GAAM,CAAC,SAAAC,EAAU,IAAAC,EAAMC,EAAU,EAAIH,EACjCI,EAAK,EAET,OAAOC,GAAe,MACpBC,EACAC,EACAC,IACG,CAEJ,IAAMC,EAASD,EAAS,QAAUR,EAAQ,QAAU,GAC9CU,EAAWF,EAAS,SAEpBG,EAAoC,CACzC,QAAS,MACT,OAAQL,EAAK,KAAK,GAAG,EACrB,OAAAC,GAGKK,EACLH,EACGE,EACA,CAAC,GAAGA,EAAM,GAAIP,GAAI,EAGtBF,EAAI,QAAQ,CAAC,QAAAU,CAAO,CAAC,EAErB,IAAMC,EAAW,MAAMZ,EAASW,EAAS,CAAC,SAAAF,CAAQ,CAAC,EAEnD,GAAID,GAAU,CAACI,EACd,OAAO,KAER,GAAI,CAACA,EACJ,MAAM,IAAIC,GAAY,iFAAiF,EAExG,GAAI,UAAWD,EACd,MAAM,IAAIC,GACTd,EAAQ,MACL,GAAGA,EAAQ,KAAK,KAAKa,EAAS,MAAM,OAAO,GAC3CA,EAAS,MAAM,OAAO,EAG3B,OAAOA,EAAS,MACjB,CAAC,CACF,CCrDM,SAAUE,GAAoBC,EAA2B,CAC9D,OAAOC,GAAU,CAAC,SAAUC,GAASF,CAAO,EAAG,IAAKA,EAAQ,GAAG,CAAC,CACjE,CCTM,IAAOG,GAAP,KAAc,CACnB,KAAOC,GAAG,EACV,YAAcA,GAAG,EACjB,aAAeA,GAAG,EAElB,OAAO,kBAAkB,CAAC,OAAAC,EAAS,kBAAkB,EAAuB,CAAA,EAAE,CAC7E,IAAMC,EAAI,IAAI,KACRC,EAAI,IAAI,KAERC,EAAY,CACjBF,EAAE,YAAY,IAAIG,GAAQF,EAAE,KAAKE,EAAM,CAAC,OAAAJ,CAAM,CAAC,CAAC,EAChDC,EAAE,aAAa,IAAIG,GAAQF,EAAE,KAAKE,EAAM,CAAC,OAAAJ,CAAM,CAAC,CAAC,EACjDE,EAAE,YAAY,IAAIE,GAAQH,EAAE,KAAKG,EAAM,CAAC,OAAAJ,CAAM,CAAC,CAAC,EAChDE,EAAE,aAAa,IAAIE,GAAQH,EAAE,KAAKG,EAAM,CAAC,OAAAJ,CAAM,CAAC,CAAC,GAIlD,MAAO,CAACC,EAAGC,EADK,IAAMC,EAAU,QAAQE,GAAMA,EAAE,CAAE,CAC7B,CACtB,GCfK,IAAOC,EAAP,KAAU,CACf,SAAuC,QAGlC,SAAUC,GAAUC,EAAkBC,EAA+B,CAC1E,OAAAD,EAAQ,iBAAiB,UAAWC,CAAE,EAC/B,IAAMD,EAAQ,oBAAoB,UAAWC,CAAE,CACvD,CAUM,SAAUC,GAAmBC,EAAwBC,EAA0B,CACpF,MAAO,OAAMC,EAAS,CAAC,SAAAC,CAAQ,EAAI,CAAA,IAAM,CACxC,GAAI,OAAQD,EAAS,CACpB,IAAME,EAAOC,EAAK,EAClB,OAAAJ,EAAYC,EAASC,EAAUC,EAAK,OAAO,EACpCJ,EAAO,KAAKE,EAAQ,GAAIA,EAAQ,MAAM,EAAE,KAAKI,IACnDF,EAAK,QAAQE,CAAQ,EACdA,EACP,CACF,KACK,CACJ,IAAMF,EAAO,QAAQ,QAAQ,IAAI,EACjC,OAAAH,EAAYC,EAASC,EAAUC,CAAI,EAC5BA,CACR,CACD,CACD,CAEM,SAAUG,GAAkBC,EAA2B,CAC5D,IAAMC,EAA8B,CAAA,EAC9BC,EAAgC,CAAA,EAEtC,QAAWC,KAAS,MAAM,QAAQH,CAAI,EAAIA,EAAO,CAACA,CAAI,EACjD,WAAYG,EAAMF,EAAS,KAAKE,CAAI,EACnCD,EAAU,KAAKC,CAAI,EAGzB,MAAO,CAAC,SAAAF,EAAU,UAAAC,CAAS,CAC5B,CAEA,eAAsBE,GACpBC,EACAJ,EAA2B,CAG5B,IAAMC,GACL,MAAM,QAAQ,IACbD,EAAS,IAAI,MAAMP,GAAWW,EAAcX,CAAO,CAAC,CAAC,GAErD,OAAO,GAAK,IAAM,IAAI,EAExB,OAAIQ,EAAU,SAAW,EACjB,KAEAA,EAAU,SAAW,EAC1BA,EAAU,CAAC,EACXA,CACJ,CCjEM,IAAOI,GAAP,cAA+BC,EAAO,CAC3CC,GAAS,IAAIC,GAEb,YAAYC,EAAwB,CACnC,MAAK,EACL,KAAKF,GAAO,IACX,KAAK,YAAY,IAAI,CAACG,EAAGC,IAAaF,EAAQ,YAAYC,EAAGC,CAAQ,CAAC,EACtE,KAAK,aAAa,IAAI,CAACD,EAAGC,IAAaF,EAAQ,YAAYC,EAAGC,CAAQ,CAAC,EACvEC,GAAUH,EAASI,GAAK,KAAK,KAAKA,EAAE,KAAMA,CAAC,CAAC,CAAC,CAE/C,CAEA,SAAO,CACN,KAAKN,GAAO,QAAO,CACpB,GCnBM,IAAMO,GAAW,OAAO,OAAO,CACrC,QAAS,IACT,gBAAiB,IACjB,ECOK,IAAOC,GAAP,KAAqB,CAGP,QAFnB,QAAU,IAAI,IAEd,YAAmBC,EAAe,CAAf,KAAA,QAAAA,CAAkB,CAErC,MAAM,KAAKC,EAAgBC,EAAc,CACxC,IAAMC,EAAWC,EAAK,EACtB,YAAK,QAAQ,IAAIH,EAAI,CAAC,OAAAC,EAAQ,SAAAC,CAAQ,CAAC,EAChC,MAAME,GAAS,KAAK,QAAS,YAAYJ,CAAE,IAAIC,CAAM,KAAM,IAAMC,EAAS,OAAO,CACzF,CAEA,gBAAgBG,EAA0B,CACzC,IAAMC,EAAO,KAAK,QAAQ,IAAID,EAAS,EAAE,EACrCC,IACC,UAAWD,EACdC,EAAK,SAAS,OAAO,IAAIC,GAAYF,EAAS,MAAM,OAAO,CAAC,EAE5DC,EAAK,SAAS,QAAQD,CAAQ,EAEjC,GCdK,IAAOG,GAAP,KAAgB,CAKF,QAJnB,OACA,eACA,OAEA,YAAmBC,EAAqC,CAArC,KAAA,QAAAA,EAClB,GAAM,CAAC,QAAAC,CAAO,EAAID,EAElB,KAAK,OAAS,IAAIE,GAAeF,EAAQ,SAAWG,GAAS,OAAO,EAEpE,KAAK,eAAiBC,GACrB,KAAK,OACLH,EAAQ,YAAY,IAAI,KAAKA,EAAQ,WAAW,CAAC,EAGlD,KAAK,OAASI,GAAmB,CAChC,SAAU,KAAK,eACf,IAAKL,EAAQ,IACb,EAEDC,EAAQ,KAAK,IAAIK,GAAK,KAAK,KAAKA,CAAC,CAAC,CACnC,CAEA,MAAM,KAAKC,EAA+B,CACzC,IAAMC,EAAM,IAAIC,EACV,CAAC,QAAAR,EAAS,iBAAAS,CAAgB,EAAI,KAAK,QAEnC,CAAC,SAAAC,EAAU,UAAAC,CAAS,EAAIC,GAAkBN,CAAQ,EAExD,QAAWO,KAAYF,EACtB,KAAK,OAAO,gBAAgBE,CAAQ,EAErC,GAAI,CAACJ,EACJ,OAED,IAAMK,EAAW,MAAMC,GAAuBN,EAAiB,KAAK,OAAQF,CAAG,EAAGG,CAAQ,EACtFI,GACH,MAAMd,EAAQ,aAAac,EAAUP,EAAI,QAAQ,CACnD,GCnDK,IAAOS,GAAP,KAAgB,CACrB,KACA,YAAYC,EAAc,CACzB,KAAK,KAAOA,CACb,GAGYC,GAAP,KAAgB,CACrB,KACA,YAAYC,EAAc,CACzB,KAAK,KAAOA,CACb,GCXM,IAAMC,EAAa,IAAIC,GCQ9B,eAAsBC,GACpBC,EACAC,EACAC,EAAsB,CAAA,EAAE,CAGzB,IAAMC,EAAMD,EAAQ,KAAOE,EAErBC,EAAY,IAAIC,GAA0B,CAC/C,IAAAH,EACA,QAASD,EAAQ,SAAW,IAC5B,QAAS,IAAIK,GAAgBP,EAAO,QAAO,CAAE,EAC7C,iBAAkB,CAACQ,EAAQC,IAAQC,GAAS,CAC3C,IAAAP,EACA,IAAKF,EACJ,IAAIU,GAAUH,EAAO,IAAI,EACzBC,CAAG,EAEJ,EACD,EAED,aAAMJ,EAAU,OAAO,KAAK,MAAK,EAC1BA,EAAU,OAAO,IACzB,CCzBM,IAAOO,GAAP,KAAa,CAEV,OACA,UAFR,YACQC,EACAC,EAA+B,CAD/B,KAAA,OAAAD,EACA,KAAA,UAAAC,CACL,CAEH,aAAa,KAA0BC,EAAgBC,EAAyB,CAC/E,IAAMC,EAAMD,EAAQ,KAAOE,EACrBL,EAASE,EAAO,WAAWC,EAAQ,UAAWA,EAAQ,KAAK,EAC3DG,EAAYC,EAAK,EAEjBC,EAAa,CAClB,MAAM,OAAK,CACVF,EAAU,QAAO,CAClB,GAGKL,EAAY,IAAIQ,GAAqB,CAC1C,IAAAL,EACA,QAASD,EAAQ,SAAW,IAC5B,QAAS,IAAIO,GAAgBV,CAAM,EACnC,iBAAkB,CAACW,EAAQC,IAAQC,GAAS,CAC3C,IAAAT,EACA,IAAK,CACJ,KAAAI,EACA,KAAML,EAAQ,UAAU,IAAIW,GAAUH,CAAM,EAAGC,CAAG,GAEnD,EACD,EAED,aAAMN,EAAU,QACT,IAAI,KAAQN,EAAQC,CAAS,CACrC,CAEA,IAAI,MAAI,CACP,OAAO,KAAK,UAAU,MACvB,CAEA,WAAS,CACR,KAAK,OAAO,UAAS,CACtB,GCnCK,IAAOc,GAAP,KAAc,CAiBC,QAfpB,aAAa,KAA0BC,EAAgBC,EAA0B,CAChF,IAAMC,EAAcD,EAAQ,aAAeD,EAAO,wBAAuB,EACnEG,EAAU,MAAM,QAAQ,IAAI,CAAC,GAAG,MAAMD,CAAW,CAAC,EAAE,IACzD,MAAME,EAAGC,IAAUC,GAAO,KAAKN,EAAQ,CACtC,GAAGC,EACH,MAAOA,EAAQ,OAAS,GAAGA,EAAQ,OAAS,SAAS,IAAII,EAAQ,CAAC,GAClE,CAAC,CACF,EACD,OAAO,IAAI,KAAQF,EAAS,CAAC,IAAKF,EAAQ,GAAG,CAAC,CAC/C,CAEA,KACAM,GAAa,IAAI,IACjBC,GAAiB,CAAA,EAEjB,YAAoBL,EAAsBF,EAAuB,CAAA,EAAE,CAA/C,KAAA,QAAAE,EACnB,IAAMM,EAAMR,EAAQ,KAAOS,EAGrBC,EAA2B,MAAMC,EAASC,IAAY,KAAKC,GAAc,CAC9E,QAAAF,EACA,KAAMG,EAAK,EACX,SAAUF,GAAS,SACnB,EAGD,KAAK,KAAOG,GAAO,CAClB,IAAAP,EACA,SAAUE,EACV,EAGDR,EAAQ,QAAQc,GAAK,KAAKV,GAAW,IAAIU,CAAC,CAAC,CAC5C,CAEA,IAAI,aAAW,CACd,OAAO,KAAK,QAAQ,MACrB,CAEA,WAAS,CACR,QAAWC,KAAU,KAAK,QACzBA,EAAO,UAAS,CAClB,CAEAJ,GAAcK,EAAU,CACvB,YAAKX,GAAO,KAAKW,CAAI,EACrB,KAAKC,GAAgB,EACdD,EAAK,KAAK,OAClB,CAEAC,IAAgB,CACf,KAAO,KAAKb,GAAW,KAAO,GAAK,KAAKC,GAAO,OAAS,GAAG,CAC1D,IAAMU,EAAS,CAAC,GAAG,KAAKX,EAAU,EAAE,IAAG,EACvC,KAAKA,GAAW,OAAOW,CAAM,EAE7B,IAAMC,EAAO,KAAKX,GAAO,MAAK,EAG9B,KAAKD,GAAW,OAAOW,CAAM,EAG7B,IAAMG,EAAWH,EAAO,UAAU,eAAeC,EAAK,QAAS,CAAC,SAAUA,EAAK,QAAQ,CAAC,EAGxFA,EAAK,KAAK,SAASE,CAAQ,EAAE,QAAQ,IAAK,CAGzC,KAAKd,GAAW,IAAIW,CAAM,EAG1B,KAAKE,GAAgB,CACtB,CAAC,CACF,CACD,GC9EM,IAAME,GAAgBC,IAAoB,CAChD,OAA8BC,GAA8BC,GAAO,KAAKF,EAAQC,CAAO,EACvF,QAA+BA,GAA+BE,GAAQ,KAAKH,EAAQC,CAAO,EAC1F,OAAQ,CACPG,EACAH,EAAsB,CAAA,IAClBI,GAAOL,EAAQI,EAAWH,CAAO,EAEtC,KAA4BK,GAAqBA,EACjD,KAA4BA,GAAqBA,EAEjD,MAA2BL,EAIzB,CAED,GAAM,CAAC,UAAAG,EAAW,UAAAG,EAAW,IAAAC,EAAMC,CAAU,EAAIR,EAE3CS,EAAY,IAAIC,GAChBC,EAAY,IAAIC,GAEtB,OAAAD,EAAU,KAAOE,GAAK,CAAC,IAAAN,EAAK,IAAKJ,EAAUM,EAAW,IAAIK,CAAK,CAAC,CAAC,EACjEL,EAAU,KAAOI,GAAK,CAAC,IAAAN,EAAK,IAAKD,EAAUK,EAAW,IAAIG,CAAK,CAAC,CAAC,EAE1D,CACN,UAAAH,EACA,UAAAF,EACA,KAAME,EAAU,KAChB,KAAMF,EAAU,KAElB,EAEA,SAA8BN,EAAyBI,EAAWC,EAAU,CAC3E,IAAMC,EAAY,IAAIC,GAChBC,EAAY,IAAIC,GAEtB,OAAAD,EAAU,KAAOE,GAAK,CAAC,IAAAN,EAAK,IAAKJ,EAAUM,EAAW,IAAIK,CAAK,CAAC,CAAC,EAE1D,CACN,UAAAH,EACA,UAAAF,EACA,KAAME,EAAU,KAChB,SAAWL,IACVG,EAAU,KAAOI,GAAK,CAAC,IAAAN,EAAK,IAAKD,EAAUK,EAAW,IAAIG,CAAK,CAAC,CAAC,EAC1D,CACN,UAAAH,EACA,UAAAF,EACA,KAAME,EAAU,KAChB,KAAMF,EAAU,OAIpB,IC7DM,IAAMM,GAAqB,KAAe,CAChD,SAAO,CACN,OAAO,IACR,EAEA,yBAAuB,CACtB,IAAMC,EAAQ,UAAU,qBAAuB,EAC/C,OAAO,KAAK,IAAI,EAAGA,EAAQ,CAAC,CAC7B,EAEA,WAAWC,EAAKC,EAAI,CACnB,OAAO,IAAI,OAAO,OAAOD,EAAK,CAAC,KAAAC,EAAM,KAAM,QAAQ,CAAC,CACrD,EAEA,MAAM,SAASD,EAAG,CACjB,OAAO,YAAY,qBAAqB,MAAMA,CAAG,CAAC,CACnD,ICfM,IAAME,GAASC,GAAkB,EAC3BC,GAAUC,GAAaH,EAAM,ECEnC,SAASI,EAAOC,EAAG,CACtB,GAAI,CAACA,EACD,MAAM,IAAI,MAAM,mBAAmB,CAE3C,CACO,IAAMC,GAAqBC,GAAa,CAC3C,IAAMC,GAAkBD,EAAW,IAAM,KAAO,IAChD,GAAIC,IAAmB,GAAKA,IAAmB,IAAMA,IAAmB,KAAOA,IAAmB,IAC9F,OAAOA,EAGP,MAAM,IAAI,MAAM,oBAAoBD,CAAQ,GAAG,CAEvD,EACaE,EAAQC,GACVA,GAAOA,EAAIA,EAAI,OAAS,CAAC,EAK7B,IAAMC,EAAN,MAAMC,CAAU,CACnB,YAAYC,EAAO,CACf,KAAK,MAAQA,EAEb,KAAK,IAAM,CACf,CACA,WAAWC,EAAY,CACnB,KAAK,IAAM,EAAIA,CACnB,CACA,SAAU,CACN,IAAMC,EAAY,KAAK,MAAM,KAAK,IAAM,CAAC,EACnCC,EAAO,KAAK,MAAMD,CAAS,GAAK,EAChCE,EAAW,GAAS,KAAK,IAAM,GAC/BC,GAAOF,EAAQ,GAAKC,IAAcA,EACxC,YAAK,MACEC,CACX,CACA,SAASC,EAAG,CACR,IAAIC,EAAS,EACb,QAASC,EAAI,EAAGA,EAAIF,EAAGE,IACnBD,IAAW,EACXA,GAAU,KAAK,QAAQ,EAE3B,OAAOA,CACX,CACA,iBAAkB,CAEd,GAAI,KAAK,IAAM,IAAM,EACjB,MAAM,IAAI,MAAM,gCAAgC,EAEpD,IAAML,EAAY,KAAK,IAAM,EACvBC,EAAO,KAAK,MAAMD,CAAS,GAAK,EACtC,YAAK,KAAO,EACLC,CACX,CACA,SAASG,EAAG,CACR,KAAK,KAAOA,CAChB,CACA,aAAc,CACV,OAAO,KAAK,MAAM,OAAS,EAAI,KAAK,GACxC,CACA,OAAQ,CACJ,IAAMG,EAAQ,IAAIV,EAAU,KAAK,KAAK,EACtC,OAAAU,EAAM,IAAM,KAAK,IACVA,CACX,CACJ,EAEaC,EAAiBC,GAAc,CACxC,IAAIC,EAAkB,EACtB,KAAOD,EAAU,QAAQ,IAAM,GAAKC,EAAkB,IAClDA,IAEJ,GAAIA,GAAmB,GACnB,MAAM,IAAI,MAAM,kCAAkC,EAGtD,OADgB,GAAKA,GAAmB,EAAID,EAAU,SAASC,CAAe,CAElF,EAEaC,GAAuBF,GAAc,CAC9C,IAAMG,EAAUJ,EAAcC,CAAS,EACvC,OAASG,EAAU,KAAO,EACpB,EAAEA,GAAW,GACXA,EAAU,GAAM,CAC5B,EAWO,IAAMC,GAAgBC,GACrBA,aAAkB,WACXA,EAEFA,aAAkB,YAChB,IAAI,WAAWA,CAAM,EAGrB,IAAI,WAAWA,EAAO,OAAQA,EAAO,WAAYA,EAAO,UAAU,EAGpEC,EAAcD,GACnBA,aAAkB,SACXA,EAEFA,aAAkB,YAChB,IAAI,SAASA,CAAM,EAGnB,IAAI,SAASA,EAAO,OAAQA,EAAO,WAAYA,EAAO,UAAU,EAGlEE,GAAc,IAAI,YACzBC,GAAgBC,GACX,OAAO,YAAY,OAAO,QAAQA,CAAM,EAAE,IAAI,CAAC,CAACC,EAAKC,CAAK,IAAM,CAACA,EAAOD,CAAG,CAAC,CAAC,EAG3EE,GAAsB,CAC/B,MAAO,EACP,QAAS,EACT,UAAW,EACX,OAAQ,EACR,SAAU,EACd,EACaC,GAA8BL,GAAaI,EAAmB,EAC9DE,GAA+B,CACxC,MAAS,EACT,UAAa,EACb,OAAU,EACV,eAAgB,GAChB,GAAM,GACN,IAAO,EACX,EACaC,GAAuCP,GAAaM,EAA4B,EAChFE,GAA0B,CACnC,IAAO,EACP,MAAS,EACT,QAAW,EACX,UAAa,EACb,aAAc,CAClB,EACaC,GAAkCT,GAAaQ,EAAuB,EAQ5E,IAAME,GAA6BC,GAC9BA,aAAa,aACb,OAAO,kBAAsB,KAAeA,aAAa,mBAC1D,YAAY,OAAOA,CAAC,EAElBC,GAAN,KAAiB,CACpB,aAAc,CACV,KAAK,eAAiB,QAAQ,QAAQ,CAC1C,CACA,MAAM,SAAU,CACZ,IAAIC,EACEC,EAAc,IAAI,QAASC,GAAY,CACzCF,EAAWE,CACf,CAAC,EACKC,EAAsB,KAAK,eACjC,YAAK,eAAiBF,EACtB,MAAME,EACCH,CACX,CACJ,EACaI,GAAoBC,GACtB,CAAC,GAAGA,CAAK,EAAE,IAAIP,GAAKA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,EAE1DQ,GAAkBR,IAC3BA,EAAMA,GAAK,EAAK,YAAgBA,EAAI,aAAe,EACnDA,EAAMA,GAAK,EAAK,WAAgBA,EAAI,YAAe,EACnDA,EAAMA,GAAK,EAAK,WAAgBA,EAAI,YAAe,EACnDA,EAAMA,GAAK,EAAK,UAAgBA,EAAI,WAAe,EACnDA,EAAMA,GAAK,GAAM,OAAgBA,EAAI,QAAe,GAC7CA,IAAM,GAGJS,EAAoB,CAACC,EAAKC,EAAKC,IAAgB,CACxD,IAAIC,EAAM,EACNC,EAAOJ,EAAI,OAAS,EACpBK,EAAM,GACV,KAAOF,GAAOC,GAAM,CAChB,IAAME,EAAOH,EAAMC,GAAS,EACtBG,EAASL,EAAYF,EAAIM,CAAG,CAAC,EAC/BC,IAAWN,GACXI,EAAMC,EACNF,EAAOE,EAAM,GAERC,EAASN,EACdE,EAAMG,EAAM,EAGZF,EAAOE,EAAM,CAErB,CACA,OAAOD,CACX,EAEaG,EAA0B,CAACR,EAAKC,EAAKC,IAAgB,CAC9D,IAAIC,EAAM,EACNC,EAAOJ,EAAI,OAAS,EACpBK,EAAM,GACV,KAAOF,GAAOC,GAAM,CAChB,IAAME,EAAOH,GAAOC,EAAOD,EAAM,GAAK,EAAK,EAC5BD,EAAYF,EAAIM,CAAG,CAAC,GACrBL,GACVI,EAAMC,EACNH,EAAMG,EAAM,GAGZF,EAAOE,EAAM,CAErB,CACA,OAAOD,CACX,EACaI,EAAuB,IAAM,CACtC,IAAIf,EACAgB,EAKJ,MAAO,CAAE,QAJO,IAAI,QAAQ,CAACC,EAAKC,IAAQ,CACtClB,EAAUiB,EACVD,EAASE,CACb,CAAC,EACiB,QAASlB,EAAS,OAAQgB,CAAO,CACvD,EACaG,GAAa,CAACb,EAAKc,IAAS,CACrC,IAAMC,EAAQf,EAAI,QAAQc,CAAI,EAC1BC,IAAU,IACVf,EAAI,OAAOe,EAAO,CAAC,CAE3B,EACaC,GAAW,CAAChB,EAAKiB,IAAc,CACxC,QAASC,EAAIlB,EAAI,OAAS,EAAGkB,GAAK,EAAGA,IACjC,GAAID,EAAUjB,EAAIkB,CAAC,CAAC,EAChB,OAAOlB,EAAIkB,CAAC,CAIxB,EACaC,GAAgB,CAACnB,EAAKiB,IAAc,CAC7C,QAASC,EAAIlB,EAAI,OAAS,EAAGkB,GAAK,EAAGA,IACjC,GAAID,EAAUjB,EAAIkB,CAAC,CAAC,EAChB,OAAOA,EAGf,MAAO,EACX,EACaE,GAAkB,gBAAiBC,EAAQ,CAChD,OAAO,YAAYA,EAEnB,MAAOA,EAAO,OAAO,QAAQ,EAAE,EAI/B,MAAOA,EAAO,OAAO,aAAa,EAAE,CAE5C,EACaC,GAAuBC,GAAa,CAC7C,GAAI,EAAE,OAAO,YAAYA,IAAa,EAAE,OAAO,iBAAiBA,GAC5D,MAAM,IAAI,UAAU,iDAAiD,CAE7E,EA2DO,IAAMC,GAAoB,CAACC,EAAWC,KAClC,CACH,MAAM,MAAO,CACT,IAAMC,EAAS,MAAMF,EAAU,KAAK,EACpC,OAAIE,EAAO,KACA,CAAE,MAAO,OAAW,KAAM,EAAK,EAG/B,CAAE,MAAOD,EAAIC,EAAO,KAAK,EAAG,KAAM,EAAM,CAEvD,EACA,QAAS,CACL,OAAOF,EAAU,OAAO,CAC5B,EACA,MAAMG,EAAO,CACT,OAAOH,EAAU,MAAMG,CAAK,CAChC,EACA,CAAC,OAAO,aAAa,GAAI,CACrB,OAAO,IACX,CACJ,GAKG,IAAMC,EAAwB,MACxBC,GAAmB,CAACC,EAAOC,IAAW,CAC/C,IAAMC,EAAS,IAAMD,EACrB,OAAO,KAAK,MAAMD,EAAQE,CAAM,EAAIA,CACxC,EACaC,GAAkB,CAACH,EAAOI,IAC5B,KAAK,MAAMJ,EAAQI,CAAQ,EAAIA,EAE7BC,GAAQC,GAAM,CACvB,IAAIC,EAAM,EACV,KAAOD,GACHC,IACAD,IAAM,EAEV,OAAOC,CACX,EACMC,GAAkB,aACXC,GAA6BH,GAC/BE,GAAgB,KAAKF,CAAC,EAGpBI,GAA+B,KAAO,EAAI,OAAO,SACjDC,GAAqB,CAACC,EAAGC,IAAM,CACxC,IAAMC,EAAS,CAAE,GAAGF,CAAE,EACtB,QAAWG,KAAOF,EACV,OAAOD,EAAEG,CAAG,GAAM,UACfH,EAAEG,CAAG,IAAM,MACX,OAAOF,EAAEE,CAAG,GAAM,UAClBF,EAAEE,CAAG,IAAM,KACdD,EAAOC,CAAG,EAAIJ,GAAmBC,EAAEG,CAAG,EAAGF,EAAEE,CAAG,CAAC,EAG/CD,EAAOC,CAAG,EAAIF,EAAEE,CAAG,EAG3B,OAAOD,CACX,EACaE,GAAe,MAAOC,EAAKC,EAAaC,IAAkB,CACnE,IAAIC,EAAW,EACf,OACI,GAAI,CACA,OAAO,MAAM,MAAMH,EAAKC,CAAW,CACvC,OACOG,EAAO,CACV,QAAQ,MAAM,gCAAiCA,CAAK,EACpDD,IACA,IAAME,EAAsBH,EAAcC,CAAQ,EAClD,GAAIE,IAAwB,KACxB,MAAMD,EAEV,GAAI,CAAC,OAAO,SAASC,CAAmB,GAAKA,EAAsB,EAC/D,MAAM,IAAI,UAAU,mDAAmD,EAEvEA,EAAsB,GACtB,MAAM,IAAI,QAAQC,GAAW,WAAWA,EAAS,IAAOD,CAAmB,CAAC,CAEpF,CAER,EAmCO,IAAME,GAAN,KAAqB,CACxB,aAAc,CACV,KAAK,eAAiB,QAAQ,QAAQ,CAC1C,CACA,KAAKC,EAAI,CACL,OAAO,KAAK,eAAiB,KAAK,eAAe,KAAKA,CAAE,CAC5D,CACJ,ECtZO,IAAMC,GAAsB,CAAC,EACvBC,GAAsB,CAAC,EChC7B,IAAMC,GAAmB,CAC5B,UACA,YACA,UACA,YACA,UACA,YACA,UACA,YACA,UACA,YACA,SACA,SACA,OACA,MACJ,EAKaC,GAAuB,CAChC,MACA,OACA,MACA,SACA,MACJ,EAKaC,GAAe,CACxB,GAAGD,GACH,GAAGD,EACP,EAuDO,IAAMG,GAAkB,CAC3B,CAAE,eAAgB,MAAO,WAAY,IAAQ,MAAO,EAAG,EACvD,CAAE,eAAgB,MAAO,WAAY,IAAQ,MAAO,EAAG,EACvD,CAAE,eAAgB,OAAQ,WAAY,KAAS,MAAO,EAAG,EACzD,CAAE,eAAgB,OAAQ,WAAY,KAAS,MAAO,EAAG,EACzD,CAAE,eAAgB,OAAQ,WAAY,KAAS,MAAO,EAAG,EACzD,CAAE,eAAgB,OAAQ,WAAY,KAAU,MAAO,EAAG,EAC1D,CAAE,eAAgB,QAAS,WAAY,KAAU,MAAO,EAAG,EAC3D,CAAE,eAAgB,QAAS,WAAY,IAAU,MAAO,EAAG,EAC3D,CAAE,eAAgB,QAAS,WAAY,IAAU,MAAO,EAAG,EAC3D,CAAE,eAAgB,QAAS,WAAY,KAAW,MAAO,EAAG,EAC5D,CAAE,eAAgB,QAAS,WAAY,KAAW,MAAO,EAAG,EAC5D,CAAE,eAAgB,SAAU,WAAY,KAAW,MAAO,EAAG,EAC7D,CAAE,eAAgB,SAAU,WAAY,KAAW,MAAO,EAAG,EAC7D,CAAE,eAAgB,SAAU,WAAY,KAAW,MAAO,EAAG,CACjE,EA4BA,IAAMC,GAAqB,kBACrBC,GAAqB,oBA0FpB,IAAMC,GAA2BC,GAAc,CAClD,GAAM,CAAE,MAAAC,EAAO,iBAAAC,EAAkB,WAAAC,EAAY,aAAAC,EAAc,cAAAC,EAAe,aAAAC,EAAc,aAAAC,CAAa,EAAIP,EACzG,GAAIC,IAAU,MAAO,CACjB,GAAIG,EAAc,CACd,IAAMI,EAAQ,IAAI,WAAW,CACzBJ,EAAa,qBACbA,EAAa,qBACbA,EAAa,kBACjB,CAAC,EACD,MAAO,QAAQK,GAAiBD,CAAK,CAAC,EAC1C,CACA,GAAI,CAACN,GAAoBA,EAAiB,WAAa,EACnD,MAAM,IAAI,UAAU,0EAA0E,EAElG,MAAO,QAAQO,GAAiBP,EAAiB,SAAS,EAAG,CAAC,CAAC,CAAC,EACpE,SACSD,IAAU,OAAQ,CACvB,IAAIS,EACAC,EACAC,EACAC,EACAC,EACAC,EACJ,GAAIV,EACAK,EAAsBL,EAAc,oBACpCM,EAAoBN,EAAc,kBAClCO,EAAqBI,GAAeX,EAAc,gCAAgC,EAClFQ,EAAkBR,EAAc,gBAChCS,EAAkBT,EAAc,gBAChCU,EAAkB,CAAC,GAAGV,EAAc,+BAA+B,MAElE,CACD,GAAI,CAACH,GAAoBA,EAAiB,WAAa,GACnD,MAAM,IAAI,UAAU,4EAA4E,EAEpG,IAAMe,EAAOC,EAAWhB,CAAgB,EAClCiB,EAAcF,EAAK,SAAS,CAAC,EACnCP,EAAuBS,GAAe,EAAK,EAC3CR,EAAoBQ,EAAc,GAClCP,EAAqBI,GAAeC,EAAK,UAAU,CAAC,CAAC,EACrDJ,EAAmBM,GAAe,EAAK,EACvCL,EAAkBG,EAAK,SAAS,EAAE,EAClCF,EAAkB,CAAC,EACnB,QAASK,EAAI,EAAGA,EAAI,EAAGA,IACnBL,EAAgB,KAAKE,EAAK,SAAS,EAAIG,CAAC,CAAC,CAEjD,CACA,IAAIC,EAAc,QAOlB,IANAA,GAAe,CAAC,GAAI,IAAK,IAAK,GAAG,EAAEX,CAAmB,EAAIC,EAC1DU,GAAe,IACfA,GAAeT,EAAmB,SAAS,EAAE,EAAE,YAAY,EAC3DS,GAAe,IACfA,GAAeR,IAAoB,EAAI,IAAM,IAC7CQ,GAAeP,EACRC,EAAgB,OAAS,GAAKA,EAAgBA,EAAgB,OAAS,CAAC,IAAM,GACjFA,EAAgB,IAAI,EAExB,OAAIA,EAAgB,OAAS,IACzBM,GAAe,IACfA,GAAeN,EAAgB,IAAIO,GAAKA,EAAE,SAAS,EAAE,EAAE,YAAY,CAAC,EAAE,KAAK,GAAG,GAE3ED,CACX,KACK,IAAIpB,IAAU,MACf,MAAO,MAEN,GAAIA,IAAU,MAAO,CACtB,GAAI,CAACK,EAAc,CAEf,IAAMiB,EAAcvB,EAAU,MAAQA,EAAU,OAC5CwB,EAAQC,EAAKC,EAAe,EAAE,MAClC,QAAWC,KAASD,GAChB,GAAIH,GAAeI,EAAM,eAAgB,CACrCH,EAAQG,EAAM,MACd,KACJ,CAGJ,MAAO,WAAWH,EAAM,SAAS,EAAE,SAAS,EAAG,GAAG,CAAC,KACvD,CACA,IAAMI,EAAUtB,EAAa,QAAQ,SAAS,EAAE,SAAS,EAAG,GAAG,EACzDkB,EAAQlB,EAAa,MAAM,SAAS,EAAE,SAAS,EAAG,GAAG,EACrDuB,EAAWvB,EAAa,SAAS,SAAS,EAAE,SAAS,EAAG,GAAG,EAC3DwB,EAAoBxB,EAAa,kBAAkB,SAAS,EAAE,SAAS,EAAG,GAAG,EAC7EyB,EAAkBzB,EAAa,gBAAgB,SAAS,EAAE,SAAS,EAAG,GAAG,EACzE0B,EAA0B1B,EAAa,wBAAwB,SAAS,EAAE,SAAS,EAAG,GAAG,EACzF2B,EAAqB3B,EAAa,mBAAmB,SAAS,EAAE,SAAS,EAAG,GAAG,EAC/E4B,EAAqB5B,EAAa,mBAAmB,SAAS,EAAE,SAAS,EAAG,GAAG,EACjF6B,EAAS,QAAQP,CAAO,IAAIJ,CAAK,IAAIK,CAAQ,IAAIC,CAAiB,GACtE,OAAAK,GAAU,IAAIJ,CAAe,IAAIC,CAAuB,IAAIC,CAAkB,IAAIC,CAAkB,GAChGC,EAAO,SAASC,EAAkB,IAClCD,EAASA,EAAO,MAAM,EAAG,CAACC,GAAmB,MAAM,GAEhDD,CACX,SACSlC,IAAU,MAAO,CACtB,GAAI,CAACM,EAAc,CAEf,IAAMgB,EAAcvB,EAAU,MAAQA,EAAU,OAC5CwB,EAAQC,EAAKC,EAAe,EAAE,MAClC,QAAWC,KAASD,GAChB,GAAIH,GAAeI,EAAM,eAAgB,CACrCH,EAAQG,EAAM,MACd,KACJ,CAGJ,MAAO,UAAUH,EAAM,SAAS,EAAE,SAAS,EAAG,GAAG,CAAC,MACtD,CAEA,IAAMI,EAAUrB,EAAa,QACvBiB,EAAQjB,EAAa,MAAM,SAAS,EAAE,SAAS,EAAG,GAAG,EACrD8B,EAAO9B,EAAa,KAAO,IAAM,IACjCsB,EAAWtB,EAAa,SAAS,SAAS,EAAE,SAAS,EAAG,GAAG,EAC3D+B,EAAa/B,EAAa,WAAa,IAAM,IAC7CuB,EAAoB,IAAMvB,EAAa,mBACvC,GAAKA,EAAa,mBAClB,GAAKA,EAAa,oBAAsBA,EAAa,mBACjDA,EAAa,qBACb,GAEJgC,EAAiBpC,GAAY,UAAYqC,GAAoBrC,EAAW,SAAS,EAAI,EACrF6B,EAA0B7B,GAAY,SAAWsC,GAA6BtC,EAAW,QAAQ,EAAI,EACrG8B,EAAqB9B,GAAY,OAASuC,GAAwBvC,EAAW,MAAM,EAAI,EACvF+B,EAAqB/B,GAAY,UAAY,EAAI,EACnDgC,EAAS,QAAQP,CAAO,IAAIJ,CAAK,GAAGa,CAAI,IAAIR,CAAQ,GACxD,OAAAM,GAAU,IAAIG,CAAU,IAAIR,EAAkB,SAAS,EAAE,SAAS,EAAG,GAAG,CAAC,GACzEK,GAAU,IAAII,EAAe,SAAS,EAAE,SAAS,EAAG,GAAG,CAAC,GACxDJ,GAAU,IAAIH,EAAwB,SAAS,EAAE,SAAS,EAAG,GAAG,CAAC,GACjEG,GAAU,IAAIF,EAAmB,SAAS,EAAE,SAAS,EAAG,GAAG,CAAC,GAC5DE,GAAU,IAAID,CAAkB,GAC5BC,EAAO,SAASQ,EAAkB,IAClCR,EAASA,EAAO,MAAM,EAAG,CAACQ,GAAmB,MAAM,GAEhDR,CACX,EACA,MAAM,IAAI,UAAU,oBAAoBlC,CAAK,IAAI,CACrD,EA+BO,IAAM2C,GAA2BC,GAAc,CAClD,GAAM,CAAE,MAAAC,EAAO,iBAAAC,EAAkB,aAAAC,CAAa,EAAIH,EAClD,GAAIC,IAAU,MAAO,CACjB,GAAI,CAACE,EACD,MAAM,IAAI,UAAU,kCAAkC,EAE1D,OAAIA,EAAa,QACN,UAIA,WADqBC,GAA4BF,CAAgB,EAClC,UAAU,EAExD,KACK,IAAID,IAAU,MACf,MAAO,MAEN,GAAIA,IAAU,OACf,MAAO,OAEN,GAAIA,IAAU,SACf,MAAO,SAEN,GAAIA,IAAU,OACf,MAAO,OAEN,GAAIA,GAASI,GAAiB,SAASJ,CAAK,EAC7C,OAAOA,EAEX,MAAM,IAAI,UAAU,oBAAoBA,CAAK,IAAI,CACrD,EACaG,GAA+BE,GAAU,CAClD,GAAI,CAACA,GAASA,EAAM,WAAa,EAC7B,MAAM,IAAI,UAAU,gDAAgD,EAExE,IAAMC,EAAY,IAAIC,EAAUF,CAAK,EACjCG,EAAaF,EAAU,SAAS,CAAC,EACjCE,IAAe,KACfA,EAAa,GAAKF,EAAU,SAAS,CAAC,GAE1C,IAAMG,EAAiBH,EAAU,SAAS,CAAC,EACvCI,EAAa,KACjB,GAAID,IAAmB,GACnBC,EAAaJ,EAAU,SAAS,EAAE,MAEjC,CACD,IAAMK,EAAY,CACd,KAAO,MAAO,KAAO,KAAO,MAAO,KAAO,KAAO,MACjD,KAAO,KAAO,MAAO,IAAM,IAC/B,EACIF,EAAiBE,EAAU,SAC3BD,EAAaC,EAAUF,CAAc,EAE7C,CACA,IAAMG,EAAuBN,EAAU,SAAS,CAAC,EAC7CO,EAAmB,KACvB,OAAID,GAAwB,GAAKA,GAAwB,IAUrDC,EATmB,CACf,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,CACP,EAC8BD,CAAoB,GAE/C,CACH,WAAAJ,EACA,eAAAC,EACA,WAAAC,EACA,qBAAAE,EACA,iBAAAC,CACJ,CACJ,EACaC,GAA4B,KACnCC,GAAkB,2BACXC,GAAiBhB,GAAU,CAEpC,GADAiB,EAAOb,GAAiB,SAASJ,CAAK,CAAC,EACnCA,IAAU,OACV,MAAO,CAAE,SAAU,OAAQ,WAAY,EAAG,aAAc,GAAM,YAAa,GAAI,EAE9E,GAAIA,IAAU,OACf,MAAO,CAAE,SAAU,OAAQ,WAAY,EAAG,aAAc,GAAM,YAAa,GAAI,EAEnF,IAAMkB,EAAQH,GAAgB,KAAKf,CAAK,EACxCiB,EAAOC,CAAK,EACZ,IAAIC,EACAD,EAAM,CAAC,IAAM,IACbC,EAAW,WAEND,EAAM,CAAC,IAAM,IAClBC,EAAW,SAGXA,EAAW,QAEf,IAAMC,EAAc,OAAOF,EAAM,CAAC,CAAC,EAAI,EACjCG,EAAeH,EAAM,CAAC,IAAM,KAC5BI,EAActB,IAAU,SAAW,GAAK,EAAI,EAClD,MAAO,CAAE,SAAAmB,EAAU,WAAAC,EAAY,aAAAC,EAAc,YAAAC,CAAY,CAC7D,EA0FO,IAAMC,GAAN,KAAc,CAEjB,YAAYC,EAAQ,CAChB,KAAK,QAAUA,CACnB,CAEA,gBAAgBC,EAAOC,EAAOC,EAAQ,CAClC,IAAMC,EAASF,EAAQC,EACjBE,EAAyB,CAC3B,IAAK,EACL,KAAM,GACN,IAAK,GACL,IAAK,GACL,IAAK,GACT,EACMC,EAAkB,KAAO,KACzBC,EAAmB,IACnBC,EAAc,KAAK,IAAIJ,EAASE,EAAiB,GAAI,EAGrDG,EAFcF,EAAmBC,EACIH,EAAuBJ,CAAK,EAC3B,KAAK,QACjD,OAAO,KAAK,KAAKQ,EAAe,GAAI,EAAI,GAC5C,CAEA,gBAAgBR,EAAO,CACnB,GAAIS,GAAiB,SAAST,CAAK,GAAKA,IAAU,OAC9C,OAQJ,IAAMU,EANY,CACd,IAAK,MACL,KAAM,KACN,IAAK,KACL,OAAQ,IACZ,EAC8BV,CAAK,EACnC,GAAI,CAACU,EACD,MAAM,IAAI,MAAM,oBAAoBV,CAAK,EAAE,EAE/C,IAAIQ,EAAeE,EAAc,KAAK,QACtC,OAAIV,IAAU,MAGVQ,EADmB,CAAC,KAAO,MAAQ,KAAQ,KAAM,EACvB,OAAO,CAACG,EAAMC,IAAS,KAAK,IAAIA,EAAOJ,CAAY,EAAI,KAAK,IAAIG,EAAOH,CAAY,EAAII,EAAOD,CAAI,EAEvHX,IAAU,QAAUA,IAAU,SACnCQ,EAAe,KAAK,IAAI,IAAMA,CAAY,EAErCR,IAAU,QAKfQ,EAJmB,CACf,IAAM,KAAO,KAAO,KAAO,IAAO,KAAO,KAAO,IAChD,KAAO,MAAQ,MAAQ,KAAQ,MAAQ,MAAQ,MAAQ,IAC3D,EAC0B,OAAO,CAACG,EAAMC,IAAS,KAAK,IAAIA,EAAOJ,CAAY,EAAI,KAAK,IAAIG,EAAOH,CAAY,EAAII,EAAOD,CAAI,GAEzH,KAAK,MAAMH,EAAe,GAAI,EAAI,GAC7C,CACJ,EAKaK,GAAmB,IAAIf,GAAQ,EAAG,EAKlCgB,GAAc,IAAIhB,GAAQ,EAAG,EAK7BiB,GAAiB,IAAIjB,GAAQ,CAAC,EAK9BkB,GAAe,IAAIlB,GAAQ,CAAC,EAK5BmB,GAAoB,IAAInB,GAAQ,CAAC,ECjqB9C,IAAMoB,GAAwBC,GAAe,CACzC,IAAMC,EAAW,CAAC,EACdC,EAAI,EACR,KAAOA,EAAIF,EAAW,QAAQ,CAC1B,IAAIG,EAAe,GACfC,EAAkB,EACtB,QAASC,EAAIH,EAAGG,EAAIL,EAAW,OAAS,EAAGK,IAAK,CAE5C,GAAIL,EAAWK,CAAC,IAAM,GAAKL,EAAWK,EAAI,CAAC,IAAM,GAAKL,EAAWK,EAAI,CAAC,IAAM,EAAG,CAC3EF,EAAeE,EACfD,EAAkB,EAClB,KACJ,CAEA,GAAIC,EAAIL,EAAW,OAAS,GACrBA,EAAWK,CAAC,IAAM,GAClBL,EAAWK,EAAI,CAAC,IAAM,GACtBL,EAAWK,EAAI,CAAC,IAAM,GACtBL,EAAWK,EAAI,CAAC,IAAM,EAAG,CAC5BF,EAAeE,EACfD,EAAkB,EAClB,KACJ,CACJ,CACA,GAAID,IAAiB,GACjB,MAGJ,GAAID,EAAI,GAAKC,EAAeD,EAAG,CAC3B,IAAMI,EAAUN,EAAW,SAASE,EAAGC,CAAY,EAC/CG,EAAQ,OAAS,GACjBL,EAAS,KAAKK,CAAO,CAE7B,CACAJ,EAAIC,EAAeC,CACvB,CAEA,GAAIF,EAAIF,EAAW,OAAQ,CACvB,IAAMM,EAAUN,EAAW,SAASE,CAAC,EACjCI,EAAQ,OAAS,GACjBL,EAAS,KAAKK,CAAO,CAE7B,CACA,OAAOL,CACX,EACMM,GAAkCC,GAAS,CAC7C,IAAMC,EAAS,CAAC,EACVC,EAAMF,EAAK,OACjB,QAASN,EAAI,EAAGA,EAAIQ,EAAKR,IAEjBA,EAAI,EAAIQ,GAAOF,EAAKN,CAAC,IAAM,GAAQM,EAAKN,EAAI,CAAC,IAAM,GAAQM,EAAKN,EAAI,CAAC,IAAM,GAC3EO,EAAO,KAAK,EAAM,CAAI,EACtBP,GAAK,GAGLO,EAAO,KAAKD,EAAKN,CAAC,CAAC,EAG3B,OAAO,IAAI,WAAWO,CAAM,CAChC,EA0BA,IAAME,GAA4BC,GACvBA,EAAK,CAAC,EAAI,GAGRC,GAAwCC,GAAe,CAChE,GAAI,CACA,IAAMC,EAAWC,GAAqBF,CAAU,EAC1CG,EAAWF,EAAS,OAAOG,GAAQP,GAAyBO,CAAI,IAAM,CAAC,EACvEC,EAAWJ,EAAS,OAAOG,GAAQP,GAAyBO,CAAI,IAAM,CAAC,EACvEE,EAAcL,EAAS,OAAOG,GAAQP,GAAyBO,CAAI,IAAM,EAAE,EAIjF,GAHID,EAAS,SAAW,GAGpBE,EAAS,SAAW,EACpB,OAAO,KAGX,IAAME,EAAUJ,EAAS,CAAC,EACpBK,EAAY,IAAIC,EAAUC,GAA+BH,CAAO,CAAC,EAIvE,GAHAC,EAAU,SAAS,CAAC,EACpBA,EAAU,SAAS,CAAC,EACEA,EAAU,SAAS,CAAC,IACpB,EAClB,eAAQ,MAAM,2BAA2B,EAClC,KAEX,IAAMG,EAAcH,EAAU,gBAAgB,EACxCI,EAAmBJ,EAAU,gBAAgB,EAC7CK,EAAYL,EAAU,gBAAgB,EACtCM,EAAS,CACX,qBAAsB,EACtB,qBAAsBH,EACtB,qBAAsBC,EACtB,mBAAoBC,EACpB,mBAAoB,EACpB,sBAAuBV,EACvB,qBAAsBE,EACtB,aAAc,KACd,mBAAoB,KACpB,qBAAsB,KACtB,wBAAyB,IAC7B,EACA,GAAIM,IAAgB,KACbA,IAAgB,KAChBA,IAAgB,KAChBA,IAAgB,IAAK,CACxBI,EAAcP,CAAS,EACvB,IAAMQ,EAAoBD,EAAcP,CAAS,EAC7CQ,IAAsB,GACtBR,EAAU,SAAS,CAAC,EAExB,IAAMS,EAAwBF,EAAcP,CAAS,EAC/CU,EAA0BH,EAAcP,CAAS,EACvDM,EAAO,aAAeE,EACtBF,EAAO,mBAAqBG,EAC5BH,EAAO,qBAAuBI,EAC9BJ,EAAO,wBAA0BR,CACrC,CACA,OAAOQ,CACX,OACOK,EAAO,CACV,eAAQ,MAAM,mDAAoDA,CAAK,EAChE,IACX,CACJ,EAuDA,IAAMC,GAAgB,GAChBC,GAAgB,GAChBC,GAAgB,GAChBC,GAAuB,GACvBC,GAAuB,GACvBC,GAA6BC,GACvBA,EAAK,CAAC,GAAK,EAAK,GAGfC,GAAyCC,GAAe,CACjE,GAAI,CACA,IAAMC,EAAWC,GAAqBF,CAAU,EAC1CG,EAAWF,EAAS,OAAOG,GAAQP,GAA0BO,CAAI,IAAMZ,EAAa,EACpFa,EAAWJ,EAAS,OAAOG,GAAQP,GAA0BO,CAAI,IAAMX,EAAa,EACpFa,EAAWL,EAAS,OAAOG,GAAQP,GAA0BO,CAAI,IAAMV,EAAa,EACpFa,EAAWN,EAAS,OAAOG,GAAQP,GAA0BO,CAAI,IAAMT,IACtEE,GAA0BO,CAAI,IAAMR,EAAoB,EAC/D,GAAIS,EAAS,SAAW,GAAKC,EAAS,SAAW,EAC7C,OAAO,KACX,IAAME,EAAMH,EAAS,CAAC,EAChBI,EAAY,IAAIC,EAAUC,GAA+BH,CAAG,CAAC,EACnEC,EAAU,SAAS,EAAE,EACrBA,EAAU,SAAS,CAAC,EACpB,IAAMG,EAA4BH,EAAU,SAAS,CAAC,EAChDI,EAA+BJ,EAAU,SAAS,CAAC,EACnD,CAAE,sBAAAK,EAAuB,kBAAAC,EAAmB,oBAAAC,EAAqB,oCAAAC,EAAqC,mCAAAC,EAAoC,kBAAAC,CAAmB,EAAIC,GAAsBX,EAAWG,CAAyB,EACjOS,EAAcZ,CAAS,EACvB,IAAMa,EAAoBD,EAAcZ,CAAS,EAC7Ca,IAAsB,GACtBb,EAAU,SAAS,CAAC,EACxBY,EAAcZ,CAAS,EACvBY,EAAcZ,CAAS,EACnBA,EAAU,SAAS,CAAC,IACpBY,EAAcZ,CAAS,EACvBY,EAAcZ,CAAS,EACvBY,EAAcZ,CAAS,EACvBY,EAAcZ,CAAS,GAE3B,IAAMc,EAAwBF,EAAcZ,CAAS,EAC/Ce,EAA0BH,EAAcZ,CAAS,EACvDY,EAAcZ,CAAS,EAEvB,IAAMgB,EAD2ChB,EAAU,SAAS,CAAC,EACX,EAAIG,EAC9D,QAASc,EAAID,EAAQC,GAAKd,EAA2Bc,IACjDL,EAAcZ,CAAS,EACvBY,EAAcZ,CAAS,EACvBY,EAAcZ,CAAS,EAE3BY,EAAcZ,CAAS,EACvBY,EAAcZ,CAAS,EACvBY,EAAcZ,CAAS,EACvBY,EAAcZ,CAAS,EACvBY,EAAcZ,CAAS,EACvBY,EAAcZ,CAAS,EACnBA,EAAU,SAAS,CAAC,GAChBA,EAAU,SAAS,CAAC,GACpBkB,GAAoBlB,CAAS,EAGrCA,EAAU,SAAS,CAAC,EACpBA,EAAU,SAAS,CAAC,EAChBA,EAAU,SAAS,CAAC,IACpBA,EAAU,SAAS,CAAC,EACpBA,EAAU,SAAS,CAAC,EACpBY,EAAcZ,CAAS,EACvBY,EAAcZ,CAAS,EACvBA,EAAU,SAAS,CAAC,GAExB,IAAMmB,EAA8BP,EAAcZ,CAAS,EAE3D,GADAoB,GAAoBpB,EAAWmB,CAA2B,EACtDnB,EAAU,SAAS,CAAC,EAAG,CACvB,IAAMqB,EAA6BT,EAAcZ,CAAS,EAC1D,QAASiB,EAAI,EAAGA,EAAII,EAA4BJ,IAC5CL,EAAcZ,CAAS,EACvBA,EAAU,SAAS,CAAC,CAE5B,CACAA,EAAU,SAAS,CAAC,EACpBA,EAAU,SAAS,CAAC,EACpB,IAAIsB,EAA+B,EAC/BtB,EAAU,SAAS,CAAC,IACpBsB,EAA+BC,GAAqCvB,EAAWG,CAAyB,GAG5G,IAAIqB,EAAkB,EACtB,GAAI3B,EAAS,OAAS,EAAG,CACrB,IAAM4B,EAAM5B,EAAS,CAAC,EAChB6B,EAAe,IAAIzB,EAAUC,GAA+BuB,CAAG,CAAC,EACtEC,EAAa,SAAS,EAAE,EACxBd,EAAcc,CAAY,EAC1Bd,EAAcc,CAAY,EAC1BA,EAAa,SAAS,CAAC,EACvBA,EAAa,SAAS,CAAC,EACvBA,EAAa,SAAS,CAAC,EACvBA,EAAa,SAAS,CAAC,EACvBA,EAAa,SAAS,CAAC,EACvBd,EAAcc,CAAY,EAC1Bd,EAAcc,CAAY,EAC1BC,GAAoBD,CAAY,EAChCA,EAAa,SAAS,CAAC,EACvBA,EAAa,SAAS,CAAC,EACnBA,EAAa,SAAS,CAAC,GACvBd,EAAcc,CAAY,EAE9BC,GAAoBD,CAAY,EAChCC,GAAoBD,CAAY,EAChCA,EAAa,SAAS,CAAC,EACvBA,EAAa,SAAS,CAAC,EACvBA,EAAa,SAAS,CAAC,EACvBA,EAAa,SAAS,CAAC,EACvB,IAAME,EAAqBF,EAAa,SAAS,CAAC,EAC5CG,GAAmCH,EAAa,SAAS,CAAC,EAC5D,CAACE,GAAsB,CAACC,GACxBL,EAAkB,EACbI,GAAsB,CAACC,GAC5BL,EAAkB,EACb,CAACI,GAAsBC,GAC5BL,EAAkB,EAElBA,EAAkB,CAC1B,CACA,IAAMM,EAAS,CACX,GAAIpC,EAAS,OACP,CACE,CACI,kBAAmB,EACnB,YAAaX,GACb,SAAUW,CACd,CACJ,EACE,CAAC,EACP,GAAIE,EAAS,OACP,CACE,CACI,kBAAmB,EACnB,YAAaZ,GACb,SAAUY,CACd,CACJ,EACE,CAAC,EACP,GAAIC,EAAS,OACP,CACE,CACI,kBAAmB,EACnB,YAAaZ,GACb,SAAUY,CACd,CACJ,EACE,CAAC,EACP,GAAIC,EAAS,OACP,CACE,CACI,kBAAmB,EACnB,YAAaV,GAA0BU,EAAS,CAAC,CAAC,EAClD,SAAUA,CACd,CACJ,EACE,CAAC,CACX,EAqBA,MApBe,CACX,qBAAsB,EACtB,oBAAqBO,EACrB,gBAAiBC,EACjB,kBAAmBC,EACnB,iCAAkCC,EAClC,gCAAiCC,EACjC,gBAAiBC,EACjB,0BAA2BY,EAC3B,gBAAAE,EACA,gBAAiBX,EACjB,mBAAoBC,EACpB,qBAAsBC,EACtB,aAAc,EACd,kBAAmB,EACnB,kBAAmBZ,EAA4B,EAC/C,iBAAkBC,EAClB,mBAAoB,EACpB,OAAA0B,CACJ,CAEJ,OACOC,EAAO,CACV,eAAQ,MAAM,oDAAqDA,CAAK,EACjE,IACX,CACJ,EACMpB,GAAwB,CAACX,EAAWgC,IAA0B,CAChE,IAAM3B,EAAwBL,EAAU,SAAS,CAAC,EAC5CM,EAAoBN,EAAU,SAAS,CAAC,EACxCO,EAAsBP,EAAU,SAAS,CAAC,EAC5CQ,EAAsC,EAC1C,QAASS,EAAI,EAAGA,EAAI,GAAIA,IACpBT,EAAuCA,GAAuC,EAAKR,EAAU,SAAS,CAAC,EAE3G,IAAMS,EAAqC,IAAI,WAAW,CAAC,EAC3D,QAASQ,EAAI,EAAGA,EAAI,EAAGA,IACnBR,EAAmCQ,CAAC,EAAIjB,EAAU,SAAS,CAAC,EAEhE,IAAMU,EAAoBV,EAAU,SAAS,CAAC,EACxCiC,EAAiC,CAAC,EAClCC,EAA+B,CAAC,EACtC,QAASjB,EAAI,EAAGA,EAAIe,EAAuBf,IACvCgB,EAA+B,KAAKjC,EAAU,SAAS,CAAC,CAAC,EACzDkC,EAA6B,KAAKlC,EAAU,SAAS,CAAC,CAAC,EAE3D,GAAIgC,EAAwB,EACxB,QAASf,EAAIe,EAAuBf,EAAI,EAAGA,IACvCjB,EAAU,SAAS,CAAC,EAG5B,QAASiB,EAAI,EAAGA,EAAIe,EAAuBf,IACnCgB,EAA+BhB,CAAC,GAChCjB,EAAU,SAAS,EAAE,EACrBkC,EAA6BjB,CAAC,GAC9BjB,EAAU,SAAS,CAAC,EAE5B,MAAO,CACH,sBAAAK,EACA,kBAAAC,EACA,oBAAAC,EACA,oCAAAC,EACA,mCAAAC,EACA,kBAAAC,CACJ,CACJ,EACMQ,GAAuBlB,GAAc,CACvC,QAASmC,EAAS,EAAGA,EAAS,EAAGA,IAC7B,QAASC,EAAW,EAAGA,GAAYD,IAAW,EAAI,EAAI,GAAIC,IAEtD,GAAI,CADgCpC,EAAU,SAAS,CAAC,EAEpDY,EAAcZ,CAAS,MAEtB,CACD,IAAMqC,EAAU,KAAK,IAAI,GAAI,GAAM,GAAKF,GAAU,EAAG,EACjDA,EAAS,GACTR,GAAoB3B,CAAS,EAEjC,QAAS,EAAI,EAAG,EAAIqC,EAAS,IACzBV,GAAoB3B,CAAS,CAErC,CAGZ,EACMoB,GAAsB,CAACpB,EAAWmB,IAAgC,CACpE,IAAMmB,EAAe,CAAC,EACtB,QAASC,EAAW,EAAGA,EAAWpB,EAA6BoB,IAC3DD,EAAaC,CAAQ,EAAIC,GAAgBxC,EAAWuC,EAAUpB,EAA6BmB,CAAY,CAE/G,EACME,GAAkB,CAACxC,EAAWuC,EAAUpB,EAA6BmB,IAAiB,CACxF,IAAIG,EAAmB,EACnBC,EAAoC,EACpCC,EAAY,EAIhB,GAHIJ,IAAa,IACbG,EAAoC1C,EAAU,SAAS,CAAC,GAExD0C,EAAmC,CACnC,GAAIH,IAAapB,EAA6B,CAC1C,IAAMyB,EAAmBhC,EAAcZ,CAAS,EAChD2C,EAAYJ,GAAYK,EAAmB,EAC/C,MAEID,EAAYJ,EAAW,EAE3BvC,EAAU,SAAS,CAAC,EACpBY,EAAcZ,CAAS,EAEvB,IAAM6C,EAAWP,EAAaK,CAAS,GAAK,EAC5C,QAASG,EAAI,EAAGA,GAAKD,EAAUC,IACG9C,EAAU,SAAS,CAAC,GAE9CA,EAAU,SAAS,CAAC,EAG5ByC,EAAmBH,EAAaK,CAAS,CAC7C,KACK,CACD,IAAMI,EAAoBnC,EAAcZ,CAAS,EAC3CgD,EAAoBpC,EAAcZ,CAAS,EACjD,QAASiB,EAAI,EAAGA,EAAI8B,EAAmB9B,IACnCL,EAAcZ,CAAS,EACvBA,EAAU,SAAS,CAAC,EAExB,QAASiB,EAAI,EAAGA,EAAI+B,EAAmB/B,IACnCL,EAAcZ,CAAS,EACvBA,EAAU,SAAS,CAAC,EAExByC,EAAmBM,EAAoBC,CAC3C,CACA,OAAOP,CACX,EACMlB,GAAuC,CAACvB,EAAWG,IAA8B,CA2CnF,GA1CIH,EAAU,SAAS,CAAC,GACKA,EAAU,SAAS,CAAC,IACpB,MACrBA,EAAU,SAAS,EAAE,EACrBA,EAAU,SAAS,EAAE,GAGzBA,EAAU,SAAS,CAAC,GACpBA,EAAU,SAAS,CAAC,EAEpBA,EAAU,SAAS,CAAC,IACpBA,EAAU,SAAS,CAAC,EACpBA,EAAU,SAAS,CAAC,EAChBA,EAAU,SAAS,CAAC,IACpBA,EAAU,SAAS,CAAC,EACpBA,EAAU,SAAS,CAAC,EACpBA,EAAU,SAAS,CAAC,IAGxBA,EAAU,SAAS,CAAC,IACpBY,EAAcZ,CAAS,EACvBY,EAAcZ,CAAS,GAE3BA,EAAU,SAAS,CAAC,EACpBA,EAAU,SAAS,CAAC,EACpBA,EAAU,SAAS,CAAC,EAChBA,EAAU,SAAS,CAAC,IACpBY,EAAcZ,CAAS,EACvBY,EAAcZ,CAAS,EACvBY,EAAcZ,CAAS,EACvBY,EAAcZ,CAAS,GAEvBA,EAAU,SAAS,CAAC,IACpBA,EAAU,SAAS,EAAE,EACrBA,EAAU,SAAS,EAAE,EACjBA,EAAU,SAAS,CAAC,GACpBY,EAAcZ,CAAS,EAEvBA,EAAU,SAAS,CAAC,GACpBiD,GAAkBjD,EAAW,GAAMG,CAAyB,GAGhEH,EAAU,SAAS,CAAC,EAAG,CACvBA,EAAU,SAAS,CAAC,EACpBA,EAAU,SAAS,CAAC,EACpBA,EAAU,SAAS,CAAC,EACpB,IAAMsB,EAA+BV,EAAcZ,CAAS,EAE5D,OAAAY,EAAcZ,CAAS,EACvBY,EAAcZ,CAAS,EACvBY,EAAcZ,CAAS,EACvBY,EAAcZ,CAAS,EAChBsB,CACX,CACA,MAAO,EACX,EACM2B,GAAoB,CAACjD,EAAWkD,EAAsBlB,IAA0B,CAClF,IAAImB,EAAkC,GAClCC,EAAkC,GAClCC,EAAkC,GAClCH,IACAC,EAAkCnD,EAAU,SAAS,CAAC,IAAM,EAC5DoD,EAAkCpD,EAAU,SAAS,CAAC,IAAM,GACxDmD,GAAmCC,KACnCC,EAAkCrD,EAAU,SAAS,CAAC,IAAM,EACxDqD,IACArD,EAAU,SAAS,CAAC,EACpBA,EAAU,SAAS,CAAC,EACpBA,EAAU,SAAS,CAAC,EACpBA,EAAU,SAAS,CAAC,GAExBA,EAAU,SAAS,CAAC,EACpBA,EAAU,SAAS,CAAC,EAChBqD,GACArD,EAAU,SAAS,CAAC,EAExBA,EAAU,SAAS,CAAC,EACpBA,EAAU,SAAS,CAAC,EACpBA,EAAU,SAAS,CAAC,IAG5B,QAASiB,EAAI,EAAGA,GAAKe,EAAuBf,IAAK,CAC7C,IAAMqC,EAA8BtD,EAAU,SAAS,CAAC,IAAM,EAC1DuD,EAAiC,GAChCD,IACDC,EAAiCvD,EAAU,SAAS,CAAC,IAAM,GAE/D,IAAIwD,EAAqB,GACrBD,EACA3C,EAAcZ,CAAS,EAGvBwD,EAAqBxD,EAAU,SAAS,CAAC,IAAM,EAEnD,IAAIyD,EAAS,EACRD,IAEDC,EADuB7C,EAAcZ,CAAS,EACpB,GAE1BmD,GACAO,GAA0B1D,EAAWyD,EAAQJ,CAA+B,EAE5ED,GACAM,GAA0B1D,EAAWyD,EAAQJ,CAA+B,CAEpF,CACJ,EACMK,GAA4B,CAAC1D,EAAWyD,EAAQJ,IAAoC,CACtF,QAASpC,EAAI,EAAGA,EAAIwC,EAAQxC,IACxBL,EAAcZ,CAAS,EACvBY,EAAcZ,CAAS,EACnBqD,IACAzC,EAAcZ,CAAS,EACvBY,EAAcZ,CAAS,GAE3BA,EAAU,SAAS,CAAC,CAE5B,EA2CO,IAAM2D,GAAiCC,GAAW,CAKrD,IAAMC,EAAWD,EAAOA,EAAO,OAAS,CAAC,EACzC,GAAIC,IAAaA,EAAW,OAAU,IAAM,CACxC,IAAMC,IAAsBD,EAAW,KAAS,GAAK,EAE/CE,EAAY,IADCF,EAAW,GAAQ,GACJC,EAElC,GAAIF,EAAOA,EAAO,OAASG,CAAS,IAAMF,EACtC,OAAO,KAGX,IAAIG,EAAY,EACVC,EAASL,EAAO,OAASG,EAAY,EAC3C,QAASG,EAAI,EAAGA,EAAIJ,EAAmBI,IAAK,CACxC,GAAI,CAACN,EAAOK,EAASC,CAAC,EAClB,OAAO,KACXF,GAAaJ,EAAOK,EAASC,CAAC,GAAM,EAAIA,CAC5C,CACAN,EAASA,EAAO,SAAS,EAAGI,CAAS,CACzC,CACA,IAAMG,EAAY,IAAIC,EAAUR,CAAM,EAGtC,GADoBO,EAAU,SAAS,CAAC,IACpB,EAChB,OAAO,KAGX,IAAME,EAAgBF,EAAU,SAAS,CAAC,EAEpCG,GADiBH,EAAU,SAAS,CAAC,GACR,GAAKE,EAmBxC,GAjBIC,IAAY,GACZH,EAAU,SAAS,CAAC,EAGEA,EAAU,SAAS,CAAC,IACpB,GAIRA,EAAU,SAAS,CAAC,IACpB,IAIlBA,EAAU,SAAS,CAAC,EAEHA,EAAU,SAAS,EAAE,IACrB,SACb,OAAO,KAGX,IAAII,EAAW,EACXD,GAAW,IAEXC,EADuBJ,EAAU,SAAS,CAAC,EACf,GAAK,IAGrC,IAAMK,EAAaL,EAAU,SAAS,CAAC,EACnCM,EAAoB,EACpBC,EAAqB,EACzB,GAAIF,IAAe,EAGf,GADAE,EADmBP,EAAU,SAAS,CAAC,EAEnCG,IAAY,GAAKA,IAAY,EAAG,CAChC,IAAMK,EAAeR,EAAU,SAAS,CAAC,EACnCS,EAAeT,EAAU,SAAS,CAAC,EAKzCM,EAAoB,CAACE,GAAgB,CAACC,EAChC,EACAD,GAAgB,CAACC,EACb,EACA,EAEVT,EAAU,SAAS,CAAC,CACxB,MAGIM,EAAoB,OAKxBA,EAAoB,EACpBC,EAAqB,EAGzB,IAAMG,EAAgBV,EAAU,SAAS,EAAE,EACrCW,EAAiBX,EAAU,SAAS,EAAE,EACtCY,EAAQF,EAAgB,EACxBG,EAASF,EAAiB,EAE1BG,EAAcF,EAAQC,EACxBE,EAAQC,EAAKC,EAAe,EAAE,MAClC,QAAWC,KAASD,GAChB,GAAIH,GAAeI,EAAM,eAAgB,CACrCH,EAAQG,EAAM,MACd,KACJ,CAoBJ,MAAO,CACH,QAAAf,EACA,MAAAY,EACA,SAAAX,EACA,kBAAAE,EACA,mBAAAC,EACA,gBAhBoBF,IAAe,EACjC,EACAA,IAAe,EACX,EACA,EAaN,wBAZ4BA,IAAe,EACzC,EACAA,IAAe,EACX,EACA,EASN,mBAzBuBA,IAAe,EACpC,EACAA,IAAe,EACX,EACAA,IAAe,EACX,EACA,CAoBd,CACJ,EAKac,GAAiC1B,GAAW,CAErD,IAAMO,EAAY,IAAIC,EAAUR,CAAM,EAChC2B,EAAa,IAAM,CACrB,IAAIC,EAAQ,EACZ,QAAStB,EAAI,EAAGA,EAAI,EAAGA,IAAK,CACxB,IAAMuB,EAAOtB,EAAU,gBAAgB,EACvC,GAAIsB,IAAS,OACT,MAAO,GAEX,GADAD,IAAWC,EAAO,MAAUvB,EAAI,EAC5B,EAAEuB,EAAO,KACT,MAGJ,GAAIvB,IAAM,GAAMuB,EAAO,IACnB,OAAO,IAEf,CAEA,OAAID,GAAS,GAAK,GAAK,EACZ,KAEJA,CACX,EACA,KAAOrB,EAAU,YAAY,GAAK,GAAG,CAEjC,IAAMuB,EAAYvB,EAAU,SAAS,CAAC,EAChCwB,EAAWD,GAAa,EAAK,GAC7BE,EAAgBF,GAAa,EAAK,EAClCG,EAAmBH,GAAa,EAAK,EAEvCE,GACAzB,EAAU,SAAS,CAAC,EAGxB,IAAI2B,EACJ,GAAID,EAAiB,CACjB,IAAME,EAAeR,EAAW,EAChC,GAAIQ,IAAiB,KACjB,OAAO,KACXD,EAAUC,CACd,MAGID,EAAU,KAAK,MAAM3B,EAAU,YAAY,EAAI,CAAC,EAGpD,GAAIwB,IAAY,EAAG,CAEf,IAAMK,EAAa7B,EAAU,SAAS,CAAC,EAEjC8B,EAAe9B,EAAU,SAAS,CAAC,EACnC+B,EAA4B/B,EAAU,SAAS,CAAC,EAClDgC,EAAW,EACXC,EAAU,EACVC,EAA0B,EAC9B,GAAIH,EACAC,EAAWhC,EAAU,SAAS,CAAC,MAE9B,CAGD,GAD8BA,EAAU,SAAS,CAAC,IAG9CA,EAAU,SAAS,EAAE,EACrBA,EAAU,SAAS,EAAE,EACQA,EAAU,SAAS,CAAC,GAK7C,OAAO,KAIf,IAAMmC,EAA8BnC,EAAU,SAAS,CAAC,EACpDmC,IAEAD,EAA0BlC,EAAU,SAAS,CAAC,EAC9CA,EAAU,SAAS,EAAE,EACrBA,EAAU,SAAS,CAAC,EACpBA,EAAU,SAAS,CAAC,GAGxB,IAAMoC,EAA2BpC,EAAU,SAAS,CAAC,EAErD,QAASD,EAAI,EAAGA,GAAKqC,EAA0BrC,IAAK,CAEhDC,EAAU,SAAS,EAAE,EAErB,IAAMqC,EAAcrC,EAAU,SAAS,CAAC,EAIxC,GAHID,IAAM,IACNiC,EAAWK,GAEXA,EAAc,EAAG,CAEjB,IAAMC,EAActC,EAAU,SAAS,CAAC,EACpCD,IAAM,IACNkC,EAAUK,EAElB,CACA,GAAIH,GAEqCnC,EAAU,SAAS,CAAC,EACvB,CAC9B,IAAMuC,EAAIL,EAA0B,EACpClC,EAAU,SAASuC,CAAC,EACpBvC,EAAU,SAASuC,CAAC,EACpBvC,EAAU,SAAS,CAAC,CACxB,CAGmCA,EAAU,SAAS,CAAC,GAGvDA,EAAU,SAAS,CAAC,CAE5B,CACJ,CACA,IAAMwC,EAAexC,EAAU,SAAS,CAAC,EACrCI,EAAW,EACXyB,IAAe,GAAKW,EAEpBpC,EADkBJ,EAAU,SAAS,CAAC,EACf,GAAK,GAEvB6B,GAAc,IACnBzB,EAAWoC,EAAe,GAAK,GAEnC,IAAIC,EAAa,EACbZ,IAAe,IACfY,EAAazC,EAAU,SAAS,CAAC,GAErC,IAAI0C,EAAqB,EACrBC,EAAqB,EACrBC,EAAuB,EAC3B,OAAKH,IACGZ,IAAe,GACfa,EAAqB,EACrBC,EAAqB,GAEhBd,IAAe,GACpBa,EAAqB,EACrBC,EAAqB,GAGjBvC,IAAa,KACbsC,EAAqB1C,EAAU,SAAS,CAAC,EACrC0C,IACAC,EAAqB3C,EAAU,SAAS,CAAC,IAIjD0C,GAAsBC,IACtBC,EAAuB5C,EAAU,SAAS,CAAC,IAG5C,CACH,QAAS6B,EACT,MAAOG,EACP,KAAMC,EACN,SAAA7B,EACA,WAAAqC,EACA,mBAAAC,EACA,mBAAAC,EACA,qBAAAC,CACJ,CACJ,CAGA5C,EAAU,SAAS2B,EAAU,CAAC,CAClC,CACA,OAAO,IACX,EACakB,GAAiCC,GAAU,CACpD,IAAMC,EAAOC,EAAWF,CAAK,EACvBG,EAAqBF,EAAK,SAAS,CAAC,EACpCG,EAAUH,EAAK,UAAU,GAAI,EAAI,EACjCI,EAAkBJ,EAAK,UAAU,GAAI,EAAI,EACzCK,EAAaL,EAAK,SAAS,GAAI,EAAI,EACnCM,EAAuBN,EAAK,SAAS,EAAE,EACzCO,EAAsB,KAC1B,OAAID,IACAC,EAAsBR,EAAM,SAAS,GAAI,GAASG,CAAkB,GAEjE,CACH,mBAAAA,EACA,QAAAC,EACA,gBAAAC,EACA,WAAAC,EACA,qBAAAC,EACA,oBAAAC,CACJ,CACJ,EAEMC,GAA4B,CAC9B,IAAK,IAAK,KAAM,KAChB,IAAK,IAAK,KAAM,KAChB,IAAK,IAAK,KAAM,KAChB,IAAK,IACL,IAAK,IACL,IAAK,IAAK,IAAK,IACf,IAAK,IAAK,IAAK,IACf,IAAK,IAAK,IAAK,IACf,IAAK,IAAK,IAAK,GACnB,EACaC,GAAoB/D,GAAW,CACxC,IAAMgE,EAAShE,EAAO,CAAC,GAAK,EAC5B,MAAO,CACH,kBAAmB8D,GAA0BE,CAAM,CACvD,CACJ,EAEaC,GAAmCC,GAAgB,CAE5D,GAAIA,EAAY,OAAS,EACrB,MAAM,IAAI,MAAM,4BAA4B,EAEhD,GAAIA,EAAY,CAAC,IAAM,EACnB,MAAM,IAAI,MAAM,oCAAoC,EAGxD,GADkB,OAAO,aAAa,GAAGA,EAAY,MAAM,EAAG,CAAC,CAAC,IAC9C,SACd,MAAM,IAAI,MAAM,2CAA2C,EAG/D,IAAMC,EAAUD,EAAY,OACtBE,EAAY,IAAI,WAAWD,CAAO,EACxC,QAAS7D,EAAI,EAAGA,EAAI6D,EAAS7D,IACzB8D,EAAU9D,CAAC,EAAI4D,EAAYC,EAAU,EAAI7D,CAAC,EAG9C,IAAMC,EAAY,IAAIC,EAAU4D,CAAS,EAGrCC,EAAgB,EACpB,KAAO9D,EAAU,YAAY,EAAI,IAC7B,GAAIA,EAAU,SAAS,CAAC,IAAM,EAAG,CAC7B8D,EAAgB9D,EAAU,IAC1B,KACJ,CAEJ,GAAI8D,IAAkB,EAClB,MAAM,IAAI,MAAM,8CAA8C,EAIlE,IAAIC,EAAY,EACZC,EAAgB,GAChBC,EAAgB,EACpB,KAAOjE,EAAU,YAAY,GAAK,IAAI,CAClC,IAAMkE,EAAUlE,EAAU,IACpBmE,EAAInE,EAAU,SAAS,CAAC,EACxBoE,EAAIpE,EAAU,SAAS,EAAE,EACzBqE,EAAIrE,EAAU,SAAS,EAAE,EAE/B,GAAImE,EAAI,IAAMC,IAAM,GAAKC,IAAM,EAAG,CAC9BrE,EAAU,IAAMkE,EAChB,KACJ,CAGA,GAFAlE,EAAU,SAAS,CAAC,EACpB+D,IACIA,EAAY,GACZ,MAEY/D,EAAU,MAAM,EACN,SAAS,CAAC,EAAI,IACtB+D,IACdC,EAAgB,GAChBC,EAAgBF,EAExB,CACA,GAAI,CAACC,EACD,MAAM,IAAI,MAAM,8CAA8C,EAElE,GAAIC,EAAgB,GAChB,MAAM,IAAI,MAAM,2BAA2BA,CAAa,GAAG,EAE/D,IAAMK,EAAiBL,EAEvBjE,EAAU,IAAM,EAEhBA,EAAU,SAAS8D,CAAa,EAGhC,IAAMS,EAAiB,MAAMD,CAAc,EAAE,KAAK,CAAC,EACnD,QAASvE,EAAIuE,EAAiB,EAAGvE,GAAK,EAAGA,IACrCC,EAAU,SAAS,EAAE,EACrBuE,EAAexE,CAAC,EAAIC,EAAU,SAAS,CAAC,EAE5C,MAAO,CAAE,eAAAuE,CAAe,CAC5B,ECvkCO,IAAMC,GAAwBC,GAAS,CAM1C,IAAIC,GALSD,EAAK,SACZ,SACAA,EAAK,SACD,SACA,iBACWA,EAAK,YAAc,YAAc,OACtD,GAAIA,EAAK,aAAa,OAAS,EAAG,CAC9B,IAAME,EAAuB,CAAC,GAAG,IAAI,IAAIF,EAAK,YAAY,CAAC,EAC3DC,GAAU,aAAaC,EAAqB,KAAK,IAAI,CAAC,GAC1D,CACA,OAAOD,CACX,ECOO,IAAIE,GACV,SAAUA,EAAQ,CACfA,EAAOA,EAAO,KAAU,SAAS,EAAI,OACrCA,EAAOA,EAAO,YAAiB,KAAK,EAAI,cACxCA,EAAOA,EAAO,gBAAqB,KAAK,EAAI,kBAC5CA,EAAOA,EAAO,gBAAqB,KAAK,EAAI,kBAC5CA,EAAOA,EAAO,kBAAuB,KAAK,EAAI,oBAC9CA,EAAOA,EAAO,QAAa,KAAK,EAAI,UACpCA,EAAOA,EAAO,eAAoB,KAAK,EAAI,iBAC3CA,EAAOA,EAAO,mBAAwB,KAAK,EAAI,qBAC/CA,EAAOA,EAAO,SAAc,SAAS,EAAI,WACzCA,EAAOA,EAAO,KAAU,KAAK,EAAI,OACjCA,EAAOA,EAAO,OAAY,KAAK,EAAI,SACnCA,EAAOA,EAAO,aAAkB,KAAK,EAAI,eACzCA,EAAOA,EAAO,SAAc,KAAK,EAAI,WACrCA,EAAOA,EAAO,KAAU,SAAS,EAAI,OACrCA,EAAOA,EAAO,eAAoB,OAAO,EAAI,iBAC7CA,EAAOA,EAAO,UAAe,KAAK,EAAI,YACtCA,EAAOA,EAAO,WAAgB,KAAK,EAAI,aACvCA,EAAOA,EAAO,OAAY,SAAS,EAAI,SACvCA,EAAOA,EAAO,WAAgB,GAAG,EAAI,aACrCA,EAAOA,EAAO,YAAiB,GAAG,EAAI,cACtCA,EAAOA,EAAO,SAAc,KAAK,EAAI,WACrCA,EAAOA,EAAO,UAAe,GAAG,EAAI,YACpCA,EAAOA,EAAO,YAAiB,GAAG,EAAI,cACtCA,EAAOA,EAAO,YAAiB,GAAG,EAAI,cACtCA,EAAOA,EAAO,WAAgB,KAAK,EAAI,aACvCA,EAAOA,EAAO,WAAgB,GAAG,EAAI,aACrCA,EAAOA,EAAO,SAAc,OAAO,EAAI,WACvCA,EAAOA,EAAO,QAAa,GAAG,EAAI,UAClCA,EAAOA,EAAO,aAAkB,KAAK,EAAI,eACzCA,EAAOA,EAAO,WAAgB,KAAK,EAAI,aACvCA,EAAOA,EAAO,YAAiB,KAAK,EAAI,cACxCA,EAAOA,EAAO,gBAAqB,OAAO,EAAI,kBAC9CA,EAAOA,EAAO,MAAW,GAAG,EAAI,QAChCA,EAAOA,EAAO,WAAgB,GAAG,EAAI,aACrCA,EAAOA,EAAO,YAAiB,GAAG,EAAI,cACtCA,EAAOA,EAAO,MAAW,GAAG,EAAI,QAChCA,EAAOA,EAAO,kBAAuB,GAAG,EAAI,oBAC5CA,EAAOA,EAAO,SAAc,GAAG,EAAI,WACnCA,EAAOA,EAAO,SAAc,KAAK,EAAI,WACrCA,EAAOA,EAAO,QAAa,SAAS,EAAI,UACxCA,EAAOA,EAAO,YAAiB,GAAG,EAAI,cACtCA,EAAOA,EAAO,WAAgB,GAAG,EAAI,aACrCA,EAAOA,EAAO,MAAW,GAAG,EAAI,QAChCA,EAAOA,EAAO,eAAoB,KAAK,EAAI,iBAC3CA,EAAOA,EAAO,UAAe,GAAG,EAAI,YACpCA,EAAOA,EAAO,gBAAqB,GAAG,EAAI,kBAC1CA,EAAOA,EAAO,WAAgB,GAAG,EAAI,aACrCA,EAAOA,EAAO,cAAmB,GAAG,EAAI,gBACxCA,EAAOA,EAAO,eAAoB,GAAG,EAAI,iBACzCA,EAAOA,EAAO,QAAa,SAAS,EAAI,UACxCA,EAAOA,EAAO,UAAe,GAAG,EAAI,YACpCA,EAAOA,EAAO,KAAU,SAAS,EAAI,OACrCA,EAAOA,EAAO,SAAc,GAAG,EAAI,WACnCA,EAAOA,EAAO,QAAa,GAAG,EAAI,UAClCA,EAAOA,EAAO,kBAAuB,GAAG,EAAI,oBAC5CA,EAAOA,EAAO,SAAc,GAAG,EAAI,WACnCA,EAAOA,EAAO,mBAAwB,GAAG,EAAI,qBAC7CA,EAAOA,EAAO,OAAY,KAAK,EAAI,SACnCA,EAAOA,EAAO,mBAAwB,KAAK,EAAI,qBAC/CA,EAAOA,EAAO,wBAA6B,KAAK,EAAI,0BACpDA,EAAOA,EAAO,UAAe,KAAK,EAAI,YACtCA,EAAOA,EAAO,MAAW,KAAK,EAAI,QAClCA,EAAOA,EAAO,WAAgB,KAAK,EAAI,aACvCA,EAAOA,EAAO,eAAoB,KAAK,EAAI,iBAC3CA,EAAOA,EAAO,mBAAwB,KAAK,EAAI,qBAC/CA,EAAOA,EAAO,YAAiB,SAAS,EAAI,cAC5CA,EAAOA,EAAO,SAAc,SAAS,EAAI,WACzCA,EAAOA,EAAO,KAAU,SAAS,EAAI,MACzC,GAAGA,IAAWA,EAAS,CAAC,EAAE,EACnB,IAAMC,GAAmB,CAC5BD,EAAO,KACPA,EAAO,OACX,EACaE,GAAmB,CAC5BF,EAAO,gBACPA,EAAO,kBACPA,EAAO,SACPA,EAAO,KACPA,EAAO,QACPA,EAAO,OACPA,EAAO,KACPA,EAAO,YACPA,EAAO,SACPA,EAAO,IACX,EACaG,GAAyB,CAClC,GAAGF,GACH,GAAGC,EACP,EAkPA,IAAME,GAAmB,EACZC,GAAkB,EAClBC,GAAkB,EAAIF,GACtBG,GAAN,KAAiB,CACpB,YAAYC,EAAQ,CAChB,KAAK,OAASA,EACd,KAAK,IAAM,CACf,CACA,UAAUC,EAAQ,CACd,GAAM,CAAE,KAAAC,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAMF,CAAM,EACjF,YAAK,KAAOA,EACL,IAAI,WAAWC,EAAK,OAAQC,EAAQF,CAAM,CACrD,CACA,QAAS,CACL,GAAM,CAAE,KAAAC,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAM,CAAC,EAC5E,YAAK,MACED,EAAK,SAASC,CAAM,CAC/B,CACA,SAAU,CACN,GAAM,CAAE,KAAAD,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAM,CAAC,EAC5E,YAAK,KAAO,EACLD,EAAK,SAASC,EAAQ,EAAK,CACtC,CACA,gBAAiB,CACb,GAAM,CAAE,KAAAD,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAM,CAAC,EACtEC,EAAYF,EAAK,SAASC,CAAM,EAClCE,EAAQ,EACRC,EAAO,IACX,MAAQF,EAAYE,KAAU,GAAKD,EAAQ,GACvCA,IACAC,IAAS,EAEb,OAAOD,CACX,CACA,YAAa,CAET,GAAM,CAAE,KAAAH,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAM,CAAC,EACtEC,EAAYF,EAAK,SAASC,CAAM,EAElCE,EAAQ,EACRC,EAAO,IACX,MAAQF,EAAYE,KAAU,GAAKD,EAAQT,IACvCS,IACAC,IAAS,EAEb,GAAM,CAAE,KAAMC,EAAU,OAAQC,CAAW,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAMH,CAAK,EAElGI,EAAQL,EAAaE,EAAO,EAEhC,QAASI,EAAI,EAAGA,EAAIL,EAAOK,IACvBD,GAAS,IACTA,GAASF,EAAS,SAASC,EAAaE,CAAC,EAE7C,YAAK,KAAOL,EACLI,CACX,CACA,gBAAgBJ,EAAO,CACnB,GAAIA,EAAQ,GAAKA,EAAQ,EACrB,MAAM,IAAI,MAAM,yBAA2BA,CAAK,EAEpD,GAAM,CAAE,KAAAH,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAME,CAAK,EAC5EI,EAAQ,EAEZ,QAAS,EAAI,EAAG,EAAIJ,EAAO,IACvBI,GAAS,IACTA,GAASP,EAAK,SAASC,EAAS,CAAC,EAErC,YAAK,KAAOE,EACLI,CACX,CACA,cAAcJ,EAAO,CACjB,IAAII,EAAQ,KAAK,gBAAgBJ,CAAK,EAEtC,OAAII,EAAS,GAAMJ,EAAQ,EAAI,IAC3BI,GAAS,IAAMJ,EAAQ,IAEpBI,CACX,CACA,UAAUJ,EAAO,CACb,GAAIA,IAAU,EACV,MAAO,GAEX,GAAIA,IAAU,GAAKA,IAAU,EACzB,MAAM,IAAI,MAAM,kBAAoBA,CAAK,EAE7C,GAAM,CAAE,KAAAH,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAME,CAAK,EAC1EI,EAAQJ,IAAU,EAAIH,EAAK,WAAWC,EAAQ,EAAK,EAAID,EAAK,WAAWC,EAAQ,EAAK,EAC1F,YAAK,KAAOE,EACLI,CACX,CACA,WAAWR,EAAQ,CACf,GAAM,CAAE,KAAAC,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAMF,CAAM,EACjF,YAAK,KAAOA,EACL,OAAO,aAAa,GAAG,IAAI,WAAWC,EAAK,OAAQC,EAAQF,CAAM,CAAC,CAC7E,CACA,eAAgB,CACZ,IAAMU,EAAO,KAAK,eAAe,EAEjC,OADW,KAAK,gBAAgBA,CAAI,CAExC,CACA,iBAAkB,CACd,IAAIA,EAAO,KAAK,OAAO,EACvB,OAAIA,IAAS,IACTA,EAAO,MAGP,KAAK,MACLA,EAAO,KAAK,WAAW,EAMnBA,IAAS,oBACTA,EAAO,OAGRA,CACX,CACA,mBAAoB,CAChB,IAAMC,EAAK,KAAK,cAAc,EACxBD,EAAO,KAAK,gBAAgB,EAClC,MAAO,CAAE,GAAAC,EAAI,KAAAD,CAAK,CACtB,CAEA,MAAM,uBAAuBE,EAAKC,EAAO,CAErC,IAAMC,EAAS,IAAI,IAAIF,CAAG,EAC1B,KAAO,KAAK,IAAMC,EAAQhB,IAAiB,CAClC,KAAK,OAAO,cAAc,KAAK,IAAK,KAAK,IAAMA,EAAe,GAC/D,MAAM,KAAK,OAAO,UAAU,KAAK,IAAK,KAAK,IAAI,KAAK,IAAM,QAAegB,CAAK,CAAC,EAEnF,IAAME,EAAkB,KAAK,IACvBC,EAAgB,KAAK,kBAAkB,EAC7C,GAAIF,EAAO,IAAIE,EAAc,EAAE,EAC3B,OAAOD,EAEXE,GAAkBD,EAAc,IAAI,EACpC,KAAK,KAAOA,EAAc,IAC9B,CACA,OAAO,IACX,CACJ,EACaE,EAAmB,CAC5B,IAAO,kBACP,KAAQ,mBACR,IAAO,QACP,IAAO,QACP,IAAO,QACP,IAAO,QACP,IAAO,YACP,KAAQ,SACR,OAAU,WACV,KAAQ,SACR,SAAU,gBACV,UAAW,gBACX,YAAa,gBACb,UAAW,gBACX,YAAa,gBACb,UAAW,gBACX,YAAa,gBACb,UAAW,mBACX,UAAW,mBACX,OAAU,eACd,EACO,SAASD,GAAkBP,EAAM,CACpC,GAAIA,IAAS,KACT,MAAM,IAAI,MAAM,sEAAsE,CAE9F,CCxgBO,IAAMS,GAAyBC,GAAS,CAM3C,IAAIC,GALSD,EAAK,SACZ,SACAA,EAAK,SACD,SACA,iBACWA,EAAK,OAAS,OAAS,cAC5C,GAAIA,EAAK,aAAa,OAAS,EAAG,CAC9B,IAAME,EAAuB,CAAC,GAAG,IAAI,IAAIF,EAAK,aAAa,OAAO,OAAO,CAAC,CAAC,EAC3EC,GAAU,aAAaC,EAAqB,KAAK,IAAI,CAAC,GAC1D,CACA,OAAOD,CACX,ECVO,IAAME,GAAmB,CAE5B,EAAG,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAE,EAEzE,EAAG,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAE,EAE1E,EAAG,CAAC,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAE,CACjF,EACaC,GAAmB,CAE5B,EAAG,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAE,EAE1E,EAAG,CAAC,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,EAAE,EAErE,EAAG,CAAC,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,EAAE,CACzE,EACaC,GAAiB,CAE1B,EAAG,CAAC,MAAO,KAAO,IAAM,EAAE,EAE1B,EAAG,CAAC,MAAO,KAAO,KAAO,EAAE,EAE3B,EAAG,CAAC,MAAO,KAAO,KAAO,EAAE,CAC/B,EAEaC,GAAO,WAEPC,GAAO,WACPC,GAAsB,CAACC,EAAOC,EAASC,EAAYC,IAGjD,KAAK,MAFZH,IAAU,GAES,GAAKC,EAAUC,EAAaC,GAAW,EAGvC,IAAMF,EAAUC,EAAcC,CAHU,EAMtDC,GAAgB,CAACC,EAAeC,IAClCD,IAAkB,EAClBC,IAAY,EAAI,GAAK,GACrBA,IAAY,EAAI,GAAK,GAEnBC,GAAkB,CAACC,EAAMC,IAAW,CAC7C,IAAMC,EAAWD,EAAO,IAClBE,EAAYH,IAAS,GACrBI,EAAcJ,IAAS,GAAM,IAC7BK,EAAaL,IAAS,EAAK,IAC3BM,EAAaN,EAAO,IAC1B,GAAIG,IAAc,KAAQC,IAAe,KAAQC,IAAc,KAAQC,IAAe,IAClF,OAAAL,EAAO,KAAO,EACP,KAMX,GAJAA,EAAO,KAAO,EACVE,IAAc,MAGbC,EAAa,OAAU,IACxB,OAAO,KAEX,IAAMP,EAAiBO,GAAc,EAAK,EACpCZ,EAASY,GAAc,EAAK,EAC5BG,EAAgBF,GAAa,EAAK,GAClCG,EAAkBH,GAAa,EAAK,EACpCV,EAAWU,GAAa,EAAK,EAC7BP,EAAWQ,GAAc,EAAK,EAC9BG,EAAiBH,GAAc,EAAK,EACpCI,EAAaJ,GAAc,EAAK,EAChCK,EAAYL,GAAc,EAAK,EAC/BM,EAAWN,EAAa,EACxBO,EAAchB,IAAkB,EAChCX,GAAiBM,CAAK,IAAIe,CAAY,EACtCpB,GAAiBK,CAAK,IAAIe,CAAY,EAC5C,GAAI,CAACM,GAAeA,IAAgB,GAChC,OAAO,KAEX,IAAMpB,EAAUoB,EAAc,IACxBnB,EAAaN,GAAeS,CAAa,IAAIW,CAAc,EACjE,GAAI,CAACd,GAAcA,IAAe,GAC9B,OAAO,KAEX,IAAMoB,EAAcvB,GAAoBC,EAAOC,EAASC,EAAYC,CAAO,EAC3E,GAAIM,EAAO,WAAa,MAAQA,EAAO,SAAWC,EAAWY,EAEzD,OAAO,KAEX,IAAIC,EACJ,OAAIlB,IAAkB,EAClBkB,EAAsBvB,IAAU,EAAI,IAAM,KAGtCA,IAAU,EACVuB,EAAsB,IAEjBvB,IAAU,EACfuB,EAAsB,KAGtBA,EAAsB,IAGvB,CACH,SAAUb,EACV,UAAWY,EACX,cAAAjB,EACA,MAAAL,EACA,QAAAC,EACA,eAAAe,EACA,WAAAd,EACA,QAAAI,EACA,cAAAW,EACA,UAAAC,EACA,SAAAC,EACA,SAAAC,EACA,oBAAAG,CACJ,CACJ,ECnHO,IAAMC,GAAO,WACdC,GAAqB,SACrBC,GAAgB,IAAI,YAAY,GAAG,EACzC,QAAS,EAAI,EAAG,EAAI,IAAK,IAAK,CAC1B,IAAIC,EAAM,GAAK,GACf,QAASC,EAAI,EAAGA,EAAI,EAAGA,IACnBD,EAAOA,EAAM,WACLA,GAAO,EAAKF,GACbE,GAAO,EAElBD,GAAc,CAAC,EAAKC,IAAQ,EAAK,UACrC,CACO,IAAME,GAAqBC,GAAU,CACxC,IAAMC,EAAOC,EAAWF,CAAK,EACvBG,EAAmBF,EAAK,UAAU,GAAI,EAAI,EAChDA,EAAK,UAAU,GAAI,EAAG,EAAI,EAC1B,IAAIJ,EAAM,EACV,QAASO,EAAI,EAAGA,EAAIJ,EAAM,OAAQI,IAAK,CACnC,IAAMC,EAAOL,EAAMI,CAAC,EACpBP,GAAQA,GAAO,EAAKD,GAAeC,IAAQ,GAAMQ,CAAI,KAAO,CAChE,CACA,OAAAJ,EAAK,UAAU,GAAIE,EAAkB,EAAI,EAClCN,CACX,EACaS,GAAwB,CAACC,EAAMC,EAAWC,IAAwB,CAC3E,IAAIC,EAAoB,EACpBC,EAAmB,KACvB,GAAIJ,EAAK,OAAS,EAEd,GAAIC,EAAU,QAAU,SAAU,CAC9BI,EAAOJ,EAAU,UAAU,EAC3B,IAAMK,EAAkBL,EAAU,WAAW,eAAe,OAEtDM,GAAa,GADFC,GAAKF,EAAkB,CAAC,GACL,GAAM,EACpCG,GAAcT,EAAK,CAAC,EAAIO,IAAa,EAC3C,GAAIE,GAAcR,EAAU,WAAW,eAAe,OAClD,MAAM,IAAI,MAAM,sBAAsB,EAG1C,IAAIS,EAAgBR,EACdS,EAAYV,EAAU,WAAW,eAAeQ,CAAU,EAEhE,GADAL,EAAmBH,EAAU,WAAW,WAAWU,CAAS,EACxDA,IAAc,EAAG,CACjB,IAAMC,GAAYL,EAAW,GAAO,EAC9BM,EAAOb,EAAK,CAAC,EAAIY,EAAW,EAAI,EACtCF,EAAgBT,EAAU,WAAW,WAAWY,CAAI,CACxD,CACAV,EAAoBO,IAAkB,KAC/BA,EAAgBN,GAAqB,EACtC,CACV,MACSH,EAAU,QAAU,SAEzBE,EADYW,GAAiBd,CAAI,EACT,mBAGhC,MAAO,CACH,kBAAAG,EACA,gBAAiBC,CACrB,CACJ,EACaW,GAAoBC,GAAS,CACtC,IAAIC,EAAS,YACb,GAAID,EAAK,aAAc,CACnB,IAAME,EAAuB,CAAC,GAAG,IAAI,IAAIF,EAAK,YAAY,CAAC,EAC3DC,GAAU,aAAaC,EAAqB,KAAK,IAAI,CAAC,GAC1D,CACA,OAAOD,CACX,ECrEO,IAAME,GAAuB,GACvBC,GAAuB,IACvBC,GAAgBD,GAAuB,IAAM,IAC7CE,GAAN,KAAgB,CACnB,YAAYC,EAAQ,CAChB,KAAK,OAASA,EACd,KAAK,IAAM,CACf,CACA,UAAUC,EAAQ,CACd,GAAM,CAAE,KAAAC,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAMF,CAAM,EACjF,YAAK,KAAOA,EACL,IAAI,WAAWC,EAAK,OAAQC,EAAQF,CAAM,CACrD,CACA,QAAS,CACL,GAAM,CAAE,KAAAC,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAM,CAAC,EAC5E,YAAK,KAAO,EACLD,EAAK,SAASC,CAAM,CAC/B,CACA,SAAU,CACN,GAAM,CAAE,KAAAD,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAM,CAAC,EAC5E,YAAK,KAAO,EACLD,EAAK,UAAUC,EAAQ,EAAI,CACtC,CACA,SAAU,CACN,GAAM,CAAE,KAAAD,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAM,CAAC,EAC5E,YAAK,KAAO,EACLD,EAAK,SAASC,EAAQ,EAAI,CACrC,CACA,SAAU,CACN,IAAMC,EAAM,KAAK,QAAQ,EAEzB,OADa,KAAK,QAAQ,EACZ,WAAcA,CAChC,CACA,UAAUH,EAAQ,CACd,GAAM,CAAE,KAAAC,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAMF,CAAM,EACjF,KAAK,KAAOA,EACZ,IAAII,EAAM,GACV,QAAS,EAAI,EAAG,EAAIJ,EAAQ,IACxBI,GAAO,OAAO,aAAaH,EAAK,SAASC,EAAS,CAAC,CAAC,EAExD,OAAOE,CACX,CACA,gBAAiB,CACb,IAAMC,EAAW,KAAK,IAEtB,GADuB,KAAK,QAAQ,IACbC,GACnB,OAAO,KAEX,KAAK,KAAO,EACZ,IAAMC,EAAa,KAAK,OAAO,EACzBC,EAAkB,KAAK,QAAQ,EAC/BC,EAAe,KAAK,QAAQ,EAC5BC,EAAiB,KAAK,QAAQ,EAC9BC,EAAW,KAAK,QAAQ,EACxBC,EAAqB,KAAK,OAAO,EACjCC,EAAe,IAAI,WAAWD,CAAkB,EACtD,QAASE,EAAI,EAAGA,EAAIF,EAAoBE,IACpCD,EAAaC,CAAC,EAAI,KAAK,OAAO,EAElC,IAAMC,EAAa,GAAKH,EAClBI,EAAWH,EAAa,OAAO,CAACI,EAAGC,IAAMD,EAAIC,EAAG,CAAC,EACjDC,EAAYJ,EAAaC,EAC/B,MAAO,CACH,eAAgBX,EAChB,UAAAc,EACA,aAAcd,EAAWU,EACzB,SAAAC,EACA,WAAAT,EACA,gBAAAC,EACA,aAAAC,EACA,eAAAC,EACA,SAAAC,EACA,aAAAE,CACJ,CACJ,CACA,mBAAmBO,EAAO,CACtB,KAAO,KAAK,IAAMA,EAAS,GAAQ,CAC/B,IAAMC,EAAO,KAAK,QAAQ,EACpBC,EAAYD,EAAO,IACnBE,EAAcF,IAAS,EAAK,IAC5BG,EAAaH,IAAS,GAAM,IAC5BI,EAAcJ,IAAS,GAAM,IAC7BK,EAAI,GACV,GAAI,EAAAJ,IAAcI,GAAKH,IAAeG,GAAKF,IAAcE,GAAKD,IAAeC,GAI7E,IADA,KAAK,KAAO,EACRL,IAASf,GAET,MAAO,GAEX,KAAK,KAAO,EAChB,CACA,MAAO,EACX,CACJ,EChGO,IAAMqB,EAAN,KAAc,CACjB,YAAYC,EAAO,CACf,KAAK,MAAQA,CACjB,CACJ,ECHO,IAAMC,EAAmB,IAAI,WAAW,CAAC,EAMnCC,EAAN,MAAMC,CAAc,CACvB,YAEAC,EAEAC,EAKAC,EAEAC,EAOAC,EAAiB,GAAIC,EAAY,CAM7B,GALA,KAAK,KAAOL,EACZ,KAAK,KAAOC,EACZ,KAAK,UAAYC,EACjB,KAAK,SAAWC,EAChB,KAAK,eAAiBC,EAClBJ,IAASH,GAAoBQ,IAAe,OAC5C,MAAM,IAAI,MAAM,iGAAiG,EAKrH,GAHIA,IAAe,SACfA,EAAaL,EAAK,YAElB,EAAEA,aAAgB,YAClB,MAAM,IAAI,UAAU,4BAA4B,EAEpD,GAAIC,IAAS,OAASA,IAAS,QAC3B,MAAM,IAAI,UAAU,uCAAuC,EAE/D,GAAI,CAAC,OAAO,SAASC,CAAS,EAC1B,MAAM,IAAI,UAAU,6BAA6B,EAErD,GAAI,CAAC,OAAO,SAASC,CAAQ,GAAKA,EAAW,EACzC,MAAM,IAAI,UAAU,yCAAyC,EAEjE,GAAI,CAAC,OAAO,SAASC,CAAc,EAC/B,MAAM,IAAI,UAAU,kCAAkC,EAE1D,GAAI,CAAC,OAAO,UAAUC,CAAU,GAAKA,EAAa,EAC9C,MAAM,IAAI,UAAU,4CAA4C,EAEpE,KAAK,WAAaA,CACtB,CAEA,IAAI,gBAAiB,CACjB,OAAO,KAAK,OAASR,CACzB,CAEA,IAAI,sBAAuB,CACvB,OAAO,KAAK,MAAMS,GAA+B,KAAK,SAAS,CACnE,CAEA,IAAI,qBAAsB,CACtB,OAAO,KAAK,MAAMA,GAA+B,KAAK,QAAQ,CAClE,CAEA,qBAAsB,CAClB,GAAI,KAAK,eACL,MAAM,IAAI,UAAU,6DAA6D,EAErF,GAAI,OAAO,kBAAsB,IAC7B,MAAM,IAAI,MAAM,kDAAkD,EAEtE,OAAO,IAAI,kBAAkB,CACzB,KAAM,KAAK,KACX,KAAM,KAAK,KACX,UAAW,KAAK,qBAChB,SAAU,KAAK,mBACnB,CAAC,CACL,CAEA,qBAAsB,CAClB,GAAI,KAAK,eACL,MAAM,IAAI,UAAU,8DAA8D,EAEtF,GAAI,OAAO,kBAAsB,IAC7B,MAAM,IAAI,MAAM,kDAAkD,EAEtE,OAAO,IAAI,kBAAkB,CACzB,KAAM,KAAK,KACX,KAAM,KAAK,KACX,UAAW,KAAK,qBAChB,SAAU,KAAK,mBACnB,CAAC,CACL,CAKA,OAAO,iBAAiBC,EAAO,CAC3B,GAAI,EAAEA,aAAiB,mBAAqBA,aAAiB,mBACzD,MAAM,IAAI,UAAU,0DAA0D,EAElF,IAAMP,EAAO,IAAI,WAAWO,EAAM,UAAU,EAC5C,OAAAA,EAAM,OAAOP,CAAI,EACV,IAAID,EAAcC,EAAMO,EAAM,KAAMA,EAAM,UAAY,KAAMA,EAAM,UAAY,GAAK,GAAG,CACjG,CAEA,MAAMC,EAAS,CACX,GAAIA,IAAY,SAAc,OAAOA,GAAY,UAAYA,IAAY,MACrE,MAAM,IAAI,UAAU,4CAA4C,EAEpE,GAAIA,GAAS,YAAc,QAAa,CAAC,OAAO,SAASA,EAAQ,SAAS,EACtE,MAAM,IAAI,UAAU,qDAAqD,EAE7E,GAAIA,GAAS,WAAa,QAAa,CAAC,OAAO,SAASA,EAAQ,QAAQ,EACpE,MAAM,IAAI,UAAU,oDAAoD,EAE5E,OAAO,IAAIT,EAAc,KAAK,KAAM,KAAK,KAAMS,GAAS,WAAa,KAAK,UAAWA,GAAS,UAAY,KAAK,SAAU,KAAK,eAAgB,KAAK,UAAU,CACjK,CACJ,ECvHO,IAAMC,GAAN,MAAMC,CAAY,CAErB,IAAI,cAAe,CACf,OAAO,KAAK,SAAW,MAAQ,EAAI,KAAK,WAAa,KAAK,WAC9D,CAEA,IAAI,eAAgB,CAChB,OAAO,KAAK,SAAW,MAAQ,EAAI,KAAK,YAAc,KAAK,UAC/D,CAEA,IAAI,sBAAuB,CACvB,OAAO,KAAK,MAAMC,GAA+B,KAAK,SAAS,CACnE,CAEA,IAAI,qBAAsB,CACtB,OAAO,KAAK,MAAMA,GAA+B,KAAK,QAAQ,CAClE,CACA,YAAYC,EAAMC,EAAM,CAGpB,GADA,KAAK,QAAU,GACXD,aAAgB,aAAe,YAAY,OAAOA,CAAI,EAAG,CACzD,GAAI,CAACC,GAAQ,OAAOA,GAAS,SACzB,MAAM,IAAI,UAAU,yBAAyB,EAEjD,GAAI,EAAE,WAAYA,IAAS,OAAOA,EAAK,QAAW,SAC9C,MAAM,IAAI,UAAU,+BAA+B,EAEvD,GAAI,CAAC,OAAO,UAAUA,EAAK,UAAU,GAAKA,EAAK,YAAc,EACzD,MAAM,IAAI,UAAU,6CAA6C,EAErE,GAAI,CAAC,OAAO,UAAUA,EAAK,WAAW,GAAKA,EAAK,aAAe,EAC3D,MAAM,IAAI,UAAU,8CAA8C,EAEtE,GAAIA,EAAK,WAAa,QAAa,CAAC,CAAC,EAAG,GAAI,IAAK,GAAG,EAAE,SAASA,EAAK,QAAQ,EACxE,MAAM,IAAI,UAAU,2DAA2D,EAEnF,GAAI,CAAC,OAAO,SAASA,EAAK,SAAS,EAC/B,MAAM,IAAI,UAAU,kCAAkC,EAE1D,GAAIA,EAAK,WAAa,SAAc,CAAC,OAAO,SAASA,EAAK,QAAQ,GAAKA,EAAK,SAAW,GACnF,MAAM,IAAI,UAAU,8DAA8D,EAEtF,KAAK,MAAQC,GAAaF,CAAI,EAAE,MAAM,EACtC,KAAK,OAASC,EAAK,OACnB,KAAK,WAAaA,EAAK,WACvB,KAAK,YAAcA,EAAK,YACxB,KAAK,SAAWA,EAAK,UAAY,EACjC,KAAK,UAAYA,EAAK,UACtB,KAAK,SAAWA,EAAK,UAAY,EACjC,KAAK,WAAa,IAAI,gBAAgBA,EAAK,UAAU,CACzD,SACS,OAAO,WAAe,KAAeD,aAAgB,WAAY,CACtE,GAAIC,GAAM,WAAa,QAAa,CAAC,CAAC,EAAG,GAAI,IAAK,GAAG,EAAE,SAASA,EAAK,QAAQ,EACzE,MAAM,IAAI,UAAU,2DAA2D,EAEnF,GAAIA,GAAM,YAAc,QAAa,CAAC,OAAO,SAASA,GAAM,SAAS,EACjE,MAAM,IAAI,UAAU,kDAAkD,EAE1E,GAAIA,GAAM,WAAa,SAAc,CAAC,OAAO,SAASA,EAAK,QAAQ,GAAKA,EAAK,SAAW,GACpF,MAAM,IAAI,UAAU,8DAA8D,EAEtF,KAAK,MAAQD,EACb,KAAK,OAASA,EAAK,OACnB,KAAK,WAAaA,EAAK,WACvB,KAAK,YAAcA,EAAK,YACxB,KAAK,SAAWC,GAAM,UAAY,EAClC,KAAK,UAAYA,GAAM,WAAaD,EAAK,UAAY,IACrD,KAAK,SAAWC,GAAM,WAAaD,EAAK,UAAY,GAAK,IACzD,KAAK,WAAaA,EAAK,UAC3B,SACU,OAAO,iBAAqB,KAAeA,aAAgB,kBAC7D,OAAO,gBAAoB,KAAeA,aAAgB,iBAC1D,OAAO,YAAgB,KAAeA,aAAgB,aACtD,OAAO,iBAAqB,KAAeA,aAAgB,kBAC3D,OAAO,kBAAsB,KAAeA,aAAgB,mBAC5D,OAAO,gBAAoB,KAAeA,aAAgB,gBAAkB,CAChF,GAAI,CAACC,GAAQ,OAAOA,GAAS,SACzB,MAAM,IAAI,UAAU,yBAAyB,EAEjD,GAAIA,EAAK,WAAa,QAAa,CAAC,CAAC,EAAG,GAAI,IAAK,GAAG,EAAE,SAASA,EAAK,QAAQ,EACxE,MAAM,IAAI,UAAU,2DAA2D,EAEnF,GAAI,CAAC,OAAO,SAASA,EAAK,SAAS,EAC/B,MAAM,IAAI,UAAU,kCAAkC,EAE1D,GAAIA,EAAK,WAAa,SAAc,CAAC,OAAO,SAASA,EAAK,QAAQ,GAAKA,EAAK,SAAW,GACnF,MAAM,IAAI,UAAU,8DAA8D,EAEtF,GAAI,OAAO,WAAe,IACtB,OAAO,IAAIH,EAAY,IAAI,WAAWE,EAAM,CACxC,UAAW,KAAK,MAAMC,EAAK,UAAYF,EAA4B,EACnE,SAAU,KAAK,OAAOE,EAAK,UAAY,GAAKF,EAA4B,CAC5E,CAAC,EAAGE,CAAI,EAEZ,IAAIE,EAAQ,EACRC,EAAS,EAcb,GAZI,iBAAkBJ,GAClBG,EAAQH,EAAK,aACbI,EAASJ,EAAK,eAET,eAAgBA,GACrBG,EAAQH,EAAK,WACbI,EAASJ,EAAK,aAET,UAAWA,IAChBG,EAAQ,OAAOH,EAAK,KAAK,EACzBI,EAAS,OAAOJ,EAAK,MAAM,GAE3B,CAACG,GAAS,CAACC,EACX,MAAM,IAAI,UAAU,iCAAiC,EAEzD,IAAMC,EAAS,IAAI,gBAAgBF,EAAOC,CAAM,EAC1CE,EAAUD,EAAO,WAAW,KAAM,CAAE,MAAO,GAAO,mBAAoB,EAAK,CAAC,EAClFE,EAAOD,CAAO,EAEdA,EAAQ,UAAUN,EAAM,EAAG,CAAC,EAC5B,KAAK,MAAQK,EACb,KAAK,OAAS,OACd,KAAK,WAAaF,EAClB,KAAK,YAAcC,EACnB,KAAK,SAAWH,EAAK,UAAY,EACjC,KAAK,UAAYA,EAAK,UACtB,KAAK,SAAWA,EAAK,UAAY,EACjC,KAAK,WAAa,IAAI,gBAAgB,CAClC,OAAQ,MACR,UAAW,QACX,SAAU,eACV,UAAW,EACf,CAAC,CACL,KAEI,OAAM,IAAI,UAAU,iEAAiE,CAE7F,CAEA,OAAQ,CACJ,GAAI,KAAK,QACL,MAAM,IAAI,MAAM,wBAAwB,EAG5C,OADAM,EAAO,KAAK,QAAU,IAAI,EACtBC,GAAa,KAAK,KAAK,EAChB,IAAIV,EAAY,KAAK,MAAM,MAAM,EAAG,CACvC,UAAW,KAAK,UAChB,SAAU,KAAK,QACnB,CAAC,EAEI,KAAK,iBAAiB,WACpB,IAAIA,EAAY,KAAK,MAAM,MAAM,EAAG,CACvC,OAAQ,KAAK,OACb,WAAY,KAAK,WACjB,YAAa,KAAK,YAClB,UAAW,KAAK,UAChB,SAAU,KAAK,SACf,WAAY,KAAK,UACrB,CAAC,EAGM,IAAIA,EAAY,KAAK,MAAO,CAC/B,OAAQ,KAAK,OACb,WAAY,KAAK,WACjB,YAAa,KAAK,YAClB,UAAW,KAAK,UAChB,SAAU,KAAK,SACf,WAAY,KAAK,UACrB,CAAC,CAET,CAKA,OAAQ,CACA,KAAK,UAGLU,GAAa,KAAK,KAAK,EACvB,KAAK,MAAM,MAAM,EAGjB,KAAK,MAAQ,KAEjB,KAAK,QAAU,GACnB,CAEA,gBAAiB,CACb,GAAI,KAAK,QACL,MAAM,IAAI,MAAM,wBAAwB,EAG5C,OADAD,EAAO,KAAK,QAAU,IAAI,EACtBC,GAAa,KAAK,KAAK,EAChB,KAAK,MAAM,eAAe,EAE5B,KAAK,iBAAiB,WACpB,KAAK,MAAM,WAGX,KAAK,WAAa,KAAK,YAAc,CAEpD,CAEA,MAAM,OAAOC,EAAa,CACtB,GAAI,CAACC,GAA0BD,CAAW,EACtC,MAAM,IAAI,UAAU,4DAA4D,EAEpF,GAAI,KAAK,QACL,MAAM,IAAI,MAAM,wBAAwB,EAG5C,GADAF,EAAO,KAAK,QAAU,IAAI,EACtBC,GAAa,KAAK,KAAK,EACvB,MAAM,KAAK,MAAM,OAAOC,CAAW,UAE9B,KAAK,iBAAiB,WACdP,GAAaO,CAAW,EAChC,IAAI,KAAK,KAAK,MAElB,CAED,IAAMH,EADS,KAAK,MACG,WAAW,KAAM,CAAE,MAAO,EAAM,CAAC,EACxDC,EAAOD,CAAO,EACd,IAAMK,EAAYL,EAAQ,aAAa,EAAG,EAAG,KAAK,WAAY,KAAK,WAAW,EACjEJ,GAAaO,CAAW,EAChC,IAAIE,EAAU,IAAI,CAC3B,CACJ,CAKA,cAAe,CACX,GAAI,KAAK,QACL,MAAM,IAAI,MAAM,wBAAwB,EAG5C,OADAJ,EAAO,KAAK,QAAU,IAAI,EACtBC,GAAa,KAAK,KAAK,EAChB,IAAI,WAAW,KAAK,MAAO,CAC9B,UAAW,KAAK,qBAChB,SAAU,KAAK,qBAAuB,MAC1C,CAAC,EAEI,KAAK,iBAAiB,WACpB,IAAI,WAAW,KAAK,MAAO,CAC9B,OAAQ,KAAK,OACb,WAAY,KAAK,WACjB,YAAa,KAAK,YAClB,UAAW,KAAK,qBAChB,SAAU,KAAK,oBACf,WAAY,KAAK,UACrB,CAAC,EAGM,IAAI,WAAW,KAAK,MAAO,CAC9B,UAAW,KAAK,qBAChB,SAAU,KAAK,mBACnB,CAAC,CAET,CACA,KAAKF,EAASM,EAAMC,EAAMC,EAAMC,EAAMC,EAAMC,EAAMC,EAAMC,EAAM,CAC1D,IAAIC,EAAK,EACLC,EAAK,EACLC,EAAS,KAAK,aACdC,EAAU,KAAK,cACfC,EAAK,EACLC,EAAK,EACLC,EAAS,KAAK,aACdC,EAAU,KAAK,cAyBnB,GAxBIX,IAAS,QACTI,EAAKR,EACLS,EAAKR,EACLS,EAASR,EACTS,EAAUR,EACVS,EAAKR,EACLS,EAAKR,EACDC,IAAS,QACTQ,EAASR,EACTS,EAAUR,IAGVO,EAASJ,EACTK,EAAUJ,KAIdC,EAAKZ,EACLa,EAAKZ,EACDC,IAAS,SACTY,EAASZ,EACTa,EAAUZ,IAGd,EAAG,OAAO,yBAA6B,KAAeT,aAAmB,0BACrE,OAAO,kCAAsC,KAC1CA,aAAmB,mCAC1B,MAAM,IAAI,UAAU,kFAAkF,EAE1G,GAAI,CAAC,OAAO,SAASc,CAAE,EACnB,MAAM,IAAI,UAAU,sBAAsB,EAE9C,GAAI,CAAC,OAAO,SAASC,CAAE,EACnB,MAAM,IAAI,UAAU,sBAAsB,EAE9C,GAAI,CAAC,OAAO,SAASC,CAAM,GAAKA,EAAS,EACrC,MAAM,IAAI,UAAU,uCAAuC,EAE/D,GAAI,CAAC,OAAO,SAASC,CAAO,GAAKA,EAAU,EACvC,MAAM,IAAI,UAAU,wCAAwC,EAEhE,GAAI,CAAC,OAAO,SAASC,CAAE,EACnB,MAAM,IAAI,UAAU,sBAAsB,EAE9C,GAAI,CAAC,OAAO,SAASC,CAAE,EACnB,MAAM,IAAI,UAAU,sBAAsB,EAE9C,GAAI,CAAC,OAAO,SAASC,CAAM,GAAKA,EAAS,EACrC,MAAM,IAAI,UAAU,uCAAuC,EAE/D,GAAI,CAAC,OAAO,SAASC,CAAO,GAAKA,EAAU,EACvC,MAAM,IAAI,UAAU,wCAAwC,EAEhE,GAAI,KAAK,QACL,MAAM,IAAI,MAAM,wBAAwB,EAIxC,KAAK,WAAa,GAClB,CAACP,EAAIC,EAAIC,EAAQC,CAAO,EAAI,CACxBF,EACA,KAAK,YAAcD,EAAKE,EACxBC,EACAD,CACJ,EAEK,KAAK,WAAa,IACvB,CAACF,EAAIC,CAAE,EAAI,CACP,KAAK,WAAaD,EAAKE,EACvB,KAAK,YAAcD,EAAKE,CAC5B,EAEK,KAAK,WAAa,MACvB,CAACH,EAAIC,EAAIC,EAAQC,CAAO,EAAI,CACxB,KAAK,WAAaF,EAAKE,EACvBH,EACAG,EACAD,CACJ,GAEJ,IAAMM,EAAS,KAAK,oBAAoB,EACxCtB,EAAQ,KAAK,EACb,IAAMuB,EAAUL,EAAKE,EAAS,EACxBI,EAAUL,EAAKE,EAAU,EAC/BrB,EAAQ,UAAUuB,EAASC,CAAO,EAClCxB,EAAQ,OAAO,KAAK,SAAW,KAAK,GAAK,GAAG,EAC5C,IAAMyB,EAAoB,KAAK,SAAW,MAAQ,EAAI,EAAIL,EAASC,EAEnErB,EAAQ,MAAM,EAAIyB,EAAmBA,CAAiB,EACtDzB,EAAQ,UAAUsB,EAAQR,EAAIC,EAAIC,EAAQC,EAAS,CAACG,EAAS,EAAG,CAACC,EAAU,EAAGD,EAAQC,CAAO,EAE7FrB,EAAQ,QAAQ,CACpB,CAOA,qBAAsB,CAClB,GAAI,KAAK,QACL,MAAM,IAAI,MAAM,wBAAwB,EAG5C,GADAC,EAAO,KAAK,QAAU,IAAI,EACtB,KAAK,iBAAiB,WAAY,CAElC,IAAMyB,EAAa,KAAK,aAAa,EACrC,sBAAe,IAAMA,EAAW,MAAM,CAAC,EAChCA,CACX,KAEI,QAAO,KAAK,KAEpB,CAEA,YAAYC,EAAa,CACrB,GAAI,CAAC,CAAC,EAAG,GAAI,IAAK,GAAG,EAAE,SAASA,CAAW,EACvC,MAAM,IAAI,UAAU,yCAAyC,EAGjE,KAAK,SAAWA,CACpB,CAEA,aAAaC,EAAc,CACvB,GAAI,CAAC,OAAO,SAASA,CAAY,EAC7B,MAAM,IAAI,UAAU,gCAAgC,EAGxD,KAAK,UAAYA,CACrB,CAEA,YAAYC,EAAa,CACrB,GAAI,CAAC,OAAO,SAASA,CAAW,GAAKA,EAAc,EAC/C,MAAM,IAAI,UAAU,4CAA4C,EAGpE,KAAK,SAAWA,CACpB,CACJ,EACM3B,GAAgB4B,GACX,OAAO,WAAe,KAAeA,aAAa,WCrZ7D,IAAMC,GAAkCC,GAAY,CAChD,GAAI,CAACA,GAAW,OAAOA,GAAY,SAC/B,MAAM,IAAI,UAAU,4BAA4B,EAEpD,GAAIA,EAAQ,eAAiB,QAAa,OAAOA,EAAQ,cAAiB,UACtE,MAAM,IAAI,UAAU,wDAAwD,CAEpF,EACMC,GAAqBC,GAAc,CACrC,GAAI,OAAOA,GAAc,UAAY,OAAO,MAAMA,CAAS,EACvD,MAAM,IAAI,UAAU,6BAA6B,CAEzD,EAKaC,GAAN,KAAwB,CAC3B,YAAYC,EAAO,CACf,GAAI,EAAEA,aAAiBC,IACnB,MAAM,IAAI,UAAU,8BAA8B,EAEtD,KAAK,OAASD,CAClB,CAKA,eAAeJ,EAAU,CAAC,EAAG,CACzB,OAAAD,GAA+BC,CAAO,EAC/B,KAAK,OAAO,SAAS,eAAeA,CAAO,CACtD,CASA,UAAUE,EAAWF,EAAU,CAAC,EAAG,CAC/B,OAAAC,GAAkBC,CAAS,EAC3BH,GAA+BC,CAAO,EAC/B,KAAK,OAAO,SAAS,UAAUE,EAAWF,CAAO,CAC5D,CAKA,cAAcM,EAAQN,EAAU,CAAC,EAAG,CAChC,GAAI,EAAEM,aAAkBC,GACpB,MAAM,IAAI,UAAU,kCAAkC,EAE1D,OAAAR,GAA+BC,CAAO,EAC/B,KAAK,OAAO,SAAS,cAAcM,EAAQN,CAAO,CAC7D,CAUA,aAAaE,EAAWF,EAAU,CAAC,EAAG,CAClC,OAAAC,GAAkBC,CAAS,EAC3BH,GAA+BC,CAAO,EAC/B,KAAK,OAAO,SAAS,aAAaE,EAAWF,CAAO,CAC/D,CAKA,iBAAiBM,EAAQN,EAAU,CAAC,EAAG,CACnC,GAAI,EAAEM,aAAkBC,GACpB,MAAM,IAAI,UAAU,kCAAkC,EAE1D,OAAAR,GAA+BC,CAAO,EAC/B,KAAK,OAAO,SAAS,iBAAiBM,EAAQN,CAAO,CAChE,CAQA,QAAQQ,EAAaC,EAAWT,EAAU,CAAC,EAAG,CAC1C,GAAIQ,IAAgB,QAAa,EAAEA,aAAuBD,GACtD,MAAM,IAAI,UAAU,uCAAuC,EAE/D,GAAIC,IAAgB,QAAaA,EAAY,gBAAkB,CAACR,GAAS,aACrE,MAAM,IAAI,UAAU,2EAA2E,EAEnG,GAAIS,IAAc,QAAa,EAAEA,aAAqBF,GAClD,MAAM,IAAI,UAAU,qCAAqC,EAE7DR,GAA+BC,CAAO,EACtC,IAAMU,EAAc,CAAC,EACjB,CAAE,QAASC,EAAe,QAASC,CAAgB,EAAIC,EAAqB,EAC5E,CAAE,QAASC,EAAc,QAASC,CAAe,EAAIF,EAAqB,EAC1EG,EAAQ,GACRC,EAAa,GAIbC,EAAiB,KACfC,EAAa,CAAC,EAEdC,EAAe,IAAM,KAAK,IAAI,EAAGD,EAAW,MAAM,EAExD,OAAC,SAAY,CACT,IAAIb,EAASE,GAAe,MAAM,KAAK,eAAeR,CAAO,EAC7D,KAAOM,GAAU,CAACW,GACV,EAAAR,GAAaH,EAAO,gBAAkBG,GAAW,iBAD3B,CAI1B,GAAIC,EAAY,OAASU,EAAa,EAAG,EACpC,CAAE,QAASN,EAAc,QAASC,CAAe,EAAIF,EAAqB,GAC3E,MAAMC,EACN,QACJ,CACAJ,EAAY,KAAKJ,CAAM,EACvBM,EAAgB,EACf,CAAE,QAASD,EAAe,QAASC,CAAgB,EAAIC,EAAqB,EAC7EP,EAAS,MAAM,KAAK,cAAcA,EAAQN,CAAO,CACrD,CACAgB,EAAQ,GACRJ,EAAgB,CACpB,GAAG,EAAE,MAAOS,GAAU,CACbH,IACDA,EAAiBG,EACjBT,EAAgB,EAExB,CAAC,EACM,CACH,MAAM,MAAO,CACT,OAAa,CACT,GAAIK,EACA,MAAO,CAAE,MAAO,OAAW,KAAM,EAAK,EAErC,GAAIC,EACL,MAAMA,EAEL,GAAIR,EAAY,OAAS,EAAG,CAC7B,IAAMY,EAAQZ,EAAY,MAAM,EAC1Ba,EAAM,YAAY,IAAI,EAE5B,IADAJ,EAAW,KAAKI,CAAG,EACZJ,EAAW,OAAS,GAAKI,EAAMJ,EAAW,CAAC,GAAK,KACnDA,EAAW,MAAM,EAErB,OAAAJ,EAAe,EACR,CAAE,MAAAO,EAAO,KAAM,EAAM,CAChC,KACK,IAAIN,EACL,MAAO,CAAE,MAAO,OAAW,KAAM,EAAK,EAGtC,MAAML,EAEd,CACJ,EACA,MAAM,QAAS,CACX,OAAAM,EAAa,GACbF,EAAe,EACfH,EAAgB,EACT,CAAE,MAAO,OAAW,KAAM,EAAK,CAC1C,EACA,MAAM,MAAMS,EAAO,CACf,MAAMA,CACV,EACA,CAAC,OAAO,aAAa,GAAI,CACrB,OAAO,IACX,CACJ,CACJ,CACJ,EACMG,GAAN,KAAqB,CACjB,YAAYC,EAAUC,EAAS,CAC3B,KAAK,SAAWD,EAChB,KAAK,QAAUC,CACnB,CACJ,EAKaC,GAAN,KAA0B,CAE7B,oBAAoBC,EAAiB,EAAGC,EAAe,IAAU,CAC7D5B,GAAkB2B,CAAc,EAChC3B,GAAkB4B,CAAY,EAC9B,IAAMC,EAAc,CAAC,EACjBC,EAAoB,GACpBC,EAAa,KACb,CAAE,QAASrB,EAAe,QAASC,CAAgB,EAAIC,EAAqB,EAC5E,CAAE,QAASC,EAAc,QAASC,CAAe,EAAIF,EAAqB,EAC1EoB,EAAmB,GACnBjB,EAAQ,GACRC,EAAa,GAIbC,EAAiB,KAErB,OAAC,SAAY,CACT,IAAMgB,EAAe,IAAI,MACnBC,EAAU,MAAM,KAAK,eAAgBC,GAAW,CAKlD,GAJArB,EAAe,EACXqB,EAAO,WAAaP,IACpBb,EAAQ,IAERA,EAAO,CACPoB,EAAO,MAAM,EACb,MACJ,CACIJ,IACII,EAAO,UAAYR,GAKnBE,EAAY,KAAKE,CAAU,EAC3BD,EAAoB,IAGpBC,EAAW,MAAM,GAGrBI,EAAO,WAAaR,IACpBE,EAAY,KAAKM,CAAM,EACvBL,EAAoB,IAExBC,EAAaD,EAAoB,KAAOK,EACpCN,EAAY,OAAS,IACrBlB,EAAgB,EACf,CAAE,QAASD,EAAe,QAASC,CAAgB,EAAIC,EAAqB,EAErF,EAAIQ,GAAU,CACLH,IACDG,EAAM,MAAQa,EAAa,MAC3BhB,EAAiBG,EACjBT,EAAgB,EAExB,CAAC,EACKyB,EAAa,KAAK,kBAAkB,EACpCC,EAAY,MAAMD,EAAW,aAAaT,CAAc,GAAK,MAAMS,EAAW,eAAe,EACnG,GAAI,CAACC,EACD,OAEJ,IAAIC,EAAgBD,EAChB7B,EACJ,GAAIoB,EAAe,IAAU,CAKzB,IAAMvB,EAAS,MAAM+B,EAAW,UAAUR,CAAY,EAChDS,EAAahC,EAEbA,EAAO,OAAS,OAASA,EAAO,YAAcuB,EAC1CvB,EACA,MAAM+B,EAAW,iBAAiB/B,CAAM,EAH5C,KAIFgC,IACA7B,EAAY6B,EAEpB,CACA,IAAME,EAAUH,EAAW,QAAQC,EAAW7B,CAAS,EAEvD,IADA,MAAM+B,EAAQ,KAAK,EACZD,GAAiB,CAACvB,GAAO,CAC5B,IAAMI,EAAeqB,GAAoBX,EAAY,MAAM,EAC3D,GAAIA,EAAY,OAASK,EAAQ,mBAAmB,EAAIf,EAAc,EACjE,CAAE,QAASN,EAAc,QAASC,CAAe,EAAIF,EAAqB,GAC3E,MAAMC,EACN,QACJ,CACAqB,EAAQ,OAAOI,CAAa,EAC5B,IAAMG,EAAe,MAAMF,EAAQ,KAAK,EACxC,GAAIE,EAAa,KACb,MAEJH,EAAgBG,EAAa,KACjC,CACA,MAAMF,EAAQ,OAAO,EAChBvB,GACD,MAAMkB,EAAQ,MAAM,EACxBA,EAAQ,MAAM,EACV,CAACJ,GAAqBC,GACtBF,EAAY,KAAKE,CAAU,EAE/BC,EAAmB,GACnBrB,EAAgB,CACpB,GAAG,EAAE,MAAOS,GAAU,CACbH,IACDA,EAAiBG,EACjBT,EAAgB,EAExB,CAAC,EACM,CACH,MAAM,MAAO,CACT,OAAa,CACT,GAAIK,EACA,MAAO,CAAE,MAAO,OAAW,KAAM,EAAK,EAErC,GAAIC,EACL,MAAMA,EAEL,GAAIY,EAAY,OAAS,EAAG,CAC7B,IAAMR,EAAQQ,EAAY,MAAM,EAChC,OAAAf,EAAe,EACR,CAAE,MAAAO,EAAO,KAAM,EAAM,CAChC,SACS,CAACW,EACN,MAAMtB,MAGN,OAAO,CAAE,MAAO,OAAW,KAAM,EAAK,CAE9C,CACJ,EACA,MAAM,QAAS,CACXM,EAAa,GACbD,EAAQ,GACRD,EAAe,EACfH,EAAgB,EAChBoB,GAAY,MAAM,EAClB,QAAWI,KAAUN,EACjBM,EAAO,MAAM,EAEjB,MAAO,CAAE,MAAO,OAAW,KAAM,EAAK,CAC1C,EACA,MAAM,MAAMf,EAAO,CACf,MAAMA,CACV,EACA,CAAC,OAAO,aAAa,GAAI,CACrB,OAAO,IACX,CACJ,CACJ,CAEA,yBAAyBF,EAAY,CACjCwB,GAAoBxB,CAAU,EAC9B,IAAMyB,EAAoBC,GAAgB1B,CAAU,EAC9C2B,EAAuB,CAAC,EACxBhB,EAAc,CAAC,EACjB,CAAE,QAASnB,EAAe,QAASC,CAAgB,EAAIC,EAAqB,EAC5E,CAAE,QAASC,EAAc,QAASC,CAAe,EAAIF,EAAqB,EAC1EoB,EAAmB,GACnBhB,EAAa,GAIbC,EAAiB,KACf6B,EAAeX,GAAW,CAC5BN,EAAY,KAAKM,CAAM,EACvBxB,EAAgB,EACf,CAAE,QAASD,EAAe,QAASC,CAAgB,EAAIC,EAAqB,CACjF,EAEA,OAAC,SAAY,CACT,IAAMqB,EAAe,IAAI,MACnBC,EAAU,MAAM,KAAK,eAAgBC,GAAW,CAElD,GADArB,EAAe,EACXE,EAAY,CACZmB,EAAO,MAAM,EACb,MACJ,CACA,IAAIY,EAAa,EACjB,KAAOF,EAAqB,OAAS,GAC9BV,EAAO,UAAYU,EAAqB,CAAC,EAAI,QAEhDE,IACAF,EAAqB,MAAM,EAE/B,GAAIE,EAAa,EACb,QAASC,EAAI,EAAGA,EAAID,EAAYC,IAE5BF,EAAaE,EAAID,EAAa,EAAIZ,EAAO,MAAM,EAAIA,CAAO,OAI9DA,EAAO,MAAM,CAErB,EAAIf,GAAU,CACLH,IACDG,EAAM,MAAQa,EAAa,MAC3BhB,EAAiBG,EACjBT,EAAgB,EAExB,CAAC,EACKyB,EAAa,KAAK,kBAAkB,EACtCa,EAAa,KACbC,EAAgB,KAGhBC,EAAoB,GAClBC,EAAgB,SAAY,CAC9BC,EAAOH,CAAa,EAEpB,IAAIZ,EAAgBY,EAEpB,IADAhB,EAAQ,OAAOI,CAAa,EACrBA,EAAc,eAAiBa,GAAmB,CACrD,IAAMhC,EAAeqB,GAAoBX,EAAY,MAAM,EAC3D,KAAOA,EAAY,OAASK,EAAQ,mBAAmB,EAAIf,GAAgB,CAACH,IACvE,CAAE,QAASH,EAAc,QAASC,CAAe,EAAIF,EAAqB,GAC3E,MAAMC,EAEV,GAAIG,EACA,MAEJ,IAAMsC,EAAa,MAAMlB,EAAW,cAAcE,CAAa,EAC/De,EAAOC,CAAU,EACjBhB,EAAgBgB,EAChBpB,EAAQ,OAAOoB,CAAU,CAC7B,CACAH,EAAoB,EACxB,EACMI,EAAe,SAAY,CAC7B,MAAMrB,EAAQ,MAAM,EAGpB,QAASc,EAAI,EAAGA,EAAIH,EAAqB,OAAQG,IAC7CF,EAAY,IAAI,EAEpBD,EAAqB,OAAS,CAClC,EACA,cAAiB5C,KAAa0C,EAAmB,CAE7C,GADA3C,GAAkBC,CAAS,EACvBe,EACA,MAEJ,IAAMwC,EAAe,MAAMpB,EAAW,UAAUnC,CAAS,EACnDoC,EAAYmB,GAAgB,MAAMpB,EAAW,aAAanC,CAAS,EACzE,GAAI,CAACoC,EAAW,CACRc,IAAsB,KACtB,MAAMC,EAAc,EACpB,MAAMG,EAAa,GAEvBT,EAAY,IAAI,EAChBG,EAAa,KACb,QACJ,CAEIA,IACIZ,EAAU,iBAAmBa,EAAc,gBACxCM,EAAa,UAAYP,EAAW,aAC3C,MAAMG,EAAc,EACpB,MAAMG,EAAa,GAEvBV,EAAqB,KAAKW,EAAa,SAAS,EAChDL,EAAoB,KAAK,IAAIK,EAAa,eAAgBL,CAAiB,EAC3EF,EAAaO,EACbN,EAAgBb,CACpB,CACKrB,IACGmC,IAAsB,IAEtB,MAAMC,EAAc,EAExB,MAAMG,EAAa,GAEvBrB,EAAQ,MAAM,EACdF,EAAmB,GACnBrB,EAAgB,CACpB,GAAG,EAAE,MAAOS,GAAU,CACbH,IACDA,EAAiBG,EACjBT,EAAgB,EAExB,CAAC,EACM,CACH,MAAM,MAAO,CACT,OAAa,CACT,GAAIK,EACA,MAAO,CAAE,MAAO,OAAW,KAAM,EAAK,EAErC,GAAIC,EACL,MAAMA,EAEL,GAAIY,EAAY,OAAS,EAAG,CAC7B,IAAMR,EAAQQ,EAAY,MAAM,EAChC,OAAAwB,EAAOhC,IAAU,MAAS,EAC1BP,EAAe,EACR,CAAE,MAAAO,EAAO,KAAM,EAAM,CAChC,SACS,CAACW,EACN,MAAMtB,MAGN,OAAO,CAAE,MAAO,OAAW,KAAM,EAAK,CAE9C,CACJ,EACA,MAAM,QAAS,CACXM,EAAa,GACbF,EAAe,EACfH,EAAgB,EAChB,QAAWwB,KAAUN,EACjBM,GAAQ,MAAM,EAElB,MAAO,CAAE,MAAO,OAAW,KAAM,EAAK,CAC1C,EACA,MAAM,MAAMf,EAAO,CACf,MAAMA,CACV,EACA,CAAC,OAAO,aAAa,GAAI,CACrB,OAAO,IACX,CACJ,CACJ,CACJ,EACMoB,GAAuBiB,GAIlBA,IAA2B,EAAI,GAAK,EAEzCC,GAAN,cAAkCnC,EAAe,CAC7C,YAAYC,EAAUC,EAASkC,EAAOC,EAAeC,EAAUC,EAAgB,CAC3E,MAAMtC,EAAUC,CAAO,EACvB,KAAK,SAAWoC,EAChB,KAAK,eAAiBC,EACtB,KAAK,QAAU,KACf,KAAK,cAAgB,KACrB,KAAK,4BAA8B,IAAIC,GACvC,KAAK,uBAAyB,EAC9B,KAAK,YAAc,CAAC,EACpB,IAAMC,EAAiB7B,GAAW,CAM9B,GAAI,KAAK,YAAY,OAAS,GAAMA,EAAO,WAAa8B,EAAK,KAAK,WAAW,EAAE,UAAY,CACvF,QAAW9B,KAAU,KAAK,YACtB,KAAK,sBAAsBA,CAAM,EAErC,KAAK,YAAY,OAAS,CAC9B,CACA,IAAM+B,EAAiBC,EAAwB,KAAK,YAAahC,EAAO,UAAWiC,GAAKA,EAAE,SAAS,EACnG,KAAK,YAAY,OAAOF,EAAiB,EAAG,EAAG/B,CAAM,CACzD,EACMkC,EAAwBC,GAAoB,KAAKF,GAAKA,EAAE,SAAST,EAAOC,CAAa,CAAC,EACxFS,GAEA,KAAK,cAAgB,IAAIA,EAEzB,KAAK,cAAc,MAAQV,EAE3B,KAAK,cAAc,OAASC,EAE5B,KAAK,cAAc,SAAYzB,GAAW,CACtC,GAAI,EAAEA,aAAkBoC,IACpB,MAAM,IAAI,UAAU,wDAAwD,EAEhFP,EAAc7B,CAAM,CACxB,EACK,KAAK,4BAA4B,KAAK,IAAM,KAAK,cAAc,KAAK,CAAC,IAG1E,KAAK,QAAU,IAAI,aAAa,CAC5B,OAAQqC,GAASR,EAAc,IAAIO,GAAYC,CAAK,CAAC,EACrD,MAAO/C,CACX,CAAC,EACD,KAAK,QAAQ,UAAUmC,CAAa,EAE5C,CACA,sBAAsBzB,EAAQ,CAE1BA,EAAO,aAAa,KAAK,MAAMA,EAAO,UAAY,KAAK,cAAc,EAAI,KAAK,cAAc,EAC5FA,EAAO,YAAY,KAAK,MAAMA,EAAO,SAAW,KAAK,cAAc,EAAI,KAAK,cAAc,EAC1FA,EAAO,YAAY,KAAK,QAAQ,EAChC,KAAK,SAASA,CAAM,CACxB,CACA,oBAAqB,CACjB,OAAI,KAAK,cACE,KAAK,wBAGZkB,EAAO,KAAK,OAAO,EACZ,KAAK,QAAQ,gBAE5B,CACA,OAAOhD,EAAQ,CACP,KAAK,eACL,KAAK,yBACA,KAAK,4BACL,KAAK,IAAM,KAAK,cAAc,OAAOA,CAAM,CAAC,EAC5C,KAAK,IAAM,KAAK,wBAAwB,IAG7CgD,EAAO,KAAK,OAAO,EACnB,KAAK,QAAQ,OAAOhD,EAAO,oBAAoB,CAAC,EAExD,CACA,MAAM,OAAQ,CACN,KAAK,cACL,MAAM,KAAK,4BAA4B,KAAK,IAAM,KAAK,cAAc,MAAM,CAAC,GAG5EgD,EAAO,KAAK,OAAO,EACnB,MAAM,KAAK,QAAQ,MAAM,GAE7B,QAAWlB,KAAU,KAAK,YACtB,KAAK,sBAAsBA,CAAM,EAErC,KAAK,YAAY,OAAS,CAC9B,CACA,OAAQ,CACA,KAAK,cACA,KAAK,4BAA4B,KAAK,IAAM,KAAK,cAAc,MAAM,CAAC,GAG3EkB,EAAO,KAAK,OAAO,EACnB,KAAK,QAAQ,MAAM,GAEvB,QAAWlB,KAAU,KAAK,YACtBA,EAAO,MAAM,EAEjB,KAAK,YAAY,OAAS,CAC9B,CACJ,EAKasC,GAAN,cAA8B/C,EAAoB,CACrD,YAAYgD,EAAY,CACpB,GAAI,EAAEA,aAAsBC,GACxB,MAAM,IAAI,UAAU,wCAAwC,EAEhE,MAAM,EACN,KAAK,YAAcD,CACvB,CAEA,MAAM,eAAelD,EAAUC,EAAS,CACpC,GAAI,CAAE,MAAM,KAAK,YAAY,UAAU,EACnC,MAAM,IAAI,MAAM,2GACC,EAErB,IAAMkC,EAAQ,KAAK,YAAY,MACzBE,EAAW,KAAK,YAAY,SAC5BD,EAAgB,MAAM,KAAK,YAAY,iBAAiB,EACxDE,EAAiB,KAAK,YAAY,eACxC,OAAAT,EAAOM,GAASC,CAAa,EACtB,IAAIF,GAAoBlC,EAAUC,EAASkC,EAAOC,EAAeC,EAAUC,CAAc,CACpG,CAEA,mBAAoB,CAChB,OAAO,IAAI5D,GAAkB,KAAK,WAAW,CACjD,CAQA,MAAM,UAAUD,EAAW,CACvBD,GAAkBC,CAAS,EAC3B,cAAiBkC,KAAU,KAAK,yBAAyB,CAAClC,CAAS,CAAC,EAChE,OAAOkC,EAEX,MAAM,IAAI,MAAM,4CAA4C,CAChE,CAQA,QAAQR,EAAiB,EAAGC,EAAe,IAAU,CACjD,OAAO,KAAK,oBAAoBD,EAAgBC,CAAY,CAChE,CASA,oBAAoBV,EAAY,CAC5B,OAAO,KAAK,yBAAyBA,CAAU,CACnD,CACJ,EASa0D,GAAN,KAAiB,CACpB,YAAYF,EAAY3E,EAAU,CAAC,EAAG,CAGlC,GADA,KAAK,iBAAmB,EACpB,EAAE2E,aAAsBC,GACxB,MAAM,IAAI,UAAU,wCAAwC,EAEhE,GAAI5E,GAAW,OAAOA,GAAY,SAC9B,MAAM,IAAI,UAAU,4BAA4B,EAEpD,GAAIA,EAAQ,QAAU,SAAc,CAAC,OAAO,UAAUA,EAAQ,KAAK,GAAKA,EAAQ,OAAS,GACrF,MAAM,IAAI,UAAU,0DAA0D,EAElF,GAAIA,EAAQ,SAAW,SAAc,CAAC,OAAO,UAAUA,EAAQ,MAAM,GAAKA,EAAQ,QAAU,GACxF,MAAM,IAAI,UAAU,2DAA2D,EAEnF,GAAIA,EAAQ,MAAQ,QAAa,CAAC,CAAC,OAAQ,UAAW,OAAO,EAAE,SAASA,EAAQ,GAAG,EAC/E,MAAM,IAAI,UAAU,2EAA2E,EAEnG,GAAIA,EAAQ,QAAU,QACfA,EAAQ,SAAW,QACnBA,EAAQ,MAAQ,OACnB,MAAM,IAAI,UAAU,6FAA6F,EAErH,GAAIA,EAAQ,WAAa,QAAa,CAAC,CAAC,EAAG,GAAI,IAAK,GAAG,EAAE,SAASA,EAAQ,QAAQ,EAC9E,MAAM,IAAI,UAAU,6DAA6D,EAErF,GAAIA,EAAQ,WAAa,SACjB,OAAOA,EAAQ,UAAa,UAAY,CAAC,OAAO,UAAUA,EAAQ,QAAQ,GAAKA,EAAQ,SAAW,GACtG,MAAM,IAAI,UAAU,0CAA0C,EAElE,IAAM8D,EAAW9D,EAAQ,UAAY2E,EAAW,SAC5C,CAACG,EAAOC,CAAM,EAAIjB,EAAW,MAAQ,EACnC,CAACa,EAAW,WAAYA,EAAW,WAAW,EAC9C,CAACA,EAAW,YAAaA,EAAW,UAAU,EAC9CK,EAAsBF,EAAQC,EAEhC/E,EAAQ,QAAU,QAAaA,EAAQ,SAAW,QAClD8E,EAAQ9E,EAAQ,MAChB+E,EAAS,KAAK,MAAMD,EAAQE,CAAmB,GAE1ChF,EAAQ,QAAU,QAAaA,EAAQ,SAAW,QACvD+E,EAAS/E,EAAQ,OACjB8E,EAAQ,KAAK,MAAMC,EAASC,CAAmB,GAE1ChF,EAAQ,QAAU,QAAaA,EAAQ,SAAW,SACvD8E,EAAQ9E,EAAQ,MAChB+E,EAAS/E,EAAQ,QAErB,KAAK,YAAc2E,EACnB,KAAK,OAASG,EACd,KAAK,QAAUC,EACf,KAAK,UAAYjB,EACjB,KAAK,KAAO9D,EAAQ,KAAO,OAC3B,KAAK,iBAAmB,IAAI0E,GAAgBC,CAAU,EACtD,KAAK,YAAc,MAAM,KAAK,CAAE,OAAQ3E,EAAQ,UAAY,CAAE,EAAG,IAAM,IAAI,CAC/E,CAEA,4BAA4BoC,EAAQ,CAChC,IAAI6C,EAAS,KAAK,YAAY,KAAK,gBAAgB,EAC9CA,IACG,OAAO,SAAa,KAEpBA,EAAS,SAAS,cAAc,QAAQ,EACxCA,EAAO,MAAQ,KAAK,OACpBA,EAAO,OAAS,KAAK,SAGrBA,EAAS,IAAI,gBAAgB,KAAK,OAAQ,KAAK,OAAO,EAEtD,KAAK,YAAY,OAAS,IAC1B,KAAK,YAAY,KAAK,gBAAgB,EAAIA,IAG9C,KAAK,YAAY,OAAS,IAC1B,KAAK,kBAAoB,KAAK,iBAAmB,GAAK,KAAK,YAAY,QAE3E,IAAMC,EAAUD,EAAO,WAAW,KAAM,CAAE,MAAO,EAAM,CAAC,EACxD3B,EAAO4B,CAAO,EACdA,EAAQ,eAAe,EAEvB,IAAIC,EACAC,EACAC,EACAC,EACJ,GAAI,KAAK,OAAS,OACdH,EAAK,EACLC,EAAK,EACLC,EAAW,KAAK,OAChBC,EAAY,KAAK,YAEhB,CACD,GAAM,CAACC,EAAaC,CAAY,EAAI,KAAK,UAAY,MAAQ,EACvD,CAACpD,EAAO,WAAYA,EAAO,WAAW,EACtC,CAACA,EAAO,YAAaA,EAAO,UAAU,EACtCqD,EAAQ,KAAK,OAAS,UACtB,KAAK,IAAI,KAAK,OAASF,EAAa,KAAK,QAAUC,CAAY,EAC/D,KAAK,IAAI,KAAK,OAASD,EAAa,KAAK,QAAUC,CAAY,EACrEH,EAAWE,EAAcE,EACzBH,EAAYE,EAAeC,EAC3BN,GAAM,KAAK,OAASE,GAAY,EAChCD,GAAM,KAAK,QAAUE,GAAa,CACtC,CACA,IAAMI,EAAoB,KAAK,UAAY,MAAQ,EAAI,EAAIL,EAAWC,EACtEJ,EAAQ,UAAU,KAAK,OAAS,EAAG,KAAK,QAAU,CAAC,EACnDA,EAAQ,OAAO,KAAK,UAAY,KAAK,GAAK,GAAG,EAG7CA,EAAQ,MAAM,EAAIQ,EAAmBA,CAAiB,EACtDR,EAAQ,UAAU,CAAC,KAAK,OAAS,EAAG,CAAC,KAAK,QAAU,CAAC,EACrDA,EAAQ,UAAU9C,EAAO,oBAAoB,EAAG+C,EAAIC,EAAIC,EAAUC,CAAS,EAC3E,IAAMK,EAAS,CACX,OAAAV,EACA,UAAW7C,EAAO,UAClB,SAAUA,EAAO,QACrB,EACA,OAAAA,EAAO,MAAM,EACNuD,CACX,CAQA,MAAM,UAAUzF,EAAW,CACvBD,GAAkBC,CAAS,EAC3B,IAAMkC,EAAS,MAAM,KAAK,iBAAiB,UAAUlC,CAAS,EAC9D,OAAOkC,GAAU,KAAK,4BAA4BA,CAAM,CAC5D,CAQA,SAASR,EAAiB,EAAGC,EAAe,IAAU,CAClD,OAAO+D,GAAkB,KAAK,iBAAiB,QAAQhE,EAAgBC,CAAY,EAAGO,GAAU,KAAK,4BAA4BA,CAAM,CAAC,CAC5I,CASA,qBAAqBjB,EAAY,CAC7B,OAAOyE,GAAkB,KAAK,iBAAiB,oBAAoBzE,CAAU,EAAGiB,GAAUA,GAAU,KAAK,4BAA4BA,CAAM,CAAC,CAChJ,CACJ,ECh1BO,IAAMyD,GAAN,KAAiB,CAEpB,YAAYC,EAAS,CACjB,KAAK,SAAWA,CACpB,CAEA,cAAe,CACX,OAAO,gBAAgBC,CAC3B,CAEA,cAAe,CACX,OAAO,gBAAgBC,CAC3B,CAEA,IAAI,IAAK,CACL,OAAO,KAAK,SAAS,MAAM,CAC/B,CAEA,IAAI,cAAe,CACf,OAAO,KAAK,SAAS,gBAAgB,CACzC,CAKA,IAAI,gBAAiB,CACjB,OAAO,KAAK,SAAS,kBAAkB,CAC3C,CAMA,mBAAoB,CAChB,OAAO,KAAK,SAAS,kBAAkB,CAC3C,CAEA,iBAAkB,CACd,OAAO,KAAK,SAAS,gBAAgB,CACzC,CASA,MAAM,mBAAmBC,EAAoB,IAAU,CACnD,IAAMC,EAAO,IAAIC,GAAkB,IAAI,EACnCC,EAAiB,IACjBC,EAAe,KACfC,EAAc,EACdC,EAAmB,EACvB,cAAiBC,KAAUN,EAAK,QAAQ,OAAW,OAAW,CAAE,aAAc,EAAK,CAAC,EAAG,CACnF,GAAII,GAAeL,GAEZO,EAAO,WAAaH,EACvB,MAEJD,EAAiB,KAAK,IAAIA,EAAgBI,EAAO,SAAS,EAC1DH,EAAe,KAAK,IAAIA,EAAcG,EAAO,UAAYA,EAAO,QAAQ,EACxEF,IACAC,GAAoBC,EAAO,UAC/B,CACA,MAAO,CACH,YAAAF,EACA,kBAAmBA,EACb,QAAQA,GAAeD,EAAeD,IAAiB,YAAY,EAAE,CAAC,EACtE,EACN,eAAgBE,EACV,QAAQ,EAAIC,GAAoBF,EAAeD,IAAiB,YAAY,EAAE,CAAC,EAC/E,CACV,CACJ,CACJ,EAKaL,EAAN,cAA8BF,EAAW,CAE5C,YAAYC,EAAS,CACjB,MAAMA,CAAO,EACb,KAAK,SAAWA,CACpB,CACA,IAAI,MAAO,CACP,MAAO,OACX,CACA,IAAI,OAAQ,CACR,OAAO,KAAK,SAAS,SAAS,CAClC,CAEA,IAAI,YAAa,CACb,OAAO,KAAK,SAAS,cAAc,CACvC,CAEA,IAAI,aAAc,CACd,OAAO,KAAK,SAAS,eAAe,CACxC,CAEA,IAAI,UAAW,CACX,OAAO,KAAK,SAAS,YAAY,CACrC,CAEA,IAAI,cAAe,CAEf,OADiB,KAAK,SAAS,YAAY,EACzB,MAAQ,EAAI,KAAK,SAAS,cAAc,EAAI,KAAK,SAAS,eAAe,CAC/F,CAEA,IAAI,eAAgB,CAEhB,OADiB,KAAK,SAAS,YAAY,EACzB,MAAQ,EAAI,KAAK,SAAS,eAAe,EAAI,KAAK,SAAS,cAAc,CAC/F,CAEA,eAAgB,CACZ,OAAO,KAAK,SAAS,cAAc,CACvC,CAEA,MAAM,qBAAsB,CACxB,IAAMW,EAAa,MAAM,KAAK,SAAS,cAAc,EACrD,OAAOA,EAAW,YAAc,UAAYA,EAAW,YAAc,YAC9DA,EAAW,WAAa,MAAQA,EAAW,WAAa,OACxDA,EAAW,SAAW,YACjC,CAEA,kBAAmB,CACf,OAAO,KAAK,SAAS,iBAAiB,CAC1C,CACA,MAAM,yBAA0B,CAE5B,OADsB,MAAM,KAAK,SAAS,iBAAiB,IACrC,OAAS,IACnC,CACA,MAAM,WAAY,CACd,GAAI,CACA,IAAMC,EAAgB,MAAM,KAAK,SAAS,iBAAiB,EAC3D,GAAI,CAACA,EACD,MAAO,GAEX,IAAMC,EAAQ,KAAK,SAAS,SAAS,EAErC,OADAC,EAAOD,IAAU,IAAI,EACjBE,GAAoB,KAAKC,GAAKA,EAAE,SAASH,EAAOD,CAAa,CAAC,EACvD,GAEP,OAAO,aAAiB,IACjB,IAEK,MAAM,aAAa,kBAAkBA,CAAa,GACnD,YAAc,EACjC,OACOK,EAAO,CACV,eAAQ,MAAM,mCAAoCA,CAAK,EAChD,EACX,CACJ,CACJ,EAKaf,EAAN,cAA8BH,EAAW,CAE5C,YAAYC,EAAS,CACjB,MAAMA,CAAO,EACb,KAAK,SAAWA,CACpB,CACA,IAAI,MAAO,CACP,MAAO,OACX,CACA,IAAI,OAAQ,CACR,OAAO,KAAK,SAAS,SAAS,CAClC,CAEA,IAAI,kBAAmB,CACnB,OAAO,KAAK,SAAS,oBAAoB,CAC7C,CAEA,IAAI,YAAa,CACb,OAAO,KAAK,SAAS,cAAc,CACvC,CAEA,kBAAmB,CACf,OAAO,KAAK,SAAS,iBAAiB,CAC1C,CACA,MAAM,yBAA0B,CAE5B,OADsB,MAAM,KAAK,SAAS,iBAAiB,IACrC,OAAS,IACnC,CACA,MAAM,WAAY,CACd,GAAI,CACA,IAAMY,EAAgB,MAAM,KAAK,SAAS,iBAAiB,EAC3D,GAAI,CAACA,EACD,MAAO,GAEX,IAAMC,EAAQ,KAAK,SAAS,SAAS,EAKrC,OAJAC,EAAOD,IAAU,IAAI,EACjBK,GAAoB,KAAKF,GAAKA,EAAE,SAASH,EAAOD,CAAa,CAAC,GAG9DA,EAAc,MAAM,WAAW,MAAM,EAC9B,GAGH,OAAO,aAAiB,IACjB,IAEK,MAAM,aAAa,kBAAkBA,CAAa,GACnD,YAAc,EAErC,OACOK,EAAO,CACV,eAAQ,MAAM,mCAAoCA,CAAK,EAChD,EACX,CACJ,CACJ,EC7NO,IAAME,EAAN,KAAa,CAChB,YAAYC,EAAQC,EAAmB,IAAU,CAC7C,KAAK,OAASD,EACd,KAAK,iBAAmBC,EACxB,KAAK,eAAiB,CAAC,EACvB,KAAK,gBAAkB,CAAC,EACxB,KAAK,kBAAoB,KACzB,KAAK,QAAU,EACf,KAAK,iBAAmB,CAC5B,CACA,MAAM,UAAUC,EAAOC,EAAK,CAExB,GADAA,EAAM,KAAK,IAAIA,EAAK,MAAM,KAAK,OAAO,QAAQ,CAAC,EAC3CD,GAASC,EACT,OAEJ,IAAMC,EAAyB,KAAK,gBAAgB,KAAKC,GAAKA,EAAE,OAASH,GAASG,EAAE,KAAOF,CAAG,EAC9F,GAAIC,EAAwB,CAExB,MAAMA,EAAuB,QAC7B,MACJ,CACA,IAAME,EAAQC,EAAwB,KAAK,eAAgBL,EAAOG,GAAKA,EAAE,KAAK,EAC9E,GAAIC,IAAU,GACV,QAASE,EAAIF,EAAOE,EAAI,KAAK,eAAe,OAAQA,IAAK,CACrD,IAAMC,EAAU,KAAK,eAAeD,CAAC,EACrC,GAAIC,EAAQ,MAAQP,EAChB,MAGJ,GADqCO,EAAQ,KAAON,EAGhD,MAER,CAEJ,KAAK,OAAO,SAASD,EAAOC,CAAG,EAC/B,IAAMO,EAAe,KAAK,OAAO,MAAMR,EAAOC,CAAG,EAC3CQ,EAAiB,CAAE,MAAAT,EAAO,IAAAC,EAAK,QAASO,CAAa,EAC3D,KAAK,gBAAgB,KAAKC,CAAc,EACxC,IAAMC,EAAQ,MAAMF,EACpBG,GAAW,KAAK,gBAAiBF,CAAc,EAC/C,KAAK,yBAAyBT,EAAOU,CAAK,CAC9C,CACA,cAAcV,EAAOC,EAAK,CACtB,GAAIA,GAAOD,EACP,MAAO,GAEX,IAAMI,EAAQC,EAAwB,KAAK,eAAgBL,EAAOG,GAAKA,EAAE,KAAK,EAC9E,GAAIC,IAAU,GACV,MAAO,GAEX,QAASE,EAAIF,EAAOE,EAAI,KAAK,eAAe,OAAQA,IAAK,CACrD,IAAMC,EAAU,KAAK,eAAeD,CAAC,EACrC,GAAIC,EAAQ,MAAQP,EAChB,MAGJ,GADqCO,EAAQ,KAAON,EAEhD,MAAO,EAEf,CACA,MAAO,EACX,CACA,yBAAyBD,EAAOU,EAAO,CACnC,IAAMH,EAAU,CACZ,MAAAP,EACA,IAAKA,EAAQU,EAAM,WACnB,MAAAA,EACA,KAAM,IAAI,SAASA,EAAM,MAAM,EAC/B,IAAK,KAAK,SACd,EACIN,EAAQC,EAAwB,KAAK,eAAgBL,EAAOG,GAAKA,EAAE,KAAK,GACxEC,IAAU,IAAM,KAAK,eAAeA,CAAK,EAAE,MAAQG,EAAQ,QAC3DH,IAGJ,KAAK,eAAe,OAAOA,EAAO,EAAGG,CAAO,EAC5C,KAAK,kBAAoBG,EAAM,WAE/B,QAAS,EAAIN,EAAQ,EAAG,EAAI,KAAK,eAAe,OAAQ,IAAK,CACzD,IAAMQ,EAAe,KAAK,eAAe,CAAC,EAC1C,GAAIA,EAAa,OAASL,EAAQ,IAC9B,MAEAA,EAAQ,OAASK,EAAa,OAASA,EAAa,KAAOL,EAAQ,MACnE,KAAK,eAAe,OAAO,EAAG,CAAC,EAC/B,IAER,CAEA,KAAO,KAAK,iBAAmB,KAAK,kBAAoB,KAAK,eAAe,OAAS,GAAG,CACpF,IAAIM,EAAgB,KAChBC,EAAqB,GACzB,QAASR,EAAI,EAAGA,EAAI,KAAK,eAAe,OAAQA,IAAK,CACjD,IAAMS,EAAY,KAAK,eAAeT,CAAC,GACnC,CAACO,GAAiBE,EAAU,IAAMF,EAAc,OAChDA,EAAgBE,EAChBD,EAAqBR,EAE7B,CACAU,EAAOH,CAAa,EACpB,KAAK,kBAAoBA,EAAc,MAAM,WAC7C,KAAK,eAAe,OAAOC,EAAoB,CAAC,CACpD,CACJ,CACA,iBAAiBd,EAAOC,EAAK,CACzB,IAAMgB,EAAaZ,EAAwB,KAAK,eAAgBL,EAAOG,GAAKA,EAAE,KAAK,EAC/EI,EAAU,KACd,GAAIU,IAAe,GACf,QAAS,EAAIA,EAAY,EAAI,KAAK,eAAe,OAAQ,IAAK,CAC1D,IAAMF,EAAY,KAAK,eAAe,CAAC,EACvC,GAAIA,EAAU,MAAQf,EAClB,MAEJ,GAAIC,GAAOc,EAAU,IAAK,CACtBR,EAAUQ,EACV,KACJ,CACJ,CAEJ,GAAI,CAACR,EACD,MAAM,IAAI,MAAM,gCAAgCP,CAAK,KAAKC,CAAG,IAAI,EAErE,OAAAM,EAAQ,IAAM,KAAK,UACZ,CACH,KAAMA,EAAQ,KACd,OAAQA,EAAQ,MAAM,WAAaP,EAAQO,EAAQ,KACvD,CACJ,CACA,YAAYP,EAAOC,EAAK,CACpB,GAAIA,GAAOD,EACP,OAEJ,IAAMiB,EAAaZ,EAAwB,KAAK,eAAgBL,EAAOG,GAAKA,EAAE,KAAK,EACnF,GAAIc,IAAe,GACf,OAEJ,IAAMV,EAAU,KAAK,eAAeU,CAAU,EAC1CV,EAAQ,QAAUP,GAASO,EAAQ,MAAQN,IAG/C,KAAK,eAAe,OAAOgB,EAAY,CAAC,EACxC,KAAK,kBAAoBV,EAAQ,MAAM,WAC3C,CACJ,ECjJO,IAAMW,GAAN,KAAiB,CACpB,YAAYC,EAAQ,CAChB,KAAK,OAASA,EACd,KAAK,IAAM,EACX,KAAK,aAAe,EACxB,CACA,UAAUC,EAAQ,CACd,GAAM,CAAE,KAAAC,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAMF,CAAM,EACjF,YAAK,KAAOA,EACL,IAAI,WAAWC,EAAK,OAAQC,EAAQF,CAAM,CACrD,CACA,SAAU,CACN,GAAM,CAAE,KAAAC,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAM,CAAC,EAC5E,YAAK,KAAO,EACLD,EAAK,UAAUC,EAAQ,KAAK,YAAY,CACnD,CACA,SAAU,CACN,GAAM,CAAE,KAAAD,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAM,CAAC,EAC5E,YAAK,KAAO,EACLD,EAAK,UAAUC,EAAQ,KAAK,YAAY,CACnD,CACA,UAAUF,EAAQ,CACd,GAAM,CAAE,KAAAC,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAMF,CAAM,EACjF,KAAK,KAAOA,EACZ,IAAIG,EAAM,GACV,QAAS,EAAI,EAAG,EAAIH,EAAQ,IACxBG,GAAO,OAAO,aAAaF,EAAK,SAASC,EAAS,CAAC,CAAC,EAExD,OAAOC,CACX,CACJ,ECxBO,IAAIC,GACV,SAAUA,EAAY,CACnBA,EAAWA,EAAW,IAAS,CAAC,EAAI,MACpCA,EAAWA,EAAW,WAAgB,CAAC,EAAI,aAC3CA,EAAWA,EAAW,KAAU,CAAC,EAAI,OACrCA,EAAWA,EAAW,MAAW,CAAC,EAAI,QACtCA,EAAWA,EAAW,WAAgB,KAAK,EAAI,YACnD,GAAGA,IAAeA,EAAa,CAAC,EAAE,EAC3B,IAAMC,GAAN,cAA0BC,CAAQ,CACrC,YAAYC,EAAO,CACf,MAAMA,CAAK,EACX,KAAK,gBAAkB,KACvB,KAAK,UAAY,GACjB,KAAK,SAAW,GAChB,KAAK,UAAY,KACjB,KAAK,OAAS,CAAC,EACf,KAAK,eAAiB,IAAIC,GAAWD,EAAM,WAAW,EACtD,KAAK,YAAc,IAAIC,GAAW,IAAIC,EAAOF,EAAM,OAAQ,GAAK,GAAK,EAAE,CAAC,CAC5E,CACA,MAAM,cAAe,CACjB,OAAO,KAAK,mBAAqB,SAAY,CACzC,IAAMG,EAAiB,MAAM,KAAK,eAAe,OAAO,OAAO,QAAQ,EACjEC,EAAW,KAAK,eAAe,UAAU,CAAC,EAChD,KAAK,eAAe,aAAeA,IAAa,OAChD,IAAMC,EAAgB,KAAK,IAAI,KAAK,eAAe,QAAQ,EAAI,EAAGF,CAAc,EAEhF,GADe,KAAK,eAAe,UAAU,CAAC,IAC/B,OACX,MAAM,IAAI,MAAM,kCAAkC,EAGtD,IADA,KAAK,eAAe,IAAM,GACnB,KAAK,eAAe,IAAME,GAAe,CAC5C,MAAM,KAAK,eAAe,OAAO,UAAU,KAAK,eAAe,IAAK,KAAK,eAAe,IAAM,CAAC,EAC/F,IAAMC,EAAU,KAAK,eAAe,UAAU,CAAC,EACzCC,EAAY,KAAK,eAAe,QAAQ,EACxCC,EAAW,KAAK,eAAe,IACjCF,IAAY,OACZ,MAAM,KAAK,cAAcC,CAAS,EAE7BD,IAAY,SACjB,KAAK,UAAY,KAAK,eAAe,IACrC,KAAK,SAAW,KAAK,IAAIC,EAAWF,EAAgB,KAAK,SAAS,GAEtE,KAAK,eAAe,IAAMG,EAAWD,GAAaA,EAAY,EAClE,CACA,GAAI,CAAC,KAAK,UACN,MAAM,IAAI,MAAM,0CAA0C,EAE9D,GAAI,KAAK,YAAc,GACnB,MAAM,IAAI,MAAM,0CAA0C,EAE9D,IAAME,EAAY,KAAK,UAAU,iBACjC,KAAK,SAAW,KAAK,MAAM,KAAK,SAAWA,CAAS,EAAIA,EACxD,KAAK,OAAO,KAAK,IAAIC,EAAgB,IAAIC,GAAsB,IAAI,CAAC,CAAC,CACzE,GAAG,CACP,CACA,MAAM,cAAcC,EAAM,CACtB,MAAM,KAAK,eAAe,OAAO,UAAU,KAAK,eAAe,IAAK,KAAK,eAAe,IAAMA,CAAI,EAClG,IAAIC,EAAY,KAAK,eAAe,QAAQ,EACtCC,EAAc,KAAK,eAAe,QAAQ,EAC1CC,EAAa,KAAK,eAAe,QAAQ,EAC/C,KAAK,eAAe,KAAO,EAC3B,IAAMC,EAAa,KAAK,eAAe,QAAQ,EAC3CC,EAQJ,GAPIL,IAAS,GACTK,EAAgB,EAGhBA,EAAgB,KAAK,eAAe,QAAQ,EAG5CL,GAAQ,IAAMC,IAAc,IAAQ,CACpC,IAAMK,EAAS,KAAK,eAAe,QAAQ,EACrCC,EAAgBP,EAAO,GAE7B,GADsB,KAAK,IAAIO,EAAeD,CAAM,GAC/B,IAAML,IAAchB,EAAW,WAAY,CAE5D,KAAK,eAAe,KAAO,EAC3B,IAAMuB,EAAY,KAAK,eAAe,UAAU,EAAE,EAElDP,EAAYO,EAAU,CAAC,EAAKA,EAAU,CAAC,GAAK,CAChD,CACJ,EACIP,IAAchB,EAAW,OAASgB,IAAchB,EAAW,QAC3DoB,EAAgB,GAEpB,KAAK,UAAY,CACb,OAAQJ,EACR,iBAAkBC,EAClB,WAAAC,EACA,kBAAmB,KAAK,KAAKE,EAAgB,CAAC,EAC9C,iBAAkBD,CACtB,CACJ,CACA,UAAW,CAEP,GADAK,EAAO,KAAK,SAAS,EACjB,KAAK,UAAU,SAAWxB,EAAW,MACrC,MAAO,OAEX,GAAI,KAAK,UAAU,SAAWA,EAAW,KACrC,MAAO,OAEX,GAAI,KAAK,UAAU,SAAWA,EAAW,IAAK,CAE1C,GAAI,KAAK,UAAU,oBAAsB,EACrC,MAAO,SAEN,GAAI,KAAK,UAAU,oBAAsB,EAC1C,MAAO,UAEN,GAAI,KAAK,UAAU,oBAAsB,EAC1C,MAAO,UAEN,GAAI,KAAK,UAAU,oBAAsB,EAC1C,MAAO,SAEf,CACA,OAAI,KAAK,UAAU,SAAWA,EAAW,YACjC,KAAK,UAAU,oBAAsB,EAC9B,UAGR,IACX,CACA,MAAM,aAAc,CAChB,MAAO,WACX,CACA,MAAM,iBAAkB,CACpB,aAAM,KAAK,aAAa,EACxBwB,EAAO,KAAK,SAAS,EACE,KAAK,SAAW,KAAK,UAAU,iBAC9B,KAAK,UAAU,UAC3C,CACA,MAAM,WAAY,CACd,aAAM,KAAK,aAAa,EACjB,KAAK,MAChB,CACJ,EACMC,GAAwB,KACxBX,GAAN,KAA4B,CACxB,YAAYY,EAAS,CACjB,KAAK,QAAUA,CACnB,CACA,OAAQ,CACJ,MAAO,EACX,CACA,UAAW,CACP,OAAO,KAAK,QAAQ,SAAS,CACjC,CACA,MAAM,kBAAmB,CACrB,IAAMC,EAAQ,KAAK,QAAQ,SAAS,EACpC,OAAKA,GAGLH,EAAO,KAAK,QAAQ,SAAS,EACtB,CACH,MAAAG,EACA,iBAAkB,KAAK,QAAQ,UAAU,iBACzC,WAAY,KAAK,QAAQ,UAAU,UACvC,GAPW,IAQf,CACA,iBAAkB,CACd,OAAO,KAAK,QAAQ,gBAAgB,CACxC,CACA,qBAAsB,CAClB,OAAAH,EAAO,KAAK,QAAQ,SAAS,EACtB,KAAK,QAAQ,UAAU,gBAClC,CACA,eAAgB,CACZ,OAAAA,EAAO,KAAK,QAAQ,SAAS,EACtB,KAAK,QAAQ,UAAU,UAClC,CACA,mBAAoB,CAChB,OAAAA,EAAO,KAAK,QAAQ,SAAS,EACtB,KAAK,QAAQ,UAAU,UAClC,CACA,iBAAkB,CACd,OAAOI,CACX,CACA,MAAM,mBAAoB,CACtB,MAAO,EACX,CACA,MAAM,iBAAiBC,EAAaC,EAAS,CACzCN,EAAO,KAAK,QAAQ,SAAS,EAC7B,IAAMO,EAAcF,EAAcJ,GAAwB,KAAK,QAAQ,UAAU,iBACjF,GAAIM,GAAe,KAAK,QAAQ,SAC5B,OAAO,KAEX,IAAMC,EAAc,KAAK,IAAIP,GAAwB,KAAK,QAAQ,UAAU,iBAAkB,KAAK,QAAQ,SAAWM,CAAW,EAC7HE,EACJ,GAAIH,EAAQ,aACRG,EAAOC,MAEN,CACD,IAAMC,EAAkBV,GAAwB,KAAK,QAAQ,UAAU,iBACjEf,EAAY,KAAK,KAAK,GAAK,GAAKyB,CAAe,EAAIA,EACnDC,EAAa,KAAK,MAAML,EAAcrB,CAAS,EAAIA,EACnD2B,EAAWD,EAAa1B,EAE9B,MAAM,KAAK,QAAQ,YAAY,OAAO,UAAU,KAAK,QAAQ,UAAY0B,EAAY,KAAK,QAAQ,UAAYC,CAAQ,EACtH,KAAK,QAAQ,YAAY,IAAM,KAAK,QAAQ,UAAYN,EACxDE,EAAO,KAAK,QAAQ,YAAY,UAAUD,CAAW,CACzD,CACA,IAAMM,EAAYT,EAAcJ,GAAwB,KAAK,QAAQ,UAAU,WACzEc,EAAWP,EAAc,KAAK,QAAQ,UAAU,iBAAmB,KAAK,QAAQ,UAAU,WAChG,OAAO,IAAIQ,EAAcP,EAAM,MAAOK,EAAWC,EAAUV,EAAaG,CAAW,CACvF,CACA,eAAeF,EAAS,CACpB,OAAO,KAAK,iBAAiB,EAAGA,CAAO,CAC3C,CACA,UAAUQ,EAAWR,EAAS,CAC1BN,EAAO,KAAK,QAAQ,SAAS,EAC7B,IAAMK,EAAc,KAAK,MAAMS,EAAY,KAAK,QAAQ,UAAU,WAAab,EAAqB,EACpG,OAAO,KAAK,iBAAiBI,EAAaC,CAAO,CACrD,CACA,cAAcW,EAAQX,EAAS,CAC3BN,EAAO,KAAK,QAAQ,SAAS,EAC7B,IAAMK,EAAc,KAAK,MAAMY,EAAO,UAAY,KAAK,QAAQ,UAAU,WAAahB,EAAqB,EAC3G,OAAO,KAAK,iBAAiBI,EAAc,EAAGC,CAAO,CACzD,CACA,aAAaQ,EAAWR,EAAS,CAC7B,OAAO,KAAK,UAAUQ,EAAWR,CAAO,CAC5C,CACA,iBAAiBW,EAAQX,EAAS,CAC9B,OAAO,KAAK,cAAcW,EAAQX,CAAO,CAC7C,CACJ,EClOO,IAAMY,GAAN,KAAa,CAChB,aAAc,CAEV,KAAK,aAAe,KAEpB,KAAK,OAAS,IAClB,CAKA,SAAU,CACN,OAAO,KAAK,eAAiB,KAAK,cAAc,CACpD,CACJ,EAqDO,IAAMC,GAAN,cAAyBC,EAAO,CACnC,YAAYC,EAAM,CACd,GAAI,EAAEA,aAAgB,MAClB,MAAM,IAAI,UAAU,sBAAsB,EAE9C,MAAM,EACN,KAAK,MAAQA,CACjB,CAEA,MAAM,MAAMC,EAAOC,EAAK,CAEpB,IAAMC,EAAS,MADD,KAAK,MAAM,MAAMF,EAAOC,CAAG,EACd,YAAY,EACvC,OAAO,IAAI,WAAWC,CAAM,CAChC,CAEA,MAAM,eAAgB,CAClB,OAAO,KAAK,MAAM,IACtB,CACJ,EAMaC,GAAN,cAAwBL,EAAO,CAClC,YAAYM,EAAKC,EAAU,CAAC,EAAG,CAC3B,GAAI,OAAOD,GAAQ,UAAY,EAAEA,aAAe,KAC5C,MAAM,IAAI,UAAU,8BAA8B,EAEtD,GAAI,CAACC,GAAW,OAAOA,GAAY,SAC/B,MAAM,IAAI,UAAU,4BAA4B,EAEpD,GAAIA,EAAQ,cAAgB,SAAc,CAACA,EAAQ,aAAe,OAAOA,EAAQ,aAAgB,UAC7F,MAAM,IAAI,UAAU,wDAAwD,EAEhF,GAAIA,EAAQ,gBAAkB,QAAa,OAAOA,EAAQ,eAAkB,WACxE,MAAM,IAAI,UAAU,2DAA2D,EAEnF,MAAM,EAEN,KAAK,UAAY,KACjB,KAAK,KAAOD,EACZ,KAAK,SAAWC,CACpB,CAEA,MAAM,aAAaC,EAAO,CACtB,IAAMC,EAAU,CAAC,EACbD,IACAC,EAAQ,MAAW,SAASD,EAAM,KAAK,IAAIA,EAAM,IAAM,CAAC,IAE5D,IAAME,EAAW,MAAMC,GAAa,KAAK,KAAMC,GAAmB,KAAK,SAAS,aAAe,CAAC,EAAG,CAC/F,OAAQ,MACR,QAAAH,CACJ,CAAC,EAAG,KAAK,SAAS,gBAAkB,IAAM,KAAK,EAC/C,GAAI,CAACC,EAAS,GACV,MAAM,IAAI,MAAM,kBAAkB,KAAK,IAAI,KAAKA,EAAS,MAAM,IAAIA,EAAS,UAAU,EAAE,EAE5F,IAAMN,EAAS,MAAMM,EAAS,YAAY,EAC1C,OAAKF,IACD,KAAK,UAAYJ,GAEd,CACH,SAAUA,EACV,WAAYM,EAAS,MACzB,CACJ,CAEA,MAAM,MAAMR,EAAOC,EAAK,CACpB,GAAI,KAAK,UACL,OAAO,IAAI,WAAW,KAAK,UAAWD,EAAOC,EAAMD,CAAK,EAE5D,GAAM,CAAE,SAAAQ,EAAU,WAAAG,CAAW,EAAI,MAAM,KAAK,aAAa,CAAE,MAAAX,EAAO,IAAAC,CAAI,CAAC,EAGvE,OAAIU,IAAe,IACE,IAAI,WAAWH,CAAQ,EACxB,SAASR,EAAOC,CAAG,EAEhC,IAAI,WAAWO,CAAQ,CAClC,CAEA,MAAM,eAAgB,CAClB,GAAI,KAAK,UACL,OAAO,KAAK,UAAU,WAG1B,IAAMI,EAAgB,MAAMH,GAAa,KAAK,KAAMC,GAAmB,KAAK,SAAS,aAAe,CAAC,EAAG,CACpG,OAAQ,MACR,QAAS,CAAE,MAAO,WAAY,CAClC,CAAC,EAAG,KAAK,SAAS,gBAAkB,IAAM,KAAK,EAC/C,GAAIE,EAAc,SAAW,IAAK,CAC9B,IAAMC,EAAeD,EAAc,QAAQ,IAAI,eAAe,EAC9D,GAAIC,EAAc,CACd,IAAMC,EAAQD,EAAa,MAAM,sBAAsB,EACvD,GAAIC,GAASA,EAAM,CAAC,EAChB,OAAO,SAASA,EAAM,CAAC,EAAG,EAAE,CAEpC,CACJ,CAEA,GAAM,CAAE,SAAAN,CAAS,EAAI,MAAM,KAAK,aAAa,EAC7C,OAAOA,EAAS,UACpB,CACJ,EC7KO,IAAMO,GAAN,KAAoB,CACvB,YAAYC,EAAQ,CAChB,KAAK,OAASA,EACd,KAAK,IAAM,CACf,CACA,UAAUC,EAAQ,CACd,GAAM,CAAE,KAAAC,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAMF,CAAM,EACjF,YAAK,KAAOA,EACL,IAAI,WAAWC,EAAK,OAAQC,EAAQF,CAAM,CACrD,CACA,QAAS,CACL,GAAM,CAAE,KAAAC,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAM,CAAC,EAC5E,YAAK,MACED,EAAK,SAASC,CAAM,CAC/B,CACA,SAAU,CACN,GAAM,CAAE,KAAAD,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAM,CAAC,EAC5E,YAAK,KAAO,EACLD,EAAK,UAAUC,EAAQ,EAAK,CACvC,CACA,SAAU,CACN,GAAM,CAAE,KAAAD,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAM,CAAC,EAC5E,YAAK,KAAO,EACLD,EAAK,SAASC,EAAQ,EAAK,CACtC,CACA,SAAU,CACN,GAAM,CAAE,KAAAD,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAM,CAAC,EAC5E,KAAK,KAAO,EACZ,IAAMC,EAAOF,EAAK,UAAUC,EAAQ,EAAK,EACnCE,EAAMH,EAAK,SAASC,EAAS,CAAC,EACpC,OAAOC,EAAO,IAAQC,CAC1B,CACA,SAAU,CACN,GAAM,CAAE,KAAAH,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAM,CAAC,EAC5E,YAAK,KAAO,EACLD,EAAK,UAAUC,EAAQ,EAAK,CACvC,CACA,SAAU,CACN,GAAM,CAAE,KAAAD,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAM,CAAC,EAC5E,YAAK,KAAO,EACLD,EAAK,SAASC,EAAQ,EAAK,CACtC,CACA,SAAU,CACN,IAAMC,EAAO,KAAK,QAAQ,EACpBC,EAAM,KAAK,QAAQ,EACzB,OAAOD,EAAO,WAAcC,CAChC,CACA,SAAU,CACN,IAAMD,EAAO,KAAK,QAAQ,EACpBC,EAAM,KAAK,QAAQ,EACzB,OAAOD,EAAO,WAAcC,CAChC,CACA,SAAU,CACN,GAAM,CAAE,KAAAH,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAM,CAAC,EAC5E,YAAK,KAAO,EACLD,EAAK,WAAWC,EAAQ,EAAK,CACxC,CACA,iBAAkB,CACd,OAAO,KAAK,QAAQ,EAAI,KAC5B,CACA,gBAAiB,CACb,OAAO,KAAK,QAAQ,EAAI,UAC5B,CACA,UAAUF,EAAQ,CACd,GAAM,CAAE,KAAAC,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAMF,CAAM,EACjF,KAAK,KAAOA,EACZ,IAAIK,EAAM,GACV,QAAS,EAAI,EAAG,EAAIL,EAAQ,IACxBK,GAAO,OAAO,aAAaJ,EAAK,SAASC,EAAS,CAAC,CAAC,EAExD,OAAOG,CACX,CACA,yBAA0B,CACtB,IAAIC,EAAS,EACb,QAASC,EAAI,EAAGA,EAAI,EAAGA,IAAK,CACxBD,IAAW,EACX,IAAME,EAAW,KAAK,OAAO,EAE7B,GADAF,GAAUE,EAAW,KAChBA,EAAW,OAAU,EACtB,KAER,CACA,OAAOF,CACX,CACA,eAAgB,CACZ,IAAIG,EAAY,KAAK,QAAQ,EACvBC,EAAO,KAAK,UAAU,CAAC,EACzBC,EAAa,EAEjB,OADqBF,IAAc,IAE/BA,EAAY,KAAK,QAAQ,EACzBE,EAAa,IAEV,CAAE,KAAAD,EAAM,UAAAD,EAAW,WAAAE,EAAY,YAAaF,EAAYE,CAAW,CAC9E,CACJ,ECxFO,IAAMC,GAAN,cAA6BC,CAAQ,CACxC,YAAYC,EAAO,CACf,MAAMA,CAAK,EACX,KAAK,aAAe,KACpB,KAAK,OAAS,CAAC,EACf,KAAK,gBAAkB,KACvB,KAAK,eAAiB,GACtB,KAAK,yBAA2B,GAChC,KAAK,YAAc,GACnB,KAAK,aAAe,GACpB,KAAK,sBAAwB,CAAC,EAC9B,KAAK,UAAY,CAAC,EAClB,KAAK,gBAAkB,KACvB,KAAK,oBAAsB,IAAIC,GAC/B,KAAK,eAAiB,IAAIC,GAAcF,EAAM,WAAW,EACzD,KAAK,YAAc,IAAIE,GAAc,IAAIC,EAAOH,EAAM,OAAQ,GAAK,GAAK,EAAE,CAAC,CAC/E,CACA,MAAM,iBAAkB,CACpB,IAAMI,EAAS,MAAM,KAAK,UAAU,EAC9BC,EAAiB,MAAM,QAAQ,IAAID,EAAO,IAAIE,GAAKA,EAAE,gBAAgB,CAAC,CAAC,EAC7E,OAAO,KAAK,IAAI,EAAG,GAAGD,CAAc,CACxC,CACA,MAAM,WAAY,CACd,aAAM,KAAK,aAAa,EACjB,KAAK,OAAO,IAAIE,GAASA,EAAM,UAAU,CACpD,CACA,MAAM,aAAc,CAChB,MAAM,KAAK,aAAa,EACxB,IAAMC,EAAe,MAAM,QAAQ,IAAI,KAAK,OAAO,IAAIF,GAAKA,EAAE,WAAW,wBAAwB,CAAC,CAAC,EACnG,OAAOG,GAAqB,CACxB,YAAa,KAAK,YAClB,SAAU,KAAK,OAAO,KAAKH,GAAKA,EAAE,MAAM,OAAS,OAAO,EACxD,SAAU,KAAK,OAAO,KAAKA,GAAKA,EAAE,MAAM,OAAS,OAAO,EACxD,aAAcE,EAAa,OAAO,OAAO,CAC7C,CAAC,CACL,CACA,cAAe,CACX,OAAO,KAAK,mBAAqB,SAAY,CACzC,IAAME,EAAa,MAAM,KAAK,eAAe,OAAO,OAAO,QAAQ,EACnE,KAAO,KAAK,eAAe,IAAMA,GAAY,CACzC,MAAM,KAAK,eAAe,OAAO,UAAU,KAAK,eAAe,IAAK,KAAK,eAAe,IAAM,EAAmB,EACjH,IAAMC,EAAW,KAAK,eAAe,IAC/BC,EAAU,KAAK,eAAe,cAAc,EAClD,GAAIA,EAAQ,OAAS,OAAQ,CACzB,IAAMC,EAAa,KAAK,eAAe,UAAU,CAAC,EAClD,KAAK,YAAcA,IAAe,MACtC,SACSD,EAAQ,OAAS,OAAQ,CAE9B,MAAM,KAAK,eAAe,OAAO,UAAU,KAAK,eAAe,IAAK,KAAK,eAAe,IAAMA,EAAQ,WAAW,EACjH,KAAK,oBAAoBA,EAAQ,WAAW,EAC5C,QAAWL,KAAS,KAAK,OAAQ,CAG7B,IAAMO,EAAoCP,EAAM,iCAAmC,KAAK,eACxFA,EAAM,gBAAkB,KAAK,MAAMO,EAAoCP,EAAM,SAAS,CAC1F,CACA,KACJ,CACA,KAAK,eAAe,IAAMI,EAAWC,EAAQ,SACjD,CACA,GAAI,KAAK,aAAc,CAEnB,MAAM,KAAK,eAAe,OAAO,UAAUF,EAAa,EAAGA,CAAU,EACrE,KAAK,eAAe,IAAMA,EAAa,EACvC,IAAMK,EAAW,KAAK,eAAe,QAAQ,EACvCC,EAAmBN,EAAaK,EACtC,GAAIC,GAAoB,GAAKA,EAAmBN,EAAY,CACxD,MAAM,KAAK,eAAe,OAAO,UAAUM,EAAkBN,CAAU,EACvE,KAAK,eAAe,IAAMM,EAC1B,IAAMJ,EAAU,KAAK,eAAe,cAAc,EAC9CA,EAAQ,OAAS,QAEjB,KAAK,oBAAoBA,EAAQ,WAAW,CAEpD,CACJ,CACJ,GAAG,CACP,CACA,uBAAuBK,EAAe,CAClC,GAAIA,EAAc,YACd,OAAOA,EAAc,YAEzB,IAAMC,EAAc,CAChB,oBAAqB,CAAC,EACtB,6BAA8B,CAAC,EAC/B,YAAa,CAAC,EACd,iBAAkB,KAClB,aAAc,CAAC,EACf,cAAe,CAAC,EAChB,uBAAwB,KACxB,8BAA+B,IACnC,EASA,GARAD,EAAc,YAAcC,EAC5B,KAAK,eAAe,IAAMD,EAAc,sBACxC,KAAK,aAAeA,EACpB,KAAK,YAAY,EACjB,KAAK,aAAe,KACDA,EAAc,MAAM,OAAS,SACzCA,EAAc,KAAK,OACnBE,GAAiB,SAASF,EAAc,KAAK,KAAK,GACvCC,EAAY,6BAA6B,SAAW,EAAG,CAQrEE,EAAOH,EAAc,MAAM,OAAS,OAAO,EAC3C,IAAMI,EAAUC,GAAcL,EAAc,KAAK,KAAK,EAChDM,EAAyB,CAAC,EAC1BC,EAAiB,CAAC,EACxB,QAASC,EAAI,EAAGA,EAAIP,EAAY,cAAc,OAAQO,IAAK,CACvD,IAAMC,EAAaR,EAAY,cAAcO,CAAC,EACxCE,EAAYT,EAAY,cAAcO,EAAI,CAAC,EAC3CG,GAAcD,EAAYA,EAAU,gBAAkBT,EAAY,aAAa,QAC/EQ,EAAW,gBACjB,QAASG,EAAI,EAAGA,EAAID,EAAYC,IAAK,CACjC,IAAMC,EAAmBJ,EAAW,iBAAmBG,EAAIH,EAAW,gBAChEK,EAAiBD,EAAmBJ,EAAW,gBAC/CM,EAAwBC,EAAwBf,EAAY,oBAAqBY,EAAkBxB,GAAKA,EAAE,UAAU,EACpH4B,EAAmBhB,EAAY,oBAAoBc,CAAqB,EACxEG,EAAsBF,EAAwBf,EAAY,oBAAqBa,EAAgBzB,GAAKA,EAAE,UAAU,EAChH8B,EAAiBlB,EAAY,oBAAoBiB,CAAmB,EACpEE,EAAuBH,EAAiB,sBACvCJ,EAAmBI,EAAiB,YAAcA,EAAiB,MAGpEI,EAFsBF,EAAe,sBACpCL,EAAiBK,EAAe,YAAcA,EAAe,MAChCC,EAC9BE,EAAwBC,EAAKjB,CAAsB,EACrDgB,GAAyBA,EAAsB,QAAUD,EACzDC,EAAsB,QAItBhB,EAAuB,KAAK,CACxB,WAAYG,EAAW,gBAAkBG,EACzC,qBAAsBQ,EACtB,MAAO,EACP,MAAAC,CACJ,CAAC,EAML,IAAMG,EAAYf,EAAW,gBACvBL,EAAQ,WACRJ,EAAc,KAAK,iBACzBO,EAAe,KAAKiB,CAAS,CACjC,CACAf,EAAW,iBAAmBA,EAAW,gBACzCA,EAAW,gBAAkB,CACjC,CACAR,EAAY,oBAAsBK,EAClCL,EAAY,YAAcM,CAC9B,CACA,GAAIN,EAAY,6BAA6B,OAAS,EAAG,CAGrDA,EAAY,uBAAyB,CAAC,EACtC,QAAWwB,KAASxB,EAAY,oBAC5B,QAAS,EAAI,EAAG,EAAIwB,EAAM,MAAO,IAC7BxB,EAAY,uBAAuB,KAAK,CACpC,sBAAuBwB,EAAM,qBAAuB,EAAIA,EAAM,MAC9D,YAAaA,EAAM,WAAa,CACpC,CAAC,EAGT,QAAWA,KAASxB,EAAY,6BAC5B,QAAS,EAAI,EAAG,EAAIwB,EAAM,MAAO,IAAK,CAClC,IAAMC,EAAcD,EAAM,WAAa,EACjCE,EAAS1B,EAAY,uBAAuByB,CAAW,EACxDC,IAGLA,EAAO,uBAAyBF,EAAM,OAC1C,CAEJxB,EAAY,uBAAuB,KAAK,CAAC2B,EAAGC,IAAMD,EAAE,sBAAwBC,EAAE,qBAAqB,EACnG5B,EAAY,8BAAgC,MAAMA,EAAY,uBAAuB,MAAM,EAAE,KAAK,EAAE,EACpG,QAASO,EAAI,EAAGA,EAAIP,EAAY,uBAAuB,OAAQO,IAC3DP,EAAY,8BAA8BA,EAAY,uBAAuBO,CAAC,EAAE,WAAW,EAAIA,CAEvG,CAIA,OAAOP,CACX,CACA,MAAM,cAAe,CACjB,IAAMP,EAAW,KAAK,eAAe,IACrC,MAAM,KAAK,eAAe,OAAO,UAAU,KAAK,eAAe,IAAK,KAAK,eAAe,IAAM,EAAmB,EACjH,IAAMoC,EAAc,KAAK,eAAe,cAAc,EACtD3B,EAAO2B,EAAY,OAAS,MAAM,EAClC,IAAMC,EAAe,KAAK,eAAe,IACzC,MAAM,KAAK,eAAe,OAAO,UAAUA,EAAcA,EAAeD,EAAY,WAAW,EAC/F,KAAK,eAAe,IAAMpC,EAC1B,KAAK,YAAY,EACjB,IAAMsC,EAAQC,EAAkB,KAAK,UAAWvC,EAAUL,GAAKA,EAAE,UAAU,EAC3Ec,EAAO6B,IAAU,EAAE,EACnB,IAAME,EAAW,KAAK,UAAUF,CAAK,EACrC7B,EAAO+B,EAAS,aAAexC,CAAQ,EAGvC,KAAK,eAAe,OAAO,YAAYqC,EAAcA,EAAeD,EAAY,WAAW,EAG3F,OAAW,CAACK,EAASC,CAAS,IAAKF,EAAS,UAAW,CACnD,GAAIE,EAAU,sBACV,SAEJ,IAAMpC,EAAgB,KAAK,OAAO,KAAKX,GAAKA,EAAE,KAAO8C,CAAO,EAC5D,KAAK,eAAe,IAAM,EAC1B,IAAIE,EAAkB,KAClBC,EAAe,KACbN,EAAQhB,EAAwBhB,EAAc,UAAWN,EAAW,EAAGL,GAAKA,EAAE,UAAU,EAC1F2C,IAAU,KAGVK,EAAkBrC,EAAc,UAAUgC,CAAK,EAC/CM,EAAeD,EACf,KAAK,eAAe,IAAMA,EAAgB,WAAaA,EAAgB,UAE3E,IAAIE,EAA8B,KAAK,eAAe,MAAQ,EAC9D,KAAO,KAAK,eAAe,IAAM7C,GAAU,CACvC,GAAI2C,GAAiB,aACjBA,EAAkBA,EAAgB,aAClC,KAAK,eAAe,IAAMA,EAAgB,WAAaA,EAAgB,aAEtE,CACD,MAAM,KAAK,eAAe,OAAO,UAAU,KAAK,eAAe,IAAK,KAAK,eAAe,IAAM,EAAmB,EACjH,IAAM3C,EAAW,KAAK,eAAe,IAC/BC,EAAU,KAAK,eAAe,cAAc,EAClD,GAAIA,EAAQ,OAAS,OAAQ,CACzB,IAAMqC,EAAQC,EAAkB,KAAK,UAAWvC,EAAUL,GAAKA,EAAE,UAAU,EACvE6C,EACAF,IAAU,IACV,KAAK,eAAe,IAAMtC,EAC1BwC,EAAW,MAAM,KAAK,aAAa,GAInCA,EAAW,KAAK,UAAUF,CAAK,EAG/BK,IACAA,EAAgB,aAAeH,GACnCG,EAAkBH,EACdK,IACAL,EAAS,yBAA2B,GACpCK,EAA8B,GAEtC,CACA,KAAK,eAAe,IAAM7C,EAAWC,EAAQ,SACjD,CACI0C,GAAmBA,EAAgB,UAAU,IAAIF,CAAO,IACxDG,EAAeD,EAEvB,CACA,GAAIC,EAAc,CACd,IAAME,EAAiBF,EAAa,UAAU,IAAIH,CAAO,EACzDhC,EAAOqC,EAAe,qBAAqB,EAC3CC,GAAmCL,EAAWI,EAAe,YAAY,CAC7E,CACAJ,EAAU,sBAAwB,EACtC,CACA,OAAOF,CACX,CACA,oBAAoBQ,EAAW,CAC3B,IAAMC,EAAa,KAAK,eAAe,IACvC,KAAO,KAAK,eAAe,IAAMA,GAAcD,EAAY,GACvD,KAAK,YAAY,CAEzB,CACA,aAAc,CACV,IAAMhD,EAAW,KAAK,eAAe,IAC/BC,EAAU,KAAK,eAAe,cAAc,EAC5CiD,EAAYlD,EAAWC,EAAQ,UACrC,OAAQA,EAAQ,KAAM,CAClB,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OAEG,KAAK,oBAAoBA,EAAQ,WAAW,EAGhD,MACJ,IAAK,OACD,CACI,IAAMkD,EAAU,KAAK,eAAe,OAAO,EAC3C,KAAK,eAAe,KAAO,EACvBA,IAAY,GACZ,KAAK,eAAe,KAAO,GAC3B,KAAK,eAAiB,KAAK,eAAe,QAAQ,EAClD,KAAK,yBAA2B,KAAK,eAAe,QAAQ,IAG5D,KAAK,eAAe,KAAO,EAC3B,KAAK,eAAiB,KAAK,eAAe,QAAQ,EAClD,KAAK,yBAA2B,KAAK,eAAe,QAAQ,EAEpE,CAEA,MACJ,IAAK,OACD,CACI,IAAMvD,EAAQ,CACV,GAAI,GACJ,QAAS,KACT,WAAY,KACZ,KAAM,KACN,UAAW,GACX,yBAA0B,GAC1B,yBAA0B,GAC1B,SAAU,EACV,aAAcwD,EACd,sBAAuB,GACvB,YAAa,KACb,oBAAqB,KACrB,qBAAsB,KACtB,UAAW,CAAC,EACZ,sBAAuB,CAAC,EACxB,iCAAkC,EAClC,eAAgB,CACpB,EAGA,GAFA,KAAK,aAAexD,EACpB,KAAK,oBAAoBK,EAAQ,WAAW,EACxCL,EAAM,KAAO,IAAMA,EAAM,YAAc,IAAMA,EAAM,OAAS,MAC5D,GAAIA,EAAM,KAAK,OAAS,SAAWA,EAAM,KAAK,QAAU,GAAI,CACxD,IAAMyD,EAAazD,EACnBA,EAAM,WAAa,IAAI0D,EAAgB,IAAIC,GAAyBF,CAAU,CAAC,EAC/E,KAAK,OAAO,KAAKzD,CAAK,CAC1B,SACSA,EAAM,KAAK,OAAS,SAAWA,EAAM,KAAK,mBAAqB,GAAI,CACxE,IAAM4D,EAAa5D,EACnBA,EAAM,WAAa,IAAI6D,EAAgB,IAAIC,GAAyBF,CAAU,CAAC,EAC/E,KAAK,OAAO,KAAK5D,CAAK,CAC1B,EAEJ,KAAK,aAAe,IACxB,CAEA,MACJ,IAAK,OACD,CACI,IAAMA,EAAQ,KAAK,aACnBa,EAAOb,CAAK,EACZ,IAAMuD,EAAU,KAAK,eAAe,OAAO,EAG3C,GAAI,GAFU,KAAK,eAAe,QAAQ,EACZ,KAAS,GAEnC,MAGJ,GAAIA,IAAY,EACZ,KAAK,eAAe,KAAO,EAC3BvD,EAAM,GAAK,KAAK,eAAe,QAAQ,EACvC,KAAK,eAAe,KAAO,EAC3BA,EAAM,yBAA2B,KAAK,eAAe,QAAQ,UAExDuD,IAAY,EACjB,KAAK,eAAe,KAAO,GAC3BvD,EAAM,GAAK,KAAK,eAAe,QAAQ,EACvC,KAAK,eAAe,KAAO,EAC3BA,EAAM,yBAA2B,KAAK,eAAe,QAAQ,MAG7D,OAAM,IAAI,MAAM,kCAAkCuD,CAAO,GAAG,EAEhE,KAAK,eAAe,KAAO,EAAI,EAAI,EAAI,EAAI,EAAI,EAC/C,IAAMQ,EAAS,CACX,KAAK,eAAe,gBAAgB,EACpC,KAAK,eAAe,gBAAgB,EACpC,KAAK,eAAe,eAAe,EACnC,KAAK,eAAe,gBAAgB,EACpC,KAAK,eAAe,gBAAgB,EACpC,KAAK,eAAe,eAAe,EACnC,KAAK,eAAe,gBAAgB,EACpC,KAAK,eAAe,gBAAgB,EACpC,KAAK,eAAe,eAAe,CACvC,EACMC,EAAWC,GAAkBC,GAAgBC,GAA0BJ,CAAM,EAAG,EAAE,CAAC,EACzFlD,EAAOmD,IAAa,GAAKA,IAAa,IAAMA,IAAa,KAAOA,IAAa,GAAG,EAChFhE,EAAM,SAAWgE,CACrB,CAEA,MACJ,IAAK,OACD,CACI,IAAMhE,EAAQ,KAAK,aACnBa,EAAOb,CAAK,EACZ,IAAMuD,EAAU,KAAK,eAAe,OAAO,EAC3C,KAAK,eAAe,KAAO,EAC3B,IAAIa,EAAqB,GACrBC,EAA2B,EACzBC,EAAa,KAAK,eAAe,QAAQ,EAC/C,QAASpD,EAAI,EAAGA,EAAIoD,EAAYpD,IAAK,CACjC,IAAMqD,EAAkBhB,IAAY,EAC9B,KAAK,eAAe,QAAQ,EAC5B,KAAK,eAAe,QAAQ,EAC5BiB,EAAYjB,IAAY,EACxB,KAAK,eAAe,QAAQ,EAC5B,KAAK,eAAe,QAAQ,EAC5BkB,EAAY,KAAK,eAAe,gBAAgB,EACtD,GAAIF,IAAoB,EAIxB,IAAIH,EAAoB,CACpB,QAAQ,KAAK,2FAA2F,EACxG,KACJ,CACA,GAAII,IAAc,GAAI,CAClBH,GAA4BE,EAC5B,QACJ,CACA,GAAIE,IAAc,EAAG,CACjB,QAAQ,KAAK,oDAAoD,EACjE,KACJ,CACAzE,EAAM,iCAAmCqE,EACzCrE,EAAM,eAAiBwE,EACvBJ,EAAqB,GACzB,CACJ,CAEA,MACJ,IAAK,OACD,CACI,IAAMpE,EAAQ,KAAK,aACnBa,EAAOb,CAAK,EACZ,IAAMuD,EAAU,KAAK,eAAe,OAAO,EAC3C,KAAK,eAAe,KAAO,EACvBA,IAAY,GACZ,KAAK,eAAe,KAAO,EAC3BvD,EAAM,UAAY,KAAK,eAAe,QAAQ,EAC9CA,EAAM,yBAA2B,KAAK,eAAe,QAAQ,GAExDuD,IAAY,IACjB,KAAK,eAAe,KAAO,GAC3BvD,EAAM,UAAY,KAAK,eAAe,QAAQ,EAC9CA,EAAM,yBAA2B,KAAK,eAAe,QAAQ,GAEjE,IAAI0E,EAAW,KAAK,eAAe,QAAQ,EAC3C,GAAIA,EAAW,EAAG,CACd1E,EAAM,aAAe,GACrB,QAASkB,EAAI,EAAGA,EAAI,EAAGA,IACnBlB,EAAM,aAAe,OAAO,aAAa,IAAQ0E,EAAW,GAAQ,EAAI1E,EAAM,aAC9E0E,IAAa,EAEZC,GAA0B3E,EAAM,YAAY,IAE7CA,EAAM,aAAewD,EAE7B,CACJ,CAEA,MACJ,IAAK,OACD,CACI,IAAMxD,EAAQ,KAAK,aACnBa,EAAOb,CAAK,EACZ,KAAK,eAAe,KAAO,EAC3B,IAAM4E,EAAc,KAAK,eAAe,UAAU,CAAC,EAC/CA,IAAgB,OAChB5E,EAAM,KAAO,CACT,KAAM,QACN,MAAO,GACP,OAAQ,GACR,MAAO,KACP,iBAAkB,KAClB,WAAY,KACZ,aAAc,KACd,cAAe,KACf,aAAc,KACd,aAAc,IAClB,EAEK4E,IAAgB,SACrB5E,EAAM,KAAO,CACT,KAAM,QACN,iBAAkB,GAClB,WAAY,GACZ,MAAO,KACP,iBAAkB,KAClB,aAAc,IAClB,EAER,CAEA,MACJ,IAAK,OACD,CACI,IAAMA,EAAQ,KAAK,aACnBa,EAAOb,CAAK,EACZA,EAAM,sBAAwBI,EAC9B,KAAK,oBAAoBC,EAAQ,WAAW,CAChD,CAEA,MACJ,IAAK,OACD,CACI,IAAML,EAAQ,KAAK,aAEnB,GADAa,EAAOb,CAAK,EACRA,EAAM,OAAS,MAAQA,EAAM,YAC7B,MAEJ,IAAM6E,EAAc,KAAK,eAAe,OAAO,EAC/C,KAAK,eAAe,KAAO,EAC3B,IAAMC,EAAU,KAAK,eAAe,QAAQ,EAC5C,QAAS5D,EAAI,EAAGA,EAAI4D,EAAS5D,IAAK,CAC9B,IAAMd,EAAW,KAAK,eAAe,IAC/B2E,EAAgB,KAAK,eAAe,cAAc,EAClDC,EAAmBD,EAAc,KAAK,YAAY,EACxD,GAAI/E,EAAM,KAAK,OAAS,QAChBgF,IAAqB,OACrBhF,EAAM,KAAK,MAAQ,MAEdgF,IAAqB,QAAUA,IAAqB,OACzDhF,EAAM,KAAK,MAAQ,OAEdgF,IAAqB,OAC1BhF,EAAM,KAAK,MAAQ,MAEdgF,IAAqB,OAC1BhF,EAAM,KAAK,MAAQ,MAEdgF,IAAqB,OAC1BhF,EAAM,KAAK,MAAQ,MAGnB,QAAQ,KAAK,+CAA+C+E,EAAc,IAAI,KAAK,EAEvF,KAAK,eAAe,KAAO,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EACnD/E,EAAM,KAAK,MAAQ,KAAK,eAAe,QAAQ,EAC/CA,EAAM,KAAK,OAAS,KAAK,eAAe,QAAQ,EAChD,KAAK,eAAe,KAAO,GAC3B,KAAK,oBAAqBI,EAAW2E,EAAc,UAAa,KAAK,eAAe,GAAG,MAEtF,CACGC,IAAqB,SAGhBA,IAAqB,OAC1BhF,EAAM,KAAK,MAAQ,OAEdgF,IAAqB,OAC1BhF,EAAM,KAAK,MAAQ,OAEdgF,IAAqB,QACvBA,IAAqB,QACrBA,IAAqB,QACrBA,IAAqB,QACrBA,IAAqB,QACrBA,IAAqB,QACrBA,IAAqB,QACrBA,IAAqB,QACrBA,IAAqB,QACrBA,IAAqB,SAKnBA,IAAqB,OAC1BhF,EAAM,KAAK,MAAQ,OAEdgF,IAAqB,OAC1BhF,EAAM,KAAK,MAAQ,OAGnB,QAAQ,KAAK,+CAA+C+E,EAAc,IAAI,KAAK,IAEvF,KAAK,eAAe,KAAO,EAAI,EAAI,EACnC,IAAMxB,EAAU,KAAK,eAAe,QAAQ,EAC5C,KAAK,eAAe,KAAO,EAAI,EAC/B,IAAI0B,EAAe,KAAK,eAAe,QAAQ,EAC3CC,EAAa,KAAK,eAAe,QAAQ,EAC7C,KAAK,eAAe,KAAO,EAAI,EAE/B,IAAIC,EAAa,KAAK,eAAe,QAAQ,EAAI,MACjD,GAAIN,IAAgB,GAAKtB,EAAU,GAE/B,GAAIA,IAAY,EACZ,KAAK,eAAe,KAAO,EAC3B2B,EAAa,EAAI,KAAK,eAAe,QAAQ,EAC7C,KAAK,eAAe,KAAO,EAAI,UAE1B3B,IAAY,EAAG,CACpB,KAAK,eAAe,KAAO,EAC3B4B,EAAa,KAAK,eAAe,QAAQ,EACzCF,EAAe,KAAK,eAAe,QAAQ,EAC3C,KAAK,eAAe,KAAO,EAC3BC,EAAa,KAAK,eAAe,QAAQ,EACzC,IAAME,EAAQ,KAAK,eAAe,QAAQ,EAE1C,GADA,KAAK,eAAe,KAAO,EAAI,EAC3BJ,IAAqB,OAAQ,CAC7B,IAAMK,EAAkBH,EAAa,GAAM,EACrCI,EAAU,GAAQF,EAAQ,GAC1BG,EAAc,GAAQH,EAAQ,GAC9BI,EAASJ,EAAQ,EAAI,GAAK,EAC5BF,EAAa,GAAKA,GAAc,KAC5BI,EACIJ,IAAe,KACflF,EAAM,KAAK,MAAQuF,EAAc,YAAc,WAI/CC,EAAU,GAAMH,EAAiB,EAC7BA,IAAmB,EACnBrF,EAAM,KAAK,MAAQ,SAEdqF,IAAmB,EACxBrF,EAAM,KAAK,MAAQuF,EAAc,YAAc,UAE1CF,IAAmB,EACxBrF,EAAM,KAAK,MAAQuF,EAAc,YAAc,UAE1CF,IAAmB,IACxBrF,EAAM,KAAK,MAAQuF,EAAc,YAAc,WAI/CF,IAAmB,IACnBrF,EAAM,KAAK,MAAQ,WAK/BA,EAAM,KAAK,QAAU,MACrB,QAAQ,KAAK,yBAAyB,CAE9C,CACJ,EAEJA,EAAM,KAAK,iBAAmBiF,EAC9BjF,EAAM,KAAK,WAAamF,EAEpBH,IAAqB,OACjBE,IAAe,EACflF,EAAM,KAAK,MAAQ,SAEdkF,IAAe,GACpBlF,EAAM,KAAK,MAAQ,aAGnB,QAAQ,KAAK,2BAA2BkF,CAAU,oBAAoB,EACtElF,EAAM,KAAK,MAAQ,MAGlBgF,IAAqB,OACtBE,IAAe,EACflF,EAAM,KAAK,MAAQ,SAEdkF,IAAe,GACpBlF,EAAM,KAAK,MAAQ,WAGnB,QAAQ,KAAK,2BAA2BkF,CAAU,oBAAoB,EACtElF,EAAM,KAAK,MAAQ,MAGlBgF,IAAqB,OAC1BhF,EAAM,KAAK,MAAQ,SAEdgF,IAAqB,OAC1BhF,EAAM,KAAK,MAAQ,YAEdgF,IAAqB,OAC1BhF,EAAM,KAAK,MAAQ,YAEdgF,IAAqB,OAC1BhF,EAAM,KAAK,MAAQ,YAEdgF,IAAqB,OAC1BhF,EAAM,KAAK,MAAQ,YAEdgF,IAAqB,OAC1BhF,EAAM,KAAK,MAAQ,YAEdgF,IAAqB,SAC1BhF,EAAM,KAAK,MAAQ,aAEvB,KAAK,oBAAqBI,EAAW2E,EAAc,UAAa,KAAK,eAAe,GAAG,CAC3F,CACJ,CACJ,CAEA,MACJ,IAAK,OACD,CACI,IAAM/E,EAAQ,KAAK,aACnBa,EAAOb,GAASA,EAAM,IAAI,EAC1BA,EAAM,KAAK,iBAAmB,KAAK,eAAe,UAAUK,EAAQ,WAAW,CACnF,CAEA,MACJ,IAAK,OACD,CACI,IAAML,EAAQ,KAAK,aACnBa,EAAOb,GAASA,EAAM,IAAI,EAC1BA,EAAM,KAAK,iBAAmB,KAAK,eAAe,UAAUK,EAAQ,WAAW,CACnF,CAEA,MACJ,IAAK,OACD,CACI,IAAML,EAAQ,KAAK,aACnBa,EAAOb,GAASA,EAAM,MAAM,OAAS,OAAO,EAC5C,KAAK,eAAe,KAAO,EAC3B,IAAMyF,EAAU,KAAK,eAAe,OAAO,EACrCC,EAAQ,KAAK,eAAe,OAAO,EACnCC,EAAY,KAAK,eAAe,OAAO,EACvCC,EAAWD,GAAa,EACxBE,EAAqBF,GAAa,EAAK,EACvCG,EAAqBH,EAAY,EACjCI,EAAkB,KAAK,eAAe,OAAO,EAC7CC,EAA0B,KAAK,eAAe,OAAO,EACrDC,EAAqB,KAAK,eAAe,OAAO,EACtDjG,EAAM,KAAK,aAAe,CACtB,QAAAyF,EACA,MAAAC,EACA,SAAAE,EACA,kBAAAC,EACA,mBAAAC,EACA,gBAAAC,EACA,wBAAAC,EACA,mBAAAC,CACJ,CACJ,CAEA,MACJ,IAAK,OACD,CACI,IAAMjG,EAAQ,KAAK,aACnBa,EAAOb,GAASA,EAAM,MAAM,OAAS,OAAO,EAC5C,KAAK,eAAe,KAAO,EAC3B,IAAMkG,EAAa,KAAK,eAAe,OAAO,EACxCT,EAAUS,GAAc,EACxBR,EAAQQ,EAAa,GACrBP,EAAY,KAAK,eAAe,OAAO,EACvCQ,EAAOR,GAAa,EACpBS,EAAgBT,GAAa,EAAK,EAClCU,EAAaV,GAAa,EAAK,EAC/BW,EAAcX,GAAa,EAAK,EAChCY,EAAsBZ,GAAa,EAAK,EACxCa,EAAsBb,GAAa,EAAK,EACxCc,EAAuBd,EAAY,EAEnCC,EAAWH,GAAW,GAAKW,EAAgBC,EAAY,GAAK,GAAOD,EAAe,GAAK,EAC7FpG,EAAM,KAAK,aAAe,CACtB,QAAAyF,EACA,MAAAC,EACA,KAAAS,EACA,SAAAP,EACA,WAAAU,EACA,mBAAAC,EACA,mBAAAC,EACA,qBAAAC,CACJ,CACJ,CAEA,MACJ,IAAK,OACD,CACI,IAAMzG,EAAQ,KAAK,aAGnB,GAFAa,EAAOb,GAASA,EAAM,MAAM,OAAS,OAAO,EACzB,KAAK,eAAe,UAAU,CAAC,IAC/B,OACf,MAEJ,IAAM+F,EAAkB,KAAK,eAAe,QAAQ,EAC9CC,EAA0B,KAAK,eAAe,QAAQ,EACtDC,EAAqB,KAAK,eAAe,QAAQ,EACjDS,EAAgB,GAAQ,KAAK,eAAe,OAAO,EAAI,KAC7D1G,EAAM,KAAK,WAAa,CACpB,UAAW2G,GAA4BZ,CAAe,EACtD,SAAUa,GAAqCZ,CAAuB,EACtE,OAAQa,GAAgCZ,CAAkB,EAC1D,UAAWS,CACf,CACJ,CAEA,MACJ,IAAK,OAEG,KAAK,oBAAoBrG,EAAQ,WAAW,EAGhD,MACJ,IAAK,OACD,CACI,IAAML,EAAQ,KAAK,aACnBa,EAAOb,GAASA,EAAM,MAAM,OAAS,OAAO,EAC5C,KAAK,eAAe,KAAO,EAC3B,IAAM8G,EAAM,KAAK,eAAe,OAAO,EACvCjG,EAAOiG,IAAQ,CAAI,EACnB,KAAK,eAAe,wBAAwB,EAC5C,KAAK,eAAe,KAAO,EAC3B,IAAMC,EAAQ,KAAK,eAAe,OAAO,EACnCC,GAAwBD,EAAQ,OAAU,EAC1CE,GAAWF,EAAQ,MAAU,EAC7BG,GAAiBH,EAAQ,MAAU,EAIzC,GAHIC,IACA,KAAK,eAAe,KAAO,GAE3BC,EAAS,CACT,IAAME,EAAY,KAAK,eAAe,OAAO,EAC7C,KAAK,eAAe,KAAOA,CAC/B,CACID,IACA,KAAK,eAAe,KAAO,GAE/B,IAAME,EAAmB,KAAK,eAAe,OAAO,EACpDvG,EAAOuG,IAAqB,CAAI,EAChC,IAAMC,EAAgC,KAAK,eAAe,wBAAwB,EAC5EC,EAAe,KAAK,eAAe,IACnCC,EAAuB,KAAK,eAAe,OAAO,EAexD,GAdIA,IAAyB,IAAQA,IAAyB,KAC1DvH,EAAM,KAAK,MAAQ,MACnBA,EAAM,KAAK,aAAe,CAAE,QAASuH,IAAyB,GAAK,GAE9DA,IAAyB,KAAQA,IAAyB,IAC/DvH,EAAM,KAAK,MAAQ,MAEduH,IAAyB,IAC9BvH,EAAM,KAAK,MAAQ,SAGnB,QAAQ,KAAK,iDAAiDuH,CAAoB,uBAAuB,EAE7G,KAAK,eAAe,KAAO,GACvBF,EAAgC,KAAK,eAAe,IAAMC,EAAc,CAExE,IAAME,EAAyB,KAAK,eAAe,OAAO,EAC1D3G,EAAO2G,IAA2B,CAAI,EACtC,IAAMC,EAA4B,KAAK,eAAe,wBAAwB,EAE9E,GADAzH,EAAM,KAAK,iBAAmB,KAAK,eAAe,UAAUyH,CAAyB,EACjFzH,EAAM,KAAK,QAAU,MAAO,CAE5B,IAAM0H,EAAsBC,GAA4B3H,EAAM,KAAK,gBAAgB,EAC/E0H,EAAoB,mBAAqB,OACzC1H,EAAM,KAAK,iBAAmB0H,EAAoB,kBAElDA,EAAoB,aAAe,OACnC1H,EAAM,KAAK,WAAa0H,EAAoB,WAEpD,CACJ,CACJ,CAEA,MACJ,IAAK,OACD,CACI,IAAM1H,EAAQ,KAAK,aACnBa,EAAOb,GAASA,EAAM,MAAM,OAAS,OAAO,EACvB,KAAK,eAAe,QAAQ,EAAI,MAE7CA,EAAM,KAAK,QAAU,YACrBA,EAAM,KAAK,MAAQ,UAEdA,EAAM,KAAK,QAAU,YAC1BA,EAAM,KAAK,MAAQ,UAEdA,EAAM,KAAK,QAAU,YAC1BA,EAAM,KAAK,MAAQ,UAEdA,EAAM,KAAK,QAAU,YAC1BA,EAAM,KAAK,MAAQ,UAEdA,EAAM,KAAK,QAAU,cAC1BA,EAAM,KAAK,MAAQ,WAG/B,CAEA,MACJ,IAAK,OACD,CACI,IAAMA,EAAQ,KAAK,aACnBa,EAAOb,GAASA,EAAM,MAAM,OAAS,OAAO,EAC5C,KAAK,eAAe,KAAO,EAG3B,IAAM4H,EAAiB,GADH,KAAK,eAAe,OAAO,EACF,GACvCC,EAAgB,KAAK,eAAe,OAAO,EAC7C7H,EAAM,KAAK,QAAU,YAEjB4H,EACIC,IAAkB,GAClB7H,EAAM,KAAK,MAAQ,UAEd6H,IAAkB,GACvB7H,EAAM,KAAK,MAAQ,UAEd6H,IAAkB,GACvB7H,EAAM,KAAK,MAAQ,WAGnB,QAAQ,KAAK,4BAA4B6H,CAAa,GAAG,EACzD7H,EAAM,KAAK,MAAQ,MAInB6H,IAAkB,GAClB7H,EAAM,KAAK,MAAQ,YAEd6H,IAAkB,GACvB7H,EAAM,KAAK,MAAQ,YAEd6H,IAAkB,GACvB7H,EAAM,KAAK,MAAQ,aAGnB,QAAQ,KAAK,4BAA4B6H,CAAa,GAAG,EACzD7H,EAAM,KAAK,MAAQ,MAItBA,EAAM,KAAK,QAAU,cAEtB4H,EACIC,IAAkB,GAClB7H,EAAM,KAAK,MAAQ,UAEd6H,IAAkB,GACvB7H,EAAM,KAAK,MAAQ,WAGnB,QAAQ,KAAK,4BAA4B6H,CAAa,GAAG,EACzD7H,EAAM,KAAK,MAAQ,MAInB6H,IAAkB,GAClB7H,EAAM,KAAK,MAAQ,YAEd6H,IAAkB,GACvB7H,EAAM,KAAK,MAAQ,aAGnB,QAAQ,KAAK,4BAA4B6H,CAAa,GAAG,EACzD7H,EAAM,KAAK,MAAQ,OAI/B,KACJ,CAEJ,IAAK,OACD,CACI,IAAMA,EAAQ,KAAK,aACnBa,EAAOb,GAASA,EAAM,MAAM,OAAS,OAAO,EAC5C,KAAK,eAAe,KAAO,EAE3B,IAAM8H,EAAqB,KAAK,eAAe,OAAO,EAChDC,EAAU,KAAK,eAAe,QAAQ,EACtCC,EAAkB,KAAK,eAAe,QAAQ,EAC9CC,EAAa,KAAK,eAAe,QAAQ,EACzCC,EAAuB,KAAK,eAAe,OAAO,EACpDC,EACAD,IAAyB,EACzBC,EAAsB,KAAK,eAAe,UAAU,EAAIL,CAAkB,EAG1EK,EAAsB,IAAI,WAAW,CAAC,EAG1C,IAAMC,EAAc,IAAI,WAAW,GAA4BD,EAAoB,UAAU,EACvFE,EAAO,IAAI,SAASD,EAAY,MAAM,EAC5CC,EAAK,UAAU,EAAG,WAAY,EAAK,EACnCA,EAAK,UAAU,EAAG,WAAY,EAAK,EACnCA,EAAK,SAAS,EAAG,CAAC,EAClBA,EAAK,SAAS,EAAGP,CAAkB,EACnCO,EAAK,UAAU,GAAIN,EAAS,EAAI,EAChCM,EAAK,UAAU,GAAIL,EAAiB,EAAI,EACxCK,EAAK,SAAS,GAAIJ,EAAY,EAAI,EAClCI,EAAK,SAAS,GAAIH,CAAoB,EACtCE,EAAY,IAAID,EAAqB,EAAE,EACvCnI,EAAM,KAAK,iBAAmBoI,EAC9BpI,EAAM,KAAK,iBAAmB8H,EAC9B9H,EAAM,KAAK,WAAagI,CAC5B,CAEA,MACJ,IAAK,OACD,CACI,IAAMhI,EAAQ,KAAK,aACnBa,EAAOb,GAASA,EAAM,MAAM,OAAS,OAAO,EAC5C,KAAK,eAAe,KAAO,EAE3B,IAAMsI,EAAkB,IAClBC,EAAgC,IAChCnI,EAAW,KAAK,eAAe,IACrC,KAAO,KAAK,eAAe,IAAMkD,GAAW,CACxC,IAAMkF,EAAc,KAAK,eAAe,OAAO,EACzCC,EAAsB,KAAK,eAAe,QAAQ,EAGxD,IAFaD,EAAcF,KAEd,EAAG,CACZ,KAAK,eAAe,KAAO,GAE3B,IAAMI,EAAO,KAAK,eAAe,QAAQ,EACnCvD,EAAauD,IAAS,GACtBC,GAAqBD,GAAQ,EAAK,GAAS,EACjD1I,EAAM,KAAK,WAAamF,EACxBnF,EAAM,KAAK,iBAAmB2I,EAC9B,KAAK,eAAe,KAAO,EAC/B,MAGI,KAAK,eAAe,KAAOF,EAE/B,GAAID,EAAcD,EACd,KAER,CACA,IAAMK,EAAS,KAAK,eAAe,IACnC,KAAK,eAAe,IAAMxI,EAC1B,IAAMyI,EAAQ,KAAK,eAAe,UAAUD,EAASxI,CAAQ,EACvDgI,EAAc,IAAI,WAAW,EAAIS,EAAM,UAAU,EAC1C,IAAI,SAAST,EAAY,MAAM,EACvC,UAAU,EAAG,WAAY,EAAK,EACnCA,EAAY,IAAIS,EAAO,CAAC,EAExB7I,EAAM,KAAK,iBAAmBoI,CAClC,CAEA,MACJ,IAAK,OACD,CACI,IAAMpI,EAAQ,KAAK,aAEnB,GADAa,EAAOb,CAAK,EACR,CAACA,EAAM,YACP,MAEJ,KAAK,eAAe,KAAO,EAC3B,IAAMsE,EAAa,KAAK,eAAe,QAAQ,EAC3CwE,EAAe,EACfC,EAAmB,EACvB,QAAS7H,EAAI,EAAGA,EAAIoD,EAAYpD,IAAK,CACjC,IAAM8H,EAAc,KAAK,eAAe,QAAQ,EAC1CC,EAAc,KAAK,eAAe,QAAQ,EAChDjJ,EAAM,YAAY,oBAAoB,KAAK,CACvC,WAAY8I,EACZ,qBAAsBC,EACtB,MAAOC,EACP,MAAOC,CACX,CAAC,EACDH,GAAgBE,EAChBD,GAAoBC,EAAcC,CACtC,CACJ,CAEA,MACJ,IAAK,OACD,CACI,IAAMjJ,EAAQ,KAAK,aAEnB,GADAa,EAAOb,CAAK,EACR,CAACA,EAAM,YACP,MAEJ,KAAK,eAAe,KAAO,EAC3B,IAAMsE,EAAa,KAAK,eAAe,QAAQ,EAC3ClC,EAAc,EAClB,QAASlB,EAAI,EAAGA,EAAIoD,EAAYpD,IAAK,CACjC,IAAM8H,EAAc,KAAK,eAAe,QAAQ,EAC1CE,EAAe,KAAK,eAAe,QAAQ,EACjDlJ,EAAM,YAAY,6BAA6B,KAAK,CAChD,WAAYoC,EACZ,MAAO4G,EACP,OAAQE,CACZ,CAAC,EACD9G,GAAe4G,CACnB,CACJ,CAEA,MACJ,IAAK,OACD,CACI,IAAMhJ,EAAQ,KAAK,aAEnB,GADAa,EAAOb,CAAK,EACR,CAACA,EAAM,YACP,MAEJ,KAAK,eAAe,KAAO,EAC3B,IAAMkF,EAAa,KAAK,eAAe,QAAQ,EACzC8D,EAAc,KAAK,eAAe,QAAQ,EAChD,GAAI9D,IAAe,EACf,QAAShE,EAAI,EAAGA,EAAI8H,EAAa9H,IAAK,CAClC,IAAMgE,EAAa,KAAK,eAAe,QAAQ,EAC/ClF,EAAM,YAAY,YAAY,KAAKkF,CAAU,CACjD,MAGAlF,EAAM,YAAY,YAAY,KAAKkF,CAAU,CAErD,CAEA,MACJ,IAAK,OACD,CACI,IAAMlF,EAAQ,KAAK,aAEnB,GADAa,EAAOb,CAAK,EACR,CAACA,EAAM,YACP,MAEJ,KAAK,eAAe,KAAO,EAC3B,KAAK,eAAe,KAAO,EAC3B,IAAMmJ,EAAY,KAAK,eAAe,OAAO,EACvCH,EAAc,KAAK,eAAe,QAAQ,EAC1CH,EAAQ,KAAK,eAAe,UAAU,KAAK,KAAKG,EAAcG,EAAY,CAAC,CAAC,EAC5EC,EAAY,IAAIC,EAAUR,CAAK,EACrC,QAAS3H,EAAI,EAAGA,EAAI8H,EAAa9H,IAAK,CAClC,IAAMgE,EAAakE,EAAU,SAASD,CAAS,EAC/CnJ,EAAM,YAAY,YAAY,KAAKkF,CAAU,CACjD,CACJ,CAEA,MACJ,IAAK,OACD,CACI,IAAMlF,EAAQ,KAAK,aAEnB,GADAa,EAAOb,CAAK,EACR,CAACA,EAAM,YACP,MAEJ,KAAK,eAAe,KAAO,EAC3BA,EAAM,YAAY,iBAAmB,CAAC,EACtC,IAAMsE,EAAa,KAAK,eAAe,QAAQ,EAC/C,QAASpD,EAAI,EAAGA,EAAIoD,EAAYpD,IAAK,CACjC,IAAMkB,EAAc,KAAK,eAAe,QAAQ,EAAI,EACpDpC,EAAM,YAAY,iBAAiB,KAAKoC,CAAW,CACvD,CACJ,CAEA,MACJ,IAAK,OACD,CACI,IAAMpC,EAAQ,KAAK,aAEnB,GADAa,EAAOb,CAAK,EACR,CAACA,EAAM,YACP,MAEJ,KAAK,eAAe,KAAO,EAC3B,IAAMsE,EAAa,KAAK,eAAe,QAAQ,EAC/C,QAASpD,EAAI,EAAGA,EAAIoD,EAAYpD,IAAK,CACjC,IAAMoI,EAAkB,KAAK,eAAe,QAAQ,EAAI,EAClDC,EAAkB,KAAK,eAAe,QAAQ,EAC9CC,EAAyB,KAAK,eAAe,QAAQ,EAC3DxJ,EAAM,YAAY,cAAc,KAAK,CACjC,iBAAkB,GAClB,gBAAAsJ,EACA,gBAAAC,EACA,uBAAAC,CACJ,CAAC,CACL,CACA,IAAIjI,EAAmB,EACvB,QAASL,EAAI,EAAGA,EAAIlB,EAAM,YAAY,cAAc,OAAQkB,IAExD,GADAlB,EAAM,YAAY,cAAckB,CAAC,EAAE,iBAAmBK,EAClDL,EAAIlB,EAAM,YAAY,cAAc,OAAS,EAAG,CAEhD,IAAMqB,EADYrB,EAAM,YAAY,cAAckB,EAAI,CAAC,EAC1B,gBACvBlB,EAAM,YAAY,cAAckB,CAAC,EAAE,gBACzCK,GAAoBF,EAAarB,EAAM,YAAY,cAAckB,CAAC,EAAE,eACxE,CAER,CAEA,MACJ,IAAK,OACD,CACI,IAAMlB,EAAQ,KAAK,aAEnB,GADAa,EAAOb,CAAK,EACR,CAACA,EAAM,YACP,MAEJ,KAAK,eAAe,KAAO,EAC3B,IAAMsE,EAAa,KAAK,eAAe,QAAQ,EAC/C,QAASpD,EAAI,EAAGA,EAAIoD,EAAYpD,IAAK,CACjC,IAAMuI,EAAc,KAAK,eAAe,QAAQ,EAChDzJ,EAAM,YAAY,aAAa,KAAKyJ,CAAW,CACnD,CACJ,CAEA,MACJ,IAAK,OACD,CACI,IAAMzJ,EAAQ,KAAK,aAEnB,GADAa,EAAOb,CAAK,EACR,CAACA,EAAM,YACP,MAEJ,KAAK,eAAe,KAAO,EAC3B,IAAMsE,EAAa,KAAK,eAAe,QAAQ,EAC/C,QAASpD,EAAI,EAAGA,EAAIoD,EAAYpD,IAAK,CACjC,IAAMuI,EAAc,KAAK,eAAe,QAAQ,EAChDzJ,EAAM,YAAY,aAAa,KAAKyJ,CAAW,CACnD,CACJ,CAEA,MACJ,IAAK,OAEG,KAAK,aAAe,GACpB,KAAK,oBAAoBpJ,EAAQ,WAAW,EAGhD,MACJ,IAAK,OACD,CACI,IAAMkD,EAAU,KAAK,eAAe,OAAO,EAC3C,KAAK,eAAe,KAAO,EAC3B,IAAMmG,EAAmBnG,IAAY,EAAI,KAAK,eAAe,QAAQ,EAAI,KAAK,eAAe,QAAQ,EACrG,KAAK,yBAA2BmG,CACpC,CAEA,MACJ,IAAK,OACD,CACI,KAAK,eAAe,KAAO,EAC3B,IAAM7G,EAAU,KAAK,eAAe,QAAQ,EACtC8G,EAAgC,KAAK,eAAe,QAAQ,EAC5DC,EAAwB,KAAK,eAAe,QAAQ,EACpDC,EAAoB,KAAK,eAAe,QAAQ,EAChDC,EAAqB,KAAK,eAAe,QAAQ,EAEvD,KAAK,sBAAsB,KAAK,CAC5B,QAAAjH,EACA,8BAAA8G,EACA,sBAAAC,EACA,kBAAAC,EACA,mBAAAC,CACJ,CAAC,CACL,CAEA,MACJ,IAAK,OACD,CACI,IAAMvG,EAAU,KAAK,eAAe,OAAO,EAC3C,KAAK,eAAe,KAAO,EAC3B,IAAMV,EAAU,KAAK,eAAe,QAAQ,EACtC7C,EAAQ,KAAK,OAAO,KAAKD,GAAKA,EAAE,KAAO8C,CAAO,EACpD,GAAI,CAAC7C,EACD,MAEJA,EAAM,oBAAsB,CAAC,EAC7B,IAAM0I,EAAO,KAAK,eAAe,QAAQ,EACnCqB,GAAuBrB,EAAO,KAAa,EAC3CsB,GAAuBtB,EAAO,KAAa,EAC3CuB,EAAwBvB,EAAO,EAC/B3I,EAAI,KAAK,eACTmK,EAAY,CAACnK,EAAE,OAAO,KAAKA,CAAC,EAAGA,EAAE,QAAQ,KAAKA,CAAC,EAAGA,EAAE,QAAQ,KAAKA,CAAC,EAAGA,EAAE,QAAQ,KAAKA,CAAC,CAAC,EACtFoK,EAAcD,EAAUH,CAAmB,EAC3CK,EAAcF,EAAUF,CAAmB,EAC3CK,EAAgBH,EAAUD,CAAqB,EAC/CK,EAAkB,KAAK,eAAe,QAAQ,EACpD,QAASpJ,EAAI,EAAGA,EAAIoJ,EAAiBpJ,IAAK,CACtC,IAAMqJ,EAAOhH,IAAY,EAAI,KAAK,eAAe,QAAQ,EAAI,KAAK,eAAe,QAAQ,EACnFiH,EAAajH,IAAY,EAAI,KAAK,eAAe,QAAQ,EAAI,KAAK,eAAe,QAAQ,EAEzFkH,EAAaN,EAAY,EAEzBO,EAAaN,EAAY,EAEzBO,EAAeN,EAAc,EACnCrK,EAAM,oBAAoB,KAAK,CAC3B,UAAWuK,EACX,WAAAC,CACJ,CAAC,CACL,CACJ,CAEA,MACJ,IAAK,OACD,CACI,KAAK,gBAAkB,CACnB,WAAYpK,EACZ,SAAUC,EAAQ,UAClB,uBAAwBD,EACxB,UAAW,IAAI,IACf,UAAW,IACX,QAAS,EACT,aAAc,KACd,yBAA0B,EAC9B,EACA,KAAK,oBAAoBC,EAAQ,WAAW,EAC5C,IAAMuK,EAAiBlJ,EAAwB,KAAK,UAAW,KAAK,gBAAgB,WAAY3B,GAAKA,EAAE,UAAU,EACjH,KAAK,UAAU,OAAO6K,EAAiB,EAAG,EAAG,KAAK,eAAe,EAEjE,OAAW,CAAC,CAAE9H,CAAS,IAAK,KAAK,gBAAgB,UAAW,CACxD,IAAM+H,EAAc/H,EAAU,QAAQ,CAAC,EACjCgI,EAAa7I,EAAKa,EAAU,OAAO,EACzC,KAAK,gBAAgB,UAAY,KAAK,IAAI,KAAK,gBAAgB,UAAW+H,EAAY,UAAU,EAChG,KAAK,gBAAgB,QAAU,KAAK,IAAI,KAAK,gBAAgB,QAASC,EAAW,WAAaA,EAAW,QAAQ,CACrH,CACA,KAAK,gBAAkB,IAC3B,CAEA,MACJ,IAAK,OAMG,GAJAjK,EAAO,KAAK,eAAe,EAC3B,KAAK,oBAAoBR,EAAQ,WAAW,EAGxC,KAAK,aAAc,CACnB,IAAMyC,EAAY,KAAK,gBAAgB,UAAU,IAAI,KAAK,aAAa,EAAE,EACzE,GAAIA,EAAW,CAGX,IAAM8H,EAAiBlJ,EAAwB,KAAK,aAAa,UAAW,KAAK,gBAAgB,WAAY3B,GAAKA,EAAE,UAAU,EAG9H,GAFA,KAAK,aAAa,UAAU,OAAO6K,EAAiB,EAAG,EAAG,KAAK,eAAe,EAC1D9H,EAAU,yBAA2B,KACxC,CACb,IAAM8H,EAAiBlJ,EAAwB,KAAK,aAAa,sBAAuB,KAAK,gBAAgB,WAAY3B,GAAKA,EAAE,UAAU,EAC1I,KAAK,aAAa,sBAAsB,OAAO6K,EAAiB,EAAG,EAAG,KAAK,eAAe,CAC9F,CACA,GAAM,CAAE,qBAAAG,CAAqB,EAAI,KAAK,aACtClK,EAAOkK,CAAoB,EACvBA,EAAqB,iBAAmB,OACxC5H,GAAmCL,EAAWiI,EAAqB,cAAc,EACjFjI,EAAU,sBAAwB,GAE1C,CACA,KAAK,aAAa,qBAAuB,KACzC,KAAK,aAAe,IACxB,CAGJ,MACJ,IAAK,OACD,CACIjC,EAAO,KAAK,eAAe,EAC3B,KAAK,eAAe,KAAO,EAC3B,IAAMuE,EAAQ,KAAK,eAAe,QAAQ,EACpC4F,EAAwB,GAAQ5F,EAAQ,GACxC6F,EAAgC,GAAQ7F,EAAQ,GAChD8F,EAA+B,GAAQ9F,EAAQ,GAC/C+F,EAA2B,GAAQ/F,EAAQ,IAC3CgG,EAA4B,GAAQhG,EAAQ,IAC5CiG,EAAkB,GAAQjG,EAAQ,OAClCkG,EAAoB,GAAQlG,EAAQ,QACpCvC,EAAU,KAAK,eAAe,QAAQ,EACtC7C,EAAQ,KAAK,OAAO,KAAKD,GAAKA,EAAE,KAAO8C,CAAO,EACpD,GAAI,CAAC7C,EAED,MAEJ,IAAMuL,EAAW,KAAK,sBAAsB,KAAKxL,GAAKA,EAAE,UAAY8C,CAAO,EAC3E,KAAK,aAAe7C,EACpBA,EAAM,qBAAuB,CACzB,eAAgB,KAAK,gBAAgB,uBACrC,uBAAwBuL,GAAU,+BAAiC,KACnE,sBAAuBA,GAAU,uBAAyB,KAC1D,kBAAmBA,GAAU,mBAAqB,KAClD,mBAAoBA,GAAU,oBAAsB,KACpD,eAAgB,IACpB,EACIP,EACAhL,EAAM,qBAAqB,eAAiB,KAAK,eAAe,QAAQ,EAEnEsL,IACLtL,EAAM,qBAAqB,eAAiB,KAAK,gBAAgB,YAEjEiL,IACAjL,EAAM,qBAAqB,uBAAyB,KAAK,eAAe,QAAQ,GAEhFkL,IACAlL,EAAM,qBAAqB,sBAAwB,KAAK,eAAe,QAAQ,GAE/EmL,IACAnL,EAAM,qBAAqB,kBAAoB,KAAK,eAAe,QAAQ,GAE3EoL,IACApL,EAAM,qBAAqB,mBAAqB,KAAK,eAAe,QAAQ,GAE5EqL,IACArL,EAAM,qBAAqB,sBAAwB,EAE3D,CAEA,MACJ,IAAK,OACD,CACI,IAAMA,EAAQ,KAAK,aACnB,GAAI,CAACA,EACD,MAEJa,EAAOb,EAAM,oBAAoB,EAEjC,IAAMuD,EAAU,KAAK,eAAe,OAAO,EAC3C,KAAK,eAAe,KAAO,EAC3B,IAAMiI,EAAsBjI,IAAY,EAClC,KAAK,eAAe,QAAQ,EAC5B,KAAK,eAAe,QAAQ,EAClCvD,EAAM,qBAAqB,eAAiBwL,CAChD,CAEA,MACJ,IAAK,OACD,CACI,IAAMxL,EAAQ,KAAK,aACnB,GAAI,CAACA,EACD,MAIJ,GAFAa,EAAO,KAAK,eAAe,EAC3BA,EAAOb,EAAM,oBAAoB,EAC7B,KAAK,gBAAgB,UAAU,IAAIA,EAAM,EAAE,EAAG,CAC9C,QAAQ,KAAK,2EAA4E,EACzF,KACJ,CACA,IAAMuD,EAAU,KAAK,eAAe,OAAO,EACrC6B,EAAQ,KAAK,eAAe,QAAQ,EACpCqG,EAAoB,GAAQrG,EAAQ,GACpCsG,EAA0B,GAAQtG,EAAQ,GAC1CuG,EAAwB,GAAQvG,EAAQ,KACxCwG,EAAoB,GAAQxG,EAAQ,KACpCyG,EAAqB,GAAQzG,EAAQ,MACrC0G,EAAsC,GAAQ1G,EAAQ,MACtD4D,EAAc,KAAK,eAAe,QAAQ,EAC5C+C,EAAa/L,EAAM,qBAAqB,eACxCyL,IACAM,GAAc,KAAK,eAAe,QAAQ,GAE9C,IAAIC,EAAmB,KACnBN,IACAM,EAAmB,KAAK,eAAe,QAAQ,GAEnD,IAAIC,EAAgBF,EACpB,GAAI/C,IAAgB,EAAG,CAEnB,KAAK,gBAAgB,uBAAyBiD,EAC9C,KACJ,CACA,IAAIlD,EAAmB,EACjBjG,EAAY,CACd,eAAgB,EAChB,aAAc,EACd,uBAAwB,KACxB,QAAS,CAAC,EACV,uBAAwB,CAAC,EACzB,sBAAuB,EAC3B,EACA,KAAK,gBAAgB,UAAU,IAAI9C,EAAM,GAAI8C,CAAS,EACtD,QAAS5B,EAAI,EAAGA,EAAI8H,EAAa9H,IAAK,CAClC,IAAIgL,EACAP,EACAO,EAAiB,KAAK,eAAe,QAAQ,GAG7CrL,EAAOb,EAAM,qBAAqB,wBAA0B,IAAI,EAChEkM,EAAiBlM,EAAM,qBAAqB,uBAEhD,IAAIkF,EACA0G,EACA1G,EAAa,KAAK,eAAe,QAAQ,GAGzCrE,EAAOb,EAAM,qBAAqB,oBAAsB,IAAI,EAC5DkF,EAAalF,EAAM,qBAAqB,mBAE5C,IAAImM,EACAN,EACAM,EAAc,KAAK,eAAe,QAAQ,GAG1CtL,EAAOb,EAAM,qBAAqB,qBAAuB,IAAI,EAC7DmM,EAAcnM,EAAM,qBAAqB,oBAEzCkB,IAAM,GAAK8K,IAAqB,OAChCG,EAAcH,GAElB,IAAII,EAA8B,EAC9BN,IACIvI,IAAY,EACZ6I,EAA8B,KAAK,eAAe,QAAQ,EAG1DA,EAA8B,KAAK,eAAe,QAAQ,GAGlE,IAAMC,EAAa,EAAEF,EAAc,OACnCrJ,EAAU,QAAQ,KAAK,CACnB,sBAAuBiG,EAAmBqD,EAC1C,SAAUF,EACV,WAAYD,EACZ,SAAU/G,EACV,WAAAmH,CACJ,CAAC,EACDJ,GAAiB/G,EACjB6D,GAAoBmD,CACxB,CACApJ,EAAU,uBAAyBA,EAAU,QACxC,IAAI,CAAC/C,EAAGmB,KAAO,CAAE,sBAAuBnB,EAAE,sBAAuB,YAAamB,CAAE,EAAE,EAClF,KAAK,CAACoB,EAAGC,IAAMD,EAAE,sBAAwBC,EAAE,qBAAqB,EACrE,QAASrB,EAAI,EAAGA,EAAI4B,EAAU,uBAAuB,OAAQ5B,IAAK,CAC9D,IAAMoL,EAAexJ,EAAU,uBAAuB5B,CAAC,EACjDqL,EAAgBzJ,EAAU,QAAQwJ,EAAa,WAAW,EAIhE,GAHIxJ,EAAU,yBAA2B,MAAQyJ,EAAc,aAC3DzJ,EAAU,uBAAyByJ,EAAc,uBAEjDrL,EAAI4B,EAAU,uBAAuB,OAAS,EAAG,CAEjD,IAAM1B,EAAY0B,EAAU,uBAAuB5B,EAAI,CAAC,EACxDqL,EAAc,SAAWnL,EAAU,sBAAwBkL,EAAa,qBAC5E,CACJ,CACA,IAAMzB,EAAc/H,EAAU,QAAQA,EAAU,uBAAuB,CAAC,EAAE,WAAW,EAC/EgI,EAAahI,EAAU,QAAQb,EAAKa,EAAU,sBAAsB,EAAE,WAAW,EACvFA,EAAU,eAAiB+H,EAAY,sBACvC/H,EAAU,aAAegI,EAAW,sBAAwBA,EAAW,SACvE,KAAK,gBAAgB,uBAAyBmB,CAClD,CAEA,KACR,CACA,KAAK,eAAe,IAAM3I,CAC9B,CACJ,EACMkJ,GAAN,KAA0B,CACtB,YAAY9L,EAAe,CACvB,KAAK,cAAgBA,EACrB,KAAK,oBAAsB,IAAI,QAC/B,KAAK,yBAA2B,IAAI,OACxC,CACA,OAAQ,CACJ,OAAO,KAAK,cAAc,EAC9B,CACA,UAAW,CACP,MAAM,IAAI,MAAM,gCAAgC,CACpD,CACA,iBAAkB,CACd,OAAO,KAAK,cAAc,YAC9B,CACA,mBAAoB,CAChB,OAAO,KAAK,cAAc,SAC9B,CACA,MAAM,iBAAkB,CACpB,IAAM+L,EAAa,MAAM,KAAK,UAAU,IAAU,CAAE,aAAc,EAAK,CAAC,EACxE,OAAQA,GAAY,WAAa,IAAMA,GAAY,UAAY,EACnE,CACA,MAAM,mBAAoB,CAEtB,OADoB,MAAM,KAAK,eAAe,CAAE,aAAc,EAAK,CAAC,IAChD,WAAa,CACrC,CACA,MAAM,eAAeC,EAAS,CAC1B,OAAI,KAAK,cAAc,QAAQ,aACpB,KAAK,wBAAwB,IAAM,CACtC,IAAMC,EAAgB,KAAK,cAAc,QAAQ,UAAU,CAAC,GAAK,KACjE,GAAIA,GAAe,yBAA0B,CAEzC,IAAI5J,EAAkB4J,EACtB,KAAO5J,GAAiB,CAEpB,GADkBA,EAAgB,UAAU,IAAI,KAAK,cAAc,EAAE,EAEjE,MAAO,CACH,cAAeJ,EAAkB,KAAK,cAAc,UAAWI,EAAgB,WAAYhD,GAAKA,EAAE,UAAU,EAC5G,YAAa,EACb,mBAAoB,EACxB,EAEJgD,EAAkBA,EAAgB,YACtC,CACJ,CACA,MAAO,CACH,cAAe,GACf,YAAa,GACb,mBAAoB,EACxB,CACJ,EAAG,KACH,IAAU2J,CAAO,EAEd,KAAK,0BAA0B,EAAGA,CAAO,CACpD,CACA,0BAA0BE,EAAW,CAIjC,OAAOC,GAAiBD,EAAY,KAAK,cAAc,UAAW,EAAE,EAAI,KAAK,cAAc,cAC/F,CACA,MAAM,UAAUA,EAAWF,EAAS,CAChC,IAAMI,EAAuB,KAAK,0BAA0BF,CAAS,EACrE,GAAI,KAAK,cAAc,QAAQ,aAC3B,OAAO,KAAK,wBAAwB,IAAM,KAAK,kCAAkCE,CAAoB,EAAGA,EAAsBA,EAAsBJ,CAAO,EAE1J,CACD,IAAM/L,EAAc,KAAK,cAAc,QAAQ,uBAAuB,KAAK,aAAa,EAClFyB,EAAc2K,GAA2BpM,EAAamM,CAAoB,EAChF,OAAO,KAAK,0BAA0B1K,EAAasK,CAAO,CAC9D,CACJ,CACA,MAAM,cAAcM,EAAQN,EAAS,CACjC,GAAI,KAAK,cAAc,QAAQ,aAAc,CACzC,IAAMO,EAAqB,KAAK,yBAAyB,IAAID,CAAM,EACnE,GAAIC,IAAuB,OACvB,MAAM,IAAI,MAAM,yCAAyC,EAE7D,IAAMnK,EAAYmK,EAAmB,SAAS,UAAU,IAAI,KAAK,cAAc,EAAE,EAC3EC,EAAiBpK,EAAU,QAAQmK,EAAmB,WAAW,EACjEE,EAAgBxK,EAAkB,KAAK,cAAc,UAAWsK,EAAmB,SAAS,WAAYlN,GAAKA,EAAE,UAAU,EAC/H,OAAAc,EAAOsM,IAAkB,EAAE,EACpB,KAAK,wBAAwB,IAAM,CACtC,GAAIF,EAAmB,YAAc,EAAInK,EAAU,QAAQ,OAEvD,MAAO,CACH,cAAAqK,EACA,YAAaF,EAAmB,YAAc,EAC9C,mBAAoB,EACxB,EAEC,CAED,IAAIlK,EAAkBkK,EAAmB,SACzC,KAAOlK,EAAgB,cAGnB,GAFAA,EAAkBA,EAAgB,aAChBA,EAAgB,UAAU,IAAI,KAAK,cAAc,EAAE,EACtD,CACX,IAAMoK,EAAgBxK,EAAkB,KAAK,cAAc,UAAWI,EAAgB,WAAYhD,GAAKA,EAAE,UAAU,EACnH,OAAAc,EAAOsM,IAAkB,EAAE,EACpB,CACH,cAAAA,EACA,YAAa,EACb,mBAAoB,EACxB,CACJ,CAEJ,MAAO,CACH,cAAAA,EACA,YAAa,GACb,mBAAoB,EACxB,CACJ,CACJ,EAAGD,EAAe,sBAAuB,IAAUR,CAAO,CAC9D,CACA,IAAMtK,EAAc,KAAK,oBAAoB,IAAI4K,CAAM,EACvD,GAAI5K,IAAgB,OAChB,MAAM,IAAI,MAAM,yCAAyC,EAE7D,OAAO,KAAK,0BAA0BA,EAAc,EAAGsK,CAAO,CAClE,CACA,MAAM,aAAaE,EAAWF,EAAS,CACnC,IAAMI,EAAuB,KAAK,0BAA0BF,CAAS,EACrE,GAAI,KAAK,cAAc,QAAQ,aAC3B,OAAO,KAAK,wBAAwB,IAAM,KAAK,qCAAqCE,CAAoB,EAAGA,EAAsBA,EAAsBJ,CAAO,EAElK,IAAM/L,EAAc,KAAK,cAAc,QAAQ,uBAAuB,KAAK,aAAa,EAClFyB,EAAc2K,GAA2BpM,EAAamM,CAAoB,EAC1EM,EAAsBhL,IAAgB,GACtC,GACAiL,GAAkC1M,EAAayB,CAAW,EAChE,OAAO,KAAK,0BAA0BgL,EAAqBV,CAAO,CACtE,CACA,MAAM,iBAAiBM,EAAQN,EAAS,CACpC,GAAI,KAAK,cAAc,QAAQ,aAAc,CACzC,IAAMO,EAAqB,KAAK,yBAAyB,IAAID,CAAM,EACnE,GAAIC,IAAuB,OACvB,MAAM,IAAI,MAAM,yCAAyC,EAE7D,IAAMnK,EAAYmK,EAAmB,SAAS,UAAU,IAAI,KAAK,cAAc,EAAE,EAC3EC,EAAiBpK,EAAU,QAAQmK,EAAmB,WAAW,EACjEE,EAAgBxK,EAAkB,KAAK,cAAc,UAAWsK,EAAmB,SAAS,WAAYlN,GAAKA,EAAE,UAAU,EAC/H,OAAAc,EAAOsM,IAAkB,EAAE,EACpB,KAAK,wBAAwB,IAAM,CACtC,IAAMG,EAAoBxK,EAAU,QAAQ,UAAU,CAAC/C,EAAGmB,IAAMnB,EAAE,YAAcmB,EAAI+L,EAAmB,WAAW,EAClH,GAAIK,IAAsB,GAEtB,MAAO,CACH,cAAAH,EACA,YAAaG,EACb,mBAAoB,EACxB,EAEC,CAED,IAAIvK,EAAkBkK,EAAmB,SACzC,KAAOlK,EAAgB,cAAc,CACjCA,EAAkBA,EAAgB,aAClC,IAAMD,EAAYC,EAAgB,UAAU,IAAI,KAAK,cAAc,EAAE,EACrE,GAAID,GAAaA,EAAU,yBAA2B,KAAM,CACxD,IAAMqK,EAAgBxK,EAAkB,KAAK,cAAc,UAAWI,EAAgB,WAAYhD,GAAKA,EAAE,UAAU,EACnHc,EAAOsM,IAAkB,EAAE,EAC3B,IAAMI,EAAgBzK,EAAU,QAAQ,UAAU/C,GAAKA,EAAE,UAAU,EACnE,OAAAc,EAAO0M,IAAkB,EAAE,EACpB,CACH,cAAAJ,EACA,YAAaI,EACb,mBAAoB,EACxB,CACJ,CACJ,CACA,MAAO,CACH,cAAAJ,EACA,YAAa,GACb,mBAAoB,EACxB,CACJ,CACJ,EAAGD,EAAe,sBAAuB,IAAUR,CAAO,CAC9D,CACA,IAAMtK,EAAc,KAAK,oBAAoB,IAAI4K,CAAM,EACvD,GAAI5K,IAAgB,OAChB,MAAM,IAAI,MAAM,yCAAyC,EAE7D,IAAMzB,EAAc,KAAK,cAAc,QAAQ,uBAAuB,KAAK,aAAa,EAClF6M,EAA0BC,GAA8B9M,EAAayB,CAAW,EACtF,OAAO,KAAK,0BAA0BoL,EAAyBd,CAAO,CAC1E,CACA,MAAM,0BAA0BtK,EAAasK,EAAS,CAClD,GAAItK,IAAgB,GAChB,OAAO,KAEX,IAAMzB,EAAc,KAAK,cAAc,QAAQ,uBAAuB,KAAK,aAAa,EAClF+M,EAAaC,GAAchN,EAAayB,CAAW,EACzD,GAAI,CAACsL,EACD,OAAO,KAEX,IAAIE,EACAlB,EAAQ,aACRkB,EAAOC,GAIP,MAAM,KAAK,cAAc,QAAQ,YAAY,OAAO,UAAUH,EAAW,YAAaA,EAAW,YAAcA,EAAW,SAAS,EACnI,KAAK,cAAc,QAAQ,YAAY,IAAMA,EAAW,aACxDE,EAAO,KAAK,cAAc,QAAQ,YAAY,UAAUF,EAAW,UAAU,GAEjF,IAAMd,GAAac,EAAW,sBAAwB,KAAK,cAAc,gBACnE,KAAK,cAAc,UACnBI,EAAWJ,EAAW,SAAW,KAAK,cAAc,UACpDV,EAAS,IAAIe,EAAcH,EAAMF,EAAW,WAAa,MAAQ,QAASd,EAAWkB,EAAU1L,EAAasL,EAAW,UAAU,EACvI,YAAK,oBAAoB,IAAIV,EAAQ5K,CAAW,EACzC4K,CACX,CACA,MAAM,sBAAsBpK,EAAUR,EAAasK,EAAS,CACxD,GAAItK,IAAgB,GAChB,OAAO,KAGX,IAAM8K,EADYtK,EAAS,UAAU,IAAI,KAAK,cAAc,EAAE,EAC7B,QAAQR,CAAW,EACpDvB,EAAOqM,CAAc,EACrB,IAAIU,EACAlB,EAAQ,aACRkB,EAAOC,GAIP,MAAM,KAAK,cAAc,QAAQ,YAAY,OAAO,UAAUjL,EAAS,UAAWA,EAAS,OAAO,EAClG,KAAK,cAAc,QAAQ,YAAY,IAAMsK,EAAe,WAC5DU,EAAO,KAAK,cAAc,QAAQ,YAAY,UAAUV,EAAe,QAAQ,GAEnF,IAAMN,GAAaM,EAAe,sBAAwB,KAAK,cAAc,gBACvE,KAAK,cAAc,UACnBY,EAAWZ,EAAe,SAAW,KAAK,cAAc,UACxDF,EAAS,IAAIe,EAAcH,EAAMV,EAAe,WAAa,MAAQ,QAASN,EAAWkB,EAAUlL,EAAS,WAAaR,EAAa8K,EAAe,QAAQ,EACnK,YAAK,yBAAyB,IAAIF,EAAQ,CAAE,SAAApK,EAAU,YAAAR,CAAY,CAAC,EAC5D4K,CACX,CACA,kCAAkCF,EAAsB,CACpD,IAAMK,EAAgBzL,EAEtB,KAAK,cAAc,UAAWoL,EAAsB/M,GAAKA,EAAE,UAAU,IAAI,KAAK,cAAc,EAAE,EAAE,cAAc,EAC1GqC,EAAc,GACd4L,EAAqB,GACzB,GAAIb,IAAkB,GAAI,CAEtB,IAAMrK,EADW,KAAK,cAAc,UAAUqK,CAAa,EAChC,UAAU,IAAI,KAAK,cAAc,EAAE,EACxDzK,EAAQhB,EAAwBoB,EAAU,uBAAwBgK,EAAsB/M,GAAKA,EAAE,qBAAqB,EAC1Hc,EAAO6B,IAAU,EAAE,EACnBN,EAAcU,EAAU,uBAAuBJ,CAAK,EAAE,YACtDsL,EAAqBlB,EAAuBhK,EAAU,YAC1D,CACA,MAAO,CAAE,cAAAqK,EAAe,YAAA/K,EAAa,mBAAA4L,CAAmB,CAC5D,CACA,qCAAqClB,EAAsB,CACvD,IAAMmB,EAA2BvM,EAEjC,KAAK,cAAc,sBAAuBoL,EAAsB/M,GAAKA,EAAE,UAAU,IAAI,KAAK,cAAc,EAAE,EAAE,cAAc,EACtHoN,EAAgB,GAChB/K,EAAc,GACd4L,EAAqB,GACzB,GAAIC,IAA6B,GAAI,CACjC,IAAMrL,EAAW,KAAK,cAAc,sBAAsBqL,CAAwB,EAElFd,EAAgBxK,EAAkB,KAAK,cAAc,UAAWC,EAAS,WAAY7C,GAAKA,EAAE,UAAU,EACtGc,EAAOsM,IAAkB,EAAE,EAC3B,IAAMrK,EAAYF,EAAS,UAAU,IAAI,KAAK,cAAc,EAAE,EACxDF,EAAQwL,GAAcpL,EAAU,uBAAyB/C,GAC5C+C,EAAU,QAAQ/C,EAAE,WAAW,EAChC,YAAcA,EAAE,uBAAyB+M,CAC1D,EACDjM,EAAO6B,IAAU,EAAE,EAEnBN,EADcU,EAAU,uBAAuBJ,CAAK,EAChC,YACpBsL,EAAqBlB,EAAuBhK,EAAU,YAC1D,CACA,MAAO,CAAE,cAAAqK,EAAe,YAAA/K,EAAa,mBAAA4L,CAAmB,CAC5D,CAEA,MAAM,wBAAwBG,EAAcC,EAAiBC,EAAiB3B,EAAS,CACnF,IAAM4B,EAAU,KAAK,cAAc,QAC7BC,EAAU,MAAMD,EAAQ,oBAAoB,QAAQ,EAC1D,GAAI,CACA,GAAM,CAAE,cAAAnB,EAAe,YAAA/K,EAAa,mBAAA4L,CAAmB,EAAIG,EAAa,EACxE,GAAIH,EAAoB,CAEpB,IAAMpL,EAAW,KAAK,cAAc,UAAUuK,CAAa,EAC3D,OAAO,KAAK,sBAAsBvK,EAAUR,EAAasK,CAAO,CACpE,CACA,IAAM8B,EAAiBF,EAAQ,eACzBnO,EAAa,MAAMqO,EAAe,OAAO,OAAO,QAAQ,EAC1DC,EAAe,KACfC,EAAoBvB,EACpBwB,EAAkBvM,EAGhBwM,EAAmB,KAAK,cAAc,oBACtClN,EAAwB,KAAK,cAAc,oBAAqB0M,EAAiBrO,GAAKA,EAAE,SAAS,EACjG,GACA8O,EAAcD,IAAqB,GACnC,KAAK,cAAc,oBAAoBA,CAAgB,EACvD,KACF3L,EAA8B,GAClC,GAAIkK,IAAkB,GAClBqB,EAAe,IAAMK,GAAa,YAAc,EAChD5L,EAA8BuL,EAAe,MAAQ,MAEpD,CACD,IAAM5L,EAAW,KAAK,cAAc,UAAUuK,CAAa,EACvD,CAAC0B,GAAejM,EAAS,YAAciM,EAAY,YACnDL,EAAe,IAAM5L,EAAS,WAAaA,EAAS,SACpD6L,EAAe7L,GAIf4L,EAAe,IAAMK,EAAY,UAEzC,CACA,KAAOL,EAAe,IAAMrO,GAAY,CACpC,GAAIsO,EAAc,CACd,IAAM3L,EAAY2L,EAAa,UAAU,IAAI,KAAK,cAAc,EAAE,EAClE,GAAI3L,GAAaA,EAAU,eAAiBuL,EAExC,MAEJ,GAAII,EAAa,aAAc,CAE3BD,EAAe,IAAMC,EAAa,aAAa,WAAaA,EAAa,aAAa,SACtFA,EAAeA,EAAa,aAC5B,QACJ,CACJ,CAEA,MAAMD,EAAe,OAAO,UAAUA,EAAe,IAAKA,EAAe,IAAM,EAAmB,EAClG,IAAMpO,EAAWoO,EAAe,IAC1BnO,EAAUmO,EAAe,cAAc,EAC7C,GAAInO,EAAQ,OAAS,OAAQ,CACzB,IAAMqC,EAAQC,EAAkB2L,EAAQ,UAAWlO,EAAUL,GAAKA,EAAE,UAAU,EAC1E6C,EACAF,IAAU,IAEV8L,EAAe,IAAMpO,EACrBwC,EAAW,MAAM0L,EAAQ,aAAa,GAItC1L,EAAW0L,EAAQ,UAAU5L,CAAK,EAGlC+L,IACAA,EAAa,aAAe7L,GAChC6L,EAAe7L,EACXK,IACAL,EAAS,yBAA2B,GACpCK,EAA8B,IAElC,GAAM,CAAE,cAAAkK,EAAe,YAAA/K,EAAa,mBAAA4L,CAAmB,EAAIG,EAAa,EACxE,GAAIH,EAAoB,CACpB,IAAMpL,EAAW,KAAK,cAAc,UAAUuK,CAAa,EAC3D,OAAO,KAAK,sBAAsBvK,EAAUR,EAAasK,CAAO,CACpE,CACIS,IAAkB,KAClBuB,EAAoBvB,EACpBwB,EAAkBvM,EAE1B,CACAoM,EAAe,IAAMpO,EAAWC,EAAQ,SAC5C,CACA,IAAIyO,EAAS,KACPC,EAAeL,IAAsB,GAAK,KAAK,cAAc,UAAUA,CAAiB,EAAI,KAMlG,GALIK,IAEAD,EAAS,MAAM,KAAK,sBAAsBC,EAAcJ,EAAiBjC,CAAO,GAGhF,CAACoC,GAAUD,IAAgB,CAACE,GAAgBA,EAAa,WAAaF,EAAY,YAAa,CAI/F,IAAMG,EADsB,KAAK,cAAc,oBAAoBJ,EAAmB,CAAC,GACvC,WAAa,KAC7D,OAAO,KAAK,wBAAwBT,EAAca,EAAoBX,EAAiB3B,CAAO,CAClG,CACA,OAAOoC,CACX,QACA,CACIP,EAAQ,CACZ,CACJ,CACJ,EACM5K,GAAN,cAAuC6I,EAAoB,CACvD,YAAY9L,EAAe,CACvB,MAAMA,CAAa,EACnB,KAAK,qBAAuB,KAC5B,KAAK,cAAgBA,CACzB,CACA,UAAW,CACP,OAAO,KAAK,cAAc,KAAK,KACnC,CACA,eAAgB,CACZ,OAAO,KAAK,cAAc,KAAK,KACnC,CACA,gBAAiB,CACb,OAAO,KAAK,cAAc,KAAK,MACnC,CACA,aAAc,CACV,OAAO,KAAK,cAAc,QAC9B,CACA,MAAM,eAAgB,CAClB,MAAO,CACH,UAAW,KAAK,cAAc,KAAK,YAAY,UAC/C,SAAU,KAAK,cAAc,KAAK,YAAY,SAC9C,OAAQ,KAAK,cAAc,KAAK,YAAY,OAC5C,UAAW,KAAK,cAAc,KAAK,YAAY,SACnD,CACJ,CACA,MAAM,kBAAmB,CACrB,OAAK,KAAK,cAAc,KAAK,MAGtB,KAAK,wBAA0B,SAAY,CAC9C,GAAI,KAAK,cAAc,KAAK,QAAU,OAAS,CAAC,KAAK,cAAc,KAAK,aAAc,CAClF,IAAMuO,EAAc,MAAM,KAAK,eAAe,CAAC,CAAC,EAChD,KAAK,cAAc,KAAK,aAAeA,GAAeC,GAA8BD,EAAY,IAAI,CACxG,SACS,KAAK,cAAc,KAAK,QAAU,OAAS,CAAC,KAAK,cAAc,KAAK,aAAc,CACvF,IAAMA,EAAc,MAAM,KAAK,eAAe,CAAC,CAAC,EAChD,KAAK,cAAc,KAAK,aAAeA,GAAeE,GAA8BF,EAAY,IAAI,CACxG,CACA,MAAO,CACH,MAAOG,GAAwB,KAAK,cAAc,IAAI,EACtD,WAAY,KAAK,cAAc,KAAK,MACpC,YAAa,KAAK,cAAc,KAAK,OACrC,YAAa,KAAK,cAAc,KAAK,kBAAoB,OACzD,WAAY,KAAK,cAAc,KAAK,YAAc,MACtD,CACJ,GAAG,EAlBQ,IAmBf,CACJ,EACMtL,GAAN,cAAuC0I,EAAoB,CACvD,YAAY9L,EAAe,CACvB,MAAMA,CAAa,EACnB,KAAK,cAAgB,KACrB,KAAK,cAAgBA,CACzB,CACA,UAAW,CACP,OAAO,KAAK,cAAc,KAAK,KACnC,CACA,qBAAsB,CAClB,OAAO,KAAK,cAAc,KAAK,gBACnC,CACA,eAAgB,CACZ,OAAO,KAAK,cAAc,KAAK,UACnC,CACA,MAAM,kBAAmB,CACrB,OAAK,KAAK,cAAc,KAAK,MAGtB,KAAK,gBAAkB,CAC1B,MAAO2O,GAAwB,KAAK,cAAc,IAAI,EACtD,iBAAkB,KAAK,cAAc,KAAK,iBAC1C,WAAY,KAAK,cAAc,KAAK,WACpC,YAAa,KAAK,cAAc,KAAK,kBAAoB,MAC7D,EAPW,IAQf,CACJ,EACMtC,GAA6B,CAACpM,EAAa2O,IAAmB,CAChE,GAAI3O,EAAY,uBAAwB,CACpC,IAAM+B,EAAQhB,EAAwBf,EAAY,uBAAwB2O,EAAgBvP,GAAKA,EAAE,qBAAqB,EACtH,OAAI2C,IAAU,GACH,GAEJ/B,EAAY,uBAAuB+B,CAAK,EAAE,WACrD,KACK,CACD,IAAMA,EAAQhB,EAAwBf,EAAY,oBAAqB2O,EAAgBvP,GAAKA,EAAE,oBAAoB,EAClH,GAAI2C,IAAU,GACV,MAAO,GAEX,IAAMP,EAAQxB,EAAY,oBAAoB+B,CAAK,EACnD,OAAOP,EAAM,WACP,KAAK,IAAI,KAAK,OAAOmN,EAAiBnN,EAAM,sBAAwBA,EAAM,KAAK,EAAGA,EAAM,MAAQ,CAAC,CAC3G,CACJ,EACMwL,GAAgB,CAAChN,EAAayB,IAAgB,CAChD,IAAMmN,EAAmB7N,EAAwBf,EAAY,oBAAqByB,EAAarC,GAAKA,EAAE,UAAU,EAC1GyP,EAAc7O,EAAY,oBAAoB4O,CAAgB,EACpE,GAAI,CAACC,GAAeA,EAAY,WAAaA,EAAY,OAASpN,EAC9D,OAAO,KAIX,IAAIqN,EAFoBD,EAAY,sBAC7BpN,EAAcoN,EAAY,YAAcA,EAAY,MAErDE,EAAmBhO,EAAwBf,EAAY,6BAA8ByB,EAAarC,GAAKA,EAAE,UAAU,EACnH4P,EAAchP,EAAY,6BAA6B+O,CAAgB,EACzEC,GAAevN,EAAcuN,EAAY,WAAaA,EAAY,QAClEF,GAAyBE,EAAY,QAEzC,IAAMzK,EAAavE,EAAY,YAAY,KAAK,IAAIyB,EAAazB,EAAY,YAAY,OAAS,CAAC,CAAC,EAC9FiP,EAAkBlO,EAAwBf,EAAY,cAAeyB,EAAarC,GAAKA,EAAE,gBAAgB,EACzGoB,EAAaR,EAAY,cAAciP,CAAe,EAC5D/O,EAAOM,CAAU,EACjB,IAAM0O,EAAa1O,EAAW,gBACxB,KAAK,OAAOiB,EAAcjB,EAAW,kBAAoBA,EAAW,eAAe,EACnFsI,EAAc9I,EAAY,aAAakP,CAAU,EACjDC,EAA0B3O,EAAW,kBACpC0O,EAAa1O,EAAW,iBAAmBA,EAAW,gBACzDe,EAAY,EACZgH,EAAeO,EACnB,GAAI9I,EAAY,YAAY,SAAW,EACnCuI,GAAgBhE,GAAc9C,EAAc0N,GAC5C5N,GAAagD,EAAa/D,EAAW,oBAGrC,SAASD,EAAI4O,EAAyB5O,EAAI4O,EAA0B3O,EAAW,gBAAiBD,IAAK,CACjG,IAAMgE,EAAavE,EAAY,YAAYO,CAAC,EACxCA,EAAIkB,IACJ8G,GAAgBhE,GAEpBhD,GAAagD,CACjB,CAEJ,IAAI4I,EAAW0B,EAAY,MAC3B,GAAI7O,EAAY,uBAAwB,CAGpC,IAAMoP,EAAoBpP,EAAY,8BAA8ByB,CAAW,EAC/EvB,EAAOkP,IAAsB,MAAS,EAClCA,EAAoBpP,EAAY,uBAAuB,OAAS,IAGhEmN,EAFkBnN,EAAY,uBAAuBoP,EAAoB,CAAC,EAC9B,sBACLN,EAE/C,CACA,MAAO,CACH,sBAAAA,EACA,SAAA3B,EACA,aAAA5E,EACA,WAAAhE,EACA,YAAAuE,EACA,UAAAvH,EACA,WAAYvB,EAAY,iBAClBgC,EAAkBhC,EAAY,iBAAkByB,EAAarC,GAAKA,CAAC,IAAM,GACzE,EACV,CACJ,EACMsN,GAAoC,CAAC1M,EAAayB,IAAgB,CACpE,GAAI,CAACzB,EAAY,iBACb,OAAOyB,EAEX,IAAMM,EAAQhB,EAAwBf,EAAY,iBAAkByB,EAAarC,GAAKA,CAAC,EACvF,OAAOY,EAAY,iBAAiB+B,CAAK,GAAK,EAClD,EACM+K,GAAgC,CAAC9M,EAAayB,IAAgB,CAChE,GAAI,CAACzB,EAAY,iBACb,OAAOyB,EAAc,EAEzB,IAAMM,EAAQhB,EAAwBf,EAAY,iBAAkByB,EAAarC,GAAKA,CAAC,EACvF,OAAOY,EAAY,iBAAiB+B,EAAQ,CAAC,GAAK,EACtD,EACMS,GAAqC,CAACL,EAAW8J,IAAc,CACjE9J,EAAU,gBAAkB8J,EAC5B9J,EAAU,cAAgB8J,EAC1B,QAAWvK,KAAUS,EAAU,QAC3BT,EAAO,uBAAyBuK,EAEpC,QAAWzK,KAASW,EAAU,uBAC1BX,EAAM,uBAAyByK,CAEvC,EAEMzI,GAA6BJ,GAAW,CAC1C,GAAM,CAACiM,EAAK,CAAE,CAAEC,CAAG,EAAIlM,EACjBmM,EAAS,KAAK,MAAMF,EAAKC,CAAG,EAC5BE,EAAWH,EAAME,EACjBE,EAAWH,EAAMC,EAEvB,MAAO,CAAC,KAAK,MAAME,EAAUD,CAAQ,GAAK,IAAM,KAAK,GACzD,ECnjEA,IAAME,GAAoB,CACtB,CAAE,GAAIC,EAAO,SAAU,KAAM,cAAe,EAC5C,CAAE,GAAIA,EAAO,KAAM,KAAM,UAAW,EACpC,CAAE,GAAIA,EAAO,OAAQ,KAAM,YAAa,EACxC,CAAE,GAAIA,EAAO,KAAM,KAAM,UAAW,CACxC,EACaC,GAAN,cAA8BC,CAAQ,CACzC,YAAYC,EAAO,CACf,MAAMA,CAAK,EACX,KAAK,oBAAsB,KAC3B,KAAK,SAAW,CAAC,EACjB,KAAK,eAAiB,KACtB,KAAK,aAAe,KACpB,KAAK,eAAiB,KACtB,KAAK,aAAe,KACpB,KAAK,eAAiB,KACtB,KAAK,OAAS,GACd,KAAK,eAAiB,IAAIC,GAAWD,EAAM,WAAW,EAEtD,KAAK,cAAgB,IAAIC,GAAW,IAAIC,EAAOF,EAAM,OAAQ,GAAK,GAAK,EAAE,CAAC,CAC9E,CACA,MAAM,iBAAkB,CACpB,IAAMG,EAAS,MAAM,KAAK,UAAU,EAC9BC,EAAiB,MAAM,QAAQ,IAAID,EAAO,IAAIE,GAAKA,EAAE,gBAAgB,CAAC,CAAC,EAC7E,OAAO,KAAK,IAAI,EAAG,GAAGD,CAAc,CACxC,CACA,MAAM,WAAY,CACd,aAAM,KAAK,aAAa,EACjB,KAAK,SAAS,QAAQE,GAAWA,EAAQ,OAAO,IAAIC,GAASA,EAAM,UAAU,CAAC,CACzF,CACA,MAAM,aAAc,CAChB,MAAM,KAAK,aAAa,EACxB,IAAMJ,EAAS,MAAM,KAAK,UAAU,EAC9BK,EAAe,MAAM,QAAQ,IAAIL,EAAO,IAAIE,GAAKA,EAAE,wBAAwB,CAAC,CAAC,EACnF,OAAOI,GAAsB,CACzB,OAAQ,KAAK,OACb,SAAU,KAAK,SAAS,KAAKH,GAAWA,EAAQ,OAAO,KAAKD,GAAKA,EAAE,MAAM,OAAS,OAAO,CAAC,EAC1F,SAAU,KAAK,SAAS,KAAKC,GAAWA,EAAQ,OAAO,KAAKD,GAAKA,EAAE,MAAM,OAAS,OAAO,CAAC,EAC1F,aAAcG,EAAa,OAAO,OAAO,CAC7C,CAAC,CACL,CACA,cAAe,CACX,OAAO,KAAK,uBAAyB,SAAY,CAC7C,KAAK,eAAe,IAAM,EAC1B,IAAME,EAAW,MAAM,KAAK,MAAM,OAAO,QAAQ,EACjD,KAAO,KAAK,eAAe,KAAOA,EAAWC,IAAiB,CAC1D,MAAM,KAAK,eAAe,OAAO,UAAU,KAAK,eAAe,IAAK,KAAK,eAAe,IAAMC,EAAe,EAC7G,GAAM,CAAE,GAAAC,EAAI,KAAAC,CAAK,EAAI,KAAK,eAAe,kBAAkB,EACrDC,EAAW,KAAK,eAAe,IACrC,GAAIF,IAAOhB,EAAO,KACdmB,GAAkBF,CAAI,EACtB,MAAM,KAAK,eAAe,OAAO,UAAU,KAAK,eAAe,IAAK,KAAK,eAAe,IAAMA,CAAI,EAClG,KAAK,uBAAuB,KAAK,eAAgBA,CAAI,UAEhDD,IAAOhB,EAAO,UACnB,MAAM,KAAK,YAAYiB,CAAI,EACvBA,IAAS,MAGT,MAGRE,GAAkBF,CAAI,EACtB,KAAK,eAAe,IAAMC,EAAWD,CACzC,CACJ,GAAG,CACP,CACA,MAAM,YAAYG,EAAU,CACxB,IAAMC,EAAmB,KAAK,eAAe,IAC7C,KAAK,eAAiB,CAClB,aAAc,GACd,SAAU,GACV,WAAY,GACZ,SAAU,GACV,eAAgB,GAChB,gBAAiB,GACjB,SAAU,GACV,YAAa,CAAC,EACd,OAAQ,CAAC,EACT,UAAW,CAAC,EACZ,aAAcA,EACd,cAAeD,IAAa,KACtB,MAAM,KAAK,MAAM,OAAO,QAAQ,EAChCC,EAAmBD,EACzB,oBAAqBC,EACrB,SAAU,CAAC,EACX,mBAAoB,IAAIC,EAC5B,EACA,KAAK,SAAS,KAAK,KAAK,cAAc,EAEtC,MAAM,KAAK,eAAe,OAAO,UAAU,KAAK,eAAe,IAAK,KAAK,eAAe,IAAM,GAAK,EAAE,EACrG,IAAIC,EAAqB,GACzB,KAAO,KAAK,eAAe,IAAM,KAAK,eAAe,eAAe,CAChE,MAAM,KAAK,eAAe,OAAO,UAAU,KAAK,eAAe,IAAK,KAAK,eAAe,IAAMR,EAAe,EAC7G,IAAMS,EAAkB,KAAK,eAAe,IACtC,CAAE,GAAAR,EAAI,KAAAC,CAAK,EAAI,KAAK,eAAe,kBAAkB,EACrDQ,EAAe,KAAK,eAAe,IACnCC,EAAuB3B,GAAkB,UAAUS,GAAKA,EAAE,KAAOQ,CAAE,EACzE,GAAIU,IAAyB,GAAI,CAC7B,IAAMC,EAAQ5B,GAAkB2B,CAAoB,EAAE,KACtD,KAAK,eAAeC,CAAK,EAAI,GAC7BR,GAAkBF,CAAI,EACtB,MAAM,KAAK,eAAe,OAAO,UAAU,KAAK,eAAe,IAAK,KAAK,eAAe,IAAMA,CAAI,EAClG,KAAK,uBAAuB,KAAK,eAAgBA,CAAI,CACzD,MACSD,IAAOhB,EAAO,UACduB,IACDA,EAAqB,GACrB,KAAK,eAAe,oBAAsBC,IAGlD,GAAI,KAAK,eAAe,UAAY,KAAK,eAAe,YAAc,KAAK,eAAe,SAEtF,MAEJ,GAAI,KAAK,eAAe,aAAc,CAClC,IAAII,EAAU,KAAK,eAAe,SAC9BC,EAAY,KAAK,eAAe,WAChCC,EAAU,KAAK,eAAe,SAClC,QAAWC,KAAS,KAAK,eAAe,YAChCA,EAAM,KAAO/B,EAAO,KACpB4B,EAAU,GAELG,EAAM,KAAO/B,EAAO,OACzB6B,EAAY,GAEPE,EAAM,KAAO/B,EAAO,OACzB8B,EAAU,IAGlB,GAAIF,GAAWC,GAAaC,EAExB,KAER,CACA,GAAIb,IAAS,KACT,MAEJ,KAAK,eAAe,IAAMQ,EAAeR,EACpCM,IACD,KAAK,eAAe,oBAAsB,KAAK,eAAe,IAEtE,CAEA,QAAWS,KAAUjC,GAAmB,CACpC,GAAI,KAAK,eAAeiC,EAAO,IAAI,EAC/B,SACJ,IAAMC,EAAY,KAAK,eAAe,YAAY,KAAKF,GAASA,EAAM,KAAOC,EAAO,EAAE,EACtF,GAAI,CAACC,EACD,SACJ,KAAK,eAAe,IAAMZ,EAAmBY,EAAU,gBACvD,MAAM,KAAK,eAAe,OAAO,UAAU,KAAK,eAAe,IAAK,KAAK,eAAe,IAAM,GAAK,EAAE,EACrG,GAAM,CAAE,GAAAjB,EAAI,KAAAC,CAAK,EAAI,KAAK,eAAe,kBAAkB,EACvDD,IAAOgB,EAAO,KAElBb,GAAkBF,CAAI,EACtB,KAAK,eAAee,EAAO,IAAI,EAAI,GACnC,MAAM,KAAK,eAAe,OAAO,UAAU,KAAK,eAAe,IAAK,KAAK,eAAe,IAAMf,CAAI,EAClG,KAAK,uBAAuB,KAAK,eAAgBA,CAAI,EACzD,CAEA,KAAK,eAAe,OAAO,KAAK,CAACiB,EAAGC,IAAM,OAAOA,EAAE,SAAS,EAAI,OAAOD,EAAE,SAAS,CAAC,EAEnF,KAAK,eAAe,UAAU,KAAK,CAACA,EAAGC,IAAMD,EAAE,gBAAkBC,EAAE,eAAe,EAIlF,IAAMC,EAAc,KAAK,eAAe,OAAO,IAAI5B,GAAKA,EAAE,EAAE,EACtD6B,EAAoB,IAAI,IAC1BC,EAAsB,KACtBC,EAAe,KACnB,QAAWC,KAAY,KAAK,eAAe,UAAW,CAClD,GAAIA,EAAS,kBAAoBF,EAAqB,CAClD,QAAWtB,KAAMqB,EAEbI,EAAOF,CAAY,EACL,KAAK,eAAe,OAAO,KAAK/B,GAAKA,EAAE,KAAOQ,CAAE,EACxD,UAAU,KAAKuB,CAAY,EAErC,QAAWvB,KAAMoB,EACbC,EAAkB,IAAIrB,CAAE,CAEhC,CAEA,GADAuB,EAAeC,EACX,CAACH,EAAkB,IAAIG,EAAS,OAAO,EACvC,SAEU,KAAK,eAAe,OAAO,KAAKhC,GAAKA,EAAE,KAAOgC,EAAS,OAAO,EACtE,UAAU,KAAKA,CAAQ,EAC7BH,EAAkB,OAAOG,EAAS,OAAO,EACzCF,EAAsBE,EAAS,eACnC,CACA,QAAWxB,KAAMqB,EACbI,EAAOF,CAAY,EACL,KAAK,eAAe,OAAO,KAAK/B,GAAKA,EAAE,KAAOQ,CAAE,EACxD,UAAU,KAAKuB,CAAY,EAErC,QAAW7B,KAAS,KAAK,eAAe,OAEpCA,EAAM,UAAU,KAAK,CAACwB,EAAGC,IAAMD,EAAE,KAAOC,EAAE,IAAI,EAElD,KAAK,eAAiB,IAC1B,CACA,MAAM,YAAY1B,EAAS,CACvB,MAAM,KAAK,eAAe,OAAO,UAAU,KAAK,eAAe,IAAK,KAAK,eAAe,IAAMM,EAAe,EAC7G,IAAMS,EAAkB,KAAK,eAAe,IACtCkB,EAAgB,KAAK,eAAe,kBAAkB,EACtD1B,EAAK0B,EAAc,GACrBzB,EAAOyB,EAAc,KACnBjB,EAAe,KAAK,eAAe,IACrCR,IAAS,OAIT,KAAK,cAAc,IAAMQ,EAEzBR,GADuB,MAAM,KAAK,cAAc,uBAAuB0B,GAAwBlC,EAAQ,aAAa,GAC1FA,EAAQ,eAAiBgB,GAEvDgB,EAAOzB,IAAOhB,EAAO,OAAO,EAE5B,KAAK,cAAc,IAAMyB,EACzB,MAAM,KAAK,cAAc,OAAO,UAAU,KAAK,cAAc,IAAK,KAAK,cAAc,IAAMR,CAAI,EAC/F,IAAM2B,EAAU,CACZ,gBAAApB,EACA,cAAeC,EAAeR,EAC9B,aAAAQ,EACA,UAAW,GACX,UAAW,IAAI,IACf,YAAa,KACb,wBAAyB,EAC7B,EACA,KAAK,eAAiBmB,EACtB,KAAK,uBAAuB,KAAK,cAAe3B,CAAI,EACpD,OAAW,CAAC4B,EAASC,CAAS,IAAKF,EAAQ,UAAW,CAClD,IAAIG,EAAuB,GAE3BN,EAAOK,EAAU,OAAO,OAAS,CAAC,EAClC,QAASE,EAAI,EAAGA,EAAIF,EAAU,OAAO,OAAQE,IAAK,CAC9C,IAAMC,EAAQH,EAAU,OAAOE,CAAC,EAChCC,EAAM,WAAaL,EAAQ,UAC3BG,IAAyBE,EAAM,qBAAqB,OAAS,CACjE,CACIF,IACAD,EAAU,OAASI,GAAuBJ,EAAU,MAAM,GAE9DA,EAAU,uBAAyBA,EAAU,OACxC,IAAI,CAACG,EAAOD,KAAO,CAAE,UAAWC,EAAM,UAAW,WAAYD,CAAE,EAAE,EACjE,KAAK,CAACd,EAAGC,IAAMD,EAAE,UAAYC,EAAE,SAAS,EAC7C,QAASa,EAAI,EAAGA,EAAIF,EAAU,uBAAuB,OAAQE,IAAK,CAC9D,IAAMG,EAAeL,EAAU,uBAAuBE,CAAC,EACjDI,EAAeN,EAAU,OAAOK,EAAa,UAAU,EAI7D,GAHIL,EAAU,yBAA2B,MAAQM,EAAa,aAC1DN,EAAU,uBAAyBM,EAAa,WAEhDJ,EAAIF,EAAU,uBAAuB,OAAS,EAAG,CAEjD,IAAMO,EAAYP,EAAU,uBAAuBE,EAAI,CAAC,EACxDI,EAAa,SAAWC,EAAU,UAAYD,EAAa,SAC/D,CACJ,CACA,IAAME,EAAaR,EAAU,OAAOA,EAAU,uBAAuB,CAAC,EAAE,UAAU,EAC5ES,EAAYT,EAAU,OAAOU,EAAKV,EAAU,sBAAsB,EAAE,UAAU,EACpFA,EAAU,eAAiBQ,EAAW,UACtCR,EAAU,aAAeS,EAAU,UAAYA,EAAU,SACzD,IAAM7C,EAAQD,EAAQ,OAAO,KAAKD,GAAKA,EAAE,KAAOqC,CAAO,EACvD,GAAInC,EAAO,CACP,IAAM+C,EAAiBC,EAAwBhD,EAAM,SAAUkC,EAAQ,gBAAiBpC,GAAKA,EAAE,eAAe,EAG9G,GAFAE,EAAM,SAAS,OAAO+C,EAAiB,EAAG,EAAGb,CAAO,EAChCE,EAAU,yBAA2B,KACxC,CACb,IAAMW,EAAiBC,EAAwBhD,EAAM,qBAAsBkC,EAAQ,gBAAiBpC,GAAKA,EAAE,eAAe,EAC1HE,EAAM,qBAAqB,OAAO+C,EAAiB,EAAG,EAAGb,CAAO,CACpE,CACJ,CACJ,CACA,IAAMa,EAAiBC,EAAwBjD,EAAQ,SAAUe,EAAiBhB,GAAKA,EAAE,eAAe,EACxG,OAAAC,EAAQ,SAAS,OAAOgD,EAAiB,EAAG,EAAGb,CAAO,EACtD,KAAK,eAAiB,KACfA,CACX,CACA,sBAAsBA,EAASe,EAAa,CACxC,IAAIb,EAAYF,EAAQ,UAAU,IAAIe,CAAW,EACjD,OAAKb,IACDA,EAAY,CACR,eAAgB,EAChB,aAAc,EACd,uBAAwB,KACxB,OAAQ,CAAC,EACT,uBAAwB,CAAC,CAC7B,EACAF,EAAQ,UAAU,IAAIe,EAAab,CAAS,GAEzCA,CACX,CACA,uBAAuBc,EAAQC,EAAW,CACtC,IAAMC,EAAaF,EAAO,IAC1B,KAAOA,EAAO,IAAME,GAAcD,EAAY/C,IAC1C,KAAK,gBAAgB8C,CAAM,CAEnC,CACA,gBAAgBA,EAAQ,CACpB,GAAM,CAAE,GAAA5C,EAAI,KAAAC,CAAK,EAAI2C,EAAO,kBAAkB,EACxCnC,EAAemC,EAAO,IAE5B,OADAzC,GAAkBF,CAAI,EACdD,EAAI,CACR,KAAKhB,EAAO,QAEJ,KAAK,OAAS4D,EAAO,WAAW3C,CAAI,IAAM,OAG9C,MACJ,KAAKjB,EAAO,KACR,CACI,GAAI,CAAC,KAAK,eACN,MACJ,IAAMiC,EAAY,CAAE,GAAI,GAAI,gBAAiB,EAAG,EAChD,KAAK,eAAe,YAAY,KAAKA,CAAS,EAC9C,KAAK,uBAAuB2B,EAAQ3C,CAAI,GACpCgB,EAAU,KAAO,IAAMA,EAAU,kBAAoB,KACrD,KAAK,eAAe,YAAY,IAAI,CAE5C,CAEA,MACJ,KAAKjC,EAAO,OACR,CACI,IAAM+D,EAAgB,KAAK,gBAAgB,YAAY,KAAK,eAAe,YAAY,OAAS,CAAC,EACjG,GAAI,CAACA,EACD,MACJA,EAAc,GAAKH,EAAO,gBAAgB3C,CAAI,CAClD,CAEA,MACJ,KAAKjB,EAAO,aACR,CACI,IAAM+D,EAAgB,KAAK,gBAAgB,YAAY,KAAK,eAAe,YAAY,OAAS,CAAC,EACjG,GAAI,CAACA,EACD,MACJA,EAAc,gBAAkBH,EAAO,gBAAgB3C,CAAI,CAC/D,CAEA,MACJ,KAAKjB,EAAO,eACR,CACI,GAAI,CAAC,KAAK,eACN,MACJ,KAAK,eAAe,eAAiB4D,EAAO,gBAAgB3C,CAAI,EAChE,KAAK,eAAe,gBAAkB,IAAM,KAAK,eAAe,cACpE,CAEA,MACJ,KAAKjB,EAAO,SACR,CACI,GAAI,CAAC,KAAK,eACN,MACJ,KAAK,eAAe,SAAW4D,EAAO,UAAU3C,CAAI,CACxD,CAEA,MACJ,KAAKjB,EAAO,WACR,CACI,GAAI,CAAC,KAAK,eACN,MAgBJ,GAfA,KAAK,aAAe,CAChB,GAAI,GACJ,QAAS,KAAK,eACd,QAAS,KACT,SAAU,CAAC,EACX,qBAAsB,CAAC,EACvB,UAAW,CAAC,EACZ,UAAW,GACX,WAAY,KACZ,QAAS,KACT,aAAc,KACd,aAAcgE,EACd,KAAM,IACV,EACA,KAAK,uBAAuBJ,EAAQ3C,CAAI,EACpC,KAAK,cACF,KAAK,aAAa,KAAO,IACzB,KAAK,aAAa,SAClB,KAAK,aAAa,KAAM,CAC3B,IAAMgD,EAAa,KAAK,aAAa,QAAQ,QAAQ,GAAG,EAClDC,EAAuBD,IAAe,GACtC,KAAK,aAAa,QAClB,KAAK,aAAa,QAAQ,MAAM,EAAGA,CAAU,EACnD,GAAI,KAAK,aAAa,KAAK,OAAS,SAC7B,KAAK,aAAa,KAAK,QAAU,IACjC,KAAK,aAAa,KAAK,SAAW,GAAI,CACrC,KAAK,aAAa,UAAYE,EAAiB,KAC/C,KAAK,aAAa,KAAK,MAAQ,MAC/B,KAAK,aAAa,KAAK,iBAAmB,KAAK,aAAa,cAEvD,KAAK,aAAa,UAAYA,EAAiB,MACpD,KAAK,aAAa,KAAK,MAAQ,OAC/B,KAAK,aAAa,KAAK,iBAAmB,KAAK,aAAa,cAEvDD,IAAyBC,EAAiB,IAC/C,KAAK,aAAa,KAAK,MAAQ,MAE1BD,IAAyBC,EAAiB,IAC/C,KAAK,aAAa,KAAK,MAAQ,MAE1BD,IAAyBC,EAAiB,MAC/C,KAAK,aAAa,KAAK,MAAQ,OAEnC,IAAMC,EAAa,KAAK,aAClBC,EAAa,IAAIC,EAAgB,IAAIC,GAA0BH,CAAU,CAAC,EAChF,KAAK,aAAa,WAAaC,EAC/B,KAAK,eAAe,OAAO,KAAK,KAAK,YAAY,CACrD,SACS,KAAK,aAAa,KAAK,OAAS,SAClC,KAAK,aAAa,KAAK,mBAAqB,IAC5C,KAAK,aAAa,KAAK,aAAe,GAAI,CACzCH,IAAyBC,EAAiB,KAC1C,KAAK,aAAa,KAAK,MAAQ,MAC/B,KAAK,aAAa,KAAK,aAAe,CAClC,QAAS,KAAK,aAAa,QAAQ,SAAS,OAAO,CACvD,EACA,KAAK,aAAa,KAAK,iBAAmB,KAAK,aAAa,cAEvD,KAAK,aAAa,UAAYA,EAAiB,IACpD,KAAK,aAAa,KAAK,MAAQ,MAE1BD,IAAyBC,EAAiB,MAC/C,KAAK,aAAa,KAAK,MAAQ,OAC/B,KAAK,aAAa,KAAK,iBAAmB,KAAK,aAAa,cAEvDD,IAAyBC,EAAiB,QAC/C,KAAK,aAAa,KAAK,MAAQ,SAC/B,KAAK,aAAa,KAAK,iBAAmB,KAAK,aAAa,cAEvDD,IAAyBC,EAAiB,MAC/C,KAAK,aAAa,KAAK,MAAQ,OAC/B,KAAK,aAAa,KAAK,iBAAmB,KAAK,aAAa,cAEvD,KAAK,aAAa,UAAY,gBAC/B,KAAK,aAAa,KAAK,WAAa,EACpC,KAAK,aAAa,KAAK,MAAQ,SAE1B,KAAK,aAAa,KAAK,WAAa,GACzC,KAAK,aAAa,KAAK,MAAQ,UAE1B,KAAK,aAAa,KAAK,WAAa,GACzC,KAAK,aAAa,KAAK,MAAQ,UAE1B,KAAK,aAAa,KAAK,WAAa,KACzC,KAAK,aAAa,KAAK,MAAQ,WAG9B,KAAK,aAAa,UAAY,gBAC/B,KAAK,aAAa,KAAK,WAAa,EACpC,KAAK,aAAa,KAAK,MAAQ,SAE1B,KAAK,aAAa,KAAK,WAAa,GACzC,KAAK,aAAa,KAAK,MAAQ,YAE1B,KAAK,aAAa,KAAK,WAAa,GACzC,KAAK,aAAa,KAAK,MAAQ,YAE1B,KAAK,aAAa,KAAK,WAAa,KACzC,KAAK,aAAa,KAAK,MAAQ,aAG9B,KAAK,aAAa,UAAY,qBAC/B,KAAK,aAAa,KAAK,WAAa,GACpC,KAAK,aAAa,KAAK,MAAQ,UAE1B,KAAK,aAAa,KAAK,WAAa,KACzC,KAAK,aAAa,KAAK,MAAQ,YAGvC,IAAMK,EAAa,KAAK,aAClBH,EAAa,IAAII,EAAgB,IAAIC,GAA0BF,CAAU,CAAC,EAChF,KAAK,aAAa,WAAaH,EAC/B,KAAK,eAAe,OAAO,KAAK,KAAK,YAAY,CACrD,CACJ,CACA,KAAK,aAAe,IACxB,CAEA,MACJ,KAAKrE,EAAO,YACR,CACI,GAAI,CAAC,KAAK,aACN,MACJ,KAAK,aAAa,GAAK4D,EAAO,gBAAgB3C,CAAI,CACtD,CAEA,MACJ,KAAKjB,EAAO,UACR,CACI,GAAI,CAAC,KAAK,aACN,MACJ,IAAM2E,EAAOf,EAAO,gBAAgB3C,CAAI,EACpC0D,IAAS,EACT,KAAK,aAAa,KAAO,CACrB,KAAM,QACN,MAAO,GACP,OAAQ,GACR,SAAU,EACV,MAAO,KACP,iBAAkB,KAClB,WAAY,IAChB,EAEKA,IAAS,IACd,KAAK,aAAa,KAAO,CACrB,KAAM,QACN,iBAAkB,GAClB,WAAY,GACZ,SAAU,GACV,MAAO,KACP,iBAAkB,KAClB,aAAc,IAClB,EAER,CAEA,MACJ,KAAK3E,EAAO,YACR,CACI,GAAI,CAAC,KAAK,aACN,MACY4D,EAAO,gBAAgB3C,CAAI,IAEvC,KAAK,eAAe,OAAO,IAAI,EAC/B,KAAK,aAAe,KAE5B,CAEA,MACJ,KAAKjB,EAAO,YACR,CACI,GAAI,CAAC,KAAK,aACN,MACJ,KAAK,aAAa,UAAY,CAAC,CAAC4D,EAAO,gBAAgB3C,CAAI,CAC/D,CAEA,MACJ,KAAKjB,EAAO,QACR,CACI,GAAI,CAAC,KAAK,aACN,MACJ,KAAK,aAAa,QAAU4D,EAAO,WAAW3C,CAAI,CACtD,CAEA,MACJ,KAAKjB,EAAO,aACR,CACI,GAAI,CAAC,KAAK,aACN,MACJ,KAAK,aAAa,aAAe4D,EAAO,UAAU3C,CAAI,CAC1D,CAEA,MACJ,KAAKjB,EAAO,SACR,CACI,GAAI,CAAC,KAAK,aACN,MACJ,KAAK,aAAa,aAAe4D,EAAO,WAAW3C,CAAI,EAClD2D,GAA0B,KAAK,aAAa,YAAY,IACzD,KAAK,aAAa,aAAeZ,EAEzC,CAEA,MACJ,KAAKhE,EAAO,MACR,CACI,GAAI,KAAK,cAAc,MAAM,OAAS,QAClC,MACJ,KAAK,uBAAuB4D,EAAQ3C,CAAI,CAC5C,CAEA,MACJ,KAAKjB,EAAO,WACR,CACI,GAAI,KAAK,cAAc,MAAM,OAAS,QAClC,MACJ,KAAK,aAAa,KAAK,MAAQ4D,EAAO,gBAAgB3C,CAAI,CAC9D,CAEA,MACJ,KAAKjB,EAAO,YACR,CACI,GAAI,KAAK,cAAc,MAAM,OAAS,QAClC,MACJ,KAAK,aAAa,KAAK,OAAS4D,EAAO,gBAAgB3C,CAAI,CAC/D,CAEA,MACJ,KAAKjB,EAAO,OACR,CACI,GAAI,KAAK,cAAc,MAAM,OAAS,QAClC,MACJ,KAAK,aAAa,KAAK,WAAa,CAAC,EACrC,KAAK,uBAAuB4D,EAAQ3C,CAAI,CAC5C,CAEA,MACJ,KAAKjB,EAAO,mBACR,CACI,GAAI,KAAK,cAAc,MAAM,OAAS,SAAW,CAAC,KAAK,aAAa,KAAK,WACrE,MACJ,IAAM6E,EAAqBjB,EAAO,gBAAgB3C,CAAI,EAChD6D,EAASC,GAAgCF,CAAkB,GAAK,KACtE,KAAK,aAAa,KAAK,WAAW,OAASC,CAC/C,CAEA,MACJ,KAAK9E,EAAO,MACR,CACI,GAAI,KAAK,cAAc,MAAM,OAAS,SAAW,CAAC,KAAK,aAAa,KAAK,WACrE,MACJ,KAAK,aAAa,KAAK,WAAW,UAAY4D,EAAO,gBAAgB3C,CAAI,IAAM,CACnF,CAEA,MACJ,KAAKjB,EAAO,wBACR,CACI,GAAI,KAAK,cAAc,MAAM,OAAS,SAAW,CAAC,KAAK,aAAa,KAAK,WACrE,MACJ,IAAMgF,EAA0BpB,EAAO,gBAAgB3C,CAAI,EACrD6D,EAASG,GAAqCD,CAAuB,GAAK,KAChF,KAAK,aAAa,KAAK,WAAW,SAAWF,CACjD,CAEA,MACJ,KAAK9E,EAAO,UACR,CACI,GAAI,KAAK,cAAc,MAAM,OAAS,SAAW,CAAC,KAAK,aAAa,KAAK,WACrE,MACJ,IAAMkF,EAAYtB,EAAO,gBAAgB3C,CAAI,EACvC6D,EAASK,GAA4BD,CAAS,GAAK,KACzD,KAAK,aAAa,KAAK,WAAW,UAAYJ,CAClD,CAEA,MACJ,KAAK9E,EAAO,WACR,CACI,GAAI,KAAK,cAAc,MAAM,OAAS,QAClC,MACJ,KAAK,uBAAuB4D,EAAQ3C,CAAI,CAC5C,CAEA,MACJ,KAAKjB,EAAO,mBACR,CACI,GAAI,KAAK,cAAc,MAAM,OAAS,QAClC,MAEJ,IAAMoF,EAAkB,CADPxB,EAAO,UAAU3C,CAAI,EAEtC,GAAI,CACA,KAAK,aAAa,KAAK,SAAWoE,GAAkBD,CAAe,CACvE,MACM,CAEN,CACJ,CAEA,MACJ,KAAKpF,EAAO,MACR,CACI,GAAI,KAAK,cAAc,MAAM,OAAS,QAClC,MACJ,KAAK,uBAAuB4D,EAAQ3C,CAAI,CAC5C,CAEA,MACJ,KAAKjB,EAAO,kBACR,CACI,GAAI,KAAK,cAAc,MAAM,OAAS,QAClC,MACJ,KAAK,aAAa,KAAK,WAAa4D,EAAO,UAAU3C,CAAI,CAC7D,CAEA,MACJ,KAAKjB,EAAO,SACR,CACI,GAAI,KAAK,cAAc,MAAM,OAAS,QAClC,MACJ,KAAK,aAAa,KAAK,iBAAmB4D,EAAO,gBAAgB3C,CAAI,CACzE,CAEA,MACJ,KAAKjB,EAAO,SACR,CACI,GAAI,KAAK,cAAc,MAAM,OAAS,QAClC,MACJ,KAAK,aAAa,KAAK,SAAW4D,EAAO,gBAAgB3C,CAAI,CACjE,CAEA,MACJ,KAAKjB,EAAO,SACR,CACI,GAAI,CAAC,KAAK,eACN,MACJ,KAAK,uBAAuB4D,EAAQ3C,CAAI,EACxC,KAAK,eAAiB,IAC1B,CAEA,MACJ,KAAKjB,EAAO,QAEJ,KAAK,eAAiB4D,EAAO,gBAAgB3C,CAAI,EAGrD,MACJ,KAAKjB,EAAO,kBACR,CACI,GAAI,KAAK,iBAAmB,KACxB,MACJyC,EAAO,KAAK,cAAc,EAC1B,IAAMD,EAAW,CAAE,KAAM,KAAK,eAAgB,QAAS,GAAI,gBAAiB,EAAG,EAC/E,KAAK,eAAe,UAAU,KAAKA,CAAQ,EAC3C,KAAK,uBAAuBoB,EAAQ3C,CAAI,GACpCuB,EAAS,UAAY,IAAMA,EAAS,kBAAoB,KACxD,KAAK,eAAe,UAAU,IAAI,CAE1C,CAEA,MACJ,KAAKxC,EAAO,SACR,CACI,IAAMuC,EAAe,KAAK,gBAAgB,UAAU,KAAK,eAAe,UAAU,OAAS,CAAC,EAC5F,GAAI,CAACA,EACD,MACJA,EAAa,QAAUqB,EAAO,gBAAgB3C,CAAI,CACtD,CAEA,MACJ,KAAKjB,EAAO,mBACR,CACI,IAAMuC,EAAe,KAAK,gBAAgB,UAAU,KAAK,eAAe,UAAU,OAAS,CAAC,EAC5F,GAAI,CAACA,EACD,MACJE,EAAO,KAAK,cAAc,EAC1BF,EAAa,gBAAkB,KAAK,eAAe,aAAeqB,EAAO,gBAAgB3C,CAAI,CACjG,CAEA,MACJ,KAAKjB,EAAO,UACR,CACI,GAAI,CAAC,KAAK,eACN,MACJ,KAAK,eAAe,UAAY4D,EAAO,gBAAgB3C,CAAI,CAC/D,CAEA,MACJ,KAAKjB,EAAO,YACR,CACI,GAAI,CAAC,KAAK,eACN,MACJ,IAAM2D,EAAcC,EAAO,WAAW,EAChC0B,EAAoB1B,EAAO,QAAQ,EAEnC2B,EAAa,CAAC,EADN3B,EAAO,OAAO,EACE,KACZ,KAAK,sBAAsB,KAAK,eAAgBD,CAAW,EACnE,OAAO,KAAK,CAClB,UAAW2B,EACX,SAAU,EACV,WAAAC,EACA,qBAAsB,CAAC,EACvB,KAAM3B,EAAO,UAAU3C,GAAQ2C,EAAO,IAAMnC,EAAa,CAC7D,CAAC,CACL,CAEA,MACJ,KAAKzB,EAAO,WACR,CACI,GAAI,CAAC,KAAK,eACN,MAEJ,GADA,KAAK,uBAAuB4D,EAAQ3C,CAAI,EACpC,KAAK,aAAc,CACnB,QAAS,EAAI,EAAG,EAAI,KAAK,aAAa,qBAAqB,OAAQ,IAC/D,KAAK,aAAa,qBAAqB,CAAC,GAAK,KAAK,aAAa,UAEnE,KAAK,aAAe,IACxB,CACJ,CAEA,MACJ,KAAKjB,EAAO,MACR,CACI,GAAI,CAAC,KAAK,eACN,MACJ,IAAM2D,EAAcC,EAAO,WAAW,EAChC0B,EAAoB1B,EAAO,QAAQ,EAEnC4B,EAAQ5B,EAAO,OAAO,EACtBd,EAAY,KAAK,sBAAsB,KAAK,eAAgBa,CAAW,EAC7E,KAAK,aAAe,CAChB,UAAW2B,EACX,SAAU,EACV,WAAY,GACZ,qBAAsB,CAAC,EACvB,KAAM1B,EAAO,UAAU3C,GAAQ2C,EAAO,IAAMnC,EAAa,CAC7D,EACAqB,EAAU,OAAO,KAAK,KAAK,YAAY,CAC3C,CAEA,MACJ,KAAK9C,EAAO,cACR,CACI,GAAI,CAAC,KAAK,aACN,MACJ,KAAK,aAAa,SAAW4D,EAAO,gBAAgB3C,CAAI,CAC5D,CAEA,MACJ,KAAKjB,EAAO,eACR,CACI,GAAI,CAAC,KAAK,aACN,MACJ,KAAK,aAAa,WAAa,GAC/B,IAAMsF,EAAoB1B,EAAO,cAAc3C,CAAI,EAEnD,KAAK,aAAa,qBAAqB,KAAKqE,CAAiB,CACjE,CAEA,KACR,CACA1B,EAAO,IAAMnC,EAAeR,CAChC,CACJ,EACMwE,GAAN,KAA2B,CACvB,YAAYC,EAAe,CACvB,KAAK,cAAgBA,EACrB,KAAK,wBAA0B,IAAI,OACvC,CACA,OAAQ,CACJ,OAAO,KAAK,cAAc,EAC9B,CACA,UAAW,CACP,MAAM,IAAI,MAAM,gCAAgC,CACpD,CACA,MAAM,iBAAkB,CACpB,IAAMC,EAAa,MAAM,KAAK,UAAU,IAAU,CAAE,aAAc,EAAK,CAAC,EACxE,OAAQA,GAAY,WAAa,IAAMA,GAAY,UAAY,EACnE,CACA,iBAAkB,CACd,OAAO,KAAK,cAAc,YAC9B,CACA,MAAM,mBAAoB,CAEtB,OADoB,MAAM,KAAK,eAAe,CAAE,aAAc,EAAK,CAAC,IAChD,WAAa,CACrC,CACA,mBAAoB,CAChB,OAAO,KAAK,cAAc,QAAQ,eACtC,CACA,MAAM,eAAeC,EAAS,CAC1B,OAAO,KAAK,qBAAqB,IAAM,CACnC,IAAMC,EAAe,KAAK,cAAc,QAAQ,SAAS,CAAC,GAAK,KAC/D,GAAIA,GAAc,wBAAyB,CAEvC,IAAIC,EAAiBD,EACrB,KAAOC,GAAgB,CAEnB,GADkBA,EAAe,UAAU,IAAI,KAAK,cAAc,EAAE,EAEhE,MAAO,CACH,aAAcC,EAAkB,KAAK,cAAc,SAAUD,EAAe,gBAAiBtF,GAAKA,EAAE,eAAe,EACnH,WAAY,EACZ,kBAAmB,EACvB,EAEJsF,EAAiBA,EAAe,WACpC,CACJ,CACA,MAAO,CACH,aAAc,GACd,WAAY,GACZ,kBAAmB,EACvB,CACJ,EAAG,KACH,IAAUF,CAAO,CACrB,CACA,cAAcI,EAAW,CAIrB,OAAOC,GAAiBD,EAAY,KAAK,cAAc,QAAQ,gBAAiB,EAAE,CACtF,CACA,MAAM,UAAUA,EAAWJ,EAAS,CAChC,IAAMM,EAAuB,KAAK,cAAcF,CAAS,EACzD,OAAO,KAAK,qBAAqB,IAAM,KAAK,gCAAgCE,CAAoB,EAAGA,EAAsBA,EAAsBN,CAAO,CAC1J,CACA,MAAM,cAAcO,EAAQP,EAAS,CACjC,IAAMQ,EAAoB,KAAK,wBAAwB,IAAID,CAAM,EACjE,GAAIC,IAAsB,OACtB,MAAM,IAAI,MAAM,yCAAyC,EAE7D,IAAMtD,EAAYsD,EAAkB,QAAQ,UAAU,IAAI,KAAK,cAAc,EAAE,EACzEnD,EAAQH,EAAU,OAAOsD,EAAkB,UAAU,EACrDC,EAAeN,EAAkB,KAAK,cAAc,SAAUK,EAAkB,QAAQ,gBAAiB5F,GAAKA,EAAE,eAAe,EACrI,OAAAiC,EAAO4D,IAAiB,EAAE,EACnB,KAAK,qBAAqB,IAAM,CACnC,GAAID,EAAkB,WAAa,EAAItD,EAAU,OAAO,OAEpD,MAAO,CACH,aAAAuD,EACA,WAAYD,EAAkB,WAAa,EAC3C,kBAAmB,EACvB,EAEC,CAED,IAAIN,EAAiBM,EAAkB,QACvC,KAAON,EAAe,aAGlB,GAFAA,EAAiBA,EAAe,YACdA,EAAe,UAAU,IAAI,KAAK,cAAc,EAAE,EACrD,CACX,IAAMO,EAAeN,EAAkB,KAAK,cAAc,SAAUD,EAAe,gBAAiBtF,GAAKA,EAAE,eAAe,EAC1H,OAAAiC,EAAO4D,IAAiB,EAAE,EACnB,CACH,aAAAA,EACA,WAAY,EACZ,kBAAmB,EACvB,CACJ,CAEJ,MAAO,CACH,aAAAA,EACA,WAAY,GACZ,kBAAmB,EACvB,CACJ,CACJ,EAAGpD,EAAM,UAAW,IAAU2C,CAAO,CACzC,CACA,MAAM,aAAaI,EAAWJ,EAAS,CACnC,IAAMM,EAAuB,KAAK,cAAcF,CAAS,EACzD,OAAO,KAAK,qBAAqB,IAAM,KAAK,mCAAmCE,CAAoB,EAAGA,EAAsBA,EAAsBN,CAAO,CAC7J,CACA,MAAM,iBAAiBO,EAAQP,EAAS,CACpC,IAAMQ,EAAoB,KAAK,wBAAwB,IAAID,CAAM,EACjE,GAAIC,IAAsB,OACtB,MAAM,IAAI,MAAM,yCAAyC,EAE7D,IAAMtD,EAAYsD,EAAkB,QAAQ,UAAU,IAAI,KAAK,cAAc,EAAE,EACzEnD,EAAQH,EAAU,OAAOsD,EAAkB,UAAU,EACrDC,EAAeN,EAAkB,KAAK,cAAc,SAAUK,EAAkB,QAAQ,gBAAiB5F,GAAKA,EAAE,eAAe,EACrI,OAAAiC,EAAO4D,IAAiB,EAAE,EACnB,KAAK,qBAAqB,IAAM,CACnC,IAAMC,EAAoBxD,EAAU,OAAO,UAAU,CAACtC,EAAGwC,IAAMxC,EAAE,YAAcwC,EAAIoD,EAAkB,UAAU,EAC/G,GAAIE,IAAsB,GAEtB,MAAO,CACH,aAAAD,EACA,WAAYC,EACZ,kBAAmB,EACvB,EAEC,CAED,IAAIR,EAAiBM,EAAkB,QACvC,KAAON,EAAe,aAAa,CAC/BA,EAAiBA,EAAe,YAChC,IAAMhD,EAAYgD,EAAe,UAAU,IAAI,KAAK,cAAc,EAAE,EACpE,GAAIhD,GAAaA,EAAU,yBAA2B,KAAM,CACxD,IAAMuD,EAAeN,EAAkB,KAAK,cAAc,SAAUD,EAAe,gBAAiBtF,GAAKA,EAAE,eAAe,EAC1HiC,EAAO4D,IAAiB,EAAE,EAC1B,IAAME,EAAgBzD,EAAU,OAAO,UAAUtC,GAAKA,EAAE,UAAU,EAClE,OAAAiC,EAAO8D,IAAkB,EAAE,EACpB,CACH,aAAAF,EACA,WAAYE,EACZ,kBAAmB,EACvB,CACJ,CACJ,CACA,MAAO,CACH,aAAAF,EACA,WAAY,GACZ,kBAAmB,EACvB,CACJ,CACJ,EAAGpD,EAAM,UAAW,IAAU2C,CAAO,CACzC,CACA,MAAM,qBAAqBhD,EAAS4D,EAAYZ,EAAS,CACrD,GAAIY,IAAe,GACf,OAAO,KAGX,IAAMvD,EADYL,EAAQ,UAAU,IAAI,KAAK,cAAc,EAAE,EACrC,OAAO4D,CAAU,EACzC/D,EAAOQ,CAAK,EACZ,IAAMwD,EAAOb,EAAQ,aAAec,EAAmBzD,EAAM,KACvD+C,EAAY/C,EAAM,UAAY,KAAK,cAAc,QAAQ,gBACzD0D,EAAW1D,EAAM,SAAW,KAAK,cAAc,QAAQ,gBACvDkD,EAAS,IAAIS,EAAcH,EAAMxD,EAAM,WAAa,MAAQ,QAAS+C,EAAWW,EAAU/D,EAAQ,aAAe4D,EAAYvD,EAAM,KAAK,UAAU,EACxJ,YAAK,wBAAwB,IAAIkD,EAAQ,CAAE,QAAAvD,EAAS,WAAA4D,CAAW,CAAC,EACzDL,CACX,CACA,gCAAgCD,EAAsB,CAClD,IAAMG,EAAe3C,EAErB,KAAK,cAAc,SAAUwC,EAAsB1F,GAAKA,EAAE,UAAU,IAAI,KAAK,cAAc,EAAE,EAAE,cAAc,EACzGgG,EAAa,GACbK,EAAoB,GACxB,GAAIR,IAAiB,GAAI,CAErB,IAAMvD,EADU,KAAK,cAAc,SAASuD,CAAY,EAC9B,UAAU,IAAI,KAAK,cAAc,EAAE,EACvDS,EAAQpD,EAAwBZ,EAAU,uBAAwBoD,EAAsB1F,GAAKA,EAAE,SAAS,EAC9GiC,EAAOqE,IAAU,EAAE,EACnBN,EAAa1D,EAAU,uBAAuBgE,CAAK,EAAE,WACrDD,EAAoBX,EAAuBpD,EAAU,YACzD,CACA,MAAO,CAAE,aAAAuD,EAAc,WAAAG,EAAY,kBAAAK,CAAkB,CACzD,CACA,mCAAmCX,EAAsB,CACrD,IAAMa,EAA0BrD,EAEhC,KAAK,cAAc,qBAAsBwC,EAAsB1F,GAAKA,EAAE,UAAU,IAAI,KAAK,cAAc,EAAE,EAAE,sBAAsB,EAC7H6F,EAAe,GACfG,EAAa,GACbK,EAAoB,GACxB,GAAIE,IAA4B,GAAI,CAChC,IAAMnE,EAAU,KAAK,cAAc,qBAAqBmE,CAAuB,EAE/EV,EAAeN,EAAkB,KAAK,cAAc,SAAUnD,EAAQ,gBAAiBpC,GAAKA,EAAE,eAAe,EAC7GiC,EAAO4D,IAAiB,EAAE,EAC1B,IAAMvD,EAAYF,EAAQ,UAAU,IAAI,KAAK,cAAc,EAAE,EACvDkE,EAAQE,GAAclE,EAAU,uBAAyBtC,GAC7CsC,EAAU,OAAOtC,EAAE,UAAU,EAC9B,YAAcA,EAAE,WAAa0F,CAC7C,EACDzD,EAAOqE,IAAU,EAAE,EAEnBN,EADc1D,EAAU,uBAAuBgE,CAAK,EACjC,WACnBD,EAAoBX,EAAuBpD,EAAU,YACzD,CACA,MAAO,CAAE,aAAAuD,EAAc,WAAAG,EAAY,kBAAAK,CAAkB,CACzD,CAEA,MAAM,qBAGNI,EAEAC,EAEAC,EAAiBvB,EAAS,CACtB,GAAM,CAAE,QAAAwB,EAAS,QAAA3G,CAAQ,EAAI,KAAK,cAC5B4G,EAAU,MAAM5G,EAAQ,mBAAmB,QAAQ,EACzD,GAAI,CACA,GAAM,CAAE,aAAA4F,EAAc,WAAAG,EAAY,kBAAAK,CAAkB,EAAII,EAAa,EACrE,GAAIJ,EAAmB,CAEnB,IAAMjE,EAAU,KAAK,cAAc,SAASyD,CAAY,EACxD,OAAO,KAAK,qBAAqBzD,EAAS4D,EAAYZ,CAAO,CACjE,CAEA,IAAM0B,EAAiBF,EAAQ,eACzBG,EAAgBH,EAAQ,cAC1BI,EAAc,KACdC,EAAmBpB,EACnBqB,EAAiBlB,EAGfmB,EAAgBjE,EAAwB,KAAK,cAAc,UAAWwD,EAAiB1G,GAAKA,EAAE,IAAI,EAClGgC,EAAWmF,IAAkB,GAAK,KAAK,cAAc,UAAUA,CAAa,EAAI,KAClFC,EAA4B,GAChC,GAAIvB,IAAiB,GACjBiB,EAAe,IAAM9E,GAAU,iBAAmB/B,EAAQ,oBAC1DmH,EAA4BN,EAAe,MAAQ7G,EAAQ,wBAE1D,CACD,IAAMmC,EAAU,KAAK,cAAc,SAASyD,CAAY,EACpD,CAAC7D,GAAYI,EAAQ,iBAAmBJ,EAAS,iBACjD8E,EAAe,IAAM1E,EAAQ,cAC7B4E,EAAc5E,GAId0E,EAAe,IAAM9E,EAAS,eAEtC,CACA,KAAO8E,EAAe,IAAM7G,EAAQ,eAAe,CAC/C,GAAI+G,EAAa,CACb,IAAM1E,EAAY0E,EAAY,UAAU,IAAI,KAAK,cAAc,EAAE,EACjE,GAAI1E,GAAaA,EAAU,eAAiBqE,EAExC,MAEJ,GAAIK,EAAY,YAAa,CAEzBF,EAAe,IAAME,EAAY,YAAY,cAC7CA,EAAcA,EAAY,YAC1B,QACJ,CACJ,CAEA,MAAMF,EAAe,OAAO,UAAUA,EAAe,IAAKA,EAAe,IAAMvG,EAAe,EAC9F,IAAMS,EAAkB8F,EAAe,IACjC5E,EAAgB4E,EAAe,kBAAkB,EACjDtG,EAAK0B,EAAc,GACrBzB,EAAOyB,EAAc,KACnBjB,EAAe6F,EAAe,IACpC,GAAItG,IAAOhB,EAAO,QAAS,CACvB,IAAM8G,EAAQf,EAAkBtF,EAAQ,SAAUe,EAAiBhB,IAAKA,GAAE,eAAe,EACrFoC,EACAkE,IAAU,IAEVQ,EAAe,IAAM9F,EACrBoB,EAAU,MAAMwE,EAAQ,YAAY3G,CAAO,GAI3CmC,EAAUnC,EAAQ,SAASqG,CAAK,EAGhCU,IACAA,EAAY,YAAc5E,GAC9B4E,EAAc5E,EACVgF,IACAhF,EAAQ,wBAA0B,GAClCgF,EAA4B,IAEhC,GAAM,CAAE,aAAAvB,EAAc,WAAAG,GAAY,kBAAAK,EAAkB,EAAII,EAAa,EACrE,GAAIJ,GAAmB,CACnB,IAAMjE,GAAU,KAAK,cAAc,SAASyD,CAAY,EACxD,OAAO,KAAK,qBAAqBzD,GAAS4D,GAAYZ,CAAO,CACjE,CACIS,IAAiB,KACjBoB,EAAmBpB,EACnBqB,EAAiBlB,GAEzB,CACA,GAAIvF,IAAS,KAAM,CAGXD,IAAOhB,EAAO,SAEdyC,EAAO+E,CAAW,EAClBvG,EAAOuG,EAAY,cAAgB/F,IAInC8F,EAAc,IAAM9F,EAEpBR,GADuB,MAAMsG,EAAc,uBAAuB5E,GAAwBlC,EAAQ,aAAa,GACrFA,EAAQ,eAAiBgB,GAEvD,IAAMoG,EAASpG,EAAeR,EAC9B,GAAI4G,EAASpH,EAAQ,cAAgBK,GAEjC,MAQA,GAFAyG,EAAc,IAAMM,EACFN,EAAc,cAAc,IAC5BvH,EAAO,QAAS,CAC9BS,EAAQ,cAAgBoH,EACxB,KACJ,CAER,CACAP,EAAe,IAAM7F,EAAeR,CACxC,CACA,IAAI6G,EAAS,KACPC,EAAcN,IAAqB,GAAK,KAAK,cAAc,SAASA,CAAgB,EAAI,KAM9F,GALIM,IAEAD,EAAS,MAAM,KAAK,qBAAqBC,EAAaL,EAAgB9B,CAAO,GAG7E,CAACkC,GAAUtF,IAAa,CAACuF,GAAeA,EAAY,gBAAkBvF,EAAS,iBAAkB,CAIjG,IAAMwF,EADmB,KAAK,cAAc,UAAUL,EAAgB,CAAC,GAC1B,MAAQ,KACrD,OAAO,KAAK,qBAAqBV,EAAce,EAAoBb,EAAiBvB,CAAO,CAC/F,CACA,OAAOkC,CACX,QACA,CACIT,EAAQ,CACZ,CACJ,CACJ,EACM9C,GAAN,cAAwCkB,EAAqB,CACzD,YAAYC,EAAe,CACvB,MAAMA,CAAa,EACnB,KAAK,qBAAuB,KAC5B,KAAK,cAAgBA,CACzB,CACA,UAAW,CACP,OAAO,KAAK,cAAc,KAAK,KACnC,CACA,eAAgB,CACZ,OAAO,KAAK,cAAc,KAAK,KACnC,CACA,gBAAiB,CACb,OAAO,KAAK,cAAc,KAAK,MACnC,CACA,aAAc,CACV,OAAO,KAAK,cAAc,KAAK,QACnC,CACA,MAAM,eAAgB,CAClB,MAAO,CACH,UAAW,KAAK,cAAc,KAAK,YAAY,UAC/C,SAAU,KAAK,cAAc,KAAK,YAAY,SAC9C,OAAQ,KAAK,cAAc,KAAK,YAAY,OAC5C,UAAW,KAAK,cAAc,KAAK,YAAY,SACnD,CACJ,CACA,MAAM,kBAAmB,CACrB,OAAK,KAAK,cAAc,KAAK,MAGtB,KAAK,wBAA0B,SAAY,CAC9C,IAAIuC,EAAc,KAOlB,OANqC,KAAK,cAAc,KAAK,QAAU,OAChE,KAAK,cAAc,KAAK,QAAU,OAEjC,KAAK,cAAc,KAAK,QAAU,OAAS,CAAC,KAAK,cAAc,KAAK,kBAEpE,KAAK,cAAc,KAAK,QAAU,QAAU,CAAC,KAAK,cAAc,KAAK,oBAEzEA,EAAc,MAAM,KAAK,eAAe,CAAC,CAAC,GAEvC,CACH,MAAOC,GAAwB,CAC3B,MAAO,KAAK,cAAc,KAAK,MAC/B,OAAQ,KAAK,cAAc,KAAK,OAChC,MAAO,KAAK,cAAc,KAAK,MAC/B,iBAAkB,KAAK,cAAc,KAAK,iBAC1C,WAAY,KAAK,cAAc,KAAK,WACpC,aAAc,KAAK,cAAc,KAAK,QAAU,OAASD,EACnDE,GAAqCF,EAAY,IAAI,EACrD,KACN,cAAe,KAAK,cAAc,KAAK,QAAU,QAAUA,EACrDG,GAAsCH,EAAY,IAAI,EACtD,KACN,aAAc,KAAK,cAAc,KAAK,QAAU,OAASA,EACnDI,GAA8BJ,EAAY,IAAI,EAC9C,KACN,aAAc,KAAK,cAAc,KAAK,QAAU,OAASA,EACnDK,GAA8BL,EAAY,IAAI,EAC9C,IACV,CAAC,EACD,WAAY,KAAK,cAAc,KAAK,MACpC,YAAa,KAAK,cAAc,KAAK,OACrC,YAAa,KAAK,cAAc,KAAK,kBAAoB,OACzD,WAAY,KAAK,cAAc,KAAK,YAAc,MACtD,CACJ,GAAG,EAtCQ,IAuCf,CACJ,EACMvD,GAAN,cAAwCe,EAAqB,CACzD,YAAYC,EAAe,CACvB,MAAMA,CAAa,EACnB,KAAK,cAAgB,KACrB,KAAK,cAAgBA,CACzB,CACA,UAAW,CACP,OAAO,KAAK,cAAc,KAAK,KACnC,CACA,qBAAsB,CAClB,OAAO,KAAK,cAAc,KAAK,gBACnC,CACA,eAAgB,CACZ,OAAO,KAAK,cAAc,KAAK,UACnC,CACA,MAAM,kBAAmB,CACrB,OAAK,KAAK,cAAc,KAAK,MAGtB,KAAK,gBAAkB,CAC1B,MAAO6C,GAAwB,CAC3B,MAAO,KAAK,cAAc,KAAK,MAC/B,iBAAkB,KAAK,cAAc,KAAK,iBAC1C,aAAc,KAAK,cAAc,KAAK,YAC1C,CAAC,EACD,iBAAkB,KAAK,cAAc,KAAK,iBAC1C,WAAY,KAAK,cAAc,KAAK,WACpC,YAAa,KAAK,cAAc,KAAK,kBAAoB,MAC7D,EAXW,IAYf,CACJ,EAEMrF,GAA0BsF,GAAW,CACvC,IAAMC,EAAmB,IAAI,IAC7B,QAAS,EAAI,EAAG,EAAID,EAAO,OAAQ,IAAK,CACpC,IAAMvF,EAAQuF,EAAO,CAAC,EACtBC,EAAiB,IAAIxF,EAAM,UAAWA,CAAK,CAC/C,CACA,IAAMyF,EAAkB,IAAI,IACtBZ,EAAS,CAAC,EACVa,EAAgB1F,GAAU,CAC5B,GAAI,CAAAyF,EAAgB,IAAIzF,CAAK,EAI7B,CAAAyF,EAAgB,IAAIzF,CAAK,EACzB,QAAS2F,EAAI,EAAGA,EAAI3F,EAAM,qBAAqB,OAAQ2F,IAAK,CACxD,IAAM5C,EAAY/C,EAAM,qBAAqB2F,CAAC,EACxCC,EAAaJ,EAAiB,IAAIzC,CAAS,EAC5C6C,GAGLF,EAAaE,CAAU,CAC3B,CACAf,EAAO,KAAK7E,CAAK,EACrB,EACA,QAAS,EAAI,EAAG,EAAIuF,EAAO,OAAQ,IAC/BG,EAAaH,EAAO,CAAC,CAAC,EAE1B,OAAOV,CACX,ECpyCO,IAAMgB,GAAN,KAAgB,CACnB,YAAYC,EAAQ,CAChB,KAAK,OAASA,EACd,KAAK,IAAM,EACX,KAAK,SAAW,IACpB,CACA,UAAUC,EAAQ,CACd,GAAM,CAAE,KAAAC,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAMF,CAAM,EACjF,YAAK,KAAOA,EACL,IAAI,WAAWC,EAAK,OAAQC,EAAQF,CAAM,CACrD,CACA,SAAU,CACN,GAAM,CAAE,KAAAC,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAM,CAAC,EAC5E,YAAK,KAAO,EACLD,EAAK,UAAUC,EAAQ,EAAK,CACvC,CACA,SAAU,CACN,GAAM,CAAE,KAAAD,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAM,CAAC,EAC5E,YAAK,KAAO,EACLD,EAAK,UAAUC,EAAQ,EAAK,CACvC,CACA,UAAUF,EAAQ,CACd,GAAM,CAAE,KAAAC,EAAM,OAAAC,CAAO,EAAI,KAAK,OAAO,iBAAiB,KAAK,IAAK,KAAK,IAAMF,CAAM,EACjF,KAAK,KAAOA,EACZ,IAAIG,EAAM,GACV,QAAS,EAAI,EAAG,EAAIH,EAAQ,IACxBG,GAAO,OAAO,aAAaF,EAAK,SAASC,EAAS,CAAC,CAAC,EAExD,OAAOC,CACX,CACA,SAAU,CAEN,OADY,KAAK,UAAU,CAAC,IAChB,OACR,KAAK,KAAO,EACL,OAEX,KAAK,KAAO,EAEL,CAAE,KADIC,GAAgB,KAAK,QAAQ,CAAC,CAC7B,EAClB,CACA,oBAAoBC,EAAO,CAGvB,IAFAC,EAAO,KAAK,QAAQ,EACpBD,IAAU,KAAK,SACR,KAAK,KAAOA,EAAQ,GAAmB,CAC1C,IAAME,EAAO,KAAK,QAAQ,EAC1B,KAAK,KAAO,EACZ,IAAMC,EAASC,GAAgBF,EAAM,IAAI,EACzC,GAAIC,EACA,OAAOA,CAEf,CACA,OAAO,IACX,CACJ,EACaJ,GAAmBM,GAAe,CAC3C,IAAIC,EAAO,WACPC,EAAe,EACnB,KAAOD,IAAS,GACZC,IAAiB,EACjBA,GAAgBF,EAAaC,EAC7BA,IAAS,EAEb,OAAOC,CACX,EC3DO,IAAMC,GAAN,cAAyBC,CAAQ,CACpC,YAAYC,EAAO,CACf,MAAMA,CAAK,EACX,KAAK,gBAAkB,KACvB,KAAK,iBAAmB,KACxB,KAAK,WAAa,CAAC,EACnB,KAAK,OAAS,CAAC,EACf,KAAK,OAAS,IAAIC,GAAUD,EAAM,WAAW,CACjD,CACA,MAAM,cAAe,CACjB,OAAO,KAAK,mBAAqB,SAAY,CACzC,IAAME,EAAW,MAAM,KAAK,MAAM,OAAO,QAAQ,EACjD,KAAK,OAAO,SAAWA,EAGvB,MAAM,KAAK,OAAO,OAAO,UAAU,EAAGA,CAAQ,EAC9C,IAAMC,EAAS,KAAK,OAAO,QAAQ,EAC/BA,IACA,KAAK,OAAO,KAAOA,EAAO,MAE9B,IAAIC,EAAyB,EAE7B,OAAa,CACT,IAAMC,EAAS,KAAK,OAAO,oBAAoB,EAC/C,GAAI,CAACA,EACD,MAEJ,IAAMC,EAAaC,GAAcF,EAAO,cAAeA,EAAO,OAAO,EACrE,KAAK,OAAO,IAAMA,EAAO,SAAWC,EACpC,IAAME,EAAO,KAAK,OAAO,QAAQ,EAC3BC,EAASD,IAASE,IAAQF,IAASG,GAEzC,GADA,KAAK,OAAO,IAAMN,EAAO,SAAWA,EAAO,UAAY,EACnDI,EAEA,SAEC,KAAK,mBACN,KAAK,iBAAmBJ,GAE5B,IAAMO,EAAiBP,EAAO,oBAAsBA,EAAO,WACrDQ,EAAS,CACX,UAAWT,EAAyBC,EAAO,WAC3C,SAAUO,EACV,UAAWP,EAAO,SAClB,SAAUA,EAAO,SACrB,EACA,KAAK,WAAW,KAAKQ,CAAM,EAC3BT,GAA0BC,EAAO,mBACrC,CACA,GAAI,CAAC,KAAK,iBACN,MAAM,IAAI,MAAM,sBAAsB,EAE1C,KAAK,OAAS,CAAC,IAAIS,EAAgB,IAAIC,GAAqB,IAAI,CAAC,CAAC,CACtE,GAAG,CACP,CACA,MAAM,aAAc,CAChB,MAAO,YACX,CACA,MAAM,WAAY,CACd,aAAM,KAAK,aAAa,EACjB,KAAK,MAChB,CACA,MAAM,iBAAkB,CACpB,MAAM,KAAK,aAAa,EACxB,IAAMC,EAAaC,EAAK,KAAK,UAAU,EACvC,OAAAC,EAAOF,CAAU,EACVA,EAAW,UAAYA,EAAW,QAC7C,CACJ,EACMD,GAAN,KAA2B,CACvB,YAAYI,EAAS,CACjB,KAAK,QAAUA,CACnB,CACA,OAAQ,CACJ,MAAO,EACX,CACA,MAAM,mBAAoB,CACtB,MAAO,EACX,CACA,mBAAoB,CAChB,OAAAD,EAAO,KAAK,QAAQ,gBAAgB,EAC7B,KAAK,QAAQ,iBAAiB,WAAa,KAAK,QAAQ,iBAAiB,mBACpF,CACA,iBAAkB,CACd,OAAO,KAAK,QAAQ,gBAAgB,CACxC,CACA,iBAAkB,CACd,OAAOE,CACX,CACA,UAAW,CACP,MAAO,KACX,CACA,qBAAsB,CAClB,OAAAF,EAAO,KAAK,QAAQ,gBAAgB,EAC7B,KAAK,QAAQ,iBAAiB,UAAY,EAAI,EAAI,CAC7D,CACA,eAAgB,CACZ,OAAAA,EAAO,KAAK,QAAQ,gBAAgB,EAC7B,KAAK,QAAQ,iBAAiB,UACzC,CACA,MAAM,kBAAmB,CACrB,OAAAA,EAAO,KAAK,QAAQ,gBAAgB,EAC7B,CACH,MAAO,MACP,iBAAkB,KAAK,QAAQ,iBAAiB,UAAY,EAAI,EAAI,EACpE,WAAY,KAAK,QAAQ,iBAAiB,UAC9C,CACJ,CACA,iBAAiBG,EAAaC,EAAS,CACnC,GAAID,IAAgB,GAChB,OAAO,KAEX,IAAME,EAAY,KAAK,QAAQ,WAAWF,CAAW,EACrD,GAAI,CAACE,EACD,OAAO,KAEX,IAAIC,EACJ,OAAIF,EAAQ,aACRE,EAAOC,GAGP,KAAK,QAAQ,OAAO,IAAMF,EAAU,UACpCC,EAAO,KAAK,QAAQ,OAAO,UAAUD,EAAU,QAAQ,GAEpD,IAAIG,EAAcF,EAAM,MAAOD,EAAU,UAAWA,EAAU,SAAUF,EAAaE,EAAU,QAAQ,CAClH,CACA,MAAM,eAAeD,EAAS,CAC1B,OAAO,KAAK,iBAAiB,EAAGA,CAAO,CAC3C,CACA,MAAM,cAAcK,EAAQL,EAAS,CACjC,IAAMD,EAAcO,EAAkB,KAAK,QAAQ,WAAYD,EAAO,UAAWE,GAAKA,EAAE,SAAS,EACjG,GAAIR,IAAgB,GAChB,MAAM,IAAI,MAAM,yCAAyC,EAE7D,OAAO,KAAK,iBAAiBA,EAAc,EAAGC,CAAO,CACzD,CACA,MAAM,UAAUQ,EAAWR,EAAS,CAChC,IAAMS,EAAQC,EAAwB,KAAK,QAAQ,WAAYF,EAAWD,GAAKA,EAAE,SAAS,EAC1F,OAAO,KAAK,iBAAiBE,EAAOT,CAAO,CAC/C,CACA,aAAaQ,EAAWR,EAAS,CAC7B,OAAO,KAAK,UAAUQ,EAAWR,CAAO,CAC5C,CACA,iBAAiBK,EAAQL,EAAS,CAC9B,OAAO,KAAK,cAAcK,EAAQL,CAAO,CAC7C,CACJ,EC/IO,IAAMW,GAAN,cAAyBC,CAAQ,CACpC,YAAYC,EAAO,CACf,MAAMA,CAAK,EAKX,KAAK,aAAe,IAAIC,GACxB,KAAK,gBAAkB,KACvB,KAAK,SAAW,KAChB,KAAK,WAAa,CAAC,EACnB,KAAK,OAAS,CAAC,EAEf,KAAK,OAAS,IAAIC,GAAU,IAAIC,EAAOH,EAAM,OAAQ,GAAK,GAAK,EAAE,CAAC,CACtE,CACA,MAAM,cAAe,CACjB,OAAO,KAAK,mBAAqB,SAAY,CAEzC,IADA,KAAK,SAAW,MAAM,KAAK,MAAM,OAAO,QAAQ,EACzC,KAAK,OAAO,IAAM,KAAK,SAAWI,IAAsB,CAC3D,MAAM,KAAK,OAAO,OAAO,UAAU,KAAK,OAAO,IAAK,KAAK,OAAO,IAAMC,EAAoB,EAC1F,IAAMC,EAAO,KAAK,OAAO,eAAe,EAKxC,GAJI,CAACA,GAID,CADU,CAAC,EAAEA,EAAK,WAAa,GAI/B,MAEJ,KAAK,WAAW,KAAK,CACjB,aAAcA,EAAK,aACnB,QAASA,EACT,YAAa,KACb,iBAAkB,GAClB,WAAY,GACZ,UAAW,CACP,MAAO,KACP,WAAY,KACZ,SAAU,IACd,EACA,mBAAoB,IACxB,CAAC,EACD,KAAK,OAAO,IAAMA,EAAK,eAAiBA,EAAK,SACjD,CACA,QAAWC,KAAa,KAAK,WAAY,CACrC,IAAMC,EAAc,MAAM,KAAK,WAAW,KAAK,OAAQD,EAAU,QAAS,CAAC,EACtEC,IAKLA,EAAY,KAAK,YAAc,GACxBA,EAAY,KAAK,CAAC,IAAM,GACxBA,EAAY,KAAK,CAAC,IAAM,KACxBA,EAAY,KAAK,CAAC,IAAM,KACxBA,EAAY,KAAK,CAAC,IAAM,KACxBA,EAAY,KAAK,CAAC,IAAM,IACxBA,EAAY,KAAK,CAAC,IAAM,KACxBA,EAAY,KAAK,CAAC,IAAM,IAE3B,MAAM,KAAK,mBAAmBA,EAAaD,CAAS,EAIxDC,EAAY,KAAK,YAAc,GACxBA,EAAY,KAAK,CAAC,IAAM,IACxBA,EAAY,KAAK,CAAC,IAAM,KACxBA,EAAY,KAAK,CAAC,IAAM,KACxBA,EAAY,KAAK,CAAC,IAAM,KACxBA,EAAY,KAAK,CAAC,IAAM,IACxBA,EAAY,KAAK,CAAC,IAAM,KACxBA,EAAY,KAAK,CAAC,IAAM,IACxBA,EAAY,KAAK,CAAC,IAAM,KAE3B,MAAM,KAAK,iBAAiBA,EAAaD,CAAS,EAElDA,EAAU,UAAU,QAAU,MAC9B,KAAK,OAAO,KAAK,IAAIE,EAAgB,IAAIC,GAAqBH,EAAW,IAAI,CAAC,CAAC,EAEvF,CACJ,GAAG,CACP,CACA,MAAM,mBAAmBC,EAAaD,EAAW,CAC7C,IAAII,EAAqB,MAAM,KAAK,oBAAoB,KAAK,OAAQH,CAAW,EAChF,GAAI,CAACG,EACD,OAEJ,IAAMC,EAAe,MAAM,KAAK,WAAW,KAAK,OAAQD,EAAmB,UAAWA,EAAmB,iBAAiB,EAK1H,GAJI,CAACC,IAGLD,EAAqB,MAAM,KAAK,oBAAoB,KAAK,OAAQC,CAAY,EACzE,CAACD,GACD,OAEJ,IAAME,EAAc,MAAM,KAAK,WAAW,KAAK,OAAQF,EAAmB,UAAWA,EAAmB,iBAAiB,EAIzH,GAHI,CAACE,GAGDD,EAAa,KAAK,CAAC,IAAM,GAAQC,EAAY,KAAK,CAAC,IAAM,EACzD,OAEJ,IAAMC,EAAe,CAAC,EAChBC,EAA0BC,GAAU,CACtC,KACIF,EAAa,KAAK,KAAK,IAAI,IAAKE,CAAK,CAAC,EAClC,EAAAA,EAAQ,MAGZA,GAAS,GAEjB,EACAD,EAAuBP,EAAY,KAAK,MAAM,EAC9CO,EAAuBH,EAAa,KAAK,MAAM,EAE/C,IAAMK,EAAc,IAAI,WAAW,EAAIH,EAAa,OAC9CN,EAAY,KAAK,OAASI,EAAa,KAAK,OAASC,EAAY,KAAK,MAAM,EAClFI,EAAY,CAAC,EAAIH,EAAa,OAC9BG,EAAY,IAAIH,EAAc,CAAC,EAC/BG,EAAY,IAAIT,EAAY,KAAM,EAAIM,EAAa,MAAM,EACzDG,EAAY,IAAIL,EAAa,KAAM,EAAIE,EAAa,OAASN,EAAY,KAAK,MAAM,EACpFS,EAAY,IAAIJ,EAAY,KAAM,EAAIC,EAAa,OAASN,EAAY,KAAK,OAASI,EAAa,KAAK,MAAM,EAC9GL,EAAU,UAAU,MAAQ,SAC5BA,EAAU,YAAcU,EACxBV,EAAU,mBAAqBM,EAC/B,IAAMK,EAAOC,EAAWX,EAAY,IAAI,EACxCD,EAAU,iBAAmBW,EAAK,SAAS,EAAE,EAC7CX,EAAU,WAAaW,EAAK,UAAU,GAAI,EAAI,EAC9C,IAAME,EAAgBF,EAAK,SAAS,EAAE,EACtCX,EAAU,UAAU,WAAa,CAC7B,WAAY,CACR,IAAMa,EAAgB,IACtB,IAAMA,GAAiB,EAC3B,EACA,eAAgBC,GAAgCR,EAAY,IAAI,EAAE,cACtE,CACJ,CACA,MAAM,iBAAiBL,EAAaD,EAAW,CAI3C,IAAMI,EAAqB,MAAM,KAAK,oBAAoB,KAAK,OAAQH,CAAW,EAClF,GAAI,CAACG,EACD,OAEJ,IAAMC,EAAe,MAAM,KAAK,WAAW,KAAK,OAAQD,EAAmB,UAAWA,EAAmB,iBAAiB,EAC1H,GAAI,CAACC,EACD,OAGJL,EAAU,UAAU,MAAQ,OAC5BA,EAAU,YAAcC,EAAY,KACpCD,EAAU,mBAAqBK,EAC/B,IAAMU,EAASC,GAA8Bf,EAAY,IAAI,EAC7DD,EAAU,iBAAmBe,EAAO,mBACpCf,EAAU,WAAae,EAAO,gBAC9Bf,EAAU,UAAU,SAAW,CAC3B,QAASe,EAAO,OACpB,CACJ,CACA,MAAM,WAAWE,EAAQC,EAAWC,EAAmB,CACnDC,EAAOD,EAAoBD,EAAU,aAAa,MAAM,EACxDE,EAAO,KAAK,QAAQ,EACpB,IAAIC,EAAkB,EACtB,QAASC,EAAI,EAAGA,EAAIH,EAAmBG,IACnCD,GAAmBH,EAAU,aAAaI,CAAC,EAE/C,IAAIC,EAAcL,EACdM,EAAoBH,EACpBI,EAAsBN,EACpBO,EAAS,CAAC,EAChBC,EAAO,OAAa,CAEhB,MAAMV,EAAO,OAAO,UAAUM,EAAY,aAAcA,EAAY,aAAeA,EAAY,QAAQ,EACvGN,EAAO,IAAMM,EAAY,aACzB,IAAMK,EAAWX,EAAO,UAAUM,EAAY,QAAQ,EACtD,OAAa,CACT,GAAIE,IAAwBF,EAAY,aAAa,OAAQ,CACzDG,EAAO,KAAKE,EAAS,SAASP,EAAiBG,CAAiB,CAAC,EACjE,KACJ,CACA,IAAMK,EAAcN,EAAY,aAAaE,CAAmB,EAEhE,GADAD,GAAqBK,EACjBA,EAAc,IAAK,CACnBH,EAAO,KAAKE,EAAS,SAASP,EAAiBG,CAAiB,CAAC,EACjE,MAAMG,CACV,CACAF,GACJ,CAEA,OAAa,CAET,GADAR,EAAO,IAAMM,EAAY,eAAiBA,EAAY,UAClDN,EAAO,KAAO,KAAK,SAAWpB,GAC9B,OAAO,KAEX,MAAMoB,EAAO,OAAO,UAAUA,EAAO,IAAKA,EAAO,IAAMnB,EAAoB,EAC3E,IAAMgC,EAAWb,EAAO,eAAe,EACvC,GAAI,CAACa,EACD,OAAO,KAGX,GADAP,EAAcO,EACVP,EAAY,eAAiBL,EAAU,aACvC,KAER,CACAG,EAAkB,EAClBG,EAAoB,EACpBC,EAAsB,CAC1B,CACA,IAAMM,EAAkBL,EAAO,OAAO,CAACM,EAAKC,IAAUD,EAAMC,EAAM,OAAQ,CAAC,EACrEC,EAAa,IAAI,WAAWH,CAAe,EAC7CI,EAAS,EACb,QAASb,EAAI,EAAGA,EAAII,EAAO,OAAQJ,IAAK,CACpC,IAAMW,EAAQP,EAAOJ,CAAC,EACtBY,EAAW,IAAID,EAAOE,CAAM,EAC5BA,GAAUF,EAAM,MACpB,CACA,MAAO,CACH,KAAMC,EACN,QAASX,EACT,gBAAiBE,CACrB,CACJ,CACA,MAAM,oBAAoBR,EAAQmB,EAAY,CAG1C,GAFAhB,EAAO,KAAK,WAAa,IAAI,EAEzBgB,EAAW,gBAAkBA,EAAW,QAAQ,aAAa,OAAS,EACtE,MAAO,CAAE,UAAWA,EAAW,QAAS,kBAAmBA,EAAW,gBAAkB,CAAE,EAG9F,GADc,CAAC,EAAEA,EAAW,QAAQ,WAAa,GAG7C,OAAO,KAIX,IADAnB,EAAO,IAAMmB,EAAW,QAAQ,eAAiBA,EAAW,QAAQ,YACvD,CACT,GAAInB,EAAO,KAAO,KAAK,SAAWpB,GAC9B,OAAO,KAEX,MAAMoB,EAAO,OAAO,UAAUA,EAAO,IAAKA,EAAO,IAAMnB,EAAoB,EAC3E,IAAMgC,EAAWb,EAAO,eAAe,EACvC,GAAI,CAACa,EACD,OAAO,KAEX,GAAIA,EAAS,eAAiBM,EAAW,QAAQ,aAC7C,MAAO,CAAE,UAAWN,EAAU,kBAAmB,CAAE,EAEvDb,EAAO,IAAMa,EAAS,eAAiBA,EAAS,SACpD,CACJ,CACA,MAAM,aAAc,CAChB,MAAM,KAAK,aAAa,EACxB,IAAMO,EAAe,MAAM,QAAQ,IAAI,KAAK,OAAO,IAAIC,GAAKA,EAAE,wBAAwB,CAAC,CAAC,EACxF,OAAOC,GAAiB,CACpB,aAAcF,EAAa,OAAO,OAAO,CAC7C,CAAC,CACL,CACA,MAAM,WAAY,CACd,aAAM,KAAK,aAAa,EACjB,KAAK,MAChB,CACA,MAAM,iBAAkB,CACpB,IAAMG,EAAS,MAAM,KAAK,UAAU,EAC9BC,EAAiB,MAAM,QAAQ,IAAID,EAAO,IAAIF,GAAKA,EAAE,gBAAgB,CAAC,CAAC,EAC7E,OAAO,KAAK,IAAI,EAAG,GAAGG,CAAc,CACxC,CACJ,EACMtC,GAAN,KAA2B,CACvB,YAAYH,EAAW0C,EAAS,CAC5B,KAAK,UAAY1C,EACjB,KAAK,QAAU0C,EACf,KAAK,wBAA0B,IAAI,QAEnC,KAAK,mBAAqB1C,EAAU,UAAU,QAAU,OAClD2C,GACA3C,EAAU,UACpB,CACA,OAAQ,CACJ,OAAO,KAAK,UAAU,YAC1B,CACA,qBAAsB,CAClB,OAAO,KAAK,UAAU,gBAC1B,CACA,eAAgB,CACZ,OAAO,KAAK,UAAU,UAC1B,CACA,mBAAoB,CAChB,OAAO,KAAK,UAAU,UAC1B,CACA,UAAW,CACP,OAAO,KAAK,UAAU,UAAU,KACpC,CACA,MAAM,kBAAmB,CACrB,OAAAoB,EAAO,KAAK,UAAU,UAAU,KAAK,EAC9B,CACH,MAAO,KAAK,UAAU,UAAU,MAChC,iBAAkB,KAAK,UAAU,iBACjC,WAAY,KAAK,UAAU,WAC3B,YAAa,KAAK,UAAU,aAAe,MAC/C,CACJ,CACA,iBAAkB,CACd,OAAOwB,CACX,CACA,MAAM,mBAAoB,CACtB,MAAO,EACX,CACA,MAAM,iBAAkB,CACpB,IAAMR,EAAa,MAAM,KAAK,UAAU,IAAU,CAAE,aAAc,EAAK,CAAC,EACxE,OAAQA,GAAY,WAAa,IAAMA,GAAY,UAAY,EACnE,CACA,oCAAoCS,EAAiB,CACjD,OAAI,KAAK,UAAU,UAAU,QAAU,QACnCzB,EAAO,KAAK,UAAU,UAAU,QAAQ,EACjCyB,EAAkB,KAAK,UAAU,UAAU,SAAS,SAExDA,CACX,CACA,iCAAiCC,EAAQC,EAAYC,EAAS,CAC1D,GAAI,CAACF,EACD,OAAO,KAEX,GAAM,CAAE,kBAAAG,EAAmB,gBAAAC,CAAgB,EAAIC,GAAsBL,EAAO,KAAM,KAAK,UAAU,UAAWC,EAAW,mBAAmB,EACpIK,EAAgB,IAAIC,EAAcL,EAAQ,aAAeM,EAAmBR,EAAO,KAAM,MAAO,KAAK,IAAI,EAAGC,EAAW,kBAAkB,EAAI,KAAK,mBAAoBE,EAAoB,KAAK,mBAAoBH,EAAO,QAAQ,eAAiBA,EAAO,gBAAiBA,EAAO,KAAK,UAAU,EACvS,YAAK,wBAAwB,IAAIM,EAAe,CAC5C,OAAAN,EACA,mBAAoBC,EAAW,mBAC/B,kBAAAE,EACA,gBAAAC,CACJ,CAAC,EACME,CACX,CACA,MAAM,eAAeJ,EAASO,EAAY,GAAM,CAC5C,IAAMC,EAAUD,EAAY,MAAM,KAAK,QAAQ,aAAa,QAAQ,EAAI,KACxE,GAAI,CACAnC,EAAO,KAAK,UAAU,kBAAkB,EACxC,IAAMqC,EAAiB,MAAM,KAAK,QAAQ,oBAAoB,KAAK,QAAQ,OAAQ,KAAK,UAAU,kBAAkB,EACpH,GAAI,CAACA,EACD,OAAO,KAEX,IAAIC,EAAqB,EACrB,KAAK,UAAU,UAAU,QAAU,SACnCtC,EAAO,KAAK,UAAU,UAAU,QAAQ,EACxCsC,GAAsB,KAAK,UAAU,UAAU,SAAS,SAE5D,IAAMZ,EAAS,MAAM,KAAK,QAAQ,WAAW,KAAK,QAAQ,OAAQW,EAAe,UAAWA,EAAe,iBAAiB,EAC5H,OAAO,KAAK,iCAAiCX,EAAQ,CACjD,mBAAAY,EACA,oBAAqB,IACzB,EAAGV,CAAO,CACd,QACA,CACIQ,IAAU,CACd,CACJ,CACA,MAAM,cAAcG,EAAYX,EAAS,CACrC,IAAMQ,EAAU,MAAM,KAAK,QAAQ,aAAa,QAAQ,EACxD,GAAI,CACA,IAAMI,EAAe,KAAK,wBAAwB,IAAID,CAAU,EAChE,GAAI,CAACC,EACD,MAAM,IAAI,MAAM,yCAAyC,EAE7D,IAAMH,EAAiB,MAAM,KAAK,QAAQ,oBAAoB,KAAK,QAAQ,OAAQG,EAAa,MAAM,EACtG,GAAI,CAACH,EACD,OAAO,KAEX,IAAMC,EAAqBE,EAAa,mBAAqBA,EAAa,kBACpEd,EAAS,MAAM,KAAK,QAAQ,WAAW,KAAK,QAAQ,OAAQW,EAAe,UAAWA,EAAe,iBAAiB,EAC5H,OAAO,KAAK,iCAAiCX,EAAQ,CACjD,mBAAAY,EACA,oBAAqBE,EAAa,eACtC,EAAGZ,CAAO,CACd,QACA,CACIQ,EAAQ,CACZ,CACJ,CACA,MAAM,UAAUK,EAAWb,EAAS,CAChC,IAAMQ,EAAU,MAAM,KAAK,QAAQ,aAAa,QAAQ,EACxD,GAAI,CACApC,EAAO,KAAK,QAAQ,WAAa,IAAI,EACrC,IAAMsC,EAAqBI,GAAiBD,EAAY,KAAK,mBAAoB,EAAE,EACnF,GAAIH,IAAuB,EAEvB,OAAO,KAAK,eAAeV,EAAS,EAAK,EAE7C,GAAIU,EAAqB,EAErB,OAAO,KAEX,IAAMzC,EAAS,KAAK,QAAQ,OAC5BG,EAAO,KAAK,UAAU,kBAAkB,EACxC,IAAM2C,EAAgB,MAAM,KAAK,QAAQ,oBAAoB9C,EAAQ,KAAK,UAAU,kBAAkB,EACtG,GAAI,CAAC8C,EACD,OAAO,KAEX,IAAIC,EAAUD,EAAc,UACxBE,EAAO,KAAK,QAAQ,SAClBC,EAAW,CAACF,CAAO,EAKzBrC,EAAO,KAAOqC,EAAQ,eAAiBA,EAAQ,UAAYC,GAAM,CAC7D,IAAME,EAAMH,EAAQ,eACdI,EAAM,KAAK,OAAOD,EAAMF,GAAQ,CAAC,EACnCI,EAAiBD,EAErB,OAAa,CACT,IAAME,EAAQ,KAAK,IAAID,EAAiBE,GAAeN,EAAOpE,EAAoB,EAIlF,GAHA,MAAMoB,EAAO,OAAO,UAAUoD,EAAgBC,CAAK,EACnDrD,EAAO,IAAMoD,EAET,CADUpD,EAAO,mBAAmBqD,CAAK,EACjC,CACRL,EAAOG,EAAMvE,GACb,SAAS8B,CACb,CACA,MAAMV,EAAO,OAAO,UAAUA,EAAO,IAAKA,EAAO,IAAMnB,EAAoB,EAC3E,IAAMC,EAAOkB,EAAO,eAAe,EACnCG,EAAOrB,CAAI,EACX,IAAIyE,EAAY,GAChB,GAAIzE,EAAK,eAAiB,KAAK,UAAU,aAGrCyE,EAAY,OAEX,CACD,MAAMvD,EAAO,OAAO,UAAUlB,EAAK,eAAgBA,EAAK,eAAiBA,EAAK,SAAS,EAEvFkB,EAAO,IAAMlB,EAAK,eAClB,IAAMU,EAAQQ,EAAO,UAAUlB,EAAK,SAAS,EAE7CyE,EADYC,GAAkBhE,CAAK,IACfV,EAAK,QAC7B,CACA,GAAI,CAACyE,EAAW,CAEZH,EAAiBtE,EAAK,eAAiB,EACvC,QACJ,CACA,GAAIyE,GAAazE,EAAK,eAAiB,KAAK,UAAU,aAAc,CAGhEsE,EAAiBtE,EAAK,eAAiBA,EAAK,UAC5C,QACJ,CAEA,GAD2BA,EAAK,kBAAoB,GAC5B,CAEpBsE,EAAiBtE,EAAK,eAAiBA,EAAK,UAC5C,QACJ,CAGI,KAAK,oCAAoCA,EAAK,eAAe,EAAI2D,EACjEO,EAAOlE,EAAK,gBAGZiE,EAAUjE,EACVmE,EAAS,KAAKnE,CAAI,GAEtB,SAAS4B,CACb,CACJ,CAKA,IAAI+C,EAAYX,EAAc,UAC9B,QAAWY,KAAgBT,EAAU,CACjC,GAAIS,EAAa,kBAAoBX,EAAQ,gBACzC,OAEA,CAACU,GAAaC,EAAa,eAAiBD,EAAU,kBACtDA,EAAYC,EAEpB,CACA,IAAIpD,EAAcmD,EAEZE,EAAgB,CAACrD,CAAW,EAClC,KAEQ,EAAAA,EAAY,eAAiB,KAAK,UAAU,cACzCA,EAAY,kBAAoByC,EAAQ,kBAHtC,CAMT/C,EAAO,IAAMM,EAAY,eAAiBA,EAAY,UACtD,MAAMN,EAAO,OAAO,UAAUA,EAAO,IAAKA,EAAO,IAAMnB,EAAoB,EAC3E,IAAMgC,EAAWb,EAAO,eAAe,EACvCG,EAAOU,CAAQ,EACfP,EAAcO,EACVP,EAAY,eAAiB,KAAK,UAAU,cAC5CqD,EAAc,KAAKrD,CAAW,CAEtC,CACAH,EAAOG,EAAY,kBAAoB,EAAE,EACzC,IAAIE,EAAsB,KACtBoD,EACAC,EAEAC,EAAUxD,EACVyD,EAAkB,EACtB,GAAIzD,EAAY,iBAAmBwC,EAAc,UAAU,eACvDc,EAA4B,KAAK,oCAAoC,CAAC,EACtEC,EAA4B,GAC5BrD,EAAsB,MAErB,CACDoD,EAA4B,EAC5BC,EAA4B,GAE5B,QAASxD,EAAIC,EAAY,aAAa,OAAS,EAAGD,GAAK,EAAGA,IAEtD,GADcC,EAAY,aAAaD,CAAC,EAC5B,IAAK,CAEbG,EAAsBH,EAAI,EAC1B,KACJ,CAIJ,GAAIG,IAAwB,KACxB,MAAM,IAAI,MAAM,kEAAkE,EAEtFuD,EAAkBvD,EAAsB,EACxC,IAAMwD,EAAe,CACjB,KAAM3B,EACN,QAAAyB,EACA,gBAAAC,CACJ,EAEA,GADqB,MAAM,KAAK,QAAQ,oBAAoB/D,EAAQgE,CAAY,EAC9D,CAGd,IAAMC,EAAcC,GAA8BP,EAAerD,EAAaE,CAAmB,EACjGL,EAAO8D,CAAW,EAClB,IAAMnB,EAAgBqB,GAAwBR,EAAeM,EAAY,KAAMA,EAAY,YAAY,EACnGnB,IACAxC,EAAcwC,EAAc,KAC5BtC,EAAsBsC,EAAc,aAE5C,KAKI,QAAa,CACT,IAAMmB,EAAcC,GAA8BP,EAAerD,EAAaE,CAAmB,EACjG,GAAI,CAACyD,EACD,MAEJ,IAAMnB,EAAgBqB,GAAwBR,EAAeM,EAAY,KAAMA,EAAY,YAAY,EACvG,GAAI,CAACnB,EACD,MAIJ,GAFAxC,EAAcwC,EAAc,KAC5BtC,EAAsBsC,EAAc,aAChCmB,EAAY,KAAK,iBAAmBH,EAAQ,eAAgB,CAC5DA,EAAUG,EAAY,KACtBF,EAAkBE,EAAY,aAC9B,KACJ,CACJ,CAER,CACA,IAAIG,EAAoB,KACpBC,EAA4B,KAGhC,KAAO/D,IAAgB,MAAM,CACzBH,EAAOK,IAAwB,IAAI,EACnC,IAAMqB,EAAS,MAAM,KAAK,QAAQ,WAAW7B,EAAQM,EAAaE,CAAmB,EACrF,GAAI,CAACqB,EACD,MAKJ,GAAI,EAFevB,EAAY,iBAAmBwC,EAAc,UAAU,gBACnEtC,EAAsBsC,EAAc,mBAC1B,CACb,IAAIX,EAAgB,KAAK,iCAAiCN,EAAQ,CAC9D,mBAAoB+B,EACpB,oBAAqBS,GAA2B,iBAAmB,IACvE,EAAGtC,CAAO,EACV5B,EAAOgC,CAAa,EACpB,IAAImC,EAAwB,KAAK,wBAAwB,IAAInC,CAAa,EAsB1E,GArBAhC,EAAOmE,CAAqB,EACxB,CAACT,GACEhC,EAAO,QAAQ,iBAAmBiC,EAAQ,gBAC1CjC,EAAO,kBAAoBkC,GAE9BH,EAA4B,KAAK,oCAAoCtD,EAAY,eAAe,EAChGuD,EAA4B,GAE5B1B,EAAgB,KAAK,iCAAiCN,EAAQ,CAC1D,mBAAoB+B,EAA4BU,EAAsB,kBACtE,oBAAqBD,GAA2B,iBAAmB,IACvE,EAAGtC,CAAO,EACV5B,EAAOgC,CAAa,EACpBmC,EAAwB,KAAK,wBAAwB,IAAInC,CAAa,EACtEhC,EAAOmE,CAAqB,GAG5BV,GAA6BU,EAAsB,kBAEvDF,EAAoBjC,EACpBkC,EAA4BC,EACxBT,IAGA,KAAK,IAAID,EAA2B,CAAC,EAAInB,GAElC,KAAK,IAAI6B,EAAsB,mBAAoB,CAAC,IAAM7B,GACjE,KAER,CACA,IAAM8B,EAAe,MAAM,KAAK,QAAQ,oBAAoBvE,EAAQ6B,CAAM,EAC1E,GAAI,CAAC0C,EACD,MAEJjE,EAAciE,EAAa,UAC3B/D,EAAsB+D,EAAa,iBACvC,CACA,OAAOH,CACX,QACA,CACI7B,EAAQ,CACZ,CACJ,CACA,aAAaK,EAAWb,EAAS,CAC7B,OAAO,KAAK,UAAUa,EAAWb,CAAO,CAC5C,CACA,iBAAiBF,EAAQE,EAAS,CAC9B,OAAO,KAAK,cAAcF,EAAQE,CAAO,CAC7C,CACJ,EAEMoC,GAA0B,CAACK,EAAUV,EAASC,IAAoB,CACpE,IAAIjF,EAAOgF,EACPW,EAAeV,EACnBrD,EAAO,OAAa,CAEhB,IADA+D,IACKA,EAAcA,GAAgB,EAAGA,IAElC,GADoB3F,EAAK,aAAa2F,CAAY,EAChC,IAAK,CACnBA,IACA,MAAM/D,CACV,CAIJ,GAFAP,EAAOsE,IAAiB,EAAE,EACQ,EAAE3F,EAAK,WAAa,GACvB,CAE3B2F,EAAe,EACf,KACJ,CACA,IAAMC,EAAeC,GAASH,EAAUnD,GAAKA,EAAE,eAAiBvC,EAAK,cAAc,EACnF,GAAI,CAAC4F,EACD,OAAO,KAEX5F,EAAO4F,EACPD,EAAe3F,EAAK,aAAa,MACrC,CAEA,GADAqB,EAAOsE,IAAiB,EAAE,EACtBA,IAAiB3F,EAAK,aAAa,OAAQ,CAE3C,IAAM+B,EAAW2D,EAASA,EAAS,QAAQ1F,CAAI,EAAI,CAAC,EACpDqB,EAAOU,CAAQ,EACf/B,EAAO+B,EACP4D,EAAe,CACnB,CACA,MAAO,CAAE,KAAA3F,EAAM,aAAA2F,CAAa,CAChC,EAEMP,GAAgC,CAACM,EAAUvE,EAAWC,IAAsB,CAC9E,GAAIA,EAAoB,EAEpB,MAAO,CAAE,KAAMD,EAAW,aAAcC,EAAoB,CAAE,EAElE,IAAMwE,EAAeC,GAASH,EAAUnD,GAAKA,EAAE,eAAiBpB,EAAU,cAAc,EACxF,OAAKyE,EAGE,CAAE,KAAMA,EAAc,aAAcA,EAAa,aAAa,OAAS,CAAE,EAFrE,IAGf,ECtqBO,IAAME,EAAN,KAAkB,CACzB,EAKaC,GAAN,cAAiCD,CAAY,CAEhD,MAAM,eAAeE,EAAO,CAExB,GADmB,MAAMA,EAAM,YAAY,OAAO,QAAQ,EACzC,GACb,OAAO,KAEX,IAAMC,EAAgB,IAAIC,GAAcF,EAAM,WAAW,EAGzD,OAFAC,EAAc,IAAM,EACLA,EAAc,UAAU,CAAC,IACzB,OACJ,KAEJA,EAAc,UAAU,CAAC,CACpC,CAEA,eAAeD,EAAO,CAClB,OAAO,IAAIG,GAAeH,CAAK,CACnC,CACJ,EAKaI,GAAN,cAA6BL,EAAmB,CAEnD,MAAM,cAAcC,EAAO,CACvB,IAAMK,EAAa,MAAM,KAAK,eAAeL,CAAK,EAClD,MAAO,CAAC,CAACK,GAAcA,IAAe,MAC1C,CACA,IAAI,MAAO,CACP,MAAO,KACX,CACA,IAAI,UAAW,CACX,MAAO,WACX,CACJ,EAKaC,GAAN,cAAmCP,EAAmB,CAEzD,MAAM,cAAcC,EAAO,CAEvB,OADmB,MAAM,KAAK,eAAeA,CAAK,IAC5B,MAC1B,CACA,IAAI,MAAO,CACP,MAAO,uBACX,CACA,IAAI,UAAW,CACX,MAAO,iBACX,CACJ,EAKaO,GAAN,cAAkCT,CAAY,CAEjD,MAAM,yBAAyBE,EAAOQ,EAAgB,CAElD,GADmB,MAAMR,EAAM,YAAY,OAAO,QAAQ,EACzC,EACb,MAAO,GAEX,IAAMS,EAAa,IAAIC,GAAWV,EAAM,WAAW,EAC7CW,EAAaF,EAAW,eAAe,EAK7C,GAJIE,EAAa,GAAKA,EAAa,GAGxBF,EAAW,gBAAgBE,CAAU,IACrCC,EAAO,KACd,MAAO,GAEX,IAAMC,EAAWJ,EAAW,gBAAgB,EAC5C,GAAII,IAAa,KACb,MAAO,GAEX,IAAMC,EAAWL,EAAW,IAC5B,KAAOA,EAAW,IAAMK,EAAWD,GAAU,CACzC,GAAM,CAAE,GAAAE,EAAI,KAAAC,CAAK,EAAIP,EAAW,kBAAkB,EAC5CQ,EAAeR,EAAW,IAChC,GAAIO,IAAS,KACT,MAAO,GACX,OAAQD,EAAI,CACR,KAAKH,EAAO,YAGJ,GADoBH,EAAW,gBAAgBO,CAAI,IAC/B,EAChB,MAAO,GAIf,MACJ,KAAKJ,EAAO,gBAGJ,GADwBH,EAAW,gBAAgBO,CAAI,IAC/B,EACpB,MAAO,GAIf,MACJ,KAAKJ,EAAO,QAGJ,GADgBH,EAAW,WAAWO,CAAI,IAC1BR,EACZ,MAAO,GAIf,MACJ,KAAKI,EAAO,eAGJ,GADuBH,EAAW,gBAAgBO,CAAI,EACjC,EACjB,MAAO,GAIf,KACR,CACAP,EAAW,IAAMQ,EAAeD,CACpC,CACA,MAAO,EACX,CAEA,cAAchB,EAAO,CACjB,OAAO,KAAK,yBAAyBA,EAAO,UAAU,CAC1D,CAEA,eAAeA,EAAO,CAClB,OAAO,IAAIkB,GAAgBlB,CAAK,CACpC,CACA,IAAI,MAAO,CACP,MAAO,UACX,CACA,IAAI,UAAW,CACX,MAAO,kBACX,CACJ,EAKamB,GAAN,cAA8BZ,EAAoB,CAErD,cAAcP,EAAO,CACjB,OAAO,KAAK,yBAAyBA,EAAO,MAAM,CACtD,CACA,IAAI,MAAO,CACP,MAAO,MACX,CACA,IAAI,UAAW,CACX,MAAO,YACX,CACJ,EAKaoB,GAAN,cAA6BtB,CAAY,CAE5C,MAAM,cAAcE,EAAO,CACvB,IAAMqB,EAAa,MAAMrB,EAAM,YAAY,OAAO,QAAQ,EAC1D,GAAIqB,EAAa,EACb,MAAO,GAEX,IAAMC,EAAY,IAAIC,GAAUvB,EAAM,WAAW,EACjDsB,EAAU,SAAWD,EACrB,IAAMG,EAASF,EAAU,QAAQ,EAC7BE,IACAF,EAAU,KAAOE,EAAO,MAE5B,IAAMC,EAAiBH,EAAU,IACjC,MAAMA,EAAU,OAAO,UAAUA,EAAU,IAAKA,EAAU,IAAM,IAAI,EACpE,IAAMI,EAAcJ,EAAU,oBAAoB,KAAK,IAAIG,EAAiB,KAAMJ,CAAU,CAAC,EAC7F,GAAI,CAACK,EACD,MAAO,GAEX,GAAIF,EAEA,MAAO,GAIXF,EAAU,IAAMI,EAAY,SAAWA,EAAY,UACnD,MAAMJ,EAAU,OAAO,UAAUA,EAAU,IAAKA,EAAU,IAAM,CAAiB,EACjF,IAAMK,EAAeL,EAAU,oBAAoBA,EAAU,IAAM,CAAiB,EAKpF,MAJI,GAACK,GAIDD,EAAY,UAAYC,EAAa,SAAWD,EAAY,aAAeC,EAAa,WAKhG,CAEA,eAAe3B,EAAO,CAClB,OAAO,IAAI4B,GAAW5B,CAAK,CAC/B,CACA,IAAI,MAAO,CACP,MAAO,KACX,CACA,IAAI,UAAW,CACX,MAAO,YACX,CACJ,EAKa6B,GAAN,cAA8B/B,CAAY,CAE7C,MAAM,cAAcE,EAAO,CAEvB,GADmB,MAAMA,EAAM,YAAY,OAAO,QAAQ,EACzC,GACb,MAAO,GAEX,IAAM8B,EAAa,IAAIC,GAAW/B,EAAM,WAAW,EAC7CgC,EAAWF,EAAW,UAAU,CAAC,EACvC,OAAIE,IAAa,QAAUA,IAAa,OAC7B,IAEXF,EAAW,IAAM,EACFA,EAAW,UAAU,CAAC,IACnB,OACtB,CAEA,eAAe9B,EAAO,CAClB,OAAO,IAAIiC,GAAYjC,CAAK,CAChC,CACA,IAAI,MAAO,CACP,MAAO,MACX,CACA,IAAI,UAAW,CACX,MAAO,WACX,CACJ,EAKakC,GAAN,cAA6BpC,CAAY,CAE5C,MAAM,cAAcE,EAAO,CAEvB,OADmB,MAAMA,EAAM,YAAY,OAAO,QAAQ,EACzC,EACN,GAEO,IAAImC,GAAUnC,EAAM,WAAW,EAChC,UAAU,CAAC,IAAM,MACtC,CAEA,eAAeA,EAAO,CAClB,OAAO,IAAIoC,GAAWpC,CAAK,CAC/B,CACA,IAAI,MAAO,CACP,MAAO,KACX,CACA,IAAI,UAAW,CACX,MAAO,iBACX,CACJ,EAKaqC,GAAM,IAAIjC,GAKVkC,GAAO,IAAIhC,GAKXiC,GAAW,IAAIhC,GAKfiC,GAAO,IAAIrB,GAKXsB,GAAM,IAAIrB,GAKVsB,GAAO,IAAIb,GAKXc,GAAM,IAAIT,GAMVU,GAAc,CAACP,GAAKC,GAAMC,GAAUC,GAAME,GAAMC,GAAKF,EAAG,EC/T9D,IAAMI,GAAN,KAAY,CACf,YAAYC,EAAS,CAKjB,GAHA,KAAK,gBAAkB,KAEvB,KAAK,QAAU,KACX,CAACA,GAAW,OAAOA,GAAY,SAC/B,MAAM,IAAI,UAAU,4BAA4B,EAEpD,GAAI,CAAC,MAAM,QAAQA,EAAQ,OAAO,GAAKA,EAAQ,QAAQ,KAAKC,GAAK,EAAEA,aAAaC,EAAY,EACxF,MAAM,IAAI,UAAU,kDAAkD,EAE1E,GAAI,EAAEF,EAAQ,kBAAkBG,IAC5B,MAAM,IAAI,UAAU,kCAAkC,EAE1D,KAAK,SAAWH,EAAQ,QACxB,KAAK,QAAUA,EAAQ,OACvB,KAAK,YAAc,IAAII,EAAOJ,EAAQ,MAAM,CAChD,CAEA,aAAc,CACV,OAAO,KAAK,mBAAqB,SAAY,CACzC,MAAM,KAAK,YAAY,UAAU,EAAG,IAAI,EACxC,QAAWK,KAAU,KAAK,SAEtB,GADgB,MAAMA,EAAO,cAAc,IAAI,EAE3C,YAAK,QAAUA,EACRA,EAAO,eAAe,IAAI,EAGzC,MAAM,IAAI,MAAM,oDAAoD,CACxE,GAAG,CACP,CAKA,IAAI,QAAS,CACT,OAAO,KAAK,OAChB,CAMA,MAAM,WAAY,CACd,aAAM,KAAK,YAAY,EACvBC,EAAO,KAAK,OAAO,EACZ,KAAK,OAChB,CAKA,MAAM,iBAAkB,CAEpB,OADgB,MAAM,KAAK,YAAY,GACxB,gBAAgB,CACnC,CAEA,MAAM,WAAY,CAEd,OADgB,MAAM,KAAK,YAAY,GACxB,UAAU,CAC7B,CAEA,MAAM,gBAAiB,CAEnB,OADe,MAAM,KAAK,UAAU,GACtB,OAAOL,GAAKA,EAAE,aAAa,CAAC,CAC9C,CAEA,MAAM,sBAAuB,CAEzB,OADe,MAAM,KAAK,UAAU,GACtB,KAAKA,GAAKA,EAAE,aAAa,CAAC,GAAK,IACjD,CAEA,MAAM,gBAAiB,CAEnB,OADe,MAAM,KAAK,UAAU,GACtB,OAAOA,GAAKA,EAAE,aAAa,CAAC,CAC9C,CAEA,MAAM,sBAAuB,CAEzB,OADe,MAAM,KAAK,UAAU,GACtB,KAAKA,GAAKA,EAAE,aAAa,CAAC,GAAK,IACjD,CAEA,MAAM,aAAc,CAEhB,OADgB,MAAM,KAAK,YAAY,GACxB,YAAY,CAC/B,CACJ,EC9FM,IAAOM,GAAP,KAAc,CACnB,MAAQ,EAERC,GAAY,IAAI,IAEhB,SAASC,EAAYC,EAAgB,CACpC,KAAKF,GAAU,IAAIC,EAAIC,CAAO,CAC/B,CAEA,WAAWD,EAAU,CACpB,KAAKD,GAAU,OAAOC,CAAE,CACzB,CAEA,SAASA,EAAYE,EAAa,CACjC,KAAKH,GAAU,IAAIC,CAAE,IAAIE,CAAK,CAC/B,GCnBM,IAAMC,GAAmBC,GAAqBC,GAAQ,KAAsB,CAAC,CAAC,KAAAC,CAAI,EAAGC,KAAS,CAEpG,MAAM,OAAK,CACVH,EAAQ,OACT,GACC,ECNF,eAAsBI,GAAkBC,EAAqB,CAC5D,GAAGA,aAAkB,qBAAsB,CAC1C,IAAMC,EAAO,MAAMD,EAAO,QAAO,EACjC,OAAO,IAAIE,GAAWD,CAAI,CAC3B,KACC,QAAO,IAAIE,GAAUH,CAAM,CAE7B,CCCM,IAAOI,GAAP,KAAa,CAYV,QACA,OAZR,aAAa,MAAMC,EAAsB,CACxC,IAAMC,EAAU,IAAIC,GACdC,EAAS,MAAMC,GAAQ,OAAwB,CACpD,MAAO,iBACP,UAAWJ,EAAQ,UACnB,UAAWK,GAAgBJ,CAAO,EAClC,EACD,OAAO,IAAI,KAAKA,EAASE,CAAM,CAChC,CAEA,YACQF,EACAE,EAA+B,CAD/B,KAAA,QAAAF,EACA,KAAA,OAAAE,CACL,CAEH,MAAM,OAAK,CACV,OAAO,KAAK,OAAO,KAAK,MAAK,CAC9B,CAEA,MAAM,iBAAiBG,EAAqB,CAO3C,OAAO,MADY,MALL,IAAIC,GAAM,CACvB,OAAQ,MAAMC,GAAkBF,CAAM,EACtC,QAASG,GACT,EAE8B,qBAAoB,IAC1B,gBAAe,CACzC,CAEA,MAAM,iBAAiBH,EAAqB,CAO3C,OAAO,MADY,MALL,IAAIC,GAAM,CACvB,OAAQ,MAAMC,GAAkBF,CAAM,EACtC,QAASG,GACT,EAE8B,qBAAoB,IAC1B,gBAAe,CACzC,CAEA,OAAOC,EAAmB,CACzB,IAAIC,EAA+B,KAC7BC,EAAiB,IAAI,gBAAwC,CAClE,MAAM,UAAUC,EAAOC,EAAU,CAChC,IAAMC,EAAQ,MAAML,EAAM,UAAUG,CAAK,GAAKA,EAE9CF,GAAW,MAAK,EAChBG,EAAW,QAAQC,CAAK,EACxBJ,EAAYI,CACb,EACA,EACKC,EAAiB,IAAI,gBAC3B,YAAK,OAAO,KAAK,OAAOC,EAAI,EAAE,CAAC,SAAU,CAACL,EAAe,SAAUI,EAAe,QAAQ,CAAC,CAAC,EAAE,CAC7F,OAAQN,EAAM,OACd,MAAOE,EAAe,SACtB,MAAOI,EAAe,SACtB,EACM,CACN,MAAOA,EAAe,SACtB,MAAOJ,EAAe,SAExB,CAEA,MAAM,OAAO,CAAC,UAAAM,EAAW,OAAAC,CAAM,EAAe,CAE7C,IAAMC,EAAW,MADF,MAAM,OAAO,mBAAkB,GAChB,eAAc,EAEtCC,EAAS,IAAI,eAAkC,CACpD,MAAM,MAAMR,EAAK,CAChB,MAAMO,EAAS,MAAMP,CAAK,CAC3B,EACA,MAAM,OAAK,CACV,MAAMO,EAAS,MAAK,CACrB,EACA,EACD,OAAO,MAAM,KAAK,OAAO,KAAK,OAAOH,EAAI,EAAE,CAAC,SAAU,CAACC,EAAU,MAAOA,EAAU,MAAOG,CAAM,CAAC,CAAC,EAAE,CAAC,UAAAH,EAAW,OAAAC,EAAQ,OAAAE,CAAM,CAAC,CAC/H,CAEA,MAAM,UACLC,EAAwB,CAExB,IAAMC,EAAW,KAAKC,GAAqCF,CAAW,EACtE,OAAO,MAAM,KAAK,OAAO,KAAK,UAAUL,EAAI,EAAE,CAAC,SAAAM,CAAQ,CAAC,EAAED,CAAW,CACtE,CAEAE,GAAqCF,EAAwB,CAC5D,IAAMG,EAAgC,CAAA,EAEhCC,EAASC,GAAqB,CACnC,GAAI,MAAM,QAAQA,CAAI,EACrB,QAAWC,KAASD,EACnBD,EAAME,CAAK,OAEJD,GAAQ,OAAOA,GAAS,UAAY,SAAUA,GAClDA,EAAK,OAAS,SAAWA,EAAK,iBAAiB,YAClDF,EAAc,KAAKE,EAAK,KAAK,CAEhC,EAEA,OAAAD,EAAMJ,CAAW,EACVG,CACR,GC/GD,IAAMI,GAAY,IAAI,IAAI,oCAAqC,YAAY,GAAG,EAEjEC,GAAU,CACtB,OAAQC,GAAO,MAAM,CAAC,UAAAF,EAAS,CAAC,GCLjC,SAASG,EAAEA,EAAE,EAAEC,EAAEC,EAAE,CAAC,OAAO,IAAID,IAAIA,EAAE,UAAW,SAASE,EAAEC,EAAE,CAAC,SAASC,EAAEL,EAAE,CAAC,GAAG,CAACM,EAAEJ,EAAE,KAAKF,CAAC,CAAC,CAAC,OAAOA,EAAE,CAACI,EAAEJ,CAAC,CAAC,CAAC,CAAC,SAASO,EAAEP,EAAE,CAAC,GAAG,CAACM,EAAEJ,EAAE,MAAMF,CAAC,CAAC,CAAC,OAAOA,EAAE,CAACI,EAAEJ,CAAC,CAAC,CAAC,CAAC,SAASM,EAAEN,EAAE,CAAC,IAAIQ,EAAER,EAAE,KAAKG,EAAEH,EAAE,KAAK,GAAGQ,EAAER,EAAE,MAAMQ,aAAaP,EAAEO,EAAE,IAAIP,EAAG,SAASD,EAAE,CAACA,EAAEQ,CAAC,CAAC,CAAE,GAAG,KAAKH,EAAEE,CAAC,CAAC,CAACD,GAAGJ,EAAEA,EAAE,MAAMF,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,CAAqD,IAAMS,GAAN,KAAO,CAAC,aAAa,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,GAAGC,EAAED,EAAEE,EAAE,CAAC,GAAG,KAAK,UAAUD,CAAC,IAAI,KAAK,UAAUA,CAAC,EAAE,IAAI,KAAK,KAAK,UAAUA,CAAC,EAAE,IAAID,CAAC,EAAiBE,GAAE,KAAK,CAAC,IAAMA,EAAE,IAAI,CAAC,KAAK,GAAGD,EAAEC,CAAC,EAAE,KAAK,GAAGD,EAAED,CAAC,CAAC,EAAE,OAAO,KAAK,GAAGC,EAAEC,CAAC,EAAEA,CAAC,CAAC,MAAM,IAAI,KAAK,GAAGD,EAAED,CAAC,CAAC,CAAC,GAAGC,EAAED,EAAE,CAAC,IAAIE,GAAUA,EAAE,KAAK,UAAUD,CAAC,KAA1B,MAAuCC,IAAT,QAAYA,EAAE,OAAOF,CAAC,CAAC,CAAC,KAAKC,EAAED,EAAE,CAAC,OAAO,KAAK,GAAGC,EAAED,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,KAAKC,KAAKD,EAAE,CAAC,KAAK,UAAUC,CAAC,GAAG,KAAK,UAAUA,CAAC,EAAE,QAASA,GAAGA,EAAE,GAAGD,CAAC,CAAE,CAAC,CAAC,EAAOE,GAAE,CAAC,OAAO,SAASF,EAAEE,EAAE,CAAC,OAAOD,EAAE,KAAK,OAAO,OAAQ,WAAW,CAAC,IAAM,EAAE,IAAI,aAAa,CAAC,WAAWC,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgBF,CAAC,EAAE,QAAS,IAAI,EAAE,MAAM,CAAE,CAAC,CAAE,CAAC,EAAE,aAAa,SAASC,EAAE,EAAE,CAAC,OAAgB,OAAOA,EAAE,CAAC,GAApB,WAAwBA,EAAE,CAACA,CAAC,GAAG,SAAS,EAAE,CAAC,IAAMD,EAAE,EAAE,CAAC,EAAE,GAAGA,EAAE,KAAMC,GAAGA,EAAE,GAAGA,EAAE,EAAG,EAAE,CAAC,IAAMC,EAAEF,EAAE,OAAWG,EAAE,EAAE,QAAQF,EAAE,EAAEA,EAAEC,EAAED,IAAI,CAAC,IAAMC,EAAE,KAAK,IAAIF,EAAEC,CAAC,CAAC,EAAEC,EAAEC,IAAIA,EAAED,EAAE,CAAC,QAAUF,KAAK,EAAE,QAAQC,EAAE,EAAEA,EAAEC,EAAED,IAAID,EAAEC,CAAC,GAAGE,CAAC,CAAC,EAAEF,CAAC,EAAE,CAAC,SAAS,EAAE,OAAOA,EAAE,CAAC,EAAE,OAAO,WAAWA,EAAE,CAAC,EAAE,OAAO,EAAE,iBAAiBA,EAAE,OAAO,eAAeD,GAAkBC,IAAED,CAAC,EAAE,gBAAgB,YAAY,UAAU,gBAAgB,cAAc,YAAY,UAAU,aAAa,CAAC,CAAC,EAAE,SAASG,GAAEF,EAAE,EAAE,CAAC,IAAMC,EAAE,EAAE,MAAM,SAAS,gBAAgB,EAAE,MAAMD,CAAC,EAAE,SAAS,cAAcA,CAAC,EAAE,OAAS,CAACA,EAAEG,CAAC,IAAI,OAAO,QAAQ,CAAC,EAAE,GAAgBH,IAAb,YAAgBG,EAAE,OAAS,CAACH,EAAED,CAAC,IAAI,OAAO,QAAQI,CAAC,EAAEJ,aAAa,KAAKE,EAAE,YAAYF,CAAC,EAAY,OAAOA,GAAjB,SAAmBE,EAAE,YAAY,SAAS,eAAeF,CAAC,CAAC,EAAEE,EAAE,YAAYC,GAAEF,EAAED,CAAC,CAAC,OAAgBC,IAAV,QAAY,OAAO,OAAOC,EAAE,MAAME,CAAC,EAAkBH,IAAhB,cAAkBC,EAAE,YAAYE,EAAEF,EAAE,aAAaD,EAAEG,EAAE,SAAS,CAAC,EAAE,OAAOF,CAAC,CAAC,SAASE,GAAEH,EAAE,EAAEC,EAAE,CAAC,IAAME,EAAED,GAAEF,EAAE,GAAG,CAAC,CAAC,EAAE,OAAgBC,GAAE,YAAYE,CAAC,EAAEA,CAAC,CAAC,IAAIC,GAAE,OAAO,OAAO,CAAC,UAAU,KAAK,cAAcD,GAAE,QAAQA,EAAC,CAAC,EAAQE,GAAE,CAAC,UAAU,SAASN,EAAEE,EAAEC,EAAE,CAAC,OAAOF,EAAE,KAAK,OAAO,OAAQ,WAAW,CAAC,IAAMG,EAAE,MAAM,MAAMJ,EAAEG,CAAC,EAAE,GAAGC,EAAE,QAAQ,IAAI,MAAM,IAAI,MAAM,mBAAmBJ,CAAC,KAAKI,EAAE,MAAM,KAAKA,EAAE,UAAU,GAAG,EAAE,OAAO,SAASJ,EAAE,EAAE,CAACC,EAAE,KAAK,OAAO,OAAQ,WAAW,CAAC,GAAG,CAACD,EAAE,MAAM,CAACA,EAAE,QAAQ,OAAO,IAAMG,EAAEH,EAAE,KAAK,UAAU,EAAEI,EAAE,OAAOJ,EAAE,QAAQ,IAAI,gBAAgB,CAAC,GAAG,EAAMK,EAAE,EAAQC,EAAEN,GAAGC,EAAE,KAAK,OAAO,OAAQ,WAAW,CAACI,GAAmBL,GAAE,QAAS,EAAE,IAAMC,EAAE,KAAK,MAAMI,EAAED,EAAE,GAAG,EAAE,EAAEH,CAAC,CAAC,CAAE,EAAEM,EAAE,IAAIN,EAAE,KAAK,OAAO,OAAQ,WAAW,CAAC,IAAIA,EAAE,GAAG,CAACA,EAAE,MAAME,EAAE,KAAK,CAAC,MAAS,CAAC,MAAM,CAACF,EAAE,OAAOK,EAAEL,EAAE,KAAK,EAAE,MAAMM,EAAE,EAAE,CAAE,EAAEA,EAAE,CAAC,CAAE,CAAC,EAAEH,EAAE,MAAM,EAAEF,CAAC,EAAEE,EAAE,KAAK,CAAC,CAAE,CAAC,CAAC,EAAQG,GAAN,cAAgBP,EAAC,CAAC,YAAYC,EAAE,CAAC,MAAM,EAAE,KAAK,gBAAgB,GAAGA,EAAE,OAAO,KAAK,MAAMA,EAAE,MAAM,KAAK,gBAAgB,IAAI,KAAK,MAAM,SAAS,cAAc,OAAO,EAAEA,EAAE,gBAAgB,KAAK,MAAM,SAAS,IAAIA,EAAE,WAAW,KAAK,MAAM,SAAS,IAAUA,EAAE,cAAR,MAAsB,KAAK,aAAa,UAAW,IAAI,CAAOA,EAAE,cAAR,OAAuB,KAAK,MAAM,aAAaA,EAAE,aAAa,EAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,aAAaA,EAAED,EAAEE,EAAE,CAAC,OAAO,KAAK,MAAM,iBAAiBD,EAAED,EAAEE,CAAC,EAAE,IAAI,KAAK,MAAM,oBAAoBD,EAAED,EAAEE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,KAAK,MAAM,YAAY,KAAK,MAAM,KAAK,EAAE,CAAC,WAAW,CAAC,IAAMD,EAAE,KAAK,OAAO,EAAEA,EAAE,WAAW,OAAO,GAAG,IAAI,gBAAgBA,CAAC,CAAC,CAAC,YAAYA,EAAE,CAAC,OAAW,KAAK,MAAM,YAAYA,CAAC,IAA7B,EAA8B,CAAC,OAAOA,EAAED,EAAE,CAAC,IAAME,EAAE,KAAK,OAAO,EAAE,GAAGD,GAAGC,IAAID,EAAE,OAAO,KAAK,UAAU,EAAE,IAAM,EAAED,aAAa,OAAO,KAAK,YAAYA,EAAE,IAAI,GAAG,CAACC,GAAG,IAAI,gBAAgBD,CAAC,EAAEC,EAAE,GAAGC,GAAG,KAAK,MAAM,gBAAgB,KAAK,EAAE,GAAGD,EAAE,GAAG,CAAC,KAAK,MAAM,IAAI,CAAC,MAAS,CAAC,KAAK,MAAM,IAAIA,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,kBAAkB,KAAK,MAAM,MAAM,EAAE,KAAK,MAAM,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,MAAM,gBAAgB,KAAK,EAAE,KAAK,MAAM,KAAK,EAAE,CAAC,gBAAgBA,EAAE,CAAC,KAAK,MAAMA,CAAC,CAAC,MAAM,CAAC,OAAOA,EAAE,KAAK,OAAO,OAAQ,WAAW,CAAC,OAAO,KAAK,MAAM,KAAK,CAAC,CAAE,CAAC,CAAC,OAAO,CAAC,KAAK,MAAM,MAAM,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,MAAM,QAAQ,CAAC,KAAK,MAAM,KAAK,CAAC,QAAQA,EAAE,CAAC,KAAK,MAAM,YAAY,KAAK,IAAI,EAAE,KAAK,IAAIA,EAAE,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,KAAK,MAAM,QAAQ,CAAC,gBAAgB,CAAC,OAAO,KAAK,MAAM,WAAW,CAAC,WAAW,CAAC,OAAO,KAAK,MAAM,MAAM,CAAC,UAAUA,EAAE,CAAC,KAAK,MAAM,OAAOA,CAAC,CAAC,UAAU,CAAC,OAAO,KAAK,MAAM,KAAK,CAAC,SAASA,EAAE,CAAC,KAAK,MAAM,MAAMA,CAAC,CAAC,iBAAiB,CAAC,OAAO,KAAK,MAAM,YAAY,CAAC,WAAW,CAAC,OAAO,KAAK,MAAM,OAAO,CAAC,gBAAgBA,EAAED,EAAE,CAAOA,GAAN,OAAU,KAAK,MAAM,eAAeA,GAAG,KAAK,MAAM,aAAaC,CAAC,CAAC,iBAAiB,CAAC,OAAO,KAAK,KAAK,CAAC,UAAUA,EAAE,CAAC,OAAO,KAAK,MAAM,UAAUA,CAAC,CAAC,CAAC,EAAOO,GAAN,MAAMC,UAAUT,EAAC,CAAC,YAAYC,EAAED,EAAE,CAAC,MAAM,EAAE,KAAK,SAAS,CAAC,EAAE,KAAK,aAAa,GAAG,KAAK,UAAU,KAAK,KAAK,eAAe,KAAK,KAAK,mBAAmB,EAAE,KAAK,WAAW,GAAG,KAAK,cAAc,CAAC,EAAE,KAAK,oBAAoB,CAAC,EAAE,KAAK,cAAc,CAAC,EAAE,KAAK,QAAQC,EAAE,IAAMC,EAAE,KAAK,2BAA2BD,EAAE,SAAS,EAAE,KAAK,OAAOC,EAAE,GAAK,CAAC,EAAEE,CAAC,EAAE,KAAK,SAAS,EAAEF,EAAE,YAAY,CAAC,EAAE,KAAK,UAAU,EAAE,KAAK,gBAAgBE,EAAE,cAAc,SAAS,EAAE,KAAK,QAAQA,EAAE,cAAc,UAAU,EAAE,KAAK,cAAcA,EAAE,cAAc,WAAW,EAAE,KAAK,gBAAgBA,EAAE,cAAc,WAAW,EAAE,KAAK,OAAOA,EAAE,cAAc,SAAS,EAAEJ,GAAGI,EAAE,YAAYJ,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC,2BAA2BC,EAAE,CAAC,IAAID,EAAE,GAAa,OAAOC,GAAjB,SAAmBD,EAAE,SAAS,cAAcC,CAAC,EAAEA,aAAa,cAAcD,EAAEC,GAAG,CAACD,EAAE,MAAM,IAAI,MAAM,qBAAqB,EAAE,OAAOA,CAAC,CAAC,YAAY,CAAC,IAAMC,EAAE,GAAG,CAAC,IAAMD,EAAE,KAAK,QAAQ,sBAAsB,EAAEE,EAAE,EAAE,QAAQF,EAAE,KAAKG,EAAE,EAAE,QAAQH,EAAE,IAAI,MAAM,CAACE,EAAEF,EAAE,MAAMG,EAAEH,EAAE,MAAM,CAAC,EAAE,GAAG,KAAK,QAAQ,iBAAiB,QAASA,GAAG,CAAC,GAAK,CAACE,EAAE,CAAC,EAAED,EAAED,CAAC,EAAE,KAAK,KAAK,QAAQE,EAAE,CAAC,CAAC,CAAE,EAAE,KAAK,QAAQ,iBAAiB,WAAYF,GAAG,CAAC,GAAK,CAACE,EAAE,CAAC,EAAED,EAAED,CAAC,EAAE,KAAK,KAAK,WAAWE,EAAE,CAAC,CAAC,CAAE,EAAO,KAAK,QAAQ,aAAlB,IAAwC,OAAO,KAAK,QAAQ,YAA9B,UAA0C,KAAK,SAAS,EAAE,KAAK,gBAAgB,iBAAiB,SAAU,IAAI,CAAC,GAAK,CAAC,WAAW,EAAE,YAAYF,EAAE,YAAYE,CAAC,EAAE,KAAK,gBAAgBC,EAAE,EAAEH,EAAEI,GAAG,EAAEF,GAAGF,EAAE,KAAK,KAAK,SAASG,EAAEC,EAAE,EAAE,EAAEF,CAAC,CAAC,CAAE,EAAc,OAAO,gBAAnB,WAAkC,CAAC,IAAM,EAAE,KAAK,YAAY,GAAG,EAAE,KAAK,eAAe,IAAI,eAAgB,IAAI,CAAC,EAAE,EAAE,KAAM,IAAI,KAAK,kBAAkB,CAAE,EAAE,MAAO,IAAI,CAAC,CAAE,CAAC,CAAE,EAAE,KAAK,eAAe,QAAQ,KAAK,eAAe,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAMD,EAAE,KAAK,OAAO,YAAYA,IAAI,KAAK,oBAA6B,KAAK,QAAQ,SAAtB,SAA+B,KAAK,mBAAmBA,EAAE,KAAK,SAAS,EAAE,CAAC,UAAU,CAAC,KAAK,cAAc,KAAK,SAASA,EAAED,EAAEE,EAAE,EAAEE,EAAE,EAAEC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,CAACJ,EAAE,MAAM,IAAI,CAAC,EAAE,IAAMM,EAAE,WAAW,mBAAmB,EAAE,QAAYC,EAAE,IAAI,CAAC,EAAQE,EAAEA,GAAG,CAAC,GAAGA,EAAE,SAASL,EAAE,OAAOK,EAAE,eAAe,EAAEA,EAAE,gBAAgB,EAAE,IAAIC,EAAED,EAAE,QAAQE,EAAEF,EAAE,QAAQG,EAAE,GAASC,EAAE,KAAK,IAAI,EAAEC,EAAEZ,GAAG,CAAC,GAAGA,EAAE,eAAe,EAAEA,EAAE,gBAAgB,EAAEI,GAAG,KAAK,IAAI,EAAEO,EAAE,EAAE,OAAO,IAAMT,EAAEF,EAAE,QAAQK,EAAEL,EAAE,QAAQO,EAAEL,EAAEM,EAAEI,EAAEP,EAAEI,EAAE,GAAGC,GAAG,KAAK,IAAIH,CAAC,EAAEN,GAAG,KAAK,IAAIW,CAAC,EAAEX,EAAE,CAAC,IAAMD,EAAEF,EAAE,sBAAsB,EAAE,CAAC,KAAKG,EAAE,IAAIE,CAAC,EAAEH,EAAEU,IAAaX,IAAES,EAAEP,EAAEQ,EAAEN,CAAC,EAAEO,EAAE,IAAIb,EAAEU,EAAEK,EAAEV,EAAED,EAAEI,EAAEF,CAAC,EAAEK,EAAEN,EAAEO,EAAEJ,CAAC,CAAC,EAAEQ,EAAEhB,GAAG,CAAC,GAAGa,EAAE,CAAC,IAAMX,EAAEF,EAAE,QAAQI,EAAEJ,EAAE,QAAQK,EAAEJ,EAAE,sBAAsB,EAAE,CAAC,KAAKK,EAAE,IAAIC,CAAC,EAAEF,EAAW,IAAEH,EAAEI,EAAEF,EAAEG,CAAC,CAAC,CAACC,EAAE,CAAC,EAAES,EAAEhB,GAAG,CAACA,EAAE,eAAeA,EAAE,gBAAgB,SAAS,iBAAiBe,EAAEf,CAAC,CAAC,EAAEiB,EAAEjB,GAAG,CAACY,IAAIZ,EAAE,gBAAgB,EAAEA,EAAE,eAAe,EAAE,EAAEkB,EAAElB,GAAG,CAACY,GAAGZ,EAAE,eAAe,CAAC,EAAE,SAAS,iBAAiB,cAAcc,CAAC,EAAE,SAAS,iBAAiB,YAAYC,CAAC,EAAE,SAAS,iBAAiB,aAAaC,CAAC,EAAE,SAAS,iBAAiB,gBAAgBA,CAAC,EAAE,SAAS,iBAAiB,YAAYE,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,SAAS,iBAAiB,QAAQD,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAEV,EAAE,IAAI,CAAC,SAAS,oBAAoB,cAAcO,CAAC,EAAE,SAAS,oBAAoB,YAAYC,CAAC,EAAE,SAAS,oBAAoB,aAAaC,CAAC,EAAE,SAAS,oBAAoB,gBAAgBA,CAAC,EAAE,SAAS,oBAAoB,YAAYE,CAAC,EAAE,WAAY,IAAI,CAAC,SAAS,oBAAoB,QAAQD,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAG,EAAE,CAAC,CAAC,EAAE,OAAOjB,EAAE,iBAAiB,cAAcS,CAAC,EAAE,IAAI,CAACF,EAAE,EAAEP,EAAE,oBAAoB,cAAcS,CAAC,CAAC,CAAC,EAAE,KAAK,QAAS,CAACT,EAAED,EAAEE,IAAI,CAAC,KAAK,KAAK,OAAO,KAAK,IAAI,EAAE,KAAK,IAAI,EAAEA,EAAE,KAAK,QAAQ,sBAAsB,EAAE,KAAK,CAAC,CAAC,CAAC,EAAID,GAAG,CAAC,KAAK,WAAW,GAAG,KAAK,KAAK,YAAY,KAAK,IAAI,EAAE,KAAK,IAAI,EAAEA,EAAE,KAAK,QAAQ,sBAAsB,EAAE,KAAK,CAAC,CAAC,CAAC,EAAIA,GAAG,CAAC,KAAK,WAAW,GAAG,KAAK,KAAK,UAAU,KAAK,IAAI,EAAE,KAAK,IAAI,EAAEA,EAAE,KAAK,QAAQ,sBAAsB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,UAAUA,EAAED,EAAE,CAAC,IAAIE,EAAE,IAAM,IAAWA,EAAE,KAAK,aAAf,MAAoCA,IAAT,OAAW,OAAOA,EAAE,mBAAmB,EAAE,GAASD,GAAN,KAAQ,MAAO,KAAI,GAAG,CAAC,MAAM,OAAOA,CAAC,CAAC,EAAE,OAAO,OAAOA,CAAC,EAAE,GAAYA,IAAT,OAAW,CAAC,IAAMA,EAAE,KAAK,OAAO,cAAc,IAAI,OAAsBD,GAAE,MAAOC,GAAG,CAACA,EAAE,OAAQ,EAAGA,EAAE,EAAEA,CAAC,CAAC,MAAO,IAAG,CAAC,UAAU,CAAC,IAAMA,EAAE,SAAS,cAAc,KAAK,EAAED,EAAEC,EAAE,aAAa,CAAC,KAAK,MAAM,CAAC,EAAEC,EAAE,KAAK,QAAQ,UAAoB,OAAO,KAAK,QAAQ,UAA9B,SAAuC,KAAK,QAAQ,SAAS,QAAQ,KAAK,EAAE,EAAE,GAAG,OAAOF,EAAE,UAAU;AAAA,cAAiBE,EAAE,WAAWA,CAAC,IAAI,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAguB,KAAK,UAAU,KAAK,QAAQ,OAAO,KAAK,QAAQ,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAyjC,CAACD,EAAED,CAAC,CAAC,CAAC,WAAWC,EAAE,CAAC,GAAG,KAAK,QAAQ,YAAYA,EAAE,UAAU,CAAC,IAAMD,EAAE,KAAK,2BAA2BC,EAAE,SAAS,EAAED,EAAE,YAAY,KAAK,SAAS,EAAE,KAAK,OAAOA,CAAC,CAAMC,EAAE,aAAP,IAA6B,OAAO,KAAK,QAAQ,YAA9B,UAA0C,KAAK,SAAS,EAAE,KAAK,QAAQA,EAAE,KAAK,SAAS,CAAC,CAAC,YAAY,CAAC,OAAO,KAAK,OAAO,CAAC,UAAU,CAAC,OAAO,KAAK,gBAAgB,WAAW,CAAC,WAAW,CAAC,OAAO,KAAK,gBAAgB,UAAU,CAAC,UAAUA,EAAE,CAAC,KAAK,gBAAgB,WAAWA,CAAC,CAAC,oBAAoBA,EAAE,CAAC,GAAK,CAAC,YAAYD,CAAC,EAAE,KAAK,gBAAgBE,EAAEF,EAAEC,EAAE,KAAK,UAAUC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAID,EAAED,EAAE,KAAK,cAAc,QAASC,GAAGA,EAAE,CAAE,EAAE,KAAK,UAAU,OAAO,GAAUA,EAAE,KAAK,kBAAf,MAAyCA,IAAT,QAAYA,EAAE,WAAW,GAAUD,EAAE,KAAK,uBAAf,MAA8CA,IAAT,QAAYA,EAAE,QAASC,GAAGA,EAAE,CAAE,EAAE,KAAK,oBAAoB,CAAC,CAAC,CAAC,YAAYA,EAAE,GAAG,CAAC,IAAID,EAAEE,EAAQ,EAAE,IAAI,CAACF,GAAG,aAAaA,CAAC,EAAEE,GAAGA,EAAE,CAAC,EAAE,OAAO,KAAK,SAAS,KAAK,CAAC,EAAE,IAAI,IAAI,QAAS,CAACE,EAAEC,IAAI,CAAC,EAAE,EAAEH,EAAEG,EAAEL,EAAE,WAAY,IAAI,CAACA,EAAE,OAAOE,EAAE,OAAOE,EAAE,CAAC,EAAGH,CAAC,CAAC,CAAE,CAAC,CAAC,mBAAmBA,EAAE,CAAC,GAAG,CAAC,MAAM,QAAQA,CAAC,EAAE,OAAOA,GAAG,GAAG,GAAGA,EAAE,OAAO,EAAE,OAAOA,EAAE,CAAC,GAAG,GAAG,IAAMD,EAAE,SAAS,cAAc,QAAQ,EAAEE,EAAEF,EAAE,WAAW,IAAI,EAAE,EAAEA,EAAE,QAAQ,OAAO,kBAAkB,GAAGI,EAAEF,EAAE,qBAAqB,EAAE,EAAE,EAAE,CAAC,EAAEG,EAAE,GAAGJ,EAAE,OAAO,GAAG,OAAOA,EAAE,QAAS,CAACA,EAAED,IAAI,CAAC,IAAME,EAAEF,EAAEK,EAAED,EAAE,aAAaF,EAAED,CAAC,CAAC,CAAE,EAAEG,CAAC,CAAC,eAAe,CAAC,OAAO,KAAK,IAAI,EAAE,OAAO,kBAAkB,CAAC,CAAC,CAAC,kBAAkBH,EAAED,EAAEE,EAAE,EAAE,CAAC,IAAME,EAAEH,EAAE,CAAC,EAAEI,EAAEJ,EAAE,CAAC,GAAGA,EAAE,CAAC,EAAE,EAAEG,EAAE,OAAO,CAAC,MAAMG,EAAE,OAAOC,CAAC,EAAEN,EAAE,OAAOQ,EAAEF,EAAE,EAAEG,EAAE,KAAK,cAAc,EAAEC,EAAEZ,EAAE,SAASA,EAAE,SAASW,EAAE,EAAEE,EAAEb,EAAE,OAAOA,EAAE,OAAOW,EAAEX,EAAE,SAASY,EAAE,EAAE,EAAEE,EAAEd,EAAE,WAAW,EAAEe,EAAER,GAAGK,EAAEC,GAAG,EAAEG,EAAEF,GAAG,cAAcZ,EAAE,YAAY,OAAOA,EAAE,UAAU,EAAE,IAAIe,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAE,QAAQlB,EAAE,EAAEA,GAAG,EAAEA,IAAI,CAAC,IAAMK,EAAE,KAAK,MAAML,EAAEc,CAAC,EAAE,GAAGT,EAAEW,EAAE,CAAC,IAAMhB,EAAE,KAAK,MAAMiB,EAAER,EAAE,CAAC,EAAEN,EAAEH,EAAE,KAAK,MAAMkB,EAAET,EAAE,CAAC,GAAG,EAAML,EAAEK,EAAET,EAAUD,EAAE,WAAV,MAAmBK,EAAE,EAAaL,EAAE,WAAb,WAAwBK,EAAEG,EAAEJ,GAAGF,EAAEc,CAAC,EAAEC,GAAGL,EAAEC,GAAGR,EAAEO,EAAER,EAAEU,CAAC,EAAEG,EAAEX,EAAEY,EAAE,EAAEC,EAAE,CAAC,CAAC,IAAMZ,EAAE,KAAK,IAAIH,EAAEH,CAAC,GAAG,CAAC,EAAEU,EAAE,KAAK,IAAIN,EAAEJ,CAAC,GAAG,CAAC,EAAEM,EAAEW,IAAIA,EAAEX,GAAGI,EAAEQ,IAAIA,EAAER,EAAE,CAACT,EAAE,KAAK,EAAEA,EAAE,UAAU,CAAC,CAAC,mBAAmBD,EAAED,EAAEE,EAAE,EAAE,CAAC,IAAME,EAAEJ,GAAG,CAAC,IAAMI,EAAEH,EAAED,CAAC,GAAGC,EAAE,CAAC,EAAEI,EAAED,EAAE,OAAO,CAAC,OAAOE,CAAC,EAAEJ,EAAE,OAAOK,EAAED,EAAE,EAAEE,EAAEN,EAAE,OAAO,MAAMG,EAAEH,EAAE,OAAO,EAAEK,CAAC,EAAE,IAAIG,EAAE,EAAEC,EAAE,EAAE,QAAQV,EAAE,EAAEA,GAAGI,EAAEJ,IAAI,CAAC,IAAMI,EAAE,KAAK,MAAMJ,EAAEO,CAAC,EAAE,GAAGH,EAAEK,EAAE,CAAC,IAAMT,EAAEM,GAAG,KAAK,MAAMI,EAAEJ,EAAE,CAAC,GAAG,IAAQP,IAAJ,EAAM,GAAG,GAAGE,EAAE,OAAOQ,EAAET,CAAC,EAAES,EAAEL,EAAEM,EAAE,CAAC,CAAC,IAAML,EAAE,KAAK,IAAIF,EAAEH,CAAC,GAAG,CAAC,EAAEK,EAAEK,IAAIA,EAAEL,EAAE,CAACJ,EAAE,OAAOQ,EAAEH,CAAC,CAAC,EAAEL,EAAE,UAAU,EAAEE,EAAE,CAAC,EAAEA,EAAE,CAAC,EAAEF,EAAE,KAAK,EAAEA,EAAE,UAAU,CAAC,CAAC,eAAeD,EAAED,EAAEE,EAAE,CAAC,GAAGA,EAAE,UAAU,KAAK,mBAAmBF,EAAE,SAAS,EAAEA,EAAE,eAAe,OAAO,KAAKA,EAAE,eAAeC,EAAEC,CAAC,EAAE,IAAI,EAAEF,EAAE,WAAW,EAAE,GAAGA,EAAE,UAAU,CAAC,IAAMA,EAAE,MAAM,KAAKC,EAAE,CAAC,CAAC,EAAE,OAAQ,CAACA,EAAED,IAAI,KAAK,IAAIC,EAAE,KAAK,IAAID,CAAC,CAAC,EAAG,CAAC,EAAE,EAAEA,EAAE,EAAEA,EAAE,CAAC,CAACA,EAAE,UAAUA,EAAE,QAAQA,EAAE,SAAS,KAAK,kBAAkBC,EAAED,EAAEE,EAAE,CAAC,EAAE,KAAK,mBAAmBD,EAAED,EAAEE,EAAE,CAAC,CAAC,CAAC,mBAAmBD,EAAED,EAAEE,EAAE,EAAEE,EAAEC,EAAE,EAAE,CAAC,IAAME,EAAE,KAAK,cAAc,EAAEC,EAAE,SAAS,cAAc,QAAQ,EAAEA,EAAE,MAAM,KAAK,MAAMN,EAAEK,CAAC,EAAEC,EAAE,OAAO,KAAK,MAAM,EAAED,CAAC,EAAEC,EAAE,MAAM,MAAM,GAAGN,CAAC,KAAKM,EAAE,MAAM,OAAO,GAAG,CAAC,KAAKA,EAAE,MAAM,KAAK,GAAG,KAAK,MAAMJ,CAAC,CAAC,KAAKC,EAAE,YAAYG,CAAC,EAAE,IAAME,EAAEF,EAAE,WAAW,IAAI,EAAE,GAAG,KAAK,eAAeP,EAAED,EAAEU,CAAC,EAAEF,EAAE,MAAM,GAAGA,EAAE,OAAO,EAAE,CAAC,IAAMP,EAAEO,EAAE,UAAU,EAAEN,EAAED,EAAE,WAAW,IAAI,EAAEC,EAAE,UAAUM,EAAE,EAAE,CAAC,EAAEN,EAAE,yBAAyB,YAAYA,EAAE,UAAU,KAAK,mBAAmBF,EAAE,aAAa,EAAEE,EAAE,SAAS,EAAE,EAAEM,EAAE,MAAMA,EAAE,MAAM,EAAE,EAAE,YAAYP,CAAC,CAAC,CAAC,CAAC,kBAAkBA,EAAED,EAAEE,EAAE,EAAEE,EAAEC,EAAE,CAAC,IAAM,EAAE,KAAK,cAAc,EAAE,CAAC,YAAYE,CAAC,EAAE,KAAK,gBAAgB,EAAEL,EAAE,EAAM,EAAE,KAAK,IAAIO,EAAE,iBAAiBF,EAAE,CAAC,EAAEK,EAAE,CAAC,EAAE,GAAGZ,EAAE,UAAUA,EAAE,OAAO,CAAC,IAAMC,EAAED,EAAE,UAAU,GAAGE,EAAED,GAAGD,EAAE,QAAQC,EAAE,GAAG,EAAEC,GAAG,IAAI,EAAE,KAAK,MAAM,EAAEA,CAAC,EAAEA,EAAE,CAAC,GAAO,IAAJ,EAAM,OAAO,IAAMW,EAAEX,GAAG,CAAqB,GAAjBA,EAAE,GAAGA,GAAGY,GAAYF,EAAEV,CAAC,EAAE,OAAOU,EAAEV,CAAC,EAAE,GAAG,IAAMI,EAAEJ,EAAE,EAAMK,EAAE,KAAK,IAAI,EAAED,EAAE,CAAC,EAAE,GAAGN,EAAE,UAAUA,EAAE,OAAO,CAAC,IAAMC,EAAED,EAAE,UAAU,GAAGE,EAAED,GAAGD,EAAE,QAAQC,EAAE,GAAGM,EAAE,KAAK,MAAMA,EAAEL,CAAC,EAAEA,CAAC,CAAC,GAAGK,GAAG,EAAE,OAAO,IAAMC,EAAEP,EAAE,IAAKA,GAAG,CAAC,IAAMD,EAAE,KAAK,MAAMM,EAAE,EAAEL,EAAE,MAAM,EAAEC,EAAE,KAAK,OAAOI,EAAEC,GAAG,EAAEN,EAAE,MAAM,EAAE,OAAOA,EAAE,MAAMD,EAAEE,CAAC,CAAC,CAAE,EAAE,KAAK,mBAAmBM,EAAER,EAAEO,EAAE,EAAED,EAAEF,EAAEC,CAAC,CAAC,EAAES,EAAE,KAAK,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,aAAa,CAAC,QAAQb,EAAE,EAAEA,EAAEa,EAAEb,IAAIY,EAAEZ,CAAC,EAAE,MAAM,CAAC,IAAMc,EAAE,KAAK,gBAAgB,WAAW,EAAEC,EAAE,KAAK,MAAMD,EAAED,CAAC,EAAE,GAAGD,EAAEG,EAAE,CAAC,EAAEH,EAAEG,CAAC,EAAEH,EAAEG,EAAE,CAAC,EAAEF,EAAE,EAAE,CAAC,IAAMb,EAAE,KAAK,GAAG,SAAU,IAAI,CAAC,GAAK,CAAC,WAAWA,CAAC,EAAE,KAAK,gBAAgBD,EAAE,KAAK,MAAMC,EAAE,EAAEa,CAAC,EAAE,OAAO,KAAKF,CAAC,EAAE,OAAOH,EAAE,YAAYL,EAAE,UAAU,GAAGC,EAAE,UAAU,GAAGO,EAAE,CAAC,GAAGC,EAAEb,EAAE,CAAC,EAAEa,EAAEb,CAAC,EAAEa,EAAEb,EAAE,CAAC,CAAC,CAAE,EAAE,KAAK,oBAAoB,KAAKC,CAAC,CAAC,CAAC,CAAC,cAAcA,EAAED,EAAEE,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQE,CAAC,EAAEJ,EAAEK,EAAE,SAASJ,EAAED,EAAE,CAAC,IAAIE,EAAE,CAAC,EAAE,QAAQC,KAAKF,EAAE,OAAO,UAAU,eAAe,KAAKA,EAAEE,CAAC,GAAGH,EAAE,QAAQG,CAAC,EAAE,IAAID,EAAEC,CAAC,EAAEF,EAAEE,CAAC,GAAG,GAASF,GAAN,MAAqB,OAAO,OAAO,uBAA1B,WAAgD,CAAC,IAAIG,EAAE,EAAE,IAAID,EAAE,OAAO,sBAAsBF,CAAC,EAAEG,EAAED,EAAE,OAAOC,IAAIJ,EAAE,QAAQG,EAAEC,CAAC,CAAC,EAAE,GAAG,OAAO,UAAU,qBAAqB,KAAKH,EAAEE,EAAEC,CAAC,CAAC,IAAIF,EAAEC,EAAEC,CAAC,CAAC,EAAEH,EAAEE,EAAEC,CAAC,CAAC,EAAE,CAAC,OAAOF,CAAC,EAAEF,EAAE,CAAC,SAAS,CAAC,EAAE,IAAM,EAAE,SAAS,cAAc,KAAK,EAAEO,EAAE,KAAK,UAAUF,EAAE,OAAOA,EAAE,aAAa,EAAE,EAAE,MAAM,OAAO,GAAGE,CAAC,KAAKH,GAAG,EAAE,IAAI,EAAE,MAAM,UAAU,IAAIG,CAAC,MAAM,KAAK,cAAc,MAAM,UAAU,GAAGA,CAAC,KAAK,KAAK,cAAc,YAAY,CAAC,EAAE,IAAMC,EAAE,EAAE,UAAU,EAAE,KAAK,gBAAgB,YAAYA,CAAC,EAAE,KAAK,kBAAkBP,EAAEI,EAAEH,EAAEK,EAAE,EAAEC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,OAAOP,EAAE,KAAK,OAAO,OAAQ,WAAW,CAAC,IAAI,EAAE,KAAK,SAAS,QAASA,GAAGA,EAAE,CAAE,EAAE,KAAK,SAAS,CAAC,EAAE,KAAK,cAAc,UAAU,GAAG,KAAK,gBAAgB,UAAU,GAAS,KAAK,QAAQ,OAAnB,OAA2B,KAAK,gBAAgB,MAAM,MAAgB,OAAO,KAAK,QAAQ,OAA9B,SAAoC,GAAG,KAAK,QAAQ,KAAK,KAAK,KAAK,QAAQ,OAAO,IAAMC,EAAE,KAAK,cAAc,EAAE,EAAE,KAAK,gBAAgB,YAAYE,EAAE,KAAK,KAAK,EAAE,UAAU,KAAK,QAAQ,aAAa,EAAE,EAAE,KAAK,aAAaA,EAAE,EAAE,IAAMC,EAAE,KAAK,QAAQ,YAAY,CAAC,KAAK,aAAa,GAAGA,EAAE,EAAED,GAAGF,EAAE,GAAG,KAAK,QAAQ,MAAM,MAAMG,EAAE,OAAO,GAAGD,CAAC,KAAK,KAAK,gBAAgB,MAAM,UAAU,KAAK,aAAa,OAAO,SAAS,KAAK,gBAAgB,UAAU,OAAO,cAAc,CAAC,CAAC,KAAK,QAAQ,aAAa,EAAE,KAAK,OAAO,MAAM,gBAAgB,GAAG,KAAK,QAAQ,aAAa,KAAK,QAAQ,aAAa,GAAG,KAAK,OAAO,MAAM,MAAM,GAAG,KAAK,QAAQ,WAAW,KAAK,KAAK,UAAU,EAAE,KAAK,KAAK,QAAQ,EAAE,KAAK,QAAQ,cAAc,QAAQF,EAAE,EAAEA,EAAE,EAAE,iBAAiBA,IAAI,CAAC,IAAMC,EAAE,OAAO,OAAO,OAAO,OAAO,CAAC,EAAE,KAAK,OAAO,GAAU,EAAE,KAAK,QAAQ,iBAAvB,MAAgD,IAAT,OAAW,OAAO,EAAED,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,EAAE,eAAeA,CAAC,CAAC,EAAEC,EAAE,EAAED,CAAC,CAAC,KAAK,CAAC,IAAMD,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC,EAAE,EAAE,iBAAiB,GAAGA,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,EAAE,KAAK,cAAcA,EAAE,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,QAAQ,EAAE,KAAM,IAAI,KAAK,KAAK,UAAU,CAAE,CAAC,CAAE,CAAC,CAAC,UAAU,CAAC,GAAG,KAAK,oBAAoB,QAASA,GAAGA,EAAE,CAAE,EAAE,KAAK,oBAAoB,CAAC,EAAE,CAAC,KAAK,UAAU,OAAO,GAAK,CAAC,YAAYA,CAAC,EAAE,KAAK,gBAAgB,CAAC,MAAMD,CAAC,EAAE,KAAK,gBAAgB,sBAAsB,EAAE,GAAG,KAAK,OAAO,KAAK,SAAS,EAAE,KAAK,cAAcC,IAAI,KAAK,gBAAgB,YAAY,CAAC,GAAK,CAAC,MAAMA,CAAC,EAAE,KAAK,gBAAgB,sBAAsB,EAAMC,EAAED,EAAED,EAAEE,GAAG,EAAEA,EAAEA,EAAE,EAAE,KAAK,MAAMA,CAAC,EAAE,KAAK,KAAKA,CAAC,EAAEA,GAAG,EAAE,KAAK,gBAAgB,YAAYA,CAAC,CAAC,CAAC,KAAKD,EAAE,CAAC,KAAK,QAAQ,YAAYA,EAAE,KAAK,SAAS,CAAC,CAAC,eAAeA,EAAED,EAAE,GAAG,CAAC,GAAK,CAAC,WAAWE,EAAE,YAAY,EAAE,YAAYE,CAAC,EAAE,KAAK,gBAAgBC,EAAEJ,EAAE,EAAE,EAAEC,EAAEK,EAAEL,EAAEE,EAAEI,EAAEJ,EAAE,EAAE,GAAG,KAAK,WAAuBC,EAAE,GAAEE,EAAE,KAAK,gBAAgB,YAAY,GAAEF,EAAE,GAAE,IAAI,KAAK,gBAAgB,YAAY,QAAO,EAAEA,EAAE,GAAGA,EAAEE,KAAK,KAAK,gBAAgB,WAAWF,GAAG,KAAK,QAAQ,WAAWG,EAAE,IAAI,IAAMP,EAAEI,EAAEH,EAAEM,EAAER,GAAG,KAAK,QAAQ,YAAYC,EAAE,IAAI,KAAK,gBAAgB,YAAY,KAAK,IAAIA,EAAE,EAAE,EAAE,CAAC,CAAC,IAAMA,EAAE,KAAK,gBAAgB,WAAWD,EAAEC,EAAE,EAAEC,GAAGD,EAAEG,GAAG,EAAE,KAAK,KAAK,SAASJ,EAAEE,EAAED,EAAEA,EAAEG,CAAC,CAAC,CAAC,CAAC,eAAeH,EAAED,EAAE,CAAC,GAAG,MAAMC,CAAC,EAAE,OAAO,IAAMC,EAAE,IAAID,EAAE,KAAK,cAAc,MAAM,SAAS,WAAWC,CAAC,6BAA6BA,CAAC,UAAU,KAAK,gBAAgB,MAAM,MAAM,GAAGA,CAAC,IAAI,KAAK,OAAO,MAAM,KAAK,GAAGA,CAAC,IAAI,KAAK,OAAO,MAAM,UAAU,eAAqB,KAAK,MAAMA,CAAC,IAAlB,IAAoB,KAAK,QAAQ,YAAY,CAAC,MAAM,KAAK,cAAc,KAAK,QAAQ,YAAY,KAAK,eAAeD,EAAED,CAAC,CAAC,CAAC,YAAY,EAAEE,EAAEC,EAAE,CAAC,OAAOF,EAAE,KAAK,OAAO,OAAQ,WAAW,CAAC,IAAMA,EAAE,KAAK,cAAc,iBAAiB,QAAQ,EAAE,GAAG,CAACA,EAAE,OAAO,MAAM,IAAI,MAAM,kBAAkB,EAAE,GAAeE,IAAZ,UAAc,CAAC,IAAMA,EAAE,MAAM,KAAKF,CAAC,EAAE,IAAKA,GAAGA,EAAE,UAAU,EAAEC,CAAC,CAAE,EAAE,OAAO,QAAQ,QAAQC,CAAC,CAAC,CAAC,OAAO,QAAQ,IAAI,MAAM,KAAKF,CAAC,EAAE,IAAKA,GAAG,IAAI,QAAS,CAACE,EAAEC,IAAI,CAACH,EAAE,OAAQA,GAAG,CAACA,EAAEE,EAAEF,CAAC,EAAEG,EAAE,IAAI,MAAM,wBAAwB,CAAC,CAAC,EAAG,EAAEF,CAAC,CAAC,CAAE,CAAE,CAAC,CAAC,CAAE,CAAC,CAAC,EAACM,GAAE,iBAAiB,IAAIA,GAAE,UAAU,GAAG,IAAME,GAAN,cAAgBV,EAAC,CAAC,aAAa,CAAC,MAAM,GAAG,SAAS,EAAE,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,YAAY,KAAK,GAAG,OAAQ,IAAI,CAAC,sBAAuB,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAE,CAAC,CAAE,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,YAAY,CAAC,CAAC,SAAS,CAAC,KAAK,YAAY,CAAC,CAAC,EAAOW,GAAN,cAAgBX,EAAC,CAAC,YAAYC,EAAE,IAAI,aAAa,CAAC,MAAM,EAAE,KAAK,WAAW,KAAK,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,OAAO,GAAG,KAAK,cAAc,EAAE,KAAK,UAAU,OAAO,KAAK,OAAO,KAAK,KAAK,WAAW,GAAG,KAAK,OAAO,GAAG,KAAK,YAAY,KAAK,KAAK,QAAQ,GAAG,KAAK,SAAS,GAAG,KAAK,iBAAiB,KAAK,GAAG,KAAK,oBAAoB,KAAK,GAAG,KAAK,aAAaA,EAAE,KAAK,SAAS,KAAK,aAAa,WAAW,EAAE,KAAK,SAAS,QAAQ,KAAK,aAAa,WAAW,CAAC,CAAC,MAAM,CAAC,OAAOA,EAAE,KAAK,OAAO,OAAQ,WAAW,CAAC,CAAE,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,UAAU,CAAC,IAAI,IAAIA,EAAE,CAAC,GAAG,KAAK,WAAWA,EAAE,KAAK,UAAU,OAAO,CAACA,EAAE,OAAO,KAAK,OAAO,KAAK,KAAK,KAAK,KAAK,SAAS,EAAE,MAAMA,CAAC,EAAE,KAAMD,GAAG,CAAC,GAAGA,EAAE,QAAQ,IAAI,MAAM,IAAI,MAAM,mBAAmBC,CAAC,KAAKD,EAAE,MAAM,KAAKA,EAAE,UAAU,GAAG,EAAE,OAAOA,EAAE,YAAY,CAAC,CAAE,EAAE,KAAMA,GAAG,KAAK,aAAaC,EAAE,KAAK,KAAK,aAAa,gBAAgBD,CAAC,CAAE,EAAE,KAAMA,GAAG,CAAC,KAAK,aAAaC,IAAI,KAAK,OAAOD,EAAE,KAAK,KAAK,gBAAgB,EAAE,KAAK,KAAK,SAAS,EAAE,KAAK,UAAU,KAAK,KAAK,EAAE,CAAE,CAAC,CAAC,OAAO,CAAC,IAAIC,EAAE,GAAG,CAAC,KAAK,OAAO,OAAO,KAAK,OAAO,IAAWA,EAAE,KAAK,cAAf,MAAqCA,IAAT,QAAYA,EAAE,WAAW,EAAE,KAAK,WAAW,KAAK,aAAa,mBAAmB,EAAE,KAAK,SAAS,KAAK,WAAW,OAAO,KAAK,QAAQ,KAAK,WAAW,aAAa,MAAM,KAAK,cAAc,KAAK,WAAW,QAAQ,KAAK,QAAQ,EAAE,IAAID,EAAE,KAAK,eAAe,KAAK,eAAeA,GAAG,KAAK,UAAUA,EAAE,KAAKA,EAAE,EAAE,KAAK,eAAe,GAAG,KAAK,WAAW,MAAM,KAAK,aAAa,YAAYA,CAAC,EAAE,KAAK,cAAc,KAAK,aAAa,YAAY,KAAK,WAAW,QAAQ,IAAI,CAAC,KAAK,aAAa,KAAK,WAAW,KAAK,MAAM,EAAE,KAAK,KAAK,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAIC,EAAE,KAAK,OAAO,IAAWA,EAAE,KAAK,cAAf,MAAqCA,IAAT,QAAYA,EAAE,KAAK,EAAE,KAAK,gBAAgB,KAAK,aAAa,YAAY,KAAK,aAAa,CAAC,MAAM,CAAC,OAAOA,EAAE,KAAK,OAAO,OAAQ,WAAW,CAAC,KAAK,SAAS,KAAK,MAAM,EAAE,KAAK,KAAK,MAAM,EAAE,CAAE,CAAC,CAAC,OAAO,CAAC,KAAK,SAAS,KAAK,OAAO,EAAE,KAAK,KAAK,OAAO,EAAE,CAAC,OAAOA,EAAE,CAAC,IAAMD,EAAEC,EAAE,KAAK,YAAYC,EAAE,KAAK,WAAoBA,GAAE,KAAK,KAAK,aAAa,YAAYF,CAAC,EAAWE,GAAE,iBAAiB,QAAS,IAAI,CAACA,IAAI,KAAK,aAAa,KAAK,WAAW,KAAK,KAAK,MAAM,EAAE,EAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,OAAOD,EAAE,KAAK,OAAO,OAAQ,WAAW,CAAC,OAAO,KAAK,aAAa,UAAU,CAAC,CAAC,CAAE,CAAC,CAAC,IAAI,cAAc,CAAC,OAAO,KAAK,aAAa,CAAC,IAAI,aAAaA,EAAE,CAAC,KAAK,cAAcA,EAAE,KAAK,aAAa,KAAK,WAAW,aAAa,MAAMA,EAAE,CAAC,IAAI,aAAa,CAAC,OAAO,KAAK,OAAO,KAAK,eAAe,KAAK,gBAAgB,KAAK,aAAa,YAAY,KAAK,gBAAgB,KAAK,aAAa,CAAC,IAAI,YAAYA,EAAE,CAAC,IAAMD,EAAE,CAAC,KAAK,OAAOA,GAAG,KAAK,OAAO,EAAE,KAAK,eAAeC,EAAE,KAAK,cAAcD,GAAG,KAAK,MAAM,EAAE,KAAK,KAAK,SAAS,EAAE,KAAK,KAAK,YAAY,CAAC,CAAC,IAAI,UAAU,CAAC,IAAIC,EAAED,EAAE,OAAeC,EAAE,KAAK,aAAf,MAAoCA,IAAT,OAAWA,IAAWD,EAAE,KAAK,UAAf,MAAiCA,IAAT,OAAW,OAAOA,EAAE,WAAW,CAAC,CAAC,IAAI,SAASC,EAAE,CAAC,KAAK,UAAUA,CAAC,CAAC,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,KAAK,KAAK,CAAC,IAAI,OAAOA,EAAE,CAAC,KAAK,SAAS,KAAK,MAAMA,EAAE,KAAK,KAAK,cAAc,CAAC,CAAC,IAAI,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC,IAAI,MAAMA,EAAE,CAAC,KAAK,SAASA,IAAI,KAAK,OAAOA,EAAE,KAAK,OAAO,KAAK,SAAS,WAAW,EAAE,KAAK,SAAS,QAAQ,KAAK,aAAa,WAAW,EAAE,CAAC,YAAYA,EAAE,CAAC,MAAM,mBAAmB,KAAKA,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,KAAK,QAAQ,CAAC,gBAAgB,CAAC,IAAMA,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,OAAO,OAAOA,EAAE,IAAMD,EAAE,KAAK,OAAO,iBAAiB,QAAQE,EAAE,EAAEA,EAAEF,EAAEE,IAAID,EAAE,KAAK,KAAK,OAAO,eAAeC,CAAC,CAAC,EAAE,OAAOD,CAAC,CAAC,EAAOW,GAAE,CAAC,UAAU,OAAO,cAAc,OAAO,YAAY,EAAE,YAAY,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,EAAQC,GAAN,MAAMO,UAAUb,EAAC,CAAC,OAAO,OAAON,EAAE,CAAC,OAAO,IAAImB,EAAEnB,CAAC,CAAC,CAAC,YAAYA,EAAE,CAAC,IAAMD,EAAEC,EAAE,QAAqBA,EAAE,UAAf,WAAuB,IAAIU,GAAE,QAAQ,MAAM,CAAC,MAAMX,EAAE,cAAcC,EAAE,cAAc,SAASA,EAAE,SAAS,aAAaA,EAAE,SAAS,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,KAAK,YAAY,KAAK,KAAK,eAAe,KAAK,KAAK,cAAc,CAAC,EAAE,KAAK,mBAAmB,CAAC,EAAE,KAAK,gBAAgB,KAAK,KAAK,QAAQ,OAAO,OAAO,CAAC,EAAEW,GAAEX,CAAC,EAAE,KAAK,MAAM,IAAIS,GAAE,IAAMR,EAAEF,EAAE,OAAO,KAAK,gBAAgB,EAAE,KAAK,SAAS,IAAIQ,GAAE,KAAK,QAAQN,CAAC,EAAE,KAAK,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,KAAK,YAAY,EAAE,IAAM,EAAE,KAAK,QAAQ,KAAK,KAAK,OAAO,GAAG,GAAG,QAAQ,QAAQ,EAAE,KAAM,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,GAAK,CAAC,MAAMD,EAAE,SAASD,CAAC,EAAE,KAAK,SAAS,GAAGC,GAAGD,IAAI,KAAK,KAAK,EAAEC,EAAED,CAAC,EAAE,MAAO,IAAI,IAAK,CAAC,CAAE,CAAC,CAAC,eAAeC,EAAE,KAAK,eAAe,EAAE,CAAC,OAAO,KAAK,SAAS,eAAeA,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,CAAC,EAAEA,CAAC,CAAC,iBAAiB,CAAC,KAAK,cAAc,KAAK,KAAK,MAAM,GAAG,OAAQ,IAAI,CAAC,GAAG,CAAC,KAAK,UAAU,EAAE,CAAC,IAAMA,EAAE,KAAK,eAAe,EAAE,KAAK,KAAK,aAAaA,CAAC,EAAE,KAAK,KAAK,eAAeA,CAAC,EAAQ,KAAK,gBAAX,MAA2B,KAAK,UAAU,GAAGA,GAAG,KAAK,gBAAgB,KAAK,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,UAAU,IAAI,KAAK,KAAK,MAAM,EAAE,KAAK,MAAM,MAAM,GAAG,KAAK,mBAAmB,KAAK,KAAK,aAAa,aAAc,IAAI,CAAC,IAAMA,EAAE,KAAK,eAAe,EAAE,KAAK,KAAK,aAAaA,CAAC,CAAC,CAAE,EAAE,KAAK,aAAa,OAAQ,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,KAAK,MAAM,MAAM,CAAC,CAAE,EAAE,KAAK,aAAa,QAAS,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,KAAK,MAAM,KAAK,EAAE,KAAK,eAAe,IAAI,CAAE,EAAE,KAAK,aAAa,UAAW,IAAI,CAAC,KAAK,MAAM,KAAK,EAAE,KAAK,eAAe,IAAI,CAAE,EAAE,KAAK,aAAa,QAAS,IAAI,CAAC,KAAK,KAAK,aAAa,KAAK,YAAY,CAAC,EAAE,KAAK,KAAK,QAAQ,EAAE,KAAK,eAAe,IAAI,CAAE,EAAE,KAAK,aAAa,UAAW,IAAI,CAAC,KAAK,KAAK,UAAU,KAAK,eAAe,CAAC,CAAC,CAAE,EAAE,KAAK,aAAa,QAAS,IAAI,CAAC,IAAIA,EAAE,KAAK,KAAK,SAAgBA,EAAE,KAAK,gBAAgB,EAAE,SAAjC,MAAkDA,IAAT,OAAWA,EAAE,IAAI,MAAM,aAAa,CAAC,EAAE,KAAK,eAAe,IAAI,CAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,cAAc,KAAK,KAAK,SAAS,GAAG,QAAS,CAACA,EAAED,IAAI,CAAC,KAAK,QAAQ,WAAW,KAAK,OAAOC,CAAC,EAAE,KAAK,KAAK,cAAcA,EAAE,KAAK,YAAY,CAAC,EAAE,KAAK,KAAK,QAAQA,EAAED,CAAC,EAAE,CAAE,EAAE,KAAK,SAAS,GAAG,WAAY,CAACC,EAAED,IAAI,CAAC,KAAK,KAAK,WAAWC,EAAED,CAAC,CAAC,CAAE,EAAE,KAAK,SAAS,GAAG,SAAU,CAACC,EAAED,EAAEE,EAAE,IAAI,CAAC,IAAME,EAAE,KAAK,YAAY,EAAE,KAAK,KAAK,SAASH,EAAEG,EAAEJ,EAAEI,EAAEF,EAAE,CAAC,CAAC,CAAE,EAAE,KAAK,SAAS,GAAG,SAAU,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAE,EAAE,KAAK,SAAS,GAAG,WAAY,IAAI,CAAC,KAAK,KAAK,gBAAgB,CAAC,CAAE,EAAE,KAAK,SAAS,GAAG,YAAaD,GAAG,CAAC,KAAK,KAAK,YAAYA,CAAC,CAAC,CAAE,EAAE,KAAK,SAAS,GAAG,UAAWA,GAAG,CAAC,KAAK,KAAK,UAAUA,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,IAAIA,EAAE,KAAK,cAAc,KAAK,KAAK,SAAS,GAAG,OAAQD,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ,SAAS,OAAO,IAAIE,EAAE,KAAK,SAAS,eAAeF,CAAC,EAAE,aAAaC,CAAC,EAAE,KAAK,UAAU,EAAEC,EAAE,EAAO,KAAK,QAAQ,aAAlB,GAA6BA,EAAE,IAAc,OAAO,KAAK,QAAQ,YAA9B,UAAmD,KAAK,QAAQ,aAAtB,SAAmCA,EAAE,KAAK,QAAQ,WAAW,cAAcD,EAAE,WAAY,IAAI,CAAC,KAAK,OAAOD,CAAC,CAAC,EAAGE,CAAC,EAAE,KAAK,KAAK,cAAcF,EAAE,KAAK,YAAY,CAAC,EAAE,KAAK,KAAK,OAAOA,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAIC,EAAG,GAAQA,EAAE,KAAK,QAAQ,WAAvB,MAA0CA,IAAT,SAAkBA,EAAE,QAAS,KAAK,QAAQ,QAAQ,QAAS,GAAG,CAAC,KAAK,eAAe,CAAC,CAAC,CAAE,CAAC,CAAC,yBAAyB,CAAC,KAAK,mBAAmB,QAASA,GAAGA,EAAE,CAAE,EAAE,KAAK,mBAAmB,CAAC,CAAC,CAAC,WAAWA,EAAE,CAAC,KAAK,QAAQ,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQA,CAAC,EAAEA,EAAE,UAAU,CAACA,EAAE,QAAQ,KAAK,YAAYC,GAAE,aAAa,KAAK,YAAY,EAAED,EAAE,QAAQ,GAAGA,EAAE,OAAOA,EAAE,WAAW,KAAK,YAAYC,GAAE,aAAaD,EAAE,MAAMA,EAAE,QAAQ,GAAG,KAAK,SAAS,WAAW,KAAK,OAAO,EAAEA,EAAE,WAAW,KAAK,gBAAgBA,EAAE,SAAS,EAAQA,EAAE,eAAR,OAAwB,KAAK,gBAAgB,EAAE,SAASA,EAAE,cAAc,CAAC,eAAeA,EAAE,CAAC,GAAG,KAAK,QAAQ,SAASA,CAAC,EAAE,OAAOA,EAAEA,EAAE,MAAM,IAAI,EAAE,KAAK,QAAQ,KAAKA,CAAC,EAAE,IAAMD,EAAEC,EAAE,KAAK,UAAW,IAAI,CAAC,KAAK,QAAQ,KAAK,QAAQ,OAAQD,GAAGA,IAAIC,CAAE,EAAE,KAAK,cAAc,KAAK,cAAc,OAAQA,GAAGA,IAAID,CAAE,CAAC,CAAE,EAAE,OAAO,KAAK,cAAc,KAAKA,CAAC,EAAEC,CAAC,CAAC,iBAAiBA,EAAE,CAAC,KAAK,QAAQ,KAAK,QAAQ,OAAQD,GAAGA,IAAIC,CAAE,EAAEA,EAAE,QAAQ,CAAC,CAAC,YAAY,CAAC,OAAO,KAAK,SAAS,WAAW,CAAC,CAAC,UAAU,CAAC,OAAO,KAAK,SAAS,SAAS,CAAC,CAAC,WAAW,CAAC,OAAO,KAAK,SAAS,UAAU,CAAC,CAAC,UAAUA,EAAE,CAAC,OAAO,KAAK,SAAS,UAAUA,CAAC,CAAC,CAAC,cAAcA,EAAE,CAAC,IAAMD,EAAEC,EAAE,KAAK,YAAY,EAAE,KAAK,SAAS,oBAAoBD,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,KAAK,OAAO,CAAC,UAAU,EAAEG,EAAEC,EAAEC,EAAE,CAAC,OAAOJ,EAAE,KAAK,OAAO,OAAQ,WAAW,CAAC,IAAIA,EAAE,GAAG,KAAK,KAAK,OAAO,CAAC,EAAE,CAAC,KAAK,QAAQ,OAAO,KAAK,UAAU,GAAG,KAAK,MAAM,EAAE,KAAK,YAAY,KAAK,KAAK,eAAe,KAAK,CAACE,GAAG,CAACC,EAAE,CAAC,IAAMF,EAAE,KAAK,QAAQ,aAAa,CAAC,EAAE,OAAO,iBAAiB,CAACA,EAAE,SAAS,KAAK,gBAAgB,IAAI,gBAAgBA,EAAE,QAAeD,EAAE,KAAK,mBAAf,MAA0CA,IAAT,OAAW,OAAOA,EAAE,QAAQ,IAAMG,EAAEH,GAAG,KAAK,KAAK,UAAUA,CAAC,EAAEE,EAAE,MAAMG,GAAE,UAAU,EAAEF,EAAEF,CAAC,EAAE,IAAMG,EAAE,KAAK,QAAQ,aAAaA,IAAIF,EAAE,IAAI,KAAK,CAACA,CAAC,EAAE,CAAC,KAAKE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,EAAEF,CAAC,EAAE,IAAM,EAAE,MAAM,IAAI,QAASF,GAAG,CAAC,IAAMD,EAAEK,GAAG,KAAK,YAAY,EAAEL,EAAEC,EAAED,CAAC,EAAE,KAAK,mBAAmB,KAAK,KAAK,aAAa,iBAAkB,IAAIC,EAAE,KAAK,YAAY,CAAC,EAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,GAAG,CAAC,GAAG,CAACE,EAAE,CAAC,IAAMF,EAAE,KAAK,gBAAgB,EAAEA,aAAaU,KAAIV,EAAE,SAAS,EAAE,CAAC,GAAGG,EAAE,KAAK,YAAYF,GAAE,aAAaE,EAAE,GAAG,CAAC,UAAUD,EAAE,CAAC,IAAMF,EAAE,MAAME,EAAE,YAAY,EAAE,KAAK,YAAY,MAAMD,GAAE,OAAOD,EAAE,KAAK,QAAQ,UAAU,CAAC,CAAC,KAAK,cAAc,KAAK,KAAK,SAAS,KAAK,YAAY,CAAC,EAAE,KAAK,SAAS,OAAO,KAAK,WAAW,GAAG,KAAK,KAAK,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC,KAAK,EAAEC,EAAEC,EAAE,CAAC,OAAOF,EAAE,KAAK,OAAO,OAAQ,WAAW,CAAC,GAAG,CAAC,OAAO,MAAM,KAAK,UAAU,EAAE,OAAOC,EAAEC,CAAC,CAAC,OAAOF,EAAE,CAAC,MAAM,KAAK,KAAK,QAAQA,CAAC,EAAEA,CAAC,CAAC,CAAE,CAAC,CAAC,SAAS,EAAEC,EAAEC,EAAE,CAAC,OAAOF,EAAE,KAAK,OAAO,OAAQ,WAAW,CAAC,GAAG,CAAC,OAAO,MAAM,KAAK,UAAU,GAAG,EAAEC,EAAEC,CAAC,CAAC,OAAOF,EAAE,CAAC,MAAM,KAAK,KAAK,QAAQA,CAAC,EAAEA,CAAC,CAAC,CAAE,CAAC,CAAC,KAAKA,EAAE,CAAC,GAAG,CAAC,KAAK,YAAY,MAAM,IAAI,MAAM,iBAAiB,EAAE,KAAK,SAAS,KAAKA,CAAC,EAAE,KAAK,KAAK,OAAOA,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,KAAK,WAAW,CAAC,YAAY,CAAC,SAASA,EAAE,EAAE,UAAUD,EAAE,IAAI,UAAUE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,YAAY,MAAM,IAAI,MAAM,oCAAoC,EAAE,IAAM,EAAE,KAAK,IAAID,EAAE,KAAK,YAAY,gBAAgB,EAAEG,EAAE,CAAC,EAAE,QAAQH,EAAE,EAAEA,EAAE,EAAEA,IAAI,CAAC,IAAME,EAAE,KAAK,YAAY,eAAeF,CAAC,EAAEI,EAAE,CAAC,EAAEC,EAAEH,EAAE,OAAOH,EAAE,QAAQC,EAAE,EAAEA,EAAED,EAAEC,IAAI,CAAC,IAAMD,EAAEG,EAAE,MAAM,KAAK,MAAMF,EAAEK,CAAC,EAAE,KAAK,MAAML,EAAE,GAAGK,CAAC,CAAC,EAAMF,EAAE,EAAE,QAAQH,EAAE,EAAEA,EAAED,EAAE,OAAOC,IAAI,CAAC,IAAMC,EAAEF,EAAEC,CAAC,EAAE,KAAK,IAAIC,CAAC,EAAE,KAAK,IAAIE,CAAC,IAAIA,EAAEF,EAAE,CAACG,EAAE,KAAK,KAAK,MAAMD,EAAEF,CAAC,EAAEA,CAAC,CAAC,CAACE,EAAE,KAAKC,CAAC,CAAC,CAAC,OAAOD,CAAC,CAAC,aAAa,CAAC,IAAIH,EAAE,MAAM,YAAY,GAAG,EAAE,OAAWA,IAAJ,GAAOA,IAAI,KAAK,CAAC,KAAK,cAAcA,EAAE,KAAK,YAAY,UAAUA,CAAC,CAAC,kBAAkBA,EAAE,CAAC,KAAK,QAAQ,SAASA,CAAC,CAAC,QAAQA,EAAE,CAAC,KAAK,eAAe,KAAK,MAAM,QAAQA,CAAC,EAAE,KAAK,eAAeA,CAAC,EAAE,KAAK,KAAK,aAAaA,CAAC,CAAC,CAAC,OAAOA,EAAE,CAAC,IAAMD,EAAE,KAAK,YAAY,EAAEC,EAAE,KAAK,QAAQD,CAAC,CAAC,CAAC,KAAK,EAAEE,EAAE,CAAC,IAAMC,EAAE,OAAO,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,MAAM,IAAI,CAAC,CAAC,EAAE,OAAOF,EAAE,KAAK,OAAO,OAAQ,WAAW,CAAO,GAAN,MAAS,KAAK,QAAQ,CAAC,EAAE,IAAMA,EAAE,MAAME,EAAE,KAAK,KAAK,IAAI,EAAE,OAAaD,GAAN,OAAU,KAAK,iBAAiBS,GAAE,KAAK,MAAM,OAAOT,CAAC,EAAE,KAAK,eAAeA,GAAGD,CAAC,CAAE,CAAC,CAAC,WAAW,CAAC,OAAOA,EAAE,KAAK,OAAO,OAAQ,WAAW,CAAC,OAAO,KAAK,UAAU,EAAE,KAAK,MAAM,EAAE,KAAK,KAAK,CAAC,CAAE,CAAC,CAAC,MAAM,CAAC,KAAK,MAAM,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAKA,EAAE,CAAC,KAAK,QAAQ,KAAK,eAAe,EAAEA,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,gBAAgBA,EAAE,CAAC,KAAK,wBAAwB,EAAE,MAAM,gBAAgBA,CAAC,EAAE,KAAK,iBAAiB,CAAC,CAAC,aAAa,CAAC,OAAOA,EAAE,KAAK,UAAU,OAAQ,UAAUA,EAAE,YAAYD,EAAE,EAAEE,EAAE,UAAU,CAAC,OAAO,KAAK,SAAS,YAAYD,EAAED,EAAEE,CAAC,CAAC,CAAE,CAAC,CAAC,SAAS,CAAC,IAAID,EAAE,KAAK,KAAK,SAAS,GAAUA,EAAE,KAAK,mBAAf,MAA0CA,IAAT,QAAYA,EAAE,MAAM,EAAE,KAAK,QAAQ,QAAS,GAAG,EAAE,QAAQ,CAAE,EAAE,KAAK,cAAc,QAAS,GAAG,EAAE,CAAE,EAAE,KAAK,wBAAwB,EAAE,KAAK,MAAM,QAAQ,EAAE,KAAK,SAAS,QAAQ,EAAE,MAAM,QAAQ,CAAC,CAAC,EAACY,GAAE,WAAW,cAAcb,EAAC,CAAC,YAAYC,EAAE,CAAC,MAAM,EAAE,KAAK,cAAc,CAAC,EAAE,KAAK,YAAY,GAAG,KAAK,QAAQA,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAMA,EAAE,CAAC,KAAK,cAAc,KAAK,cAAc,CAAC,EAAE,KAAK,YAAY,IAAI,KAAK,WAAWA,EAAE,KAAK,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS,EAAE,KAAK,cAAc,QAASA,GAAGA,EAAE,CAAE,EAAE,KAAK,cAAc,CAAC,EAAE,KAAK,YAAY,GAAG,KAAK,WAAW,MAAM,CAAC,EAAEY,GAAE,IAAIR,GCKjs6B,IAAOgB,GAAP,MAAOC,CAAQ,CACpB,WAEA,YAAYC,EAAiBC,EAAwBC,EAAgB,CACpE,KAAK,WAAaC,GAAW,OAAO,CAClC,UAAAF,EACA,UAAW,mBACX,cAAe,mBACf,SAAU,GACV,UAAW,GACX,OAAQ,EACR,MAAO,CAACD,CAAK,EACb,SAAAE,EACD,CACF,CAEA,aAAa,KAAKE,EAAuBH,EAAsB,CAC9D,IAAMI,EAAS,MAAMC,GAAQ,OACvBC,EAASF,EAAO,OAAO,CAAE,OAAAD,CAAM,CAAE,EAAE,MAAM,UAAS,EAElDJ,EAAkB,CAAA,EACpBQ,EAAmB,CAAA,EACjBC,EAAiB,KACjBP,EAAW,MAAMG,EAAO,iBAAiBD,CAAM,EAErD,OAAa,CACZ,GAAM,CAAC,KAAAM,EAAM,MAAOC,CAAS,EAAI,MAAMJ,EAAO,KAAI,EAClD,GAAIG,EAAM,MAEV,IAAME,EAASD,EAAU,eACnBE,EAAQ,IAAI,aAAaD,CAAM,EACrCD,EAAU,OAAOE,EAAO,CAAC,WAAY,CAAC,CAAC,EAEvC,QAASC,EAAI,EAAGA,EAAID,EAAM,OAAQC,IAEjC,GADAN,EAAO,KAAKK,EAAMC,CAAC,CAAC,EAChBN,EAAO,QAAUC,EAAgB,CACpC,IAAMM,EAAQP,EAAO,OAAO,EAAGC,CAAc,EACvCO,EAAM,KAAK,IAAI,GAAGD,CAAK,EACvBE,EAAM,KAAK,IAAI,GAAGF,CAAK,EAC7Bf,EAAM,KAAKgB,EAAKC,CAAG,CACpB,CAGDN,EAAU,MAAK,CAChB,CAEA,OAAO,IAAIZ,EAASC,EAAOC,EAAWC,GAAY,CAAC,CACpD,CAMA,IAAI,MAAMgB,EAAa,CACtB,KAAK,WAAW,WAAW,CAAC,MAAOA,CAAK,CAAC,CAC1C,GC1DD,eAAsBC,IAAY,CACjC,IAAMC,EAAY,SAAS,cAAc,gBAAgB,EACnDC,EAAc,SAAS,cAAc,QAAQ,EAC7CC,EAAW,MAAMC,GAAS,KAAK,sBAAuBH,CAAS,EAErEC,EAAY,iBAAiB,SAAU,IAAK,CAC3C,IAAMG,EAAQ,CAACH,EAAY,MAC3BC,EAAS,MAAQE,CAClB,CAAC,CACF,CCCM,IAAOC,GAAP,MAAOC,CAAS,CAMZ,WACA,QANTC,GACAC,GAAqC,IAAI,IACzCC,GAA0B,CAAC,EAAG,CAAC,EAE/B,YACSC,EACAC,EAAmC,CADnC,KAAA,WAAAD,EACA,KAAA,QAAAC,EAER,KAAKJ,GAAQ,IAAIK,GAAWF,EAAYC,EAAQ,iBAAiB,CAClE,CAEA,aAAa,KAAKE,EAAuBF,EAAyB,CAKjE,IAAMD,EAAa,MAJL,IAAII,GAAM,CACvB,QAASC,GACT,OAAQ,MAAMC,GAAkBH,CAAM,EACtC,EAC8B,qBAAoB,EACnD,GAAGH,EACF,OAAO,IAAIJ,EACVI,EAAY,CACX,UAAWC,EAAQ,WAAa,EAChC,kBAAmBA,EAAQ,mBAAqB,CAAC,MAAO,GAAI,OAAQ,GAAI,IAAK,MAAM,EACnF,SAAUA,EAAQ,SACnB,EACG,MAAM,IAAI,MAAM,2BAA2B,CACjD,CAOA,IAAI,UAAUM,EAAa,CACvBA,IAAU,KAAK,QAAQ,YACzB,KAAK,QAAQ,UAAYA,EACzB,KAAKC,GAAO,EAEd,CAEA,IAAI,WAAS,CACZ,OAAO,KAAK,QAAQ,SACrB,CAEAC,GAAoB,CAACC,EAAOC,CAAG,EAAY,CAC1C,IAAMC,EAAWD,EAAMD,EACvB,MAAO,CAACA,EAAQE,EAAUD,EAAMC,CAAQ,CACzC,CAEA,KAAMC,IAAc,CACnB,GAAM,CAACC,EAAYC,CAAQ,EAAI,KAAKhB,GAC9BiB,EAAmB,IAAI,IAGvBC,EAAW,MAAM,KAAK,WAAW,gBAAe,EACtD,QACKC,EAAYJ,EAChBI,GAAaH,EACbG,GAAa,KAAK,QAAQ,UAGtBA,GAAa,GAAKA,GAAaD,GAClCD,EAAiB,IAAI,CAACE,EAAU,QAAQ,CAAC,CAAC,EAG5C,IAAMC,EAAoB,CAAC,GAAGH,CAAgB,EAC5C,OAAOI,GAAK,CAAC,KAAKtB,GAAO,IAAIsB,CAAC,CAAC,EAE7BC,EAAI,EACR,cAAiBC,KAAU,KAAKzB,GAAM,qBAAqBsB,CAAiB,EAC3E,GAAGG,EAAQ,CACV,IAAMC,EAAgBJ,EAAkBE,GAAG,EAC3C,KAAKvB,GAAO,IAAIyB,EAAeD,CAAM,CACtC,CAID,QAAWE,KAAO,KAAK1B,GAAO,KAAI,EAC5BkB,EAAiB,IAAIQ,CAAG,GAC5B,KAAK1B,GAAO,OAAO0B,CAAG,EAIxB,IAAMC,EAAQ,CAAC,GAAG,KAAK3B,GAAO,QAAO,CAAE,EACrC,IAAI,CAAC,CAAC4B,EAAMJ,CAAM,KAAO,CAAC,KAAAI,EAAM,OAAAJ,CAAM,EAAE,EAC1C,KAAK,QAAQ,SAASG,CAAK,CAC5B,CASA,IAAI,MAAME,EAAuB,CAChC,IAAMC,EAAW,KAAKnB,GAAoBkB,CAAY,EAGrD,KAAK5B,GAAa,CAAC,IAAM6B,EAAS,CAAC,GACnC,KAAK7B,GAAa,CAAC,IAAM6B,EAAS,CAAC,IAIpC,KAAK7B,GAAe6B,EACpB,KAAKpB,GAAO,EACb,CAEAqB,GAAkC,KAClCC,GAAkB,GAElB,KAAMtB,IAAO,CAGZ,GAAG,KAAKqB,GAAW,CAClB,KAAKC,GAAkB,GACvB,MACD,CAEA,KAAKD,GAAY,KAAKhB,GAAc,EACpC,MAAM,KAAKgB,GACX,KAAKA,GAAY,KAEd,KAAKC,KACP,KAAKA,GAAkB,GACvB,MAAM,KAAKtB,GAAO,EAEpB,CAKA,aAAakB,EAAY,CACxB,OAAO,KAAK5B,GAAO,IAAI4B,CAAI,CAC5B,GChJD,eAAsBK,GAAcC,EAAgC,CACnE,IAAMC,EAAc,SAAS,cAAc,QAAQ,EAC7CC,EAAY,SAAS,cAAc,aAAa,EAChDC,EAAkB,SAAS,cAAc,aAAa,EACtDC,EAAkB,SAAS,cAAc,YAAY,EACrDC,EAAgB,SAAS,cAAc,iBAAiB,EACxDC,EAAY,SAAS,cAAc,YAAY,EAC/CC,EAAS,IAAK,GAAK,IACrBC,EAAY,GACVC,EAAY,MAAMC,GAAU,KAChCV,EACA,CACC,SAASW,EAAK,CAEb,IAAMC,EAASD,EAAM,KAAK,CAACE,EAAGC,IAAMD,EAAE,KAAOC,EAAE,IAAI,EAEnDR,EAAU,gBACT,GAAGM,EAAO,IAAI,CAAC,CAAE,KAAAG,EAAM,OAAAC,CAAM,IAAOC,GAAoBF,EAAMC,EAAO,MAA2B,CAAC,CAAC,CAEpG,EACA,UAAWT,EACX,kBAAmB,CAClB,MAAO,GACP,OAAQ,GACR,IAAK,QAEN,EAEHJ,EAAgB,iBAAiB,SAAU,IAAK,CAC/CK,EAAY,CAACL,EAAgB,MAC7B,GAAM,CAACe,EAAOC,CAAG,EAAI,CAAC,CAAClB,EAAY,MAAO,CAACA,EAAY,MAAMO,CAAS,EACtEC,EAAU,MAAQ,CAACS,EAAOC,CAAG,EAC7BjB,EAAU,YAAc,wBAAwBgB,CAAK,KAAKC,CAAG,GAC9D,CAAC,EACDlB,EAAY,iBAAiB,SAAU,IAAK,CAC3C,GAAM,CAACiB,EAAOC,CAAG,EAAI,CAAC,CAAClB,EAAY,MAAO,CAACA,EAAY,MAAMO,CAAS,EACtEC,EAAU,MAAQ,CAACS,EAAOC,CAAG,EAC7BjB,EAAU,YAAc,wBAAwBgB,CAAK,KAAKC,CAAG,GAC9D,CAAC,EACDf,EAAgB,iBAAiB,SAAU,IAAK,CAC/CK,EAAU,UAAY,IAAK,CAACL,EAAgB,MAAM,IAClDC,EAAc,YAAc,eAAeI,EAAU,UAAU,QAAQ,CAAC,CAAC,YAAYL,EAAgB,KAAK,qBAC3G,CAAC,EACDK,EAAU,MAAQ,CAAC,GAAI,IAAI,CAC5B,CAEA,SAASQ,GAAoBF,EAAcC,EAAyB,CACnE,IAAMI,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,MAAM,SAAW,WACzBA,EAAQ,MAAM,QAAU,eACxBA,EAAQ,MAAM,YAAc,MAC5BA,EAAQ,YAAYJ,CAAM,EAC1B,IAAMK,EAAQ,SAAS,cAAc,KAAK,EAC1C,OAAAA,EAAM,YAAc,GAAGN,EAAK,QAAQ,CAAC,CAAC,IACtCM,EAAM,MAAM,SAAW,WACvBA,EAAM,MAAM,IAAM,MAClBA,EAAM,MAAM,MAAQ,MACpBA,EAAM,MAAM,SAAW,OACvBA,EAAM,MAAM,MAAQ,QACpBA,EAAM,MAAM,WAAa,kBACzBA,EAAM,MAAM,QAAU,UACtBA,EAAM,MAAM,aAAe,MAC3BA,EAAM,MAAM,cAAgB,OAC5BD,EAAQ,YAAYC,CAAK,EAClBD,CACR,CChEM,SAAUE,GAAmBC,EAAgBC,EAAqB,CACvE,IAAMC,EAAa,CAAC,MAAO,KAAM,OAAQ,IAAI,EAEvCC,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,MAAQD,EAAW,MAC1BC,EAAO,OAASD,EAAW,OAC3B,IAAME,EAAMD,EAAO,WAAW,IAAI,EAElC,eAAeE,GAAG,CACjB,IAAMC,EAAYN,EAAO,OAAO,CAC/B,OAAAC,EACA,MAAM,QAAQM,EAAK,CAClB,IAAMC,EAAW,MAAMR,EAAO,UAAU,CACvC,CACC,KAAM,QACN,MAAAO,GAED,CACC,KAAM,OACN,QAAS,WACT,SAAU,GACV,MAAO,SAER,EACD,OAAAA,EAAM,MAAK,EACXH,GAAK,UAAUI,EAAU,EAAG,CAAC,EACtBA,CACR,EACA,EAED,MAAMR,EAAO,OAAO,CACnB,UAAAM,EACA,OAAQ,CACP,MAAO,CAAC,MAAO,OAAQ,QAAS,KAAM,EACtC,MAAO,CAAC,MAAO,MAAO,QAAS,GAAO,GAEvC,CACF,CAEA,MAAO,CAAC,OAAAH,EAAQ,IAAAE,CAAG,CACpB,CCrCA,IAAMI,GAAS,MAAMC,GAAQ,OACvBC,GAAU,SAAS,cAAc,UAAU,EAE3CC,GAAc,SAAS,cAAc,QAAQ,EAC7CC,GAAe,SAAS,cAAc,SAAS,EAErDD,IAAa,iBAAiB,QAASE,EAAc,EACrDD,IAAc,iBAAiB,QAASE,EAAe,EAEvDC,GAAY,EAIX,MAAMP,GAAO,OAAO,KAAK,MAAK,EAC1BA,GAAO,QAAQ,QAAU,EAAG,QAAQ,IAAI,qBAAgB,EACvD,QAAQ,MAAM,qCAAgC,EAIpD,eAAeM,IAAe,CAE7B,GAAM,CAACE,CAAU,EAAI,MAAM,OAAO,mBAAkB,EAC9CC,EAAYC,GAAmBV,GAAQQ,CAAU,EACvD,MAAMG,GAAcH,CAAU,EAC9BI,GAAIH,EAAWD,EAAW,IAAI,CAC/B,CAEA,eAAeH,IAAc,CAI5B,IAAMQ,EAAS,CACd,uBAID,QAAWC,KAAOD,EAAQ,CACzB,IAAMJ,EAAYC,GAAmBV,GAAQ,qBAAqB,EAClEY,GAAIH,EAAWK,CAAG,CACnB,CACD,CAEA,eAAeF,GAAIH,EAAkDM,EAAa,CAEjF,IAAMC,EAAM,SAAS,cAAc,KAAK,EACxCd,GAAQ,OAAOc,CAAG,EAGlB,IAAMC,EAAI,SAAS,cAAc,GAAG,EACpCA,EAAE,YAAcF,EAChBC,EAAI,OAAOC,CAAC,EAGZD,EAAI,OAAOP,EAAU,MAAM,EAG3B,MAAMA,EAAU,IAAG,CACpB",
6
- "names": ["JsonRpc", "getId", "request", "ExposedError", "RemoteError", "respond", "tap", "request", "action", "id", "JsonRpc", "result", "error", "ExposedError", "basicTheme", "colors", "autoTheme", "basicTheme", "codes", "colorFns", "s", "uncolor", "mix", "hex", "rgb", "bgRgb", "fn", "bigint", "r", "g", "b", "c", "code", "codes", "colorless", "codes", "key", "s", "colorFns", "colorful", "codes", "key", "code", "s", "colorFns", "isDeno", "isNode", "isColorSupported", "autoColors", "isColorSupported", "colorful", "colorless", "errorsShaper", "colors", "theme", "palette", "errstring", "error", "stack", "processErrors", "item", "processAll", "items", "combineShapers", "shapers", "context", "items", "shaper", "defaultTimestampOptions", "timestampShaper", "options", "colors", "theme", "opts", "palette", "date", "year", "month", "day", "calendar", "hour", "minute", "second", "milliseconds", "clock", "stamp", "items", "autoShaper", "combineShapers", "errorsShaper", "timestampShaper", "denoWriter", "line", "nodeWriter", "line", "consoleWriter", "line", "autoWriter", "isDeno", "denoWriter", "isNode", "nodeWriter", "consoleWriter", "voidWriter", "noneShaper", "items", "Logger", "_Logger", "autoWriter", "voidWriter", "denoWriter", "nodeWriter", "consoleWriter", "autoColors", "colorful", "colorless", "autoTheme", "basicTheme", "autoShaper", "noneShaper", "errorsShaper", "timestampShaper", "items", "writer", "colors", "theme", "shapers", "combineShapers", "Bytes", "a", "b", "i", "count", "Hex", "bytes", "byte", "string", "i", "byteCount", "Bytes", "base", "characters", "Base58", "bytes", "intVal", "Hex", "encoded", "remainder", "byte", "string", "char", "index", "hex", "leadingZeroes", "decoded", "count", "Bytes", "BaseX", "lexicon", "char", "i", "s", "bitsPerChar", "bitBuffer", "bitCount", "output", "val", "num", "base", "negative", "out", "bytes", "byte", "index", "n", "value", "count", "Bytes", "Base64", "bytes", "string", "char", "count", "Bytes", "Txt", "bytes", "string", "is", "x", "DeadlineError", "milliseconds", "message", "deadline", "fn", "resolve", "reject", "id", "defer", "resolve", "reject", "promise", "res", "rej", "entangle", "outside", "drill", "object", "path", "current", "key", "is", "Hat", "#content", "items", "index", "item", "ob", "o", "transform", "obMap", "predicate", "obFilter", "key", "value", "xub", "set", "sub", "fn", "pub", "a", "once", "promise", "resolve", "defer", "unsubscribe", "clear", "pub", "listener", "fn", "xub", "Trash", "#fns", "fns", "x", "fn", "RandomUserEmojis", "Hat", "LoggerTap", "Logger", "request", "label", "g", "error", "#emojis", "RandomUserEmojis", "#requestInfo", "meta", "o", "info", "emoji", "prep", "isRemote", "ErrorTap", "LoggerTap", "defaultTap", "ErrorTap", "endpoint", "fns", "tap", "defaultTap", "request", "path", "fn", "drill", "action", "respond", "tune", "query", "notify", "settings", "remoteProxy", "executor", "recurse", "path", "currentSettings", "_", "_this", "args", "target", "key", "value", "remote", "options", "endpoint", "tap", "defaultTap", "id", "remoteProxy", "path", "params", "settings", "notify", "transfer", "base", "request", "response", "RemoteError", "mock", "options", "remote", "endpoint", "Conduit", "pub", "origin", "a", "b", "disposers", "data", "fn", "Rig", "onMessage", "channel", "fn", "makeRemoteEndpoint", "waiter", "sendRequest", "request", "transfer", "done", "defer", "response", "interpretIncoming", "json", "requests", "responses", "item", "handleIncomingRequests", "localEndpoint", "PostableConduit", "Conduit", "#trash", "Trash", "channel", "m", "transfer", "onMessage", "e", "defaults", "ResponseWaiter", "timeout", "id", "method", "deferred", "defer", "deadline", "response", "pend", "RemoteError", "Messenger", "options", "conduit", "ResponseWaiter", "defaults", "makeRemoteEndpoint", "remote", "m", "incoming", "rig", "Rig", "getLocalEndpoint", "requests", "responses", "interpretIncoming", "response", "outgoing", "handleIncomingRequests", "HostShell", "host", "WorkShell", "work", "defaultTap", "ErrorTap", "worker", "compat", "setupWork", "options", "tap", "defaultTap", "messenger", "Messenger", "PostableConduit", "remote", "rig", "endpoint", "HostShell", "Thread", "worker", "messenger", "compat", "options", "tap", "defaultTap", "readyprom", "defer", "meta", "Messenger", "PostableConduit", "remote", "rig", "endpoint", "WorkShell", "Cluster", "compat", "options", "workerCount", "threads", "_", "index", "Thread", "#available", "#tasks", "tap", "defaultTap", "remoteEndpoint", "request", "special", "#scheduleTask", "defer", "remote", "t", "thread", "task", "#distributeTasks", "callprom", "setupComrade", "compat", "options", "Thread", "Cluster", "setupWork", "worker", "fn", "setupHost", "tap", "defaultTap", "hostShell", "HostShell", "workShell", "WorkShell", "mock", "Rig", "setupBrowserCompat", "count", "url", "name", "compat", "setupBrowserCompat", "Comrade", "setupComrade", "assert", "x", "normalizeRotation", "rotation", "mappedRotation", "last", "arr", "Bitstream", "_Bitstream", "bytes", "byteOffset", "byteIndex", "byte", "bitIndex", "bit", "n", "result", "i", "clone", "readExpGolomb", "bitstream", "leadingZeroBits", "readSignedExpGolomb", "codeNum", "toUint8Array", "source", "toDataView", "textEncoder", "invertObject", "object", "key", "value", "COLOR_PRIMARIES_MAP", "COLOR_PRIMARIES_MAP_INVERSE", "TRANSFER_CHARACTERISTICS_MAP", "TRANSFER_CHARACTERISTICS_MAP_INVERSE", "MATRIX_COEFFICIENTS_MAP", "MATRIX_COEFFICIENTS_MAP_INVERSE", "isAllowSharedBufferSource", "x", "AsyncMutex", "resolver", "nextPromise", "resolve", "currentPromiseAlias", "bytesToHexString", "bytes", "reverseBitsU32", "binarySearchExact", "arr", "key", "valueGetter", "low", "high", "ans", "mid", "midVal", "binarySearchLessOrEqual", "promiseWithResolvers", "reject", "res", "rej", "removeItem", "item", "index", "findLast", "predicate", "i", "findLastIndex", "toAsyncIterator", "source", "validateAnyIterable", "iterable", "mapAsyncGenerator", "generator", "map", "result", "error", "UNDETERMINED_LANGUAGE", "roundToPrecision", "value", "digits", "factor", "roundToMultiple", "multiple", "ilog", "x", "ret", "ISO_639_2_REGEX", "isIso639Dash2LanguageCode", "SECOND_TO_MICROSECOND_FACTOR", "mergeObjectsDeeply", "a", "b", "result", "key", "retriedFetch", "url", "requestInit", "getRetryDelay", "attempts", "error", "retryDelayInSeconds", "resolve", "CallSerializer", "fn", "customVideoDecoders", "customAudioDecoders", "PCM_AUDIO_CODECS", "NON_PCM_AUDIO_CODECS", "AUDIO_CODECS", "VP9_LEVEL_TABLE", "VP9_DEFAULT_SUFFIX", "AV1_DEFAULT_SUFFIX", "extractVideoCodecString", "trackInfo", "codec", "codecDescription", "colorSpace", "avcCodecInfo", "hevcCodecInfo", "vp9CodecInfo", "av1CodecInfo", "bytes", "bytesToHexString", "generalProfileSpace", "generalProfileIdc", "compatibilityFlags", "generalTierFlag", "generalLevelIdc", "constraintFlags", "reverseBitsU32", "view", "toDataView", "profileByte", "i", "codecString", "x", "pictureSize", "level", "last", "VP9_LEVEL_TABLE", "entry", "profile", "bitDepth", "chromaSubsampling", "colourPrimaries", "transferCharacteristics", "matrixCoefficients", "videoFullRangeFlag", "string", "VP9_DEFAULT_SUFFIX", "tier", "monochrome", "colorPrimaries", "COLOR_PRIMARIES_MAP", "TRANSFER_CHARACTERISTICS_MAP", "MATRIX_COEFFICIENTS_MAP", "AV1_DEFAULT_SUFFIX", "extractAudioCodecString", "trackInfo", "codec", "codecDescription", "aacCodecInfo", "parseAacAudioSpecificConfig", "PCM_AUDIO_CODECS", "bytes", "bitstream", "Bitstream", "objectType", "frequencyIndex", "sampleRate", "freqTable", "channelConfiguration", "numberOfChannels", "OPUS_INTERNAL_SAMPLE_RATE", "PCM_CODEC_REGEX", "parsePcmCodec", "assert", "match", "dataType", "sampleSize", "littleEndian", "silentValue", "Quality", "factor", "codec", "width", "height", "pixels", "codecEfficiencyFactors", "referencePixels", "referenceBitrate", "scaleFactor", "finalBitrate", "PCM_AUDIO_CODECS", "baseBitrate", "prev", "curr", "QUALITY_VERY_LOW", "QUALITY_LOW", "QUALITY_MEDIUM", "QUALITY_HIGH", "QUALITY_VERY_HIGH", "findNalUnitsInAnnexB", "packetData", "nalUnits", "i", "startCodePos", "startCodeLength", "j", "nalData", "removeEmulationPreventionBytes", "data", "result", "len", "extractNalUnitTypeForAvc", "data", "extractAvcDecoderConfigurationRecord", "packetData", "nalUnits", "findNalUnitsInAnnexB", "spsUnits", "unit", "ppsUnits", "spsExtUnits", "spsData", "bitstream", "Bitstream", "removeEmulationPreventionBytes", "profile_idc", "constraint_flags", "level_idc", "record", "readExpGolomb", "chroma_format_idc", "bit_depth_luma_minus8", "bit_depth_chroma_minus8", "error", "NALU_TYPE_VPS", "NALU_TYPE_SPS", "NALU_TYPE_PPS", "NALU_TYPE_SEI_PREFIX", "NALU_TYPE_SEI_SUFFIX", "extractNalUnitTypeForHevc", "data", "extractHevcDecoderConfigurationRecord", "packetData", "nalUnits", "findNalUnitsInAnnexB", "vpsUnits", "unit", "spsUnits", "ppsUnits", "seiUnits", "sps", "bitstream", "Bitstream", "removeEmulationPreventionBytes", "sps_max_sub_layers_minus1", "sps_temporal_id_nesting_flag", "general_profile_space", "general_tier_flag", "general_profile_idc", "general_profile_compatibility_flags", "general_constraint_indicator_flags", "general_level_idc", "parseProfileTierLevel", "readExpGolomb", "chroma_format_idc", "bit_depth_luma_minus8", "bit_depth_chroma_minus8", "maxNum", "i", "skipScalingListData", "num_short_term_ref_pic_sets", "skipAllStRefPicSets", "num_long_term_ref_pics_sps", "min_spatial_segmentation_idc", "parseVuiForMinSpatialSegmentationIdc", "parallelismType", "pps", "ppsBitstream", "readSignedExpGolomb", "tiles_enabled_flag", "entropy_coding_sync_enabled_flag", "arrays", "error", "maxNumSubLayersMinus1", "sub_layer_profile_present_flag", "sub_layer_level_present_flag", "sizeId", "matrixId", "coefNum", "NumDeltaPocs", "stRpsIdx", "skipStRefPicSet", "NumDeltaPocsThis", "inter_ref_pic_set_prediction_flag", "RefRpsIdx", "delta_idx_minus1", "numDelta", "j", "num_negative_pics", "num_positive_pics", "skipHrdParameters", "commonInfPresentFlag", "nal_hrd_parameters_present_flag", "vcl_hrd_parameters_present_flag", "sub_pic_hrd_params_present_flag", "fixed_pic_rate_general_flag", "fixed_pic_rate_within_cvs_flag", "low_delay_hrd_flag", "CpbCnt", "skipSubLayerHrdParameters", "extractVp9CodecInfoFromPacket", "packet", "lastByte", "bytesPerFrameSize", "indexSize", "frameSize", "offset", "i", "bitstream", "Bitstream", "profileLowBit", "profile", "bitDepth", "colorSpace", "chromaSubsampling", "videoFullRangeFlag", "subsamplingX", "subsamplingY", "widthMinusOne", "heightMinusOne", "width", "height", "pictureSize", "level", "last", "VP9_LEVEL_TABLE", "entry", "extractAv1CodecInfoFromPacket", "readLeb128", "value", "byte", "obuHeader", "obuType", "obuExtension", "obuHasSizeField", "obuSize", "obuSizeValue", "seqProfile", "stillPicture", "reducedStillPictureHeader", "seqLevel", "seqTier", "bufferDelayLengthMinus1", "decoderModelInfoPresentFlag", "operatingPointsCntMinus1", "seqLevelIdx", "seqTierTemp", "n", "highBitdepth", "monochrome", "chromaSubsamplingX", "chromaSubsamplingY", "chromaSamplePosition", "parseOpusIdentificationHeader", "bytes", "view", "toDataView", "outputChannelCount", "preSkip", "inputSampleRate", "outputGain", "channelMappingFamily", "channelMappingTable", "OPUS_FRAME_DURATION_TABLE", "parseOpusTocByte", "config", "parseModesFromVorbisSetupPacket", "setupHeader", "bufSize", "revBuffer", "gotFramingBit", "modeCount", "gotModeHeader", "lastModeCount", "tempPos", "a", "b", "c", "finalModeCount", "modeBlockflags", "buildIsobmffMimeType", "info", "string", "uniqueCodecMimeTypes", "EBMLId", "LEVEL_0_EBML_IDS", "LEVEL_1_EBML_IDS", "LEVEL_0_AND_1_EBML_IDS", "MAX_VAR_INT_SIZE", "MIN_HEADER_SIZE", "MAX_HEADER_SIZE", "EBMLReader", "reader", "length", "view", "offset", "firstByte", "width", "mask", "fullView", "fullOffset", "value", "i", "size", "id", "ids", "until", "idsSet", "elementStartPos", "elementHeader", "assertDefinedSize", "CODEC_STRING_MAP", "buildMatroskaMimeType", "info", "string", "uniqueCodecMimeTypes", "MPEG_V1_BITRATES", "MPEG_V2_BITRATES", "SAMPLING_RATES", "XING", "INFO", "computeMp3FrameSize", "layer", "bitrate", "sampleRate", "padding", "getXingOffset", "mpegVersionId", "channel", "readFrameHeader", "word", "reader", "startPos", "firstByte", "secondByte", "thirdByte", "fourthByte", "bitrateIndex", "frequencyIndex", "modeExtension", "copyright", "original", "emphasis", "kilobitRate", "frameLength", "audioSamplesInFrame", "OGGS", "OGG_CRC_POLYNOMIAL", "OGG_CRC_TABLE", "crc", "k", "computeOggPageCrc", "bytes", "view", "toDataView", "originalChecksum", "i", "byte", "extractSampleMetadata", "data", "codecInfo", "vorbisLastBlocksize", "durationInSamples", "currentBlocksize", "assert", "vorbisModeCount", "modeMask", "ilog", "modeNumber", "prevBlocksize", "blockflag", "prevMask", "flag", "parseOpusTocByte", "buildOggMimeType", "info", "string", "uniqueCodecMimeTypes", "MIN_PAGE_HEADER_SIZE", "MAX_PAGE_HEADER_SIZE", "MAX_PAGE_SIZE", "OggReader", "reader", "length", "view", "offset", "low", "str", "startPos", "OGGS", "headerType", "granulePosition", "serialNumber", "sequenceNumber", "checksum", "numberPageSegments", "lacingValues", "i", "headerSize", "dataSize", "a", "b", "totalSize", "until", "word", "firstByte", "secondByte", "thirdByte", "fourthByte", "O", "Demuxer", "input", "PLACEHOLDER_DATA", "EncodedPacket", "_EncodedPacket", "data", "type", "timestamp", "duration", "sequenceNumber", "byteLength", "SECOND_TO_MICROSECOND_FACTOR", "chunk", "options", "VideoSample", "_VideoSample", "SECOND_TO_MICROSECOND_FACTOR", "data", "init", "toUint8Array", "width", "height", "canvas", "context", "assert", "isVideoFrame", "destination", "isAllowSharedBufferSource", "imageData", "arg1", "arg2", "arg3", "arg4", "arg5", "arg6", "arg7", "arg8", "sx", "sy", "sWidth", "sHeight", "dx", "dy", "dWidth", "dHeight", "source", "centerX", "centerY", "aspectRatioChange", "videoFrame", "newRotation", "newTimestamp", "newDuration", "x", "validatePacketRetrievalOptions", "options", "validateTimestamp", "timestamp", "EncodedPacketSink", "track", "InputTrack", "packet", "EncodedPacket", "startPacket", "endPacket", "packetQueue", "queueNotEmpty", "onQueueNotEmpty", "promiseWithResolvers", "queueDequeue", "onQueueDequeue", "ended", "terminated", "outOfBandError", "timestamps", "maxQueueSize", "error", "value", "now", "DecoderWrapper", "onSample", "onError", "BaseMediaSampleSink", "startTimestamp", "endTimestamp", "sampleQueue", "firstSampleQueued", "lastSample", "decoderIsFlushed", "decoderError", "decoder", "sample", "packetSink", "keyPacket", "currentPacket", "packets", "computeMaxQueueSize", "packetResult", "validateAnyIterable", "timestampIterator", "toAsyncIterator", "timestampsOfInterest", "pushToQueue", "sampleUses", "i", "lastPacket", "lastKeyPacket", "maxSequenceNumber", "decodePackets", "assert", "nextPacket", "flushDecoder", "targetPacket", "decodedSampleQueueSize", "VideoDecoderWrapper", "codec", "decoderConfig", "rotation", "timeResolution", "CallSerializer", "sampleHandler", "last", "insertionIndex", "binarySearchLessOrEqual", "x", "MatchingCustomDecoder", "customVideoDecoders", "VideoSample", "frame", "VideoSampleSink", "videoTrack", "InputVideoTrack", "CanvasSink", "width", "height", "originalAspectRatio", "canvas", "context", "dx", "dy", "newWidth", "newHeight", "sampleWidth", "sampleHeight", "scale", "aspectRatioChange", "result", "mapAsyncGenerator", "InputTrack", "backing", "InputVideoTrack", "InputAudioTrack", "targetPacketCount", "sink", "EncodedPacketSink", "startTimestamp", "endTimestamp", "packetCount", "totalPacketBytes", "packet", "colorSpace", "decoderConfig", "codec", "assert", "customVideoDecoders", "x", "error", "customAudioDecoders", "Reader", "source", "maxStorableBytes", "start", "end", "matchingLoadingSegment", "x", "index", "binarySearchLessOrEqual", "i", "segment", "bytesPromise", "loadingSegment", "bytes", "removeItem", "otherSegment", "oldestSegment", "oldestSegmentIndex", "candidate", "assert", "startIndex", "RiffReader", "reader", "length", "view", "offset", "str", "WaveFormat", "WaveDemuxer", "Demuxer", "input", "RiffReader", "Reader", "actualFileSize", "riffType", "totalFileSize", "chunkId", "chunkSize", "startPos", "blockSize", "InputAudioTrack", "WaveAudioTrackBacking", "size", "formatTag", "numChannels", "sampleRate", "blockAlign", "bitsPerSample", "cbSize", "remainingSize", "subFormat", "assert", "PACKET_SIZE_IN_FRAMES", "demuxer", "codec", "UNDETERMINED_LANGUAGE", "packetIndex", "options", "startOffset", "sizeInBytes", "data", "PLACEHOLDER_DATA", "sizeOfOnePacket", "chunkStart", "chunkEnd", "timestamp", "duration", "EncodedPacket", "packet", "Source", "BlobSource", "Source", "blob", "start", "end", "buffer", "UrlSource", "url", "options", "range", "headers", "response", "retriedFetch", "mergeObjectsDeeply", "statusCode", "rangeResponse", "contentRange", "match", "IsobmffReader", "reader", "length", "view", "offset", "high", "low", "str", "result", "i", "nextByte", "totalSize", "name", "headerSize", "IsobmffDemuxer", "Demuxer", "input", "AsyncMutex", "IsobmffReader", "Reader", "tracks", "trackDurations", "x", "track", "codecStrings", "buildIsobmffMimeType", "sourceSize", "startPos", "boxInfo", "majorBrand", "previousSegmentDurationsInSeconds", "lastWord", "potentialMfraPos", "internalTrack", "sampleTable", "PCM_AUDIO_CODECS", "assert", "pcmInfo", "parsePcmCodec", "newSampleTimingEntries", "newSampleSizes", "i", "chunkEntry", "nextEntry", "chunkCount", "j", "startSampleIndex", "endSampleIndex", "startTimingEntryIndex", "binarySearchLessOrEqual", "startTimingEntry", "endTimingEntryIndex", "endTimingEntry", "firstSampleTimestamp", "delta", "lastSampleTimingEntry", "last", "chunkSize", "entry", "sampleIndex", "sample", "a", "b", "moofBoxInfo", "contentStart", "index", "binarySearchExact", "fragment", "trackId", "trackData", "currentFragment", "lastFragment", "nextFragmentIsFirstFragment", "otherTrackData", "offsetFragmentTrackDataByTimestamp", "totalSize", "startIndex", "boxEndPos", "version", "UNDETERMINED_LANGUAGE", "videoTrack", "InputVideoTrack", "IsobmffVideoTrackBacking", "audioTrack", "InputAudioTrack", "IsobmffAudioTrackBacking", "matrix", "rotation", "normalizeRotation", "roundToMultiple", "extractRotationFromMatrix", "relevantEntryFound", "previousSegmentDurations", "entryCount", "segmentDuration", "mediaTime", "mediaRate", "language", "isIso639Dash2LanguageCode", "handlerType", "stsdVersion", "entries", "sampleBoxInfo", "lowercaseBoxName", "channelCount", "sampleSize", "sampleRate", "flags", "bytesPerSample", "isFloat", "isBigEndian", "sFlags", "profile", "level", "thirdByte", "bitDepth", "chromaSubsampling", "videoFullRangeFlag", "colourPrimaries", "transferCharacteristics", "matrixCoefficients", "secondByte", "tier", "highBitDepth", "twelveBit", "monochrome", "chromaSubsamplingX", "chromaSubsamplingY", "chromaSamplePosition", "fullRangeFlag", "COLOR_PRIMARIES_MAP_INVERSE", "TRANSFER_CHARACTERISTICS_MAP_INVERSE", "MATRIX_COEFFICIENTS_MAP_INVERSE", "tag", "mixed", "streamDependenceFlag", "urlFlag", "ocrStreamFlag", "urlLength", "decoderConfigTag", "decoderConfigDescriptorLength", "payloadStart", "objectTypeIndication", "decoderSpecificInfoTag", "decoderSpecificInfoLength", "audioSpecificConfig", "parseAacAudioSpecificConfig", "isLittleEndian", "pcmSampleSize", "outputChannelCount", "preSkip", "inputSampleRate", "outputGain", "channelMappingFamily", "channelMappingTable", "description", "view", "BLOCK_TYPE_MASK", "LAST_METADATA_BLOCK_FLAG_MASK", "flagAndType", "metadataBlockLength", "word", "numberOfChannels", "endPos", "bytes", "currentIndex", "currentTimestamp", "sampleCount", "sampleDelta", "sampleOffset", "fieldSize", "bitstream", "Bitstream", "startChunkIndex", "samplesPerChunk", "sampleDescriptionIndex", "chunkOffset", "fragmentDuration", "defaultSampleDescriptionIndex", "defaultSampleDuration", "defaultSampleSize", "defaultSampleFlags", "lengthSizeOfTrafNum", "lengthSizeOfTrunNum", "lengthSizeOfSampleNum", "functions", "readTrafNum", "readTrunNum", "readSampleNum", "numberOfEntries", "time", "moofOffset", "trafNumber", "trunNumber", "sampleNumber", "insertionIndex", "firstSample", "lastSample", "currentFragmentState", "baseDataOffsetPresent", "sampleDescriptionIndexPresent", "defaultSampleDurationPresent", "defaultSampleSizePresent", "defaultSampleFlagsPresent", "durationIsEmpty", "defaultBaseIsMoof", "defaults", "baseMediaDecodeTime", "dataOffsetPresent", "firstSampleFlagsPresent", "sampleDurationPresent", "sampleSizePresent", "sampleFlagsPresent", "sampleCompositionTimeOffsetsPresent", "dataOffset", "firstSampleFlags", "currentOffset", "sampleDuration", "sampleFlags", "sampleCompositionTimeOffset", "isKeyFrame", "currentEntry", "currentSample", "IsobmffTrackBacking", "lastPacket", "options", "startFragment", "timestamp", "roundToPrecision", "timestampInTimescale", "getSampleIndexForTimestamp", "packet", "locationInFragment", "fragmentSample", "fragmentIndex", "keyFrameSampleIndex", "getRelevantKeyframeIndexForSample", "nextKeyFrameIndex", "keyFrameIndex", "nextKeyFrameSampleIndex", "getNextKeyframeIndexForSample", "sampleInfo", "getSampleInfo", "data", "PLACEHOLDER_DATA", "duration", "EncodedPacket", "correctSampleFound", "indexInKeyFrameFragments", "findLastIndex", "getBestMatch", "searchTimestamp", "latestTimestamp", "demuxer", "release", "metadataReader", "prevFragment", "bestFragmentIndex", "bestSampleIndex", "lookupEntryIndex", "lookupEntry", "result", "bestFragment", "newSearchTimestamp", "firstPacket", "extractVp9CodecInfoFromPacket", "extractAv1CodecInfoFromPacket", "extractVideoCodecString", "extractAudioCodecString", "timescaleUnits", "timingEntryIndex", "timingEntry", "presentationTimestamp", "offsetEntryIndex", "offsetEntry", "chunkEntryIndex", "chunkIndex", "startSampleIndexOfChunk", "presentationIndex", "m11", "m21", "scaleX", "cosTheta", "sinTheta", "METADATA_ELEMENTS", "EBMLId", "MatroskaDemuxer", "Demuxer", "input", "EBMLReader", "Reader", "tracks", "trackDurations", "x", "segment", "track", "codecStrings", "buildMatroskaMimeType", "fileSize", "MIN_HEADER_SIZE", "MAX_HEADER_SIZE", "id", "size", "startPos", "assertDefinedSize", "dataSize", "segmentDataStart", "AsyncMutex", "clusterEncountered", "elementStartPos", "dataStartPos", "metadataElementIndex", "field", "hasInfo", "hasTracks", "hasCues", "entry", "target", "seekEntry", "a", "b", "allTrackIds", "remainingTrackIds", "lastClusterPosition", "lastCuePoint", "cuePoint", "assert", "elementHeader", "LEVEL_0_AND_1_EBML_IDS", "cluster", "trackId", "trackData", "blockReferencesExist", "i", "block", "sortBlocksByReferences", "currentEntry", "currentBlock", "nextEntry", "firstBlock", "lastBlock", "last", "insertionIndex", "binarySearchLessOrEqual", "trackNumber", "reader", "totalSize", "startIndex", "lastSeekEntry", "UNDETERMINED_LANGUAGE", "slashIndex", "codecIdWithoutSuffix", "CODEC_STRING_MAP", "videoTrack", "inputTrack", "InputVideoTrack", "MatroskaVideoTrackBacking", "audioTrack", "InputAudioTrack", "MatroskaAudioTrackBacking", "type", "isIso639Dash2LanguageCode", "matrixCoefficients", "mapped", "MATRIX_COEFFICIENTS_MAP_INVERSE", "transferCharacteristics", "TRANSFER_CHARACTERISTICS_MAP_INVERSE", "primaries", "COLOR_PRIMARIES_MAP_INVERSE", "flippedRotation", "normalizeRotation", "relativeTimestamp", "isKeyFrame", "flags", "MatroskaTrackBacking", "internalTrack", "lastPacket", "options", "startCluster", "currentCluster", "binarySearchExact", "timestamp", "roundToPrecision", "timestampInTimescale", "packet", "locationInCluster", "clusterIndex", "nextKeyFrameIndex", "keyFrameIndex", "blockIndex", "data", "PLACEHOLDER_DATA", "duration", "EncodedPacket", "correctBlockFound", "index", "indexInKeyFrameClusters", "findLastIndex", "getBestMatch", "searchTimestamp", "latestTimestamp", "demuxer", "release", "metadataReader", "clusterReader", "prevCluster", "bestClusterIndex", "bestBlockIndex", "cuePointIndex", "nextClusterIsFirstCluster", "endPos", "result", "bestCluster", "newSearchTimestamp", "firstPacket", "extractVideoCodecString", "extractAvcDecoderConfigurationRecord", "extractHevcDecoderConfigurationRecord", "extractVp9CodecInfoFromPacket", "extractAv1CodecInfoFromPacket", "extractAudioCodecString", "blocks", "timestampToBlock", "processedBlocks", "processBlock", "j", "otherBlock", "Mp3Reader", "reader", "length", "view", "offset", "str", "decodeSynchsafe", "until", "assert", "word", "header", "readFrameHeader", "synchsafed", "mask", "unsynchsafed", "Mp3Demuxer", "Demuxer", "input", "Mp3Reader", "fileSize", "id3Tag", "nextTimestampInSamples", "header", "xingOffset", "getXingOffset", "word", "isXing", "XING", "INFO", "sampleDuration", "sample", "InputAudioTrack", "Mp3AudioTrackBacking", "lastSample", "last", "assert", "demuxer", "UNDETERMINED_LANGUAGE", "sampleIndex", "options", "rawSample", "data", "PLACEHOLDER_DATA", "EncodedPacket", "packet", "binarySearchExact", "x", "timestamp", "index", "binarySearchLessOrEqual", "OggDemuxer", "Demuxer", "input", "AsyncMutex", "OggReader", "Reader", "MIN_PAGE_HEADER_SIZE", "MAX_PAGE_HEADER_SIZE", "page", "bitstream", "firstPacket", "InputAudioTrack", "OggAudioTrackBacking", "nextPacketPosition", "secondPacket", "thirdPacket", "lacingValues", "addBytesToSegmentTable", "bytes", "description", "view", "toDataView", "blockSizeByte", "parseModesFromVorbisSetupPacket", "header", "parseOpusIdentificationHeader", "reader", "startPage", "startSegmentIndex", "assert", "startDataOffset", "i", "currentPage", "currentDataOffset", "currentSegmentIndex", "chunks", "outer", "pageData", "lacingValue", "nextPage", "totalPacketSize", "sum", "chunk", "packetData", "offset", "lastPacket", "codecStrings", "x", "buildOggMimeType", "tracks", "trackDurations", "demuxer", "OPUS_INTERNAL_SAMPLE_RATE", "UNDETERMINED_LANGUAGE", "granulePosition", "packet", "additional", "options", "durationInSamples", "vorbisBlockSize", "extractSampleMetadata", "encodedPacket", "EncodedPacket", "PLACEHOLDER_DATA", "exclusive", "release", "packetPosition", "timestampInSamples", "prevPacket", "prevMetadata", "timestamp", "roundToPrecision", "startPosition", "lowPage", "high", "lowPages", "low", "mid", "searchStartPos", "until", "MAX_PAGE_SIZE", "pageValid", "computeOggPageCrc", "lowerPage", "otherLowPage", "previousPages", "currentTimestampInSamples", "currentTimestampIsCorrect", "endPage", "endSegmentIndex", "pseudopacket", "endPosition", "findPreviousPacketEndPosition", "findPacketStartPosition", "lastEncodedPacket", "lastEncodedPacketMetadata", "encodedPacketMetadata", "nextPosition", "pageList", "segmentIndex", "previousPage", "findLast", "InputFormat", "IsobmffInputFormat", "input", "isobmffReader", "IsobmffReader", "IsobmffDemuxer", "Mp4InputFormat", "majorBrand", "QuickTimeInputFormat", "MatroskaInputFormat", "desiredDocType", "ebmlReader", "EBMLReader", "varIntSize", "EBMLId", "dataSize", "startPos", "id", "size", "dataStartPos", "MatroskaDemuxer", "WebMInputFormat", "Mp3InputFormat", "sourceSize", "mp3Reader", "Mp3Reader", "id3Tag", "framesStartPos", "firstHeader", "secondHeader", "Mp3Demuxer", "WaveInputFormat", "riffReader", "RiffReader", "riffType", "WaveDemuxer", "OggInputFormat", "OggReader", "OggDemuxer", "MP4", "QTFF", "MATROSKA", "WEBM", "MP3", "WAVE", "OGG", "ALL_FORMATS", "Input", "options", "x", "InputFormat", "Source", "Reader", "format", "assert", "Machina", "#handlers", "id", "handler", "event", "setupDriverHost", "machina", "Comrade", "work", "rig", "loadDecoderSource", "source", "file", "BlobSource", "UrlSource", "Driver", "options", "machina", "Machina", "thread", "Comrade", "setupDriverHost", "source", "Input", "loadDecoderSource", "ALL_FORMATS", "input", "lastFrame", "videoTransform", "chunk", "controller", "frame", "audioTransform", "tune", "readables", "config", "writable", "bridge", "composition", "transfer", "#collectTransferablesFromComposition", "transferables", "visit", "node", "child", "workerUrl", "context", "Driver", "t", "i", "s", "n", "r", "o", "h", "a", "e", "e", "t", "i", "s", "n", "r", "o", "a", "h", "_h", "l", "d", "c", "u", "p", "m", "f", "g", "v", "b", "_u", "Waveform", "_Waveform", "peaks", "container", "duration", "u", "source", "driver", "context", "reader", "buffer", "samplesPerPeak", "done", "audioData", "frames", "plane", "i", "chunk", "min", "max", "value", "waveformTest", "container", "widthSlider", "waveform", "Waveform", "width", "Filmstrip", "_Filmstrip", "#sink", "#cache", "#activeRange", "videoTrack", "options", "CanvasSink", "source", "Input", "ALL_FORMATS", "loadDecoderSource", "value", "#update", "#computeActiveRange", "start", "end", "tileSize", "#generateTiles", "rangeStart", "rangeEnd", "neededTimestamps", "duration", "timestamp", "missingTimestamps", "t", "i", "canvas", "requestedTime", "key", "tiles", "time", "visibleRange", "newRange", "#updating", "#shouldRunAgain", "filmstripTest", "fileHandle", "rangeSlider", "rangeView", "rangeSizeSlider", "frequencySlider", "frequencyView", "container", "FPS_10", "rangeSize", "filmstrip", "Filmstrip", "tiles", "sorted", "a", "b", "time", "canvas", "createLabeledCanvas", "start", "end", "wrapper", "label", "setupTranscodeTest", "driver", "source", "dimensions", "canvas", "ctx", "run", "readables", "frame", "composed", "driver", "context", "results", "fetchButton", "importButton", "startDemoFetch", "startDemoImport", "waveformTest", "fileHandle", "transcode", "setupTranscodeTest", "filmstripTest", "run", "videos", "url", "label", "div", "p"]
3
+ "sources": ["../../node_modules/@e280/renraku/s/core/taps/bind.ts", "../../node_modules/@e280/sten/s/themes/basic.ts", "../../node_modules/@e280/sten/s/themes/auto.ts", "../../node_modules/@e280/sten/s/colors/parts/codes.ts", "../../node_modules/@e280/sten/s/colors/parts/color-fns.ts", "../../node_modules/@e280/sten/s/colors/colorless.ts", "../../node_modules/@e280/sten/s/colors/colorful.ts", "../../node_modules/@e280/sten/s/utils/supports.ts", "../../node_modules/@e280/sten/s/colors/auto.ts", "../../node_modules/@e280/sten/s/shapers/errors.ts", "../../node_modules/@e280/sten/s/shapers/shaper.ts", "../../node_modules/@e280/sten/s/shapers/timestamp.ts", "../../node_modules/@e280/sten/s/shapers/auto.ts", "../../node_modules/@e280/sten/s/writers/deno.ts", "../../node_modules/@e280/sten/s/writers/node.ts", "../../node_modules/@e280/sten/s/writers/console.ts", "../../node_modules/@e280/sten/s/writers/auto.ts", "../../node_modules/@e280/sten/s/writers/void.ts", "../../node_modules/@e280/sten/s/shapers/none.ts", "../../node_modules/@e280/sten/s/logger.ts", "../../node_modules/@e280/renraku/s/core/taps/logger.ts", "../../node_modules/@e280/renraku/s/core/taps/error.ts", "../../node_modules/@e280/stz/s/data/bytes.ts", "../../node_modules/@e280/stz/s/data/hex.ts", "../../node_modules/@e280/stz/s/data/base58.ts", "../../node_modules/@e280/stz/s/data/base-x.ts", "../../node_modules/@e280/stz/s/data/base64.ts", "../../node_modules/@e280/stz/s/data/txt.ts", "../../node_modules/@e280/stz/s/is.ts", "../../node_modules/@e280/stz/s/queue/queue.ts", "../../node_modules/@e280/stz/s/coalesce.ts", "../../node_modules/@e280/stz/s/deadline.ts", "../../node_modules/@e280/stz/s/defer.ts", "../../node_modules/@e280/stz/s/drill.ts", "../../node_modules/@e280/stz/s/ob.ts", "../../node_modules/@e280/stz/s/pubsub.ts", "../../node_modules/@e280/stz/s/trash.ts", "../../node_modules/@e280/renraku/s/core/json-rpc.ts", "../../node_modules/@e280/renraku/s/core/errors.ts", "../../node_modules/@e280/renraku/s/core/execute.ts", "../../node_modules/@e280/renraku/s/core/endpoint.ts", "../../node_modules/@e280/renraku/s/core/remote-proxy.ts", "../../node_modules/@e280/renraku/s/core/remote.ts", "../../node_modules/@e280/renraku/s/core/mock.ts", "../../node_modules/@e280/renraku/s/transports/messenger/conduits/conduit.ts", "../../node_modules/@e280/renraku/s/transports/messenger/parts/helpers.ts", "../../node_modules/@e280/renraku/s/transports/messenger/conduits/postable.ts", "../../node_modules/@e280/renraku/s/transports/messenger/parts/meta.ts", "../../node_modules/@e280/renraku/s/defaults.ts", "../../node_modules/@e280/renraku/s/transports/messenger/parts/response-waiter.ts", "../../node_modules/@e280/renraku/s/transports/messenger/messenger.ts", "../../node_modules/@e280/comrade/s/parts/shells.ts", "../../node_modules/@e280/comrade/s/parts/default-tap.ts", "../../node_modules/@e280/comrade/s/parts/worker.ts", "../../node_modules/@e280/comrade/s/parts/thread.ts", "../../node_modules/@e280/comrade/s/parts/cluster.ts", "../../node_modules/@e280/comrade/s/comrade.ts", "../../node_modules/@e280/comrade/s/compat/browser.ts", "../../node_modules/@e280/comrade/s/index.browser.ts", "../../node_modules/mediabunny/dist/modules/misc.js", "../../node_modules/mediabunny/dist/modules/custom-coder.js", "../../node_modules/mediabunny/dist/modules/codec.js", "../../node_modules/mediabunny/dist/modules/codec-data.js", "../../node_modules/mediabunny/dist/modules/isobmff/isobmff-misc.js", "../../node_modules/mediabunny/dist/modules/isobmff/isobmff-reader.js", "../../node_modules/mediabunny/dist/modules/matroska/ebml.js", "../../node_modules/mediabunny/dist/modules/matroska/matroska-misc.js", "../../node_modules/mediabunny/dist/modules/mp3/mp3-misc.js", "../../node_modules/mediabunny/dist/modules/ogg/ogg-misc.js", "../../node_modules/mediabunny/dist/modules/ogg/ogg-reader.js", "../../node_modules/mediabunny/dist/modules/demuxer.js", "../../node_modules/mediabunny/dist/modules/packet.js", "../../node_modules/mediabunny/dist/modules/sample.js", "../../node_modules/mediabunny/dist/modules/media-sink.js", "../../node_modules/mediabunny/dist/modules/input-track.js", "../../node_modules/mediabunny/dist/modules/reader.js", "../../node_modules/mediabunny/dist/modules/wave/riff-reader.js", "../../node_modules/mediabunny/dist/modules/wave/wave-demuxer.js", "../../node_modules/mediabunny/dist/modules/source.js", "../../node_modules/mediabunny/dist/modules/isobmff/isobmff-demuxer.js", "../../node_modules/mediabunny/dist/modules/matroska/matroska-demuxer.js", "../../node_modules/mediabunny/dist/modules/mp3/mp3-reader.js", "../../node_modules/mediabunny/dist/modules/mp3/mp3-demuxer.js", "../../node_modules/mediabunny/dist/modules/ogg/ogg-demuxer.js", "../../node_modules/mediabunny/dist/modules/input-format.js", "../../node_modules/mediabunny/dist/modules/input.js", "../../s/driver/parts/machina.ts", "../../s/driver/fns/host.ts", "../../s/driver/utils/load-decoder-source.ts", "../../s/driver/driver.ts", "../../s/context.ts", "../../node_modules/wavesurfer.js/dist/wavesurfer.esm.js", "../../s/timeline/parts/waveform.ts", "../../s/demo/routines/waveform-test.ts", "../../s/timeline/parts/filmstrip.ts", "../../s/demo/routines/filmstrip-test.ts", "../../s/features/speech/transcribe/parts/prep-audio.ts", "../../s/features/speech/transcribe/transcriber.ts", "../../s/demo/routines/transcriber-test.ts", "../../s/demo/routines/transcode-test.ts", "../../s/demo/demo.bundle.ts"],
4
+ "sourcesContent": ["\nimport {Tap, TapContext} from \"../types.js\"\n\nexport function bindTap(tap: Tap, ctx: TapContext): Tap {\n\treturn {\n\t\terror: o => tap.error({...ctx, ...o}),\n\t\trpcRequest: o => tap.rpcRequest({...ctx, ...o}),\n\t\trpcError: o => tap.rpcError({...ctx, ...o}),\n\t}\n}\n\n", "\nimport {asTheme} from \"./theme.js\"\n\nexport const basicTheme = () => asTheme(colors => ({\n\tplain: colors.none,\n\terrMessage: colors.mix(colors.brightRed, colors.bold),\n\terrName: colors.red,\n\terrStack: colors.mix(colors.red, colors.dim),\n\ttimestamp: colors.blue,\n\ttimestampErr: colors.red,\n}))\n\n", "\nimport {basicTheme} from \"./basic.js\"\n\nexport function autoTheme() {\n\treturn basicTheme()\n}\n\n", "\nexport const codes = Object.freeze({\n\n\t// regular colors\n\tblack: \"\\u001b[30m\",\n\tred: \"\\u001b[31m\",\n\tgreen: \"\\u001b[32m\",\n\tyellow: \"\\u001b[33m\",\n\tblue: \"\\u001b[34m\",\n\tmagenta: \"\\u001b[35m\",\n\tcyan: \"\\u001b[36m\",\n\twhite: \"\\u001b[37m\",\n\n\t// bright colors\n\tbrightBlack: \"\\u001b[90m\",\n\tbrightRed: \"\\u001b[91m\",\n\tbrightGreen: \"\\u001b[92m\",\n\tbrightYellow: \"\\u001b[93m\",\n\tbrightBlue: \"\\u001b[94m\",\n\tbrightMagenta: \"\\u001b[95m\",\n\tbrightCyan: \"\\u001b[96m\",\n\tbrightWhite: \"\\u001b[97m\",\n\n\t// background colors\n\tbgBlack: \"\\u001b[40m\",\n\tbgRed: \"\\u001b[41m\",\n\tbgGreen: \"\\u001b[42m\",\n\tbgYellow: \"\\u001b[43m\",\n\tbgBlue: \"\\u001b[44m\",\n\tbgMagenta: \"\\u001b[45m\",\n\tbgCyan: \"\\u001b[46m\",\n\tbgWhite: \"\\u001b[47m\",\n\n\t// bright background colors\n\tbgBrightBlack: \"\\u001b[100m\",\n\tbgBrightRed: \"\\u001b[101m\",\n\tbgBrightGreen: \"\\u001b[102m\",\n\tbgBrightYellow: \"\\u001b[103m\",\n\tbgBrightBlue: \"\\u001b[104m\",\n\tbgBrightMagenta: \"\\u001b[105m\",\n\tbgBrightCyan: \"\\u001b[106m\",\n\tbgBrightWhite: \"\\u001b[107m\",\n\n\t// styles\n\tbold: \"\\u001b[1m\",\n\tdim: \"\\u001b[2m\",\n\titalic: \"\\u001b[3m\",\n\tunderline: \"\\u001b[4m\",\n\tinverse: \"\\u001b[7m\",\n\thidden: \"\\u001b[8m\",\n\tstrikethrough: \"\\u001b[9m\",\n\n\t// reset\n\treset: \"\\u001b[0m\",\n})\n\n", "\nimport {codes} from \"./codes.js\"\n\nexport type ColorFn = (s: string) => string\n\nexport const colorFns = () => ({\n\tnone: (s: string) => s,\n\tuncolor,\n\tmix,\n\thex,\n\trgb,\n\tbgRgb,\n})\n\nexport function uncolor(s: string) {\n\treturn s.replace(\n\t\t/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,\n\t\t\"\",\n\t)\n}\n\nexport function mix(...colorFns: ColorFn[]) {\n\treturn (s: string) => {\n\t\tfor (const fn of colorFns)\n\t\t\ts = fn(s)\n\t\treturn s\n\t}\n}\n\nexport function hex(hex: string) {\n\thex = hex.replace(/^#/, \"\")\n\tlet bigint: number\n\tlet r: number\n\tlet g: number\n\tlet b: number\n\n\tif (hex.length === 3)\n\t\tbigint = parseInt(hex.split('').map(c => c + c).join(''), 16)\n\telse if (hex.length === 6)\n\t\tbigint = parseInt(hex, 16)\n\telse\n\t\tthrow new Error('Invalid hex color')\n\n\tr = (bigint >> 16) & 255\n\tg = (bigint >> 8) & 255\n\tb = bigint & 255\n\treturn rgb(r, g, b)\n}\n\nexport function rgb(r: number, g: number, b: number) {\n\tconst code = `\\u001b[38;2;${r};${g};${b}m`\n\treturn (s: string) => `${code}${s}${codes.reset}`\n}\n\nexport function bgRgb(r: number, g: number, b: number) {\n\tconst code = `\\u001b[48;2;${r};${g};${b}m`\n\treturn (s: string) => `${code}${s}${codes.reset}`\n}\n\n", "\nimport {Colors} from \"./colorful.js\"\nimport {codes} from \"./parts/codes.js\"\nimport {colorFns} from \"./parts/color-fns.js\"\n\nexport const colorless = {\n\t...<{[key in keyof typeof codes]: (s: string) => string}>(\n\t\tObject.fromEntries(\n\t\t\tObject.entries(codes)\n\t\t\t\t.map(([key]) => [\n\t\t\t\t\tkey,\n\t\t\t\t\t(s: string) => s,\n\t\t\t\t])\n\t\t)\n\t),\n\t...colorFns(),\n} as Colors\n\n", "\nimport {codes} from \"./parts/codes.js\"\nimport {colorFns} from \"./parts/color-fns.js\"\n\nexport type Colors = typeof colorful\n\nexport const colorful = {\n\t...<{[key in keyof typeof codes]: (s: string) => string}>(\n\t\tObject.fromEntries(\n\t\t\tObject.entries(codes)\n\t\t\t\t.map(([key, code]) => [\n\t\t\t\t\tkey,\n\t\t\t\t\t(s: string) => `${code}${s}${codes.reset}`,\n\t\t\t\t])\n\t\t)\n\t),\n\t...colorFns(),\n}\n\n", "\ndeclare const Deno: any\n\nexport function isDeno() {\n\treturn typeof Deno !== \"undefined\" && typeof Deno.version !== \"undefined\"\n}\n\nexport function isNode() {\n\treturn (\n\t\ttypeof process !== \"undefined\" &&\n\t\tprocess.versions &&\n\t\tprocess.versions.node\n\t)\n}\n\nexport function isColorSupported() {\n\tif (isNode())\n\t\treturn (process.env.FORCE_COLOR) || (\n\t\t\tprocess.stdout.isTTY &&\n\t\t\tprocess.env.TERM !== \"dumb\"\n\t\t)\n\n\telse if (isDeno())\n\t\treturn (Deno.env.get(\"FORCE_COLOR\")) || (\n\t\t\tDeno.isatty(Deno.stdout.rid) &&\n\t\t\tDeno.env.get(\"TERM\") !== \"dumb\"\n\t\t)\n\n\telse\n\t\treturn false\n}\n\nexport function exit(code: number) {\n\tif (isNode())\n\t\tprocess.exit(code)\n\telse if (isDeno())\n\t\tDeno.exit(code)\n}\n\nexport function hasEnv(name: string): boolean {\n\tif (isNode())\n\t\treturn name in process.env\n\telse if (isDeno())\n\t\treturn Deno.env.get(name) !== undefined\n\treturn false\n}\n\nexport function hasArg(arg: string): boolean {\n\tif (isNode())\n\t\treturn process.argv.slice(1).includes(arg)\n\telse if (isDeno())\n\t\treturn Deno.args.includes(arg)\n\telse\n\t\treturn false\n}\n\nfunction findArgValue(name: string, args: string[]) {\n\tfor (const arg of args) {\n\t\tif (arg.includes(\"=\")) {\n\t\t\tconst [first, ...rest] = arg.split(\"=\")\n\t\t\tif (first === name)\n\t\t\t\treturn rest.join(\"=\")\n\t\t}\n\t}\n}\n\nexport function getArg(name: string) {\n\tif (isNode())\n\t\treturn findArgValue(name, process.argv.slice(1))\n\telse if (isDeno())\n\t\treturn findArgValue(name, Deno.args)\n}\n\nexport function getEnv(name: string): string | undefined {\n\tif (isNode())\n\t\treturn process.env[name]\n\telse if (isDeno())\n\t\treturn Deno.env.get(name)\n}\n\nexport async function writeStdout(line: string) {\n\tif (isNode())\n\t\tprocess.stdout.write(line + \"\\n\")\n\telse if (isDeno())\n\t\tawait Deno.stdout.write(new TextEncoder().encode(line + \"\\n\"))\n\telse\n\t\tconsole.log(line)\n}\n\nexport async function writeStderr(line: string) {\n\tif (isNode())\n\t\tprocess.stderr.write(line + \"\\n\")\n\telse if (isDeno())\n\t\tawait Deno.stderr.write(new TextEncoder().encode(line + \"\\n\"))\n\telse\n\t\tconsole.error(line)\n}\n\n", "\nimport {colorless} from \"./colorless.js\"\nimport {colorful, Colors} from \"./colorful.js\"\nimport {isColorSupported} from \"../utils/supports.js\"\n\nexport const autoColors = (): Colors => {\n\treturn isColorSupported()\n\t\t? colorful\n\t\t: colorless\n}\n\n", "\nimport {Shaper} from \"./shaper.js\"\n\nexport const errorsShaper = (): Shaper => ({colors, theme}) => {\n\tconst palette = theme(colors)\n\n\tfunction errstring(error: Error) {\n\t\tconst stack = error.stack\n\t\t\t? \"\\n\" + error.stack + \"\\n\"\n\t\t\t: \"\"\n\t\treturn [\n\t\t\tpalette.errName(error.name + \":\"),\n\t\t\tpalette.errMessage(error.message),\n\t\t].join(\" \") + palette.errStack(stack)\n\t}\n\n\tfunction processErrors(item: any) {\n\t\treturn (item && item instanceof Error)\n\t\t\t? errstring(item)\n\t\t\t: item\n\t}\n\n\tfunction processAll(item: any) {\n\t\treturn (item && item instanceof Error)\n\t\t\t? errstring(item)\n\t\t\t: palette.errMessage(item)\n\t}\n\n\treturn {\n\t\tstdout: items => items.map(processErrors),\n\t\tstderr: items => items.map(processAll),\n\t}\n}\n\n", "\nimport {Theme} from \"../themes/theme.js\"\nimport {Colors} from \"../colors/colorful.js\"\n\nexport type ShaperContext = {\n\tcolors: Colors\n\ttheme: Theme\n}\n\nexport type Shaper = (context: ShaperContext) => ShaperFns\n\nexport type ShaperFns = {\n\tstdout: (items: any[]) => any[]\n\tstderr: (items: any[]) => any[]\n}\n\nexport function asShaper(shaper: Shaper) {\n\treturn shaper\n}\n\nexport function combineShapers(...shapers: Shaper[]): Shaper {\n\treturn context => ({\n\t\tstdout: items => {\n\t\t\tfor (const shaper of shapers)\n\t\t\t\titems = shaper(context).stdout(items)\n\t\t\treturn items\n\t\t},\n\t\tstderr: items => {\n\t\t\tfor (const shaper of shapers)\n\t\t\t\titems = shaper(context).stderr(items)\n\t\t\treturn items\n\t\t},\n\t})\n}\n\n", "\nimport {Shaper} from \"./shaper.js\"\n\nexport type TimestampOptions = {\n\ticon: string | undefined\n\tnow: () => number\n}\n\nfunction defaultTimestampOptions(): TimestampOptions {\n\treturn {\n\t\ticon: \"\uD83D\uDEA8\",\n\t\tnow: () => Date.now(),\n\t}\n}\n\nexport const timestampShaper = (options?: Partial<TimestampOptions>): Shaper => ({colors, theme}) => {\n\tconst opts = {...defaultTimestampOptions(), ...options}\n\tconst palette = theme(colors)\n\n\tconst date = new Date(opts.now())\n\n\tconst year = date.getUTCFullYear().toString().padStart(4, \"0\")\n\tconst month = (date.getUTCMonth() + 1).toString().padStart(2, \"0\")\n\tconst day = date.getUTCDate().toString().padStart(2, \"0\")\n\tconst calendar = `${year}-${month}-${day}`\n\n\tconst hour = date.getUTCHours().toString().padStart(2, \"0\")\n\tconst minute = date.getUTCMinutes().toString().padStart(2, \"0\")\n\tconst second = date.getUTCSeconds().toString().padStart(2, \"0\")\n\tconst milliseconds = date.getUTCMilliseconds().toString().padStart(3, \"0\")\n\tconst clock = `${hour}:${minute}:${second}.${milliseconds}`\n\n\tconst stamp = `${calendar}::${clock}`\n\n\treturn {\n\t\tstdout: items => [\n\t\t\tpalette.timestamp(stamp),\n\t\t\t...items,\n\t\t],\n\t\tstderr: items => [\n\t\t\tpalette.timestampErr(stamp),\n\t\t\t...[opts.icon].filter(Boolean),\n\t\t\t...items,\n\t\t],\n\t}\n}\n\n", "\nimport {errorsShaper} from \"./errors.js\"\nimport {combineShapers} from \"./shaper.js\"\nimport {timestampShaper} from \"./timestamp.js\"\n\nexport function autoShaper() {\n\treturn combineShapers(\n\t\terrorsShaper(),\n\t\ttimestampShaper(),\n\t)\n}\n\n", "\nimport {Writer} from \"./writer.js\"\n\ndeclare const Deno: any\n\nexport const denoWriter = (): Writer => ({\n\tstdout: async line => {\n\t\tawait Deno.stdout.write(new TextEncoder().encode(line + \"\\n\"))\n\t},\n\tstderr: async line => {\n\t\tawait Deno.stderr.write(new TextEncoder().encode(line + \"\\n\"))\n\t},\n})\n\n", "\nimport {Writer} from \"./writer.js\"\n\nexport const nodeWriter = (): Writer => ({\n\tstdout: async(line: string) => void process.stdout.write(line + \"\\n\"),\n\tstderr: async(line: string) => void process.stderr.write(line + \"\\n\"),\n})\n\n", "\nimport {Writer} from \"./writer.js\"\n\nexport const consoleWriter = (): Writer => ({\n\tstdout: async line => console.log(line),\n\tstderr: async line => console.error(line),\n})\n\n", "\nimport {Writer} from \"./writer.js\"\nimport {denoWriter} from \"./deno.js\"\nimport {nodeWriter} from \"./node.js\"\nimport {consoleWriter} from \"./console.js\"\nimport {isDeno, isNode} from \"../utils/supports.js\"\n\nexport const autoWriter = (): Writer => {\n\tif (isDeno()) return denoWriter()\n\telse if (isNode()) return nodeWriter()\n\telse return consoleWriter()\n}\n\n", "\nimport {Writer} from \"./writer.js\"\n\nexport const voidWriter = (): Writer => ({\n\tstdout: async() => undefined,\n\tstderr: async() => undefined,\n})\n\n", "\nimport {Shaper} from \"./shaper.js\"\n\nexport function noneShaper(): Shaper {\n\treturn () => ({\n\t\tstdout: items => items,\n\t\tstderr: items => items,\n\t})\n}\n\n", "\nimport {Theme} from \"./themes/theme.js\"\nimport {Writer} from \"./writers/writer.js\"\nimport {autoTheme} from \"./themes/auto.js\"\nimport {autoColors} from \"./colors/auto.js\"\nimport {autoShaper} from \"./shapers/auto.js\"\nimport {autoWriter} from \"./writers/auto.js\"\nimport {basicTheme} from \"./themes/basic.js\"\nimport {denoWriter} from \"./writers/deno.js\"\nimport {nodeWriter} from \"./writers/node.js\"\nimport {voidWriter} from \"./writers/void.js\"\nimport {noneShaper} from \"./shapers/none.js\"\nimport {colorless} from \"./colors/colorless.js\"\nimport {errorsShaper} from \"./shapers/errors.js\"\nimport {consoleWriter} from \"./writers/console.js\"\nimport {colorful, Colors} from \"./colors/colorful.js\"\nimport {timestampShaper} from \"./shapers/timestamp.js\"\nimport {combineShapers, Shaper} from \"./shapers/shaper.js\"\n\nexport class Logger {\n\tstatic writers = {\n\t\tauto: autoWriter,\n\t\tvoid: voidWriter,\n\t\tdeno: denoWriter,\n\t\tnode: nodeWriter,\n\t\tconsole: consoleWriter,\n\t}\n\n\tstatic colors = {\n\t\tauto: autoColors,\n\t\tcolorful: () => colorful,\n\t\tcolorless: () => colorless,\n\t}\n\n\tstatic themes = {\n\t\tauto: autoTheme,\n\t\tbasic: basicTheme,\n\t}\n\n\tstatic shapers = {\n\t\tauto: autoShaper,\n\t\tnone: noneShaper,\n\t\terrors: errorsShaper,\n\t\ttimestamp: timestampShaper,\n\t}\n\n\twriter: Writer = Logger.writers.auto()\n\tcolors: Colors = Logger.colors.auto()\n\ttheme: Theme = Logger.themes.auto()\n\tshaper: Shaper = Logger.shapers.auto()\n\n\tasync log(...items: any[]) {\n\t\tawait this.writer.stdout(\n\t\t\tthis.shaper(this).stdout(items).join(\" \")\n\t\t)\n\t}\n\n\tasync error(...items: any[]) {\n\t\tawait this.writer.stderr(\n\t\t\tthis.shaper(this).stderr(items).join(\" \")\n\t\t)\n\t}\n\n\tsetWriter(writer: Writer) {\n\t\tthis.writer = writer\n\t\treturn this\n\t}\n\n\tsetColors(colors: Colors) {\n\t\tthis.colors = colors\n\t\treturn this\n\t}\n\n\tsetTheme(theme: Theme) {\n\t\tthis.theme = theme\n\t\treturn this\n\t}\n\n\tsetShaper(...shapers: Shaper[]) {\n\t\tthis.shaper = combineShapers(...shapers)\n\t\treturn this\n\t}\n}\n\n", "\nimport {Logger} from \"@e280/sten\"\nimport {Tap, HttpMeta, TapContext} from \"../types.js\"\n\nexport class LoggerTap extends Logger implements Tap {\n\tstatic dummy() {\n\t\treturn new this().setWriter(Logger.writers.void())\n\t}\n\n\trpcRequest: Tap[\"rpcRequest\"] = async({request, ...context}) => {\n\t\tconst g = this.colors.none\n\t\tthis.log(\n\t\t\t...this.#context(context),\n\t\t\tg(`${request.method}()`),\n\t\t)\n\t}\n\n\trpcError: Tap[\"rpcError\"] = async({request, error, ...context}) => {\n\t\tthis.error(\n\t\t\t...this.#context(context),\n\t\t\t`${request.method}()`,\n\t\t\terror,\n\t\t)\n\t}\n\n\t#context({meta, label, remote}: TapContext) {\n\t\tconst cRemote = this.colors.mix(this.colors.blue, this.colors.dim)\n\t\tconst cLocal = this.colors.mix(this.colors.cyan, this.colors.dim)\n\t\treturn [\n\t\t\tmeta\n\t\t\t\t? this.#meta(meta)\n\t\t\t\t: undefined,\n\t\t\tlabel\n\t\t\t\t? label\n\t\t\t\t: undefined,\n\t\t\tremote === undefined\n\t\t\t\t? undefined\n\t\t\t\t: remote\n\t\t\t\t\t? cRemote(\"<-\")\n\t\t\t\t\t: cLocal(\"->\"),\n\t\t].filter(Boolean)\n\t}\n\n\t#meta(meta: HttpMeta) {\n\t\tconst {headers} = meta.request\n\t\treturn [\n\t\t\tthis.colors.yellow(`[${meta.ip}]`),\n\t\t\tthis.colors.green(headers.origin ?headers.origin :\"(no-origin)\"),\n\t\t].join(\" \")\n\t}\n}\n\n", "\nimport {Tap} from \"../types.js\"\nimport {LoggerTap} from \"./logger.js\"\n\nexport class ErrorTap extends LoggerTap implements Tap {\n\trpcRequest: Tap[\"rpcRequest\"] = async() => {}\n}\n\n", "\nexport const Bytes = Object.freeze({\n\teq(a: Uint8Array, b: Uint8Array) {\n\t\tif (a.length !== b.length)\n\t\t\treturn false\n\t\tfor (let i = 0; i <= a.length; i++) {\n\t\t\tif (a.at(i) !== b.at(i))\n\t\t\t\treturn false\n\t\t}\n\t\treturn true\n\t},\n\n\trandom(count: number) {\n\t\treturn crypto.getRandomValues(new Uint8Array(count))\n\t},\n})\n\n", "\n/*\n\n256-bit hex ids look like this:\n\n\t8ff8dfbc7c994c5439d2dd327b9898aa6796f97fb396e262985f03f868707e32\n\t6b99284a2c4a1c5f101502bd009f9fb592ca4427e4375155e411ddd07ed9da6b\n\t2eb73fb00a2b9e38c855b5aa353b530d820a3a2dcea5013b7e4e277ddfe9d0ad\n\n*/\n\nimport {Bytes} from \"./bytes.js\"\n\nexport const Hex = Object.freeze({\n\tfromBytes(bytes: Uint8Array) {\n\t\treturn [...bytes]\n\t\t\t.map(byte => byte.toString(16).padStart(2, \"0\"))\n\t\t\t.join(\"\")\n\t},\n\n\ttoBytes(string: string) {\n\t\tif (string.length % 2 !== 0)\n\t\t\tthrow new Error(\"must have even number of hex characters\")\n\t\tconst bytes = new Uint8Array(string.length / 2)\n\t\tfor (let i = 0; i < string.length; i += 2)\n\t\t\tbytes[i / 2] = parseInt(string.slice(i, i + 2), 16)\n\t\treturn bytes\n\t},\n\n\t/** generate a random hex string. byteCount defaults to 32. */\n\trandom(byteCount = 32) {\n\t\treturn this.fromBytes(Bytes.random(byteCount))\n\t},\n\n\t/** @deprecated renamed to `fromBytes` */\n\tstring(bytes: Uint8Array) {\n\t\treturn Hex.fromBytes(bytes)\n\t},\n\n\t/** @deprecated renamed to `toBytes` */\n\tbytes(string: string) {\n\t\treturn Hex.toBytes(string)\n\t},\n})\n\n", "\n/*\n\n256-bit base58 ids look like this:\n\n\t9X1D9rdkDgRdykzmogNcxfopRc7TnbS869ow1E2ehCFS\n\tAmRKyNfq6jhhsd9qda1Y6rAVS2NLUqyTUvfcB2wUiiAC\n\t8skYcqBAXsejDcJzsZMo19PErt43DHP3bykaXBtMvdu\n\n*/\n\nimport {Hex} from \"./hex.js\"\nimport {Bytes} from \"./bytes.js\"\n\nconst base = 58\nconst characters = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\"\n\nexport const Base58 = Object.freeze({\n\tfromBytes(bytes: Uint8Array) {\n\t\tlet intVal = BigInt(\"0x\" + Hex.fromBytes(bytes))\n\t\tlet encoded = \"\"\n\n\t\twhile (intVal > 0) {\n\t\t\tconst remainder = intVal % BigInt(base)\n\t\t\tintVal = intVal / BigInt(base)\n\t\t\tencoded = characters[Number(remainder)] + encoded\n\t\t}\n\n\t\tfor (const byte of bytes) {\n\t\t\tif (byte === 0) encoded = characters[0] + encoded\n\t\t\telse break\n\t\t}\n\n\t\treturn encoded\n\t},\n\n\ttoBytes(string: string) {\n\t\tlet intVal = BigInt(0)\n\n\t\tfor (const char of string) {\n\t\t\tconst index = characters.indexOf(char)\n\t\t\tif (index === -1) throw new Error(`Invalid character '${char}' in base58 string`)\n\t\t\tintVal = intVal * BigInt(base) + BigInt(index)\n\t\t}\n\n\t\tlet hex = intVal.toString(16)\n\t\tif (hex.length % 2 !== 0) hex = \"0\" + hex\n\t\tconst bytes = Hex.toBytes(hex)\n\n\t\tlet leadingZeroes = 0\n\t\tfor (const char of string) {\n\t\t\tif (char === characters[0]) leadingZeroes++\n\t\t\telse break\n\t\t}\n\n\t\tconst decoded = new Uint8Array(leadingZeroes + bytes.length)\n\t\tdecoded.set(bytes, leadingZeroes)\n\t\treturn decoded\n\t},\n\n\trandom(count = 32) {\n\t\treturn this.fromBytes(Bytes.random(count))\n\t},\n\n\t/** @deprecated renamed to `fromBytes` */\n\tstring(bytes: Uint8Array) {\n\t\treturn Base58.fromBytes(bytes)\n\t},\n\n\t/** @deprecated renamed to `toBytes` */\n\tbytes(string: string) {\n\t\treturn Base58.toBytes(string)\n\t},\n})\n\n", "\nimport {Bytes} from \"./bytes.js\"\n\nexport type Lexicon = {\n\tcharacters: string\n\tnegativePrefix?: string\n\tpadding?: {\n\t\tcharacter: string\n\t\tsize: number\n\t}\n}\n\nexport class BaseX {\n\tstatic lexicons = Object.freeze({\n\t\tbase2: {characters: \"01\"},\n\t\thex: {characters: \"0123456789abcdef\"},\n\t\tbase36: {characters: \"0123456789abcdefghijklmnopqrstuvwxyz\"},\n\t\tbase58: {characters: \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\"},\n\t\tbase62: {characters: \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"},\n\t\tbase64url: {\n\t\t\tnegativePrefix: \"~\",\n\t\t\tcharacters: \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\",\n\t\t},\n\t\tbase64: {\n\t\t\tcharacters: \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",\n\t\t\tpadding: {character: \"=\", size: 4},\n\t\t},\n\t})\n\n\tprivate lookup: Record<string, number>\n\tprivate negativePrefix: string\n\n\tconstructor(public lexicon: Lexicon) {\n\t\tthis.lookup = Object.fromEntries(\n\t\t\t[...lexicon.characters].map((char, i) => [char, i])\n\t\t)\n\t\tthis.negativePrefix = lexicon.negativePrefix ?? \"-\"\n\t}\n\n\ttoBytes(s: string): Uint8Array {\n\t\tconst bitsPerChar = Math.log2(this.lexicon.characters.length)\n\t\tif (Number.isInteger(bitsPerChar)) {\n\t\t\t// Bitstream mode (for power-of-2 lexicons)\n\t\t\tlet bitBuffer = 0\n\t\t\tlet bitCount = 0\n\t\t\tconst output: number[] = []\n\n\t\t\tfor (const char of s) {\n\t\t\t\tif (char === this.lexicon.padding?.character) continue\n\t\t\t\tconst val = this.lookup[char]\n\t\t\t\tif (val === undefined) throw new Error(`Invalid character: ${char}`)\n\t\t\t\tbitBuffer = (bitBuffer << bitsPerChar) | val\n\t\t\t\tbitCount += bitsPerChar\n\n\t\t\t\twhile (bitCount >= 8) {\n\t\t\t\t\tbitCount -= 8\n\t\t\t\t\toutput.push((bitBuffer >> bitCount) & 0xFF)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn new Uint8Array(output)\n\t\t}\n\n\t\t// Radix mode fallback\n\t\tlet num = 0n\n\t\tconst base = BigInt(this.lexicon.characters.length)\n\t\tlet negative = false\n\t\tif (s.startsWith(this.negativePrefix)) {\n\t\t\ts = s.slice(this.negativePrefix.length)\n\t\t\tnegative = true\n\t\t}\n\t\tfor (const char of s) {\n\t\t\tconst val = this.lookup[char]\n\t\t\tif (val === undefined) throw new Error(`Invalid character: ${char}`)\n\t\t\tnum = num * base + BigInt(val)\n\t\t}\n\t\tconst out: number[] = []\n\t\twhile (num > 0n) {\n\t\t\tout.unshift(Number(num % 256n))\n\t\t\tnum = num / 256n\n\t\t}\n\t\treturn new Uint8Array(out)\n\t}\n\n\tfromBytes(bytes: Uint8Array): string {\n\t\tconst bitsPerChar = Math.log2(this.lexicon.characters.length)\n\t\tif (Number.isInteger(bitsPerChar)) {\n\t\t\t// Bitstream mode (for power-of-2 lexicons)\n\t\t\tlet bitBuffer = 0\n\t\t\tlet bitCount = 0\n\t\t\tlet out = \"\"\n\n\t\t\tfor (const byte of bytes) {\n\t\t\t\tbitBuffer = (bitBuffer << 8) | byte\n\t\t\t\tbitCount += 8\n\n\t\t\t\twhile (bitCount >= bitsPerChar) {\n\t\t\t\t\tbitCount -= bitsPerChar\n\t\t\t\t\tconst index = (bitBuffer >> bitCount) & ((1 << bitsPerChar) - 1)\n\t\t\t\t\tout += this.lexicon.characters[index]\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// \uD83E\uDE79 flush remaining bits\n\t\t\tif (bitCount > 0) {\n\t\t\t\tconst index = (bitBuffer << (bitsPerChar - bitCount)) & ((1 << bitsPerChar) - 1)\n\t\t\t\tout += this.lexicon.characters[index]\n\t\t\t}\n\n\t\t\t// Add padding if applicable\n\t\t\tif (this.lexicon.padding) {\n\t\t\t\twhile (out.length % this.lexicon.padding.size !== 0)\n\t\t\t\t\tout += this.lexicon.padding.character\n\t\t\t}\n\n\t\t\treturn out\n\t\t}\n\n\t\t// Radix mode fallback\n\t\tlet num = 0n\n\t\tfor (const byte of bytes)\n\t\t\tnum = (num << 8n) + BigInt(byte)\n\n\t\tif (num === 0n) return this.lexicon.characters[0]\n\n\t\tconst base = BigInt(this.lexicon.characters.length)\n\t\tlet out = \"\"\n\t\twhile (num > 0n) {\n\t\t\tout = this.lexicon.characters[Number(num % base)] + out\n\t\t\tnum = num / base\n\t\t}\n\t\treturn out\n\t}\n\n\ttoInteger(s: string) {\n\t\tif (!s) return 0\n\t\tlet n = 0n\n\t\tlet negative = false\n\t\tconst base = BigInt(this.lexicon.characters.length)\n\t\tif (s.startsWith(this.negativePrefix)) {\n\t\t\ts = s.slice(this.negativePrefix.length)\n\t\t\tnegative = true\n\t\t}\n\t\tfor (const char of s) {\n\t\t\tconst value = this.lookup[char]\n\t\t\tif (value === undefined) throw new Error(`Invalid character: ${char}`)\n\t\t\tn = n * base + BigInt(value)\n\t\t}\n\t\treturn Number(negative ? -n : n)\n\t}\n\n\tfromInteger(n: number) {\n\t\tn = Math.floor(n)\n\t\tconst negative = n < 0\n\t\tlet num = BigInt(negative ? -n : n)\n\t\tif (num === 0n) return this.lexicon.characters[0]\n\t\tconst base = BigInt(this.lexicon.characters.length)\n\t\tlet out = \"\"\n\t\twhile (num > 0n) {\n\t\t\tout = this.lexicon.characters[Number(num % base)] + out\n\t\t\tnum = num / base\n\t\t}\n\t\treturn negative ? `${this.negativePrefix}${out}` : out\n\t}\n\n\trandom(count = 32) {\n\t\treturn this.fromBytes(Bytes.random(count))\n\t}\n}\n\n", "\nimport {Bytes} from \"./bytes.js\"\n\nexport const Base64 = Object.freeze({\n\tfromBytes(bytes: Uint8Array) {\n\t\treturn (typeof btoa === \"function\")\n\t\t\t? btoa(String.fromCharCode(...bytes))\n\t\t\t: Buffer.from(bytes).toString(\"base64\")\n\t},\n\n\ttoBytes(string: string) {\n\t\treturn (typeof atob === \"function\")\n\t\t\t? Uint8Array.from(atob(string), char => char.charCodeAt(0))\n\t\t\t: Uint8Array.from(Buffer.from(string, \"base64\"))\n\t},\n\n\trandom(count = 32) {\n\t\treturn this.fromBytes(Bytes.random(count))\n\t},\n\n\t/** @deprecated rename to \"fromBytes\" */\n\tstring(bytes: Uint8Array) {\n\t\treturn Base64.fromBytes(bytes)\n\t},\n\n\t/** @deprecated rename to \"toBytes\" */\n\tbytes(string: string) {\n\t\treturn Base64.toBytes(string)\n\t},\n})\n\n", "\nexport const Txt = Object.freeze({\n\tfromBytes(bytes: Uint8Array) {\n\t\treturn new TextDecoder().decode(bytes)\n\t},\n\n\ttoBytes(string: string) {\n\t\treturn new TextEncoder().encode(string)\n\t},\n\n\t/** @deprecated renamed to `fromBytes` */\n\tstring(bytes: Uint8Array) {\n\t\treturn Txt.fromBytes(bytes)\n\t},\n\n\t/** @deprecated renamed to `toBytes` */\n\tbytes(string: string) {\n\t\treturn Txt.toBytes(string)\n\t},\n})\n\n", "\nexport const is = Object.freeze({\n\tset: <X>(x: X): x is NonNullable<X> =>\n\t\tx !== undefined && x !== null,\n\n\tunset: (x: any): x is (undefined | null) =>\n\t\tx === undefined || x === null,\n\n\tboolean: (x: any): x is boolean =>\n\t\ttypeof x === \"boolean\",\n\n\tnumber: (x: any): x is number =>\n\t\ttypeof x === \"number\",\n\n\tstring: (x: any): x is string =>\n\t\ttypeof x === \"string\",\n\n\tbigint: (x: any): x is bigint =>\n\t\ttypeof x === \"bigint\",\n\n\tobject: <X>(x: X): x is object & NonNullable<X> =>\n\t\ttypeof x === \"object\" && x !== null,\n\n\tarray: (x: any | any[]): x is any[] =>\n\t\tArray.isArray(x),\n\n\tfn: (x: any): x is (...a: any[]) => any =>\n\t\ttypeof x === \"function\",\n\n\tsymbol: (x: any): x is symbol =>\n\t\ttypeof x === \"symbol\",\n})\n\n", "\n/**\n * create a job queue that ensures the given fn is always called in sequence (not concurrently).\n */\nexport function queue<Args extends any[], Result>(\n\t\tfn: (...args: Args) => Promise<Result>\n\t): (...args: Args) => Promise<Result> {\n\n\tlet last: Promise<any> = Promise.resolve()\n\n\treturn (...args: Args): Promise<Result> => {\n\t\tconst job = () => fn(...args)\n\t\tconst current = last.then(job)\n\n\t\t// prevent unhandled rejection breaking the chain\n\t\tlast = current.catch(() => {})\n\n\t\treturn current\n\t}\n}\n\n", "\n/** return a single function that calls all the provided functions */\nexport function coalesce<A extends any[] = []>(...fns: ((...a: A) => void)[]) {\n\treturn (...a: A) => fns.forEach(fn => fn(...a))\n}\n\n", "\nexport class DeadlineError extends Error {\n\tname = this.constructor.name\n\tconstructor(public milliseconds: number) {\n\t\tsuper(`deadline exceeded (${(milliseconds / 1000).toFixed(1)} seconds)`)\n\t}\n}\n\n/** set a deadline for a fn to do something, will reject with a `DeadlineError` if it takes too long */\nexport function deadline<R>(milliseconds: number, fn: () => Promise<R>) {\n\tif (milliseconds <= 0 || milliseconds === Infinity)\n\t\treturn fn()\n\n\treturn new Promise<R>((resolve, reject) => {\n\t\tconst id = setTimeout(\n\t\t\t() => reject(new DeadlineError(milliseconds)),\n\t\t\tmilliseconds,\n\t\t)\n\t\tfn()\n\t\t\t.then(resolve)\n\t\t\t.catch(reject)\n\t\t\t.finally(() => clearTimeout(id))\n\t})\n}\n\n", "\n/** a promise which can be resolved from the outside */\nexport type Deferred<R = void> = {\n\tpromise: Promise<R>\n\tresolve: (result: R) => void\n\treject: (reason: any) => void\n\n\t/** ties the fate of this deferred promise to the outcome of the provided outsidePromise */\n\tentangle: (outsidePromise: Promise<R>) => Promise<R>\n}\n\n/** returns a deferred promise with exposed resolve and reject fns */\nexport function defer<R = void>(): Deferred<R> {\n\tlet resolve!: (result: R) => void\n\tlet reject!: (reason: any) => void\n\n\tconst promise = new Promise<R>((res, rej) => {\n\t\tresolve = res\n\t\treject = rej\n\t})\n\n\tfunction entangle(outside: Promise<R>) {\n\t\toutside.then(resolve).catch(reject)\n\t\treturn promise\n\t}\n\n\treturn {promise, resolve, reject, entangle}\n}\n\n", "\nimport {is} from \"./is.js\"\n\n/** return a value within an object tree, found at the given path. */\nexport function drill<xResult>(\n\t\tobject: {[key: string]: any},\n\t\tpath: string[],\n\t): xResult {\n\n\tlet current: any = object\n\n\tfor (const key of path) {\n\t\tcurrent = current[key]\n\t\tif (is.unset(current))\n\t\t\tbreak\n\t}\n\n\treturn current\n}\n\n", "\nexport function ob<Ob extends object>(o: Ob) {\n\treturn {\n\t\tmap: <Value>(transform: ObTransform<Ob, Value>) => (\n\t\t\tobMap(o, transform)\n\t\t),\n\t\tfilter: (predicate: ObPredicate<Ob>) => (\n\t\t\tobFilter(o, predicate)\n\t\t),\n\t}\n}\n\n////////////\n////////////\n\nob.pipe = Object.freeze({\n\tmap: <O extends {}, Value>(\n\t\t\ttransform: (value: O[keyof O], key: keyof O) => Value,\n\t\t) => (\n\t\t(o: O) => obMap(o, transform)\n\t),\n\tfilter: <O extends {}>(\n\t\t\ttransform: (value: O[keyof O], key: keyof O) => boolean,\n\t\t) => (\n\t\t(o: O) => obFilter(o, transform) as {[key: string]: O[keyof O]}\n\t),\n})\n\n////////////\n////////////\n\nexport type ObTransform<Ob extends object, Value> = (\n\t(value: Ob[keyof Ob], key: keyof Ob) => Value\n)\n\nexport type ObPredicate<Ob extends object> = (\n\t(value: Ob[keyof Ob], key: keyof Ob) => boolean\n)\n\n////////////\n////////////\n\nconst obMap = <Ob extends object, Value>(\n\t\to: Ob,\n\t\ttransform: ObTransform<Ob, Value>,\n\t) => {\n\n\treturn Object.fromEntries(\n\t\tObject.entries(o).map(\n\t\t\t([key, value]: any) => [key, transform(value, key)]\n\t\t)\n\t) as {[P in keyof Ob]: Value}\n}\n\nconst obFilter = <Ob extends object>(\n\t\to: Ob,\n\t\tpredicate: ObPredicate<Ob>,\n\t) => {\n\n\treturn Object.fromEntries(\n\t\tObject.entries(o).filter(\n\t\t\t([key, value]: any) => predicate(value, key)\n\t\t)\n\t) as {[P in keyof Ob]?: Ob[keyof Ob]}\n}\n\n", "\nimport {defer} from \"./defer.js\"\n\nexport type Listener<A extends any[]> = (...a: A) => (void | Promise<void>)\n\nexport interface Xub<A extends any[] = []> {\n\n\t/** publish to all subscribed listeners. */\n\tpub(...a: A): Promise<void>\n\n\t/** subscribe a listener function. */\n\tsub(fn: Listener<A>): () => void\n\n\t/**\n\t * subscribe a listener function.\n\t * @alias sub\n\t */\n\ton(fn: Listener<A>): () => void\n\n\t/** wait for the next published value */\n\tnext(): Promise<A>\n\n\t/** wipe all listeners attached to this. */\n\tclear(): void\n}\n\n/** subscriber fn that can be published to. */\nexport interface Sub<A extends any[] = []> extends Xub<A> {\n\t(fn: Listener<A>): () => void\n}\n\n/** publisher fn that can be published to. */\nexport interface Pub<A extends any[] = []> extends Xub<A> {\n\t(...a: A): Promise<void>\n}\n\nexport function xub<A extends any[] = []>() {\n\tconst set = new Set<Listener<A>>()\n\n\tfunction sub(fn: Listener<A>) {\n\t\tset.add(fn)\n\t\treturn () => { set.delete(fn) }\n\t}\n\n\tasync function pub(...a: A) {\n\t\tawait Promise.all([...set].map(fn => fn(...a)))\n\t}\n\n\tasync function next() {\n\t\tconst {promise, resolve} = defer<A>()\n\t\tconst unsubscribe = sub((...a) => {\n\t\t\tresolve(a)\n\t\t\tunsubscribe()\n\t\t})\n\t\treturn promise\n\t}\n\n\tfunction clear() {\n\t\tset.clear()\n\t}\n\n\tsub.pub = pub\n\tsub.sub = sub\n\tsub.on = sub\n\tsub.next = next\n\tsub.clear = clear\n\n\tpub.pub = pub\n\tpub.sub = sub\n\tpub.on = sub\n\tpub.next = next\n\tpub.clear = clear\n\n\treturn [pub, sub] as [Pub<A>, Sub<A>]\n}\n\n/** create a subscriber fn that can be published to */\nexport function sub<A extends any[] = []>(listener?: Listener<A>): Sub<A> {\n\tconst fn = xub<A>()[1]\n\tif (listener)\n\t\tfn.sub(listener)\n\treturn fn\n}\n\n/** create a publisher fn that can be subscribed to */\nexport function pub<A extends any[] = []>(listener?: Listener<A>): Pub<A> {\n\tconst fn = xub<A>()[0]\n\tif (listener)\n\t\tfn.sub(listener)\n\treturn fn\n}\n\n", "\n/** a trashcan where you can collect disposer fns, and dispose them all at once */\nexport class Trash {\n\t#fns: (() => void)[] = []\n\n\t/** add a disposer fn to the trashcan */\n\tadd(...fns: (() => void)[]) {\n\t\tthis.#fns.push(...fns)\n\t\treturn this\n\t}\n\n\t/** add a disposable object to the trashcan, and return the object */\n\tdisposable<X extends {dispose: () => void}>(x: X) {\n\t\treturn this.bag(x, () => x.dispose())\n\t}\n\n\t/** add an item's disposer fn, and return the item */\n\tbag<X>(x: X, fn: (x: X) => void) {\n\t\tthis.add(() => fn(x))\n\t\treturn x\n\t}\n\n\t/** dispose of everything in the trashcan */\n\tdispose() {\n\t\tfor (const fn of this.#fns.reverse())\n\t\t\tfn()\n\t\tthis.#fns = []\n\t}\n}\n\n", "\nexport namespace JsonRpc {\n\texport type Requestish = Request | Request[]\n\texport type Respondish = Response | Response[]\n\texport type Bidirectional = Requestish | Respondish\n\n\t/////////////////////////////////////////////////////////////\n\n\texport const version = \"2.0\"\n\n\texport type Request<P extends Params = any> = (\n\t\t| Query<P>\n\t\t| Notification<P>\n\t)\n\n\texport type Response<Result = any> = (\n\t\t| Success<Result>\n\t\t| Failure\n\t)\n\n\texport type Serializable = (\n\t\t| void\n\t\t| null\n\t\t| undefined\n\t\t| boolean\n\t\t| number\n\t\t| string\n\t\t| Serializable[]\n\t\t| {[key: string]: Serializable}\n\t)\n\n\t/////////////////////////////////////////////////////////////\n\n\texport type Id = number | string\n\texport type Params = Serializable[] | Record<string, Serializable>\n\n\texport type Notification<P extends Params> = {\n\t\tjsonrpc: string\n\t\tmethod: string\n\t\tparams: P\n\t}\n\n\texport type Query<P extends Params> = {\n\t\tid: Id\n\t\tjsonrpc: string\n\t\tmethod: string\n\t\tparams: P\n\t}\n\n\texport type Error = {\n\t\tcode: number\n\t\tmessage: string\n\t\tdata?: any\n\t}\n\n\texport type Success<Result> = {\n\t\tjsonrpc: \"2.0\"\n\t\tid: Id\n\t\tresult: Result\n\t}\n\n\texport type Failure = {\n\t\tjsonrpc: \"2.0\"\n\t\tid: Id\n\t\terror: Error\n\t}\n\n\t/////////////////////////////////////////////////////////////\n\n\texport function getId(request: Request): Id | null {\n\t\treturn \"id\" in request\n\t\t\t? request.id\n\t\t\t: null\n\t}\n\n\texport const errorCodes = {\n\t\tserverError: -32000,\n\t\tunexposedError: -32001,\n\t}\n}\n\n", "\n/**\n * An error that has a publicly viewable name and message.\n * - this error class, and its subclasses, are the only kinds of errors that renraku will send back to clients\n * - so if you want a client to be able to read an error message you throw, it must be a subclass of ExposedError\n */\nexport class ExposedError extends Error {\n\treadonly name = this.constructor.name\n}\n\n////////////////////////////////////////////////////\n\nexport class RemoteError extends Error {\n\treadonly name = this.constructor.name\n}\n\nexport class RemoteTimeoutError extends RemoteError {\n\treadonly name = this.constructor.name\n}\n\n////////////////////////////////////////////////////\n\nexport class HttpError extends Error {\n\treadonly name = this.constructor.name\n\treadonly code: number\n\n\tconstructor(code: number, message: string) {\n\t\tsuper(message)\n\t\tthis.code = code\n\t}\n}\n\n", "\nimport {Tap} from \"./types.js\"\nimport {JsonRpc} from \"./json-rpc.js\"\nimport {ExposedError} from \"./errors.js\"\n\nexport async function execute<R>({\n\t\ttap,\n\t\trequest,\n\t\taction,\n\t}: {\n\t\ttap: Tap\n\t\trequest: JsonRpc.Request\n\t\taction: () => Promise<R>\n\t}): Promise<JsonRpc.Response<R> | null> {\n\n\tconst id = JsonRpc.getId(request)\n\n\ttry {\n\t\tconst result = await action()\n\n\t\tif (id === null)\n\t\t\treturn null\n\n\t\treturn {\n\t\t\tid,\n\t\t\tresult,\n\t\t\tjsonrpc: JsonRpc.version,\n\t\t}\n\t}\n\n\tcatch (error) {\n\t\ttap.rpcError({request, error})\n\n\t\tif (id === null)\n\t\t\treturn null\n\n\t\treturn {\n\t\t\tid,\n\t\t\tjsonrpc: JsonRpc.version,\n\t\t\terror: (error instanceof ExposedError)\n\t\t\t\t? {\n\t\t\t\t\tcode: JsonRpc.errorCodes.serverError,\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\tcode: JsonRpc.errorCodes.unexposedError,\n\t\t\t\t\tmessage: `unexposed error`,\n\t\t\t\t},\n\t\t}\n\t}\n}\n\n", "\nimport {drill} from \"@e280/stz\"\nimport {execute} from \"./execute.js\"\nimport {ErrorTap} from \"./taps/error.js\"\nimport {Endpoint, Fn, Fns, Tap} from \"./types.js\"\n\nexport type EndpointOptions<F extends Fns> = {\n\tfns: F\n\ttap?: Tap\n}\n\n/**\n * Create a renraku endpoint for your fns.\n * - an endpoint is a function that accepts json rpc requests\n * - for each request, it calls the appropriate fn\n * - it then returns the fn's in json rpc response format\n */\nexport function makeEndpoint<F extends Fns>(options: EndpointOptions<F>): Endpoint {\n\tconst tap = options.tap ?? new ErrorTap()\n\n\treturn async request => {\n\t\tconst path = request.method.split(\".\")\n\t\tconst fn = drill(options.fns, path) as Fn\n\t\tconst action = async() => await fn(...request.params)\n\n\t\ttap.rpcRequest({request})\n\n\t\tconst response = await execute({\n\t\t\ttap,\n\t\t\trequest,\n\t\t\taction,\n\t\t})\n\n\t\treturn response\n\t}\n}\n\n", "\nimport {Fn, Fns} from \"./types.js\"\n\nexport const tune = Symbol(\"tune\")\nexport const query = Symbol(\"query\")\nexport const notify = Symbol(\"notify\")\nexport const settings = Symbol(\"settings\")\n\nexport type TuneSymbol = typeof tune\nexport type QuerySymbol = typeof query\nexport type NotifySymbol = typeof notify\nexport type SettingsSymbol = typeof settings\n\nexport type Executor = (\n\tpath: string[],\n\targs: any[],\n\tsettings: Settings,\n) => Promise<any>\n\nexport type Settings = {\n\tnotify?: boolean\n\ttransfer?: Transferable[]\n}\n\nexport type Remote<F extends Fn | Fns> = (\n\tF extends Fn\n\t\t? F & {\n\t\t\t[tune]: (settings: Settings) => F\n\t\t\t[query]: F\n\t\t\t[notify]: F\n\t\t\t[settings]: Settings\n\t\t}\n\t\t: F extends Fns\n\t\t\t? {[K in keyof F]: Remote<F[K]>}\n\t\t\t: never\n)\n\nexport function remoteProxy<F extends Fns>(executor: Executor) {\n\n\tfunction recurse(path: string[]) {\n\t\tconst currentSettings: Settings = {notify: undefined}\n\n\t\treturn new Proxy((() => {}) as any, {\n\t\t\tapply: (_, _this, args) => {\n\t\t\t\treturn executor(path, args, currentSettings)\n\t\t\t},\n\t\t\tget: (target, key: string | QuerySymbol | NotifySymbol | TuneSymbol | SettingsSymbol) => {\n\n\t\t\t\tif (key === \"then\")\n\t\t\t\t\treturn undefined\n\n\t\t\t\tif (key === tune)\n\t\t\t\t\treturn (settings: Settings) => (...args: any[]) => executor(path, args, {\n\t\t\t\t\t\t...currentSettings,\n\t\t\t\t\t\t...settings,\n\t\t\t\t\t})\n\n\t\t\t\tif (key === notify)\n\t\t\t\t\treturn (...args: any[]) => executor(path, args, {\n\t\t\t\t\t\t...currentSettings,\n\t\t\t\t\t\tnotify: true,\n\t\t\t\t\t})\n\n\t\t\t\tif (key === query)\n\t\t\t\t\treturn (...args: any[]) => executor(path, args, {\n\t\t\t\t\t\t...currentSettings,\n\t\t\t\t\t\tnotify: false,\n\t\t\t\t\t})\n\n\t\t\t\tif (key === settings)\n\t\t\t\t\treturn currentSettings\n\n\t\t\t\tif (!target[key])\n\t\t\t\t\ttarget[key] = recurse([...path, key])\n\n\t\t\t\treturn target[key]\n\t\t\t},\n\t\t\tset: (target, key: string, value: any) => {\n\t\t\t\ttarget[key] = value\n\t\t\t\treturn true\n\t\t\t},\n\t\t})\n\t}\n\n\treturn recurse([]) as Remote<F>\n}\n\n", "\nimport {JsonRpc} from \"./json-rpc.js\"\nimport {RemoteError} from \"./errors.js\"\nimport {ErrorTap} from \"./taps/error.js\"\nimport {remoteProxy} from \"./remote-proxy.js\"\nimport {Endpoint, Fns, Tap} from \"./types.js\"\n\nexport type RemoteOptions = {\n\tendpoint: Endpoint\n\tlabel?: string\n\tnotify?: boolean\n\ttap?: Tap\n}\n\n/**\n * Create a renraku remote for the given endpoint.\n * - the remote uses js proxies to mirror the shape of your fns object\n * - so when you make async calls on the remote, it will convert those into json rpc requests that are actuated on the given endpoint\n * - the endpoint you provide could be making network calls, or doing something else, the remote doesn't care how the endpoint is implemented\n */\nexport function makeRemote<F extends Fns>(options: RemoteOptions) {\n\tconst {endpoint, tap = new ErrorTap()} = options\n\tlet id = 1\n\n\treturn remoteProxy<F>(async(\n\t\t\tpath,\n\t\t\tparams,\n\t\t\tsettings,\n\t\t) => {\n\n\t\tconst notify = settings.notify ?? options.notify ?? false\n\t\tconst transfer = settings.transfer\n\n\t\tconst base: JsonRpc.Notification<any[]> = {\n\t\t\tjsonrpc: \"2.0\" as const,\n\t\t\tmethod: path.join(\".\"),\n\t\t\tparams,\n\t\t}\n\n\t\tconst request: JsonRpc.Request = (\n\t\t\tnotify\n\t\t\t\t? base\n\t\t\t\t: {...base, id: id++}\n\t\t)\n\n\t\ttap.rpcRequest({request})\n\n\t\tconst response = await endpoint(request, {transfer})\n\n\t\tif (notify && !response)\n\t\t\treturn null\n\n\t\tif (!response)\n\t\t\tthrow new RemoteError(\"response was null, but shouldn't be, because the request was not a notification\")\n\n\t\tif (\"error\" in response)\n\t\t\tthrow new RemoteError(\n\t\t\t\toptions.label\n\t\t\t\t\t? `${options.label}: ${response.error.message}`\n\t\t\t\t\t: response.error.message\n\t\t\t)\n\n\t\treturn response.result\n\t})\n}\n\n", "\nimport {Fns} from \"./types.js\"\nimport {makeRemote} from \"./remote.js\"\nimport {Remote} from \"./remote-proxy.js\"\nimport {makeEndpoint, EndpointOptions} from \"./endpoint.js\"\n\n/**\n * Wrap your fns in an endpoint and remote.\n * - this gives you a real renraku remote where you can use the `tune` symbol and such\n * - this is useful for when you have special logic that relies on that special renraku functionality\n */\nexport function makeMock<F extends Fns>(options: EndpointOptions<F>): Remote<F> {\n\treturn makeRemote<F>({endpoint: makeEndpoint(options), tap: options.tap})\n}\n\n", "\nimport {pub} from \"@e280/stz\"\nimport {JsonRpc} from \"../../../core/json-rpc.js\"\n\nexport class Conduit {\n\trecv = pub<[incoming: JsonRpc.Bidirectional, {origin: string}]>()\n\tsendRequest = pub<[request: JsonRpc.Requestish, transfer: Transferable[] | undefined]>()\n\tsendResponse = pub<[response: JsonRpc.Respondish, transfer: Transferable[] | undefined]>()\n\n\tstatic makeEntangledPair({origin = \"example.e280.org\"}: {origin?: string} = {}) {\n\t\tconst a = new this()\n\t\tconst b = new this()\n\n\t\tconst disposers = [\n\t\t\ta.sendRequest.sub(data => b.recv(data, {origin})),\n\t\t\ta.sendResponse.sub(data => b.recv(data, {origin})),\n\t\t\tb.sendRequest.sub(data => a.recv(data, {origin})),\n\t\t\tb.sendResponse.sub(data => a.recv(data, {origin})),\n\t\t]\n\n\t\tconst dispose = () => disposers.forEach(fn => fn())\n\t\treturn [a, b, dispose] as [Conduit, Conduit, () => void]\n\t}\n}\n\n", "\nimport {defer} from \"@e280/stz\"\nimport {Endpoint} from \"../../../core/types.js\"\nimport {JsonRpc} from \"../../../core/json-rpc.js\"\nimport {Channel, ChannelMessage} from \"../types.js\"\nimport {ResponseWaiter} from \"./response-waiter.js\"\n\nexport function onMessage(channel: Channel, fn: (e: ChannelMessage) => void) {\n\tchannel.addEventListener(\"message\", fn)\n\treturn () => channel.removeEventListener(\"message\", fn)\n}\n\n////////////////\n\nexport type SendRequestFn = (\n\trequest: JsonRpc.Request,\n\ttransfer: Transferable[] | undefined,\n\tdone: Promise<JsonRpc.Response | null>,\n) => void\n\nexport function makeRemoteEndpoint(waiter: ResponseWaiter, sendRequest: SendRequestFn): Endpoint {\n\treturn async(request, {transfer} = {}) => {\n\t\tif (\"id\" in request) {\n\t\t\tconst done = defer<JsonRpc.Response | null>()\n\t\t\tsendRequest(request, transfer, done.promise)\n\t\t\treturn waiter.wait(request.id, request.method).then(response => {\n\t\t\t\tdone.resolve(response)\n\t\t\t\treturn response\n\t\t\t})\n\t\t}\n\t\telse {\n\t\t\tconst done = Promise.resolve(null)\n\t\t\tsendRequest(request, transfer, done)\n\t\t\treturn done\n\t\t}\n\t}\n}\n\nexport function interpretIncoming(json: JsonRpc.Bidirectional) {\n\tconst requests: JsonRpc.Request[] = []\n\tconst responses: JsonRpc.Response[] = []\n\n\tfor (const item of (Array.isArray(json) ? json : [json])) {\n\t\tif (\"method\" in item) requests.push(item)\n\t\telse responses.push(item)\n\t}\n\n\treturn {requests, responses}\n}\n\nexport async function handleIncomingRequests(\n\t\tlocalEndpoint: Endpoint,\n\t\trequests: JsonRpc.Request[],\n\t): Promise<JsonRpc.Respondish | null> {\n\n\tconst responses = (\n\t\tawait Promise.all(\n\t\t\trequests.map(async request => localEndpoint(request))\n\t\t)\n\t).filter(r => r !== null)\n\n\tif (responses.length === 0)\n\t\treturn null\n\n\treturn (responses.length === 1)\n\t\t? responses[0]\n\t\t: responses\n}\n\nexport function handleIncomingResponses(\n\t\twaiter: ResponseWaiter,\n\t\tresponses: JsonRpc.Response[],\n\t) {\n\n\tfor (const response of responses)\n\t\twaiter.deliverResponse(response)\n}\n\n", "\nimport {Trash} from \"@e280/stz\"\nimport {Conduit} from \"./conduit.js\"\nimport {PostableChannel} from \"../types.js\"\nimport {onMessage} from \"../parts/helpers.js\"\n\nexport class PostableConduit extends Conduit {\n\t#trash = new Trash()\n\n\tconstructor(channel: PostableChannel) {\n\t\tsuper()\n\t\tthis.#trash.add(\n\t\t\tthis.sendRequest.sub((m, transfer) => channel.postMessage(m, transfer)),\n\t\t\tthis.sendResponse.sub((m, transfer) => channel.postMessage(m, transfer)),\n\t\t\tonMessage(channel, e => this.recv(e.data, e)),\n\t\t)\n\t}\n\n\tdispose() {\n\t\tthis.#trash.dispose()\n\t}\n}\n\n", "\nimport {Fns} from \"../../../core/types.js\"\nimport {Remote} from \"../../../core/remote-proxy.js\"\n\nexport class MessengerMeta<RemoteFns extends Fns> {\n\ttransfer: Transferable[] | undefined\n\n\tconstructor(public remote: Remote<RemoteFns>) {}\n}\n\n", "\nexport const defaults = Object.freeze({\n\ttimeout: 60_000,\n\tmaxRequestBytes: 10_000_000,\n})\n\n", "\nimport {deadline, DeadlineError, defer, Deferred} from \"@e280/stz\"\n\nimport {JsonRpc} from \"../../../core/json-rpc.js\"\nimport {RemoteError} from \"../../../core/errors.js\"\n\ntype Pend = {\n\tmethod: string\n\tdeferred: Deferred<JsonRpc.Response>\n}\n\nexport class ResponseWaiter {\n\tpending = new Map<JsonRpc.Id, Pend>()\n\n\tconstructor(public timeout: number) {}\n\n\tasync wait(id: JsonRpc.Id, method: string) {\n\t\tconst deferred = defer<JsonRpc.Response>()\n\t\tthis.pending.set(id, {method, deferred})\n\t\treturn await deadline(this.timeout, () => deferred.promise)\n\t\t\t.catch(error => {\n\t\t\t\tif (error instanceof DeadlineError)\n\t\t\t\t\terror.message = `request #${id} ${method}(), ${error.message}`\n\t\t\t\tthrow error\n\t\t\t})\n\t}\n\n\tdeliverResponse(response: JsonRpc.Response) {\n\t\tconst pend = this.pending.get(response.id)\n\t\tif (pend) {\n\t\t\tif (\"error\" in response)\n\t\t\t\tpend.deferred.reject(new RemoteError(response.error.message))\n\t\t\telse\n\t\t\t\tpend.deferred.resolve(response)\n\t\t}\n\t}\n}\n\n", "\nimport {Trash} from \"@e280/stz\"\n\nimport {defaults} from \"../../defaults.js\"\nimport {MessengerOptions} from \"./types.js\"\nimport {MessengerMeta} from \"./parts/meta.js\"\nimport {JsonRpc} from \"../../core/json-rpc.js\"\nimport {bindTap} from \"../../core/taps/bind.js\"\nimport {makeRemote} from \"../../core/remote.js\"\nimport {Remote} from \"../../core/remote-proxy.js\"\nimport {Endpoint, Fns} from \"../../core/types.js\"\nimport {makeEndpoint} from \"../../core/endpoint.js\"\nimport {ResponseWaiter} from \"./parts/response-waiter.js\"\nimport {handleIncomingRequests, interpretIncoming, makeRemoteEndpoint} from \"./parts/helpers.js\"\n\n/**\n * Establish a renraku remote that communicates over the given conduit.\n * - supports two-way or one-way communication\n * - you can use a messenger to call a remote messenger\n * - you can use a messenger to respond to incoming requests\n */\nexport class Messenger<LocalFns extends Fns = any, RemoteFns extends Fns = any> {\n\tremote: Remote<RemoteFns>\n\tremoteEndpoint: Endpoint\n\n\t#waiter: ResponseWaiter\n\t#trash = new Trash()\n\n\tconstructor(private options: MessengerOptions<LocalFns, RemoteFns>) {\n\t\tconst {conduit, tap} = options\n\n\t\tthis.#waiter = new ResponseWaiter(options.timeout ?? defaults.timeout)\n\n\t\tthis.remoteEndpoint = makeRemoteEndpoint(\n\t\t\tthis.#waiter,\n\t\t\tconduit.sendRequest.pub.bind(conduit.sendRequest),\n\t\t)\n\n\t\tthis.remote = makeRemote<RemoteFns>({\n\t\t\tendpoint: this.remoteEndpoint,\n\t\t\ttap: tap && bindTap(tap, {remote: true}),\n\t\t})\n\n\t\tthis.#trash.add(conduit.recv.sub(m => this.recv(m)))\n\t}\n\n\tasync recv(incoming: JsonRpc.Bidirectional) {\n\t\tconst meta = new MessengerMeta<RemoteFns>(this.remote)\n\t\tconst {conduit, rpc, tap} = this.options\n\n\t\tconst {requests, responses} = interpretIncoming(incoming)\n\n\t\tfor (const response of responses)\n\t\t\tthis.#waiter.deliverResponse(response)\n\n\t\tif (!rpc)\n\t\t\treturn\n\n\t\tconst fns = await rpc(meta)\n\t\tconst endpoint = makeEndpoint({\n\t\t\tfns,\n\t\t\ttap: tap && bindTap(tap, {remote: false}),\n\t\t})\n\n\t\tconst outgoing = await handleIncomingRequests(endpoint, requests)\n\t\tif (outgoing)\n\t\t\tawait conduit.sendResponse(outgoing, meta.transfer)\n\t}\n\n\tdispose() {\n\t\tthis.#trash.dispose()\n\t}\n}\n\n", "\nimport {MessengerMeta, Remote} from \"@e280/renraku\"\nimport {MinistryFns, Schematic} from \"./types.js\"\n\nexport type HostShell<S extends Schematic> = {\n\thost: Remote<S[\"host\"]>\n\ttransfer: Transferable[] | undefined\n}\n\nexport type WorkShell<S extends Schematic> = {\n\twork: Remote<S[\"work\"]>\n\ttransfer: Transferable[] | undefined\n}\n\nexport const shells = {\n\tderive: {\n\t\thost: <S extends Schematic>(meta: MessengerMeta<MinistryFns<S>>): HostShell<S> => ({\n\t\t\thost: meta.remote.host,\n\t\t\tget transfer() { return meta.transfer },\n\t\t\tset transfer(t) { meta.transfer = t },\n\t\t}),\n\t\twork: <S extends Schematic>(meta: MessengerMeta<S[\"work\"]>): WorkShell<S> => ({\n\t\t\twork: meta.remote,\n\t\t\tget transfer() { return meta.transfer },\n\t\t\tset transfer(t) { meta.transfer = t },\n\t\t}),\n\t},\n\tmock: {\n\t\thost: <S extends Schematic>(): HostShell<S> => ({\n\t\t\thost: undefined as any,\n\t\t\ttransfer: undefined,\n\t\t}),\n\t\twork: <S extends Schematic>(): WorkShell<S> => ({\n\t\t\twork: undefined as any,\n\t\t\ttransfer: undefined,\n\t\t})\n\t},\n}\n\n", "\nimport {ErrorTap} from \"@e280/renraku\"\n\nexport const defaultTap = new ErrorTap()\n\n", "\nimport {Messenger, PostableConduit} from \"@e280/renraku\"\n\nimport {shells} from \"./shells.js\"\nimport {Compat} from \"../compat/types.js\"\nimport {defaultTap} from \"./default-tap.js\"\nimport {MinistryFns, Schematic, SetupWork, WorkerOpts} from \"./types.js\"\n\n/**\n * create a web worker\n */\nexport async function worker<S extends Schematic>(\n\t\tcompat: Compat,\n\t\tsetupWork: SetupWork<S>,\n\t\toptions: WorkerOpts = {},\n\t) {\n\n\tconst tap = options.tap ?? defaultTap\n\n\tconst messenger = new Messenger<S[\"work\"], MinistryFns<S>>({\n\t\ttap,\n\t\ttimeout: options.timeout ?? Infinity,\n\t\tconduit: new PostableConduit(compat.getSelf()),\n\t\trpc: async m => setupWork(\n\t\t\tshells.derive.host<S>(m),\n\t\t),\n\t})\n\n\tawait messenger.remote.infra.ready()\n\treturn messenger.remote.host\n}\n\n", "\nimport {defer} from \"@e280/stz\"\nimport {Messenger, PostableConduit} from \"@e280/renraku\"\n\nimport {shells} from \"./shells.js\"\nimport {defaultTap} from \"./default-tap.js\"\nimport {Compat, CompatWorker} from \"../compat/types.js\"\nimport {Infra, MinistryFns, Schematic, ThreadOptions} from \"./types.js\"\n\nexport class Thread<S extends Schematic> {\n\tconstructor(\n\t\tpublic worker: CompatWorker,\n\t\tpublic messenger: Messenger<MinistryFns<S>, S[\"work\"]>,\n\t) {}\n\n\tstatic async make<S extends Schematic>(compat: Compat, options: ThreadOptions<S>) {\n\t\tconst tap = options.tap ?? defaultTap\n\t\tconst label = options.label ?? \"comrade\"\n\t\tconst worker = compat.loadWorker(options.workerUrl, label)\n\t\tconst readyprom = defer<void>()\n\n\t\tconst infra: Infra = {\n\t\t\tasync ready() {\n\t\t\t\treadyprom.resolve()\n\t\t\t},\n\t\t}\n\n\t\tconst messenger = new Messenger<MinistryFns<S>, S[\"work\"]>({\n\t\t\ttap,\n\t\t\ttimeout: options.timeout ?? Infinity,\n\t\t\tconduit: new PostableConduit(worker),\n\t\t\trpc: async m => ({\n\t\t\t\tinfra,\n\t\t\t\thost: options.setupHost(\n\t\t\t\t\tshells.derive.work<S>(m)\n\t\t\t\t),\n\t\t\t}),\n\t\t})\n\n\t\tawait readyprom.promise\n\t\treturn new this<S>(worker, messenger)\n\t}\n\n\tget work() {\n\t\treturn this.messenger.remote\n\t}\n\n\tterminate() {\n\t\tthis.worker.terminate()\n\t}\n}\n\n", "\nimport {defer} from \"@e280/stz\"\nimport {Endpoint, makeRemote, Remote, Tap} from \"@e280/renraku\"\n\nimport {Thread} from \"./thread.js\"\nimport {Compat} from \"../compat/types.js\"\nimport {defaultTap} from \"./default-tap.js\"\nimport {ClusterOptions, Schematic, Task} from \"./types.js\"\n\n/**\n * a pool of web workers\n * - please use `await Cluster.make(options)` to create your worker pool\n * - call your worker functions like `await cluster.remote.hello()`\n */\nexport class Cluster<S extends Schematic> {\n\n\tstatic async make<S extends Schematic>(compat: Compat, options: ClusterOptions<S>) {\n\t\tconst workerCount = options.workerCount ?? compat.guessOptimalThreadCount()\n\t\tconst threads = await Promise.all([...Array(workerCount)].map(\n\t\t\tasync(_, index) => Thread.make(compat, {\n\t\t\t\t...options,\n\t\t\t\tlabel: options.label ?? `${options.label ?? \"comrade\"}_${index + 1}`,\n\t\t\t})\n\t\t))\n\t\treturn new this<S>(threads, {tap: options.tap})\n\t}\n\n\twork: Remote<S[\"work\"]>\n\t#available = new Set<Thread<S>>()\n\t#tasks: Task[] = []\n\n\tconstructor(private threads: Thread<S>[], options: {tap?: Tap} = {}) {\n\t\tconst tap = options.tap ?? defaultTap\n\n\t\t// delegation\n\t\tconst remoteEndpoint: Endpoint = async(request, special) => this.#scheduleTask({\n\t\t\trequest,\n\t\t\tprom: defer(),\n\t\t\ttransfer: special?.transfer,\n\t\t})\n\n\t\t// remote proxy to call comrade fns\n\t\tthis.work = makeRemote({\n\t\t\ttap,\n\t\t\tendpoint: remoteEndpoint,\n\t\t})\n\n\t\t// in the beginning, all threads are available\n\t\tthreads.forEach(t => this.#available.add(t))\n\t}\n\n\tget threadCount() {\n\t\treturn this.threads.length\n\t}\n\n\tterminate() {\n\t\tfor (const thread of this.threads)\n\t\t\tthread.terminate()\n\t}\n\n\t#scheduleTask(task: Task) {\n\t\tthis.#tasks.push(task)\n\t\tthis.#distributeTasks()\n\t\treturn task.prom.promise\n\t}\n\n\t#distributeTasks() {\n\t\twhile (this.#available.size > 0 && this.#tasks.length > 0) {\n\t\t\tconst thread = [...this.#available].pop()!\n\t\t\tthis.#available.delete(thread)\n\n\t\t\tconst task = this.#tasks.shift()!\n\n\t\t\t// this thread is no longer available\n\t\t\tthis.#available.delete(thread)\n\n\t\t\t// call the thread endpoint\n\t\t\tconst callprom = thread.messenger.remoteEndpoint(task.request, {transfer: task.transfer})\n\n\t\t\t// resolve/reject the task prom when callprom is done\n\t\t\ttask.prom.entangle(callprom).finally(() => {\n\n\t\t\t\t// thread is ready again\n\t\t\t\tthis.#available.add(thread)\n\n\t\t\t\t// distribute more tasks\n\t\t\t\tthis.#distributeTasks()\n\t\t\t})\n\t\t}\n\t}\n}\n\n", "\nimport {makeMock, Tap} from \"@e280/renraku\"\n\nimport {worker} from \"./parts/worker.js\"\nimport {Compat} from \"./compat/types.js\"\nimport {Thread} from \"./parts/thread.js\"\nimport {shells} from \"./parts/shells.js\"\nimport {Cluster} from \"./parts/cluster.js\"\nimport {defaultTap} from \"./parts/default-tap.js\"\nimport {ClusterOptions, Mocks, Schematic, SetupHost, SetupWork, ThreadOptions, WorkerOpts} from \"./parts/types.js\"\n\nexport const setupComrade = (compat: Compat) => ({\n\tthread: <S extends Schematic>(options: ThreadOptions<S>) => Thread.make(compat, options),\n\tcluster: <S extends Schematic>(options: ClusterOptions<S>) => Cluster.make(compat, options),\n\n\tworker: <S extends Schematic>(\n\t\tsetupWork: SetupWork<S>,\n\t\toptions: WorkerOpts = {},\n\t) => worker(compat, setupWork, options),\n\n\twork: <S extends Schematic>(fn: SetupWork<S>) => fn,\n\thost: <S extends Schematic>(fn: SetupHost<S>) => fn,\n\n\tmocks<S extends Schematic>(options: {\n\t\t\ttap?: Tap\n\t\t\tsetupWork: SetupWork<S>\n\t\t\tsetupHost: SetupHost<S>\n\t\t}): Mocks<S> {\n\n\t\tconst {setupWork, setupHost, tap = defaultTap} = options\n\n\t\tconst hostShell = shells.mock.host<S>()\n\t\tconst workShell = shells.mock.work<S>()\n\n\t\tworkShell.work = makeMock({tap, fns: setupWork(hostShell)})\n\t\thostShell.host = makeMock({tap, fns: setupHost(workShell)})\n\n\t\treturn {\n\t\t\tworkShell,\n\t\t\thostShell,\n\t\t\twork: workShell.work,\n\t\t\thost: hostShell.host,\n\t\t}\n\t},\n\n\tmockWork<S extends Schematic>(setupWork: SetupWork<S>, tap: Tap = defaultTap) {\n\t\tconst hostShell = shells.mock.host<S>()\n\t\tconst workShell = shells.mock.work<S>()\n\n\t\tworkShell.work = makeMock({tap, fns: setupWork(hostShell)})\n\n\t\treturn {\n\t\t\tworkShell,\n\t\t\thostShell,\n\t\t\twork: workShell.work,\n\t\t\tmockHost: (setupHost: SetupHost<S>): Mocks<S> => {\n\t\t\t\thostShell.host = makeMock({tap, fns: setupHost(workShell)})\n\t\t\t\treturn {\n\t\t\t\t\tworkShell,\n\t\t\t\t\thostShell,\n\t\t\t\t\twork: workShell.work,\n\t\t\t\t\thost: hostShell.host,\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t},\n})\n\n", "\nimport {Compat, CompatWorker} from \"./types.js\"\n\nexport const setupBrowserCompat = (): Compat => ({\n\tgetSelf() {\n\t\treturn self\n\t},\n\n\tguessOptimalThreadCount() {\n\t\tconst count = navigator.hardwareConcurrency ?? 1\n\t\treturn Math.max(1, count - 1)\n\t},\n\n\tloadWorker(url, name) {\n\t\treturn new window.Worker(url, {name, type: \"module\"}) as CompatWorker\n\t},\n\n\tasync loadWasm(url) {\n\t\treturn WebAssembly.instantiateStreaming(fetch(url))\n\t},\n})\n\n", "\nimport {setupComrade} from \"./comrade.js\"\nimport {setupBrowserCompat} from \"./compat/browser.js\"\n\nexport const compat = setupBrowserCompat()\nexport const Comrade = setupComrade(compat)\n\nexport * from \"./exports.js\"\n\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nexport function assert(x) {\n if (!x) {\n throw new Error('Assertion failed.');\n }\n}\nexport const normalizeRotation = (rotation) => {\n const mappedRotation = (rotation % 360 + 360) % 360;\n if (mappedRotation === 0 || mappedRotation === 90 || mappedRotation === 180 || mappedRotation === 270) {\n return mappedRotation;\n }\n else {\n throw new Error(`Invalid rotation ${rotation}.`);\n }\n};\nexport const last = (arr) => {\n return arr && arr[arr.length - 1];\n};\nexport const isU32 = (value) => {\n return value >= 0 && value < 2 ** 32;\n};\nexport class Bitstream {\n constructor(bytes) {\n this.bytes = bytes;\n /** Current offset in bits. */\n this.pos = 0;\n }\n seekToByte(byteOffset) {\n this.pos = 8 * byteOffset;\n }\n readBit() {\n const byteIndex = Math.floor(this.pos / 8);\n const byte = this.bytes[byteIndex] ?? 0;\n const bitIndex = 0b111 - (this.pos & 0b111);\n const bit = (byte & (1 << bitIndex)) >> bitIndex;\n this.pos++;\n return bit;\n }\n readBits(n) {\n if (n === 1) {\n return this.readBit();\n }\n let result = 0;\n for (let i = 0; i < n; i++) {\n result <<= 1;\n result |= this.readBit();\n }\n return result;\n }\n readAlignedByte() {\n // Ensure we're byte-aligned\n if (this.pos % 8 !== 0) {\n throw new Error('Bitstream is not byte-aligned.');\n }\n const byteIndex = this.pos / 8;\n const byte = this.bytes[byteIndex] ?? 0;\n this.pos += 8;\n return byte;\n }\n skipBits(n) {\n this.pos += n;\n }\n getBitsLeft() {\n return this.bytes.length * 8 - this.pos;\n }\n clone() {\n const clone = new Bitstream(this.bytes);\n clone.pos = this.pos;\n return clone;\n }\n}\n/** Reads an exponential-Golomb universal code from a Bitstream. */\nexport const readExpGolomb = (bitstream) => {\n let leadingZeroBits = 0;\n while (bitstream.readBits(1) === 0 && leadingZeroBits < 32) {\n leadingZeroBits++;\n }\n if (leadingZeroBits >= 32) {\n throw new Error('Invalid exponential-Golomb code.');\n }\n const result = (1 << leadingZeroBits) - 1 + bitstream.readBits(leadingZeroBits);\n return result;\n};\n/** Reads a signed exponential-Golomb universal code from a Bitstream. */\nexport const readSignedExpGolomb = (bitstream) => {\n const codeNum = readExpGolomb(bitstream);\n return ((codeNum & 1) === 0)\n ? -(codeNum >> 1)\n : ((codeNum + 1) >> 1);\n};\nexport const writeBits = (bytes, start, end, value) => {\n for (let i = start; i < end; i++) {\n const byteIndex = Math.floor(i / 8);\n let byte = bytes[byteIndex];\n const bitIndex = 0b111 - (i & 0b111);\n byte &= ~(1 << bitIndex);\n byte |= ((value & (1 << (end - i - 1))) >> (end - i - 1)) << bitIndex;\n bytes[byteIndex] = byte;\n }\n};\nexport const toUint8Array = (source) => {\n if (source instanceof Uint8Array) {\n return source;\n }\n else if (source instanceof ArrayBuffer) {\n return new Uint8Array(source);\n }\n else {\n return new Uint8Array(source.buffer, source.byteOffset, source.byteLength);\n }\n};\nexport const toDataView = (source) => {\n if (source instanceof DataView) {\n return source;\n }\n else if (source instanceof ArrayBuffer) {\n return new DataView(source);\n }\n else {\n return new DataView(source.buffer, source.byteOffset, source.byteLength);\n }\n};\nexport const textEncoder = new TextEncoder();\nconst invertObject = (object) => {\n return Object.fromEntries(Object.entries(object).map(([key, value]) => [value, key]));\n};\n// For the color space mappings, see Rec. ITU-T H.273.\nexport const COLOR_PRIMARIES_MAP = {\n bt709: 1, // ITU-R BT.709\n bt470bg: 5, // ITU-R BT.470BG\n smpte170m: 6, // ITU-R BT.601 525 - SMPTE 170M\n bt2020: 9, // ITU-R BT.202\n smpte432: 12, // SMPTE EG 432-1\n};\nexport const COLOR_PRIMARIES_MAP_INVERSE = invertObject(COLOR_PRIMARIES_MAP);\nexport const TRANSFER_CHARACTERISTICS_MAP = {\n 'bt709': 1, // ITU-R BT.709\n 'smpte170m': 6, // SMPTE 170M\n 'linear': 8, // Linear transfer characteristics\n 'iec61966-2-1': 13, // IEC 61966-2-1\n 'pg': 16, // Rec. ITU-R BT.2100-2 perceptual quantization (PQ) system\n 'hlg': 18, // Rec. ITU-R BT.2100-2 hybrid loggamma (HLG) system\n};\nexport const TRANSFER_CHARACTERISTICS_MAP_INVERSE = invertObject(TRANSFER_CHARACTERISTICS_MAP);\nexport const MATRIX_COEFFICIENTS_MAP = {\n 'rgb': 0, // Identity\n 'bt709': 1, // ITU-R BT.709\n 'bt470bg': 5, // ITU-R BT.470BG\n 'smpte170m': 6, // SMPTE 170M\n 'bt2020-ncl': 9, // ITU-R BT.2020-2 (non-constant luminance)\n};\nexport const MATRIX_COEFFICIENTS_MAP_INVERSE = invertObject(MATRIX_COEFFICIENTS_MAP);\nexport const colorSpaceIsComplete = (colorSpace) => {\n return (!!colorSpace\n && !!colorSpace.primaries\n && !!colorSpace.transfer\n && !!colorSpace.matrix\n && colorSpace.fullRange !== undefined);\n};\nexport const isAllowSharedBufferSource = (x) => {\n return (x instanceof ArrayBuffer\n || (typeof SharedArrayBuffer !== 'undefined' && x instanceof SharedArrayBuffer)\n || ArrayBuffer.isView(x));\n};\nexport class AsyncMutex {\n constructor() {\n this.currentPromise = Promise.resolve();\n }\n async acquire() {\n let resolver;\n const nextPromise = new Promise((resolve) => {\n resolver = resolve;\n });\n const currentPromiseAlias = this.currentPromise;\n this.currentPromise = nextPromise;\n await currentPromiseAlias;\n return resolver;\n }\n}\nexport const bytesToHexString = (bytes) => {\n return [...bytes].map(x => x.toString(16).padStart(2, '0')).join('');\n};\nexport const reverseBitsU32 = (x) => {\n x = ((x >> 1) & 0x55555555) | ((x & 0x55555555) << 1);\n x = ((x >> 2) & 0x33333333) | ((x & 0x33333333) << 2);\n x = ((x >> 4) & 0x0f0f0f0f) | ((x & 0x0f0f0f0f) << 4);\n x = ((x >> 8) & 0x00ff00ff) | ((x & 0x00ff00ff) << 8);\n x = ((x >> 16) & 0x0000ffff) | ((x & 0x0000ffff) << 16);\n return x >>> 0; // Ensure it's treated as an unsigned 32-bit integer\n};\n/** Returns the smallest index i such that val[i] === key, or -1 if no such index exists. */\nexport const binarySearchExact = (arr, key, valueGetter) => {\n let low = 0;\n let high = arr.length - 1;\n let ans = -1;\n while (low <= high) {\n const mid = (low + high) >> 1;\n const midVal = valueGetter(arr[mid]);\n if (midVal === key) {\n ans = mid;\n high = mid - 1; // Continue searching left to find the lowest index\n }\n else if (midVal < key) {\n low = mid + 1;\n }\n else {\n high = mid - 1;\n }\n }\n return ans;\n};\n/** Returns the largest index i such that val[i] <= key, or -1 if no such index exists. */\nexport const binarySearchLessOrEqual = (arr, key, valueGetter) => {\n let low = 0;\n let high = arr.length - 1;\n let ans = -1;\n while (low <= high) {\n const mid = (low + (high - low + 1) / 2) | 0;\n const midVal = valueGetter(arr[mid]);\n if (midVal <= key) {\n ans = mid;\n low = mid + 1;\n }\n else {\n high = mid - 1;\n }\n }\n return ans;\n};\nexport const promiseWithResolvers = () => {\n let resolve;\n let reject;\n const promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve: resolve, reject: reject };\n};\nexport const removeItem = (arr, item) => {\n const index = arr.indexOf(item);\n if (index !== -1) {\n arr.splice(index, 1);\n }\n};\nexport const findLast = (arr, predicate) => {\n for (let i = arr.length - 1; i >= 0; i--) {\n if (predicate(arr[i])) {\n return arr[i];\n }\n }\n return undefined;\n};\nexport const findLastIndex = (arr, predicate) => {\n for (let i = arr.length - 1; i >= 0; i--) {\n if (predicate(arr[i])) {\n return i;\n }\n }\n return -1;\n};\nexport const toAsyncIterator = async function* (source) {\n if (Symbol.iterator in source) {\n // @ts-expect-error Trust me\n yield* source[Symbol.iterator]();\n }\n else {\n // @ts-expect-error Trust me\n yield* source[Symbol.asyncIterator]();\n }\n};\nexport const validateAnyIterable = (iterable) => {\n if (!(Symbol.iterator in iterable) && !(Symbol.asyncIterator in iterable)) {\n throw new TypeError('Argument must be an iterable or async iterable.');\n }\n};\nexport const assertNever = (x) => {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n throw new Error(`Unexpected value: ${x}`);\n};\nexport const getUint24 = (view, byteOffset, littleEndian) => {\n const byte1 = view.getUint8(byteOffset);\n const byte2 = view.getUint8(byteOffset + 1);\n const byte3 = view.getUint8(byteOffset + 2);\n if (littleEndian) {\n return byte1 | (byte2 << 8) | (byte3 << 16);\n }\n else {\n return (byte1 << 16) | (byte2 << 8) | byte3;\n }\n};\nexport const getInt24 = (view, byteOffset, littleEndian) => {\n // The left shift pushes the most significant bit into the sign bit region, and the subsequent right shift\n // then correctly interprets the sign bit.\n return getUint24(view, byteOffset, littleEndian) << 8 >> 8;\n};\nexport const setUint24 = (view, byteOffset, value, littleEndian) => {\n // Ensure the value is within 24-bit unsigned range (0 to 16777215)\n value = value >>> 0; // Convert to unsigned 32-bit\n value = value & 0xFFFFFF; // Mask to 24 bits\n if (littleEndian) {\n view.setUint8(byteOffset, value & 0xFF);\n view.setUint8(byteOffset + 1, (value >>> 8) & 0xFF);\n view.setUint8(byteOffset + 2, (value >>> 16) & 0xFF);\n }\n else {\n view.setUint8(byteOffset, (value >>> 16) & 0xFF);\n view.setUint8(byteOffset + 1, (value >>> 8) & 0xFF);\n view.setUint8(byteOffset + 2, value & 0xFF);\n }\n};\nexport const setInt24 = (view, byteOffset, value, littleEndian) => {\n // Ensure the value is within 24-bit signed range (-8388608 to 8388607)\n value = clamp(value, -8388608, 8388607);\n // Convert negative values to their 24-bit representation\n if (value < 0) {\n value = (value + 0x1000000) & 0xFFFFFF;\n }\n setUint24(view, byteOffset, value, littleEndian);\n};\nexport const setInt64 = (view, byteOffset, value, littleEndian) => {\n if (littleEndian) {\n view.setUint32(byteOffset + 0, value, true);\n view.setInt32(byteOffset + 4, Math.floor(value / 2 ** 32), true);\n }\n else {\n view.setInt32(byteOffset + 0, Math.floor(value / 2 ** 32), true);\n view.setUint32(byteOffset + 4, value, true);\n }\n};\n/**\n * Calls a function on each value spat out by an async generator. The reason for writing this manually instead of\n * using a generator function is that the generator function queues return() calls - here, we forward them immediately.\n */\nexport const mapAsyncGenerator = (generator, map) => {\n return {\n async next() {\n const result = await generator.next();\n if (result.done) {\n return { value: undefined, done: true };\n }\n else {\n return { value: map(result.value), done: false };\n }\n },\n return() {\n return generator.return();\n },\n throw(error) {\n return generator.throw(error);\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n};\nexport const clamp = (value, min, max) => {\n return Math.max(min, Math.min(max, value));\n};\nexport const UNDETERMINED_LANGUAGE = 'und';\nexport const roundToPrecision = (value, digits) => {\n const factor = 10 ** digits;\n return Math.round(value * factor) / factor;\n};\nexport const roundToMultiple = (value, multiple) => {\n return Math.round(value / multiple) * multiple;\n};\nexport const ilog = (x) => {\n let ret = 0;\n while (x) {\n ret++;\n x >>= 1;\n }\n return ret;\n};\nconst ISO_639_2_REGEX = /^[a-z]{3}$/;\nexport const isIso639Dash2LanguageCode = (x) => {\n return ISO_639_2_REGEX.test(x);\n};\n// Since the result will be truncated, add a bit of eps to compensate for floating point errors\nexport const SECOND_TO_MICROSECOND_FACTOR = 1e6 * (1 + Number.EPSILON);\nexport const mergeObjectsDeeply = (a, b) => {\n const result = { ...a };\n for (const key in b) {\n if (typeof a[key] === 'object'\n && a[key] !== null\n && typeof b[key] === 'object'\n && b[key] !== null) {\n result[key] = mergeObjectsDeeply(a[key], b[key]);\n }\n else {\n result[key] = b[key];\n }\n }\n return result;\n};\nexport const retriedFetch = async (url, requestInit, getRetryDelay) => {\n let attempts = 0;\n while (true) {\n try {\n return await fetch(url, requestInit);\n }\n catch (error) {\n attempts++;\n const retryDelayInSeconds = getRetryDelay(attempts);\n if (retryDelayInSeconds === null) {\n throw error;\n }\n console.error('Retrying failed fetch. Error:', error);\n if (!Number.isFinite(retryDelayInSeconds) || retryDelayInSeconds < 0) {\n throw new TypeError('Retry delay must be a non-negative finite number.');\n }\n if (retryDelayInSeconds > 0) {\n await new Promise(resolve => setTimeout(resolve, 1000 * retryDelayInSeconds));\n }\n }\n }\n};\nexport const computeRationalApproximation = (x, maxDenominator) => {\n // Handle negative numbers\n const sign = x < 0 ? -1 : 1;\n x = Math.abs(x);\n let prevNumerator = 0, prevDenominator = 1;\n let currNumerator = 1, currDenominator = 0;\n // Continued fraction algorithm\n let remainder = x;\n while (true) {\n const integer = Math.floor(remainder);\n // Calculate next convergent\n const nextNumerator = integer * currNumerator + prevNumerator;\n const nextDenominator = integer * currDenominator + prevDenominator;\n if (nextDenominator > maxDenominator) {\n return {\n numerator: sign * currNumerator,\n denominator: currDenominator,\n };\n }\n prevNumerator = currNumerator;\n prevDenominator = currDenominator;\n currNumerator = nextNumerator;\n currDenominator = nextDenominator;\n remainder = 1 / (remainder - integer);\n // Guard against precision issues\n if (!isFinite(remainder)) {\n break;\n }\n }\n return {\n numerator: sign * currNumerator,\n denominator: currDenominator,\n };\n};\nexport class CallSerializer {\n constructor() {\n this.currentPromise = Promise.resolve();\n }\n call(fn) {\n return this.currentPromise = this.currentPromise.then(fn);\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n/**\n * Base class for custom video decoders. To add your own custom video decoder, extend this class, implement the\n * abstract methods and static `supports` method, and register the decoder using `registerDecoder`.\n * @public\n */\nexport class CustomVideoDecoder {\n /** Returns true iff the decoder can decode the given codec configuration. */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static supports(codec, config) {\n return false;\n }\n}\n/**\n * Base class for custom audio decoders. To add your own custom audio decoder, extend this class, implement the\n * abstract methods and static `supports` method, and register the decoder using `registerDecoder`.\n * @public\n */\nexport class CustomAudioDecoder {\n /** Returns true iff the decoder can decode the given codec configuration. */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static supports(codec, config) {\n return false;\n }\n}\n/**\n * Base class for custom video encoders. To add your own custom video encoder, extend this class, implement the\n * abstract methods and static `supports` method, and register the encoder using `registerEncoder`.\n * @public\n */\nexport class CustomVideoEncoder {\n /** Returns true iff the encoder can encode the given codec configuration. */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static supports(codec, config) {\n return false;\n }\n}\n/**\n * Base class for custom audio encoders. To add your own custom audio encoder, extend this class, implement the\n * abstract methods and static `supports` method, and register the encoder using `registerEncoder`.\n * @public\n */\nexport class CustomAudioEncoder {\n /** Returns true iff the encoder can encode the given codec configuration. */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static supports(codec, config) {\n return false;\n }\n}\nexport const customVideoDecoders = [];\nexport const customAudioDecoders = [];\nexport const customVideoEncoders = [];\nexport const customAudioEncoders = [];\n/**\n * Registers a custom video or audio decoder. Registered decoders will automatically be used for decoding whenever\n * possible.\n * @public\n */\nexport const registerDecoder = (decoder) => {\n if (decoder.prototype instanceof CustomVideoDecoder) {\n customVideoDecoders.push(decoder);\n }\n else if (decoder.prototype instanceof CustomAudioDecoder) {\n customAudioDecoders.push(decoder);\n }\n else {\n throw new TypeError('Decoder must be a CustomVideoDecoder or CustomAudioDecoder.');\n }\n};\n/**\n * Registers a custom video or audio encoder. Registered encoders will automatically be used for encoding whenever\n * possible.\n * @public\n */\nexport const registerEncoder = (encoder) => {\n if (encoder.prototype instanceof CustomVideoEncoder) {\n customVideoEncoders.push(encoder);\n }\n else if (encoder.prototype instanceof CustomAudioEncoder) {\n customAudioEncoders.push(encoder);\n }\n else {\n throw new TypeError('Encoder must be a CustomVideoEncoder or CustomAudioEncoder.');\n }\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { customAudioEncoders, customVideoEncoders } from './custom-coder.js';\nimport { Bitstream, COLOR_PRIMARIES_MAP, MATRIX_COEFFICIENTS_MAP, TRANSFER_CHARACTERISTICS_MAP, assert, bytesToHexString, isAllowSharedBufferSource, last, reverseBitsU32, toDataView, } from './misc.js';\n/**\n * List of known video codecs, ordered by encoding preference.\n * @public\n */\nexport const VIDEO_CODECS = [\n 'avc',\n 'hevc',\n 'vp9',\n 'av1',\n 'vp8',\n];\n/**\n * List of known PCM (uncompressed) audio codecs, ordered by encoding preference.\n * @public\n */\nexport const PCM_AUDIO_CODECS = [\n 'pcm-s16', // We don't prefix 'le' so we're compatible with the WebCodecs-registered PCM codec strings\n 'pcm-s16be',\n 'pcm-s24',\n 'pcm-s24be',\n 'pcm-s32',\n 'pcm-s32be',\n 'pcm-f32',\n 'pcm-f32be',\n 'pcm-f64',\n 'pcm-f64be',\n 'pcm-u8',\n 'pcm-s8',\n 'ulaw',\n 'alaw',\n];\n/**\n * List of known compressed audio codecs, ordered by encoding preference.\n * @public\n */\nexport const NON_PCM_AUDIO_CODECS = [\n 'aac',\n 'opus',\n 'mp3',\n 'vorbis',\n 'flac',\n];\n/**\n * List of known audio codecs, ordered by encoding preference.\n * @public\n */\nexport const AUDIO_CODECS = [\n ...NON_PCM_AUDIO_CODECS,\n ...PCM_AUDIO_CODECS,\n];\n/**\n * List of known subtitle codecs, ordered by encoding preference.\n * @public\n */\nexport const SUBTITLE_CODECS = [\n 'webvtt',\n]; // TODO add the rest\n// https://en.wikipedia.org/wiki/Advanced_Video_Coding\nconst AVC_LEVEL_TABLE = [\n { maxMacroblocks: 99, maxBitrate: 64000, level: 0x0A }, // Level 1\n { maxMacroblocks: 396, maxBitrate: 192000, level: 0x0B }, // Level 1.1\n { maxMacroblocks: 396, maxBitrate: 384000, level: 0x0C }, // Level 1.2\n { maxMacroblocks: 396, maxBitrate: 768000, level: 0x0D }, // Level 1.3\n { maxMacroblocks: 396, maxBitrate: 2000000, level: 0x14 }, // Level 2\n { maxMacroblocks: 792, maxBitrate: 4000000, level: 0x15 }, // Level 2.1\n { maxMacroblocks: 1620, maxBitrate: 4000000, level: 0x16 }, // Level 2.2\n { maxMacroblocks: 1620, maxBitrate: 10000000, level: 0x1E }, // Level 3\n { maxMacroblocks: 3600, maxBitrate: 14000000, level: 0x1F }, // Level 3.1\n { maxMacroblocks: 5120, maxBitrate: 20000000, level: 0x20 }, // Level 3.2\n { maxMacroblocks: 8192, maxBitrate: 20000000, level: 0x28 }, // Level 4\n { maxMacroblocks: 8192, maxBitrate: 50000000, level: 0x29 }, // Level 4.1\n { maxMacroblocks: 8704, maxBitrate: 50000000, level: 0x2A }, // Level 4.2\n { maxMacroblocks: 22080, maxBitrate: 135000000, level: 0x32 }, // Level 5\n { maxMacroblocks: 36864, maxBitrate: 240000000, level: 0x33 }, // Level 5.1\n { maxMacroblocks: 36864, maxBitrate: 240000000, level: 0x34 }, // Level 5.2\n { maxMacroblocks: 139264, maxBitrate: 240000000, level: 0x3C }, // Level 6\n { maxMacroblocks: 139264, maxBitrate: 480000000, level: 0x3D }, // Level 6.1\n { maxMacroblocks: 139264, maxBitrate: 800000000, level: 0x3E }, // Level 6.2\n];\n// https://en.wikipedia.org/wiki/High_Efficiency_Video_Coding\nconst HEVC_LEVEL_TABLE = [\n { maxPictureSize: 36864, maxBitrate: 128000, tier: 'L', level: 30 }, // Level 1 (Low Tier)\n { maxPictureSize: 122880, maxBitrate: 1500000, tier: 'L', level: 60 }, // Level 2 (Low Tier)\n { maxPictureSize: 245760, maxBitrate: 3000000, tier: 'L', level: 63 }, // Level 2.1 (Low Tier)\n { maxPictureSize: 552960, maxBitrate: 6000000, tier: 'L', level: 90 }, // Level 3 (Low Tier)\n { maxPictureSize: 983040, maxBitrate: 10000000, tier: 'L', level: 93 }, // Level 3.1 (Low Tier)\n { maxPictureSize: 2228224, maxBitrate: 12000000, tier: 'L', level: 120 }, // Level 4 (Low Tier)\n { maxPictureSize: 2228224, maxBitrate: 30000000, tier: 'H', level: 120 }, // Level 4 (High Tier)\n { maxPictureSize: 2228224, maxBitrate: 20000000, tier: 'L', level: 123 }, // Level 4.1 (Low Tier)\n { maxPictureSize: 2228224, maxBitrate: 50000000, tier: 'H', level: 123 }, // Level 4.1 (High Tier)\n { maxPictureSize: 8912896, maxBitrate: 25000000, tier: 'L', level: 150 }, // Level 5 (Low Tier)\n { maxPictureSize: 8912896, maxBitrate: 100000000, tier: 'H', level: 150 }, // Level 5 (High Tier)\n { maxPictureSize: 8912896, maxBitrate: 40000000, tier: 'L', level: 153 }, // Level 5.1 (Low Tier)\n { maxPictureSize: 8912896, maxBitrate: 160000000, tier: 'H', level: 153 }, // Level 5.1 (High Tier)\n { maxPictureSize: 8912896, maxBitrate: 60000000, tier: 'L', level: 156 }, // Level 5.2 (Low Tier)\n { maxPictureSize: 8912896, maxBitrate: 240000000, tier: 'H', level: 156 }, // Level 5.2 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 60000000, tier: 'L', level: 180 }, // Level 6 (Low Tier)\n { maxPictureSize: 35651584, maxBitrate: 240000000, tier: 'H', level: 180 }, // Level 6 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 120000000, tier: 'L', level: 183 }, // Level 6.1 (Low Tier)\n { maxPictureSize: 35651584, maxBitrate: 480000000, tier: 'H', level: 183 }, // Level 6.1 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 240000000, tier: 'L', level: 186 }, // Level 6.2 (Low Tier)\n { maxPictureSize: 35651584, maxBitrate: 800000000, tier: 'H', level: 186 }, // Level 6.2 (High Tier)\n];\n// https://en.wikipedia.org/wiki/VP9\nexport const VP9_LEVEL_TABLE = [\n { maxPictureSize: 36864, maxBitrate: 200000, level: 10 }, // Level 1\n { maxPictureSize: 73728, maxBitrate: 800000, level: 11 }, // Level 1.1\n { maxPictureSize: 122880, maxBitrate: 1800000, level: 20 }, // Level 2\n { maxPictureSize: 245760, maxBitrate: 3600000, level: 21 }, // Level 2.1\n { maxPictureSize: 552960, maxBitrate: 7200000, level: 30 }, // Level 3\n { maxPictureSize: 983040, maxBitrate: 12000000, level: 31 }, // Level 3.1\n { maxPictureSize: 2228224, maxBitrate: 18000000, level: 40 }, // Level 4\n { maxPictureSize: 2228224, maxBitrate: 30000000, level: 41 }, // Level 4.1\n { maxPictureSize: 8912896, maxBitrate: 60000000, level: 50 }, // Level 5\n { maxPictureSize: 8912896, maxBitrate: 120000000, level: 51 }, // Level 5.1\n { maxPictureSize: 8912896, maxBitrate: 180000000, level: 52 }, // Level 5.2\n { maxPictureSize: 35651584, maxBitrate: 180000000, level: 60 }, // Level 6\n { maxPictureSize: 35651584, maxBitrate: 240000000, level: 61 }, // Level 6.1\n { maxPictureSize: 35651584, maxBitrate: 480000000, level: 62 }, // Level 6.2\n];\n// https://en.wikipedia.org/wiki/AV1\nconst AV1_LEVEL_TABLE = [\n { maxPictureSize: 147456, maxBitrate: 1500000, tier: 'M', level: 0 }, // Level 2.0 (Main Tier)\n { maxPictureSize: 278784, maxBitrate: 3000000, tier: 'M', level: 1 }, // Level 2.1 (Main Tier)\n { maxPictureSize: 665856, maxBitrate: 6000000, tier: 'M', level: 4 }, // Level 3.0 (Main Tier)\n { maxPictureSize: 1065024, maxBitrate: 10000000, tier: 'M', level: 5 }, // Level 3.1 (Main Tier)\n { maxPictureSize: 2359296, maxBitrate: 12000000, tier: 'M', level: 8 }, // Level 4.0 (Main Tier)\n { maxPictureSize: 2359296, maxBitrate: 30000000, tier: 'H', level: 8 }, // Level 4.0 (High Tier)\n { maxPictureSize: 2359296, maxBitrate: 20000000, tier: 'M', level: 9 }, // Level 4.1 (Main Tier)\n { maxPictureSize: 2359296, maxBitrate: 50000000, tier: 'H', level: 9 }, // Level 4.1 (High Tier)\n { maxPictureSize: 8912896, maxBitrate: 30000000, tier: 'M', level: 12 }, // Level 5.0 (Main Tier)\n { maxPictureSize: 8912896, maxBitrate: 100000000, tier: 'H', level: 12 }, // Level 5.0 (High Tier)\n { maxPictureSize: 8912896, maxBitrate: 40000000, tier: 'M', level: 13 }, // Level 5.1 (Main Tier)\n { maxPictureSize: 8912896, maxBitrate: 160000000, tier: 'H', level: 13 }, // Level 5.1 (High Tier)\n { maxPictureSize: 8912896, maxBitrate: 60000000, tier: 'M', level: 14 }, // Level 5.2 (Main Tier)\n { maxPictureSize: 8912896, maxBitrate: 240000000, tier: 'H', level: 14 }, // Level 5.2 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 60000000, tier: 'M', level: 15 }, // Level 5.3 (Main Tier)\n { maxPictureSize: 35651584, maxBitrate: 240000000, tier: 'H', level: 15 }, // Level 5.3 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 60000000, tier: 'M', level: 16 }, // Level 6.0 (Main Tier)\n { maxPictureSize: 35651584, maxBitrate: 240000000, tier: 'H', level: 16 }, // Level 6.0 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 100000000, tier: 'M', level: 17 }, // Level 6.1 (Main Tier)\n { maxPictureSize: 35651584, maxBitrate: 480000000, tier: 'H', level: 17 }, // Level 6.1 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 160000000, tier: 'M', level: 18 }, // Level 6.2 (Main Tier)\n { maxPictureSize: 35651584, maxBitrate: 800000000, tier: 'H', level: 18 }, // Level 6.2 (High Tier)\n { maxPictureSize: 35651584, maxBitrate: 160000000, tier: 'M', level: 19 }, // Level 6.3 (Main Tier)\n { maxPictureSize: 35651584, maxBitrate: 800000000, tier: 'H', level: 19 }, // Level 6.3 (High Tier)\n];\nconst VP9_DEFAULT_SUFFIX = '.01.01.01.01.00';\nconst AV1_DEFAULT_SUFFIX = '.0.110.01.01.01.0';\nexport const buildVideoCodecString = (codec, width, height, bitrate) => {\n if (codec === 'avc') {\n const profileIndication = 0x64; // High Profile\n const totalMacroblocks = Math.ceil(width / 16) * Math.ceil(height / 16);\n // Determine the level based on the table\n const levelInfo = AVC_LEVEL_TABLE.find(level => totalMacroblocks <= level.maxMacroblocks && bitrate <= level.maxBitrate) ?? last(AVC_LEVEL_TABLE);\n const levelIndication = levelInfo ? levelInfo.level : 0;\n const hexProfileIndication = profileIndication.toString(16).padStart(2, '0');\n const hexProfileCompatibility = '00';\n const hexLevelIndication = levelIndication.toString(16).padStart(2, '0');\n return `avc1.${hexProfileIndication}${hexProfileCompatibility}${hexLevelIndication}`;\n }\n else if (codec === 'hevc') {\n const profilePrefix = ''; // Profile space 0\n const profileIdc = 1; // Main Profile\n const compatibilityFlags = '6'; // Taken from the example in ISO 14496-15\n const pictureSize = width * height;\n const levelInfo = HEVC_LEVEL_TABLE.find(level => pictureSize <= level.maxPictureSize && bitrate <= level.maxBitrate) ?? last(HEVC_LEVEL_TABLE);\n const constraintFlags = 'B0'; // Progressive source flag\n return 'hev1.'\n + `${profilePrefix}${profileIdc}.`\n + `${compatibilityFlags}.`\n + `${levelInfo.tier}${levelInfo.level}.`\n + `${constraintFlags}`;\n }\n else if (codec === 'vp8') {\n return 'vp8'; // Easy, this one\n }\n else if (codec === 'vp9') {\n const profile = '00'; // Profile 0\n const pictureSize = width * height;\n const levelInfo = VP9_LEVEL_TABLE.find(level => pictureSize <= level.maxPictureSize && bitrate <= level.maxBitrate) ?? last(VP9_LEVEL_TABLE);\n const bitDepth = '08'; // 8-bit\n return `vp09.${profile}.${levelInfo.level.toString().padStart(2, '0')}.${bitDepth}`;\n }\n else if (codec === 'av1') {\n const profile = 0; // Main Profile, single digit\n const pictureSize = width * height;\n const levelInfo = AV1_LEVEL_TABLE.find(level => pictureSize <= level.maxPictureSize && bitrate <= level.maxBitrate) ?? last(AV1_LEVEL_TABLE);\n const level = levelInfo.level.toString().padStart(2, '0');\n const bitDepth = '08'; // 8-bit\n return `av01.${profile}.${level}${levelInfo.tier}.${bitDepth}`;\n }\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n throw new TypeError(`Unhandled codec '${codec}'.`);\n};\nexport const generateVp9CodecConfigurationFromCodecString = (codecString) => {\n // Reference: https://www.webmproject.org/docs/container/#vp9-codec-feature-metadata-codecprivate\n const parts = codecString.split('.'); // We can derive the required values from the codec string\n const profile = Number(parts[1]);\n const level = Number(parts[2]);\n const bitDepth = Number(parts[3]);\n const chromaSubsampling = parts[4] ? Number(parts[4]) : 1;\n return [\n 1, 1, profile,\n 2, 1, level,\n 3, 1, bitDepth,\n 4, 1, chromaSubsampling,\n ];\n};\nexport const generateAv1CodecConfigurationFromCodecString = (codecString) => {\n // Reference: https://aomediacodec.github.io/av1-isobmff/\n const parts = codecString.split('.'); // We can derive the required values from the codec string\n const marker = 1;\n const version = 1;\n const firstByte = (marker << 7) + version;\n const profile = Number(parts[1]);\n const levelAndTier = parts[2];\n const level = Number(levelAndTier.slice(0, -1));\n const secondByte = (profile << 5) + level;\n const tier = levelAndTier.slice(-1) === 'H' ? 1 : 0;\n const bitDepth = Number(parts[3]);\n const highBitDepth = bitDepth === 8 ? 0 : 1;\n const twelveBit = 0;\n const monochrome = parts[4] ? Number(parts[4]) : 0;\n const chromaSubsamplingX = parts[5] ? Number(parts[5][0]) : 1;\n const chromaSubsamplingY = parts[5] ? Number(parts[5][1]) : 1;\n const chromaSamplePosition = parts[5] ? Number(parts[5][2]) : 0; // CSP_UNKNOWN\n const thirdByte = (tier << 7)\n + (highBitDepth << 6)\n + (twelveBit << 5)\n + (monochrome << 4)\n + (chromaSubsamplingX << 3)\n + (chromaSubsamplingY << 2)\n + chromaSamplePosition;\n const initialPresentationDelayPresent = 0; // Should be fine\n const fourthByte = initialPresentationDelayPresent;\n return [firstByte, secondByte, thirdByte, fourthByte];\n};\nexport const extractVideoCodecString = (trackInfo) => {\n const { codec, codecDescription, colorSpace, avcCodecInfo, hevcCodecInfo, vp9CodecInfo, av1CodecInfo } = trackInfo;\n if (codec === 'avc') {\n if (avcCodecInfo) {\n const bytes = new Uint8Array([\n avcCodecInfo.avcProfileIndication,\n avcCodecInfo.profileCompatibility,\n avcCodecInfo.avcLevelIndication,\n ]);\n return `avc1.${bytesToHexString(bytes)}`;\n }\n if (!codecDescription || codecDescription.byteLength < 4) {\n throw new TypeError('AVC decoder description is not provided or is not at least 4 bytes long.');\n }\n return `avc1.${bytesToHexString(codecDescription.subarray(1, 4))}`;\n }\n else if (codec === 'hevc') {\n let generalProfileSpace;\n let generalProfileIdc;\n let compatibilityFlags;\n let generalTierFlag;\n let generalLevelIdc;\n let constraintFlags;\n if (hevcCodecInfo) {\n generalProfileSpace = hevcCodecInfo.generalProfileSpace;\n generalProfileIdc = hevcCodecInfo.generalProfileIdc;\n compatibilityFlags = reverseBitsU32(hevcCodecInfo.generalProfileCompatibilityFlags);\n generalTierFlag = hevcCodecInfo.generalTierFlag;\n generalLevelIdc = hevcCodecInfo.generalLevelIdc;\n constraintFlags = [...hevcCodecInfo.generalConstraintIndicatorFlags];\n }\n else {\n if (!codecDescription || codecDescription.byteLength < 23) {\n throw new TypeError('HEVC decoder description is not provided or is not at least 23 bytes long.');\n }\n const view = toDataView(codecDescription);\n const profileByte = view.getUint8(1);\n generalProfileSpace = (profileByte >> 6) & 0x03;\n generalProfileIdc = profileByte & 0x1F;\n compatibilityFlags = reverseBitsU32(view.getUint32(2));\n generalTierFlag = (profileByte >> 5) & 0x01;\n generalLevelIdc = view.getUint8(12);\n constraintFlags = [];\n for (let i = 0; i < 6; i++) {\n constraintFlags.push(view.getUint8(6 + i));\n }\n }\n let codecString = 'hev1.';\n codecString += ['', 'A', 'B', 'C'][generalProfileSpace] + generalProfileIdc;\n codecString += '.';\n codecString += compatibilityFlags.toString(16).toUpperCase();\n codecString += '.';\n codecString += generalTierFlag === 0 ? 'L' : 'H';\n codecString += generalLevelIdc;\n while (constraintFlags.length > 0 && constraintFlags[constraintFlags.length - 1] === 0) {\n constraintFlags.pop();\n }\n if (constraintFlags.length > 0) {\n codecString += '.';\n codecString += constraintFlags.map(x => x.toString(16).toUpperCase()).join('.');\n }\n return codecString;\n }\n else if (codec === 'vp8') {\n return 'vp8'; // Easy, this one\n }\n else if (codec === 'vp9') {\n if (!vp9CodecInfo) {\n // Calculate level based on dimensions\n const pictureSize = trackInfo.width * trackInfo.height;\n let level = last(VP9_LEVEL_TABLE).level; // Default to highest level\n for (const entry of VP9_LEVEL_TABLE) {\n if (pictureSize <= entry.maxPictureSize) {\n level = entry.level;\n break;\n }\n }\n // We don't really know better, so let's return a general-purpose, common codec string and hope for the best\n return `vp09.00.${level.toString().padStart(2, '0')}.08`;\n }\n const profile = vp9CodecInfo.profile.toString().padStart(2, '0');\n const level = vp9CodecInfo.level.toString().padStart(2, '0');\n const bitDepth = vp9CodecInfo.bitDepth.toString().padStart(2, '0');\n const chromaSubsampling = vp9CodecInfo.chromaSubsampling.toString().padStart(2, '0');\n const colourPrimaries = vp9CodecInfo.colourPrimaries.toString().padStart(2, '0');\n const transferCharacteristics = vp9CodecInfo.transferCharacteristics.toString().padStart(2, '0');\n const matrixCoefficients = vp9CodecInfo.matrixCoefficients.toString().padStart(2, '0');\n const videoFullRangeFlag = vp9CodecInfo.videoFullRangeFlag.toString().padStart(2, '0');\n let string = `vp09.${profile}.${level}.${bitDepth}.${chromaSubsampling}`;\n string += `.${colourPrimaries}.${transferCharacteristics}.${matrixCoefficients}.${videoFullRangeFlag}`;\n if (string.endsWith(VP9_DEFAULT_SUFFIX)) {\n string = string.slice(0, -VP9_DEFAULT_SUFFIX.length);\n }\n return string;\n }\n else if (codec === 'av1') {\n if (!av1CodecInfo) {\n // Calculate level based on dimensions\n const pictureSize = trackInfo.width * trackInfo.height;\n let level = last(VP9_LEVEL_TABLE).level; // Default to highest level\n for (const entry of VP9_LEVEL_TABLE) {\n if (pictureSize <= entry.maxPictureSize) {\n level = entry.level;\n break;\n }\n }\n // We don't really know better, so let's return a general-purpose, common codec string and hope for the best\n return `av01.0.${level.toString().padStart(2, '0')}M.08`;\n }\n // https://aomediacodec.github.io/av1-isobmff/#codecsparam\n const profile = av1CodecInfo.profile; // Single digit\n const level = av1CodecInfo.level.toString().padStart(2, '0');\n const tier = av1CodecInfo.tier ? 'H' : 'M';\n const bitDepth = av1CodecInfo.bitDepth.toString().padStart(2, '0');\n const monochrome = av1CodecInfo.monochrome ? '1' : '0';\n const chromaSubsampling = 100 * av1CodecInfo.chromaSubsamplingX\n + 10 * av1CodecInfo.chromaSubsamplingY\n + 1 * (av1CodecInfo.chromaSubsamplingX && av1CodecInfo.chromaSubsamplingY\n ? av1CodecInfo.chromaSamplePosition\n : 0);\n // The defaults are 1 (ITU-R BT.709)\n const colorPrimaries = colorSpace?.primaries ? COLOR_PRIMARIES_MAP[colorSpace.primaries] : 1;\n const transferCharacteristics = colorSpace?.transfer ? TRANSFER_CHARACTERISTICS_MAP[colorSpace.transfer] : 1;\n const matrixCoefficients = colorSpace?.matrix ? MATRIX_COEFFICIENTS_MAP[colorSpace.matrix] : 1;\n const videoFullRangeFlag = colorSpace?.fullRange ? 1 : 0;\n let string = `av01.${profile}.${level}${tier}.${bitDepth}`;\n string += `.${monochrome}.${chromaSubsampling.toString().padStart(3, '0')}`;\n string += `.${colorPrimaries.toString().padStart(2, '0')}`;\n string += `.${transferCharacteristics.toString().padStart(2, '0')}`;\n string += `.${matrixCoefficients.toString().padStart(2, '0')}`;\n string += `.${videoFullRangeFlag}`;\n if (string.endsWith(AV1_DEFAULT_SUFFIX)) {\n string = string.slice(0, -AV1_DEFAULT_SUFFIX.length);\n }\n return string;\n }\n throw new TypeError(`Unhandled codec '${codec}'.`);\n};\nexport const buildAudioCodecString = (codec, numberOfChannels, sampleRate) => {\n if (codec === 'aac') {\n // If stereo or higher channels and lower sample rate, likely using HE-AAC v2 with PS\n if (numberOfChannels >= 2 && sampleRate <= 24000) {\n return 'mp4a.40.29'; // HE-AAC v2 (AAC LC + SBR + PS)\n }\n // If sample rate is low, likely using HE-AAC v1 with SBR\n if (sampleRate <= 24000) {\n return 'mp4a.40.5'; // HE-AAC v1 (AAC LC + SBR)\n }\n // Default to standard AAC-LC for higher sample rates\n return 'mp4a.40.2'; // AAC-LC\n }\n else if (codec === 'mp3') {\n return 'mp3';\n }\n else if (codec === 'opus') {\n return 'opus';\n }\n else if (codec === 'vorbis') {\n return 'vorbis';\n }\n else if (codec === 'flac') {\n return 'flac';\n }\n else if (PCM_AUDIO_CODECS.includes(codec)) {\n return codec;\n }\n throw new TypeError(`Unhandled codec '${codec}'.`);\n};\nexport const extractAudioCodecString = (trackInfo) => {\n const { codec, codecDescription, aacCodecInfo } = trackInfo;\n if (codec === 'aac') {\n if (!aacCodecInfo) {\n throw new TypeError('AAC codec info must be provided.');\n }\n if (aacCodecInfo.isMpeg2) {\n return 'mp4a.67';\n }\n else {\n const audioSpecificConfig = parseAacAudioSpecificConfig(codecDescription);\n return `mp4a.40.${audioSpecificConfig.objectType}`;\n }\n }\n else if (codec === 'mp3') {\n return 'mp3';\n }\n else if (codec === 'opus') {\n return 'opus';\n }\n else if (codec === 'vorbis') {\n return 'vorbis';\n }\n else if (codec === 'flac') {\n return 'flac';\n }\n else if (codec && PCM_AUDIO_CODECS.includes(codec)) {\n return codec;\n }\n throw new TypeError(`Unhandled codec '${codec}'.`);\n};\nexport const parseAacAudioSpecificConfig = (bytes) => {\n if (!bytes || bytes.byteLength < 2) {\n throw new TypeError('AAC description must be at least 2 bytes long.');\n }\n const bitstream = new Bitstream(bytes);\n let objectType = bitstream.readBits(5);\n if (objectType === 31) {\n objectType = 32 + bitstream.readBits(6);\n }\n const frequencyIndex = bitstream.readBits(4);\n let sampleRate = null;\n if (frequencyIndex === 15) {\n sampleRate = bitstream.readBits(24);\n }\n else {\n const freqTable = [\n 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,\n 16000, 12000, 11025, 8000, 7350,\n ];\n if (frequencyIndex < freqTable.length) {\n sampleRate = freqTable[frequencyIndex];\n }\n }\n const channelConfiguration = bitstream.readBits(4);\n let numberOfChannels = null;\n if (channelConfiguration >= 1 && channelConfiguration <= 7) {\n const channelMap = {\n 1: 1,\n 2: 2,\n 3: 3,\n 4: 4,\n 5: 5,\n 6: 6,\n 7: 8,\n };\n numberOfChannels = channelMap[channelConfiguration];\n }\n return {\n objectType,\n frequencyIndex,\n sampleRate,\n channelConfiguration,\n numberOfChannels,\n };\n};\nexport const OPUS_INTERNAL_SAMPLE_RATE = 48000;\nconst PCM_CODEC_REGEX = /^pcm-([usf])(\\d+)+(be)?$/;\nexport const parsePcmCodec = (codec) => {\n assert(PCM_AUDIO_CODECS.includes(codec));\n if (codec === 'ulaw') {\n return { dataType: 'ulaw', sampleSize: 1, littleEndian: true, silentValue: 255 };\n }\n else if (codec === 'alaw') {\n return { dataType: 'alaw', sampleSize: 1, littleEndian: true, silentValue: 213 };\n }\n const match = PCM_CODEC_REGEX.exec(codec);\n assert(match);\n let dataType;\n if (match[1] === 'u') {\n dataType = 'unsigned';\n }\n else if (match[1] === 's') {\n dataType = 'signed';\n }\n else {\n dataType = 'float';\n }\n const sampleSize = (Number(match[2]) / 8);\n const littleEndian = match[3] !== 'be';\n const silentValue = codec === 'pcm-u8' ? 2 ** 7 : 0;\n return { dataType, sampleSize, littleEndian, silentValue };\n};\nexport const inferCodecFromCodecString = (codecString) => {\n // Video codecs\n if (codecString.startsWith('avc1') || codecString.startsWith('avc3')) {\n return 'avc';\n }\n else if (codecString.startsWith('hev1') || codecString.startsWith('hvc1')) {\n return 'hevc';\n }\n else if (codecString === 'vp8') {\n return 'vp8';\n }\n else if (codecString.startsWith('vp09')) {\n return 'vp9';\n }\n else if (codecString.startsWith('av01')) {\n return 'av1';\n }\n // Audio codecs\n if (codecString.startsWith('mp4a.40') || codecString === 'mp4a.67') {\n return 'aac';\n }\n else if (codecString === 'mp3'\n || codecString === 'mp4a.69'\n || codecString === 'mp4a.6B'\n || codecString === 'mp4a.6b') {\n return 'mp3';\n }\n else if (codecString === 'opus') {\n return 'opus';\n }\n else if (codecString === 'vorbis') {\n return 'vorbis';\n }\n else if (codecString === 'flac') {\n return 'flac';\n }\n else if (codecString === 'ulaw') {\n return 'ulaw';\n }\n else if (codecString === 'alaw') {\n return 'alaw';\n }\n else if (PCM_CODEC_REGEX.test(codecString)) {\n return codecString;\n }\n // Subtitle codecs\n if (codecString === 'webvtt') {\n return 'webvtt';\n }\n return null;\n};\nexport const getVideoEncoderConfigExtension = (codec) => {\n if (codec === 'avc') {\n return {\n avc: {\n format: 'avc', // Ensure the format is not Annex B\n },\n };\n }\n else if (codec === 'hevc') {\n return {\n hevc: {\n format: 'hevc', // Ensure the format is not Annex B\n },\n };\n }\n return {};\n};\nexport const getAudioEncoderConfigExtension = (codec) => {\n if (codec === 'aac') {\n return {\n aac: {\n format: 'aac', // Ensure the format is not ADTS\n },\n };\n }\n else if (codec === 'opus') {\n return {\n opus: {\n format: 'opus',\n },\n };\n }\n return {};\n};\n/**\n * Represents a subjective media quality level.\n * @public\n */\nexport class Quality {\n /** @internal */\n constructor(factor) {\n this._factor = factor;\n }\n /** @internal */\n _toVideoBitrate(codec, width, height) {\n const pixels = width * height;\n const codecEfficiencyFactors = {\n avc: 1.0, // H.264/AVC (baseline)\n hevc: 0.6, // H.265/HEVC (~40% more efficient than AVC)\n vp9: 0.6, // Similar to HEVC\n av1: 0.4, // ~60% more efficient than AVC\n vp8: 1.2, // Slightly less efficient than AVC\n };\n const referencePixels = 1920 * 1080;\n const referenceBitrate = 3000000;\n const scaleFactor = Math.pow(pixels / referencePixels, 0.95); // Slight non-linear scaling\n const baseBitrate = referenceBitrate * scaleFactor;\n const codecAdjustedBitrate = baseBitrate * codecEfficiencyFactors[codec];\n const finalBitrate = codecAdjustedBitrate * this._factor;\n return Math.ceil(finalBitrate / 1000) * 1000;\n }\n /** @internal */\n _toAudioBitrate(codec) {\n if (PCM_AUDIO_CODECS.includes(codec) || codec === 'flac') {\n return undefined;\n }\n const baseRates = {\n aac: 128000, // 128kbps base for AAC\n opus: 64000, // 64kbps base for Opus\n mp3: 160000, // 160kbps base for MP3\n vorbis: 64000, // 64kbps base for Vorbis\n };\n const baseBitrate = baseRates[codec];\n if (!baseBitrate) {\n throw new Error(`Unhandled codec: ${codec}`);\n }\n let finalBitrate = baseBitrate * this._factor;\n if (codec === 'aac') {\n // AAC only works with specific bitrates, let's find the closest\n const validRates = [96000, 128000, 160000, 192000];\n finalBitrate = validRates.reduce((prev, curr) => Math.abs(curr - finalBitrate) < Math.abs(prev - finalBitrate) ? curr : prev);\n }\n else if (codec === 'opus' || codec === 'vorbis') {\n finalBitrate = Math.max(6000, finalBitrate);\n }\n else if (codec === 'mp3') {\n const validRates = [\n 8000, 16000, 24000, 32000, 40000, 48000, 64000, 80000,\n 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000,\n ];\n finalBitrate = validRates.reduce((prev, curr) => Math.abs(curr - finalBitrate) < Math.abs(prev - finalBitrate) ? curr : prev);\n }\n return Math.round(finalBitrate / 1000) * 1000;\n }\n}\n/**\n * Represents a very low media quality.\n * @public\n */\nexport const QUALITY_VERY_LOW = new Quality(0.3);\n/**\n * Represents a low media quality.\n * @public\n */\nexport const QUALITY_LOW = new Quality(0.6);\n/**\n * Represents a medium media quality.\n * @public\n */\nexport const QUALITY_MEDIUM = new Quality(1);\n/**\n * Represents a high media quality.\n * @public\n */\nexport const QUALITY_HIGH = new Quality(2);\n/**\n * Represents a very high media quality.\n * @public\n */\nexport const QUALITY_VERY_HIGH = new Quality(4);\nconst VALID_VIDEO_CODEC_STRING_PREFIXES = ['avc1', 'avc3', 'hev1', 'hvc1', 'vp8', 'vp09', 'av01'];\nconst AVC_CODEC_STRING_REGEX = /^(avc1|avc3)\\.[0-9a-fA-F]{6}$/;\nconst HEVC_CODEC_STRING_REGEX = /^(hev1|hvc1)\\.(?:[ABC]?\\d+)\\.[0-9a-fA-F]{1,8}\\.[LH]\\d+(?:\\.[0-9a-fA-F]{1,2}){0,6}$/;\nconst VP9_CODEC_STRING_REGEX = /^vp09(?:\\.\\d{2}){3}(?:(?:\\.\\d{2}){5})?$/;\nconst AV1_CODEC_STRING_REGEX = /^av01\\.\\d\\.\\d{2}[MH]\\.\\d{2}(?:\\.\\d\\.\\d{3}\\.\\d{2}\\.\\d{2}\\.\\d{2}\\.\\d)?$/;\nexport const validateVideoChunkMetadata = (metadata) => {\n if (!metadata) {\n throw new TypeError('Video chunk metadata must be provided.');\n }\n if (typeof metadata !== 'object') {\n throw new TypeError('Video chunk metadata must be an object.');\n }\n if (!metadata.decoderConfig) {\n throw new TypeError('Video chunk metadata must include a decoder configuration.');\n }\n if (typeof metadata.decoderConfig !== 'object') {\n throw new TypeError('Video chunk metadata decoder configuration must be an object.');\n }\n if (typeof metadata.decoderConfig.codec !== 'string') {\n throw new TypeError('Video chunk metadata decoder configuration must specify a codec string.');\n }\n if (!VALID_VIDEO_CODEC_STRING_PREFIXES.some(prefix => metadata.decoderConfig.codec.startsWith(prefix))) {\n throw new TypeError('Video chunk metadata decoder configuration codec string must be a valid video codec string as specified in'\n + ' the WebCodecs Codec Registry.');\n }\n if (!Number.isInteger(metadata.decoderConfig.codedWidth) || metadata.decoderConfig.codedWidth <= 0) {\n throw new TypeError('Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).');\n }\n if (!Number.isInteger(metadata.decoderConfig.codedHeight) || metadata.decoderConfig.codedHeight <= 0) {\n throw new TypeError('Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).');\n }\n if (metadata.decoderConfig.description !== undefined) {\n if (!isAllowSharedBufferSource(metadata.decoderConfig.description)) {\n throw new TypeError('Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an'\n + ' ArrayBuffer view.');\n }\n }\n if (metadata.decoderConfig.colorSpace !== undefined) {\n const { colorSpace } = metadata.decoderConfig;\n if (typeof colorSpace !== 'object') {\n throw new TypeError('Video chunk metadata decoder configuration colorSpace, when provided, must be an object.');\n }\n const primariesValues = Object.keys(COLOR_PRIMARIES_MAP);\n if (colorSpace.primaries != null && !primariesValues.includes(colorSpace.primaries)) {\n throw new TypeError(`Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of`\n + ` ${primariesValues.join(', ')}.`);\n }\n const transferValues = Object.keys(TRANSFER_CHARACTERISTICS_MAP);\n if (colorSpace.transfer != null && !transferValues.includes(colorSpace.transfer)) {\n throw new TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of`\n + ` ${transferValues.join(', ')}.`);\n }\n const matrixValues = Object.keys(MATRIX_COEFFICIENTS_MAP);\n if (colorSpace.matrix != null && !matrixValues.includes(colorSpace.matrix)) {\n throw new TypeError(`Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of`\n + ` ${matrixValues.join(', ')}.`);\n }\n if (colorSpace.fullRange != null && typeof colorSpace.fullRange !== 'boolean') {\n throw new TypeError('Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.');\n }\n }\n if (metadata.decoderConfig.codec.startsWith('avc1') || metadata.decoderConfig.codec.startsWith('avc3')) {\n // AVC-specific validation\n if (!AVC_CODEC_STRING_REGEX.test(metadata.decoderConfig.codec)) {\n throw new TypeError('Video chunk metadata decoder configuration codec string for AVC must be a valid AVC codec string as'\n + ' specified in Section 3.4 of RFC 6381.');\n }\n // `description` may or may not be set, depending on if the format is AVCC or Annex B, so don't perform any\n // validation for it.\n // https://www.w3.org/TR/webcodecs-avc-codec-registration\n }\n else if (metadata.decoderConfig.codec.startsWith('hev1') || metadata.decoderConfig.codec.startsWith('hvc1')) {\n // HEVC-specific validation\n if (!HEVC_CODEC_STRING_REGEX.test(metadata.decoderConfig.codec)) {\n throw new TypeError('Video chunk metadata decoder configuration codec string for HEVC must be a valid HEVC codec string as'\n + ' specified in Section E.3 of ISO 14496-15.');\n }\n // `description` may or may not be set, depending on if the format is HEVC or Annex B, so don't perform any\n // validation for it.\n // https://www.w3.org/TR/webcodecs-hevc-codec-registration\n }\n else if (metadata.decoderConfig.codec.startsWith('vp8')) {\n // VP8-specific validation\n if (metadata.decoderConfig.codec !== 'vp8') {\n throw new TypeError('Video chunk metadata decoder configuration codec string for VP8 must be \"vp8\".');\n }\n }\n else if (metadata.decoderConfig.codec.startsWith('vp09')) {\n // VP9-specific validation\n if (!VP9_CODEC_STRING_REGEX.test(metadata.decoderConfig.codec)) {\n throw new TypeError('Video chunk metadata decoder configuration codec string for VP9 must be a valid VP9 codec string as'\n + ' specified in Section \"Codecs Parameter String\" of https://www.webmproject.org/vp9/mp4/.');\n }\n }\n else if (metadata.decoderConfig.codec.startsWith('av01')) {\n // AV1-specific validation\n if (!AV1_CODEC_STRING_REGEX.test(metadata.decoderConfig.codec)) {\n throw new TypeError('Video chunk metadata decoder configuration codec string for AV1 must be a valid AV1 codec string as'\n + ' specified in Section \"Codecs Parameter String\" of https://aomediacodec.github.io/av1-isobmff/.');\n }\n }\n};\nconst VALID_AUDIO_CODEC_STRING_PREFIXES = ['mp4a', 'mp3', 'opus', 'vorbis', 'flac', 'ulaw', 'alaw', 'pcm'];\nexport const validateAudioChunkMetadata = (metadata) => {\n if (!metadata) {\n throw new TypeError('Audio chunk metadata must be provided.');\n }\n if (typeof metadata !== 'object') {\n throw new TypeError('Audio chunk metadata must be an object.');\n }\n if (!metadata.decoderConfig) {\n throw new TypeError('Audio chunk metadata must include a decoder configuration.');\n }\n if (typeof metadata.decoderConfig !== 'object') {\n throw new TypeError('Audio chunk metadata decoder configuration must be an object.');\n }\n if (typeof metadata.decoderConfig.codec !== 'string') {\n throw new TypeError('Audio chunk metadata decoder configuration must specify a codec string.');\n }\n if (!VALID_AUDIO_CODEC_STRING_PREFIXES.some(prefix => metadata.decoderConfig.codec.startsWith(prefix))) {\n throw new TypeError('Audio chunk metadata decoder configuration codec string must be a valid audio codec string as specified in'\n + ' the WebCodecs Codec Registry.');\n }\n if (!Number.isInteger(metadata.decoderConfig.sampleRate) || metadata.decoderConfig.sampleRate <= 0) {\n throw new TypeError('Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).');\n }\n if (!Number.isInteger(metadata.decoderConfig.numberOfChannels) || metadata.decoderConfig.numberOfChannels <= 0) {\n throw new TypeError('Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).');\n }\n if (metadata.decoderConfig.description !== undefined) {\n if (!isAllowSharedBufferSource(metadata.decoderConfig.description)) {\n throw new TypeError('Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an'\n + ' ArrayBuffer view.');\n }\n }\n if (metadata.decoderConfig.codec.startsWith('mp4a')\n // These three refer to MP3:\n && metadata.decoderConfig.codec !== 'mp4a.69'\n && metadata.decoderConfig.codec !== 'mp4a.6B'\n && metadata.decoderConfig.codec !== 'mp4a.6b') {\n // AAC-specific validation\n const validStrings = ['mp4a.40.2', 'mp4a.40.02', 'mp4a.40.5', 'mp4a.40.05', 'mp4a.40.29', 'mp4a.67'];\n if (!validStrings.includes(metadata.decoderConfig.codec)) {\n throw new TypeError('Audio chunk metadata decoder configuration codec string for AAC must be a valid AAC codec string as'\n + ' specified in https://www.w3.org/TR/webcodecs-aac-codec-registration/.');\n }\n if (!metadata.decoderConfig.description) {\n throw new TypeError('Audio chunk metadata decoder configuration for AAC must include a description, which is expected to be'\n + ' an AudioSpecificConfig as specified in ISO 14496-3.');\n }\n }\n else if (metadata.decoderConfig.codec.startsWith('mp3') || metadata.decoderConfig.codec.startsWith('mp4a')) {\n // MP3-specific validation\n if (metadata.decoderConfig.codec !== 'mp3'\n && metadata.decoderConfig.codec !== 'mp4a.69'\n && metadata.decoderConfig.codec !== 'mp4a.6B'\n && metadata.decoderConfig.codec !== 'mp4a.6b') {\n throw new TypeError('Audio chunk metadata decoder configuration codec string for MP3 must be \"mp3\", \"mp4a.69\" or'\n + ' \"mp4a.6B\".');\n }\n }\n else if (metadata.decoderConfig.codec.startsWith('opus')) {\n // Opus-specific validation\n if (metadata.decoderConfig.codec !== 'opus') {\n throw new TypeError('Audio chunk metadata decoder configuration codec string for Opus must be \"opus\".');\n }\n if (metadata.decoderConfig.description && metadata.decoderConfig.description.byteLength < 18) {\n // Description is optional for Opus per-spec, so we shouldn't enforce it\n throw new TypeError('Audio chunk metadata decoder configuration description, when specified, is expected to be an'\n + ' Identification Header as specified in Section 5.1 of RFC 7845.');\n }\n }\n else if (metadata.decoderConfig.codec.startsWith('vorbis')) {\n // Vorbis-specific validation\n if (metadata.decoderConfig.codec !== 'vorbis') {\n throw new TypeError('Audio chunk metadata decoder configuration codec string for Vorbis must be \"vorbis\".');\n }\n if (!metadata.decoderConfig.description) {\n throw new TypeError('Audio chunk metadata decoder configuration for Vorbis must include a description, which is expected to'\n + ' adhere to the format described in https://www.w3.org/TR/webcodecs-vorbis-codec-registration/.');\n }\n }\n else if (metadata.decoderConfig.codec.startsWith('flac')) {\n // FLAC-specific validation\n if (metadata.decoderConfig.codec !== 'flac') {\n throw new TypeError('Audio chunk metadata decoder configuration codec string for FLAC must be \"flac\".');\n }\n const minDescriptionSize = 4 + 4 + 34; // 'fLaC' + metadata block header + STREAMINFO block\n if (!metadata.decoderConfig.description || metadata.decoderConfig.description.byteLength < minDescriptionSize) {\n throw new TypeError('Audio chunk metadata decoder configuration for FLAC must include a description, which is expected to'\n + ' adhere to the format described in https://www.w3.org/TR/webcodecs-flac-codec-registration/.');\n }\n }\n else if (metadata.decoderConfig.codec.startsWith('pcm')\n || metadata.decoderConfig.codec.startsWith('ulaw')\n || metadata.decoderConfig.codec.startsWith('alaw')) {\n // PCM-specific validation\n if (!PCM_AUDIO_CODECS.includes(metadata.decoderConfig.codec)) {\n throw new TypeError('Audio chunk metadata decoder configuration codec string for PCM must be one of the supported PCM'\n + ` codecs (${PCM_AUDIO_CODECS.join(', ')}).`);\n }\n }\n};\nexport const validateSubtitleMetadata = (metadata) => {\n if (!metadata) {\n throw new TypeError('Subtitle metadata must be provided.');\n }\n if (typeof metadata !== 'object') {\n throw new TypeError('Subtitle metadata must be an object.');\n }\n if (!metadata.config) {\n throw new TypeError('Subtitle metadata must include a config object.');\n }\n if (typeof metadata.config !== 'object') {\n throw new TypeError('Subtitle metadata config must be an object.');\n }\n if (typeof metadata.config.description !== 'string') {\n throw new TypeError('Subtitle metadata config description must be a string.');\n }\n};\n/**\n * Checks if the browser is able to encode the given codec.\n * @public\n */\nexport const canEncode = (codec) => {\n if (VIDEO_CODECS.includes(codec)) {\n return canEncodeVideo(codec);\n }\n else if (AUDIO_CODECS.includes(codec)) {\n return canEncodeAudio(codec);\n }\n else if (SUBTITLE_CODECS.includes(codec)) {\n return canEncodeSubtitles(codec);\n }\n throw new TypeError(`Unknown codec '${codec}'.`);\n};\n/**\n * Checks if the browser is able to encode the given video codec with the given parameters.\n * @public\n */\nexport const canEncodeVideo = async (codec, { width = 1280, height = 720, bitrate = 1e6 } = {}) => {\n if (!VIDEO_CODECS.includes(codec)) {\n return false;\n }\n if (!Number.isInteger(width) || width <= 0) {\n throw new TypeError('width must be a positive integer.');\n }\n if (!Number.isInteger(height) || height <= 0) {\n throw new TypeError('height must be a positive integer.');\n }\n if (!(bitrate instanceof Quality) && (!Number.isInteger(bitrate) || bitrate <= 0)) {\n throw new TypeError('bitrate must be a positive integer or a quality.');\n }\n const resolvedBitrate = bitrate instanceof Quality\n ? bitrate._toVideoBitrate(codec, width, height)\n : bitrate;\n if (customVideoEncoders.length > 0) {\n const encoderConfig = {\n codec: buildVideoCodecString(codec, width, height, resolvedBitrate),\n width,\n height,\n bitrate: resolvedBitrate,\n ...getVideoEncoderConfigExtension(codec),\n };\n if (customVideoEncoders.some(x => x.supports(codec, encoderConfig))) {\n // There's a custom encoder\n return true;\n }\n }\n if (typeof VideoEncoder === 'undefined') {\n return false;\n }\n const support = await VideoEncoder.isConfigSupported({\n codec: buildVideoCodecString(codec, width, height, resolvedBitrate),\n width,\n height,\n bitrate: resolvedBitrate,\n ...getVideoEncoderConfigExtension(codec),\n });\n return support.supported === true;\n};\n/**\n * Checks if the browser is able to encode the given audio codec with the given parameters.\n * @public\n */\nexport const canEncodeAudio = async (codec, { numberOfChannels = 2, sampleRate = 48000, bitrate = 128e3 } = {}) => {\n if (!AUDIO_CODECS.includes(codec)) {\n return false;\n }\n if (!Number.isInteger(numberOfChannels) || numberOfChannels <= 0) {\n throw new TypeError('numberOfChannels must be a positive integer.');\n }\n if (!Number.isInteger(sampleRate) || sampleRate <= 0) {\n throw new TypeError('sampleRate must be a positive integer.');\n }\n if (!(bitrate instanceof Quality) && (!Number.isInteger(bitrate) || bitrate <= 0)) {\n throw new TypeError('bitrate must be a positive integer.');\n }\n const resolvedBitrate = bitrate instanceof Quality\n ? bitrate._toAudioBitrate(codec)\n : bitrate;\n if (customAudioEncoders.length > 0) {\n const encoderConfig = {\n codec: buildAudioCodecString(codec, numberOfChannels, sampleRate),\n numberOfChannels,\n sampleRate,\n bitrate: resolvedBitrate,\n ...getAudioEncoderConfigExtension(codec),\n };\n if (customAudioEncoders.some(x => x.supports(codec, encoderConfig))) {\n // There's a custom encoder\n return true;\n }\n }\n if (PCM_AUDIO_CODECS.includes(codec)) {\n return true; // Because we encode these ourselves\n }\n if (typeof AudioEncoder === 'undefined') {\n return false;\n }\n const support = await AudioEncoder.isConfigSupported({\n codec: buildAudioCodecString(codec, numberOfChannels, sampleRate),\n numberOfChannels,\n sampleRate,\n bitrate: resolvedBitrate,\n ...getAudioEncoderConfigExtension(codec),\n });\n return support.supported === true;\n};\n/**\n * Checks if the browser is able to encode the given subtitle codec.\n * @public\n */\nexport const canEncodeSubtitles = async (codec) => {\n if (!SUBTITLE_CODECS.includes(codec)) {\n return false;\n }\n return true;\n};\n/**\n * Returns the list of all media codecs that can be encoded by the browser.\n * @public\n */\nexport const getEncodableCodecs = async () => {\n const [videoCodecs, audioCodecs, subtitleCodecs] = await Promise.all([\n getEncodableVideoCodecs(),\n getEncodableAudioCodecs(),\n getEncodableSubtitleCodecs(),\n ]);\n return [...videoCodecs, ...audioCodecs, ...subtitleCodecs];\n};\n/**\n * Returns the list of all video codecs that can be encoded by the browser.\n * @public\n */\nexport const getEncodableVideoCodecs = async (checkedCodecs = VIDEO_CODECS, options) => {\n const bools = await Promise.all(checkedCodecs.map(codec => canEncodeVideo(codec, options)));\n return checkedCodecs.filter((_, i) => bools[i]);\n};\n/**\n * Returns the list of all audio codecs that can be encoded by the browser.\n * @public\n */\nexport const getEncodableAudioCodecs = async (checkedCodecs = AUDIO_CODECS, options) => {\n const bools = await Promise.all(checkedCodecs.map(codec => canEncodeAudio(codec, options)));\n return checkedCodecs.filter((_, i) => bools[i]);\n};\n/**\n * Returns the list of all subtitle codecs that can be encoded by the browser.\n * @public\n */\nexport const getEncodableSubtitleCodecs = async (checkedCodecs = SUBTITLE_CODECS) => {\n const bools = await Promise.all(checkedCodecs.map(canEncodeSubtitles));\n return checkedCodecs.filter((_, i) => bools[i]);\n};\n/**\n * Returns the first video codec from the given list that can be encoded by the browser.\n * @public\n */\nexport const getFirstEncodableVideoCodec = async (checkedCodecs, options) => {\n for (const codec of checkedCodecs) {\n if (await canEncodeVideo(codec, options)) {\n return codec;\n }\n }\n return null;\n};\n/**\n * Returns the first audio codec from the given list that can be encoded by the browser.\n * @public\n */\nexport const getFirstEncodableAudioCodec = async (checkedCodecs, options) => {\n for (const codec of checkedCodecs) {\n if (await canEncodeAudio(codec, options)) {\n return codec;\n }\n }\n return null;\n};\n/**\n * Returns the first subtitle codec from the given list that can be encoded by the browser.\n * @public\n */\nexport const getFirstEncodableSubtitleCodec = async (checkedCodecs) => {\n for (const codec of checkedCodecs) {\n if (await canEncodeSubtitles(codec)) {\n return codec;\n }\n }\n return null;\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { VP9_LEVEL_TABLE } from './codec.js';\nimport { assert, assertNever, Bitstream, last, readExpGolomb, readSignedExpGolomb, toDataView, toUint8Array, } from './misc.js';\n// References for AVC/HEVC code:\n// ISO 14496-15\n// Rec. ITU-T H.264\n// Rec. ITU-T H.265\n// https://stackoverflow.com/questions/24884827\n/** Finds all NAL units in an AVC packet in Annex B format. */\nconst findNalUnitsInAnnexB = (packetData) => {\n const nalUnits = [];\n let i = 0;\n while (i < packetData.length) {\n let startCodePos = -1;\n let startCodeLength = 0;\n for (let j = i; j < packetData.length - 3; j++) {\n // Check for 3-byte start code (0x000001)\n if (packetData[j] === 0 && packetData[j + 1] === 0 && packetData[j + 2] === 1) {\n startCodePos = j;\n startCodeLength = 3;\n break;\n }\n // Check for 4-byte start code (0x00000001)\n if (j < packetData.length - 4\n && packetData[j] === 0\n && packetData[j + 1] === 0\n && packetData[j + 2] === 0\n && packetData[j + 3] === 1) {\n startCodePos = j;\n startCodeLength = 4;\n break;\n }\n }\n if (startCodePos === -1) {\n break; // No more start codes found\n }\n // If this isn't the first start code, extract the previous NAL unit\n if (i > 0 && startCodePos > i) {\n const nalData = packetData.subarray(i, startCodePos);\n if (nalData.length > 0) {\n nalUnits.push(nalData);\n }\n }\n i = startCodePos + startCodeLength;\n }\n // Extract the last NAL unit if there is one\n if (i < packetData.length) {\n const nalData = packetData.subarray(i);\n if (nalData.length > 0) {\n nalUnits.push(nalData);\n }\n }\n return nalUnits;\n};\n/** Finds all NAL units in an AVC packet in length-prefixed format. */\nconst findNalUnitsInLengthPrefixed = (packetData, lengthSize) => {\n const nalUnits = [];\n let offset = 0;\n const dataView = new DataView(packetData.buffer, packetData.byteOffset, packetData.byteLength);\n while (offset + lengthSize <= packetData.length) {\n let nalUnitLength;\n if (lengthSize === 1) {\n nalUnitLength = dataView.getUint8(offset);\n }\n else if (lengthSize === 2) {\n nalUnitLength = dataView.getUint16(offset, false);\n }\n else if (lengthSize === 3) {\n nalUnitLength = (dataView.getUint16(offset, false) << 8) + dataView.getUint8(offset + 2);\n }\n else if (lengthSize === 4) {\n nalUnitLength = dataView.getUint32(offset, false);\n }\n else {\n assertNever(lengthSize);\n assert(false);\n }\n offset += lengthSize;\n const nalUnit = packetData.subarray(offset, offset + nalUnitLength);\n nalUnits.push(nalUnit);\n offset += nalUnitLength;\n }\n return nalUnits;\n};\nconst removeEmulationPreventionBytes = (data) => {\n const result = [];\n const len = data.length;\n for (let i = 0; i < len; i++) {\n // Look for the 0x000003 pattern\n if (i + 2 < len && data[i] === 0x00 && data[i + 1] === 0x00 && data[i + 2] === 0x03) {\n result.push(0x00, 0x00); // Push the first two bytes\n i += 2; // Skip the 0x03 byte\n }\n else {\n result.push(data[i]);\n }\n }\n return new Uint8Array(result);\n};\n/** Converts an AVC packet in Annex B format to length-prefixed format. */\nexport const transformAnnexBToLengthPrefixed = (packetData) => {\n const NAL_UNIT_LENGTH_SIZE = 4;\n const nalUnits = findNalUnitsInAnnexB(packetData);\n if (nalUnits.length === 0) {\n // If no NAL units were found, it's not valid Annex B data\n return null;\n }\n let totalSize = 0;\n for (const nalUnit of nalUnits) {\n totalSize += NAL_UNIT_LENGTH_SIZE + nalUnit.byteLength;\n }\n const avccData = new Uint8Array(totalSize);\n const dataView = new DataView(avccData.buffer);\n let offset = 0;\n // Write each NAL unit with its length prefix\n for (const nalUnit of nalUnits) {\n const length = nalUnit.byteLength;\n dataView.setUint32(offset, length, false);\n offset += 4;\n avccData.set(nalUnit, offset);\n offset += nalUnit.byteLength;\n }\n return avccData;\n};\nconst extractNalUnitTypeForAvc = (data) => {\n return data[0] & 0x1F;\n};\n/** Builds an AvcDecoderConfigurationRecord from an AVC packet in Annex B format. */\nexport const extractAvcDecoderConfigurationRecord = (packetData) => {\n try {\n const nalUnits = findNalUnitsInAnnexB(packetData);\n const spsUnits = nalUnits.filter(unit => extractNalUnitTypeForAvc(unit) === 7);\n const ppsUnits = nalUnits.filter(unit => extractNalUnitTypeForAvc(unit) === 8);\n const spsExtUnits = nalUnits.filter(unit => extractNalUnitTypeForAvc(unit) === 13);\n if (spsUnits.length === 0) {\n return null;\n }\n if (ppsUnits.length === 0) {\n return null;\n }\n // Let's get the first SPS for profile and level information\n const spsData = spsUnits[0];\n const bitstream = new Bitstream(removeEmulationPreventionBytes(spsData));\n bitstream.skipBits(1); // forbidden_zero_bit\n bitstream.skipBits(2); // nal_ref_idc\n const nal_unit_type = bitstream.readBits(5);\n if (nal_unit_type !== 7) { // SPS NAL unit type is 7\n console.error('Invalid SPS NAL unit type');\n return null;\n }\n const profile_idc = bitstream.readAlignedByte();\n const constraint_flags = bitstream.readAlignedByte();\n const level_idc = bitstream.readAlignedByte();\n const record = {\n configurationVersion: 1,\n avcProfileIndication: profile_idc,\n profileCompatibility: constraint_flags,\n avcLevelIndication: level_idc,\n lengthSizeMinusOne: 3, // Typically 4 bytes for length field\n sequenceParameterSets: spsUnits,\n pictureParameterSets: ppsUnits,\n chromaFormat: null,\n bitDepthLumaMinus8: null,\n bitDepthChromaMinus8: null,\n sequenceParameterSetExt: null,\n };\n if (profile_idc === 100\n || profile_idc === 110\n || profile_idc === 122\n || profile_idc === 144) {\n readExpGolomb(bitstream); // seq_parameter_set_id\n const chroma_format_idc = readExpGolomb(bitstream);\n if (chroma_format_idc === 3) {\n bitstream.skipBits(1); // separate_colour_plane_flag\n }\n const bit_depth_luma_minus8 = readExpGolomb(bitstream);\n const bit_depth_chroma_minus8 = readExpGolomb(bitstream);\n record.chromaFormat = chroma_format_idc;\n record.bitDepthLumaMinus8 = bit_depth_luma_minus8;\n record.bitDepthChromaMinus8 = bit_depth_chroma_minus8;\n record.sequenceParameterSetExt = spsExtUnits;\n }\n return record;\n }\n catch (error) {\n console.error('Error building AVC Decoder Configuration Record:', error);\n return null;\n }\n};\n/** Serializes an AvcDecoderConfigurationRecord into the format specified in Section 5.3.3.1 of ISO 14496-15. */\nexport const serializeAvcDecoderConfigurationRecord = (record) => {\n const bytes = [];\n // Write header\n bytes.push(record.configurationVersion);\n bytes.push(record.avcProfileIndication);\n bytes.push(record.profileCompatibility);\n bytes.push(record.avcLevelIndication);\n bytes.push(0xFC | (record.lengthSizeMinusOne & 0x03)); // Reserved bits (6) + lengthSizeMinusOne (2)\n // Reserved bits (3) + numOfSequenceParameterSets (5)\n bytes.push(0xE0 | (record.sequenceParameterSets.length & 0x1F));\n // Write SPS\n for (const sps of record.sequenceParameterSets) {\n const length = sps.byteLength;\n bytes.push(length >> 8); // High byte\n bytes.push(length & 0xFF); // Low byte\n for (let i = 0; i < length; i++) {\n bytes.push(sps[i]);\n }\n }\n bytes.push(record.pictureParameterSets.length);\n // Write PPS\n for (const pps of record.pictureParameterSets) {\n const length = pps.byteLength;\n bytes.push(length >> 8); // High byte\n bytes.push(length & 0xFF); // Low byte\n for (let i = 0; i < length; i++) {\n bytes.push(pps[i]);\n }\n }\n if (record.avcProfileIndication === 100\n || record.avcProfileIndication === 110\n || record.avcProfileIndication === 122\n || record.avcProfileIndication === 144) {\n assert(record.chromaFormat !== null);\n assert(record.bitDepthLumaMinus8 !== null);\n assert(record.bitDepthChromaMinus8 !== null);\n assert(record.sequenceParameterSetExt !== null);\n bytes.push(0xFC | (record.chromaFormat & 0x03)); // Reserved bits + chroma_format\n bytes.push(0xF8 | (record.bitDepthLumaMinus8 & 0x07)); // Reserved bits + bit_depth_luma_minus8\n bytes.push(0xF8 | (record.bitDepthChromaMinus8 & 0x07)); // Reserved bits + bit_depth_chroma_minus8\n bytes.push(record.sequenceParameterSetExt.length);\n // Write SPS Ext\n for (const spsExt of record.sequenceParameterSetExt) {\n const length = spsExt.byteLength;\n bytes.push(length >> 8); // High byte\n bytes.push(length & 0xFF); // Low byte\n for (let i = 0; i < length; i++) {\n bytes.push(spsExt[i]);\n }\n }\n }\n return new Uint8Array(bytes);\n};\nconst NALU_TYPE_VPS = 32;\nconst NALU_TYPE_SPS = 33;\nconst NALU_TYPE_PPS = 34;\nconst NALU_TYPE_SEI_PREFIX = 39;\nconst NALU_TYPE_SEI_SUFFIX = 40;\nconst extractNalUnitTypeForHevc = (data) => {\n return (data[0] >> 1) & 0x3F;\n};\n/** Builds a HevcDecoderConfigurationRecord from an HEVC packet in Annex B format. */\nexport const extractHevcDecoderConfigurationRecord = (packetData) => {\n try {\n const nalUnits = findNalUnitsInAnnexB(packetData);\n const vpsUnits = nalUnits.filter(unit => extractNalUnitTypeForHevc(unit) === NALU_TYPE_VPS);\n const spsUnits = nalUnits.filter(unit => extractNalUnitTypeForHevc(unit) === NALU_TYPE_SPS);\n const ppsUnits = nalUnits.filter(unit => extractNalUnitTypeForHevc(unit) === NALU_TYPE_PPS);\n const seiUnits = nalUnits.filter(unit => extractNalUnitTypeForHevc(unit) === NALU_TYPE_SEI_PREFIX\n || extractNalUnitTypeForHevc(unit) === NALU_TYPE_SEI_SUFFIX);\n if (spsUnits.length === 0 || ppsUnits.length === 0)\n return null;\n const sps = spsUnits[0];\n const bitstream = new Bitstream(removeEmulationPreventionBytes(sps));\n bitstream.skipBits(16); // NAL header\n bitstream.readBits(4); // sps_video_parameter_set_id\n const sps_max_sub_layers_minus1 = bitstream.readBits(3);\n const sps_temporal_id_nesting_flag = bitstream.readBits(1);\n const { general_profile_space, general_tier_flag, general_profile_idc, general_profile_compatibility_flags, general_constraint_indicator_flags, general_level_idc, } = parseProfileTierLevel(bitstream, sps_max_sub_layers_minus1);\n readExpGolomb(bitstream); // sps_seq_parameter_set_id\n const chroma_format_idc = readExpGolomb(bitstream);\n if (chroma_format_idc === 3)\n bitstream.skipBits(1); // separate_colour_plane_flag\n readExpGolomb(bitstream); // pic_width_in_luma_samples\n readExpGolomb(bitstream); // pic_height_in_luma_samples\n if (bitstream.readBits(1)) { // conformance_window_flag\n readExpGolomb(bitstream); // conf_win_left_offset\n readExpGolomb(bitstream); // conf_win_right_offset\n readExpGolomb(bitstream); // conf_win_top_offset\n readExpGolomb(bitstream); // conf_win_bottom_offset\n }\n const bit_depth_luma_minus8 = readExpGolomb(bitstream);\n const bit_depth_chroma_minus8 = readExpGolomb(bitstream);\n readExpGolomb(bitstream); // log2_max_pic_order_cnt_lsb_minus4\n const sps_sub_layer_ordering_info_present_flag = bitstream.readBits(1);\n const maxNum = sps_sub_layer_ordering_info_present_flag ? 0 : sps_max_sub_layers_minus1;\n for (let i = maxNum; i <= sps_max_sub_layers_minus1; i++) {\n readExpGolomb(bitstream); // sps_max_dec_pic_buffering_minus1[i]\n readExpGolomb(bitstream); // sps_max_num_reorder_pics[i]\n readExpGolomb(bitstream); // sps_max_latency_increase_plus1[i]\n }\n readExpGolomb(bitstream); // log2_min_luma_coding_block_size_minus3\n readExpGolomb(bitstream); // log2_diff_max_min_luma_coding_block_size\n readExpGolomb(bitstream); // log2_min_luma_transform_block_size_minus2\n readExpGolomb(bitstream); // log2_diff_max_min_luma_transform_block_size\n readExpGolomb(bitstream); // max_transform_hierarchy_depth_inter\n readExpGolomb(bitstream); // max_transform_hierarchy_depth_intra\n if (bitstream.readBits(1)) { // scaling_list_enabled_flag\n if (bitstream.readBits(1)) {\n skipScalingListData(bitstream);\n }\n }\n bitstream.skipBits(1); // amp_enabled_flag\n bitstream.skipBits(1); // sample_adaptive_offset_enabled_flag\n if (bitstream.readBits(1)) { // pcm_enabled_flag\n bitstream.skipBits(4); // pcm_sample_bit_depth_luma_minus1\n bitstream.skipBits(4); // pcm_sample_bit_depth_chroma_minus1\n readExpGolomb(bitstream); // log2_min_pcm_luma_coding_block_size_minus3\n readExpGolomb(bitstream); // log2_diff_max_min_pcm_luma_coding_block_size\n bitstream.skipBits(1); // pcm_loop_filter_disabled_flag\n }\n const num_short_term_ref_pic_sets = readExpGolomb(bitstream);\n skipAllStRefPicSets(bitstream, num_short_term_ref_pic_sets);\n if (bitstream.readBits(1)) { // long_term_ref_pics_present_flag\n const num_long_term_ref_pics_sps = readExpGolomb(bitstream);\n for (let i = 0; i < num_long_term_ref_pics_sps; i++) {\n readExpGolomb(bitstream); // lt_ref_pic_poc_lsb_sps[i]\n bitstream.skipBits(1); // used_by_curr_pic_lt_sps_flag[i]\n }\n }\n bitstream.skipBits(1); // sps_temporal_mvp_enabled_flag\n bitstream.skipBits(1); // strong_intra_smoothing_enabled_flag\n let min_spatial_segmentation_idc = 0;\n if (bitstream.readBits(1)) { // vui_parameters_present_flag\n min_spatial_segmentation_idc = parseVuiForMinSpatialSegmentationIdc(bitstream, sps_max_sub_layers_minus1);\n }\n // Parse PPS for parallelismType\n let parallelismType = 0;\n if (ppsUnits.length > 0) {\n const pps = ppsUnits[0];\n const ppsBitstream = new Bitstream(removeEmulationPreventionBytes(pps));\n ppsBitstream.skipBits(16); // NAL header\n readExpGolomb(ppsBitstream); // pps_pic_parameter_set_id\n readExpGolomb(ppsBitstream); // pps_seq_parameter_set_id\n ppsBitstream.skipBits(1); // dependent_slice_segments_enabled_flag\n ppsBitstream.skipBits(1); // output_flag_present_flag\n ppsBitstream.skipBits(3); // num_extra_slice_header_bits\n ppsBitstream.skipBits(1); // sign_data_hiding_enabled_flag\n ppsBitstream.skipBits(1); // cabac_init_present_flag\n readExpGolomb(ppsBitstream); // num_ref_idx_l0_default_active_minus1\n readExpGolomb(ppsBitstream); // num_ref_idx_l1_default_active_minus1\n readSignedExpGolomb(ppsBitstream); // init_qp_minus26\n ppsBitstream.skipBits(1); // constrained_intra_pred_flag\n ppsBitstream.skipBits(1); // transform_skip_enabled_flag\n if (ppsBitstream.readBits(1)) { // cu_qp_delta_enabled_flag\n readExpGolomb(ppsBitstream); // diff_cu_qp_delta_depth\n }\n readSignedExpGolomb(ppsBitstream); // pps_cb_qp_offset\n readSignedExpGolomb(ppsBitstream); // pps_cr_qp_offset\n ppsBitstream.skipBits(1); // pps_slice_chroma_qp_offsets_present_flag\n ppsBitstream.skipBits(1); // weighted_pred_flag\n ppsBitstream.skipBits(1); // weighted_bipred_flag\n ppsBitstream.skipBits(1); // transquant_bypass_enabled_flag\n const tiles_enabled_flag = ppsBitstream.readBits(1);\n const entropy_coding_sync_enabled_flag = ppsBitstream.readBits(1);\n if (!tiles_enabled_flag && !entropy_coding_sync_enabled_flag)\n parallelismType = 0;\n else if (tiles_enabled_flag && !entropy_coding_sync_enabled_flag)\n parallelismType = 2;\n else if (!tiles_enabled_flag && entropy_coding_sync_enabled_flag)\n parallelismType = 3;\n else\n parallelismType = 0;\n }\n const arrays = [\n ...(vpsUnits.length\n ? [\n {\n arrayCompleteness: 1,\n nalUnitType: NALU_TYPE_VPS,\n nalUnits: vpsUnits,\n },\n ]\n : []),\n ...(spsUnits.length\n ? [\n {\n arrayCompleteness: 1,\n nalUnitType: NALU_TYPE_SPS,\n nalUnits: spsUnits,\n },\n ]\n : []),\n ...(ppsUnits.length\n ? [\n {\n arrayCompleteness: 1,\n nalUnitType: NALU_TYPE_PPS,\n nalUnits: ppsUnits,\n },\n ]\n : []),\n ...(seiUnits.length\n ? [\n {\n arrayCompleteness: 1,\n nalUnitType: extractNalUnitTypeForHevc(seiUnits[0]),\n nalUnits: seiUnits,\n },\n ]\n : []),\n ];\n const record = {\n configurationVersion: 1,\n generalProfileSpace: general_profile_space,\n generalTierFlag: general_tier_flag,\n generalProfileIdc: general_profile_idc,\n generalProfileCompatibilityFlags: general_profile_compatibility_flags,\n generalConstraintIndicatorFlags: general_constraint_indicator_flags,\n generalLevelIdc: general_level_idc,\n minSpatialSegmentationIdc: min_spatial_segmentation_idc,\n parallelismType,\n chromaFormatIdc: chroma_format_idc,\n bitDepthLumaMinus8: bit_depth_luma_minus8,\n bitDepthChromaMinus8: bit_depth_chroma_minus8,\n avgFrameRate: 0,\n constantFrameRate: 0,\n numTemporalLayers: sps_max_sub_layers_minus1 + 1,\n temporalIdNested: sps_temporal_id_nesting_flag,\n lengthSizeMinusOne: 3,\n arrays,\n };\n return record;\n }\n catch (error) {\n console.error('Error building HEVC Decoder Configuration Record:', error);\n return null;\n }\n};\nconst parseProfileTierLevel = (bitstream, maxNumSubLayersMinus1) => {\n const general_profile_space = bitstream.readBits(2);\n const general_tier_flag = bitstream.readBits(1);\n const general_profile_idc = bitstream.readBits(5);\n let general_profile_compatibility_flags = 0;\n for (let i = 0; i < 32; i++) {\n general_profile_compatibility_flags = (general_profile_compatibility_flags << 1) | bitstream.readBits(1);\n }\n const general_constraint_indicator_flags = new Uint8Array(6);\n for (let i = 0; i < 6; i++) {\n general_constraint_indicator_flags[i] = bitstream.readBits(8);\n }\n const general_level_idc = bitstream.readBits(8);\n const sub_layer_profile_present_flag = [];\n const sub_layer_level_present_flag = [];\n for (let i = 0; i < maxNumSubLayersMinus1; i++) {\n sub_layer_profile_present_flag.push(bitstream.readBits(1));\n sub_layer_level_present_flag.push(bitstream.readBits(1));\n }\n if (maxNumSubLayersMinus1 > 0) {\n for (let i = maxNumSubLayersMinus1; i < 8; i++) {\n bitstream.skipBits(2); // reserved_zero_2bits\n }\n }\n for (let i = 0; i < maxNumSubLayersMinus1; i++) {\n if (sub_layer_profile_present_flag[i])\n bitstream.skipBits(88);\n if (sub_layer_level_present_flag[i])\n bitstream.skipBits(8);\n }\n return {\n general_profile_space,\n general_tier_flag,\n general_profile_idc,\n general_profile_compatibility_flags,\n general_constraint_indicator_flags,\n general_level_idc,\n };\n};\nconst skipScalingListData = (bitstream) => {\n for (let sizeId = 0; sizeId < 4; sizeId++) {\n for (let matrixId = 0; matrixId < (sizeId === 3 ? 2 : 6); matrixId++) {\n const scaling_list_pred_mode_flag = bitstream.readBits(1);\n if (!scaling_list_pred_mode_flag) {\n readExpGolomb(bitstream); // scaling_list_pred_matrix_id_delta\n }\n else {\n const coefNum = Math.min(64, 1 << (4 + (sizeId << 1)));\n if (sizeId > 1) {\n readSignedExpGolomb(bitstream); // scaling_list_dc_coef_minus8\n }\n for (let i = 0; i < coefNum; i++) {\n readSignedExpGolomb(bitstream); // scaling_list_delta_coef\n }\n }\n }\n }\n};\nconst skipAllStRefPicSets = (bitstream, num_short_term_ref_pic_sets) => {\n const NumDeltaPocs = [];\n for (let stRpsIdx = 0; stRpsIdx < num_short_term_ref_pic_sets; stRpsIdx++) {\n NumDeltaPocs[stRpsIdx] = skipStRefPicSet(bitstream, stRpsIdx, num_short_term_ref_pic_sets, NumDeltaPocs);\n }\n};\nconst skipStRefPicSet = (bitstream, stRpsIdx, num_short_term_ref_pic_sets, NumDeltaPocs) => {\n let NumDeltaPocsThis = 0;\n let inter_ref_pic_set_prediction_flag = 0;\n let RefRpsIdx = 0;\n if (stRpsIdx !== 0) {\n inter_ref_pic_set_prediction_flag = bitstream.readBits(1);\n }\n if (inter_ref_pic_set_prediction_flag) {\n if (stRpsIdx === num_short_term_ref_pic_sets) {\n const delta_idx_minus1 = readExpGolomb(bitstream);\n RefRpsIdx = stRpsIdx - (delta_idx_minus1 + 1);\n }\n else {\n RefRpsIdx = stRpsIdx - 1;\n }\n bitstream.readBits(1); // delta_rps_sign\n readExpGolomb(bitstream); // abs_delta_rps_minus1\n // The number of iterations is NumDeltaPocs[RefRpsIdx] + 1\n const numDelta = NumDeltaPocs[RefRpsIdx] ?? 0;\n for (let j = 0; j <= numDelta; j++) {\n const used_by_curr_pic_flag = bitstream.readBits(1);\n if (!used_by_curr_pic_flag) {\n bitstream.readBits(1); // use_delta_flag\n }\n }\n NumDeltaPocsThis = NumDeltaPocs[RefRpsIdx];\n }\n else {\n const num_negative_pics = readExpGolomb(bitstream);\n const num_positive_pics = readExpGolomb(bitstream);\n for (let i = 0; i < num_negative_pics; i++) {\n readExpGolomb(bitstream); // delta_poc_s0_minus1[i]\n bitstream.readBits(1); // used_by_curr_pic_s0_flag[i]\n }\n for (let i = 0; i < num_positive_pics; i++) {\n readExpGolomb(bitstream); // delta_poc_s1_minus1[i]\n bitstream.readBits(1); // used_by_curr_pic_s1_flag[i]\n }\n NumDeltaPocsThis = num_negative_pics + num_positive_pics;\n }\n return NumDeltaPocsThis;\n};\nconst parseVuiForMinSpatialSegmentationIdc = (bitstream, sps_max_sub_layers_minus1) => {\n if (bitstream.readBits(1)) { // aspect_ratio_info_present_flag\n const aspect_ratio_idc = bitstream.readBits(8);\n if (aspect_ratio_idc === 255) {\n bitstream.readBits(16); // sar_width\n bitstream.readBits(16); // sar_height\n }\n }\n if (bitstream.readBits(1)) { // overscan_info_present_flag\n bitstream.readBits(1); // overscan_appropriate_flag\n }\n if (bitstream.readBits(1)) { // video_signal_type_present_flag\n bitstream.readBits(3); // video_format\n bitstream.readBits(1); // video_full_range_flag\n if (bitstream.readBits(1)) {\n bitstream.readBits(8); // colour_primaries\n bitstream.readBits(8); // transfer_characteristics\n bitstream.readBits(8); // matrix_coeffs\n }\n }\n if (bitstream.readBits(1)) { // chroma_loc_info_present_flag\n readExpGolomb(bitstream); // chroma_sample_loc_type_top_field\n readExpGolomb(bitstream); // chroma_sample_loc_type_bottom_field\n }\n bitstream.readBits(1); // neutral_chroma_indication_flag\n bitstream.readBits(1); // field_seq_flag\n bitstream.readBits(1); // frame_field_info_present_flag\n if (bitstream.readBits(1)) { // default_display_window_flag\n readExpGolomb(bitstream); // def_disp_win_left_offset\n readExpGolomb(bitstream); // def_disp_win_right_offset\n readExpGolomb(bitstream); // def_disp_win_top_offset\n readExpGolomb(bitstream); // def_disp_win_bottom_offset\n }\n if (bitstream.readBits(1)) { // vui_timing_info_present_flag\n bitstream.readBits(32); // vui_num_units_in_tick\n bitstream.readBits(32); // vui_time_scale\n if (bitstream.readBits(1)) { // vui_poc_proportional_to_timing_flag\n readExpGolomb(bitstream); // vui_num_ticks_poc_diff_one_minus1\n }\n if (bitstream.readBits(1)) {\n skipHrdParameters(bitstream, true, sps_max_sub_layers_minus1);\n }\n }\n if (bitstream.readBits(1)) { // bitstream_restriction_flag\n bitstream.readBits(1); // tiles_fixed_structure_flag\n bitstream.readBits(1); // motion_vectors_over_pic_boundaries_flag\n bitstream.readBits(1); // restricted_ref_pic_lists_flag\n const min_spatial_segmentation_idc = readExpGolomb(bitstream);\n // skip the rest\n readExpGolomb(bitstream); // max_bytes_per_pic_denom\n readExpGolomb(bitstream); // max_bits_per_min_cu_denom\n readExpGolomb(bitstream); // log2_max_mv_length_horizontal\n readExpGolomb(bitstream); // log2_max_mv_length_vertical\n return min_spatial_segmentation_idc;\n }\n return 0;\n};\nconst skipHrdParameters = (bitstream, commonInfPresentFlag, maxNumSubLayersMinus1) => {\n let nal_hrd_parameters_present_flag = false;\n let vcl_hrd_parameters_present_flag = false;\n let sub_pic_hrd_params_present_flag = false;\n if (commonInfPresentFlag) {\n nal_hrd_parameters_present_flag = bitstream.readBits(1) === 1;\n vcl_hrd_parameters_present_flag = bitstream.readBits(1) === 1;\n if (nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag) {\n sub_pic_hrd_params_present_flag = bitstream.readBits(1) === 1;\n if (sub_pic_hrd_params_present_flag) {\n bitstream.readBits(8); // tick_divisor_minus2\n bitstream.readBits(5); // du_cpb_removal_delay_increment_length_minus1\n bitstream.readBits(1); // sub_pic_cpb_params_in_pic_timing_sei_flag\n bitstream.readBits(5); // dpb_output_delay_du_length_minus1\n }\n bitstream.readBits(4); // bit_rate_scale\n bitstream.readBits(4); // cpb_size_scale\n if (sub_pic_hrd_params_present_flag) {\n bitstream.readBits(4); // cpb_size_du_scale\n }\n bitstream.readBits(5); // initial_cpb_removal_delay_length_minus1\n bitstream.readBits(5); // au_cpb_removal_delay_length_minus1\n bitstream.readBits(5); // dpb_output_delay_length_minus1\n }\n }\n for (let i = 0; i <= maxNumSubLayersMinus1; i++) {\n const fixed_pic_rate_general_flag = bitstream.readBits(1) === 1;\n let fixed_pic_rate_within_cvs_flag = true; // Default assumption if general is true\n if (!fixed_pic_rate_general_flag) {\n fixed_pic_rate_within_cvs_flag = bitstream.readBits(1) === 1;\n }\n let low_delay_hrd_flag = false; // Default assumption\n if (fixed_pic_rate_within_cvs_flag) {\n readExpGolomb(bitstream); // elemental_duration_in_tc_minus1[i]\n }\n else {\n low_delay_hrd_flag = bitstream.readBits(1) === 1;\n }\n let CpbCnt = 1; // Default if low_delay is true\n if (!low_delay_hrd_flag) {\n const cpb_cnt_minus1 = readExpGolomb(bitstream); // cpb_cnt_minus1[i]\n CpbCnt = cpb_cnt_minus1 + 1;\n }\n if (nal_hrd_parameters_present_flag) {\n skipSubLayerHrdParameters(bitstream, CpbCnt, sub_pic_hrd_params_present_flag);\n }\n if (vcl_hrd_parameters_present_flag) {\n skipSubLayerHrdParameters(bitstream, CpbCnt, sub_pic_hrd_params_present_flag);\n }\n }\n};\nconst skipSubLayerHrdParameters = (bitstream, CpbCnt, sub_pic_hrd_params_present_flag) => {\n for (let i = 0; i < CpbCnt; i++) {\n readExpGolomb(bitstream); // bit_rate_value_minus1[i]\n readExpGolomb(bitstream); // cpb_size_value_minus1[i]\n if (sub_pic_hrd_params_present_flag) {\n readExpGolomb(bitstream); // cpb_size_du_value_minus1[i]\n readExpGolomb(bitstream); // bit_rate_du_value_minus1[i]\n }\n bitstream.readBits(1); // cbr_flag[i]\n }\n};\n/** Serializes an HevcDecoderConfigurationRecord into the format specified in Section 8.3.3.1 of ISO 14496-15. */\nexport const serializeHevcDecoderConfigurationRecord = (record) => {\n const bytes = [];\n bytes.push(record.configurationVersion);\n bytes.push(((record.generalProfileSpace & 0x3) << 6)\n | ((record.generalTierFlag & 0x1) << 5)\n | (record.generalProfileIdc & 0x1F));\n bytes.push((record.generalProfileCompatibilityFlags >>> 24) & 0xFF);\n bytes.push((record.generalProfileCompatibilityFlags >>> 16) & 0xFF);\n bytes.push((record.generalProfileCompatibilityFlags >>> 8) & 0xFF);\n bytes.push(record.generalProfileCompatibilityFlags & 0xFF);\n bytes.push(...record.generalConstraintIndicatorFlags);\n bytes.push(record.generalLevelIdc & 0xFF);\n bytes.push(0xF0 | ((record.minSpatialSegmentationIdc >> 8) & 0x0F)); // Reserved + high nibble\n bytes.push(record.minSpatialSegmentationIdc & 0xFF); // Low byte\n bytes.push(0xFC | (record.parallelismType & 0x03));\n bytes.push(0xFC | (record.chromaFormatIdc & 0x03));\n bytes.push(0xF8 | (record.bitDepthLumaMinus8 & 0x07));\n bytes.push(0xF8 | (record.bitDepthChromaMinus8 & 0x07));\n bytes.push((record.avgFrameRate >> 8) & 0xFF); // High byte\n bytes.push(record.avgFrameRate & 0xFF); // Low byte\n bytes.push(((record.constantFrameRate & 0x03) << 6)\n | ((record.numTemporalLayers & 0x07) << 3)\n | ((record.temporalIdNested & 0x01) << 2)\n | (record.lengthSizeMinusOne & 0x03));\n bytes.push(record.arrays.length & 0xFF);\n for (const arr of record.arrays) {\n bytes.push(((arr.arrayCompleteness & 0x01) << 7)\n | (0 << 6)\n | (arr.nalUnitType & 0x3F));\n bytes.push((arr.nalUnits.length >> 8) & 0xFF); // High byte\n bytes.push(arr.nalUnits.length & 0xFF); // Low byte\n for (const nal of arr.nalUnits) {\n bytes.push((nal.length >> 8) & 0xFF); // High byte\n bytes.push(nal.length & 0xFF); // Low byte\n for (let i = 0; i < nal.length; i++) {\n bytes.push(nal[i]);\n }\n }\n }\n return new Uint8Array(bytes);\n};\nexport const extractVp9CodecInfoFromPacket = (packet) => {\n // eslint-disable-next-line @stylistic/max-len\n // https://storage.googleapis.com/downloads.webmproject.org/docs/vp9/vp9-bitstream-specification-v0.7-20170222-draft.pdf\n // http://downloads.webmproject.org/docs/vp9/vp9-bitstream_superframe-and-uncompressed-header_v1.0.pdf\n const bitstream = new Bitstream(packet);\n // Frame marker (0b10)\n const frameMarker = bitstream.readBits(2);\n if (frameMarker !== 2) {\n return null;\n }\n // Profile\n const profileLowBit = bitstream.readBits(1);\n const profileHighBit = bitstream.readBits(1);\n const profile = (profileHighBit << 1) + profileLowBit;\n // Skip reserved bit for profile 3\n if (profile === 3) {\n bitstream.skipBits(1);\n }\n // show_existing_frame\n const showExistingFrame = bitstream.readBits(1);\n if (showExistingFrame === 1) {\n return null;\n }\n // frame_type (0 = key frame)\n const frameType = bitstream.readBits(1);\n if (frameType !== 0) {\n return null;\n }\n // Skip show_frame and error_resilient_mode\n bitstream.skipBits(2);\n // Sync code (0x498342)\n const syncCode = bitstream.readBits(24);\n if (syncCode !== 0x498342) {\n return null;\n }\n // Color config\n let bitDepth = 8;\n if (profile >= 2) {\n const tenOrTwelveBit = bitstream.readBits(1);\n bitDepth = tenOrTwelveBit ? 12 : 10;\n }\n // Color space\n const colorSpace = bitstream.readBits(3);\n let chromaSubsampling = 0;\n let videoFullRangeFlag = 0;\n if (colorSpace !== 7) { // 7 is CS_RGB\n const colorRange = bitstream.readBits(1);\n videoFullRangeFlag = colorRange;\n if (profile === 1 || profile === 3) {\n const subsamplingX = bitstream.readBits(1);\n const subsamplingY = bitstream.readBits(1);\n // 0 = 4:2:0 vertical\n // 1 = 4:2:0 colocated\n // 2 = 4:2:2\n // 3 = 4:4:4\n chromaSubsampling = !subsamplingX && !subsamplingY\n ? 3 // 0,0 = 4:4:4\n : subsamplingX && !subsamplingY\n ? 2 // 1,0 = 4:2:2\n : 1; // 1,1 = 4:2:0 colocated (default)\n // Skip reserved bit\n bitstream.skipBits(1);\n }\n else {\n // For profile 0 and 2, always 4:2:0\n chromaSubsampling = 1; // Using colocated as default\n }\n }\n else {\n // RGB is always 4:4:4\n chromaSubsampling = 3;\n videoFullRangeFlag = 1;\n }\n // Parse frame size\n const widthMinusOne = bitstream.readBits(16);\n const heightMinusOne = bitstream.readBits(16);\n const width = widthMinusOne + 1;\n const height = heightMinusOne + 1;\n // Calculate level based on dimensions\n const pictureSize = width * height;\n let level = last(VP9_LEVEL_TABLE).level; // Default to highest level\n for (const entry of VP9_LEVEL_TABLE) {\n if (pictureSize <= entry.maxPictureSize) {\n level = entry.level;\n break;\n }\n }\n // Map color_space to standard values\n const matrixCoefficients = colorSpace === 7\n ? 0\n : colorSpace === 2\n ? 1\n : colorSpace === 1\n ? 6\n : 2;\n const colourPrimaries = colorSpace === 2\n ? 1\n : colorSpace === 1\n ? 6\n : 2;\n const transferCharacteristics = colorSpace === 2\n ? 1\n : colorSpace === 1\n ? 6\n : 2;\n return {\n profile,\n level,\n bitDepth,\n chromaSubsampling,\n videoFullRangeFlag,\n colourPrimaries,\n transferCharacteristics,\n matrixCoefficients,\n };\n};\n/** Iterates over all OBUs in an AV1 packet bistream. */\nexport function* iterateAv1PacketObus(packet) {\n // https://aomediacodec.github.io/av1-spec/av1-spec.pdf\n const bitstream = new Bitstream(packet);\n const readLeb128 = () => {\n let value = 0;\n for (let i = 0; i < 8; i++) {\n const byte = bitstream.readAlignedByte();\n value |= ((byte & 0x7f) << (i * 7));\n if (!(byte & 0x80)) {\n break;\n }\n // Spec requirement\n if (i === 7 && (byte & 0x80)) {\n return null;\n }\n }\n // Spec requirement\n if (value >= 2 ** 32 - 1) {\n return null;\n }\n return value;\n };\n while (bitstream.getBitsLeft() >= 8) {\n // Parse OBU header\n bitstream.skipBits(1);\n const obuType = bitstream.readBits(4);\n const obuExtension = bitstream.readBits(1);\n const obuHasSizeField = bitstream.readBits(1);\n bitstream.skipBits(1);\n // Skip extension header if present\n if (obuExtension) {\n bitstream.skipBits(8);\n }\n // Read OBU size if present\n let obuSize;\n if (obuHasSizeField) {\n const obuSizeValue = readLeb128();\n if (obuSizeValue === null)\n return; // It was invalid\n obuSize = obuSizeValue;\n }\n else {\n // Calculate remaining bits and convert to bytes, rounding down\n obuSize = Math.floor(bitstream.getBitsLeft() / 8);\n }\n assert(bitstream.pos % 8 === 0);\n yield {\n type: obuType,\n data: packet.subarray(bitstream.pos / 8, bitstream.pos / 8 + obuSize),\n };\n // Move to next OBU\n bitstream.skipBits(obuSize * 8);\n }\n}\n;\n/**\n * When AV1 codec information is not provided by the container, we can still try to extract the information by digging\n * into the AV1 bitstream.\n */\nexport const extractAv1CodecInfoFromPacket = (packet) => {\n // https://aomediacodec.github.io/av1-spec/av1-spec.pdf\n for (const { type, data } of iterateAv1PacketObus(packet)) {\n if (type !== 1) {\n continue; // 1 == OBU_SEQUENCE_HEADER\n }\n const bitstream = new Bitstream(data);\n // Read sequence header fields\n const seqProfile = bitstream.readBits(3);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const stillPicture = bitstream.readBits(1);\n const reducedStillPictureHeader = bitstream.readBits(1);\n let seqLevel = 0;\n let seqTier = 0;\n let bufferDelayLengthMinus1 = 0;\n if (reducedStillPictureHeader) {\n seqLevel = bitstream.readBits(5);\n }\n else {\n // Parse timing_info_present_flag\n const timingInfoPresentFlag = bitstream.readBits(1);\n if (timingInfoPresentFlag) {\n // Skip timing info (num_units_in_display_tick, time_scale, equal_picture_interval)\n bitstream.skipBits(32); // num_units_in_display_tick\n bitstream.skipBits(32); // time_scale\n const equalPictureInterval = bitstream.readBits(1);\n if (equalPictureInterval) {\n // Skip num_ticks_per_picture_minus_1 (uvlc)\n // Since this is variable length, we'd need to implement uvlc reading\n // For now, we'll return null as this is rare\n return null;\n }\n }\n // Parse decoder_model_info_present_flag\n const decoderModelInfoPresentFlag = bitstream.readBits(1);\n if (decoderModelInfoPresentFlag) {\n // Store buffer_delay_length_minus_1 instead of just skipping\n bufferDelayLengthMinus1 = bitstream.readBits(5);\n bitstream.skipBits(32); // num_units_in_decoding_tick\n bitstream.skipBits(5); // buffer_removal_time_length_minus_1\n bitstream.skipBits(5); // frame_presentation_time_length_minus_1\n }\n // Parse operating_points_cnt_minus_1\n const operatingPointsCntMinus1 = bitstream.readBits(5);\n // For each operating point\n for (let i = 0; i <= operatingPointsCntMinus1; i++) {\n // operating_point_idc[i]\n bitstream.skipBits(12);\n // seq_level_idx[i]\n const seqLevelIdx = bitstream.readBits(5);\n if (i === 0) {\n seqLevel = seqLevelIdx;\n }\n if (seqLevelIdx > 7) {\n // seq_tier[i]\n const seqTierTemp = bitstream.readBits(1);\n if (i === 0) {\n seqTier = seqTierTemp;\n }\n }\n if (decoderModelInfoPresentFlag) {\n // decoder_model_present_for_this_op[i]\n const decoderModelPresentForThisOp = bitstream.readBits(1);\n if (decoderModelPresentForThisOp) {\n const n = bufferDelayLengthMinus1 + 1;\n bitstream.skipBits(n); // decoder_buffer_delay[op]\n bitstream.skipBits(n); // encoder_buffer_delay[op]\n bitstream.skipBits(1); // low_delay_mode_flag[op]\n }\n }\n // initial_display_delay_present_flag\n const initialDisplayDelayPresentFlag = bitstream.readBits(1);\n if (initialDisplayDelayPresentFlag) {\n // initial_display_delay_minus_1[i]\n bitstream.skipBits(4);\n }\n }\n }\n const highBitdepth = bitstream.readBits(1);\n let bitDepth = 8;\n if (seqProfile === 2 && highBitdepth) {\n const twelveBit = bitstream.readBits(1);\n bitDepth = twelveBit ? 12 : 10;\n }\n else if (seqProfile <= 2) {\n bitDepth = highBitdepth ? 10 : 8;\n }\n let monochrome = 0;\n if (seqProfile !== 1) {\n monochrome = bitstream.readBits(1);\n }\n let chromaSubsamplingX = 1;\n let chromaSubsamplingY = 1;\n let chromaSamplePosition = 0;\n if (!monochrome) {\n if (seqProfile === 0) {\n chromaSubsamplingX = 1;\n chromaSubsamplingY = 1;\n }\n else if (seqProfile === 1) {\n chromaSubsamplingX = 0;\n chromaSubsamplingY = 0;\n }\n else {\n if (bitDepth === 12) {\n chromaSubsamplingX = bitstream.readBits(1);\n if (chromaSubsamplingX) {\n chromaSubsamplingY = bitstream.readBits(1);\n }\n }\n }\n if (chromaSubsamplingX && chromaSubsamplingY) {\n chromaSamplePosition = bitstream.readBits(2);\n }\n }\n return {\n profile: seqProfile,\n level: seqLevel,\n tier: seqTier,\n bitDepth,\n monochrome,\n chromaSubsamplingX,\n chromaSubsamplingY,\n chromaSamplePosition,\n };\n }\n return null;\n};\nexport const parseOpusIdentificationHeader = (bytes) => {\n const view = toDataView(bytes);\n const outputChannelCount = view.getUint8(9);\n const preSkip = view.getUint16(10, true);\n const inputSampleRate = view.getUint32(12, true);\n const outputGain = view.getInt16(16, true);\n const channelMappingFamily = view.getUint8(18);\n let channelMappingTable = null;\n if (channelMappingFamily) {\n channelMappingTable = bytes.subarray(19, 19 + 2 + outputChannelCount);\n }\n return {\n outputChannelCount,\n preSkip,\n inputSampleRate,\n outputGain,\n channelMappingFamily,\n channelMappingTable,\n };\n};\n// From https://datatracker.ietf.org/doc/html/rfc6716, in 48 kHz samples\nconst OPUS_FRAME_DURATION_TABLE = [\n 480, 960, 1920, 2880,\n 480, 960, 1920, 2880,\n 480, 960, 1920, 2880,\n 480, 960,\n 480, 960,\n 120, 240, 480, 960,\n 120, 240, 480, 960,\n 120, 240, 480, 960,\n 120, 240, 480, 960,\n];\nexport const parseOpusTocByte = (packet) => {\n const config = packet[0] >> 3;\n return {\n durationInSamples: OPUS_FRAME_DURATION_TABLE[config],\n };\n};\n// Based on vorbis_parser.c from FFmpeg.\nexport const parseModesFromVorbisSetupPacket = (setupHeader) => {\n // Verify that this is a Setup header.\n if (setupHeader.length < 7) {\n throw new Error('Setup header is too short.');\n }\n if (setupHeader[0] !== 5) {\n throw new Error('Wrong packet type in Setup header.');\n }\n const signature = String.fromCharCode(...setupHeader.slice(1, 7));\n if (signature !== 'vorbis') {\n throw new Error('Invalid packet signature in Setup header.');\n }\n // Reverse the entire buffer.\n const bufSize = setupHeader.length;\n const revBuffer = new Uint8Array(bufSize);\n for (let i = 0; i < bufSize; i++) {\n revBuffer[i] = setupHeader[bufSize - 1 - i];\n }\n // Initialize a Bitstream on the reversed buffer.\n const bitstream = new Bitstream(revBuffer);\n // --- Find the framing bit.\n // In FFmpeg code, we scan until get_bits1() returns 1.\n let gotFramingBit = 0;\n while (bitstream.getBitsLeft() > 97) {\n if (bitstream.readBits(1) === 1) {\n gotFramingBit = bitstream.pos;\n break;\n }\n }\n if (gotFramingBit === 0) {\n throw new Error('Invalid Setup header: framing bit not found.');\n }\n // --- Search backwards for a valid mode header.\n // We try to \u201Cguess\u201D the number of modes by reading a fixed pattern.\n let modeCount = 0;\n let gotModeHeader = false;\n let lastModeCount = 0;\n while (bitstream.getBitsLeft() >= 97) {\n const tempPos = bitstream.pos;\n const a = bitstream.readBits(8);\n const b = bitstream.readBits(16);\n const c = bitstream.readBits(16);\n // If a > 63 or b or c nonzero, assume we\u2019ve gone too far.\n if (a > 63 || b !== 0 || c !== 0) {\n bitstream.pos = tempPos;\n break;\n }\n bitstream.skipBits(1);\n modeCount++;\n if (modeCount > 64) {\n break;\n }\n const bsClone = bitstream.clone();\n const candidate = bsClone.readBits(6) + 1;\n if (candidate === modeCount) {\n gotModeHeader = true;\n lastModeCount = modeCount;\n }\n }\n if (!gotModeHeader) {\n throw new Error('Invalid Setup header: mode header not found.');\n }\n if (lastModeCount > 63) {\n throw new Error(`Unsupported mode count: ${lastModeCount}.`);\n }\n const finalModeCount = lastModeCount;\n // --- Reinitialize the bitstream.\n bitstream.pos = 0;\n // Skip the bits up to the found framing bit.\n bitstream.skipBits(gotFramingBit);\n // --- Now read, for each mode (in reverse order), 40 bits then one bit.\n // That one bit is the mode blockflag.\n const modeBlockflags = Array(finalModeCount).fill(0);\n for (let i = finalModeCount - 1; i >= 0; i--) {\n bitstream.skipBits(40);\n modeBlockflags[i] = bitstream.readBits(1);\n }\n return { modeBlockflags };\n};\n/** Determines a packet's type (key or delta) by digging into the packet bitstream. */\nexport const determineVideoPacketType = async (videoTrack, packet) => {\n assert(videoTrack.codec);\n switch (videoTrack.codec) {\n case 'avc':\n {\n const decoderConfig = await videoTrack.getDecoderConfig();\n assert(decoderConfig);\n let nalUnits;\n if (decoderConfig.description) {\n // Stream is length-prefixed. Let's extract the size of the length prefix from the decoder config\n const bytes = toUint8Array(decoderConfig.description);\n const lengthSizeMinusOne = bytes[4] & 0b11;\n const lengthSize = (lengthSizeMinusOne + 1);\n nalUnits = findNalUnitsInLengthPrefixed(packet.data, lengthSize);\n }\n else {\n // Stream is in Annex B format\n nalUnits = findNalUnitsInAnnexB(packet.data);\n }\n const isKeyframe = nalUnits.some(x => extractNalUnitTypeForAvc(x) === 5);\n return isKeyframe ? 'key' : 'delta';\n }\n ;\n case 'hevc':\n {\n const decoderConfig = await videoTrack.getDecoderConfig();\n assert(decoderConfig);\n let nalUnits;\n if (decoderConfig.description) {\n // Stream is length-prefixed. Let's extract the size of the length prefix from the decoder config\n const bytes = toUint8Array(decoderConfig.description);\n const lengthSizeMinusOne = bytes[21] & 0b11;\n const lengthSize = (lengthSizeMinusOne + 1);\n nalUnits = findNalUnitsInLengthPrefixed(packet.data, lengthSize);\n }\n else {\n // Stream is in Annex B format\n nalUnits = findNalUnitsInAnnexB(packet.data);\n }\n const isKeyframe = nalUnits.some((x) => {\n const type = extractNalUnitTypeForHevc(x);\n return 16 <= type && type <= 23;\n });\n return isKeyframe ? 'key' : 'delta';\n }\n ;\n case 'vp8':\n {\n // VP8, once again, by far the easiest to deal with.\n const frameType = packet.data[0] & 0b1;\n return frameType === 0 ? 'key' : 'delta';\n }\n ;\n case 'vp9':\n {\n const bitstream = new Bitstream(packet.data);\n if (bitstream.readBits(2) !== 2) {\n return null;\n }\n ;\n const profileLowBit = bitstream.readBits(1);\n const profileHighBit = bitstream.readBits(1);\n const profile = (profileHighBit << 1) + profileLowBit;\n // Skip reserved bit for profile 3\n if (profile === 3) {\n bitstream.skipBits(1);\n }\n const showExistingFrame = bitstream.readBits(1);\n if (showExistingFrame) {\n return null;\n }\n const frameType = bitstream.readBits(1);\n return frameType === 0 ? 'key' : 'delta';\n }\n ;\n case 'av1':\n {\n let reducedStillPictureHeader = false;\n for (const { type, data } of iterateAv1PacketObus(packet.data)) {\n if (type === 1) { // OBU_SEQUENCE_HEADER\n const bitstream = new Bitstream(data);\n bitstream.skipBits(4);\n reducedStillPictureHeader = !!bitstream.readBits(1);\n }\n else if (type === 3 // OBU_FRAME_HEADER\n || type === 6 // OBU_FRAME\n || type === 7 // OBU_REDUNDANT_FRAME_HEADER\n ) {\n if (reducedStillPictureHeader) {\n return 'key';\n }\n const bitstream = new Bitstream(data);\n const showExistingFrame = bitstream.readBits(1);\n if (showExistingFrame) {\n return null;\n }\n const frameType = bitstream.readBits(2);\n return frameType === 0 ? 'key' : 'delta';\n }\n }\n return null;\n }\n ;\n default:\n {\n assertNever(videoTrack.codec);\n assert(false);\n }\n ;\n }\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nexport const buildIsobmffMimeType = (info) => {\n const base = info.hasVideo\n ? 'video/'\n : info.hasAudio\n ? 'audio/'\n : 'application/';\n let string = base + (info.isQuickTime ? 'quicktime' : 'mp4');\n if (info.codecStrings.length > 0) {\n const uniqueCodecMimeTypes = [...new Set(info.codecStrings)];\n string += `; codecs=\"${uniqueCodecMimeTypes.join(', ')}\"`;\n }\n return string;\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nexport const MIN_BOX_HEADER_SIZE = 8;\nexport const MAX_BOX_HEADER_SIZE = 16;\nexport class IsobmffReader {\n constructor(reader) {\n this.reader = reader;\n this.pos = 0;\n }\n readBytes(length) {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + length);\n this.pos += length;\n return new Uint8Array(view.buffer, offset, length);\n }\n readU8() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 1);\n this.pos++;\n return view.getUint8(offset);\n }\n readU16() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 2);\n this.pos += 2;\n return view.getUint16(offset, false);\n }\n readI16() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 2);\n this.pos += 2;\n return view.getInt16(offset, false);\n }\n readU24() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 3);\n this.pos += 3;\n const high = view.getUint16(offset, false);\n const low = view.getUint8(offset + 2);\n return high * 0x100 + low;\n }\n readU32() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 4);\n this.pos += 4;\n return view.getUint32(offset, false);\n }\n readI32() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 4);\n this.pos += 4;\n return view.getInt32(offset, false);\n }\n readU64() {\n const high = this.readU32();\n const low = this.readU32();\n return high * 0x100000000 + low;\n }\n readI64() {\n const high = this.readI32();\n const low = this.readU32();\n return high * 0x100000000 + low;\n }\n readF64() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 8);\n this.pos += 8;\n return view.getFloat64(offset, false);\n }\n readFixed_16_16() {\n return this.readI32() / 0x10000;\n }\n readFixed_2_30() {\n return this.readI32() / 0x40000000;\n }\n readAscii(length) {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + length);\n this.pos += length;\n let str = '';\n for (let i = 0; i < length; i++) {\n str += String.fromCharCode(view.getUint8(offset + i));\n }\n return str;\n }\n readIsomVariableInteger() {\n let result = 0;\n for (let i = 0; i < 4; i++) {\n result <<= 7;\n const nextByte = this.readU8();\n result |= nextByte & 0x7f;\n if ((nextByte & 0x80) === 0) {\n break;\n }\n }\n return result;\n }\n readBoxHeader() {\n let totalSize = this.readU32();\n const name = this.readAscii(4);\n let headerSize = 8;\n const hasLargeSize = totalSize === 1;\n if (hasLargeSize) {\n totalSize = this.readU64();\n headerSize = 16;\n }\n return { name, totalSize, headerSize, contentSize: totalSize - headerSize };\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n/** Wrapper around a number to be able to differentiate it in the writer. */\nexport class EBMLFloat32 {\n constructor(value) {\n this.value = value;\n }\n}\n/** Wrapper around a number to be able to differentiate it in the writer. */\nexport class EBMLFloat64 {\n constructor(value) {\n this.value = value;\n }\n}\n/** Wrapper around a number to be able to differentiate it in the writer. */\nexport class EBMLSignedInt {\n constructor(value) {\n this.value = value;\n }\n}\n/** Defines some of the EBML IDs used by Matroska files. */\nexport var EBMLId;\n(function (EBMLId) {\n EBMLId[EBMLId[\"EBML\"] = 440786851] = \"EBML\";\n EBMLId[EBMLId[\"EBMLVersion\"] = 17030] = \"EBMLVersion\";\n EBMLId[EBMLId[\"EBMLReadVersion\"] = 17143] = \"EBMLReadVersion\";\n EBMLId[EBMLId[\"EBMLMaxIDLength\"] = 17138] = \"EBMLMaxIDLength\";\n EBMLId[EBMLId[\"EBMLMaxSizeLength\"] = 17139] = \"EBMLMaxSizeLength\";\n EBMLId[EBMLId[\"DocType\"] = 17026] = \"DocType\";\n EBMLId[EBMLId[\"DocTypeVersion\"] = 17031] = \"DocTypeVersion\";\n EBMLId[EBMLId[\"DocTypeReadVersion\"] = 17029] = \"DocTypeReadVersion\";\n EBMLId[EBMLId[\"SeekHead\"] = 290298740] = \"SeekHead\";\n EBMLId[EBMLId[\"Seek\"] = 19899] = \"Seek\";\n EBMLId[EBMLId[\"SeekID\"] = 21419] = \"SeekID\";\n EBMLId[EBMLId[\"SeekPosition\"] = 21420] = \"SeekPosition\";\n EBMLId[EBMLId[\"Duration\"] = 17545] = \"Duration\";\n EBMLId[EBMLId[\"Info\"] = 357149030] = \"Info\";\n EBMLId[EBMLId[\"TimestampScale\"] = 2807729] = \"TimestampScale\";\n EBMLId[EBMLId[\"MuxingApp\"] = 19840] = \"MuxingApp\";\n EBMLId[EBMLId[\"WritingApp\"] = 22337] = \"WritingApp\";\n EBMLId[EBMLId[\"Tracks\"] = 374648427] = \"Tracks\";\n EBMLId[EBMLId[\"TrackEntry\"] = 174] = \"TrackEntry\";\n EBMLId[EBMLId[\"TrackNumber\"] = 215] = \"TrackNumber\";\n EBMLId[EBMLId[\"TrackUID\"] = 29637] = \"TrackUID\";\n EBMLId[EBMLId[\"TrackType\"] = 131] = \"TrackType\";\n EBMLId[EBMLId[\"FlagEnabled\"] = 185] = \"FlagEnabled\";\n EBMLId[EBMLId[\"FlagDefault\"] = 136] = \"FlagDefault\";\n EBMLId[EBMLId[\"FlagForced\"] = 21930] = \"FlagForced\";\n EBMLId[EBMLId[\"FlagLacing\"] = 156] = \"FlagLacing\";\n EBMLId[EBMLId[\"Language\"] = 2274716] = \"Language\";\n EBMLId[EBMLId[\"CodecID\"] = 134] = \"CodecID\";\n EBMLId[EBMLId[\"CodecPrivate\"] = 25506] = \"CodecPrivate\";\n EBMLId[EBMLId[\"CodecDelay\"] = 22186] = \"CodecDelay\";\n EBMLId[EBMLId[\"SeekPreRoll\"] = 22203] = \"SeekPreRoll\";\n EBMLId[EBMLId[\"DefaultDuration\"] = 2352003] = \"DefaultDuration\";\n EBMLId[EBMLId[\"Video\"] = 224] = \"Video\";\n EBMLId[EBMLId[\"PixelWidth\"] = 176] = \"PixelWidth\";\n EBMLId[EBMLId[\"PixelHeight\"] = 186] = \"PixelHeight\";\n EBMLId[EBMLId[\"Audio\"] = 225] = \"Audio\";\n EBMLId[EBMLId[\"SamplingFrequency\"] = 181] = \"SamplingFrequency\";\n EBMLId[EBMLId[\"Channels\"] = 159] = \"Channels\";\n EBMLId[EBMLId[\"BitDepth\"] = 25188] = \"BitDepth\";\n EBMLId[EBMLId[\"Segment\"] = 408125543] = \"Segment\";\n EBMLId[EBMLId[\"SimpleBlock\"] = 163] = \"SimpleBlock\";\n EBMLId[EBMLId[\"BlockGroup\"] = 160] = \"BlockGroup\";\n EBMLId[EBMLId[\"Block\"] = 161] = \"Block\";\n EBMLId[EBMLId[\"BlockAdditions\"] = 30113] = \"BlockAdditions\";\n EBMLId[EBMLId[\"BlockMore\"] = 166] = \"BlockMore\";\n EBMLId[EBMLId[\"BlockAdditional\"] = 165] = \"BlockAdditional\";\n EBMLId[EBMLId[\"BlockAddID\"] = 238] = \"BlockAddID\";\n EBMLId[EBMLId[\"BlockDuration\"] = 155] = \"BlockDuration\";\n EBMLId[EBMLId[\"ReferenceBlock\"] = 251] = \"ReferenceBlock\";\n EBMLId[EBMLId[\"Cluster\"] = 524531317] = \"Cluster\";\n EBMLId[EBMLId[\"Timestamp\"] = 231] = \"Timestamp\";\n EBMLId[EBMLId[\"Cues\"] = 475249515] = \"Cues\";\n EBMLId[EBMLId[\"CuePoint\"] = 187] = \"CuePoint\";\n EBMLId[EBMLId[\"CueTime\"] = 179] = \"CueTime\";\n EBMLId[EBMLId[\"CueTrackPositions\"] = 183] = \"CueTrackPositions\";\n EBMLId[EBMLId[\"CueTrack\"] = 247] = \"CueTrack\";\n EBMLId[EBMLId[\"CueClusterPosition\"] = 241] = \"CueClusterPosition\";\n EBMLId[EBMLId[\"Colour\"] = 21936] = \"Colour\";\n EBMLId[EBMLId[\"MatrixCoefficients\"] = 21937] = \"MatrixCoefficients\";\n EBMLId[EBMLId[\"TransferCharacteristics\"] = 21946] = \"TransferCharacteristics\";\n EBMLId[EBMLId[\"Primaries\"] = 21947] = \"Primaries\";\n EBMLId[EBMLId[\"Range\"] = 21945] = \"Range\";\n EBMLId[EBMLId[\"Projection\"] = 30320] = \"Projection\";\n EBMLId[EBMLId[\"ProjectionType\"] = 30321] = \"ProjectionType\";\n EBMLId[EBMLId[\"ProjectionPoseRoll\"] = 30325] = \"ProjectionPoseRoll\";\n EBMLId[EBMLId[\"Attachments\"] = 423732329] = \"Attachments\";\n EBMLId[EBMLId[\"Chapters\"] = 272869232] = \"Chapters\";\n EBMLId[EBMLId[\"Tags\"] = 307544935] = \"Tags\";\n})(EBMLId || (EBMLId = {}));\nexport const LEVEL_0_EBML_IDS = [\n EBMLId.EBML,\n EBMLId.Segment,\n];\nexport const LEVEL_1_EBML_IDS = [\n EBMLId.EBMLMaxIDLength,\n EBMLId.EBMLMaxSizeLength,\n EBMLId.SeekHead,\n EBMLId.Info,\n EBMLId.Cluster,\n EBMLId.Tracks,\n EBMLId.Cues,\n EBMLId.Attachments,\n EBMLId.Chapters,\n EBMLId.Tags,\n];\nexport const LEVEL_0_AND_1_EBML_IDS = [\n ...LEVEL_0_EBML_IDS,\n ...LEVEL_1_EBML_IDS,\n];\nexport const measureUnsignedInt = (value) => {\n if (value < (1 << 8)) {\n return 1;\n }\n else if (value < (1 << 16)) {\n return 2;\n }\n else if (value < (1 << 24)) {\n return 3;\n }\n else if (value < 2 ** 32) {\n return 4;\n }\n else if (value < 2 ** 40) {\n return 5;\n }\n else {\n return 6;\n }\n};\nexport const measureSignedInt = (value) => {\n if (value >= -(1 << 6) && value < (1 << 6)) {\n return 1;\n }\n else if (value >= -(1 << 13) && value < (1 << 13)) {\n return 2;\n }\n else if (value >= -(1 << 20) && value < (1 << 20)) {\n return 3;\n }\n else if (value >= -(1 << 27) && value < (1 << 27)) {\n return 4;\n }\n else if (value >= -(2 ** 34) && value < 2 ** 34) {\n return 5;\n }\n else {\n return 6;\n }\n};\nexport const measureVarInt = (value) => {\n if (value < (1 << 7) - 1) {\n /** Top bit is set, leaving 7 bits to hold the integer, but we can't store\n * 127 because \"all bits set to one\" is a reserved value. Same thing for the\n * other cases below:\n */\n return 1;\n }\n else if (value < (1 << 14) - 1) {\n return 2;\n }\n else if (value < (1 << 21) - 1) {\n return 3;\n }\n else if (value < (1 << 28) - 1) {\n return 4;\n }\n else if (value < 2 ** 35 - 1) {\n return 5;\n }\n else if (value < 2 ** 42 - 1) {\n return 6;\n }\n else {\n throw new Error('EBML varint size not supported ' + value);\n }\n};\nexport class EBMLWriter {\n constructor(writer) {\n this.writer = writer;\n this.helper = new Uint8Array(8);\n this.helperView = new DataView(this.helper.buffer);\n /**\n * Stores the position from the start of the file to where EBML elements have been written. This is used to\n * rewrite/edit elements that were already added before, and to measure sizes of things.\n */\n this.offsets = new WeakMap();\n /** Same as offsets, but stores position where the element's data starts (after ID and size fields). */\n this.dataOffsets = new WeakMap();\n }\n writeByte(value) {\n this.helperView.setUint8(0, value);\n this.writer.write(this.helper.subarray(0, 1));\n }\n writeFloat32(value) {\n this.helperView.setFloat32(0, value, false);\n this.writer.write(this.helper.subarray(0, 4));\n }\n writeFloat64(value) {\n this.helperView.setFloat64(0, value, false);\n this.writer.write(this.helper);\n }\n writeUnsignedInt(value, width = measureUnsignedInt(value)) {\n let pos = 0;\n // Each case falls through:\n switch (width) {\n case 6:\n // Need to use division to access >32 bits of floating point var\n this.helperView.setUint8(pos++, (value / 2 ** 40) | 0);\n // eslint-disable-next-line no-fallthrough\n case 5:\n this.helperView.setUint8(pos++, (value / 2 ** 32) | 0);\n // eslint-disable-next-line no-fallthrough\n case 4:\n this.helperView.setUint8(pos++, value >> 24);\n // eslint-disable-next-line no-fallthrough\n case 3:\n this.helperView.setUint8(pos++, value >> 16);\n // eslint-disable-next-line no-fallthrough\n case 2:\n this.helperView.setUint8(pos++, value >> 8);\n // eslint-disable-next-line no-fallthrough\n case 1:\n this.helperView.setUint8(pos++, value);\n break;\n default:\n throw new Error('Bad unsigned int size ' + width);\n }\n this.writer.write(this.helper.subarray(0, pos));\n }\n writeSignedInt(value, width = measureSignedInt(value)) {\n if (value < 0) {\n // Two's complement stuff\n value += 2 ** (width * 8);\n }\n this.writeUnsignedInt(value, width);\n }\n writeVarInt(value, width = measureVarInt(value)) {\n let pos = 0;\n switch (width) {\n case 1:\n this.helperView.setUint8(pos++, (1 << 7) | value);\n break;\n case 2:\n this.helperView.setUint8(pos++, (1 << 6) | (value >> 8));\n this.helperView.setUint8(pos++, value);\n break;\n case 3:\n this.helperView.setUint8(pos++, (1 << 5) | (value >> 16));\n this.helperView.setUint8(pos++, value >> 8);\n this.helperView.setUint8(pos++, value);\n break;\n case 4:\n this.helperView.setUint8(pos++, (1 << 4) | (value >> 24));\n this.helperView.setUint8(pos++, value >> 16);\n this.helperView.setUint8(pos++, value >> 8);\n this.helperView.setUint8(pos++, value);\n break;\n case 5:\n /**\n * JavaScript converts its doubles to 32-bit integers for bitwise\n * operations, so we need to do a division by 2^32 instead of a\n * right-shift of 32 to retain those top 3 bits\n */\n this.helperView.setUint8(pos++, (1 << 3) | ((value / 2 ** 32) & 0x7));\n this.helperView.setUint8(pos++, value >> 24);\n this.helperView.setUint8(pos++, value >> 16);\n this.helperView.setUint8(pos++, value >> 8);\n this.helperView.setUint8(pos++, value);\n break;\n case 6:\n this.helperView.setUint8(pos++, (1 << 2) | ((value / 2 ** 40) & 0x3));\n this.helperView.setUint8(pos++, (value / 2 ** 32) | 0);\n this.helperView.setUint8(pos++, value >> 24);\n this.helperView.setUint8(pos++, value >> 16);\n this.helperView.setUint8(pos++, value >> 8);\n this.helperView.setUint8(pos++, value);\n break;\n default:\n throw new Error('Bad EBML varint size ' + width);\n }\n this.writer.write(this.helper.subarray(0, pos));\n }\n // Assumes the string is ASCII\n writeString(str) {\n this.writer.write(new Uint8Array(str.split('').map(x => x.charCodeAt(0))));\n }\n writeEBML(data) {\n if (data === null)\n return;\n if (data instanceof Uint8Array) {\n this.writer.write(data);\n }\n else if (Array.isArray(data)) {\n for (const elem of data) {\n this.writeEBML(elem);\n }\n }\n else {\n this.offsets.set(data, this.writer.getPos());\n this.writeUnsignedInt(data.id); // ID field\n if (Array.isArray(data.data)) {\n const sizePos = this.writer.getPos();\n const sizeSize = data.size === -1 ? 1 : (data.size ?? 4);\n if (data.size === -1) {\n // Write the reserved all-one-bits marker for unknown/unbounded size.\n this.writeByte(0xff);\n }\n else {\n this.writer.seek(this.writer.getPos() + sizeSize);\n }\n const startPos = this.writer.getPos();\n this.dataOffsets.set(data, startPos);\n this.writeEBML(data.data);\n if (data.size !== -1) {\n const size = this.writer.getPos() - startPos;\n const endPos = this.writer.getPos();\n this.writer.seek(sizePos);\n this.writeVarInt(size, sizeSize);\n this.writer.seek(endPos);\n }\n }\n else if (typeof data.data === 'number') {\n const size = data.size ?? measureUnsignedInt(data.data);\n this.writeVarInt(size);\n this.writeUnsignedInt(data.data, size);\n }\n else if (typeof data.data === 'string') {\n this.writeVarInt(data.data.length);\n this.writeString(data.data);\n }\n else if (data.data instanceof Uint8Array) {\n this.writeVarInt(data.data.byteLength, data.size);\n this.writer.write(data.data);\n }\n else if (data.data instanceof EBMLFloat32) {\n this.writeVarInt(4);\n this.writeFloat32(data.data.value);\n }\n else if (data.data instanceof EBMLFloat64) {\n this.writeVarInt(8);\n this.writeFloat64(data.data.value);\n }\n else if (data.data instanceof EBMLSignedInt) {\n const size = data.size ?? measureSignedInt(data.data.value);\n this.writeVarInt(size);\n this.writeSignedInt(data.data.value, size);\n }\n }\n }\n}\nconst MAX_VAR_INT_SIZE = 8;\nexport const MIN_HEADER_SIZE = 2; // 1-byte ID and 1-byte size\nexport const MAX_HEADER_SIZE = 4 + MAX_VAR_INT_SIZE; // 4-byte ID and 8-byte size\nexport class EBMLReader {\n constructor(reader) {\n this.reader = reader;\n this.pos = 0;\n }\n readBytes(length) {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + length);\n this.pos += length;\n return new Uint8Array(view.buffer, offset, length);\n }\n readU8() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 1);\n this.pos++;\n return view.getUint8(offset);\n }\n readS16() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 2);\n this.pos += 2;\n return view.getInt16(offset, false);\n }\n readVarIntSize() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 1);\n const firstByte = view.getUint8(offset);\n let width = 1;\n let mask = 0x80;\n while ((firstByte & mask) === 0 && width < 8) {\n width++;\n mask >>= 1;\n }\n return width;\n }\n readVarInt() {\n // Read the first byte to determine the width of the variable-length integer\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 1);\n const firstByte = view.getUint8(offset);\n // Find the position of VINT_MARKER, which determines the width\n let width = 1;\n let mask = 1 << 7;\n while ((firstByte & mask) === 0 && width < MAX_VAR_INT_SIZE) {\n width++;\n mask >>= 1;\n }\n const { view: fullView, offset: fullOffset } = this.reader.getViewAndOffset(this.pos, this.pos + width);\n // First byte's value needs the marker bit cleared\n let value = firstByte & (mask - 1);\n // Read remaining bytes\n for (let i = 1; i < width; i++) {\n value *= 1 << 8;\n value += fullView.getUint8(fullOffset + i);\n }\n this.pos += width;\n return value;\n }\n readUnsignedInt(width) {\n if (width < 1 || width > 8) {\n throw new Error('Bad unsigned int size ' + width);\n }\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + width);\n let value = 0;\n // Read bytes from most significant to least significant\n for (let i = 0; i < width; i++) {\n value *= 1 << 8;\n value += view.getUint8(offset + i);\n }\n this.pos += width;\n return value;\n }\n readSignedInt(width) {\n let value = this.readUnsignedInt(width);\n // If the highest bit is set, convert from two's complement\n if (value & (1 << (width * 8 - 1))) {\n value -= 2 ** (width * 8);\n }\n return value;\n }\n readFloat(width) {\n if (width === 0) {\n return 0;\n }\n if (width !== 4 && width !== 8) {\n throw new Error('Bad float size ' + width);\n }\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + width);\n const value = width === 4 ? view.getFloat32(offset, false) : view.getFloat64(offset, false);\n this.pos += width;\n return value;\n }\n readString(length) {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + length);\n this.pos += length;\n return String.fromCharCode(...new Uint8Array(view.buffer, offset, length));\n }\n readElementId() {\n const size = this.readVarIntSize();\n const id = this.readUnsignedInt(size);\n return id;\n }\n readElementSize() {\n let size = this.readU8();\n if (size === 0xff) {\n size = null;\n }\n else {\n this.pos--;\n size = this.readVarInt();\n // In some (livestreamed) files, this is the value of the size field. While this technically is just a very\n // large number, it is intended to behave like the reserved size 0xFF, meaning the size is undefined. We\n // catch the number here. Note that it cannot be perfectly represented as a double, but the comparison works\n // nonetheless.\n // eslint-disable-next-line no-loss-of-precision\n if (size === 0x00ffffffffffffff) {\n size = null;\n }\n }\n return size;\n }\n readElementHeader() {\n const id = this.readElementId();\n const size = this.readElementSize();\n return { id, size };\n }\n /** Returns the byte offset in the file of the next element with a matching ID. */\n async searchForNextElementId(ids, until) {\n const loadChunkSize = 2 ** 20; // 1 MiB\n const idsSet = new Set(ids);\n while (this.pos < until - MAX_HEADER_SIZE) {\n if (!this.reader.rangeIsLoaded(this.pos, this.pos + MAX_HEADER_SIZE)) {\n await this.reader.loadRange(this.pos, Math.min(this.pos + loadChunkSize, until));\n }\n const elementStartPos = this.pos;\n const elementHeader = this.readElementHeader();\n if (idsSet.has(elementHeader.id)) {\n return elementStartPos;\n }\n assertDefinedSize(elementHeader.size);\n this.pos += elementHeader.size;\n }\n return null;\n }\n}\nexport const CODEC_STRING_MAP = {\n 'avc': 'V_MPEG4/ISO/AVC',\n 'hevc': 'V_MPEGH/ISO/HEVC',\n 'vp8': 'V_VP8',\n 'vp9': 'V_VP9',\n 'av1': 'V_AV1',\n 'aac': 'A_AAC',\n 'mp3': 'A_MPEG/L3',\n 'opus': 'A_OPUS',\n 'vorbis': 'A_VORBIS',\n 'flac': 'A_FLAC',\n 'pcm-u8': 'A_PCM/INT/LIT',\n 'pcm-s16': 'A_PCM/INT/LIT',\n 'pcm-s16be': 'A_PCM/INT/BIG',\n 'pcm-s24': 'A_PCM/INT/LIT',\n 'pcm-s24be': 'A_PCM/INT/BIG',\n 'pcm-s32': 'A_PCM/INT/LIT',\n 'pcm-s32be': 'A_PCM/INT/BIG',\n 'pcm-f32': 'A_PCM/FLOAT/IEEE',\n 'pcm-f64': 'A_PCM/FLOAT/IEEE',\n 'webvtt': 'S_TEXT/WEBVTT',\n};\nexport function assertDefinedSize(size) {\n if (size === null) {\n throw new Error('Undefined element size is used in a place where it is not supported.');\n }\n}\n;\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nexport const buildMatroskaMimeType = (info) => {\n const base = info.hasVideo\n ? 'video/'\n : info.hasAudio\n ? 'audio/'\n : 'application/';\n let string = base + (info.isWebM ? 'webm' : 'x-matroska');\n if (info.codecStrings.length > 0) {\n const uniqueCodecMimeTypes = [...new Set(info.codecStrings.filter(Boolean))];\n string += `; codecs=\"${uniqueCodecMimeTypes.join(', ')}\"`;\n }\n return string;\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nexport const FRAME_HEADER_SIZE = 4;\n// These are in kbps:\nexport const MPEG_V1_BITRATES = {\n // Layer 3\n 1: [-1, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1],\n // Layer 2\n 2: [-1, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, -1],\n // Layer 1\n 3: [-1, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, -1],\n};\nexport const MPEG_V2_BITRATES = {\n // Layer 3\n 1: [-1, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, -1],\n // Layer 2\n 2: [-1, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1],\n // Layer 1\n 3: [-1, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1],\n};\nexport const SAMPLING_RATES = {\n // MPEG Version 2.5\n 0: [11025, 12000, 8000, -1],\n // MPEG Version 2 (ISO/IEC 13818-3)\n 2: [22050, 24000, 16000, -1],\n // MPEG Version 1 (ISO/IEC 11172-3)\n 3: [44100, 48000, 32000, -1],\n};\n/** 'Xing' */\nexport const XING = 0x58696e67;\n/** 'Info' */\nexport const INFO = 0x496e666f;\nexport const computeMp3FrameSize = (layer, bitrate, sampleRate, padding) => {\n if (layer === 3) {\n // Layer 1\n return Math.floor((12 * bitrate / sampleRate + padding) * 4);\n }\n else {\n return Math.floor((144 * bitrate / sampleRate) + padding);\n }\n};\nexport const getXingOffset = (mpegVersionId, channel) => {\n return mpegVersionId === 3\n ? (channel === 3 ? 21 : 36)\n : (channel === 3 ? 13 : 21);\n};\nexport const readFrameHeader = (word, reader) => {\n const startPos = reader.pos;\n const firstByte = word >>> 24;\n const secondByte = (word >>> 16) & 0xff;\n const thirdByte = (word >>> 8) & 0xff;\n const fourthByte = word & 0xff;\n if (firstByte !== 0xff && secondByte !== 0xff && thirdByte !== 0xff && fourthByte !== 0xff) {\n reader.pos += 4;\n return null;\n }\n reader.pos += 1;\n if (firstByte !== 0xff) {\n return null;\n }\n if ((secondByte & 0xe0) !== 0xe0) {\n return null;\n }\n const mpegVersionId = (secondByte >> 3) & 0x3;\n const layer = (secondByte >> 1) & 0x3;\n const bitrateIndex = (thirdByte >> 4) & 0xf;\n const frequencyIndex = (thirdByte >> 2) & 0x3;\n const padding = (thirdByte >> 1) & 0x1;\n const channel = (fourthByte >> 6) & 0x3;\n const modeExtension = (fourthByte >> 4) & 0x3;\n const copyright = (fourthByte >> 3) & 0x1;\n const original = (fourthByte >> 2) & 0x1;\n const emphasis = fourthByte & 0x3;\n const kilobitRate = mpegVersionId === 3\n ? MPEG_V1_BITRATES[layer]?.[bitrateIndex]\n : MPEG_V2_BITRATES[layer]?.[bitrateIndex];\n if (!kilobitRate || kilobitRate === -1) {\n return null;\n }\n const bitrate = kilobitRate * 1000;\n const sampleRate = SAMPLING_RATES[mpegVersionId]?.[frequencyIndex];\n if (!sampleRate || sampleRate === -1) {\n return null;\n }\n const frameLength = computeMp3FrameSize(layer, bitrate, sampleRate, padding);\n if (reader.fileSize !== null && reader.fileSize - startPos < frameLength) {\n // The frame doesn't fit into the rest of the file\n return null;\n }\n let audioSamplesInFrame;\n if (mpegVersionId === 3) {\n audioSamplesInFrame = layer === 3 ? 384 : 1152;\n }\n else {\n if (layer === 3) {\n audioSamplesInFrame = 384;\n }\n else if (layer === 2) {\n audioSamplesInFrame = 1152;\n }\n else {\n audioSamplesInFrame = 576;\n }\n }\n return {\n startPos: startPos,\n totalSize: frameLength,\n mpegVersionId,\n layer,\n bitrate,\n frequencyIndex,\n sampleRate,\n channel,\n modeExtension,\n copyright,\n original,\n emphasis,\n audioSamplesInFrame,\n };\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { parseOpusTocByte } from '../codec-data.js';\nimport { assert, ilog, toDataView } from '../misc.js';\nexport const OGGS = 0x5367674f; // 'OggS'\nconst OGG_CRC_POLYNOMIAL = 0x04c11db7;\nconst OGG_CRC_TABLE = new Uint32Array(256);\nfor (let n = 0; n < 256; n++) {\n let crc = n << 24;\n for (let k = 0; k < 8; k++) {\n crc = (crc & 0x80000000)\n ? ((crc << 1) ^ OGG_CRC_POLYNOMIAL)\n : (crc << 1);\n }\n OGG_CRC_TABLE[n] = (crc >>> 0) & 0xffffffff;\n}\nexport const computeOggPageCrc = (bytes) => {\n const view = toDataView(bytes);\n const originalChecksum = view.getUint32(22, true);\n view.setUint32(22, 0, true); // Zero out checksum field\n let crc = 0;\n for (let i = 0; i < bytes.length; i++) {\n const byte = bytes[i];\n crc = ((crc << 8) ^ OGG_CRC_TABLE[(crc >>> 24) ^ byte]) >>> 0;\n }\n view.setUint32(22, originalChecksum, true); // Restore checksum field\n return crc;\n};\nexport const extractSampleMetadata = (data, codecInfo, vorbisLastBlocksize) => {\n let durationInSamples = 0;\n let currentBlocksize = null;\n if (data.length > 0) {\n // To know sample duration, we'll need to peak inside the packet\n if (codecInfo.codec === 'vorbis') {\n assert(codecInfo.vorbisInfo);\n const vorbisModeCount = codecInfo.vorbisInfo.modeBlockflags.length;\n const bitCount = ilog(vorbisModeCount - 1);\n const modeMask = ((1 << bitCount) - 1) << 1;\n const modeNumber = (data[0] & modeMask) >> 1;\n if (modeNumber >= codecInfo.vorbisInfo.modeBlockflags.length) {\n throw new Error('Invalid mode number.');\n }\n // In Vorbis, packet duration also depends on the blocksize of the previous packet\n let prevBlocksize = vorbisLastBlocksize;\n const blockflag = codecInfo.vorbisInfo.modeBlockflags[modeNumber];\n currentBlocksize = codecInfo.vorbisInfo.blocksizes[blockflag];\n if (blockflag === 1) {\n const prevMask = (modeMask | 0x1) + 1;\n const flag = data[0] & prevMask ? 1 : 0;\n prevBlocksize = codecInfo.vorbisInfo.blocksizes[flag];\n }\n durationInSamples = prevBlocksize !== null\n ? (prevBlocksize + currentBlocksize) >> 2\n : 0; // The first sample outputs no audio data and therefore has a duration of 0\n }\n else if (codecInfo.codec === 'opus') {\n const toc = parseOpusTocByte(data);\n durationInSamples = toc.durationInSamples;\n }\n }\n return {\n durationInSamples,\n vorbisBlockSize: currentBlocksize,\n };\n};\nexport const buildOggMimeType = (info) => {\n let string = 'audio/ogg';\n if (info.codecStrings) {\n const uniqueCodecMimeTypes = [...new Set(info.codecStrings)];\n string += `; codecs=\"${uniqueCodecMimeTypes.join(', ')}\"`;\n }\n return string;\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { OGGS } from './ogg-misc.js';\nexport const MIN_PAGE_HEADER_SIZE = 27;\nexport const MAX_PAGE_HEADER_SIZE = 27 + 255;\nexport const MAX_PAGE_SIZE = MAX_PAGE_HEADER_SIZE + 255 * 255;\nexport class OggReader {\n constructor(reader) {\n this.reader = reader;\n this.pos = 0;\n }\n readBytes(length) {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + length);\n this.pos += length;\n return new Uint8Array(view.buffer, offset, length);\n }\n readU8() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 1);\n this.pos += 1;\n return view.getUint8(offset);\n }\n readU32() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 4);\n this.pos += 4;\n return view.getUint32(offset, true);\n }\n readI32() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 4);\n this.pos += 4;\n return view.getInt32(offset, true);\n }\n readI64() {\n const low = this.readU32();\n const high = this.readI32();\n return high * 0x100000000 + low;\n }\n readAscii(length) {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + length);\n this.pos += length;\n let str = '';\n for (let i = 0; i < length; i++) {\n str += String.fromCharCode(view.getUint8(offset + i));\n }\n return str;\n }\n readPageHeader() {\n const startPos = this.pos;\n const capturePattern = this.readU32();\n if (capturePattern !== OGGS) {\n return null;\n }\n this.pos += 1; // Version\n const headerType = this.readU8();\n const granulePosition = this.readI64();\n const serialNumber = this.readU32();\n const sequenceNumber = this.readU32();\n const checksum = this.readU32();\n const numberPageSegments = this.readU8();\n const lacingValues = new Uint8Array(numberPageSegments);\n for (let i = 0; i < numberPageSegments; i++) {\n lacingValues[i] = this.readU8();\n }\n const headerSize = 27 + numberPageSegments;\n const dataSize = lacingValues.reduce((a, b) => a + b, 0);\n const totalSize = headerSize + dataSize;\n return {\n headerStartPos: startPos,\n totalSize,\n dataStartPos: startPos + headerSize,\n dataSize,\n headerType,\n granulePosition,\n serialNumber,\n sequenceNumber,\n checksum,\n lacingValues,\n };\n }\n findNextPageHeader(until) {\n while (this.pos < until - (4 - 1)) { // Size of word minus 1\n const word = this.readU32();\n const firstByte = word & 0xff;\n const secondByte = (word >>> 8) & 0xff;\n const thirdByte = (word >>> 16) & 0xff;\n const fourthByte = (word >>> 24) & 0xff;\n const O = 0x4f; // 'O'\n if (firstByte !== O && secondByte !== O && thirdByte !== O && fourthByte !== O) {\n continue;\n }\n this.pos -= 4;\n if (word === OGGS) {\n // We have found the capture pattern\n return true;\n }\n this.pos += 1;\n }\n return false;\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nexport class Demuxer {\n constructor(input) {\n this.input = input;\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { SECOND_TO_MICROSECOND_FACTOR } from './misc.js';\nexport const PLACEHOLDER_DATA = new Uint8Array(0);\n/**\n * Represents an encoded chunk of media. Mainly used as an expressive wrapper around WebCodecs API's EncodedVideoChunk\n * and EncodedAudioChunk, but can also be used standalone.\n * @public\n */\nexport class EncodedPacket {\n constructor(\n /** The encoded data of this packet. */\n data, \n /** The type of this packet. */\n type, \n /**\n * The presentation timestamp of this packet in seconds. May be negative. Samples with negative end timestamps\n * should not be presented.\n */\n timestamp, \n /** The duration of this packet in seconds. */\n duration, \n /**\n * The sequence number indicates the decode order of the packets. Packet A must be decoded before packet B if A\n * has a lower sequence number than B. If two packets have the same sequence number, they are the same packet.\n * Otherwise, sequence numbers are arbitrary and are not guaranteed to have any meaning besides their relative\n * ordering. Negative sequence numbers mean the sequence number is undefined.\n */\n sequenceNumber = -1, byteLength) {\n this.data = data;\n this.type = type;\n this.timestamp = timestamp;\n this.duration = duration;\n this.sequenceNumber = sequenceNumber;\n if (data === PLACEHOLDER_DATA && byteLength === undefined) {\n throw new Error('Internal error: byteLength must be explicitly provided when constructing metadata-only packets.');\n }\n if (byteLength === undefined) {\n byteLength = data.byteLength;\n }\n if (!(data instanceof Uint8Array)) {\n throw new TypeError('data must be a Uint8Array.');\n }\n if (type !== 'key' && type !== 'delta') {\n throw new TypeError('type must be either \"key\" or \"delta\".');\n }\n if (!Number.isFinite(timestamp)) {\n throw new TypeError('timestamp must be a number.');\n }\n if (!Number.isFinite(duration) || duration < 0) {\n throw new TypeError('duration must be a non-negative number.');\n }\n if (!Number.isFinite(sequenceNumber)) {\n throw new TypeError('sequenceNumber must be a number.');\n }\n if (!Number.isInteger(byteLength) || byteLength < 0) {\n throw new TypeError('byteLength must be a non-negative integer.');\n }\n this.byteLength = byteLength;\n }\n /** If this packet is a metadata-only packet. Metadata-only packets don't contain their packet data. */\n get isMetadataOnly() {\n return this.data === PLACEHOLDER_DATA;\n }\n /** The timestamp of this packet in microseconds. */\n get microsecondTimestamp() {\n return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.timestamp);\n }\n /** The duration of this packet in microseconds. */\n get microsecondDuration() {\n return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.duration);\n }\n /** Converts this packet to an EncodedVideoChunk for use with the WebCodecs API. */\n toEncodedVideoChunk() {\n if (this.isMetadataOnly) {\n throw new TypeError('Metadata-only packets cannot be converted to a video chunk.');\n }\n if (typeof EncodedVideoChunk === 'undefined') {\n throw new Error('Your browser does not support EncodedVideoChunk.');\n }\n return new EncodedVideoChunk({\n data: this.data,\n type: this.type,\n timestamp: this.microsecondTimestamp,\n duration: this.microsecondDuration,\n });\n }\n /** Converts this packet to an EncodedAudioChunk for use with the WebCodecs API. */\n toEncodedAudioChunk() {\n if (this.isMetadataOnly) {\n throw new TypeError('Metadata-only packets cannot be converted to an audio chunk.');\n }\n if (typeof EncodedAudioChunk === 'undefined') {\n throw new Error('Your browser does not support EncodedAudioChunk.');\n }\n return new EncodedAudioChunk({\n data: this.data,\n type: this.type,\n timestamp: this.microsecondTimestamp,\n duration: this.microsecondDuration,\n });\n }\n /**\n * Creates an EncodedPacket from an EncodedVideoChunk or EncodedAudioChunk. This method is useful for converting\n * chunks from the WebCodecs API to EncodedPackets.\n */\n static fromEncodedChunk(chunk) {\n if (!(chunk instanceof EncodedVideoChunk || chunk instanceof EncodedAudioChunk)) {\n throw new TypeError('chunk must be an EncodedVideoChunk or EncodedAudioChunk.');\n }\n const data = new Uint8Array(chunk.byteLength);\n chunk.copyTo(data);\n return new EncodedPacket(data, chunk.type, chunk.timestamp / 1e6, (chunk.duration ?? 0) / 1e6);\n }\n /** Clones this packet while optionally updating timing information. */\n clone(options) {\n if (options !== undefined && (typeof options !== 'object' || options === null)) {\n throw new TypeError('options, when provided, must be an object.');\n }\n if (options?.timestamp !== undefined && !Number.isFinite(options.timestamp)) {\n throw new TypeError('options.timestamp, when provided, must be a number.');\n }\n if (options?.duration !== undefined && !Number.isFinite(options.duration)) {\n throw new TypeError('options.duration, when provided, must be a number.');\n }\n return new EncodedPacket(this.data, this.type, options?.timestamp ?? this.timestamp, options?.duration ?? this.duration, this.sequenceNumber, this.byteLength);\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { assert, clamp, isAllowSharedBufferSource, SECOND_TO_MICROSECOND_FACTOR, toDataView, toUint8Array, } from './misc.js';\n/**\n * Represents a raw, unencoded video sample (frame). Mainly used as an expressive wrapper around WebCodecs API's\n * VideoFrame, but can also be used standalone.\n * @public\n */\nexport class VideoSample {\n /** The width of the frame in pixels after rotation. */\n get displayWidth() {\n return this.rotation % 180 === 0 ? this.codedWidth : this.codedHeight;\n }\n /** The height of the frame in pixels after rotation. */\n get displayHeight() {\n return this.rotation % 180 === 0 ? this.codedHeight : this.codedWidth;\n }\n /** The presentation timestamp of the frame in microseconds. */\n get microsecondTimestamp() {\n return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.timestamp);\n }\n /** The duration of the frame in microseconds. */\n get microsecondDuration() {\n return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.duration);\n }\n constructor(data, init) {\n /** @internal */\n this._closed = false;\n if (data instanceof ArrayBuffer || ArrayBuffer.isView(data)) {\n if (!init || typeof init !== 'object') {\n throw new TypeError('init must be an object.');\n }\n if (!('format' in init) || typeof init.format !== 'string') {\n throw new TypeError('init.format must be a string.');\n }\n if (!Number.isInteger(init.codedWidth) || init.codedWidth <= 0) {\n throw new TypeError('init.codedWidth must be a positive integer.');\n }\n if (!Number.isInteger(init.codedHeight) || init.codedHeight <= 0) {\n throw new TypeError('init.codedHeight must be a positive integer.');\n }\n if (init.rotation !== undefined && ![0, 90, 180, 270].includes(init.rotation)) {\n throw new TypeError('init.rotation, when provided, must be 0, 90, 180, or 270.');\n }\n if (!Number.isFinite(init.timestamp)) {\n throw new TypeError('init.timestamp must be a number.');\n }\n if (init.duration !== undefined && (!Number.isFinite(init.duration) || init.duration < 0)) {\n throw new TypeError('init.duration, when provided, must be a non-negative number.');\n }\n this._data = toUint8Array(data).slice(); // Copy it\n this.format = init.format;\n this.codedWidth = init.codedWidth;\n this.codedHeight = init.codedHeight;\n this.rotation = init.rotation ?? 0;\n this.timestamp = init.timestamp;\n this.duration = init.duration ?? 0;\n this.colorSpace = new VideoColorSpace(init.colorSpace);\n }\n else if (typeof VideoFrame !== 'undefined' && data instanceof VideoFrame) {\n if (init?.rotation !== undefined && ![0, 90, 180, 270].includes(init.rotation)) {\n throw new TypeError('init.rotation, when provided, must be 0, 90, 180, or 270.');\n }\n if (init?.timestamp !== undefined && !Number.isFinite(init?.timestamp)) {\n throw new TypeError('init.timestamp, when provided, must be a number.');\n }\n if (init?.duration !== undefined && (!Number.isFinite(init.duration) || init.duration < 0)) {\n throw new TypeError('init.duration, when provided, must be a non-negative number.');\n }\n this._data = data;\n this.format = data.format;\n this.codedWidth = data.codedWidth;\n this.codedHeight = data.codedHeight;\n this.rotation = init?.rotation ?? 0;\n this.timestamp = init?.timestamp ?? data.timestamp / 1e6;\n this.duration = init?.duration ?? (data.duration ?? 0) / 1e6;\n this.colorSpace = data.colorSpace;\n }\n else if ((typeof HTMLImageElement !== 'undefined' && data instanceof HTMLImageElement)\n || (typeof SVGImageElement !== 'undefined' && data instanceof SVGImageElement)\n || (typeof ImageBitmap !== 'undefined' && data instanceof ImageBitmap)\n || (typeof HTMLVideoElement !== 'undefined' && data instanceof HTMLVideoElement)\n || (typeof HTMLCanvasElement !== 'undefined' && data instanceof HTMLCanvasElement)\n || (typeof OffscreenCanvas !== 'undefined' && data instanceof OffscreenCanvas)) {\n if (!init || typeof init !== 'object') {\n throw new TypeError('init must be an object.');\n }\n if (init.rotation !== undefined && ![0, 90, 180, 270].includes(init.rotation)) {\n throw new TypeError('init.rotation, when provided, must be 0, 90, 180, or 270.');\n }\n if (!Number.isFinite(init.timestamp)) {\n throw new TypeError('init.timestamp must be a number.');\n }\n if (init.duration !== undefined && (!Number.isFinite(init.duration) || init.duration < 0)) {\n throw new TypeError('init.duration, when provided, must be a non-negative number.');\n }\n if (typeof VideoFrame !== 'undefined') {\n return new VideoSample(new VideoFrame(data, {\n timestamp: Math.trunc(init.timestamp * SECOND_TO_MICROSECOND_FACTOR),\n duration: Math.trunc((init.duration ?? 0) * SECOND_TO_MICROSECOND_FACTOR),\n }), init);\n }\n let width = 0;\n let height = 0;\n // Determine the dimensions of the thing\n if ('naturalWidth' in data) {\n width = data.naturalWidth;\n height = data.naturalHeight;\n }\n else if ('videoWidth' in data) {\n width = data.videoWidth;\n height = data.videoHeight;\n }\n else if ('width' in data) {\n width = Number(data.width);\n height = Number(data.height);\n }\n if (!width || !height) {\n throw new TypeError('Could not determine dimensions.');\n }\n const canvas = new OffscreenCanvas(width, height);\n const context = canvas.getContext('2d', { alpha: false, willReadFrequently: true });\n assert(context);\n // Draw it to a canvas\n context.drawImage(data, 0, 0);\n this._data = canvas;\n this.format = 'RGBX';\n this.codedWidth = width;\n this.codedHeight = height;\n this.rotation = init.rotation ?? 0;\n this.timestamp = init.timestamp;\n this.duration = init.duration ?? 0;\n this.colorSpace = new VideoColorSpace({\n matrix: 'rgb',\n primaries: 'bt709',\n transfer: 'iec61966-2-1',\n fullRange: true,\n });\n }\n else {\n throw new TypeError('Invalid data type: Must be a BufferSource or CanvasImageSource.');\n }\n }\n /** Clones this video sample. */\n clone() {\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n assert(this._data !== null);\n if (isVideoFrame(this._data)) {\n return new VideoSample(this._data.clone(), {\n timestamp: this.timestamp,\n duration: this.duration,\n rotation: this.rotation,\n });\n }\n else if (this._data instanceof Uint8Array) {\n return new VideoSample(this._data.slice(), {\n format: this.format,\n codedWidth: this.codedWidth,\n codedHeight: this.codedHeight,\n timestamp: this.timestamp,\n duration: this.duration,\n colorSpace: this.colorSpace,\n rotation: this.rotation,\n });\n }\n else {\n return new VideoSample(this._data, {\n format: this.format,\n codedWidth: this.codedWidth,\n codedHeight: this.codedHeight,\n timestamp: this.timestamp,\n duration: this.duration,\n colorSpace: this.colorSpace,\n rotation: this.rotation,\n });\n }\n }\n /**\n * Closes this video sample, releasing held resources. Video samples should be closed as soon as they are not\n * needed anymore.\n */\n close() {\n if (this._closed) {\n return;\n }\n if (isVideoFrame(this._data)) {\n this._data.close();\n }\n else {\n this._data = null; // GC that shit\n }\n this._closed = true;\n }\n /** Returns the number of bytes required to hold this video sample's pixel data. */\n allocationSize() {\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n assert(this._data !== null);\n if (isVideoFrame(this._data)) {\n return this._data.allocationSize();\n }\n else if (this._data instanceof Uint8Array) {\n return this._data.byteLength;\n }\n else {\n return this.codedWidth * this.codedHeight * 4; // RGBX\n }\n }\n /** Copies this video sample's pixel data to an ArrayBuffer or ArrayBufferView. */\n async copyTo(destination) {\n if (!isAllowSharedBufferSource(destination)) {\n throw new TypeError('destination must be an ArrayBuffer or an ArrayBuffer view.');\n }\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n assert(this._data !== null);\n if (isVideoFrame(this._data)) {\n await this._data.copyTo(destination);\n }\n else if (this._data instanceof Uint8Array) {\n const dest = toUint8Array(destination);\n dest.set(this._data);\n }\n else {\n const canvas = this._data;\n const context = canvas.getContext('2d', { alpha: false });\n assert(context);\n const imageData = context.getImageData(0, 0, this.codedWidth, this.codedHeight);\n const dest = toUint8Array(destination);\n dest.set(imageData.data);\n }\n }\n /**\n * Converts this video sample to a VideoFrame for use with the WebCodecs API. The VideoFrame returned by this\n * method *must* be closed separately from this video sample.\n */\n toVideoFrame() {\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n assert(this._data !== null);\n if (isVideoFrame(this._data)) {\n return new VideoFrame(this._data, {\n timestamp: this.microsecondTimestamp,\n duration: this.microsecondDuration || undefined, // Drag 0 duration to undefined, glitches some codecs\n });\n }\n else if (this._data instanceof Uint8Array) {\n return new VideoFrame(this._data, {\n format: this.format,\n codedWidth: this.codedWidth,\n codedHeight: this.codedHeight,\n timestamp: this.microsecondTimestamp,\n duration: this.microsecondDuration,\n colorSpace: this.colorSpace,\n });\n }\n else {\n return new VideoFrame(this._data, {\n timestamp: this.microsecondTimestamp,\n duration: this.microsecondDuration,\n });\n }\n }\n draw(context, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) {\n let sx = 0;\n let sy = 0;\n let sWidth = this.displayWidth;\n let sHeight = this.displayHeight;\n let dx = 0;\n let dy = 0;\n let dWidth = this.displayWidth;\n let dHeight = this.displayHeight;\n if (arg5 !== undefined) {\n sx = arg1;\n sy = arg2;\n sWidth = arg3;\n sHeight = arg4;\n dx = arg5;\n dy = arg6;\n if (arg7 !== undefined) {\n dWidth = arg7;\n dHeight = arg8;\n }\n else {\n dWidth = sWidth;\n dHeight = sHeight;\n }\n }\n else {\n dx = arg1;\n dy = arg2;\n if (arg3 !== undefined) {\n dWidth = arg3;\n dHeight = arg4;\n }\n }\n if (!((typeof CanvasRenderingContext2D !== 'undefined' && context instanceof CanvasRenderingContext2D)\n || (typeof OffscreenCanvasRenderingContext2D !== 'undefined'\n && context instanceof OffscreenCanvasRenderingContext2D))) {\n throw new TypeError('context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.');\n }\n if (!Number.isFinite(sx)) {\n throw new TypeError('sx must be a number.');\n }\n if (!Number.isFinite(sy)) {\n throw new TypeError('sy must be a number.');\n }\n if (!Number.isFinite(sWidth) || sWidth < 0) {\n throw new TypeError('sWidth must be a non-negative number.');\n }\n if (!Number.isFinite(sHeight) || sHeight < 0) {\n throw new TypeError('sHeight must be a non-negative number.');\n }\n if (!Number.isFinite(dx)) {\n throw new TypeError('dx must be a number.');\n }\n if (!Number.isFinite(dy)) {\n throw new TypeError('dy must be a number.');\n }\n if (!Number.isFinite(dWidth) || dWidth < 0) {\n throw new TypeError('dWidth must be a non-negative number.');\n }\n if (!Number.isFinite(dHeight) || dHeight < 0) {\n throw new TypeError('dHeight must be a non-negative number.');\n }\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n // The provided sx,sy,sWidth,sHeight refer to the final rotated image, but that's not actually how the image is\n // stored. Therefore, we must map these back onto the original, pre-rotation image.\n if (this.rotation === 90) {\n [sx, sy, sWidth, sHeight] = [\n sy,\n this.codedHeight - sx - sWidth,\n sHeight,\n sWidth,\n ];\n }\n else if (this.rotation === 180) {\n [sx, sy] = [\n this.codedWidth - sx - sWidth,\n this.codedHeight - sy - sHeight,\n ];\n }\n else if (this.rotation === 270) {\n [sx, sy, sWidth, sHeight] = [\n this.codedWidth - sy - sHeight,\n sx,\n sHeight,\n sWidth,\n ];\n }\n const source = this.toCanvasImageSource();\n context.save();\n const centerX = dx + dWidth / 2;\n const centerY = dy + dHeight / 2;\n context.translate(centerX, centerY);\n context.rotate(this.rotation * Math.PI / 180);\n const aspectRatioChange = this.rotation % 180 === 0 ? 1 : dWidth / dHeight;\n // Scale to compensate for aspect ratio changes when rotated\n context.scale(1 / aspectRatioChange, aspectRatioChange);\n context.drawImage(source, sx, sy, sWidth, sHeight, -dWidth / 2, -dHeight / 2, dWidth, dHeight);\n // Restore the previous transformation state\n context.restore();\n }\n /**\n * Converts this video sample to a CanvasImageSource for drawing to a canvas.\n *\n * You must use the value returned by this method immediately, as any VideoFrame created internally will\n * automatically be closed in the next microtask.\n */\n toCanvasImageSource() {\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n assert(this._data !== null);\n if (this._data instanceof Uint8Array) {\n // Requires VideoFrame to be defined\n const videoFrame = this.toVideoFrame();\n queueMicrotask(() => videoFrame.close()); // Let's automatically close the frame in the next microtask\n return videoFrame;\n }\n else {\n return this._data;\n }\n }\n /** Sets the rotation metadata of this video sample. */\n setRotation(newRotation) {\n if (![0, 90, 180, 270].includes(newRotation)) {\n throw new TypeError('newRotation must be 0, 90, 180, or 270.');\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n this.rotation = newRotation;\n }\n /** Sets the presentation timestamp of this video sample, in seconds. */\n setTimestamp(newTimestamp) {\n if (!Number.isFinite(newTimestamp)) {\n throw new TypeError('newTimestamp must be a number.');\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n this.timestamp = newTimestamp;\n }\n /** Sets the duration of this video sample, in seconds. */\n setDuration(newDuration) {\n if (!Number.isFinite(newDuration) || newDuration < 0) {\n throw new TypeError('newDuration must be a non-negative number.');\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n this.duration = newDuration;\n }\n}\nconst isVideoFrame = (x) => {\n return typeof VideoFrame !== 'undefined' && x instanceof VideoFrame;\n};\nconst AUDIO_SAMPLE_FORMATS = new Set(['f32', 'f32-planar', 's16', 's16-planar', 's32', 's32-planar', 'u8', 'u8-planar']);\n/**\n * Represents a raw, unencoded audio sample. Mainly used as an expressive wrapper around WebCodecs API's AudioData,\n * but can also be used standalone.\n * @public\n */\nexport class AudioSample {\n /** The presentation timestamp of the sample in microseconds. */\n get microsecondTimestamp() {\n return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.timestamp);\n }\n /** The duration of the sample in microseconds. */\n get microsecondDuration() {\n return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.duration);\n }\n constructor(init) {\n /** @internal */\n this._closed = false;\n if (isAudioData(init)) {\n if (init.format === null) {\n throw new TypeError('AudioData with null format is not supported.');\n }\n this._data = init;\n this.format = init.format;\n this.sampleRate = init.sampleRate;\n this.numberOfFrames = init.numberOfFrames;\n this.numberOfChannels = init.numberOfChannels;\n this.timestamp = init.timestamp / 1e6;\n this.duration = init.numberOfFrames / init.sampleRate;\n }\n else {\n if (!init || typeof init !== 'object') {\n throw new TypeError('Invalid AudioDataInit: must be an object.');\n }\n if (!AUDIO_SAMPLE_FORMATS.has(init.format)) {\n throw new TypeError('Invalid AudioDataInit: invalid format.');\n }\n if (!Number.isFinite(init.sampleRate) || init.sampleRate <= 0) {\n throw new TypeError('Invalid AudioDataInit: sampleRate must be > 0.');\n }\n if (!Number.isInteger(init.numberOfChannels) || init.numberOfChannels === 0) {\n throw new TypeError('Invalid AudioDataInit: numberOfChannels must be an integer > 0.');\n }\n if (!Number.isFinite(init?.timestamp)) {\n throw new TypeError('init.timestamp must be a number.');\n }\n const numberOfFrames = init.data.byteLength / (getBytesPerSample(init.format) * init.numberOfChannels);\n if (!Number.isInteger(numberOfFrames)) {\n throw new TypeError('Invalid AudioDataInit: data size is not a multiple of frame size.');\n }\n this.format = init.format;\n this.sampleRate = init.sampleRate;\n this.numberOfFrames = numberOfFrames;\n this.numberOfChannels = init.numberOfChannels;\n this.timestamp = init.timestamp;\n this.duration = numberOfFrames / init.sampleRate;\n let dataBuffer;\n if (init.data instanceof ArrayBuffer) {\n dataBuffer = new Uint8Array(init.data);\n }\n else if (ArrayBuffer.isView(init.data)) {\n dataBuffer = new Uint8Array(init.data.buffer, init.data.byteOffset, init.data.byteLength);\n }\n else {\n throw new TypeError('Invalid AudioDataInit: data is not a BufferSource.');\n }\n const expectedSize = this.numberOfFrames * this.numberOfChannels * getBytesPerSample(this.format);\n if (dataBuffer.byteLength < expectedSize) {\n throw new TypeError('Invalid AudioDataInit: insufficient data size.');\n }\n this._data = dataBuffer;\n }\n }\n /** Returns the number of bytes required to hold the audio sample's data as specified by the given options. */\n allocationSize(options) {\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (!Number.isInteger(options.planeIndex) || options.planeIndex < 0) {\n throw new TypeError('planeIndex must be a non-negative integer.');\n }\n if (options.format !== undefined && !AUDIO_SAMPLE_FORMATS.has(options.format)) {\n throw new TypeError('Invalid format.');\n }\n if (options.frameOffset !== undefined && (!Number.isInteger(options.frameOffset) || options.frameOffset < 0)) {\n throw new TypeError('frameOffset must be a non-negative integer.');\n }\n if (options.frameCount !== undefined && (!Number.isInteger(options.frameCount) || options.frameCount < 0)) {\n throw new TypeError('frameCount must be a non-negative integer.');\n }\n if (this._closed) {\n throw new Error('AudioSample is closed.');\n }\n const destFormat = options.format ?? this.format;\n const frameOffset = options.frameOffset ?? 0;\n if (frameOffset >= this.numberOfFrames) {\n throw new RangeError('frameOffset out of range');\n }\n const copyFrameCount = options.frameCount !== undefined ? options.frameCount : (this.numberOfFrames - frameOffset);\n if (copyFrameCount > (this.numberOfFrames - frameOffset)) {\n throw new RangeError('frameCount out of range');\n }\n const bytesPerSample = getBytesPerSample(destFormat);\n const isPlanar = formatIsPlanar(destFormat);\n if (isPlanar && options.planeIndex >= this.numberOfChannels) {\n throw new RangeError('planeIndex out of range');\n }\n if (!isPlanar && options.planeIndex !== 0) {\n throw new RangeError('planeIndex out of range');\n }\n const elementCount = isPlanar ? copyFrameCount : copyFrameCount * this.numberOfChannels;\n return elementCount * bytesPerSample;\n }\n /** Copies the audio sample's data to an ArrayBuffer or ArrayBufferView as specified by the given options. */\n copyTo(destination, options) {\n if (!isAllowSharedBufferSource(destination)) {\n throw new TypeError('destination must be an ArrayBuffer or an ArrayBuffer view.');\n }\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (!Number.isInteger(options.planeIndex) || options.planeIndex < 0) {\n throw new TypeError('planeIndex must be a non-negative integer.');\n }\n if (options.format !== undefined && !AUDIO_SAMPLE_FORMATS.has(options.format)) {\n throw new TypeError('Invalid format.');\n }\n if (options.frameOffset !== undefined && (!Number.isInteger(options.frameOffset) || options.frameOffset < 0)) {\n throw new TypeError('frameOffset must be a non-negative integer.');\n }\n if (options.frameCount !== undefined && (!Number.isInteger(options.frameCount) || options.frameCount < 0)) {\n throw new TypeError('frameCount must be a non-negative integer.');\n }\n if (this._closed) {\n throw new Error('AudioSample is closed.');\n }\n const { planeIndex, format, frameCount: optFrameCount, frameOffset: optFrameOffset } = options;\n const destFormat = format ?? this.format;\n if (!destFormat)\n throw new Error('Destination format not determined');\n const numFrames = this.numberOfFrames;\n const numChannels = this.numberOfChannels;\n const frameOffset = optFrameOffset ?? 0;\n if (frameOffset >= numFrames) {\n throw new RangeError('frameOffset out of range');\n }\n const copyFrameCount = optFrameCount !== undefined ? optFrameCount : (numFrames - frameOffset);\n if (copyFrameCount > (numFrames - frameOffset)) {\n throw new RangeError('frameCount out of range');\n }\n const destBytesPerSample = getBytesPerSample(destFormat);\n const destIsPlanar = formatIsPlanar(destFormat);\n if (destIsPlanar && planeIndex >= numChannels) {\n throw new RangeError('planeIndex out of range');\n }\n if (!destIsPlanar && planeIndex !== 0) {\n throw new RangeError('planeIndex out of range');\n }\n const destElementCount = destIsPlanar ? copyFrameCount : copyFrameCount * numChannels;\n const requiredSize = destElementCount * destBytesPerSample;\n if (destination.byteLength < requiredSize) {\n throw new RangeError('Destination buffer is too small');\n }\n const destView = toDataView(destination);\n const writeFn = getWriteFunction(destFormat);\n if (isAudioData(this._data)) {\n if (destIsPlanar) {\n if (destFormat === 'f32-planar') {\n // Simple, since the browser must support f32-planar, we can just delegate here\n this._data.copyTo(destination, {\n planeIndex,\n frameOffset,\n frameCount: copyFrameCount,\n format: 'f32-planar',\n });\n }\n else {\n // Allocate temporary buffer for f32-planar data\n const tempBuffer = new ArrayBuffer(copyFrameCount * 4);\n const tempArray = new Float32Array(tempBuffer);\n this._data.copyTo(tempArray, {\n planeIndex,\n frameOffset,\n frameCount: copyFrameCount,\n format: 'f32-planar',\n });\n // Convert each f32 sample to destination format\n const tempView = new DataView(tempBuffer);\n for (let i = 0; i < copyFrameCount; i++) {\n const destOffset = i * destBytesPerSample;\n const sample = tempView.getFloat32(i * 4, true);\n writeFn(destView, destOffset, sample);\n }\n }\n }\n else {\n // Destination is interleaved.\n // Allocate a temporary Float32Array to hold one channel's worth of data.\n const numCh = numChannels;\n const temp = new Float32Array(copyFrameCount);\n for (let ch = 0; ch < numCh; ch++) {\n this._data.copyTo(temp, {\n planeIndex: ch,\n frameOffset,\n frameCount: copyFrameCount,\n format: 'f32-planar',\n });\n for (let i = 0; i < copyFrameCount; i++) {\n const destIndex = i * numCh + ch;\n const destOffset = destIndex * destBytesPerSample;\n writeFn(destView, destOffset, temp[i]);\n }\n }\n }\n }\n else {\n // Branch for Uint8Array data (non-AudioData)\n const uint8Data = this._data;\n const srcView = new DataView(uint8Data.buffer, uint8Data.byteOffset, uint8Data.byteLength);\n const srcFormat = this.format;\n const readFn = getReadFunction(srcFormat);\n const srcBytesPerSample = getBytesPerSample(srcFormat);\n const srcIsPlanar = formatIsPlanar(srcFormat);\n for (let i = 0; i < copyFrameCount; i++) {\n if (destIsPlanar) {\n const destOffset = i * destBytesPerSample;\n let srcOffset;\n if (srcIsPlanar) {\n srcOffset = (planeIndex * numFrames + (i + frameOffset)) * srcBytesPerSample;\n }\n else {\n srcOffset = (((i + frameOffset) * numChannels) + planeIndex) * srcBytesPerSample;\n }\n const normalized = readFn(srcView, srcOffset);\n writeFn(destView, destOffset, normalized);\n }\n else {\n for (let ch = 0; ch < numChannels; ch++) {\n const destIndex = i * numChannels + ch;\n const destOffset = destIndex * destBytesPerSample;\n let srcOffset;\n if (srcIsPlanar) {\n srcOffset = (ch * numFrames + (i + frameOffset)) * srcBytesPerSample;\n }\n else {\n srcOffset = (((i + frameOffset) * numChannels) + ch) * srcBytesPerSample;\n }\n const normalized = readFn(srcView, srcOffset);\n writeFn(destView, destOffset, normalized);\n }\n }\n }\n }\n }\n /** Clones this audio sample. */\n clone() {\n if (this._closed) {\n throw new Error('AudioSample is closed.');\n }\n if (isAudioData(this._data)) {\n const sample = new AudioSample(this._data.clone());\n sample.setTimestamp(this.timestamp); // Make sure the timestamp is precise (beyond microsecond accuracy)\n return sample;\n }\n else {\n return new AudioSample({\n format: this.format,\n sampleRate: this.sampleRate,\n numberOfFrames: this.numberOfFrames,\n numberOfChannels: this.numberOfChannels,\n timestamp: this.timestamp,\n data: this._data,\n });\n }\n }\n /**\n * Closes this audio sample, releasing held resources. Audio samples should be closed as soon as they are not\n * needed anymore.\n */\n close() {\n if (this._closed) {\n return;\n }\n if (isAudioData(this._data)) {\n this._data.close();\n }\n else {\n this._data = new Uint8Array(0);\n }\n this._closed = true;\n }\n /**\n * Converts this audio sample to an AudioData for use with the WebCodecs API. The AudioData returned by this\n * method *must* be closed separately from this audio sample.\n */\n toAudioData() {\n if (this._closed) {\n throw new Error('AudioSample is closed.');\n }\n if (isAudioData(this._data)) {\n if (this._data.timestamp === this.microsecondTimestamp) {\n // Timestamp matches, let's just return the data (but cloned)\n return this._data.clone();\n }\n else {\n // It's impossible to simply change an AudioData's timestamp, so we'll need to create a new one\n if (formatIsPlanar(this.format)) {\n const size = this.allocationSize({ planeIndex: 0, format: this.format });\n const data = new ArrayBuffer(size * this.numberOfChannels);\n // We gotta read out each plane individually\n for (let i = 0; i < this.numberOfChannels; i++) {\n this.copyTo(new Uint8Array(data, i * size, size), { planeIndex: i, format: this.format });\n }\n return new AudioData({\n format: this.format,\n sampleRate: this.sampleRate,\n numberOfFrames: this.numberOfFrames,\n numberOfChannels: this.numberOfChannels,\n timestamp: this.microsecondTimestamp,\n data,\n });\n }\n else {\n const data = new ArrayBuffer(this.allocationSize({ planeIndex: 0, format: this.format }));\n this.copyTo(data, { planeIndex: 0, format: this.format });\n return new AudioData({\n format: this.format,\n sampleRate: this.sampleRate,\n numberOfFrames: this.numberOfFrames,\n numberOfChannels: this.numberOfChannels,\n timestamp: this.microsecondTimestamp,\n data,\n });\n }\n }\n }\n else {\n return new AudioData({\n format: this.format,\n sampleRate: this.sampleRate,\n numberOfFrames: this.numberOfFrames,\n numberOfChannels: this.numberOfChannels,\n timestamp: this.microsecondTimestamp,\n data: this._data,\n });\n }\n }\n /** Convert this audio sample to an AudioBuffer for use with the Web Audio API. */\n toAudioBuffer() {\n if (this._closed) {\n throw new Error('AudioSample is closed.');\n }\n const audioBuffer = new AudioBuffer({\n numberOfChannels: this.numberOfChannels,\n length: this.numberOfFrames,\n sampleRate: this.sampleRate,\n });\n const dataBytes = new Float32Array(this.allocationSize({ planeIndex: 0, format: 'f32-planar' }) / 4);\n for (let i = 0; i < this.numberOfChannels; i++) {\n this.copyTo(dataBytes, { planeIndex: i, format: 'f32-planar' });\n audioBuffer.copyToChannel(dataBytes, i);\n }\n return audioBuffer;\n }\n /** Sets the presentation timestamp of this audio sample, in seconds. */\n setTimestamp(newTimestamp) {\n if (!Number.isFinite(newTimestamp)) {\n throw new TypeError('newTimestamp must be a number.');\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n this.timestamp = newTimestamp;\n }\n /**\n * Creates AudioSamples from an AudioBuffer, starting at the given timestamp in seconds. Typically creates exactly\n * one sample, but may create multiple if the AudioBuffer is exceedingly large.\n */\n static fromAudioBuffer(audioBuffer, timestamp) {\n if (!(audioBuffer instanceof AudioBuffer)) {\n throw new TypeError('audioBuffer must be an AudioBuffer.');\n }\n const MAX_FLOAT_COUNT = 64 * 1024 * 1024;\n const numberOfChannels = audioBuffer.numberOfChannels;\n const sampleRate = audioBuffer.sampleRate;\n const totalFrames = audioBuffer.length;\n const maxFramesPerChunk = Math.floor(MAX_FLOAT_COUNT / numberOfChannels);\n let currentRelativeFrame = 0;\n let remainingFrames = totalFrames;\n const result = [];\n // Create AudioData in a chunked fashion so we don't create huge Float32Arrays\n while (remainingFrames > 0) {\n const framesToCopy = Math.min(maxFramesPerChunk, remainingFrames);\n const chunkData = new Float32Array(numberOfChannels * framesToCopy);\n for (let channel = 0; channel < numberOfChannels; channel++) {\n audioBuffer.copyFromChannel(chunkData.subarray(channel * framesToCopy, channel * framesToCopy + framesToCopy), channel, currentRelativeFrame);\n }\n const audioSample = new AudioSample({\n format: 'f32-planar',\n sampleRate,\n numberOfFrames: framesToCopy,\n numberOfChannels,\n timestamp: timestamp + currentRelativeFrame / sampleRate,\n data: chunkData,\n });\n result.push(audioSample);\n currentRelativeFrame += framesToCopy;\n remainingFrames -= framesToCopy;\n }\n return result;\n }\n}\nconst getBytesPerSample = (format) => {\n switch (format) {\n case 'u8':\n case 'u8-planar':\n return 1;\n case 's16':\n case 's16-planar':\n return 2;\n case 's32':\n case 's32-planar':\n return 4;\n case 'f32':\n case 'f32-planar':\n return 4;\n default:\n throw new Error('Unknown AudioSampleFormat');\n }\n};\nconst formatIsPlanar = (format) => {\n switch (format) {\n case 'u8-planar':\n case 's16-planar':\n case 's32-planar':\n case 'f32-planar':\n return true;\n default:\n return false;\n }\n};\nconst getReadFunction = (format) => {\n switch (format) {\n case 'u8':\n case 'u8-planar':\n return (view, offset) => (view.getUint8(offset) - 128) / 128;\n case 's16':\n case 's16-planar':\n return (view, offset) => view.getInt16(offset, true) / 32768;\n case 's32':\n case 's32-planar':\n return (view, offset) => view.getInt32(offset, true) / 2147483648;\n case 'f32':\n case 'f32-planar':\n return (view, offset) => view.getFloat32(offset, true);\n }\n};\nconst getWriteFunction = (format) => {\n switch (format) {\n case 'u8':\n case 'u8-planar':\n return (view, offset, value) => view.setUint8(offset, clamp((value + 1) * 127.5, 0, 255));\n case 's16':\n case 's16-planar':\n return (view, offset, value) => view.setInt16(offset, clamp(Math.round(value * 32767), -32768, 32767), true);\n case 's32':\n case 's32-planar':\n return (view, offset, value) => view.setInt32(offset, clamp(Math.round(value * 2147483647), -2147483648, 2147483647), true);\n case 'f32':\n case 'f32-planar':\n return (view, offset, value) => view.setFloat32(offset, value, true);\n }\n};\nconst isAudioData = (x) => {\n return typeof AudioData !== 'undefined' && x instanceof AudioData;\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { parsePcmCodec, PCM_AUDIO_CODECS } from './codec.js';\nimport { customVideoDecoders, customAudioDecoders } from './custom-coder.js';\nimport { InputAudioTrack, InputTrack, InputVideoTrack } from './input-track.js';\nimport { assert, assertNever, binarySearchLessOrEqual, CallSerializer, getInt24, getUint24, last, mapAsyncGenerator, promiseWithResolvers, toAsyncIterator, toDataView, validateAnyIterable, } from './misc.js';\nimport { EncodedPacket } from './packet.js';\nimport { fromAlaw, fromUlaw } from './pcm.js';\nimport { AudioSample, VideoSample } from './sample.js';\nconst validatePacketRetrievalOptions = (options) => {\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.metadataOnly !== undefined && typeof options.metadataOnly !== 'boolean') {\n throw new TypeError('options.metadataOnly, when defined, must be a boolean.');\n }\n if (options.verifyKeyPackets !== undefined && typeof options.verifyKeyPackets !== 'boolean') {\n throw new TypeError('options.verifyKeyPackets, when defined, must be a boolean.');\n }\n if (options.verifyKeyPackets && options.metadataOnly) {\n throw new TypeError('options.verifyKeyPackets and options.metadataOnly cannot be enabled together.');\n }\n};\nconst validateTimestamp = (timestamp) => {\n if (typeof timestamp !== 'number' || Number.isNaN(timestamp)) {\n throw new TypeError('timestamp must be a number.'); // It can be non-finite, that's fine\n }\n};\nconst maybeFixPacketType = (track, promise, options) => {\n if (options.verifyKeyPackets) {\n return promise.then(async (packet) => {\n if (!packet || packet.type === 'delta') {\n return packet;\n }\n const determinedType = await track.determinePacketType(packet);\n if (determinedType) {\n // @ts-expect-error Technically readonly\n packet.type = determinedType;\n }\n return packet;\n });\n }\n else {\n return promise;\n }\n};\n/**\n * Sink for retrieving encoded packets from an input track.\n * @public\n */\nexport class EncodedPacketSink {\n constructor(track) {\n if (!(track instanceof InputTrack)) {\n throw new TypeError('track must be an InputTrack.');\n }\n this._track = track;\n }\n /**\n * Retrieves the track's first packet (in decode order), or null if it has no packets. The first packet is very\n * likely to be a key packet.\n */\n getFirstPacket(options = {}) {\n validatePacketRetrievalOptions(options);\n return maybeFixPacketType(this._track, this._track._backing.getFirstPacket(options), options);\n }\n /**\n * Retrieves the packet corresponding to the given timestamp, in seconds. More specifically, returns the last packet\n * (in presentation order) with a start timestamp less than or equal to the given timestamp. This method can be\n * used to retrieve a track's last packet using `getPacket(Infinity)`. The method returns null if the timestamp\n * is before the first packet in the track.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n getPacket(timestamp, options = {}) {\n validateTimestamp(timestamp);\n validatePacketRetrievalOptions(options);\n return maybeFixPacketType(this._track, this._track._backing.getPacket(timestamp, options), options);\n }\n /**\n * Retrieves the packet following the given packet (in decode order), or null if the given packet is the\n * last packet.\n */\n getNextPacket(packet, options = {}) {\n if (!(packet instanceof EncodedPacket)) {\n throw new TypeError('packet must be an EncodedPacket.');\n }\n validatePacketRetrievalOptions(options);\n return maybeFixPacketType(this._track, this._track._backing.getNextPacket(packet, options), options);\n }\n /**\n * Retrieves the key packet corresponding to the given timestamp, in seconds. More specifically, returns the last\n * key packet (in presentation order) with a start timestamp less than or equal to the given timestamp. A key packet\n * is a packet that doesn't require previous packets to be decoded. This method can be used to retrieve a track's\n * last key packet using `getKeyPacket(Infinity)`. The method returns null if the timestamp is before the first\n * key packet in the track.\n *\n * To ensure that the returned packet is guaranteed to be a real key frame, enable `options.verifyKeyPackets`.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getKeyPacket(timestamp, options = {}) {\n validateTimestamp(timestamp);\n validatePacketRetrievalOptions(options);\n if (!options.verifyKeyPackets) {\n return this._track._backing.getKeyPacket(timestamp, options);\n }\n const packet = await this._track._backing.getKeyPacket(timestamp, options);\n if (!packet || packet.type === 'delta') {\n return packet;\n }\n const determinedType = await this._track.determinePacketType(packet);\n if (determinedType === 'delta') {\n // Try returning the previous key packet (in hopes that it's actually a key packet)\n return this.getKeyPacket(packet.timestamp - 1 / this._track.timeResolution, options);\n }\n return packet;\n }\n /**\n * Retrieves the key packet following the given packet (in decode order), or null if the given packet is the last\n * key packet.\n *\n * To ensure that the returned packet is guaranteed to be a real key frame, enable `options.verifyKeyPackets`.\n */\n async getNextKeyPacket(packet, options = {}) {\n if (!(packet instanceof EncodedPacket)) {\n throw new TypeError('packet must be an EncodedPacket.');\n }\n validatePacketRetrievalOptions(options);\n if (!options.verifyKeyPackets) {\n return this._track._backing.getNextKeyPacket(packet, options);\n }\n const nextPacket = await this._track._backing.getNextKeyPacket(packet, options);\n if (!nextPacket || nextPacket.type === 'delta') {\n return nextPacket;\n }\n const determinedType = await this._track.determinePacketType(nextPacket);\n if (determinedType === 'delta') {\n // Try returning the next key packet (in hopes that it's actually a key packet)\n return this.getNextKeyPacket(nextPacket, options);\n }\n return nextPacket;\n }\n /**\n * Creates an async iterator that yields the packets in this track in decode order. To enable fast iteration, this\n * method will intelligently preload packets based on the speed of the consumer.\n *\n * @param startPacket - (optional) The packet from which iteration should begin. This packet will also be yielded.\n * @param endTimestamp - (optional) The timestamp at which iteration should end. This packet will _not_ be yielded.\n */\n packets(startPacket, endPacket, options = {}) {\n if (startPacket !== undefined && !(startPacket instanceof EncodedPacket)) {\n throw new TypeError('startPacket must be an EncodedPacket.');\n }\n if (startPacket !== undefined && startPacket.isMetadataOnly && !options?.metadataOnly) {\n throw new TypeError('startPacket can only be metadata-only if options.metadataOnly is enabled.');\n }\n if (endPacket !== undefined && !(endPacket instanceof EncodedPacket)) {\n throw new TypeError('endPacket must be an EncodedPacket.');\n }\n validatePacketRetrievalOptions(options);\n const packetQueue = [];\n let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers();\n let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers();\n let ended = false;\n let terminated = false;\n // This stores errors that are \"out of band\" in the sense that they didn't occur in the normal flow of this\n // method but instead in a different context. This error should not go unnoticed and must be bubbled up to\n // the consumer.\n let outOfBandError = null;\n const timestamps = [];\n // The queue should always be big enough to hold 1 second worth of packets\n const maxQueueSize = () => Math.max(2, timestamps.length);\n // The following is the \"pump\" process that keeps pumping packets into the queue\n (async () => {\n let packet = startPacket ?? await this.getFirstPacket(options);\n while (packet && !terminated) {\n if (endPacket && packet.sequenceNumber >= endPacket?.sequenceNumber) {\n break;\n }\n if (packetQueue.length > maxQueueSize()) {\n ({ promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers());\n await queueDequeue;\n continue;\n }\n packetQueue.push(packet);\n onQueueNotEmpty();\n ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers());\n packet = await this.getNextPacket(packet, options);\n }\n ended = true;\n onQueueNotEmpty();\n })().catch((error) => {\n if (!outOfBandError) {\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n return {\n async next() {\n while (true) {\n if (terminated) {\n return { value: undefined, done: true };\n }\n else if (outOfBandError) {\n throw outOfBandError;\n }\n else if (packetQueue.length > 0) {\n const value = packetQueue.shift();\n const now = performance.now();\n timestamps.push(now);\n while (timestamps.length > 0 && now - timestamps[0] >= 1000) {\n timestamps.shift();\n }\n onQueueDequeue();\n return { value, done: false };\n }\n else if (ended) {\n return { value: undefined, done: true };\n }\n else {\n await queueNotEmpty;\n }\n }\n },\n async return() {\n terminated = true;\n onQueueDequeue();\n onQueueNotEmpty();\n return { value: undefined, done: true };\n },\n async throw(error) {\n throw error;\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n }\n}\nclass DecoderWrapper {\n constructor(onSample, onError) {\n this.onSample = onSample;\n this.onError = onError;\n }\n}\n/**\n * Base class for decoded media sample sinks.\n * @public\n */\nexport class BaseMediaSampleSink {\n /** @internal */\n mediaSamplesInRange(startTimestamp = 0, endTimestamp = Infinity) {\n validateTimestamp(startTimestamp);\n validateTimestamp(endTimestamp);\n const sampleQueue = [];\n let firstSampleQueued = false;\n let lastSample = null;\n let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers();\n let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers();\n let decoderIsFlushed = false;\n let ended = false;\n let terminated = false;\n // This stores errors that are \"out of band\" in the sense that they didn't occur in the normal flow of this\n // method but instead in a different context. This error should not go unnoticed and must be bubbled up to\n // the consumer.\n let outOfBandError = null;\n // The following is the \"pump\" process that keeps pumping packets into the decoder\n (async () => {\n const decoderError = new Error();\n const decoder = await this._createDecoder((sample) => {\n onQueueDequeue();\n if (sample.timestamp >= endTimestamp) {\n ended = true;\n }\n if (ended) {\n sample.close();\n return;\n }\n if (lastSample) {\n if (sample.timestamp > startTimestamp) {\n // We don't know ahead of time what the first first is. This is because the first first is the\n // last first whose timestamp is less than or equal to the start timestamp. Therefore we need to\n // wait for the first first after the start timestamp, and then we'll know that the previous\n // first was the first first.\n sampleQueue.push(lastSample);\n firstSampleQueued = true;\n }\n else {\n lastSample.close();\n }\n }\n if (sample.timestamp >= startTimestamp) {\n sampleQueue.push(sample);\n firstSampleQueued = true;\n }\n lastSample = firstSampleQueued ? null : sample;\n if (sampleQueue.length > 0) {\n onQueueNotEmpty();\n ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers());\n }\n }, (error) => {\n if (!outOfBandError) {\n error.stack = decoderError.stack; // Provide a more useful stack trace\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n const packetSink = this._createPacketSink();\n const keyPacket = await packetSink.getKeyPacket(startTimestamp, { verifyKeyPackets: true })\n ?? await packetSink.getFirstPacket();\n if (!keyPacket) {\n return;\n }\n let currentPacket = keyPacket;\n let endPacket = undefined;\n if (endTimestamp < Infinity) {\n // When an end timestamp is set, we cannot simply use that for the packet iterator due to out-of-order\n // frames (B-frames). Instead, we'll need to keep decoding packets until we get a frame that exceeds\n // this end time. However, we can still put a bound on it: Since key frames are by definition never\n // out of order, we can stop at the first key frame after the end timestamp.\n const packet = await packetSink.getPacket(endTimestamp);\n const keyPacket = !packet\n ? null\n : packet.type === 'key' && packet.timestamp === endTimestamp\n ? packet\n : await packetSink.getNextKeyPacket(packet, { verifyKeyPackets: true });\n if (keyPacket) {\n endPacket = keyPacket;\n }\n }\n const packets = packetSink.packets(keyPacket, endPacket);\n await packets.next(); // Skip the start packet as we already have it\n while (currentPacket && !ended) {\n const maxQueueSize = computeMaxQueueSize(sampleQueue.length);\n if (sampleQueue.length + decoder.getDecodeQueueSize() > maxQueueSize) {\n ({ promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers());\n await queueDequeue;\n continue;\n }\n decoder.decode(currentPacket);\n const packetResult = await packets.next();\n if (packetResult.done) {\n break;\n }\n currentPacket = packetResult.value;\n }\n await packets.return();\n if (!terminated)\n await decoder.flush();\n decoder.close();\n if (!firstSampleQueued && lastSample) {\n sampleQueue.push(lastSample);\n }\n decoderIsFlushed = true;\n onQueueNotEmpty(); // To unstuck the generator\n })().catch((error) => {\n if (!outOfBandError) {\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n return {\n async next() {\n while (true) {\n if (terminated) {\n return { value: undefined, done: true };\n }\n else if (outOfBandError) {\n throw outOfBandError;\n }\n else if (sampleQueue.length > 0) {\n const value = sampleQueue.shift();\n onQueueDequeue();\n return { value, done: false };\n }\n else if (!decoderIsFlushed) {\n await queueNotEmpty;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n },\n async return() {\n terminated = true;\n ended = true;\n onQueueDequeue();\n onQueueNotEmpty();\n lastSample?.close();\n for (const sample of sampleQueue) {\n sample.close();\n }\n return { value: undefined, done: true };\n },\n async throw(error) {\n throw error;\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n }\n /** @internal */\n mediaSamplesAtTimestamps(timestamps) {\n validateAnyIterable(timestamps);\n const timestampIterator = toAsyncIterator(timestamps);\n const timestampsOfInterest = [];\n const sampleQueue = [];\n let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers();\n let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers();\n let decoderIsFlushed = false;\n let terminated = false;\n // This stores errors that are \"out of band\" in the sense that they didn't occur in the normal flow of this\n // method but instead in a different context. This error should not go unnoticed and must be bubbled up to\n // the consumer.\n let outOfBandError = null;\n const pushToQueue = (sample) => {\n sampleQueue.push(sample);\n onQueueNotEmpty();\n ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers());\n };\n // The following is the \"pump\" process that keeps pumping packets into the decoder\n (async () => {\n const decoderError = new Error();\n const decoder = await this._createDecoder((sample) => {\n onQueueDequeue();\n if (terminated) {\n sample.close();\n return;\n }\n let sampleUses = 0;\n while (timestampsOfInterest.length > 0\n && sample.timestamp - timestampsOfInterest[0] > -1e-10 // Give it a little epsilon\n ) {\n sampleUses++;\n timestampsOfInterest.shift();\n }\n if (sampleUses > 0) {\n for (let i = 0; i < sampleUses; i++) {\n // Clone the sample if we need to emit it multiple times\n pushToQueue((i < sampleUses - 1 ? sample.clone() : sample));\n }\n }\n else {\n sample.close();\n }\n }, (error) => {\n if (!outOfBandError) {\n error.stack = decoderError.stack; // Provide a more useful stack trace\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n const packetSink = this._createPacketSink();\n let lastPacket = null;\n let lastKeyPacket = null;\n // The end sequence number (inclusive) in the next batch of packets that will be decoded. The batch starts\n // at the last key frame and goes until this sequence number.\n let maxSequenceNumber = -1;\n const decodePackets = async () => {\n assert(lastKeyPacket);\n // Start at the current key packet\n let currentPacket = lastKeyPacket;\n decoder.decode(currentPacket);\n while (currentPacket.sequenceNumber < maxSequenceNumber) {\n const maxQueueSize = computeMaxQueueSize(sampleQueue.length);\n while (sampleQueue.length + decoder.getDecodeQueueSize() > maxQueueSize && !terminated) {\n ({ promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers());\n await queueDequeue;\n }\n if (terminated) {\n break;\n }\n const nextPacket = await packetSink.getNextPacket(currentPacket);\n assert(nextPacket);\n currentPacket = nextPacket;\n decoder.decode(nextPacket);\n }\n maxSequenceNumber = -1;\n };\n const flushDecoder = async () => {\n await decoder.flush();\n // We don't expect this list to have any elements in it anymore, but in case it does, let's emit\n // nulls for every remaining element, then clear it.\n for (let i = 0; i < timestampsOfInterest.length; i++) {\n pushToQueue(null);\n }\n timestampsOfInterest.length = 0;\n };\n for await (const timestamp of timestampIterator) {\n validateTimestamp(timestamp);\n if (terminated) {\n break;\n }\n const targetPacket = await packetSink.getPacket(timestamp);\n const keyPacket = targetPacket && await packetSink.getKeyPacket(timestamp, { verifyKeyPackets: true });\n if (!keyPacket) {\n if (maxSequenceNumber !== -1) {\n await decodePackets();\n await flushDecoder();\n }\n pushToQueue(null);\n lastPacket = null;\n continue;\n }\n // Check if the key packet has changed or if we're going back in time\n if (lastPacket\n && (keyPacket.sequenceNumber !== lastKeyPacket.sequenceNumber\n || targetPacket.timestamp < lastPacket.timestamp)) {\n await decodePackets();\n await flushDecoder(); // Always flush here, improves decoder compatibility\n }\n timestampsOfInterest.push(targetPacket.timestamp);\n maxSequenceNumber = Math.max(targetPacket.sequenceNumber, maxSequenceNumber);\n lastPacket = targetPacket;\n lastKeyPacket = keyPacket;\n }\n if (!terminated) {\n if (maxSequenceNumber !== -1) {\n // We still need to decode packets\n await decodePackets();\n }\n await flushDecoder();\n }\n decoder.close();\n decoderIsFlushed = true;\n onQueueNotEmpty(); // To unstuck the generator\n })().catch((error) => {\n if (!outOfBandError) {\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n return {\n async next() {\n while (true) {\n if (terminated) {\n return { value: undefined, done: true };\n }\n else if (outOfBandError) {\n throw outOfBandError;\n }\n else if (sampleQueue.length > 0) {\n const value = sampleQueue.shift();\n assert(value !== undefined);\n onQueueDequeue();\n return { value, done: false };\n }\n else if (!decoderIsFlushed) {\n await queueNotEmpty;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n },\n async return() {\n terminated = true;\n onQueueDequeue();\n onQueueNotEmpty();\n for (const sample of sampleQueue) {\n sample?.close();\n }\n return { value: undefined, done: true };\n },\n async throw(error) {\n throw error;\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n }\n}\nconst computeMaxQueueSize = (decodedSampleQueueSize) => {\n // If we have decoded samples lying around, limit the total queue size to a small value (decoded samples can use up\n // a lot of memory). If not, we're fine with a much bigger queue of encoded packets waiting to be decoded. In fact,\n // some decoders only start flushing out decoded chunks when the packet queue is large enough.\n return decodedSampleQueueSize === 0 ? 40 : 8;\n};\nclass VideoDecoderWrapper extends DecoderWrapper {\n constructor(onSample, onError, codec, decoderConfig, rotation, timeResolution) {\n super(onSample, onError);\n this.rotation = rotation;\n this.timeResolution = timeResolution;\n this.decoder = null;\n this.customDecoder = null;\n this.customDecoderCallSerializer = new CallSerializer();\n this.customDecoderQueueSize = 0;\n this.sampleQueue = [];\n const sampleHandler = (sample) => {\n // For correct B-frame handling, we don't just hand over the frames directly but instead add them to a\n // queue, because we want to ensure frames are emitted in presentation order. We flush the queue each time\n // we receive a frame with a timestamp larger than the highest we've seen so far, as we can sure that is\n // not a B-frame. Typically, WebCodecs automatically guarantees that frames are emitted in presentation\n // order, but some browsers (Safari) don't always follow this rule.\n if (this.sampleQueue.length > 0 && (sample.timestamp >= last(this.sampleQueue).timestamp)) {\n for (const sample of this.sampleQueue) {\n this.finalizeAndEmitSample(sample);\n }\n this.sampleQueue.length = 0;\n }\n const insertionIndex = binarySearchLessOrEqual(this.sampleQueue, sample.timestamp, x => x.timestamp);\n this.sampleQueue.splice(insertionIndex + 1, 0, sample);\n };\n const MatchingCustomDecoder = customVideoDecoders.find(x => x.supports(codec, decoderConfig));\n if (MatchingCustomDecoder) {\n // @ts-expect-error \"Can't create instance of abstract class \uD83E\uDD13\"\n this.customDecoder = new MatchingCustomDecoder();\n // @ts-expect-error It's technically readonly\n this.customDecoder.codec = codec;\n // @ts-expect-error It's technically readonly\n this.customDecoder.config = decoderConfig;\n // @ts-expect-error It's technically readonly\n this.customDecoder.onSample = (sample) => {\n if (!(sample instanceof VideoSample)) {\n throw new TypeError('The argument passed to onSample must be a VideoSample.');\n }\n sampleHandler(sample);\n };\n void this.customDecoderCallSerializer.call(() => this.customDecoder.init());\n }\n else {\n this.decoder = new VideoDecoder({\n output: frame => sampleHandler(new VideoSample(frame)),\n error: onError,\n });\n this.decoder.configure(decoderConfig);\n }\n }\n finalizeAndEmitSample(sample) {\n // Round the timestamps to the time resolution\n sample.setTimestamp(Math.round(sample.timestamp * this.timeResolution) / this.timeResolution);\n sample.setDuration(Math.round(sample.duration * this.timeResolution) / this.timeResolution);\n sample.setRotation(this.rotation);\n this.onSample(sample);\n }\n getDecodeQueueSize() {\n if (this.customDecoder) {\n return this.customDecoderQueueSize;\n }\n else {\n assert(this.decoder);\n return this.decoder.decodeQueueSize;\n }\n }\n decode(packet) {\n if (this.customDecoder) {\n this.customDecoderQueueSize++;\n void this.customDecoderCallSerializer\n .call(() => this.customDecoder.decode(packet))\n .then(() => this.customDecoderQueueSize--);\n }\n else {\n assert(this.decoder);\n this.decoder.decode(packet.toEncodedVideoChunk());\n }\n }\n async flush() {\n if (this.customDecoder) {\n await this.customDecoderCallSerializer.call(() => this.customDecoder.flush());\n }\n else {\n assert(this.decoder);\n await this.decoder.flush();\n }\n for (const sample of this.sampleQueue) {\n this.finalizeAndEmitSample(sample);\n }\n this.sampleQueue.length = 0;\n }\n close() {\n if (this.customDecoder) {\n void this.customDecoderCallSerializer.call(() => this.customDecoder.close());\n }\n else {\n assert(this.decoder);\n this.decoder.close();\n }\n for (const sample of this.sampleQueue) {\n sample.close();\n }\n this.sampleQueue.length = 0;\n }\n}\n/**\n * A sink that retrieves decoded video samples (video frames) from a video track.\n * @public\n */\nexport class VideoSampleSink extends BaseMediaSampleSink {\n constructor(videoTrack) {\n if (!(videoTrack instanceof InputVideoTrack)) {\n throw new TypeError('videoTrack must be an InputVideoTrack.');\n }\n super();\n this._videoTrack = videoTrack;\n }\n /** @internal */\n async _createDecoder(onSample, onError) {\n if (!(await this._videoTrack.canDecode())) {\n throw new Error('This video track cannot be decoded by this browser. Make sure to check decodability before using'\n + ' a track.');\n }\n const codec = this._videoTrack.codec;\n const rotation = this._videoTrack.rotation;\n const decoderConfig = await this._videoTrack.getDecoderConfig();\n const timeResolution = this._videoTrack.timeResolution;\n assert(codec && decoderConfig);\n return new VideoDecoderWrapper(onSample, onError, codec, decoderConfig, rotation, timeResolution);\n }\n /** @internal */\n _createPacketSink() {\n return new EncodedPacketSink(this._videoTrack);\n }\n /**\n * Retrieves the video sample (frame) corresponding to the given timestamp, in seconds. More specifically, returns\n * the last video sample (in presentation order) with a start timestamp less than or equal to the given timestamp.\n * Returns null if the timestamp is before the track's first timestamp.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getSample(timestamp) {\n validateTimestamp(timestamp);\n for await (const sample of this.mediaSamplesAtTimestamps([timestamp])) {\n return sample;\n }\n throw new Error('Internal error: Iterator returned nothing.');\n }\n /**\n * Creates an async iterator that yields the video samples (frames) of this track in presentation order. This method\n * will intelligently pre-decode a few frames ahead to enable fast iteration.\n *\n * @param startTimestamp - The timestamp in seconds at which to start yielding samples (inclusive).\n * @param endTimestamp - The timestamp in seconds at which to stop yielding samples (exclusive).\n */\n samples(startTimestamp = 0, endTimestamp = Infinity) {\n return this.mediaSamplesInRange(startTimestamp, endTimestamp);\n }\n /**\n * Creates an async iterator that yields a video sample (frame) for each timestamp in the argument. This method\n * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most\n * once, and is therefore more efficient than manually getting the sample for every timestamp. The iterator may\n * yield null if no frame is available for a given timestamp.\n *\n * @param timestamps - An iterable or async iterable of timestamps in seconds.\n */\n samplesAtTimestamps(timestamps) {\n return this.mediaSamplesAtTimestamps(timestamps);\n }\n}\n/**\n * A sink that renders video samples (frames) of the given video track to canvases. This is often more useful than\n * directly retrieving frames, as it comes with common preprocessing steps such as resizing or applying rotation\n * metadata.\n *\n * This sink will yield HTMLCanvasElements when in a DOM context, and OffscreenCanvases otherwise.\n * @public\n */\nexport class CanvasSink {\n constructor(videoTrack, options = {}) {\n /** @internal */\n this._nextCanvasIndex = 0;\n if (!(videoTrack instanceof InputVideoTrack)) {\n throw new TypeError('videoTrack must be an InputVideoTrack.');\n }\n if (options && typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.width !== undefined && (!Number.isInteger(options.width) || options.width <= 0)) {\n throw new TypeError('options.width, when defined, must be a positive integer.');\n }\n if (options.height !== undefined && (!Number.isInteger(options.height) || options.height <= 0)) {\n throw new TypeError('options.height, when defined, must be a positive integer.');\n }\n if (options.fit !== undefined && !['fill', 'contain', 'cover'].includes(options.fit)) {\n throw new TypeError('options.fit, when provided, must be one of \"fill\", \"contain\", or \"cover\".');\n }\n if (options.width !== undefined\n && options.height !== undefined\n && options.fit === undefined) {\n throw new TypeError('When both options.width and options.height are provided, options.fit must also be provided.');\n }\n if (options.rotation !== undefined && ![0, 90, 180, 270].includes(options.rotation)) {\n throw new TypeError('options.rotation, when provided, must be 0, 90, 180 or 270.');\n }\n if (options.poolSize !== undefined\n && (typeof options.poolSize !== 'number' || !Number.isInteger(options.poolSize) || options.poolSize < 0)) {\n throw new TypeError('poolSize must be a non-negative integer.');\n }\n const rotation = options.rotation ?? videoTrack.rotation;\n let [width, height] = rotation % 180 === 0\n ? [videoTrack.codedWidth, videoTrack.codedHeight]\n : [videoTrack.codedHeight, videoTrack.codedWidth];\n const originalAspectRatio = width / height;\n // If width and height aren't defined together, deduce the missing value using the aspect ratio\n if (options.width !== undefined && options.height === undefined) {\n width = options.width;\n height = Math.round(width / originalAspectRatio);\n }\n else if (options.width === undefined && options.height !== undefined) {\n height = options.height;\n width = Math.round(height * originalAspectRatio);\n }\n else if (options.width !== undefined && options.height !== undefined) {\n width = options.width;\n height = options.height;\n }\n this._videoTrack = videoTrack;\n this._width = width;\n this._height = height;\n this._rotation = rotation;\n this._fit = options.fit ?? 'fill';\n this._videoSampleSink = new VideoSampleSink(videoTrack);\n this._canvasPool = Array.from({ length: options.poolSize ?? 0 }, () => null);\n }\n /** @internal */\n _videoSampleToWrappedCanvas(sample) {\n let canvas = this._canvasPool[this._nextCanvasIndex];\n if (!canvas) {\n if (typeof document !== 'undefined') {\n // Prefer an HTMLCanvasElement\n canvas = document.createElement('canvas');\n canvas.width = this._width;\n canvas.height = this._height;\n }\n else {\n canvas = new OffscreenCanvas(this._width, this._height);\n }\n if (this._canvasPool.length > 0) {\n this._canvasPool[this._nextCanvasIndex] = canvas;\n }\n }\n if (this._canvasPool.length > 0) {\n this._nextCanvasIndex = (this._nextCanvasIndex + 1) % this._canvasPool.length;\n }\n const context = canvas.getContext('2d', { alpha: false });\n assert(context);\n context.resetTransform();\n // These variables specify where the final sample will be drawn on the canvas\n let dx;\n let dy;\n let newWidth;\n let newHeight;\n if (this._fit === 'fill') {\n dx = 0;\n dy = 0;\n newWidth = this._width;\n newHeight = this._height;\n }\n else {\n const [sampleWidth, sampleHeight] = this._rotation % 180 === 0\n ? [sample.codedWidth, sample.codedHeight]\n : [sample.codedHeight, sample.codedWidth];\n const scale = this._fit === 'contain'\n ? Math.min(this._width / sampleWidth, this._height / sampleHeight)\n : Math.max(this._width / sampleWidth, this._height / sampleHeight);\n newWidth = sampleWidth * scale;\n newHeight = sampleHeight * scale;\n dx = (this._width - newWidth) / 2;\n dy = (this._height - newHeight) / 2;\n }\n const aspectRatioChange = this._rotation % 180 === 0 ? 1 : newWidth / newHeight;\n context.translate(this._width / 2, this._height / 2);\n context.rotate(this._rotation * Math.PI / 180);\n // This aspect ratio compensation is done so that we can draw the sample with the intended dimensions and\n // don't need to think about how those dimensions change after the rotation\n context.scale(1 / aspectRatioChange, aspectRatioChange);\n context.translate(-this._width / 2, -this._height / 2);\n context.drawImage(sample.toCanvasImageSource(), dx, dy, newWidth, newHeight);\n const result = {\n canvas,\n timestamp: sample.timestamp,\n duration: sample.duration,\n };\n sample.close();\n return result;\n }\n /**\n * Retrieves a canvas with the video frame corresponding to the given timestamp, in seconds. More specifically,\n * returns the last video frame (in presentation order) with a start timestamp less than or equal to the given\n * timestamp. Returns null if the timestamp is before the track's first timestamp.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getCanvas(timestamp) {\n validateTimestamp(timestamp);\n const sample = await this._videoSampleSink.getSample(timestamp);\n return sample && this._videoSampleToWrappedCanvas(sample);\n }\n /**\n * Creates an async iterator that yields canvases with the video frames of this track in presentation order. This\n * method will intelligently pre-decode a few frames ahead to enable fast iteration.\n *\n * @param startTimestamp - The timestamp in seconds at which to start yielding canvases (inclusive).\n * @param endTimestamp - The timestamp in seconds at which to stop yielding canvases (exclusive).\n */\n canvases(startTimestamp = 0, endTimestamp = Infinity) {\n return mapAsyncGenerator(this._videoSampleSink.samples(startTimestamp, endTimestamp), sample => this._videoSampleToWrappedCanvas(sample));\n }\n /**\n * Creates an async iterator that yields a canvas for each timestamp in the argument. This method uses an optimized\n * decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most once, and is\n * therefore more efficient than manually getting the canvas for every timestamp. The iterator may yield null if\n * no frame is available for a given timestamp.\n *\n * @param timestamps - An iterable or async iterable of timestamps in seconds.\n */\n canvasesAtTimestamps(timestamps) {\n return mapAsyncGenerator(this._videoSampleSink.samplesAtTimestamps(timestamps), sample => sample && this._videoSampleToWrappedCanvas(sample));\n }\n}\nclass AudioDecoderWrapper extends DecoderWrapper {\n constructor(onSample, onError, codec, decoderConfig) {\n super(onSample, onError);\n this.decoder = null;\n this.customDecoder = null;\n this.customDecoderCallSerializer = new CallSerializer();\n this.customDecoderQueueSize = 0;\n const sampleHandler = (sample) => {\n const sampleRate = decoderConfig.sampleRate;\n // Round the timestamp to the sample rate\n sample.setTimestamp(Math.round(sample.timestamp * sampleRate) / sampleRate);\n onSample(sample);\n };\n const MatchingCustomDecoder = customAudioDecoders.find(x => x.supports(codec, decoderConfig));\n if (MatchingCustomDecoder) {\n // @ts-expect-error \"Can't create instance of abstract class \uD83E\uDD13\"\n this.customDecoder = new MatchingCustomDecoder();\n // @ts-expect-error It's technically readonly\n this.customDecoder.codec = codec;\n // @ts-expect-error It's technically readonly\n this.customDecoder.config = decoderConfig;\n // @ts-expect-error It's technically readonly\n this.customDecoder.onSample = (sample) => {\n if (!(sample instanceof AudioSample)) {\n throw new TypeError('The argument passed to onSample must be an AudioSample.');\n }\n sampleHandler(sample);\n };\n void this.customDecoderCallSerializer.call(() => this.customDecoder.init());\n }\n else {\n this.decoder = new AudioDecoder({\n output: data => sampleHandler(new AudioSample(data)),\n error: onError,\n });\n this.decoder.configure(decoderConfig);\n }\n }\n getDecodeQueueSize() {\n if (this.customDecoder) {\n return this.customDecoderQueueSize;\n }\n else {\n assert(this.decoder);\n return this.decoder.decodeQueueSize;\n }\n }\n decode(packet) {\n if (this.customDecoder) {\n this.customDecoderQueueSize++;\n void this.customDecoderCallSerializer\n .call(() => this.customDecoder.decode(packet))\n .then(() => this.customDecoderQueueSize--);\n }\n else {\n assert(this.decoder);\n this.decoder.decode(packet.toEncodedAudioChunk());\n }\n }\n flush() {\n if (this.customDecoder) {\n return this.customDecoderCallSerializer.call(() => this.customDecoder.flush());\n }\n else {\n assert(this.decoder);\n return this.decoder.flush();\n }\n }\n close() {\n if (this.customDecoder) {\n void this.customDecoderCallSerializer.call(() => this.customDecoder.close());\n }\n else {\n assert(this.decoder);\n this.decoder.close();\n }\n }\n}\n// There are a lot of PCM variants not natively supported by the browser and by AudioData. Therefore we need a simple\n// decoder that maps any input PCM format into a PCM format supported by the browser.\nclass PcmAudioDecoderWrapper extends DecoderWrapper {\n constructor(onSample, onError, decoderConfig) {\n super(onSample, onError);\n this.decoderConfig = decoderConfig;\n // Internal state to accumulate a precise current timestamp based on audio durations, not the (potentially\n // inaccurate) sample timestamps.\n this.currentTimestamp = null;\n assert(PCM_AUDIO_CODECS.includes(decoderConfig.codec));\n this.codec = decoderConfig.codec;\n const { dataType, sampleSize, littleEndian } = parsePcmCodec(this.codec);\n this.inputSampleSize = sampleSize;\n switch (sampleSize) {\n case 1:\n {\n if (dataType === 'unsigned') {\n this.readInputValue = (view, byteOffset) => view.getUint8(byteOffset) - 2 ** 7;\n }\n else if (dataType === 'signed') {\n this.readInputValue = (view, byteOffset) => view.getInt8(byteOffset);\n }\n else if (dataType === 'ulaw') {\n this.readInputValue = (view, byteOffset) => fromUlaw(view.getUint8(byteOffset));\n }\n else if (dataType === 'alaw') {\n this.readInputValue = (view, byteOffset) => fromAlaw(view.getUint8(byteOffset));\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n case 2:\n {\n if (dataType === 'unsigned') {\n this.readInputValue = (view, byteOffset) => view.getUint16(byteOffset, littleEndian) - 2 ** 15;\n }\n else if (dataType === 'signed') {\n this.readInputValue = (view, byteOffset) => view.getInt16(byteOffset, littleEndian);\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n case 3:\n {\n if (dataType === 'unsigned') {\n this.readInputValue = (view, byteOffset) => getUint24(view, byteOffset, littleEndian) - 2 ** 23;\n }\n else if (dataType === 'signed') {\n this.readInputValue = (view, byteOffset) => getInt24(view, byteOffset, littleEndian);\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n case 4:\n {\n if (dataType === 'unsigned') {\n this.readInputValue = (view, byteOffset) => view.getUint32(byteOffset, littleEndian) - 2 ** 31;\n }\n else if (dataType === 'signed') {\n this.readInputValue = (view, byteOffset) => view.getInt32(byteOffset, littleEndian);\n }\n else if (dataType === 'float') {\n this.readInputValue = (view, byteOffset) => view.getFloat32(byteOffset, littleEndian);\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n case 8:\n {\n if (dataType === 'float') {\n this.readInputValue = (view, byteOffset) => view.getFloat64(byteOffset, littleEndian);\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n default:\n {\n assertNever(sampleSize);\n assert(false);\n }\n ;\n }\n switch (sampleSize) {\n case 1:\n {\n if (dataType === 'ulaw' || dataType === 'alaw') {\n this.outputSampleSize = 2;\n this.outputFormat = 's16';\n this.writeOutputValue = (view, byteOffset, value) => view.setInt16(byteOffset, value, true);\n }\n else {\n this.outputSampleSize = 1;\n this.outputFormat = 'u8';\n this.writeOutputValue = (view, byteOffset, value) => view.setUint8(byteOffset, value + 2 ** 7);\n }\n }\n ;\n break;\n case 2:\n {\n this.outputSampleSize = 2;\n this.outputFormat = 's16';\n this.writeOutputValue = (view, byteOffset, value) => view.setInt16(byteOffset, value, true);\n }\n ;\n break;\n case 3:\n {\n this.outputSampleSize = 4;\n this.outputFormat = 's32';\n // From https://www.w3.org/TR/webcodecs:\n // AudioData containing 24-bit samples SHOULD store those samples in s32 or f32. When samples are\n // stored in s32, each sample MUST be left-shifted by 8 bits.\n this.writeOutputValue = (view, byteOffset, value) => view.setInt32(byteOffset, value << 8, true);\n }\n ;\n break;\n case 4:\n {\n this.outputSampleSize = 4;\n if (dataType === 'float') {\n this.outputFormat = 'f32';\n this.writeOutputValue = (view, byteOffset, value) => view.setFloat32(byteOffset, value, true);\n }\n else {\n this.outputFormat = 's32';\n this.writeOutputValue = (view, byteOffset, value) => view.setInt32(byteOffset, value, true);\n }\n }\n ;\n break;\n case 8:\n {\n this.outputSampleSize = 4;\n this.outputFormat = 'f32';\n this.writeOutputValue = (view, byteOffset, value) => view.setFloat32(byteOffset, value, true);\n }\n ;\n break;\n default:\n {\n assertNever(sampleSize);\n assert(false);\n }\n ;\n }\n ;\n }\n getDecodeQueueSize() {\n return 0;\n }\n decode(packet) {\n const inputView = toDataView(packet.data);\n const numberOfFrames = packet.byteLength / this.decoderConfig.numberOfChannels / this.inputSampleSize;\n const outputBufferSize = numberOfFrames * this.decoderConfig.numberOfChannels * this.outputSampleSize;\n const outputBuffer = new ArrayBuffer(outputBufferSize);\n const outputView = new DataView(outputBuffer);\n for (let i = 0; i < numberOfFrames * this.decoderConfig.numberOfChannels; i++) {\n const inputIndex = i * this.inputSampleSize;\n const outputIndex = i * this.outputSampleSize;\n const value = this.readInputValue(inputView, inputIndex);\n this.writeOutputValue(outputView, outputIndex, value);\n }\n const preciseDuration = numberOfFrames / this.decoderConfig.sampleRate;\n if (this.currentTimestamp === null || Math.abs(packet.timestamp - this.currentTimestamp) >= preciseDuration) {\n // We need to sync with the packet timestamp again\n this.currentTimestamp = packet.timestamp;\n }\n const preciseTimestamp = this.currentTimestamp;\n this.currentTimestamp += preciseDuration;\n const audioSample = new AudioSample({\n format: this.outputFormat,\n data: outputBuffer,\n numberOfChannels: this.decoderConfig.numberOfChannels,\n sampleRate: this.decoderConfig.sampleRate,\n numberOfFrames,\n timestamp: preciseTimestamp,\n });\n this.onSample(audioSample);\n }\n async flush() {\n // Do nothing\n }\n close() {\n // Do nothing\n }\n}\n/**\n * Sink for retrieving decoded audio samples from an audio track.\n * @public\n */\nexport class AudioSampleSink extends BaseMediaSampleSink {\n constructor(audioTrack) {\n if (!(audioTrack instanceof InputAudioTrack)) {\n throw new TypeError('audioTrack must be an InputAudioTrack.');\n }\n super();\n this._audioTrack = audioTrack;\n }\n /** @internal */\n async _createDecoder(onSample, onError) {\n if (!(await this._audioTrack.canDecode())) {\n throw new Error('This audio track cannot be decoded by this browser. Make sure to check decodability before using'\n + ' a track.');\n }\n const codec = this._audioTrack.codec;\n const decoderConfig = await this._audioTrack.getDecoderConfig();\n assert(codec && decoderConfig);\n if (PCM_AUDIO_CODECS.includes(decoderConfig.codec)) {\n return new PcmAudioDecoderWrapper(onSample, onError, decoderConfig);\n }\n else {\n return new AudioDecoderWrapper(onSample, onError, codec, decoderConfig);\n }\n }\n /** @internal */\n _createPacketSink() {\n return new EncodedPacketSink(this._audioTrack);\n }\n /**\n * Retrieves the audio sample corresponding to the given timestamp, in seconds. More specifically, returns\n * the last audio sample (in presentation order) with a start timestamp less than or equal to the given timestamp.\n * Returns null if the timestamp is before the track's first timestamp.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getSample(timestamp) {\n validateTimestamp(timestamp);\n for await (const sample of this.mediaSamplesAtTimestamps([timestamp])) {\n return sample;\n }\n throw new Error('Internal error: Iterator returned nothing.');\n }\n /**\n * Creates an async iterator that yields the audio samples of this track in presentation order. This method\n * will intelligently pre-decode a few samples ahead to enable fast iteration.\n *\n * @param startTimestamp - The timestamp in seconds at which to start yielding samples (inclusive).\n * @param endTimestamp - The timestamp in seconds at which to stop yielding samples (exclusive).\n */\n samples(startTimestamp = 0, endTimestamp = Infinity) {\n return this.mediaSamplesInRange(startTimestamp, endTimestamp);\n }\n /**\n * Creates an async iterator that yields an audio sample for each timestamp in the argument. This method\n * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most\n * once, and is therefore more efficient than manually getting the sample for every timestamp. The iterator may\n * yield null if no sample is available for a given timestamp.\n *\n * @param timestamps - An iterable or async iterable of timestamps in seconds.\n */\n samplesAtTimestamps(timestamps) {\n return this.mediaSamplesAtTimestamps(timestamps);\n }\n}\n/**\n * A sink that retrieves decoded audio samples from an audio track and converts them to AudioBuffers. This is often\n * more useful than directly retrieving audio samples, as AudioBuffers can be directly used with the Web Audio API.\n * @public\n */\nexport class AudioBufferSink {\n constructor(audioTrack) {\n if (!(audioTrack instanceof InputAudioTrack)) {\n throw new TypeError('audioTrack must be an InputAudioTrack.');\n }\n this._audioSampleSink = new AudioSampleSink(audioTrack);\n }\n /** @internal */\n _audioSampleToWrappedArrayBuffer(sample) {\n return {\n buffer: sample.toAudioBuffer(),\n timestamp: sample.timestamp,\n duration: sample.duration,\n };\n }\n /**\n * Retrieves the audio buffer corresponding to the given timestamp, in seconds. More specifically, returns\n * the last audio buffer (in presentation order) with a start timestamp less than or equal to the given timestamp.\n * Returns null if the timestamp is before the track's first timestamp.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getBuffer(timestamp) {\n validateTimestamp(timestamp);\n const data = await this._audioSampleSink.getSample(timestamp);\n return data && this._audioSampleToWrappedArrayBuffer(data);\n }\n /**\n * Creates an async iterator that yields audio buffers of this track in presentation order. This method\n * will intelligently pre-decode a few buffers ahead to enable fast iteration.\n *\n * @param startTimestamp - The timestamp in seconds at which to start yielding buffers (inclusive).\n * @param endTimestamp - The timestamp in seconds at which to stop yielding buffers (exclusive).\n */\n buffers(startTimestamp = 0, endTimestamp = Infinity) {\n return mapAsyncGenerator(this._audioSampleSink.samples(startTimestamp, endTimestamp), data => this._audioSampleToWrappedArrayBuffer(data));\n }\n /**\n * Creates an async iterator that yields an audio buffer for each timestamp in the argument. This method\n * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most\n * once, and is therefore more efficient than manually getting the buffer for every timestamp. The iterator may\n * yield null if no buffer is available for a given timestamp.\n *\n * @param timestamps - An iterable or async iterable of timestamps in seconds.\n */\n buffersAtTimestamps(timestamps) {\n return mapAsyncGenerator(this._audioSampleSink.samplesAtTimestamps(timestamps), data => data && this._audioSampleToWrappedArrayBuffer(data));\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { determineVideoPacketType } from './codec-data.js';\nimport { customAudioDecoders, customVideoDecoders } from './custom-coder.js';\nimport { EncodedPacketSink } from './media-sink.js';\nimport { assert } from './misc.js';\nimport { EncodedPacket } from './packet.js';\n/**\n * Represents a media track in an input file.\n * @public\n */\nexport class InputTrack {\n /** @internal */\n constructor(backing) {\n this._backing = backing;\n }\n /** Returns true iff this track is a video track. */\n isVideoTrack() {\n return this instanceof InputVideoTrack;\n }\n /** Returns true iff this track is an audio track. */\n isAudioTrack() {\n return this instanceof InputAudioTrack;\n }\n /** The unique ID of this track in the input file. */\n get id() {\n return this._backing.getId();\n }\n /** The ISO 639-2/T language code for this track. If the language is unknown, this field is 'und' (undetermined). */\n get languageCode() {\n return this._backing.getLanguageCode();\n }\n /**\n * A positive number x such that all timestamps and durations of all packets of this track are\n * integer multiples of 1/x.\n */\n get timeResolution() {\n return this._backing.getTimeResolution();\n }\n /**\n * Returns the start timestamp of the first packet of this track, in seconds. While often near zero, this value\n * may be positive or even negative. A negative starting timestamp means the track's timing has been offset. Samples\n * with a negative timestamp should not be presented.\n */\n getFirstTimestamp() {\n return this._backing.getFirstTimestamp();\n }\n /** Returns the end timestamp of the last packet of this track, in seconds. */\n computeDuration() {\n return this._backing.computeDuration();\n }\n /**\n * Computes aggregate packet statistics for this track, such as average packet rate or bitrate.\n *\n * @param targetPacketCount - This optional parameter sets a target for how many packets this method must have\n * looked at before it can return early; this means, you can use it to aggregate only a subset (prefix) of all\n * packets. This is very useful for getting a great estimate of video frame rate without having to scan through the\n * entire file.\n */\n async computePacketStats(targetPacketCount = Infinity) {\n const sink = new EncodedPacketSink(this);\n let startTimestamp = Infinity;\n let endTimestamp = -Infinity;\n let packetCount = 0;\n let totalPacketBytes = 0;\n for await (const packet of sink.packets(undefined, undefined, { metadataOnly: true })) {\n if (packetCount >= targetPacketCount\n // This additional condition is needed to produce correct results with out-of-presentation-order packets\n && packet.timestamp >= endTimestamp) {\n break;\n }\n startTimestamp = Math.min(startTimestamp, packet.timestamp);\n endTimestamp = Math.max(endTimestamp, packet.timestamp + packet.duration);\n packetCount++;\n totalPacketBytes += packet.byteLength;\n }\n return {\n packetCount,\n averagePacketRate: packetCount\n ? Number((packetCount / (endTimestamp - startTimestamp)).toPrecision(16))\n : 0,\n averageBitrate: packetCount\n ? Number((8 * totalPacketBytes / (endTimestamp - startTimestamp)).toPrecision(16))\n : 0,\n };\n }\n}\n/**\n * Represents a video track in an input file.\n * @public\n */\nexport class InputVideoTrack extends InputTrack {\n /** @internal */\n constructor(backing) {\n super(backing);\n this._backing = backing;\n }\n get type() {\n return 'video';\n }\n get codec() {\n return this._backing.getCodec();\n }\n /** The width in pixels of the track's coded samples, before any transformations or rotations. */\n get codedWidth() {\n return this._backing.getCodedWidth();\n }\n /** The height in pixels of the track's coded samples, before any transformations or rotations. */\n get codedHeight() {\n return this._backing.getCodedHeight();\n }\n /** The angle in degrees by which the track's frames should be rotated (clockwise). */\n get rotation() {\n return this._backing.getRotation();\n }\n /** The width in pixels of the track's frames after rotation. */\n get displayWidth() {\n const rotation = this._backing.getRotation();\n return rotation % 180 === 0 ? this._backing.getCodedWidth() : this._backing.getCodedHeight();\n }\n /** The height in pixels of the track's frames after rotation. */\n get displayHeight() {\n const rotation = this._backing.getRotation();\n return rotation % 180 === 0 ? this._backing.getCodedHeight() : this._backing.getCodedWidth();\n }\n /** Returns the color space of the track's samples. */\n getColorSpace() {\n return this._backing.getColorSpace();\n }\n /** If this method returns true, the track's samples use a high dynamic range (HDR). */\n async hasHighDynamicRange() {\n const colorSpace = await this._backing.getColorSpace();\n return colorSpace.primaries === 'bt2020' || colorSpace.primaries === 'smpte432'\n || colorSpace.transfer === 'pg' || colorSpace.transfer === 'hlg'\n || colorSpace.matrix === 'bt2020-ncl';\n }\n /**\n * Returns the decoder configuration for decoding the track's packets using a VideoDecoder. Returns null if the\n * track's codec is unknown.\n */\n getDecoderConfig() {\n return this._backing.getDecoderConfig();\n }\n async getCodecParameterString() {\n const decoderConfig = await this._backing.getDecoderConfig();\n return decoderConfig?.codec ?? null;\n }\n async canDecode() {\n try {\n const decoderConfig = await this._backing.getDecoderConfig();\n if (!decoderConfig) {\n return false;\n }\n const codec = this._backing.getCodec();\n assert(codec !== null);\n if (customVideoDecoders.some(x => x.supports(codec, decoderConfig))) {\n return true;\n }\n if (typeof VideoDecoder === 'undefined') {\n return false;\n }\n const support = await VideoDecoder.isConfigSupported(decoderConfig);\n return support.supported === true;\n }\n catch (error) {\n console.error('Error during decodability check:', error);\n return false;\n }\n }\n async determinePacketType(packet) {\n if (!(packet instanceof EncodedPacket)) {\n throw new TypeError('packet must be an EncodedPacket.');\n }\n if (packet.isMetadataOnly) {\n throw new TypeError('packet must not be metadata-only to determine its type.');\n }\n if (this.codec === null) {\n return null;\n }\n return determineVideoPacketType(this, packet);\n }\n}\n/**\n * Represents an audio track in an input file.\n * @public\n */\nexport class InputAudioTrack extends InputTrack {\n /** @internal */\n constructor(backing) {\n super(backing);\n this._backing = backing;\n }\n get type() {\n return 'audio';\n }\n get codec() {\n return this._backing.getCodec();\n }\n /** The number of audio channels in the track. */\n get numberOfChannels() {\n return this._backing.getNumberOfChannels();\n }\n /** The track's audio sample rate in hertz. */\n get sampleRate() {\n return this._backing.getSampleRate();\n }\n /**\n * Returns the decoder configuration for decoding the track's packets using an AudioDecoder. Returns null if the\n * track's codec is unknown.\n */\n getDecoderConfig() {\n return this._backing.getDecoderConfig();\n }\n async getCodecParameterString() {\n const decoderConfig = await this._backing.getDecoderConfig();\n return decoderConfig?.codec ?? null;\n }\n async canDecode() {\n try {\n const decoderConfig = await this._backing.getDecoderConfig();\n if (!decoderConfig) {\n return false;\n }\n const codec = this._backing.getCodec();\n assert(codec !== null);\n if (customAudioDecoders.some(x => x.supports(codec, decoderConfig))) {\n return true;\n }\n if (decoderConfig.codec.startsWith('pcm-')) {\n return true; // Since we decode it ourselves\n }\n else {\n if (typeof AudioDecoder === 'undefined') {\n return false;\n }\n const support = await AudioDecoder.isConfigSupported(decoderConfig);\n return support.supported === true;\n }\n }\n catch (error) {\n console.error('Error during decodability check:', error);\n return false;\n }\n }\n async determinePacketType(packet) {\n if (!(packet instanceof EncodedPacket)) {\n throw new TypeError('packet must be an EncodedPacket.');\n }\n if (this.codec === null) {\n return null;\n }\n return 'key'; // No audio codec with delta packets\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { assert, binarySearchLessOrEqual, removeItem } from './misc.js';\nexport class Reader {\n constructor(source, maxStorableBytes = Infinity) {\n this.source = source;\n this.maxStorableBytes = maxStorableBytes;\n this.loadedSegments = [];\n this.loadingSegments = [];\n this.sourceSizePromise = null;\n this.nextAge = 0;\n this.totalStoredBytes = 0;\n }\n async loadRange(start, end) {\n end = Math.min(end, await this.source.getSize());\n if (start >= end) {\n return;\n }\n const matchingLoadingSegment = this.loadingSegments.find(x => x.start <= start && x.end >= end);\n if (matchingLoadingSegment) {\n // Simply wait for the existing promise to finish to avoid loading the same range twice\n await matchingLoadingSegment.promise;\n return;\n }\n const index = binarySearchLessOrEqual(this.loadedSegments, start, x => x.start);\n if (index !== -1) {\n for (let i = index; i < this.loadedSegments.length; i++) {\n const segment = this.loadedSegments[i];\n if (segment.start > start) {\n break;\n }\n const segmentEncasesRequestedRange = segment.end >= end;\n if (segmentEncasesRequestedRange) {\n // Nothing to load\n return;\n }\n }\n }\n this.source.onread?.(start, end);\n const bytesPromise = this.source._read(start, end);\n const loadingSegment = { start, end, promise: bytesPromise };\n this.loadingSegments.push(loadingSegment);\n const bytes = await bytesPromise;\n removeItem(this.loadingSegments, loadingSegment);\n this.insertIntoLoadedSegments(start, bytes);\n }\n rangeIsLoaded(start, end) {\n if (end <= start) {\n return true;\n }\n const index = binarySearchLessOrEqual(this.loadedSegments, start, x => x.start);\n if (index === -1) {\n return false;\n }\n for (let i = index; i < this.loadedSegments.length; i++) {\n const segment = this.loadedSegments[i];\n if (segment.start > start) {\n break;\n }\n const segmentEncasesRequestedRange = segment.end >= end;\n if (segmentEncasesRequestedRange) {\n return true;\n }\n }\n return false;\n }\n insertIntoLoadedSegments(start, bytes) {\n const segment = {\n start,\n end: start + bytes.byteLength,\n bytes,\n view: new DataView(bytes.buffer),\n age: this.nextAge++,\n };\n let index = binarySearchLessOrEqual(this.loadedSegments, start, x => x.start);\n if (index === -1 || this.loadedSegments[index].start < segment.start) {\n index++;\n }\n // Insert the segment at the right place so that the array remains sorted by start offset\n this.loadedSegments.splice(index, 0, segment);\n this.totalStoredBytes += bytes.byteLength;\n // Remove all other segments from the array that are completely covered by the newly-inserted segment\n for (let i = index + 1; i < this.loadedSegments.length; i++) {\n const otherSegment = this.loadedSegments[i];\n if (otherSegment.start >= segment.end) {\n break;\n }\n if (segment.start <= otherSegment.start && otherSegment.end <= segment.end) {\n this.loadedSegments.splice(i, 1);\n i--;\n }\n }\n // If we overshoot the max amount of permitted bytes, let's start evicting the oldest segments\n while (this.totalStoredBytes > this.maxStorableBytes && this.loadedSegments.length > 1) {\n let oldestSegment = null;\n let oldestSegmentIndex = -1;\n for (let i = 0; i < this.loadedSegments.length; i++) {\n const candidate = this.loadedSegments[i];\n if (!oldestSegment || candidate.age < oldestSegment.age) {\n oldestSegment = candidate;\n oldestSegmentIndex = i;\n }\n }\n assert(oldestSegment);\n this.totalStoredBytes -= oldestSegment.bytes.byteLength;\n this.loadedSegments.splice(oldestSegmentIndex, 1);\n }\n }\n getViewAndOffset(start, end) {\n const startIndex = binarySearchLessOrEqual(this.loadedSegments, start, x => x.start);\n let segment = null;\n if (startIndex !== -1) {\n for (let i = startIndex; i < this.loadedSegments.length; i++) {\n const candidate = this.loadedSegments[i];\n if (candidate.start > start) {\n break;\n }\n if (end <= candidate.end) {\n segment = candidate;\n break;\n }\n }\n }\n if (!segment) {\n throw new Error(`No segment loaded for range [${start}, ${end}).`);\n }\n segment.age = this.nextAge++;\n return {\n view: segment.view,\n offset: segment.bytes.byteOffset + start - segment.start,\n };\n }\n forgetRange(start, end) {\n if (end <= start) {\n return;\n }\n const startIndex = binarySearchLessOrEqual(this.loadedSegments, start, x => x.start);\n if (startIndex === -1) {\n return;\n }\n const segment = this.loadedSegments[startIndex];\n if (segment.start !== start || segment.end !== end) {\n return;\n }\n this.loadedSegments.splice(startIndex, 1);\n this.totalStoredBytes -= segment.bytes.byteLength;\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nexport class RiffReader {\n constructor(reader) {\n this.reader = reader;\n this.pos = 0;\n this.littleEndian = true;\n }\n readBytes(length) {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + length);\n this.pos += length;\n return new Uint8Array(view.buffer, offset, length);\n }\n readU16() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 2);\n this.pos += 2;\n return view.getUint16(offset, this.littleEndian);\n }\n readU32() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 4);\n this.pos += 4;\n return view.getUint32(offset, this.littleEndian);\n }\n readU64() {\n let low;\n let high;\n if (this.littleEndian) {\n low = this.readU32();\n high = this.readU32();\n }\n else {\n high = this.readU32();\n low = this.readU32();\n }\n return high * 0x100000000 + low;\n }\n readAscii(length) {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + length);\n this.pos += length;\n let str = '';\n for (let i = 0; i < length; i++) {\n str += String.fromCharCode(view.getUint8(offset + i));\n }\n return str;\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack } from '../input-track.js';\nimport { assert, UNDETERMINED_LANGUAGE } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { Reader } from '../reader.js';\nimport { RiffReader } from './riff-reader.js';\nexport var WaveFormat;\n(function (WaveFormat) {\n WaveFormat[WaveFormat[\"PCM\"] = 1] = \"PCM\";\n WaveFormat[WaveFormat[\"IEEE_FLOAT\"] = 3] = \"IEEE_FLOAT\";\n WaveFormat[WaveFormat[\"ALAW\"] = 6] = \"ALAW\";\n WaveFormat[WaveFormat[\"MULAW\"] = 7] = \"MULAW\";\n WaveFormat[WaveFormat[\"EXTENSIBLE\"] = 65534] = \"EXTENSIBLE\";\n})(WaveFormat || (WaveFormat = {}));\nexport class WaveDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.metadataPromise = null;\n this.dataStart = -1;\n this.dataSize = -1;\n this.audioInfo = null;\n this.tracks = [];\n this.metadataReader = new RiffReader(input._mainReader);\n this.chunkReader = new RiffReader(new Reader(input.source, 64 * 2 ** 20));\n }\n async readMetadata() {\n return this.metadataPromise ??= (async () => {\n const actualFileSize = await this.metadataReader.reader.source.getSize();\n const riffType = this.metadataReader.readAscii(4);\n this.metadataReader.littleEndian = riffType !== 'RIFX';\n const isRf64 = riffType === 'RF64';\n const outerChunkSize = this.metadataReader.readU32();\n let totalFileSize = isRf64 ? actualFileSize : Math.min(outerChunkSize + 8, actualFileSize);\n const format = this.metadataReader.readAscii(4);\n if (format !== 'WAVE') {\n throw new Error('Invalid WAVE file - wrong format');\n }\n this.metadataReader.pos = 12;\n let chunksRead = 0;\n let dataChunkSize = null;\n while (this.metadataReader.pos < totalFileSize) {\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + 8);\n const chunkId = this.metadataReader.readAscii(4);\n const chunkSize = this.metadataReader.readU32();\n const startPos = this.metadataReader.pos;\n if (isRf64 && chunksRead === 0 && chunkId !== 'ds64') {\n throw new Error('Invalid RF64 file: First chunk must be \"ds64\".');\n }\n if (chunkId === 'fmt ') {\n await this.parseFmtChunk(chunkSize);\n }\n else if (chunkId === 'data') {\n dataChunkSize ??= chunkSize;\n this.dataStart = this.metadataReader.pos;\n this.dataSize = Math.min(dataChunkSize, totalFileSize - this.dataStart);\n }\n else if (chunkId === 'ds64') {\n // File and data chunk sizes are defined in here instead\n const riffChunkSize = this.metadataReader.readU64();\n dataChunkSize = this.metadataReader.readU64();\n totalFileSize = Math.min(riffChunkSize + 8, actualFileSize);\n }\n this.metadataReader.pos = startPos + chunkSize + (chunkSize & 1); // Handle padding\n chunksRead++;\n }\n if (!this.audioInfo) {\n throw new Error('Invalid WAVE file - missing \"fmt \" chunk');\n }\n if (this.dataStart === -1) {\n throw new Error('Invalid WAVE file - missing \"data\" chunk');\n }\n const blockSize = this.audioInfo.blockSizeInBytes;\n this.dataSize = Math.floor(this.dataSize / blockSize) * blockSize;\n this.tracks.push(new InputAudioTrack(new WaveAudioTrackBacking(this)));\n })();\n }\n async parseFmtChunk(size) {\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + size);\n let formatTag = this.metadataReader.readU16();\n const numChannels = this.metadataReader.readU16();\n const sampleRate = this.metadataReader.readU32();\n this.metadataReader.pos += 4; // Bytes per second\n const blockAlign = this.metadataReader.readU16();\n let bitsPerSample;\n if (size === 14) { // Plain WAVEFORMAT\n bitsPerSample = 8;\n }\n else {\n bitsPerSample = this.metadataReader.readU16();\n }\n // Handle WAVEFORMATEXTENSIBLE\n if (size >= 18 && formatTag !== 0x0165) {\n const cbSize = this.metadataReader.readU16();\n const remainingSize = size - 18;\n const extensionSize = Math.min(remainingSize, cbSize);\n if (extensionSize >= 22 && formatTag === WaveFormat.EXTENSIBLE) {\n // Parse WAVEFORMATEXTENSIBLE\n this.metadataReader.pos += 2 + 4;\n const subFormat = this.metadataReader.readBytes(16);\n // Get actual format from subFormat GUID\n formatTag = subFormat[0] | (subFormat[1] << 8);\n }\n }\n if (formatTag === WaveFormat.MULAW || formatTag === WaveFormat.ALAW) {\n bitsPerSample = 8;\n }\n this.audioInfo = {\n format: formatTag,\n numberOfChannels: numChannels,\n sampleRate,\n sampleSizeInBytes: Math.ceil(bitsPerSample / 8),\n blockSizeInBytes: blockAlign,\n };\n }\n getCodec() {\n assert(this.audioInfo);\n if (this.audioInfo.format === WaveFormat.MULAW) {\n return 'ulaw';\n }\n if (this.audioInfo.format === WaveFormat.ALAW) {\n return 'alaw';\n }\n if (this.audioInfo.format === WaveFormat.PCM) {\n // All formats are little-endian\n if (this.audioInfo.sampleSizeInBytes === 1) {\n return 'pcm-u8';\n }\n else if (this.audioInfo.sampleSizeInBytes === 2) {\n return 'pcm-s16';\n }\n else if (this.audioInfo.sampleSizeInBytes === 3) {\n return 'pcm-s24';\n }\n else if (this.audioInfo.sampleSizeInBytes === 4) {\n return 'pcm-s32';\n }\n }\n if (this.audioInfo.format === WaveFormat.IEEE_FLOAT) {\n if (this.audioInfo.sampleSizeInBytes === 4) {\n return 'pcm-f32';\n }\n }\n return null;\n }\n async getMimeType() {\n return 'audio/wav';\n }\n async computeDuration() {\n await this.readMetadata();\n assert(this.audioInfo);\n const numberOfBlocks = this.dataSize / this.audioInfo.blockSizeInBytes;\n return numberOfBlocks / this.audioInfo.sampleRate;\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks;\n }\n}\nconst PACKET_SIZE_IN_FRAMES = 2048;\nclass WaveAudioTrackBacking {\n constructor(demuxer) {\n this.demuxer = demuxer;\n }\n getId() {\n return 1;\n }\n getCodec() {\n return this.demuxer.getCodec();\n }\n async getDecoderConfig() {\n const codec = this.demuxer.getCodec();\n if (!codec) {\n return null;\n }\n assert(this.demuxer.audioInfo);\n return {\n codec,\n numberOfChannels: this.demuxer.audioInfo.numberOfChannels,\n sampleRate: this.demuxer.audioInfo.sampleRate,\n };\n }\n computeDuration() {\n return this.demuxer.computeDuration();\n }\n getNumberOfChannels() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.numberOfChannels;\n }\n getSampleRate() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.sampleRate;\n }\n getTimeResolution() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.sampleRate;\n }\n getLanguageCode() {\n return UNDETERMINED_LANGUAGE;\n }\n async getFirstTimestamp() {\n return 0;\n }\n async getPacketAtIndex(packetIndex, options) {\n assert(this.demuxer.audioInfo);\n const startOffset = packetIndex * PACKET_SIZE_IN_FRAMES * this.demuxer.audioInfo.blockSizeInBytes;\n if (startOffset >= this.demuxer.dataSize) {\n return null;\n }\n const sizeInBytes = Math.min(PACKET_SIZE_IN_FRAMES * this.demuxer.audioInfo.blockSizeInBytes, this.demuxer.dataSize - startOffset);\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n const sizeOfOnePacket = PACKET_SIZE_IN_FRAMES * this.demuxer.audioInfo.blockSizeInBytes;\n const chunkSize = Math.ceil(2 ** 19 / sizeOfOnePacket) * sizeOfOnePacket;\n const chunkStart = Math.floor(startOffset / chunkSize) * chunkSize;\n const chunkEnd = chunkStart + chunkSize;\n // Always load large 0.5 MiB chunks instead of just the required packet\n await this.demuxer.chunkReader.reader.loadRange(this.demuxer.dataStart + chunkStart, this.demuxer.dataStart + chunkEnd);\n this.demuxer.chunkReader.pos = this.demuxer.dataStart + startOffset;\n data = this.demuxer.chunkReader.readBytes(sizeInBytes);\n }\n const timestamp = packetIndex * PACKET_SIZE_IN_FRAMES / this.demuxer.audioInfo.sampleRate;\n const duration = sizeInBytes / this.demuxer.audioInfo.blockSizeInBytes / this.demuxer.audioInfo.sampleRate;\n return new EncodedPacket(data, 'key', timestamp, duration, packetIndex, sizeInBytes);\n }\n getFirstPacket(options) {\n return this.getPacketAtIndex(0, options);\n }\n getPacket(timestamp, options) {\n assert(this.demuxer.audioInfo);\n const packetIndex = Math.floor(timestamp * this.demuxer.audioInfo.sampleRate / PACKET_SIZE_IN_FRAMES);\n return this.getPacketAtIndex(packetIndex, options);\n }\n getNextPacket(packet, options) {\n assert(this.demuxer.audioInfo);\n const packetIndex = Math.round(packet.timestamp * this.demuxer.audioInfo.sampleRate / PACKET_SIZE_IN_FRAMES);\n return this.getPacketAtIndex(packetIndex + 1, options);\n }\n getKeyPacket(timestamp, options) {\n return this.getPacket(timestamp, options);\n }\n getNextKeyPacket(packet, options) {\n return this.getNextPacket(packet, options);\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { mergeObjectsDeeply, retriedFetch } from './misc.js';\n/**\n * The source base class, representing a resource from which bytes can be read.\n * @public\n */\nexport class Source {\n constructor() {\n /** @internal */\n this._sizePromise = null;\n /** Called each time data is requested from the source. */\n this.onread = null;\n }\n /**\n * Resolves with the total size of the file in bytes. This function is memoized, meaning only the first call\n * will retrieve the size.\n */\n getSize() {\n return this._sizePromise ??= this._retrieveSize();\n }\n}\n/**\n * A source backed by an ArrayBuffer or ArrayBufferView, with the entire file held in memory.\n * @public\n */\nexport class BufferSource extends Source {\n constructor(buffer) {\n if (!(buffer instanceof ArrayBuffer) && !(buffer instanceof Uint8Array)) {\n throw new TypeError('buffer must be an ArrayBuffer or Uint8Array.');\n }\n super();\n this._bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n }\n /** @internal */\n async _read(start, end) {\n return this._bytes.subarray(start, end);\n }\n /** @internal */\n async _retrieveSize() {\n return this._bytes.byteLength;\n }\n}\n/**\n * A general-purpose, callback-driven source that can get its data from anywhere.\n * @public\n */\nexport class StreamSource extends Source {\n constructor(options) {\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (typeof options.read !== 'function') {\n throw new TypeError('options.read must be a function.');\n }\n if (typeof options.getSize !== 'function') {\n throw new TypeError('options.getSize must be a function.');\n }\n super();\n this._options = options;\n }\n /** @internal */\n async _read(start, end) {\n return this._options.read(start, end);\n }\n /** @internal */\n async _retrieveSize() {\n return this._options.getSize();\n }\n}\n/**\n * A source backed by a Blob. Since Files are also Blobs, this is the source to use when reading files off the disk.\n * @public\n */\nexport class BlobSource extends Source {\n constructor(blob) {\n if (!(blob instanceof Blob)) {\n throw new TypeError('blob must be a Blob.');\n }\n super();\n this._blob = blob;\n }\n /** @internal */\n async _read(start, end) {\n const slice = this._blob.slice(start, end);\n const buffer = await slice.arrayBuffer();\n return new Uint8Array(buffer);\n }\n /** @internal */\n async _retrieveSize() {\n return this._blob.size;\n }\n}\n/**\n * A source backed by a URL. This is useful for reading data from the network. Be careful using this source however,\n * as it typically comes with increased latency.\n * @beta\n */\nexport class UrlSource extends Source {\n constructor(url, options = {}) {\n if (typeof url !== 'string' && !(url instanceof URL)) {\n throw new TypeError('url must be a string or URL.');\n }\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.requestInit !== undefined && (!options.requestInit || typeof options.requestInit !== 'object')) {\n throw new TypeError('options.requestInit, when provided, must be an object.');\n }\n if (options.getRetryDelay !== undefined && typeof options.getRetryDelay !== 'function') {\n throw new TypeError('options.getRetryDelay, when provided, must be a function.');\n }\n super();\n /** @internal */\n this._fullData = null;\n this._url = url;\n this._options = options;\n }\n /** @internal */\n async _makeRequest(range) {\n const headers = {};\n if (range) {\n headers['Range'] = `bytes=${range.start}-${range.end - 1}`;\n }\n const response = await retriedFetch(this._url, mergeObjectsDeeply(this._options.requestInit ?? {}, {\n method: 'GET',\n headers,\n }), this._options.getRetryDelay ?? (() => null));\n if (!response.ok) {\n throw new Error(`Error fetching ${this._url}: ${response.status} ${response.statusText}`);\n }\n const buffer = await response.arrayBuffer();\n if (response.status === 200) {\n // The server didn't return 206 Partial Content, so it's not a range response\n this._fullData = buffer;\n }\n return {\n response: buffer,\n statusCode: response.status,\n };\n }\n /** @internal */\n async _read(start, end) {\n if (this._fullData) {\n return new Uint8Array(this._fullData, start, end - start);\n }\n const { response, statusCode } = await this._makeRequest({ start, end });\n // If server doesn't support range requests, it will return 200 instead of 206. In that case, let's manually\n // slice the response.\n if (statusCode === 200) {\n const fullData = new Uint8Array(response);\n return fullData.subarray(start, end);\n }\n return new Uint8Array(response);\n }\n /** @internal */\n async _retrieveSize() {\n if (this._fullData) {\n return this._fullData.byteLength;\n }\n // First, try a HEAD request to get the size\n try {\n const headResponse = await retriedFetch(this._url, mergeObjectsDeeply(this._options.requestInit ?? {}, {\n method: 'HEAD',\n }), this._options.getRetryDelay ?? (() => null));\n if (headResponse.ok) {\n const contentLength = headResponse.headers.get('Content-Length');\n if (contentLength) {\n return parseInt(contentLength);\n }\n }\n }\n catch {\n // We tried\n }\n // Try a range request to get the Content-Range header\n const rangeResponse = await retriedFetch(this._url, mergeObjectsDeeply(this._options.requestInit ?? {}, {\n method: 'GET',\n headers: { Range: 'bytes=0-0' },\n }), this._options.getRetryDelay ?? (() => null));\n if (rangeResponse.status === 206) {\n const contentRange = rangeResponse.headers.get('Content-Range');\n if (contentRange) {\n const match = contentRange.match(/bytes \\d+-\\d+\\/(\\d+)/);\n if (match && match[1]) {\n return parseInt(match[1]);\n }\n }\n }\n else if (rangeResponse.status === 200) {\n // The server just returned the whole thing\n this._fullData = await rangeResponse.arrayBuffer();\n return this._fullData.byteLength;\n }\n // If the range request didn't provide the size, make a full GET request\n const { response } = await this._makeRequest();\n return response.byteLength;\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { extractAudioCodecString, extractVideoCodecString, parseAacAudioSpecificConfig, parsePcmCodec, PCM_AUDIO_CODECS, } from '../codec.js';\nimport { extractVp9CodecInfoFromPacket, extractAv1CodecInfoFromPacket, } from '../codec-data.js';\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack, InputVideoTrack, } from '../input-track.js';\nimport { assert, COLOR_PRIMARIES_MAP_INVERSE, MATRIX_COEFFICIENTS_MAP_INVERSE, TRANSFER_CHARACTERISTICS_MAP_INVERSE, binarySearchLessOrEqual, binarySearchExact, last, AsyncMutex, findLastIndex, UNDETERMINED_LANGUAGE, roundToPrecision, isIso639Dash2LanguageCode, roundToMultiple, normalizeRotation, Bitstream, } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { Reader } from '../reader.js';\nimport { buildIsobmffMimeType } from './isobmff-misc.js';\nimport { IsobmffReader, MAX_BOX_HEADER_SIZE, MIN_BOX_HEADER_SIZE } from './isobmff-reader.js';\nexport class IsobmffDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.currentTrack = null;\n this.tracks = [];\n this.metadataPromise = null;\n this.movieTimescale = -1;\n this.movieDurationInTimescale = -1;\n this.isQuickTime = false;\n this.isFragmented = false;\n this.fragmentTrackDefaults = [];\n this.fragments = [];\n this.currentFragment = null;\n this.fragmentLookupMutex = new AsyncMutex();\n this.metadataReader = new IsobmffReader(input._mainReader);\n this.chunkReader = new IsobmffReader(new Reader(input.source, 64 * 2 ** 20)); // Max 64 MiB of stored chunks\n }\n async computeDuration() {\n const tracks = await this.getTracks();\n const trackDurations = await Promise.all(tracks.map(x => x.computeDuration()));\n return Math.max(0, ...trackDurations);\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks.map(track => track.inputTrack);\n }\n async getMimeType() {\n await this.readMetadata();\n const codecStrings = await Promise.all(this.tracks.map(x => x.inputTrack.getCodecParameterString()));\n return buildIsobmffMimeType({\n isQuickTime: this.isQuickTime,\n hasVideo: this.tracks.some(x => x.info?.type === 'video'),\n hasAudio: this.tracks.some(x => x.info?.type === 'audio'),\n codecStrings: codecStrings.filter(Boolean),\n });\n }\n readMetadata() {\n return this.metadataPromise ??= (async () => {\n const sourceSize = await this.metadataReader.reader.source.getSize();\n while (this.metadataReader.pos < sourceSize) {\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + MAX_BOX_HEADER_SIZE);\n const startPos = this.metadataReader.pos;\n const boxInfo = this.metadataReader.readBoxHeader();\n if (boxInfo.name === 'ftyp') {\n const majorBrand = this.metadataReader.readAscii(4);\n this.isQuickTime = majorBrand === 'qt ';\n }\n else if (boxInfo.name === 'moov') {\n // Found moov, load it\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + boxInfo.contentSize);\n this.readContiguousBoxes(boxInfo.contentSize);\n for (const track of this.tracks) {\n // Modify the edit list offset based on the previous segment durations. They are in different\n // timescales, so we first convert to seconds and then into the track timescale.\n const previousSegmentDurationsInSeconds = track.editListPreviousSegmentDurations / this.movieTimescale;\n track.editListOffset -= Math.round(previousSegmentDurationsInSeconds * track.timescale);\n }\n break;\n }\n this.metadataReader.pos = startPos + boxInfo.totalSize;\n }\n if (this.isFragmented) {\n // The last 4 bytes may contain the size of the mfra box at the end of the file\n await this.metadataReader.reader.loadRange(sourceSize - 4, sourceSize);\n this.metadataReader.pos = sourceSize - 4;\n const lastWord = this.metadataReader.readU32();\n const potentialMfraPos = sourceSize - lastWord;\n if (potentialMfraPos >= 0 && potentialMfraPos < sourceSize) {\n await this.metadataReader.reader.loadRange(potentialMfraPos, sourceSize);\n this.metadataReader.pos = potentialMfraPos;\n const boxInfo = this.metadataReader.readBoxHeader();\n if (boxInfo.name === 'mfra') {\n // We found the mfra box, allowing for much better random access. Let's parse it:\n this.readContiguousBoxes(boxInfo.contentSize);\n }\n }\n }\n })();\n }\n getSampleTableForTrack(internalTrack) {\n if (internalTrack.sampleTable) {\n return internalTrack.sampleTable;\n }\n const sampleTable = {\n sampleTimingEntries: [],\n sampleCompositionTimeOffsets: [],\n sampleSizes: [],\n keySampleIndices: null,\n chunkOffsets: [],\n sampleToChunk: [],\n presentationTimestamps: null,\n presentationTimestampIndexMap: null,\n };\n internalTrack.sampleTable = sampleTable;\n this.metadataReader.pos = internalTrack.sampleTableByteOffset;\n this.currentTrack = internalTrack;\n this.traverseBox();\n this.currentTrack = null;\n const isPcmCodec = internalTrack.info?.type === 'audio'\n && internalTrack.info.codec\n && PCM_AUDIO_CODECS.includes(internalTrack.info.codec);\n if (isPcmCodec && sampleTable.sampleCompositionTimeOffsets.length === 0) {\n // If the audio has PCM samples, the way the samples are defined in the sample table is somewhat\n // suboptimal: Each individual audio sample is its own sample, meaning we can have 48000 samples per second.\n // Because we treat each sample as its own atomic unit that can be decoded, this would lead to a huge\n // amount of very short samples for PCM audio. So instead, we make a transformation: If the audio is in PCM,\n // we say that each chunk (that normally holds many samples) now is one big sample. We can this because\n // the samples in the chunk are contiguous and the format is PCM, so the entire chunk as one thing still\n // encodes valid audio information.\n assert(internalTrack.info?.type === 'audio');\n const pcmInfo = parsePcmCodec(internalTrack.info.codec);\n const newSampleTimingEntries = [];\n const newSampleSizes = [];\n for (let i = 0; i < sampleTable.sampleToChunk.length; i++) {\n const chunkEntry = sampleTable.sampleToChunk[i];\n const nextEntry = sampleTable.sampleToChunk[i + 1];\n const chunkCount = (nextEntry ? nextEntry.startChunkIndex : sampleTable.chunkOffsets.length)\n - chunkEntry.startChunkIndex;\n for (let j = 0; j < chunkCount; j++) {\n const startSampleIndex = chunkEntry.startSampleIndex + j * chunkEntry.samplesPerChunk;\n const endSampleIndex = startSampleIndex + chunkEntry.samplesPerChunk; // Exclusive, outside of chunk\n const startTimingEntryIndex = binarySearchLessOrEqual(sampleTable.sampleTimingEntries, startSampleIndex, x => x.startIndex);\n const startTimingEntry = sampleTable.sampleTimingEntries[startTimingEntryIndex];\n const endTimingEntryIndex = binarySearchLessOrEqual(sampleTable.sampleTimingEntries, endSampleIndex, x => x.startIndex);\n const endTimingEntry = sampleTable.sampleTimingEntries[endTimingEntryIndex];\n const firstSampleTimestamp = startTimingEntry.startDecodeTimestamp\n + (startSampleIndex - startTimingEntry.startIndex) * startTimingEntry.delta;\n const lastSampleTimestamp = endTimingEntry.startDecodeTimestamp\n + (endSampleIndex - endTimingEntry.startIndex) * endTimingEntry.delta;\n const delta = lastSampleTimestamp - firstSampleTimestamp;\n const lastSampleTimingEntry = last(newSampleTimingEntries);\n if (lastSampleTimingEntry && lastSampleTimingEntry.delta === delta) {\n lastSampleTimingEntry.count++;\n }\n else {\n // One sample for the entire chunk\n newSampleTimingEntries.push({\n startIndex: chunkEntry.startChunkIndex + j,\n startDecodeTimestamp: firstSampleTimestamp,\n count: 1,\n delta,\n });\n }\n // Instead of determining the chunk's size by looping over the samples sizes in the sample table, we\n // can directly compute it as we know how many PCM frames are in this chunk, and the size of each\n // PCM frame. This also improves compatibility with some files which fail to write proper sample\n // size values into their sample tables in the PCM case.\n const chunkSize = chunkEntry.samplesPerChunk\n * pcmInfo.sampleSize\n * internalTrack.info.numberOfChannels;\n newSampleSizes.push(chunkSize);\n }\n chunkEntry.startSampleIndex = chunkEntry.startChunkIndex;\n chunkEntry.samplesPerChunk = 1;\n }\n sampleTable.sampleTimingEntries = newSampleTimingEntries;\n sampleTable.sampleSizes = newSampleSizes;\n }\n if (sampleTable.sampleCompositionTimeOffsets.length > 0) {\n // If composition time offsets are defined, we must build a list of all presentation timestamps and then\n // sort them\n sampleTable.presentationTimestamps = [];\n for (const entry of sampleTable.sampleTimingEntries) {\n for (let i = 0; i < entry.count; i++) {\n sampleTable.presentationTimestamps.push({\n presentationTimestamp: entry.startDecodeTimestamp + i * entry.delta,\n sampleIndex: entry.startIndex + i,\n });\n }\n }\n for (const entry of sampleTable.sampleCompositionTimeOffsets) {\n for (let i = 0; i < entry.count; i++) {\n const sampleIndex = entry.startIndex + i;\n const sample = sampleTable.presentationTimestamps[sampleIndex];\n if (!sample) {\n continue;\n }\n sample.presentationTimestamp += entry.offset;\n }\n }\n sampleTable.presentationTimestamps.sort((a, b) => a.presentationTimestamp - b.presentationTimestamp);\n sampleTable.presentationTimestampIndexMap = Array(sampleTable.presentationTimestamps.length).fill(-1);\n for (let i = 0; i < sampleTable.presentationTimestamps.length; i++) {\n sampleTable.presentationTimestampIndexMap[sampleTable.presentationTimestamps[i].sampleIndex] = i;\n }\n }\n else {\n // If they're not defined, we can simply use the decode timestamps as presentation timestamps\n }\n return sampleTable;\n }\n async readFragment() {\n const startPos = this.metadataReader.pos;\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + MAX_BOX_HEADER_SIZE);\n const moofBoxInfo = this.metadataReader.readBoxHeader();\n assert(moofBoxInfo.name === 'moof');\n const contentStart = this.metadataReader.pos;\n await this.metadataReader.reader.loadRange(contentStart, contentStart + moofBoxInfo.contentSize);\n this.metadataReader.pos = startPos;\n this.traverseBox();\n const index = binarySearchExact(this.fragments, startPos, x => x.moofOffset);\n assert(index !== -1);\n const fragment = this.fragments[index];\n assert(fragment.moofOffset === startPos);\n // We have read everything in the moof box, there's no need to keep the data around anymore\n // (keep the header tho)\n this.metadataReader.reader.forgetRange(contentStart, contentStart + moofBoxInfo.contentSize);\n // It may be that some tracks don't define the base decode time, i.e. when the fragment begins. This means the\n // only other option is to sum up the duration of all previous fragments.\n for (const [trackId, trackData] of fragment.trackData) {\n if (trackData.startTimestampIsFinal) {\n continue;\n }\n const internalTrack = this.tracks.find(x => x.id === trackId);\n this.metadataReader.pos = 0;\n let currentFragment = null;\n let lastFragment = null;\n const index = binarySearchLessOrEqual(internalTrack.fragments, startPos - 1, x => x.moofOffset);\n if (index !== -1) {\n // Instead of starting at the start of the file, let's start at the previous fragment instead (which\n // already has final timestamps).\n currentFragment = internalTrack.fragments[index];\n lastFragment = currentFragment;\n this.metadataReader.pos = currentFragment.moofOffset + currentFragment.moofSize;\n }\n let nextFragmentIsFirstFragment = this.metadataReader.pos === 0;\n while (this.metadataReader.pos < startPos) {\n if (currentFragment?.nextFragment) {\n currentFragment = currentFragment.nextFragment;\n this.metadataReader.pos = currentFragment.moofOffset + currentFragment.moofSize;\n }\n else {\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + MAX_BOX_HEADER_SIZE);\n const startPos = this.metadataReader.pos;\n const boxInfo = this.metadataReader.readBoxHeader();\n if (boxInfo.name === 'moof') {\n const index = binarySearchExact(this.fragments, startPos, x => x.moofOffset);\n let fragment;\n if (index === -1) {\n this.metadataReader.pos = startPos;\n fragment = await this.readFragment(); // Recursive call\n }\n else {\n // We already know this fragment\n fragment = this.fragments[index];\n }\n // Even if we already know the fragment, we might not yet know its predecessor; always do this\n if (currentFragment)\n currentFragment.nextFragment = fragment;\n currentFragment = fragment;\n if (nextFragmentIsFirstFragment) {\n fragment.isKnownToBeFirstFragment = true;\n nextFragmentIsFirstFragment = false;\n }\n }\n this.metadataReader.pos = startPos + boxInfo.totalSize;\n }\n if (currentFragment && currentFragment.trackData.has(trackId)) {\n lastFragment = currentFragment;\n }\n }\n if (lastFragment) {\n const otherTrackData = lastFragment.trackData.get(trackId);\n assert(otherTrackData.startTimestampIsFinal);\n offsetFragmentTrackDataByTimestamp(trackData, otherTrackData.endTimestamp);\n }\n trackData.startTimestampIsFinal = true;\n }\n return fragment;\n }\n readContiguousBoxes(totalSize) {\n const startIndex = this.metadataReader.pos;\n while (this.metadataReader.pos - startIndex <= totalSize - MIN_BOX_HEADER_SIZE) {\n this.traverseBox();\n }\n }\n traverseBox() {\n const startPos = this.metadataReader.pos;\n const boxInfo = this.metadataReader.readBoxHeader();\n const boxEndPos = startPos + boxInfo.totalSize;\n switch (boxInfo.name) {\n case 'mdia':\n case 'minf':\n case 'dinf':\n case 'mfra':\n case 'edts':\n {\n this.readContiguousBoxes(boxInfo.contentSize);\n }\n ;\n break;\n case 'mvhd':\n {\n const version = this.metadataReader.readU8();\n this.metadataReader.pos += 3; // Flags\n if (version === 1) {\n this.metadataReader.pos += 8 + 8;\n this.movieTimescale = this.metadataReader.readU32();\n this.movieDurationInTimescale = this.metadataReader.readU64();\n }\n else {\n this.metadataReader.pos += 4 + 4;\n this.movieTimescale = this.metadataReader.readU32();\n this.movieDurationInTimescale = this.metadataReader.readU32();\n }\n }\n ;\n break;\n case 'trak':\n {\n const track = {\n id: -1,\n demuxer: this,\n inputTrack: null,\n info: null,\n timescale: -1,\n durationInMovieTimescale: -1,\n durationInMediaTimescale: -1,\n rotation: 0,\n languageCode: UNDETERMINED_LANGUAGE,\n sampleTableByteOffset: -1,\n sampleTable: null,\n fragmentLookupTable: null,\n currentFragmentState: null,\n fragments: [],\n fragmentsWithKeyFrame: [],\n editListPreviousSegmentDurations: 0,\n editListOffset: 0,\n };\n this.currentTrack = track;\n this.readContiguousBoxes(boxInfo.contentSize);\n if (track.id !== -1 && track.timescale !== -1 && track.info !== null) {\n if (track.info.type === 'video' && track.info.width !== -1) {\n const videoTrack = track;\n track.inputTrack = new InputVideoTrack(new IsobmffVideoTrackBacking(videoTrack));\n this.tracks.push(track);\n }\n else if (track.info.type === 'audio' && track.info.numberOfChannels !== -1) {\n const audioTrack = track;\n track.inputTrack = new InputAudioTrack(new IsobmffAudioTrackBacking(audioTrack));\n this.tracks.push(track);\n }\n }\n this.currentTrack = null;\n }\n ;\n break;\n case 'tkhd':\n {\n const track = this.currentTrack;\n assert(track);\n const version = this.metadataReader.readU8();\n const flags = this.metadataReader.readU24();\n const trackEnabled = (flags & 0x1) !== 0;\n if (!trackEnabled) {\n break;\n }\n // Skip over creation & modification time to reach the track ID\n if (version === 0) {\n this.metadataReader.pos += 8;\n track.id = this.metadataReader.readU32();\n this.metadataReader.pos += 4;\n track.durationInMovieTimescale = this.metadataReader.readU32();\n }\n else if (version === 1) {\n this.metadataReader.pos += 16;\n track.id = this.metadataReader.readU32();\n this.metadataReader.pos += 4;\n track.durationInMovieTimescale = this.metadataReader.readU64();\n }\n else {\n throw new Error(`Incorrect track header version ${version}.`);\n }\n this.metadataReader.pos += 2 * 4 + 2 + 2 + 2 + 2;\n const matrix = [\n this.metadataReader.readFixed_16_16(),\n this.metadataReader.readFixed_16_16(),\n this.metadataReader.readFixed_2_30(),\n this.metadataReader.readFixed_16_16(),\n this.metadataReader.readFixed_16_16(),\n this.metadataReader.readFixed_2_30(),\n this.metadataReader.readFixed_16_16(),\n this.metadataReader.readFixed_16_16(),\n this.metadataReader.readFixed_2_30(),\n ];\n const rotation = normalizeRotation(roundToMultiple(extractRotationFromMatrix(matrix), 90));\n assert(rotation === 0 || rotation === 90 || rotation === 180 || rotation === 270);\n track.rotation = rotation;\n }\n ;\n break;\n case 'elst':\n {\n const track = this.currentTrack;\n assert(track);\n const version = this.metadataReader.readU8();\n this.metadataReader.pos += 3; // Flags\n let relevantEntryFound = false;\n let previousSegmentDurations = 0;\n const entryCount = this.metadataReader.readU32();\n for (let i = 0; i < entryCount; i++) {\n const segmentDuration = version === 1\n ? this.metadataReader.readU64()\n : this.metadataReader.readU32();\n const mediaTime = version === 1\n ? this.metadataReader.readI64()\n : this.metadataReader.readI32();\n const mediaRate = this.metadataReader.readFixed_16_16();\n if (segmentDuration === 0) {\n // Don't care\n continue;\n }\n if (relevantEntryFound) {\n console.warn('Unsupported edit list: multiple edits are not currently supported. Only using first edit.');\n break;\n }\n if (mediaTime === -1) {\n previousSegmentDurations += segmentDuration;\n continue;\n }\n if (mediaRate !== 1) {\n console.warn('Unsupported edit list entry: media rate must be 1.');\n break;\n }\n track.editListPreviousSegmentDurations = previousSegmentDurations;\n track.editListOffset = mediaTime;\n relevantEntryFound = true;\n }\n }\n ;\n break;\n case 'mdhd':\n {\n const track = this.currentTrack;\n assert(track);\n const version = this.metadataReader.readU8();\n this.metadataReader.pos += 3; // Flags\n if (version === 0) {\n this.metadataReader.pos += 8;\n track.timescale = this.metadataReader.readU32();\n track.durationInMediaTimescale = this.metadataReader.readU32();\n }\n else if (version === 1) {\n this.metadataReader.pos += 16;\n track.timescale = this.metadataReader.readU32();\n track.durationInMediaTimescale = this.metadataReader.readU64();\n }\n let language = this.metadataReader.readU16();\n if (language > 0) {\n track.languageCode = '';\n for (let i = 0; i < 3; i++) {\n track.languageCode = String.fromCharCode(0x60 + (language & 0b11111)) + track.languageCode;\n language >>= 5;\n }\n if (!isIso639Dash2LanguageCode(track.languageCode)) {\n // Sometimes the bytes are garbage\n track.languageCode = UNDETERMINED_LANGUAGE;\n }\n }\n }\n ;\n break;\n case 'hdlr':\n {\n const track = this.currentTrack;\n assert(track);\n this.metadataReader.pos += 8; // Version + flags + pre-defined\n const handlerType = this.metadataReader.readAscii(4);\n if (handlerType === 'vide') {\n track.info = {\n type: 'video',\n width: -1,\n height: -1,\n codec: null,\n codecDescription: null,\n colorSpace: null,\n avcCodecInfo: null,\n hevcCodecInfo: null,\n vp9CodecInfo: null,\n av1CodecInfo: null,\n };\n }\n else if (handlerType === 'soun') {\n track.info = {\n type: 'audio',\n numberOfChannels: -1,\n sampleRate: -1,\n codec: null,\n codecDescription: null,\n aacCodecInfo: null,\n };\n }\n }\n ;\n break;\n case 'stbl':\n {\n const track = this.currentTrack;\n assert(track);\n track.sampleTableByteOffset = startPos;\n this.readContiguousBoxes(boxInfo.contentSize);\n }\n ;\n break;\n case 'stsd':\n {\n const track = this.currentTrack;\n assert(track);\n if (track.info === null || track.sampleTable) {\n break;\n }\n const stsdVersion = this.metadataReader.readU8();\n this.metadataReader.pos += 3; // Flags\n const entries = this.metadataReader.readU32();\n for (let i = 0; i < entries; i++) {\n const startPos = this.metadataReader.pos;\n const sampleBoxInfo = this.metadataReader.readBoxHeader();\n const lowercaseBoxName = sampleBoxInfo.name.toLowerCase();\n if (track.info.type === 'video') {\n if (lowercaseBoxName === 'avc1') {\n track.info.codec = 'avc';\n }\n else if (lowercaseBoxName === 'hvc1' || lowercaseBoxName === 'hev1') {\n track.info.codec = 'hevc';\n }\n else if (lowercaseBoxName === 'vp08') {\n track.info.codec = 'vp8';\n }\n else if (lowercaseBoxName === 'vp09') {\n track.info.codec = 'vp9';\n }\n else if (lowercaseBoxName === 'av01') {\n track.info.codec = 'av1';\n }\n else {\n console.warn(`Unsupported video codec (sample entry type '${sampleBoxInfo.name}').`);\n }\n this.metadataReader.pos += 6 * 1 + 2 + 2 + 2 + 3 * 4;\n track.info.width = this.metadataReader.readU16();\n track.info.height = this.metadataReader.readU16();\n this.metadataReader.pos += 4 + 4 + 4 + 2 + 32 + 2 + 2;\n this.readContiguousBoxes((startPos + sampleBoxInfo.totalSize) - this.metadataReader.pos);\n }\n else {\n if (lowercaseBoxName === 'mp4a') {\n // We don't know the codec yet (might be AAC, might be MP3), need to read the esds box\n }\n else if (lowercaseBoxName === 'opus') {\n track.info.codec = 'opus';\n }\n else if (lowercaseBoxName === 'flac') {\n track.info.codec = 'flac';\n }\n else if (lowercaseBoxName === 'twos'\n || lowercaseBoxName === 'sowt'\n || lowercaseBoxName === 'raw '\n || lowercaseBoxName === 'in24'\n || lowercaseBoxName === 'in32'\n || lowercaseBoxName === 'fl32'\n || lowercaseBoxName === 'fl64'\n || lowercaseBoxName === 'lpcm'\n || lowercaseBoxName === 'ipcm' // ISO/IEC 23003-5\n || lowercaseBoxName === 'fpcm' // \"\n ) {\n // It's PCM\n // developer.apple.com/documentation/quicktime-file-format/sound_sample_descriptions/\n }\n else if (lowercaseBoxName === 'ulaw') {\n track.info.codec = 'ulaw';\n }\n else if (lowercaseBoxName === 'alaw') {\n track.info.codec = 'alaw';\n }\n else {\n console.warn(`Unsupported audio codec (sample entry type '${sampleBoxInfo.name}').`);\n }\n this.metadataReader.pos += 6 * 1 + 2;\n const version = this.metadataReader.readU16();\n this.metadataReader.pos += 3 * 2;\n let channelCount = this.metadataReader.readU16();\n let sampleSize = this.metadataReader.readU16();\n this.metadataReader.pos += 2 * 2;\n // Can't use fixed16_16 as that's signed\n let sampleRate = this.metadataReader.readU32() / 0x10000;\n if (stsdVersion === 0 && version > 0) {\n // Additional QuickTime fields\n if (version === 1) {\n this.metadataReader.pos += 4;\n sampleSize = 8 * this.metadataReader.readU32();\n this.metadataReader.pos += 2 * 4;\n }\n else if (version === 2) {\n this.metadataReader.pos += 4;\n sampleRate = this.metadataReader.readF64();\n channelCount = this.metadataReader.readU32();\n this.metadataReader.pos += 4; // Always 0x7f000000\n sampleSize = this.metadataReader.readU32();\n const flags = this.metadataReader.readU32();\n this.metadataReader.pos += 2 * 4;\n if (lowercaseBoxName === 'lpcm') {\n const bytesPerSample = (sampleSize + 7) >> 3;\n const isFloat = Boolean(flags & 1);\n const isBigEndian = Boolean(flags & 2);\n const sFlags = flags & 4 ? -1 : 0; // I guess it means \"signed flags\" or something?\n if (sampleSize > 0 && sampleSize <= 64) {\n if (isFloat) {\n if (sampleSize === 32) {\n track.info.codec = isBigEndian ? 'pcm-f32be' : 'pcm-f32';\n }\n }\n else {\n if (sFlags & (1 << (bytesPerSample - 1))) {\n if (bytesPerSample === 1) {\n track.info.codec = 'pcm-s8';\n }\n else if (bytesPerSample === 2) {\n track.info.codec = isBigEndian ? 'pcm-s16be' : 'pcm-s16';\n }\n else if (bytesPerSample === 3) {\n track.info.codec = isBigEndian ? 'pcm-s24be' : 'pcm-s24';\n }\n else if (bytesPerSample === 4) {\n track.info.codec = isBigEndian ? 'pcm-s32be' : 'pcm-s32';\n }\n }\n else {\n if (bytesPerSample === 1) {\n track.info.codec = 'pcm-u8';\n }\n }\n }\n }\n if (track.info.codec === null) {\n console.warn('Unsupported PCM format.');\n }\n }\n }\n }\n track.info.numberOfChannels = channelCount;\n track.info.sampleRate = sampleRate;\n // PCM codec assignments\n if (lowercaseBoxName === 'twos') {\n if (sampleSize === 8) {\n track.info.codec = 'pcm-s8';\n }\n else if (sampleSize === 16) {\n track.info.codec = 'pcm-s16be';\n }\n else {\n console.warn(`Unsupported sample size ${sampleSize} for codec 'twos'.`);\n track.info.codec = null;\n }\n }\n else if (lowercaseBoxName === 'sowt') {\n if (sampleSize === 8) {\n track.info.codec = 'pcm-s8';\n }\n else if (sampleSize === 16) {\n track.info.codec = 'pcm-s16';\n }\n else {\n console.warn(`Unsupported sample size ${sampleSize} for codec 'sowt'.`);\n track.info.codec = null;\n }\n }\n else if (lowercaseBoxName === 'raw ') {\n track.info.codec = 'pcm-u8';\n }\n else if (lowercaseBoxName === 'in24') {\n track.info.codec = 'pcm-s24be';\n }\n else if (lowercaseBoxName === 'in32') {\n track.info.codec = 'pcm-s32be';\n }\n else if (lowercaseBoxName === 'fl32') {\n track.info.codec = 'pcm-f32be';\n }\n else if (lowercaseBoxName === 'fl64') {\n track.info.codec = 'pcm-f64be';\n }\n else if (lowercaseBoxName === 'ipcm') {\n track.info.codec = 'pcm-s16be'; // Placeholder, will be adjusted by the pcmC box\n }\n else if (lowercaseBoxName === 'fpcm') {\n track.info.codec = 'pcm-f32be'; // Placeholder, will be adjusted by the pcmC box\n }\n this.readContiguousBoxes((startPos + sampleBoxInfo.totalSize) - this.metadataReader.pos);\n }\n }\n }\n ;\n break;\n case 'avcC':\n {\n const track = this.currentTrack;\n assert(track && track.info);\n track.info.codecDescription = this.metadataReader.readBytes(boxInfo.contentSize);\n }\n ;\n break;\n case 'hvcC':\n {\n const track = this.currentTrack;\n assert(track && track.info);\n track.info.codecDescription = this.metadataReader.readBytes(boxInfo.contentSize);\n }\n ;\n break;\n case 'vpcC':\n {\n const track = this.currentTrack;\n assert(track && track.info?.type === 'video');\n this.metadataReader.pos += 4; // Version + flags\n const profile = this.metadataReader.readU8();\n const level = this.metadataReader.readU8();\n const thirdByte = this.metadataReader.readU8();\n const bitDepth = thirdByte >> 4;\n const chromaSubsampling = (thirdByte >> 1) & 0b111;\n const videoFullRangeFlag = thirdByte & 1;\n const colourPrimaries = this.metadataReader.readU8();\n const transferCharacteristics = this.metadataReader.readU8();\n const matrixCoefficients = this.metadataReader.readU8();\n track.info.vp9CodecInfo = {\n profile,\n level,\n bitDepth,\n chromaSubsampling,\n videoFullRangeFlag,\n colourPrimaries,\n transferCharacteristics,\n matrixCoefficients,\n };\n }\n ;\n break;\n case 'av1C':\n {\n const track = this.currentTrack;\n assert(track && track.info?.type === 'video');\n this.metadataReader.pos += 1; // Marker + version\n const secondByte = this.metadataReader.readU8();\n const profile = secondByte >> 5;\n const level = secondByte & 0b11111;\n const thirdByte = this.metadataReader.readU8();\n const tier = thirdByte >> 7;\n const highBitDepth = (thirdByte >> 6) & 1;\n const twelveBit = (thirdByte >> 5) & 1;\n const monochrome = (thirdByte >> 4) & 1;\n const chromaSubsamplingX = (thirdByte >> 3) & 1;\n const chromaSubsamplingY = (thirdByte >> 2) & 1;\n const chromaSamplePosition = thirdByte & 0b11;\n // Logic from https://aomediacodec.github.io/av1-spec/av1-spec.pdf\n const bitDepth = profile == 2 && highBitDepth ? (twelveBit ? 12 : 10) : (highBitDepth ? 10 : 8);\n track.info.av1CodecInfo = {\n profile,\n level,\n tier,\n bitDepth,\n monochrome,\n chromaSubsamplingX,\n chromaSubsamplingY,\n chromaSamplePosition,\n };\n }\n ;\n break;\n case 'colr':\n {\n const track = this.currentTrack;\n assert(track && track.info?.type === 'video');\n const colourType = this.metadataReader.readAscii(4);\n if (colourType !== 'nclx') {\n break;\n }\n const colourPrimaries = this.metadataReader.readU16();\n const transferCharacteristics = this.metadataReader.readU16();\n const matrixCoefficients = this.metadataReader.readU16();\n const fullRangeFlag = Boolean(this.metadataReader.readU8() & 0x80);\n track.info.colorSpace = {\n primaries: COLOR_PRIMARIES_MAP_INVERSE[colourPrimaries],\n transfer: TRANSFER_CHARACTERISTICS_MAP_INVERSE[transferCharacteristics],\n matrix: MATRIX_COEFFICIENTS_MAP_INVERSE[matrixCoefficients],\n fullRange: fullRangeFlag,\n };\n }\n ;\n break;\n case 'wave':\n {\n this.readContiguousBoxes(boxInfo.contentSize);\n }\n ;\n break;\n case 'esds':\n {\n const track = this.currentTrack;\n assert(track && track.info?.type === 'audio');\n this.metadataReader.pos += 4; // Version + flags\n const tag = this.metadataReader.readU8();\n assert(tag === 0x03); // ES Descriptor\n this.metadataReader.readIsomVariableInteger(); // Length\n this.metadataReader.pos += 2; // ES ID\n const mixed = this.metadataReader.readU8();\n const streamDependenceFlag = (mixed & 0x80) !== 0;\n const urlFlag = (mixed & 0x40) !== 0;\n const ocrStreamFlag = (mixed & 0x20) !== 0;\n if (streamDependenceFlag) {\n this.metadataReader.pos += 2;\n }\n if (urlFlag) {\n const urlLength = this.metadataReader.readU8();\n this.metadataReader.pos += urlLength;\n }\n if (ocrStreamFlag) {\n this.metadataReader.pos += 2;\n }\n const decoderConfigTag = this.metadataReader.readU8();\n assert(decoderConfigTag === 0x04); // DecoderConfigDescriptor\n const decoderConfigDescriptorLength = this.metadataReader.readIsomVariableInteger(); // Length\n const payloadStart = this.metadataReader.pos;\n const objectTypeIndication = this.metadataReader.readU8();\n if (objectTypeIndication === 0x40 || objectTypeIndication === 0x67) {\n track.info.codec = 'aac';\n track.info.aacCodecInfo = { isMpeg2: objectTypeIndication === 0x67 };\n }\n else if (objectTypeIndication === 0x69 || objectTypeIndication === 0x6b) {\n track.info.codec = 'mp3';\n }\n else if (objectTypeIndication === 0xdd) {\n track.info.codec = 'vorbis'; // \"nonstandard, gpac uses it\" - FFmpeg\n }\n else {\n console.warn(`Unsupported audio codec (objectTypeIndication ${objectTypeIndication}) - discarding track.`);\n }\n this.metadataReader.pos += 1 + 3 + 4 + 4;\n if (decoderConfigDescriptorLength > this.metadataReader.pos - payloadStart) {\n // There's a DecoderSpecificInfo at the end, let's read it\n const decoderSpecificInfoTag = this.metadataReader.readU8();\n assert(decoderSpecificInfoTag === 0x05); // DecoderSpecificInfo\n const decoderSpecificInfoLength = this.metadataReader.readIsomVariableInteger();\n track.info.codecDescription = this.metadataReader.readBytes(decoderSpecificInfoLength);\n if (track.info.codec === 'aac') {\n // Let's try to deduce more accurate values directly from the AudioSpecificConfig:\n const audioSpecificConfig = parseAacAudioSpecificConfig(track.info.codecDescription);\n if (audioSpecificConfig.numberOfChannels !== null) {\n track.info.numberOfChannels = audioSpecificConfig.numberOfChannels;\n }\n if (audioSpecificConfig.sampleRate !== null) {\n track.info.sampleRate = audioSpecificConfig.sampleRate;\n }\n }\n }\n }\n ;\n break;\n case 'enda':\n {\n const track = this.currentTrack;\n assert(track && track.info?.type === 'audio');\n const littleEndian = this.metadataReader.readU16() & 0xff; // 0xff is from FFmpeg\n if (littleEndian) {\n if (track.info.codec === 'pcm-s16be') {\n track.info.codec = 'pcm-s16';\n }\n else if (track.info.codec === 'pcm-s24be') {\n track.info.codec = 'pcm-s24';\n }\n else if (track.info.codec === 'pcm-s32be') {\n track.info.codec = 'pcm-s32';\n }\n else if (track.info.codec === 'pcm-f32be') {\n track.info.codec = 'pcm-f32';\n }\n else if (track.info.codec === 'pcm-f64be') {\n track.info.codec = 'pcm-f64';\n }\n }\n }\n ;\n break;\n case 'pcmC':\n {\n const track = this.currentTrack;\n assert(track && track.info?.type === 'audio');\n this.metadataReader.pos += 1 + 3; // Version + flags\n // ISO/IEC 23003-5\n const formatFlags = this.metadataReader.readU8();\n const isLittleEndian = Boolean(formatFlags & 0x01);\n const pcmSampleSize = this.metadataReader.readU8();\n if (track.info.codec === 'pcm-s16be') {\n // ipcm\n if (isLittleEndian) {\n if (pcmSampleSize === 16) {\n track.info.codec = 'pcm-s16';\n }\n else if (pcmSampleSize === 24) {\n track.info.codec = 'pcm-s24';\n }\n else if (pcmSampleSize === 32) {\n track.info.codec = 'pcm-s32';\n }\n else {\n console.warn(`Invalid ipcm sample size ${pcmSampleSize}.`);\n track.info.codec = null;\n }\n }\n else {\n if (pcmSampleSize === 16) {\n track.info.codec = 'pcm-s16be';\n }\n else if (pcmSampleSize === 24) {\n track.info.codec = 'pcm-s24be';\n }\n else if (pcmSampleSize === 32) {\n track.info.codec = 'pcm-s32be';\n }\n else {\n console.warn(`Invalid ipcm sample size ${pcmSampleSize}.`);\n track.info.codec = null;\n }\n }\n }\n else if (track.info.codec === 'pcm-f32be') {\n // fpcm\n if (isLittleEndian) {\n if (pcmSampleSize === 32) {\n track.info.codec = 'pcm-f32';\n }\n else if (pcmSampleSize === 64) {\n track.info.codec = 'pcm-f64';\n }\n else {\n console.warn(`Invalid fpcm sample size ${pcmSampleSize}.`);\n track.info.codec = null;\n }\n }\n else {\n if (pcmSampleSize === 32) {\n track.info.codec = 'pcm-f32be';\n }\n else if (pcmSampleSize === 64) {\n track.info.codec = 'pcm-f64be';\n }\n else {\n console.warn(`Invalid fpcm sample size ${pcmSampleSize}.`);\n track.info.codec = null;\n }\n }\n }\n break;\n }\n ;\n case 'dOps':\n { // Used for Opus audio\n const track = this.currentTrack;\n assert(track && track.info?.type === 'audio');\n this.metadataReader.pos += 1; // Version\n // https://www.opus-codec.org/docs/opus_in_isobmff.html\n const outputChannelCount = this.metadataReader.readU8();\n const preSkip = this.metadataReader.readU16();\n const inputSampleRate = this.metadataReader.readU32();\n const outputGain = this.metadataReader.readI16();\n const channelMappingFamily = this.metadataReader.readU8();\n let channelMappingTable;\n if (channelMappingFamily !== 0) {\n channelMappingTable = this.metadataReader.readBytes(2 + outputChannelCount);\n }\n else {\n channelMappingTable = new Uint8Array(0);\n }\n // https://datatracker.ietf.org/doc/html/draft-ietf-codec-oggopus-06\n const description = new Uint8Array(8 + 1 + 1 + 2 + 4 + 2 + 1 + channelMappingTable.byteLength);\n const view = new DataView(description.buffer);\n view.setUint32(0, 0x4f707573, false); // 'Opus'\n view.setUint32(4, 0x48656164, false); // 'Head'\n view.setUint8(8, 1); // Version\n view.setUint8(9, outputChannelCount);\n view.setUint16(10, preSkip, true);\n view.setUint32(12, inputSampleRate, true);\n view.setInt16(16, outputGain, true);\n view.setUint8(18, channelMappingFamily);\n description.set(channelMappingTable, 19);\n track.info.codecDescription = description;\n track.info.numberOfChannels = outputChannelCount;\n track.info.sampleRate = inputSampleRate;\n }\n ;\n break;\n case 'dfLa':\n { // Used for FLAC audio\n const track = this.currentTrack;\n assert(track && track.info?.type === 'audio');\n this.metadataReader.pos += 4; // Version + flags\n // https://datatracker.ietf.org/doc/rfc9639/\n const BLOCK_TYPE_MASK = 0x7f;\n const LAST_METADATA_BLOCK_FLAG_MASK = 0x80;\n const startPos = this.metadataReader.pos;\n while (this.metadataReader.pos < boxEndPos) {\n const flagAndType = this.metadataReader.readU8();\n const metadataBlockLength = this.metadataReader.readU24();\n const type = flagAndType & BLOCK_TYPE_MASK;\n // It's a STREAMINFO block; let's extract the actual sample rate and channel count\n if (type === 0) {\n this.metadataReader.pos += 10;\n // Extract sample rate\n const word = this.metadataReader.readU32();\n const sampleRate = word >>> 12;\n const numberOfChannels = ((word >> 9) & 0b111) + 1;\n track.info.sampleRate = sampleRate;\n track.info.numberOfChannels = numberOfChannels;\n this.metadataReader.pos += 20;\n }\n else {\n // Simply skip ahead to the next block\n this.metadataReader.pos += metadataBlockLength;\n }\n if (flagAndType & LAST_METADATA_BLOCK_FLAG_MASK) {\n break;\n }\n }\n const endPos = this.metadataReader.pos;\n this.metadataReader.pos = startPos;\n const bytes = this.metadataReader.readBytes(endPos - startPos);\n const description = new Uint8Array(4 + bytes.byteLength);\n const view = new DataView(description.buffer);\n view.setUint32(0, 0x664c6143, false); // 'fLaC'\n description.set(bytes, 4);\n // Set the codec description to be 'fLaC' + all metadata blocks\n track.info.codecDescription = description;\n }\n ;\n break;\n case 'stts':\n {\n const track = this.currentTrack;\n assert(track);\n if (!track.sampleTable) {\n break;\n }\n this.metadataReader.pos += 4; // Version + flags\n const entryCount = this.metadataReader.readU32();\n let currentIndex = 0;\n let currentTimestamp = 0;\n for (let i = 0; i < entryCount; i++) {\n const sampleCount = this.metadataReader.readU32();\n const sampleDelta = this.metadataReader.readU32();\n track.sampleTable.sampleTimingEntries.push({\n startIndex: currentIndex,\n startDecodeTimestamp: currentTimestamp,\n count: sampleCount,\n delta: sampleDelta,\n });\n currentIndex += sampleCount;\n currentTimestamp += sampleCount * sampleDelta;\n }\n }\n ;\n break;\n case 'ctts':\n {\n const track = this.currentTrack;\n assert(track);\n if (!track.sampleTable) {\n break;\n }\n this.metadataReader.pos += 1 + 3; // Version + flags\n const entryCount = this.metadataReader.readU32();\n let sampleIndex = 0;\n for (let i = 0; i < entryCount; i++) {\n const sampleCount = this.metadataReader.readU32();\n const sampleOffset = this.metadataReader.readI32();\n track.sampleTable.sampleCompositionTimeOffsets.push({\n startIndex: sampleIndex,\n count: sampleCount,\n offset: sampleOffset,\n });\n sampleIndex += sampleCount;\n }\n }\n ;\n break;\n case 'stsz':\n {\n const track = this.currentTrack;\n assert(track);\n if (!track.sampleTable) {\n break;\n }\n this.metadataReader.pos += 4; // Version + flags\n const sampleSize = this.metadataReader.readU32();\n const sampleCount = this.metadataReader.readU32();\n if (sampleSize === 0) {\n for (let i = 0; i < sampleCount; i++) {\n const sampleSize = this.metadataReader.readU32();\n track.sampleTable.sampleSizes.push(sampleSize);\n }\n }\n else {\n track.sampleTable.sampleSizes.push(sampleSize);\n }\n }\n ;\n break;\n case 'stz2':\n {\n const track = this.currentTrack;\n assert(track);\n if (!track.sampleTable) {\n break;\n }\n this.metadataReader.pos += 4; // Version + flags\n this.metadataReader.pos += 3; // Reserved\n const fieldSize = this.metadataReader.readU8(); // in bits\n const sampleCount = this.metadataReader.readU32();\n const bytes = this.metadataReader.readBytes(Math.ceil(sampleCount * fieldSize / 8));\n const bitstream = new Bitstream(bytes);\n for (let i = 0; i < sampleCount; i++) {\n const sampleSize = bitstream.readBits(fieldSize);\n track.sampleTable.sampleSizes.push(sampleSize);\n }\n }\n ;\n break;\n case 'stss':\n {\n const track = this.currentTrack;\n assert(track);\n if (!track.sampleTable) {\n break;\n }\n this.metadataReader.pos += 4; // Version + flags\n track.sampleTable.keySampleIndices = [];\n const entryCount = this.metadataReader.readU32();\n for (let i = 0; i < entryCount; i++) {\n const sampleIndex = this.metadataReader.readU32() - 1; // Convert to 0-indexed\n track.sampleTable.keySampleIndices.push(sampleIndex);\n }\n }\n ;\n break;\n case 'stsc':\n {\n const track = this.currentTrack;\n assert(track);\n if (!track.sampleTable) {\n break;\n }\n this.metadataReader.pos += 4;\n const entryCount = this.metadataReader.readU32();\n for (let i = 0; i < entryCount; i++) {\n const startChunkIndex = this.metadataReader.readU32() - 1; // Convert to 0-indexed\n const samplesPerChunk = this.metadataReader.readU32();\n const sampleDescriptionIndex = this.metadataReader.readU32();\n track.sampleTable.sampleToChunk.push({\n startSampleIndex: -1,\n startChunkIndex,\n samplesPerChunk,\n sampleDescriptionIndex,\n });\n }\n let startSampleIndex = 0;\n for (let i = 0; i < track.sampleTable.sampleToChunk.length; i++) {\n track.sampleTable.sampleToChunk[i].startSampleIndex = startSampleIndex;\n if (i < track.sampleTable.sampleToChunk.length - 1) {\n const nextChunk = track.sampleTable.sampleToChunk[i + 1];\n const chunkCount = nextChunk.startChunkIndex\n - track.sampleTable.sampleToChunk[i].startChunkIndex;\n startSampleIndex += chunkCount * track.sampleTable.sampleToChunk[i].samplesPerChunk;\n }\n }\n }\n ;\n break;\n case 'stco':\n {\n const track = this.currentTrack;\n assert(track);\n if (!track.sampleTable) {\n break;\n }\n this.metadataReader.pos += 4; // Version + flags\n const entryCount = this.metadataReader.readU32();\n for (let i = 0; i < entryCount; i++) {\n const chunkOffset = this.metadataReader.readU32();\n track.sampleTable.chunkOffsets.push(chunkOffset);\n }\n }\n ;\n break;\n case 'co64':\n {\n const track = this.currentTrack;\n assert(track);\n if (!track.sampleTable) {\n break;\n }\n this.metadataReader.pos += 4; // Version + flags\n const entryCount = this.metadataReader.readU32();\n for (let i = 0; i < entryCount; i++) {\n const chunkOffset = this.metadataReader.readU64();\n track.sampleTable.chunkOffsets.push(chunkOffset);\n }\n }\n ;\n break;\n case 'mvex':\n {\n this.isFragmented = true;\n this.readContiguousBoxes(boxInfo.contentSize);\n }\n ;\n break;\n case 'mehd':\n {\n const version = this.metadataReader.readU8();\n this.metadataReader.pos += 3; // Flags\n const fragmentDuration = version === 1 ? this.metadataReader.readU64() : this.metadataReader.readU32();\n this.movieDurationInTimescale = fragmentDuration;\n }\n ;\n break;\n case 'trex':\n {\n this.metadataReader.pos += 4; // Version + flags\n const trackId = this.metadataReader.readU32();\n const defaultSampleDescriptionIndex = this.metadataReader.readU32();\n const defaultSampleDuration = this.metadataReader.readU32();\n const defaultSampleSize = this.metadataReader.readU32();\n const defaultSampleFlags = this.metadataReader.readU32();\n // We store these separately rather than in the tracks since the tracks may not exist yet\n this.fragmentTrackDefaults.push({\n trackId,\n defaultSampleDescriptionIndex,\n defaultSampleDuration,\n defaultSampleSize,\n defaultSampleFlags,\n });\n }\n ;\n break;\n case 'tfra':\n {\n const version = this.metadataReader.readU8();\n this.metadataReader.pos += 3; // Flags\n const trackId = this.metadataReader.readU32();\n const track = this.tracks.find(x => x.id === trackId);\n if (!track) {\n break;\n }\n track.fragmentLookupTable = [];\n const word = this.metadataReader.readU32();\n const lengthSizeOfTrafNum = (word & 0b110000) >> 4;\n const lengthSizeOfTrunNum = (word & 0b001100) >> 2;\n const lengthSizeOfSampleNum = word & 0b000011;\n const x = this.metadataReader;\n const functions = [x.readU8.bind(x), x.readU16.bind(x), x.readU24.bind(x), x.readU32.bind(x)];\n const readTrafNum = functions[lengthSizeOfTrafNum];\n const readTrunNum = functions[lengthSizeOfTrunNum];\n const readSampleNum = functions[lengthSizeOfSampleNum];\n const numberOfEntries = this.metadataReader.readU32();\n for (let i = 0; i < numberOfEntries; i++) {\n const time = version === 1 ? this.metadataReader.readU64() : this.metadataReader.readU32();\n const moofOffset = version === 1 ? this.metadataReader.readU64() : this.metadataReader.readU32();\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const trafNumber = readTrafNum();\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const trunNumber = readTrunNum();\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const sampleNumber = readSampleNum();\n track.fragmentLookupTable.push({\n timestamp: time,\n moofOffset,\n });\n }\n }\n ;\n break;\n case 'moof':\n {\n this.currentFragment = {\n moofOffset: startPos,\n moofSize: boxInfo.totalSize,\n implicitBaseDataOffset: startPos,\n trackData: new Map(),\n dataStart: Infinity,\n dataEnd: 0,\n nextFragment: null,\n isKnownToBeFirstFragment: false,\n };\n this.readContiguousBoxes(boxInfo.contentSize);\n const insertionIndex = binarySearchLessOrEqual(this.fragments, this.currentFragment.moofOffset, x => x.moofOffset);\n this.fragments.splice(insertionIndex + 1, 0, this.currentFragment);\n // Compute the byte range of the sample data in this fragment, so we can load the whole fragment at once\n for (const [, trackData] of this.currentFragment.trackData) {\n const firstSample = trackData.samples[0];\n const lastSample = last(trackData.samples);\n this.currentFragment.dataStart = Math.min(this.currentFragment.dataStart, firstSample.byteOffset);\n this.currentFragment.dataEnd = Math.max(this.currentFragment.dataEnd, lastSample.byteOffset + lastSample.byteSize);\n }\n this.currentFragment = null;\n }\n ;\n break;\n case 'traf':\n {\n assert(this.currentFragment);\n this.readContiguousBoxes(boxInfo.contentSize);\n // It is possible that there is no current track, for example when we don't care about the track\n // referenced in the track fragment header.\n if (this.currentTrack) {\n const trackData = this.currentFragment.trackData.get(this.currentTrack.id);\n if (trackData) {\n // We know there is sample data for this track in this fragment, so let's add it to the\n // track's fragments:\n const insertionIndex = binarySearchLessOrEqual(this.currentTrack.fragments, this.currentFragment.moofOffset, x => x.moofOffset);\n this.currentTrack.fragments.splice(insertionIndex + 1, 0, this.currentFragment);\n const hasKeyFrame = trackData.firstKeyFrameTimestamp !== null;\n if (hasKeyFrame) {\n const insertionIndex = binarySearchLessOrEqual(this.currentTrack.fragmentsWithKeyFrame, this.currentFragment.moofOffset, x => x.moofOffset);\n this.currentTrack.fragmentsWithKeyFrame.splice(insertionIndex + 1, 0, this.currentFragment);\n }\n const { currentFragmentState } = this.currentTrack;\n assert(currentFragmentState);\n if (currentFragmentState.startTimestamp !== null) {\n offsetFragmentTrackDataByTimestamp(trackData, currentFragmentState.startTimestamp);\n trackData.startTimestampIsFinal = true;\n }\n }\n this.currentTrack.currentFragmentState = null;\n this.currentTrack = null;\n }\n }\n ;\n break;\n case 'tfhd':\n {\n assert(this.currentFragment);\n this.metadataReader.pos += 1; // Version\n const flags = this.metadataReader.readU24();\n const baseDataOffsetPresent = Boolean(flags & 0x000001);\n const sampleDescriptionIndexPresent = Boolean(flags & 0x000002);\n const defaultSampleDurationPresent = Boolean(flags & 0x000008);\n const defaultSampleSizePresent = Boolean(flags & 0x000010);\n const defaultSampleFlagsPresent = Boolean(flags & 0x000020);\n const durationIsEmpty = Boolean(flags & 0x010000);\n const defaultBaseIsMoof = Boolean(flags & 0x020000);\n const trackId = this.metadataReader.readU32();\n const track = this.tracks.find(x => x.id === trackId);\n if (!track) {\n // We don't care about this track\n break;\n }\n const defaults = this.fragmentTrackDefaults.find(x => x.trackId === trackId);\n this.currentTrack = track;\n track.currentFragmentState = {\n baseDataOffset: this.currentFragment.implicitBaseDataOffset,\n sampleDescriptionIndex: defaults?.defaultSampleDescriptionIndex ?? null,\n defaultSampleDuration: defaults?.defaultSampleDuration ?? null,\n defaultSampleSize: defaults?.defaultSampleSize ?? null,\n defaultSampleFlags: defaults?.defaultSampleFlags ?? null,\n startTimestamp: null,\n };\n if (baseDataOffsetPresent) {\n track.currentFragmentState.baseDataOffset = this.metadataReader.readU64();\n }\n else if (defaultBaseIsMoof) {\n track.currentFragmentState.baseDataOffset = this.currentFragment.moofOffset;\n }\n if (sampleDescriptionIndexPresent) {\n track.currentFragmentState.sampleDescriptionIndex = this.metadataReader.readU32();\n }\n if (defaultSampleDurationPresent) {\n track.currentFragmentState.defaultSampleDuration = this.metadataReader.readU32();\n }\n if (defaultSampleSizePresent) {\n track.currentFragmentState.defaultSampleSize = this.metadataReader.readU32();\n }\n if (defaultSampleFlagsPresent) {\n track.currentFragmentState.defaultSampleFlags = this.metadataReader.readU32();\n }\n if (durationIsEmpty) {\n track.currentFragmentState.defaultSampleDuration = 0;\n }\n }\n ;\n break;\n case 'tfdt':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.currentFragmentState);\n // break;\n const version = this.metadataReader.readU8();\n this.metadataReader.pos += 3; // Flags\n const baseMediaDecodeTime = version === 0\n ? this.metadataReader.readU32()\n : this.metadataReader.readU64();\n track.currentFragmentState.startTimestamp = baseMediaDecodeTime;\n }\n ;\n break;\n case 'trun':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(this.currentFragment);\n assert(track.currentFragmentState);\n if (this.currentFragment.trackData.has(track.id)) {\n console.warn('Can\\'t have two trun boxes for the same track in one fragment. Ignoring...');\n break;\n }\n const version = this.metadataReader.readU8();\n const flags = this.metadataReader.readU24();\n const dataOffsetPresent = Boolean(flags & 0x000001);\n const firstSampleFlagsPresent = Boolean(flags & 0x000004);\n const sampleDurationPresent = Boolean(flags & 0x000100);\n const sampleSizePresent = Boolean(flags & 0x000200);\n const sampleFlagsPresent = Boolean(flags & 0x000400);\n const sampleCompositionTimeOffsetsPresent = Boolean(flags & 0x000800);\n const sampleCount = this.metadataReader.readU32();\n let dataOffset = track.currentFragmentState.baseDataOffset;\n if (dataOffsetPresent) {\n dataOffset += this.metadataReader.readI32();\n }\n let firstSampleFlags = null;\n if (firstSampleFlagsPresent) {\n firstSampleFlags = this.metadataReader.readU32();\n }\n let currentOffset = dataOffset;\n if (sampleCount === 0) {\n // Don't associate the fragment with the track if it has no samples, this simplifies other code\n this.currentFragment.implicitBaseDataOffset = currentOffset;\n break;\n }\n let currentTimestamp = 0;\n const trackData = {\n startTimestamp: 0,\n endTimestamp: 0,\n firstKeyFrameTimestamp: null,\n samples: [],\n presentationTimestamps: [],\n startTimestampIsFinal: false,\n };\n this.currentFragment.trackData.set(track.id, trackData);\n for (let i = 0; i < sampleCount; i++) {\n let sampleDuration;\n if (sampleDurationPresent) {\n sampleDuration = this.metadataReader.readU32();\n }\n else {\n assert(track.currentFragmentState.defaultSampleDuration !== null);\n sampleDuration = track.currentFragmentState.defaultSampleDuration;\n }\n let sampleSize;\n if (sampleSizePresent) {\n sampleSize = this.metadataReader.readU32();\n }\n else {\n assert(track.currentFragmentState.defaultSampleSize !== null);\n sampleSize = track.currentFragmentState.defaultSampleSize;\n }\n let sampleFlags;\n if (sampleFlagsPresent) {\n sampleFlags = this.metadataReader.readU32();\n }\n else {\n assert(track.currentFragmentState.defaultSampleFlags !== null);\n sampleFlags = track.currentFragmentState.defaultSampleFlags;\n }\n if (i === 0 && firstSampleFlags !== null) {\n sampleFlags = firstSampleFlags;\n }\n let sampleCompositionTimeOffset = 0;\n if (sampleCompositionTimeOffsetsPresent) {\n if (version === 0) {\n sampleCompositionTimeOffset = this.metadataReader.readU32();\n }\n else {\n sampleCompositionTimeOffset = this.metadataReader.readI32();\n }\n }\n const isKeyFrame = !(sampleFlags & 0x00010000);\n trackData.samples.push({\n presentationTimestamp: currentTimestamp + sampleCompositionTimeOffset,\n duration: sampleDuration,\n byteOffset: currentOffset,\n byteSize: sampleSize,\n isKeyFrame,\n });\n currentOffset += sampleSize;\n currentTimestamp += sampleDuration;\n }\n trackData.presentationTimestamps = trackData.samples\n .map((x, i) => ({ presentationTimestamp: x.presentationTimestamp, sampleIndex: i }))\n .sort((a, b) => a.presentationTimestamp - b.presentationTimestamp);\n for (let i = 0; i < trackData.presentationTimestamps.length; i++) {\n const currentEntry = trackData.presentationTimestamps[i];\n const currentSample = trackData.samples[currentEntry.sampleIndex];\n if (trackData.firstKeyFrameTimestamp === null && currentSample.isKeyFrame) {\n trackData.firstKeyFrameTimestamp = currentSample.presentationTimestamp;\n }\n if (i < trackData.presentationTimestamps.length - 1) {\n // Update sample durations based on presentation order\n const nextEntry = trackData.presentationTimestamps[i + 1];\n currentSample.duration = nextEntry.presentationTimestamp - currentEntry.presentationTimestamp;\n }\n }\n const firstSample = trackData.samples[trackData.presentationTimestamps[0].sampleIndex];\n const lastSample = trackData.samples[last(trackData.presentationTimestamps).sampleIndex];\n trackData.startTimestamp = firstSample.presentationTimestamp;\n trackData.endTimestamp = lastSample.presentationTimestamp + lastSample.duration;\n this.currentFragment.implicitBaseDataOffset = currentOffset;\n }\n ;\n break;\n }\n this.metadataReader.pos = boxEndPos;\n }\n}\nclass IsobmffTrackBacking {\n constructor(internalTrack) {\n this.internalTrack = internalTrack;\n this.packetToSampleIndex = new WeakMap();\n this.packetToFragmentLocation = new WeakMap();\n }\n getId() {\n return this.internalTrack.id;\n }\n getCodec() {\n throw new Error('Not implemented on base class.');\n }\n getLanguageCode() {\n return this.internalTrack.languageCode;\n }\n getTimeResolution() {\n return this.internalTrack.timescale;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n async getFirstTimestamp() {\n const firstPacket = await this.getFirstPacket({ metadataOnly: true });\n return firstPacket?.timestamp ?? 0;\n }\n async getFirstPacket(options) {\n const regularPacket = await this.fetchPacketForSampleIndex(0, options);\n if (regularPacket || !this.internalTrack.demuxer.isFragmented) {\n // If there's a non-fragmented packet, always prefer that\n return regularPacket;\n }\n return this.performFragmentedLookup(() => {\n const startFragment = this.internalTrack.demuxer.fragments[0] ?? null;\n if (startFragment?.isKnownToBeFirstFragment) {\n // Walk from the very first fragment in the file until we find one with our track in it\n let currentFragment = startFragment;\n while (currentFragment) {\n const trackData = currentFragment.trackData.get(this.internalTrack.id);\n if (trackData) {\n return {\n fragmentIndex: binarySearchExact(this.internalTrack.fragments, currentFragment.moofOffset, x => x.moofOffset),\n sampleIndex: 0,\n correctSampleFound: true,\n };\n }\n currentFragment = currentFragment.nextFragment;\n }\n }\n return {\n fragmentIndex: -1,\n sampleIndex: -1,\n correctSampleFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the lookup entries\n Infinity, options);\n }\n mapTimestampIntoTimescale(timestamp) {\n // Do a little rounding to catch cases where the result is very close to an integer. If it is, it's likely\n // that the number was originally an integer divided by the timescale. For stability, it's best\n // to return the integer in this case.\n return roundToPrecision(timestamp * this.internalTrack.timescale, 14) + this.internalTrack.editListOffset;\n }\n async getPacket(timestamp, options) {\n const timestampInTimescale = this.mapTimestampIntoTimescale(timestamp);\n const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack);\n const sampleIndex = getSampleIndexForTimestamp(sampleTable, timestampInTimescale);\n const regularPacket = await this.fetchPacketForSampleIndex(sampleIndex, options);\n if (!sampleTableIsEmpty(sampleTable) || !this.internalTrack.demuxer.isFragmented) {\n // Prefer the non-fragmented packet\n return regularPacket;\n }\n return this.performFragmentedLookup(() => this.findSampleInFragmentsForTimestamp(timestampInTimescale), timestampInTimescale, timestampInTimescale, options);\n }\n async getNextPacket(packet, options) {\n const regularSampleIndex = this.packetToSampleIndex.get(packet);\n if (regularSampleIndex !== undefined) {\n // Prefer the non-fragmented packet\n return this.fetchPacketForSampleIndex(regularSampleIndex + 1, options);\n }\n const locationInFragment = this.packetToFragmentLocation.get(packet);\n if (locationInFragment === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n const trackData = locationInFragment.fragment.trackData.get(this.internalTrack.id);\n const fragmentSample = trackData.samples[locationInFragment.sampleIndex];\n const fragmentIndex = binarySearchExact(this.internalTrack.fragments, locationInFragment.fragment.moofOffset, x => x.moofOffset);\n assert(fragmentIndex !== -1);\n return this.performFragmentedLookup(() => {\n if (locationInFragment.sampleIndex + 1 < trackData.samples.length) {\n // We can simply take the next sample in the fragment\n return {\n fragmentIndex,\n sampleIndex: locationInFragment.sampleIndex + 1,\n correctSampleFound: true,\n };\n }\n else {\n // Walk the list of fragments until we find the next fragment for this track\n let currentFragment = locationInFragment.fragment;\n while (currentFragment.nextFragment) {\n currentFragment = currentFragment.nextFragment;\n const trackData = currentFragment.trackData.get(this.internalTrack.id);\n if (trackData) {\n const fragmentIndex = binarySearchExact(this.internalTrack.fragments, currentFragment.moofOffset, x => x.moofOffset);\n assert(fragmentIndex !== -1);\n return {\n fragmentIndex,\n sampleIndex: 0,\n correctSampleFound: true,\n };\n }\n }\n return {\n fragmentIndex,\n sampleIndex: -1,\n correctSampleFound: false,\n };\n }\n }, fragmentSample.presentationTimestamp, Infinity, options);\n }\n async getKeyPacket(timestamp, options) {\n const timestampInTimescale = this.mapTimestampIntoTimescale(timestamp);\n const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack);\n const sampleIndex = getSampleIndexForTimestamp(sampleTable, timestampInTimescale);\n const keyFrameSampleIndex = sampleIndex === -1\n ? -1\n : getRelevantKeyframeIndexForSample(sampleTable, sampleIndex);\n const regularPacket = await this.fetchPacketForSampleIndex(keyFrameSampleIndex, options);\n if (!sampleTableIsEmpty(sampleTable) || !this.internalTrack.demuxer.isFragmented) {\n // Prefer the non-fragmented packet\n return regularPacket;\n }\n return this.performFragmentedLookup(() => this.findKeySampleInFragmentsForTimestamp(timestampInTimescale), timestampInTimescale, timestampInTimescale, options);\n }\n async getNextKeyPacket(packet, options) {\n const regularSampleIndex = this.packetToSampleIndex.get(packet);\n if (regularSampleIndex !== undefined) {\n // Prefer the non-fragmented packet\n const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack);\n const nextKeyFrameSampleIndex = getNextKeyframeIndexForSample(sampleTable, regularSampleIndex);\n return this.fetchPacketForSampleIndex(nextKeyFrameSampleIndex, options);\n }\n const locationInFragment = this.packetToFragmentLocation.get(packet);\n if (locationInFragment === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n const trackData = locationInFragment.fragment.trackData.get(this.internalTrack.id);\n const fragmentSample = trackData.samples[locationInFragment.sampleIndex];\n const fragmentIndex = binarySearchExact(this.internalTrack.fragments, locationInFragment.fragment.moofOffset, x => x.moofOffset);\n assert(fragmentIndex !== -1);\n return this.performFragmentedLookup(() => {\n const nextKeyFrameIndex = trackData.samples.findIndex((x, i) => x.isKeyFrame && i > locationInFragment.sampleIndex);\n if (nextKeyFrameIndex !== -1) {\n // We can simply take the next key frame in the fragment\n return {\n fragmentIndex,\n sampleIndex: nextKeyFrameIndex,\n correctSampleFound: true,\n };\n }\n else {\n // Walk the list of fragments until we find the next fragment for this track with a key frame\n let currentFragment = locationInFragment.fragment;\n while (currentFragment.nextFragment) {\n currentFragment = currentFragment.nextFragment;\n const trackData = currentFragment.trackData.get(this.internalTrack.id);\n if (trackData && trackData.firstKeyFrameTimestamp !== null) {\n const fragmentIndex = binarySearchExact(this.internalTrack.fragments, currentFragment.moofOffset, x => x.moofOffset);\n assert(fragmentIndex !== -1);\n const keyFrameIndex = trackData.samples.findIndex(x => x.isKeyFrame);\n assert(keyFrameIndex !== -1); // There must be one\n return {\n fragmentIndex,\n sampleIndex: keyFrameIndex,\n correctSampleFound: true,\n };\n }\n }\n return {\n fragmentIndex,\n sampleIndex: -1,\n correctSampleFound: false,\n };\n }\n }, fragmentSample.presentationTimestamp, Infinity, options);\n }\n async fetchPacketForSampleIndex(sampleIndex, options) {\n if (sampleIndex === -1) {\n return null;\n }\n const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack);\n const sampleInfo = getSampleInfo(sampleTable, sampleIndex);\n if (!sampleInfo) {\n return null;\n }\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n // Load the entire chunk\n await this.internalTrack.demuxer.chunkReader.reader.loadRange(sampleInfo.chunkOffset, sampleInfo.chunkOffset + sampleInfo.chunkSize);\n this.internalTrack.demuxer.chunkReader.pos = sampleInfo.sampleOffset;\n data = this.internalTrack.demuxer.chunkReader.readBytes(sampleInfo.sampleSize);\n }\n const timestamp = (sampleInfo.presentationTimestamp - this.internalTrack.editListOffset)\n / this.internalTrack.timescale;\n const duration = sampleInfo.duration / this.internalTrack.timescale;\n const packet = new EncodedPacket(data, sampleInfo.isKeyFrame ? 'key' : 'delta', timestamp, duration, sampleIndex, sampleInfo.sampleSize);\n this.packetToSampleIndex.set(packet, sampleIndex);\n return packet;\n }\n async fetchPacketInFragment(fragment, sampleIndex, options) {\n if (sampleIndex === -1) {\n return null;\n }\n const trackData = fragment.trackData.get(this.internalTrack.id);\n const fragmentSample = trackData.samples[sampleIndex];\n assert(fragmentSample);\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n // Load the entire fragment\n await this.internalTrack.demuxer.chunkReader.reader.loadRange(fragment.dataStart, fragment.dataEnd);\n this.internalTrack.demuxer.chunkReader.pos = fragmentSample.byteOffset;\n data = this.internalTrack.demuxer.chunkReader.readBytes(fragmentSample.byteSize);\n }\n const timestamp = (fragmentSample.presentationTimestamp - this.internalTrack.editListOffset)\n / this.internalTrack.timescale;\n const duration = fragmentSample.duration / this.internalTrack.timescale;\n const packet = new EncodedPacket(data, fragmentSample.isKeyFrame ? 'key' : 'delta', timestamp, duration, fragment.moofOffset + sampleIndex, fragmentSample.byteSize);\n this.packetToFragmentLocation.set(packet, { fragment, sampleIndex });\n return packet;\n }\n findSampleInFragmentsForTimestamp(timestampInTimescale) {\n const fragmentIndex = binarySearchLessOrEqual(\n // This array is technically not sorted by start timestamp, but for any reasonable file, it basically is.\n this.internalTrack.fragments, timestampInTimescale, x => x.trackData.get(this.internalTrack.id).startTimestamp);\n let sampleIndex = -1;\n let correctSampleFound = false;\n if (fragmentIndex !== -1) {\n const fragment = this.internalTrack.fragments[fragmentIndex];\n const trackData = fragment.trackData.get(this.internalTrack.id);\n const index = binarySearchLessOrEqual(trackData.presentationTimestamps, timestampInTimescale, x => x.presentationTimestamp);\n assert(index !== -1);\n sampleIndex = trackData.presentationTimestamps[index].sampleIndex;\n correctSampleFound = timestampInTimescale < trackData.endTimestamp;\n }\n return { fragmentIndex, sampleIndex, correctSampleFound };\n }\n findKeySampleInFragmentsForTimestamp(timestampInTimescale) {\n const indexInKeyFrameFragments = binarySearchLessOrEqual(\n // This array is technically not sorted by start timestamp, but for any reasonable file, it basically is.\n this.internalTrack.fragmentsWithKeyFrame, timestampInTimescale, x => x.trackData.get(this.internalTrack.id).startTimestamp);\n let fragmentIndex = -1;\n let sampleIndex = -1;\n let correctSampleFound = false;\n if (indexInKeyFrameFragments !== -1) {\n const fragment = this.internalTrack.fragmentsWithKeyFrame[indexInKeyFrameFragments];\n // Now, let's find the actual index of the fragment in the list of ALL fragments, not just key frame ones\n fragmentIndex = binarySearchExact(this.internalTrack.fragments, fragment.moofOffset, x => x.moofOffset);\n assert(fragmentIndex !== -1);\n const trackData = fragment.trackData.get(this.internalTrack.id);\n const index = findLastIndex(trackData.presentationTimestamps, (x) => {\n const sample = trackData.samples[x.sampleIndex];\n return sample.isKeyFrame && x.presentationTimestamp <= timestampInTimescale;\n });\n assert(index !== -1); // It's a key frame fragment, so there must be a key frame\n const entry = trackData.presentationTimestamps[index];\n sampleIndex = entry.sampleIndex;\n correctSampleFound = timestampInTimescale < trackData.endTimestamp;\n }\n return { fragmentIndex, sampleIndex, correctSampleFound };\n }\n /** Looks for a packet in the fragments while trying to load as few fragments as possible to retrieve it. */\n async performFragmentedLookup(getBestMatch, searchTimestamp, latestTimestamp, options) {\n const demuxer = this.internalTrack.demuxer;\n const release = await demuxer.fragmentLookupMutex.acquire(); // The algorithm requires exclusivity\n try {\n const { fragmentIndex, sampleIndex, correctSampleFound } = getBestMatch();\n if (correctSampleFound) {\n // The correct sample already exists, easy path.\n const fragment = this.internalTrack.fragments[fragmentIndex];\n return this.fetchPacketInFragment(fragment, sampleIndex, options);\n }\n const metadataReader = demuxer.metadataReader;\n const sourceSize = await metadataReader.reader.source.getSize();\n let prevFragment = null;\n let bestFragmentIndex = fragmentIndex;\n let bestSampleIndex = sampleIndex;\n // Search for a lookup entry; this way, we won't need to start searching from the start of the file\n // but can jump right into the correct fragment (or at least nearby).\n const lookupEntryIndex = this.internalTrack.fragmentLookupTable\n ? binarySearchLessOrEqual(this.internalTrack.fragmentLookupTable, searchTimestamp, x => x.timestamp)\n : -1;\n const lookupEntry = lookupEntryIndex !== -1\n ? this.internalTrack.fragmentLookupTable[lookupEntryIndex]\n : null;\n let nextFragmentIsFirstFragment = false;\n if (fragmentIndex === -1) {\n metadataReader.pos = lookupEntry?.moofOffset ?? 0;\n nextFragmentIsFirstFragment = metadataReader.pos === 0;\n }\n else {\n const fragment = this.internalTrack.fragments[fragmentIndex];\n if (!lookupEntry || fragment.moofOffset >= lookupEntry.moofOffset) {\n metadataReader.pos = fragment.moofOffset + fragment.moofSize;\n prevFragment = fragment;\n }\n else {\n // Use the lookup entry\n metadataReader.pos = lookupEntry.moofOffset;\n }\n }\n while (metadataReader.pos < sourceSize) {\n if (prevFragment) {\n const trackData = prevFragment.trackData.get(this.internalTrack.id);\n if (trackData && trackData.startTimestamp > latestTimestamp) {\n // We're already past the upper bound, no need to keep searching\n break;\n }\n if (prevFragment.nextFragment) {\n // Skip ahead quickly without needing to read the file again\n metadataReader.pos = prevFragment.nextFragment.moofOffset + prevFragment.nextFragment.moofSize;\n prevFragment = prevFragment.nextFragment;\n continue;\n }\n }\n // Load the header\n await metadataReader.reader.loadRange(metadataReader.pos, metadataReader.pos + MAX_BOX_HEADER_SIZE);\n const startPos = metadataReader.pos;\n const boxInfo = metadataReader.readBoxHeader();\n if (boxInfo.name === 'moof') {\n const index = binarySearchExact(demuxer.fragments, startPos, x => x.moofOffset);\n let fragment;\n if (index === -1) {\n // This is the first time we've seen this fragment\n metadataReader.pos = startPos;\n fragment = await demuxer.readFragment();\n }\n else {\n // We already know this fragment\n fragment = demuxer.fragments[index];\n }\n // Even if we already know the fragment, we might not yet know its predecessor, so always do this\n if (prevFragment)\n prevFragment.nextFragment = fragment;\n prevFragment = fragment;\n if (nextFragmentIsFirstFragment) {\n fragment.isKnownToBeFirstFragment = true;\n nextFragmentIsFirstFragment = false;\n }\n const { fragmentIndex, sampleIndex, correctSampleFound } = getBestMatch();\n if (correctSampleFound) {\n const fragment = this.internalTrack.fragments[fragmentIndex];\n return this.fetchPacketInFragment(fragment, sampleIndex, options);\n }\n if (fragmentIndex !== -1) {\n bestFragmentIndex = fragmentIndex;\n bestSampleIndex = sampleIndex;\n }\n }\n metadataReader.pos = startPos + boxInfo.totalSize;\n }\n let result = null;\n const bestFragment = bestFragmentIndex !== -1 ? this.internalTrack.fragments[bestFragmentIndex] : null;\n if (bestFragment) {\n // If we finished looping but didn't find a perfect match, still return the best match we found\n result = await this.fetchPacketInFragment(bestFragment, bestSampleIndex, options);\n }\n // Catch faulty lookup table entries\n if (!result && lookupEntry && (!bestFragment || bestFragment.moofOffset < lookupEntry.moofOffset)) {\n // The lookup table entry lied to us! We found a lookup entry but no fragment there that satisfied\n // the match. In this case, let's search again but using the lookup entry before that.\n const previousLookupEntry = this.internalTrack.fragmentLookupTable[lookupEntryIndex - 1];\n const newSearchTimestamp = previousLookupEntry?.timestamp ?? -Infinity;\n return this.performFragmentedLookup(getBestMatch, newSearchTimestamp, latestTimestamp, options);\n }\n return result;\n }\n finally {\n release();\n }\n }\n}\nclass IsobmffVideoTrackBacking extends IsobmffTrackBacking {\n constructor(internalTrack) {\n super(internalTrack);\n this.decoderConfigPromise = null;\n this.internalTrack = internalTrack;\n }\n getCodec() {\n return this.internalTrack.info.codec;\n }\n getCodedWidth() {\n return this.internalTrack.info.width;\n }\n getCodedHeight() {\n return this.internalTrack.info.height;\n }\n getRotation() {\n return this.internalTrack.rotation;\n }\n async getColorSpace() {\n return {\n primaries: this.internalTrack.info.colorSpace?.primaries,\n transfer: this.internalTrack.info.colorSpace?.transfer,\n matrix: this.internalTrack.info.colorSpace?.matrix,\n fullRange: this.internalTrack.info.colorSpace?.fullRange,\n };\n }\n async getDecoderConfig() {\n if (!this.internalTrack.info.codec) {\n return null;\n }\n return this.decoderConfigPromise ??= (async () => {\n if (this.internalTrack.info.codec === 'vp9' && !this.internalTrack.info.vp9CodecInfo) {\n const firstPacket = await this.getFirstPacket({});\n this.internalTrack.info.vp9CodecInfo = firstPacket && extractVp9CodecInfoFromPacket(firstPacket.data);\n }\n else if (this.internalTrack.info.codec === 'av1' && !this.internalTrack.info.av1CodecInfo) {\n const firstPacket = await this.getFirstPacket({});\n this.internalTrack.info.av1CodecInfo = firstPacket && extractAv1CodecInfoFromPacket(firstPacket.data);\n }\n return {\n codec: extractVideoCodecString(this.internalTrack.info),\n codedWidth: this.internalTrack.info.width,\n codedHeight: this.internalTrack.info.height,\n description: this.internalTrack.info.codecDescription ?? undefined,\n colorSpace: this.internalTrack.info.colorSpace ?? undefined,\n };\n })();\n }\n}\nclass IsobmffAudioTrackBacking extends IsobmffTrackBacking {\n constructor(internalTrack) {\n super(internalTrack);\n this.decoderConfig = null;\n this.internalTrack = internalTrack;\n }\n getCodec() {\n return this.internalTrack.info.codec;\n }\n getNumberOfChannels() {\n return this.internalTrack.info.numberOfChannels;\n }\n getSampleRate() {\n return this.internalTrack.info.sampleRate;\n }\n async getDecoderConfig() {\n if (!this.internalTrack.info.codec) {\n return null;\n }\n return this.decoderConfig ??= {\n codec: extractAudioCodecString(this.internalTrack.info),\n numberOfChannels: this.internalTrack.info.numberOfChannels,\n sampleRate: this.internalTrack.info.sampleRate,\n description: this.internalTrack.info.codecDescription ?? undefined,\n };\n }\n}\nconst getSampleIndexForTimestamp = (sampleTable, timescaleUnits) => {\n if (sampleTable.presentationTimestamps) {\n const index = binarySearchLessOrEqual(sampleTable.presentationTimestamps, timescaleUnits, x => x.presentationTimestamp);\n if (index === -1) {\n return -1;\n }\n return sampleTable.presentationTimestamps[index].sampleIndex;\n }\n else {\n const index = binarySearchLessOrEqual(sampleTable.sampleTimingEntries, timescaleUnits, x => x.startDecodeTimestamp);\n if (index === -1) {\n return -1;\n }\n const entry = sampleTable.sampleTimingEntries[index];\n return entry.startIndex\n + Math.min(Math.floor((timescaleUnits - entry.startDecodeTimestamp) / entry.delta), entry.count - 1);\n }\n};\nconst getSampleInfo = (sampleTable, sampleIndex) => {\n const timingEntryIndex = binarySearchLessOrEqual(sampleTable.sampleTimingEntries, sampleIndex, x => x.startIndex);\n const timingEntry = sampleTable.sampleTimingEntries[timingEntryIndex];\n if (!timingEntry || timingEntry.startIndex + timingEntry.count <= sampleIndex) {\n return null;\n }\n const decodeTimestamp = timingEntry.startDecodeTimestamp\n + (sampleIndex - timingEntry.startIndex) * timingEntry.delta;\n let presentationTimestamp = decodeTimestamp;\n const offsetEntryIndex = binarySearchLessOrEqual(sampleTable.sampleCompositionTimeOffsets, sampleIndex, x => x.startIndex);\n const offsetEntry = sampleTable.sampleCompositionTimeOffsets[offsetEntryIndex];\n if (offsetEntry && sampleIndex - offsetEntry.startIndex < offsetEntry.count) {\n presentationTimestamp += offsetEntry.offset;\n }\n const sampleSize = sampleTable.sampleSizes[Math.min(sampleIndex, sampleTable.sampleSizes.length - 1)];\n const chunkEntryIndex = binarySearchLessOrEqual(sampleTable.sampleToChunk, sampleIndex, x => x.startSampleIndex);\n const chunkEntry = sampleTable.sampleToChunk[chunkEntryIndex];\n assert(chunkEntry);\n const chunkIndex = chunkEntry.startChunkIndex\n + Math.floor((sampleIndex - chunkEntry.startSampleIndex) / chunkEntry.samplesPerChunk);\n const chunkOffset = sampleTable.chunkOffsets[chunkIndex];\n const startSampleIndexOfChunk = chunkEntry.startSampleIndex\n + (chunkIndex - chunkEntry.startChunkIndex) * chunkEntry.samplesPerChunk;\n let chunkSize = 0;\n let sampleOffset = chunkOffset;\n if (sampleTable.sampleSizes.length === 1) {\n sampleOffset += sampleSize * (sampleIndex - startSampleIndexOfChunk);\n chunkSize += sampleSize * chunkEntry.samplesPerChunk;\n }\n else {\n for (let i = startSampleIndexOfChunk; i < startSampleIndexOfChunk + chunkEntry.samplesPerChunk; i++) {\n const sampleSize = sampleTable.sampleSizes[i];\n if (i < sampleIndex) {\n sampleOffset += sampleSize;\n }\n chunkSize += sampleSize;\n }\n }\n let duration = timingEntry.delta;\n if (sampleTable.presentationTimestamps) {\n // In order to accurately compute the duration, we need to take the duration to the next sample in presentation\n // order, not in decode order\n const presentationIndex = sampleTable.presentationTimestampIndexMap[sampleIndex];\n assert(presentationIndex !== undefined);\n if (presentationIndex < sampleTable.presentationTimestamps.length - 1) {\n const nextEntry = sampleTable.presentationTimestamps[presentationIndex + 1];\n const nextPresentationTimestamp = nextEntry.presentationTimestamp;\n duration = nextPresentationTimestamp - presentationTimestamp;\n }\n }\n return {\n presentationTimestamp,\n duration,\n sampleOffset,\n sampleSize,\n chunkOffset,\n chunkSize,\n isKeyFrame: sampleTable.keySampleIndices\n ? binarySearchExact(sampleTable.keySampleIndices, sampleIndex, x => x) !== -1\n : true,\n };\n};\nconst getRelevantKeyframeIndexForSample = (sampleTable, sampleIndex) => {\n if (!sampleTable.keySampleIndices) {\n return sampleIndex;\n }\n const index = binarySearchLessOrEqual(sampleTable.keySampleIndices, sampleIndex, x => x);\n return sampleTable.keySampleIndices[index] ?? -1;\n};\nconst getNextKeyframeIndexForSample = (sampleTable, sampleIndex) => {\n if (!sampleTable.keySampleIndices) {\n return sampleIndex + 1;\n }\n const index = binarySearchLessOrEqual(sampleTable.keySampleIndices, sampleIndex, x => x);\n return sampleTable.keySampleIndices[index + 1] ?? -1;\n};\nconst offsetFragmentTrackDataByTimestamp = (trackData, timestamp) => {\n trackData.startTimestamp += timestamp;\n trackData.endTimestamp += timestamp;\n for (const sample of trackData.samples) {\n sample.presentationTimestamp += timestamp;\n }\n for (const entry of trackData.presentationTimestamps) {\n entry.presentationTimestamp += timestamp;\n }\n};\n/** Extracts the rotation component from a transformation matrix, in degrees. */\nconst extractRotationFromMatrix = (matrix) => {\n const [m11, , , m21] = matrix;\n const scaleX = Math.hypot(m11, m21);\n const cosTheta = m11 / scaleX;\n const sinTheta = m21 / scaleX;\n // Invert the rotation because matrices are post-multiplied in ISOBMFF\n return -Math.atan2(sinTheta, cosTheta) * (180 / Math.PI);\n};\nconst sampleTableIsEmpty = (sampleTable) => {\n return sampleTable.sampleSizes.length === 0;\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { extractAv1CodecInfoFromPacket, extractAvcDecoderConfigurationRecord, extractHevcDecoderConfigurationRecord, extractVp9CodecInfoFromPacket, } from '../codec-data.js';\nimport { extractAudioCodecString, extractVideoCodecString, } from '../codec.js';\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack, InputVideoTrack, } from '../input-track.js';\nimport { assert, AsyncMutex, binarySearchExact, binarySearchLessOrEqual, COLOR_PRIMARIES_MAP_INVERSE, findLastIndex, isIso639Dash2LanguageCode, last, MATRIX_COEFFICIENTS_MAP_INVERSE, normalizeRotation, roundToPrecision, TRANSFER_CHARACTERISTICS_MAP_INVERSE, UNDETERMINED_LANGUAGE, } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { Reader } from '../reader.js';\nimport { assertDefinedSize, CODEC_STRING_MAP, EBMLId, EBMLReader, LEVEL_0_AND_1_EBML_IDS, MAX_HEADER_SIZE, MIN_HEADER_SIZE, } from './ebml.js';\nimport { buildMatroskaMimeType } from './matroska-misc.js';\nconst METADATA_ELEMENTS = [\n { id: EBMLId.SeekHead, flag: 'seekHeadSeen' },\n { id: EBMLId.Info, flag: 'infoSeen' },\n { id: EBMLId.Tracks, flag: 'tracksSeen' },\n { id: EBMLId.Cues, flag: 'cuesSeen' },\n];\nexport class MatroskaDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.readMetadataPromise = null;\n this.segments = [];\n this.currentSegment = null;\n this.currentTrack = null;\n this.currentCluster = null;\n this.currentBlock = null;\n this.currentCueTime = null;\n this.isWebM = false;\n this.metadataReader = new EBMLReader(input._mainReader);\n // Max 64 MiB of stored clusters\n this.clusterReader = new EBMLReader(new Reader(input.source, 64 * 2 ** 20));\n }\n async computeDuration() {\n const tracks = await this.getTracks();\n const trackDurations = await Promise.all(tracks.map(x => x.computeDuration()));\n return Math.max(0, ...trackDurations);\n }\n async getTracks() {\n await this.readMetadata();\n return this.segments.flatMap(segment => segment.tracks.map(track => track.inputTrack));\n }\n async getMimeType() {\n await this.readMetadata();\n const tracks = await this.getTracks();\n const codecStrings = await Promise.all(tracks.map(x => x.getCodecParameterString()));\n return buildMatroskaMimeType({\n isWebM: this.isWebM,\n hasVideo: this.segments.some(segment => segment.tracks.some(x => x.info?.type === 'video')),\n hasAudio: this.segments.some(segment => segment.tracks.some(x => x.info?.type === 'audio')),\n codecStrings: codecStrings.filter(Boolean),\n });\n }\n readMetadata() {\n return this.readMetadataPromise ??= (async () => {\n this.metadataReader.pos = 0;\n const fileSize = await this.input.source.getSize();\n // Loop over all top-level elements in the file\n while (this.metadataReader.pos <= fileSize - MIN_HEADER_SIZE) {\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + MAX_HEADER_SIZE);\n const header = this.metadataReader.readElementHeader();\n const id = header.id;\n let size = header.size;\n const startPos = this.metadataReader.pos;\n if (id === EBMLId.EBML) {\n assertDefinedSize(size);\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + size);\n this.readContiguousElements(this.metadataReader, size);\n }\n else if (id === EBMLId.Segment) { // Segment found!\n await this.readSegment(size);\n if (size === null) {\n // Segment sizes can be undefined (common in livestreamed files), so assume this is the last\n // and only segment\n break;\n }\n }\n else if (id === EBMLId.Cluster) {\n // Clusters are not a top-level element in Matroska, but some files contain a Segment whose size\n // doesn't contain any of the clusters that follow it. In the case, we apply the following logic: if\n // we find a top-level cluster, attribute it to the previous segment.\n if (size === null) {\n // Just in case this is one of those weird sizeless clusters, let's do our best and still try to\n // determine its size.\n const nextElementPos = await this.clusterReader.searchForNextElementId(LEVEL_0_AND_1_EBML_IDS, fileSize);\n size = (nextElementPos ?? fileSize) - startPos;\n }\n const lastSegment = last(this.segments);\n if (lastSegment) {\n // Extend the previous segment's size\n lastSegment.elementEndPos = startPos + size;\n }\n }\n assertDefinedSize(size);\n this.metadataReader.pos = startPos + size;\n }\n })();\n }\n async readSegment(dataSize) {\n const segmentDataStart = this.metadataReader.pos;\n this.currentSegment = {\n seekHeadSeen: false,\n infoSeen: false,\n tracksSeen: false,\n cuesSeen: false,\n timestampScale: -1,\n timestampFactor: -1,\n duration: -1,\n seekEntries: [],\n tracks: [],\n cuePoints: [],\n dataStartPos: segmentDataStart,\n elementEndPos: dataSize === null\n ? await this.input.source.getSize() // Assume it goes until the end of the file\n : segmentDataStart + dataSize,\n clusterSeekStartPos: segmentDataStart,\n clusters: [],\n clusterLookupMutex: new AsyncMutex(),\n };\n this.segments.push(this.currentSegment);\n // Let's load a good amount of data, enough for all segment metadata to likely fit into (minus cues)\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + 2 ** 14);\n let clusterEncountered = false;\n while (this.metadataReader.pos < this.currentSegment.elementEndPos) {\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + MAX_HEADER_SIZE);\n const elementStartPos = this.metadataReader.pos;\n const { id, size } = this.metadataReader.readElementHeader();\n const dataStartPos = this.metadataReader.pos;\n const metadataElementIndex = METADATA_ELEMENTS.findIndex(x => x.id === id);\n if (metadataElementIndex !== -1) {\n const field = METADATA_ELEMENTS[metadataElementIndex].flag;\n this.currentSegment[field] = true;\n assertDefinedSize(size);\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + size);\n this.readContiguousElements(this.metadataReader, size);\n }\n else if (id === EBMLId.Cluster) {\n if (!clusterEncountered) {\n clusterEncountered = true;\n this.currentSegment.clusterSeekStartPos = elementStartPos;\n }\n }\n if (this.currentSegment.infoSeen && this.currentSegment.tracksSeen && this.currentSegment.cuesSeen) {\n // No need to search anymore, we have everything\n break;\n }\n if (this.currentSegment.seekHeadSeen) {\n let hasInfo = this.currentSegment.infoSeen;\n let hasTracks = this.currentSegment.tracksSeen;\n let hasCues = this.currentSegment.cuesSeen;\n for (const entry of this.currentSegment.seekEntries) {\n if (entry.id === EBMLId.Info) {\n hasInfo = true;\n }\n else if (entry.id === EBMLId.Tracks) {\n hasTracks = true;\n }\n else if (entry.id === EBMLId.Cues) {\n hasCues = true;\n }\n }\n if (hasInfo && hasTracks && hasCues) {\n // No need to search sequentially anymore, we can use the seek head\n break;\n }\n }\n if (size === null) {\n break;\n }\n this.metadataReader.pos = dataStartPos + size;\n if (!clusterEncountered) {\n this.currentSegment.clusterSeekStartPos = this.metadataReader.pos;\n }\n }\n // Use the seek head to read missing metadata elements\n for (const target of METADATA_ELEMENTS) {\n if (this.currentSegment[target.flag])\n continue;\n const seekEntry = this.currentSegment.seekEntries.find(entry => entry.id === target.id);\n if (!seekEntry)\n continue;\n this.metadataReader.pos = segmentDataStart + seekEntry.segmentPosition;\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + 2 ** 12);\n const { id, size } = this.metadataReader.readElementHeader();\n if (id !== target.id)\n continue;\n assertDefinedSize(size);\n this.currentSegment[target.flag] = true;\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + size);\n this.readContiguousElements(this.metadataReader, size);\n }\n if (this.currentSegment.timestampScale === -1) {\n // TimestampScale element is missing. Technically an invalid file, but let's default to the typical value,\n // which is 1e6.\n this.currentSegment.timestampScale = 1e6;\n this.currentSegment.timestampFactor = 1e9 / 1e6;\n }\n // Put default tracks first\n this.currentSegment.tracks.sort((a, b) => Number(b.isDefault) - Number(a.isDefault));\n // Sort cue points by cluster position (required for the next algorithm)\n this.currentSegment.cuePoints.sort((a, b) => a.clusterPosition - b.clusterPosition);\n // Now, let's distribute the cue points to each track. Ideally, each track has their own cue point, but some\n // Matroska files may only specify cue points for a single track. In this case, we still wanna use those cue\n // points for all tracks.\n const allTrackIds = this.currentSegment.tracks.map(x => x.id);\n const remainingTrackIds = new Set();\n let lastClusterPosition = null;\n let lastCuePoint = null;\n for (const cuePoint of this.currentSegment.cuePoints) {\n if (cuePoint.clusterPosition !== lastClusterPosition) {\n for (const id of remainingTrackIds) {\n // These tracks didn't receive a cue point for the last cluster, so let's give them one\n assert(lastCuePoint);\n const track = this.currentSegment.tracks.find(x => x.id === id);\n track.cuePoints.push(lastCuePoint);\n }\n for (const id of allTrackIds) {\n remainingTrackIds.add(id);\n }\n }\n lastCuePoint = cuePoint;\n if (!remainingTrackIds.has(cuePoint.trackId)) {\n continue;\n }\n const track = this.currentSegment.tracks.find(x => x.id === cuePoint.trackId);\n track.cuePoints.push(cuePoint);\n remainingTrackIds.delete(cuePoint.trackId);\n lastClusterPosition = cuePoint.clusterPosition;\n }\n for (const id of remainingTrackIds) {\n assert(lastCuePoint);\n const track = this.currentSegment.tracks.find(x => x.id === id);\n track.cuePoints.push(lastCuePoint);\n }\n for (const track of this.currentSegment.tracks) {\n // Sort cue points by time\n track.cuePoints.sort((a, b) => a.time - b.time);\n }\n this.currentSegment = null;\n }\n async readCluster(segment) {\n await this.metadataReader.reader.loadRange(this.metadataReader.pos, this.metadataReader.pos + MAX_HEADER_SIZE);\n const elementStartPos = this.metadataReader.pos;\n const elementHeader = this.metadataReader.readElementHeader();\n const id = elementHeader.id;\n let size = elementHeader.size;\n const dataStartPos = this.metadataReader.pos;\n if (size === null) {\n // The cluster's size is undefined (can happen in livestreamed files). We'd still like to know the size of\n // it, so we have no other choice but to iterate over the EBML structure until we find an element at level\n // 0 or 1, indicating the end of the cluster (all elements inside the cluster are at level 2).\n this.clusterReader.pos = dataStartPos;\n const nextElementPos = await this.clusterReader.searchForNextElementId(LEVEL_0_AND_1_EBML_IDS, segment.elementEndPos);\n size = (nextElementPos ?? segment.elementEndPos) - dataStartPos;\n }\n assert(id === EBMLId.Cluster);\n // Load the entire cluster\n this.clusterReader.pos = dataStartPos;\n await this.clusterReader.reader.loadRange(this.clusterReader.pos, this.clusterReader.pos + size);\n const cluster = {\n elementStartPos,\n elementEndPos: dataStartPos + size,\n dataStartPos,\n timestamp: -1,\n trackData: new Map(),\n nextCluster: null,\n isKnownToBeFirstCluster: false,\n };\n this.currentCluster = cluster;\n this.readContiguousElements(this.clusterReader, size);\n for (const [trackId, trackData] of cluster.trackData) {\n let blockReferencesExist = false;\n // This must hold, as track datas only get created if a block for that track is encountered\n assert(trackData.blocks.length > 0);\n for (let i = 0; i < trackData.blocks.length; i++) {\n const block = trackData.blocks[i];\n block.timestamp += cluster.timestamp;\n blockReferencesExist ||= block.referencedTimestamps.length > 0;\n }\n if (blockReferencesExist) {\n trackData.blocks = sortBlocksByReferences(trackData.blocks);\n }\n trackData.presentationTimestamps = trackData.blocks\n .map((block, i) => ({ timestamp: block.timestamp, blockIndex: i }))\n .sort((a, b) => a.timestamp - b.timestamp);\n for (let i = 0; i < trackData.presentationTimestamps.length; i++) {\n const currentEntry = trackData.presentationTimestamps[i];\n const currentBlock = trackData.blocks[currentEntry.blockIndex];\n if (trackData.firstKeyFrameTimestamp === null && currentBlock.isKeyFrame) {\n trackData.firstKeyFrameTimestamp = currentBlock.timestamp;\n }\n if (i < trackData.presentationTimestamps.length - 1) {\n // Update block durations based on presentation order\n const nextEntry = trackData.presentationTimestamps[i + 1];\n currentBlock.duration = nextEntry.timestamp - currentBlock.timestamp;\n }\n }\n const firstBlock = trackData.blocks[trackData.presentationTimestamps[0].blockIndex];\n const lastBlock = trackData.blocks[last(trackData.presentationTimestamps).blockIndex];\n trackData.startTimestamp = firstBlock.timestamp;\n trackData.endTimestamp = lastBlock.timestamp + lastBlock.duration;\n const track = segment.tracks.find(x => x.id === trackId);\n if (track) {\n const insertionIndex = binarySearchLessOrEqual(track.clusters, cluster.elementStartPos, x => x.elementStartPos);\n track.clusters.splice(insertionIndex + 1, 0, cluster);\n const hasKeyFrame = trackData.firstKeyFrameTimestamp !== null;\n if (hasKeyFrame) {\n const insertionIndex = binarySearchLessOrEqual(track.clustersWithKeyFrame, cluster.elementStartPos, x => x.elementStartPos);\n track.clustersWithKeyFrame.splice(insertionIndex + 1, 0, cluster);\n }\n }\n }\n const insertionIndex = binarySearchLessOrEqual(segment.clusters, elementStartPos, x => x.elementStartPos);\n segment.clusters.splice(insertionIndex + 1, 0, cluster);\n this.currentCluster = null;\n return cluster;\n }\n getTrackDataInCluster(cluster, trackNumber) {\n let trackData = cluster.trackData.get(trackNumber);\n if (!trackData) {\n trackData = {\n startTimestamp: 0,\n endTimestamp: 0,\n firstKeyFrameTimestamp: null,\n blocks: [],\n presentationTimestamps: [],\n };\n cluster.trackData.set(trackNumber, trackData);\n }\n return trackData;\n }\n readContiguousElements(reader, totalSize) {\n const startIndex = reader.pos;\n while (reader.pos - startIndex <= totalSize - MIN_HEADER_SIZE) {\n this.traverseElement(reader);\n }\n }\n traverseElement(reader) {\n const { id, size } = reader.readElementHeader();\n const dataStartPos = reader.pos;\n assertDefinedSize(size);\n switch (id) {\n case EBMLId.DocType:\n {\n this.isWebM = reader.readString(size) === 'webm';\n }\n ;\n break;\n case EBMLId.Seek:\n {\n if (!this.currentSegment)\n break;\n const seekEntry = { id: -1, segmentPosition: -1 };\n this.currentSegment.seekEntries.push(seekEntry);\n this.readContiguousElements(reader, size);\n if (seekEntry.id === -1 || seekEntry.segmentPosition === -1) {\n this.currentSegment.seekEntries.pop();\n }\n }\n ;\n break;\n case EBMLId.SeekID:\n {\n const lastSeekEntry = this.currentSegment?.seekEntries[this.currentSegment.seekEntries.length - 1];\n if (!lastSeekEntry)\n break;\n lastSeekEntry.id = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.SeekPosition:\n {\n const lastSeekEntry = this.currentSegment?.seekEntries[this.currentSegment.seekEntries.length - 1];\n if (!lastSeekEntry)\n break;\n lastSeekEntry.segmentPosition = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.TimestampScale:\n {\n if (!this.currentSegment)\n break;\n this.currentSegment.timestampScale = reader.readUnsignedInt(size);\n this.currentSegment.timestampFactor = 1e9 / this.currentSegment.timestampScale;\n }\n ;\n break;\n case EBMLId.Duration:\n {\n if (!this.currentSegment)\n break;\n this.currentSegment.duration = reader.readFloat(size);\n }\n ;\n break;\n case EBMLId.TrackEntry:\n {\n if (!this.currentSegment)\n break;\n this.currentTrack = {\n id: -1,\n segment: this.currentSegment,\n demuxer: this,\n clusters: [],\n clustersWithKeyFrame: [],\n cuePoints: [],\n isDefault: false,\n inputTrack: null,\n codecId: null,\n codecPrivate: null,\n languageCode: UNDETERMINED_LANGUAGE,\n info: null,\n };\n this.readContiguousElements(reader, size);\n if (this.currentTrack\n && this.currentTrack.id !== -1\n && this.currentTrack.codecId\n && this.currentTrack.info) {\n const slashIndex = this.currentTrack.codecId.indexOf('/');\n const codecIdWithoutSuffix = slashIndex === -1\n ? this.currentTrack.codecId\n : this.currentTrack.codecId.slice(0, slashIndex);\n if (this.currentTrack.info.type === 'video'\n && this.currentTrack.info.width !== -1\n && this.currentTrack.info.height !== -1) {\n if (this.currentTrack.codecId === CODEC_STRING_MAP.avc) {\n this.currentTrack.info.codec = 'avc';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (this.currentTrack.codecId === CODEC_STRING_MAP.hevc) {\n this.currentTrack.info.codec = 'hevc';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.vp8) {\n this.currentTrack.info.codec = 'vp8';\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.vp9) {\n this.currentTrack.info.codec = 'vp9';\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.av1) {\n this.currentTrack.info.codec = 'av1';\n }\n const videoTrack = this.currentTrack;\n const inputTrack = new InputVideoTrack(new MatroskaVideoTrackBacking(videoTrack));\n this.currentTrack.inputTrack = inputTrack;\n this.currentSegment.tracks.push(this.currentTrack);\n }\n else if (this.currentTrack.info.type === 'audio'\n && this.currentTrack.info.numberOfChannels !== -1\n && this.currentTrack.info.sampleRate !== -1) {\n if (codecIdWithoutSuffix === CODEC_STRING_MAP.aac) {\n this.currentTrack.info.codec = 'aac';\n this.currentTrack.info.aacCodecInfo = {\n isMpeg2: this.currentTrack.codecId.includes('MPEG2'),\n };\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (this.currentTrack.codecId === CODEC_STRING_MAP.mp3) {\n this.currentTrack.info.codec = 'mp3';\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.opus) {\n this.currentTrack.info.codec = 'opus';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.vorbis) {\n this.currentTrack.info.codec = 'vorbis';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.flac) {\n this.currentTrack.info.codec = 'flac';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (this.currentTrack.codecId === 'A_PCM/INT/LIT') {\n if (this.currentTrack.info.bitDepth === 8) {\n this.currentTrack.info.codec = 'pcm-u8';\n }\n else if (this.currentTrack.info.bitDepth === 16) {\n this.currentTrack.info.codec = 'pcm-s16';\n }\n else if (this.currentTrack.info.bitDepth === 24) {\n this.currentTrack.info.codec = 'pcm-s24';\n }\n else if (this.currentTrack.info.bitDepth === 32) {\n this.currentTrack.info.codec = 'pcm-s32';\n }\n }\n else if (this.currentTrack.codecId === 'A_PCM/INT/BIG') {\n if (this.currentTrack.info.bitDepth === 8) {\n this.currentTrack.info.codec = 'pcm-u8';\n }\n else if (this.currentTrack.info.bitDepth === 16) {\n this.currentTrack.info.codec = 'pcm-s16be';\n }\n else if (this.currentTrack.info.bitDepth === 24) {\n this.currentTrack.info.codec = 'pcm-s24be';\n }\n else if (this.currentTrack.info.bitDepth === 32) {\n this.currentTrack.info.codec = 'pcm-s32be';\n }\n }\n else if (this.currentTrack.codecId === 'A_PCM/FLOAT/IEEE') {\n if (this.currentTrack.info.bitDepth === 32) {\n this.currentTrack.info.codec = 'pcm-f32';\n }\n else if (this.currentTrack.info.bitDepth === 64) {\n this.currentTrack.info.codec = 'pcm-f64';\n }\n }\n const audioTrack = this.currentTrack;\n const inputTrack = new InputAudioTrack(new MatroskaAudioTrackBacking(audioTrack));\n this.currentTrack.inputTrack = inputTrack;\n this.currentSegment.tracks.push(this.currentTrack);\n }\n }\n this.currentTrack = null;\n }\n ;\n break;\n case EBMLId.TrackNumber:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.id = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.TrackType:\n {\n if (!this.currentTrack)\n break;\n const type = reader.readUnsignedInt(size);\n if (type === 1) {\n this.currentTrack.info = {\n type: 'video',\n width: -1,\n height: -1,\n rotation: 0,\n codec: null,\n codecDescription: null,\n colorSpace: null,\n };\n }\n else if (type === 2) {\n this.currentTrack.info = {\n type: 'audio',\n numberOfChannels: -1,\n sampleRate: -1,\n bitDepth: -1,\n codec: null,\n codecDescription: null,\n aacCodecInfo: null,\n };\n }\n }\n ;\n break;\n case EBMLId.FlagEnabled:\n {\n if (!this.currentTrack)\n break;\n const enabled = reader.readUnsignedInt(size);\n if (!enabled) {\n this.currentSegment.tracks.pop();\n this.currentTrack = null;\n }\n }\n ;\n break;\n case EBMLId.FlagDefault:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.isDefault = !!reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.CodecID:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.codecId = reader.readString(size);\n }\n ;\n break;\n case EBMLId.CodecPrivate:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.codecPrivate = reader.readBytes(size);\n }\n ;\n break;\n case EBMLId.Language:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.languageCode = reader.readString(size);\n if (!isIso639Dash2LanguageCode(this.currentTrack.languageCode)) {\n this.currentTrack.languageCode = UNDETERMINED_LANGUAGE;\n }\n }\n ;\n break;\n case EBMLId.Video:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.readContiguousElements(reader, size);\n }\n ;\n break;\n case EBMLId.PixelWidth:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.currentTrack.info.width = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.PixelHeight:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.currentTrack.info.height = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.Colour:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.currentTrack.info.colorSpace = {};\n this.readContiguousElements(reader, size);\n }\n ;\n break;\n case EBMLId.MatrixCoefficients:\n {\n if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace)\n break;\n const matrixCoefficients = reader.readUnsignedInt(size);\n const mapped = MATRIX_COEFFICIENTS_MAP_INVERSE[matrixCoefficients] ?? null;\n this.currentTrack.info.colorSpace.matrix = mapped;\n }\n ;\n break;\n case EBMLId.Range:\n {\n if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace)\n break;\n this.currentTrack.info.colorSpace.fullRange = reader.readUnsignedInt(size) === 2;\n }\n ;\n break;\n case EBMLId.TransferCharacteristics:\n {\n if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace)\n break;\n const transferCharacteristics = reader.readUnsignedInt(size);\n const mapped = TRANSFER_CHARACTERISTICS_MAP_INVERSE[transferCharacteristics] ?? null;\n this.currentTrack.info.colorSpace.transfer = mapped;\n }\n ;\n break;\n case EBMLId.Primaries:\n {\n if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace)\n break;\n const primaries = reader.readUnsignedInt(size);\n const mapped = COLOR_PRIMARIES_MAP_INVERSE[primaries] ?? null;\n this.currentTrack.info.colorSpace.primaries = mapped;\n }\n ;\n break;\n case EBMLId.Projection:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.readContiguousElements(reader, size);\n }\n ;\n break;\n case EBMLId.ProjectionPoseRoll:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n const rotation = reader.readFloat(size);\n const flippedRotation = -rotation; // Convert counter-clockwise to clockwise\n try {\n this.currentTrack.info.rotation = normalizeRotation(flippedRotation);\n }\n catch {\n // It wasn't a valid rotation\n }\n }\n ;\n break;\n case EBMLId.Audio:\n {\n if (this.currentTrack?.info?.type !== 'audio')\n break;\n this.readContiguousElements(reader, size);\n }\n ;\n break;\n case EBMLId.SamplingFrequency:\n {\n if (this.currentTrack?.info?.type !== 'audio')\n break;\n this.currentTrack.info.sampleRate = reader.readFloat(size);\n }\n ;\n break;\n case EBMLId.Channels:\n {\n if (this.currentTrack?.info?.type !== 'audio')\n break;\n this.currentTrack.info.numberOfChannels = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.BitDepth:\n {\n if (this.currentTrack?.info?.type !== 'audio')\n break;\n this.currentTrack.info.bitDepth = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.CuePoint:\n {\n if (!this.currentSegment)\n break;\n this.readContiguousElements(reader, size);\n this.currentCueTime = null;\n }\n ;\n break;\n case EBMLId.CueTime:\n {\n this.currentCueTime = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.CueTrackPositions:\n {\n if (this.currentCueTime === null)\n break;\n assert(this.currentSegment);\n const cuePoint = { time: this.currentCueTime, trackId: -1, clusterPosition: -1 };\n this.currentSegment.cuePoints.push(cuePoint);\n this.readContiguousElements(reader, size);\n if (cuePoint.trackId === -1 || cuePoint.clusterPosition === -1) {\n this.currentSegment.cuePoints.pop();\n }\n }\n ;\n break;\n case EBMLId.CueTrack:\n {\n const lastCuePoint = this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length - 1];\n if (!lastCuePoint)\n break;\n lastCuePoint.trackId = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.CueClusterPosition:\n {\n const lastCuePoint = this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length - 1];\n if (!lastCuePoint)\n break;\n assert(this.currentSegment);\n lastCuePoint.clusterPosition = this.currentSegment.dataStartPos + reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.Timestamp:\n {\n if (!this.currentCluster)\n break;\n this.currentCluster.timestamp = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.SimpleBlock:\n {\n if (!this.currentCluster)\n break;\n const trackNumber = reader.readVarInt();\n const relativeTimestamp = reader.readS16();\n const flags = reader.readU8();\n const isKeyFrame = !!(flags & 0x80);\n const trackData = this.getTrackDataInCluster(this.currentCluster, trackNumber);\n trackData.blocks.push({\n timestamp: relativeTimestamp, // We'll add the cluster's timestamp to this later\n duration: 0,\n isKeyFrame,\n referencedTimestamps: [],\n data: reader.readBytes(size - (reader.pos - dataStartPos)),\n });\n }\n ;\n break;\n case EBMLId.BlockGroup:\n {\n if (!this.currentCluster)\n break;\n this.readContiguousElements(reader, size);\n if (this.currentBlock) {\n for (let i = 0; i < this.currentBlock.referencedTimestamps.length; i++) {\n this.currentBlock.referencedTimestamps[i] += this.currentBlock.timestamp;\n }\n this.currentBlock = null;\n }\n }\n ;\n break;\n case EBMLId.Block:\n {\n if (!this.currentCluster)\n break;\n const trackNumber = reader.readVarInt();\n const relativeTimestamp = reader.readS16();\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const flags = reader.readU8();\n const trackData = this.getTrackDataInCluster(this.currentCluster, trackNumber);\n this.currentBlock = {\n timestamp: relativeTimestamp, // We'll add the cluster's timestamp to this later\n duration: 0,\n isKeyFrame: true,\n referencedTimestamps: [],\n data: reader.readBytes(size - (reader.pos - dataStartPos)),\n };\n trackData.blocks.push(this.currentBlock);\n }\n ;\n break;\n case EBMLId.BlockDuration:\n {\n if (!this.currentBlock)\n break;\n this.currentBlock.duration = reader.readUnsignedInt(size);\n }\n ;\n break;\n case EBMLId.ReferenceBlock:\n {\n if (!this.currentBlock)\n break;\n this.currentBlock.isKeyFrame = false;\n const relativeTimestamp = reader.readSignedInt(size);\n // We'll offset this by the block's timestamp later\n this.currentBlock.referencedTimestamps.push(relativeTimestamp);\n }\n ;\n break;\n }\n reader.pos = dataStartPos + size;\n }\n}\nclass MatroskaTrackBacking {\n constructor(internalTrack) {\n this.internalTrack = internalTrack;\n this.packetToClusterLocation = new WeakMap();\n }\n getId() {\n return this.internalTrack.id;\n }\n getCodec() {\n throw new Error('Not implemented on base class.');\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n getLanguageCode() {\n return this.internalTrack.languageCode;\n }\n async getFirstTimestamp() {\n const firstPacket = await this.getFirstPacket({ metadataOnly: true });\n return firstPacket?.timestamp ?? 0;\n }\n getTimeResolution() {\n return this.internalTrack.segment.timestampFactor;\n }\n async getFirstPacket(options) {\n return this.performClusterLookup(() => {\n const startCluster = this.internalTrack.segment.clusters[0] ?? null;\n if (startCluster?.isKnownToBeFirstCluster) {\n // Walk from the very first cluster in the file until we find one with our track in it\n let currentCluster = startCluster;\n while (currentCluster) {\n const trackData = currentCluster.trackData.get(this.internalTrack.id);\n if (trackData) {\n return {\n clusterIndex: binarySearchExact(this.internalTrack.clusters, currentCluster.elementStartPos, x => x.elementStartPos),\n blockIndex: 0,\n correctBlockFound: true,\n };\n }\n currentCluster = currentCluster.nextCluster;\n }\n }\n return {\n clusterIndex: -1,\n blockIndex: -1,\n correctBlockFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the cues\n Infinity, options);\n }\n intoTimescale(timestamp) {\n // Do a little rounding to catch cases where the result is very close to an integer. If it is, it's likely\n // that the number was originally an integer divided by the timescale. For stability, it's best\n // to return the integer in this case.\n return roundToPrecision(timestamp * this.internalTrack.segment.timestampFactor, 14);\n }\n async getPacket(timestamp, options) {\n const timestampInTimescale = this.intoTimescale(timestamp);\n return this.performClusterLookup(() => this.findBlockInClustersForTimestamp(timestampInTimescale), timestampInTimescale, timestampInTimescale, options);\n }\n async getNextPacket(packet, options) {\n const locationInCluster = this.packetToClusterLocation.get(packet);\n if (locationInCluster === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n const trackData = locationInCluster.cluster.trackData.get(this.internalTrack.id);\n const block = trackData.blocks[locationInCluster.blockIndex];\n const clusterIndex = binarySearchExact(this.internalTrack.clusters, locationInCluster.cluster.elementStartPos, x => x.elementStartPos);\n assert(clusterIndex !== -1);\n return this.performClusterLookup(() => {\n if (locationInCluster.blockIndex + 1 < trackData.blocks.length) {\n // We can simply take the next block in the cluster\n return {\n clusterIndex,\n blockIndex: locationInCluster.blockIndex + 1,\n correctBlockFound: true,\n };\n }\n else {\n // Walk the list of clusters until we find the next cluster for this track\n let currentCluster = locationInCluster.cluster;\n while (currentCluster.nextCluster) {\n currentCluster = currentCluster.nextCluster;\n const trackData = currentCluster.trackData.get(this.internalTrack.id);\n if (trackData) {\n const clusterIndex = binarySearchExact(this.internalTrack.clusters, currentCluster.elementStartPos, x => x.elementStartPos);\n assert(clusterIndex !== -1);\n return {\n clusterIndex,\n blockIndex: 0,\n correctBlockFound: true,\n };\n }\n }\n return {\n clusterIndex,\n blockIndex: -1,\n correctBlockFound: false,\n };\n }\n }, block.timestamp, Infinity, options);\n }\n async getKeyPacket(timestamp, options) {\n const timestampInTimescale = this.intoTimescale(timestamp);\n return this.performClusterLookup(() => this.findKeyBlockInClustersForTimestamp(timestampInTimescale), timestampInTimescale, timestampInTimescale, options);\n }\n async getNextKeyPacket(packet, options) {\n const locationInCluster = this.packetToClusterLocation.get(packet);\n if (locationInCluster === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n const trackData = locationInCluster.cluster.trackData.get(this.internalTrack.id);\n const block = trackData.blocks[locationInCluster.blockIndex];\n const clusterIndex = binarySearchExact(this.internalTrack.clusters, locationInCluster.cluster.elementStartPos, x => x.elementStartPos);\n assert(clusterIndex !== -1);\n return this.performClusterLookup(() => {\n const nextKeyFrameIndex = trackData.blocks.findIndex((x, i) => x.isKeyFrame && i > locationInCluster.blockIndex);\n if (nextKeyFrameIndex !== -1) {\n // We can simply take the next key frame in the cluster\n return {\n clusterIndex,\n blockIndex: nextKeyFrameIndex,\n correctBlockFound: true,\n };\n }\n else {\n // Walk the list of clusters until we find the next cluster for this track with a key frame\n let currentCluster = locationInCluster.cluster;\n while (currentCluster.nextCluster) {\n currentCluster = currentCluster.nextCluster;\n const trackData = currentCluster.trackData.get(this.internalTrack.id);\n if (trackData && trackData.firstKeyFrameTimestamp !== null) {\n const clusterIndex = binarySearchExact(this.internalTrack.clusters, currentCluster.elementStartPos, x => x.elementStartPos);\n assert(clusterIndex !== -1);\n const keyFrameIndex = trackData.blocks.findIndex(x => x.isKeyFrame);\n assert(keyFrameIndex !== -1); // There must be one\n return {\n clusterIndex,\n blockIndex: keyFrameIndex,\n correctBlockFound: true,\n };\n }\n }\n return {\n clusterIndex,\n blockIndex: -1,\n correctBlockFound: false,\n };\n }\n }, block.timestamp, Infinity, options);\n }\n async fetchPacketInCluster(cluster, blockIndex, options) {\n if (blockIndex === -1) {\n return null;\n }\n const trackData = cluster.trackData.get(this.internalTrack.id);\n const block = trackData.blocks[blockIndex];\n assert(block);\n const data = options.metadataOnly ? PLACEHOLDER_DATA : block.data;\n const timestamp = block.timestamp / this.internalTrack.segment.timestampFactor;\n const duration = block.duration / this.internalTrack.segment.timestampFactor;\n const packet = new EncodedPacket(data, block.isKeyFrame ? 'key' : 'delta', timestamp, duration, cluster.dataStartPos + blockIndex, block.data.byteLength);\n this.packetToClusterLocation.set(packet, { cluster, blockIndex });\n return packet;\n }\n findBlockInClustersForTimestamp(timestampInTimescale) {\n const clusterIndex = binarySearchLessOrEqual(\n // This array is technically not sorted by start timestamp, but for any reasonable file, it basically is.\n this.internalTrack.clusters, timestampInTimescale, x => x.trackData.get(this.internalTrack.id).startTimestamp);\n let blockIndex = -1;\n let correctBlockFound = false;\n if (clusterIndex !== -1) {\n const cluster = this.internalTrack.clusters[clusterIndex];\n const trackData = cluster.trackData.get(this.internalTrack.id);\n const index = binarySearchLessOrEqual(trackData.presentationTimestamps, timestampInTimescale, x => x.timestamp);\n assert(index !== -1);\n blockIndex = trackData.presentationTimestamps[index].blockIndex;\n correctBlockFound = timestampInTimescale < trackData.endTimestamp;\n }\n return { clusterIndex, blockIndex, correctBlockFound };\n }\n findKeyBlockInClustersForTimestamp(timestampInTimescale) {\n const indexInKeyFrameClusters = binarySearchLessOrEqual(\n // This array is technically not sorted by start timestamp, but for any reasonable file, it basically is.\n this.internalTrack.clustersWithKeyFrame, timestampInTimescale, x => x.trackData.get(this.internalTrack.id).firstKeyFrameTimestamp);\n let clusterIndex = -1;\n let blockIndex = -1;\n let correctBlockFound = false;\n if (indexInKeyFrameClusters !== -1) {\n const cluster = this.internalTrack.clustersWithKeyFrame[indexInKeyFrameClusters];\n // Now, let's find the actual index of the cluster in the list of ALL clusters, not just key frame ones\n clusterIndex = binarySearchExact(this.internalTrack.clusters, cluster.elementStartPos, x => x.elementStartPos);\n assert(clusterIndex !== -1);\n const trackData = cluster.trackData.get(this.internalTrack.id);\n const index = findLastIndex(trackData.presentationTimestamps, (x) => {\n const block = trackData.blocks[x.blockIndex];\n return block.isKeyFrame && x.timestamp <= timestampInTimescale;\n });\n assert(index !== -1); // It's a key frame cluster, so there must be a key frame\n const entry = trackData.presentationTimestamps[index];\n blockIndex = entry.blockIndex;\n correctBlockFound = timestampInTimescale < trackData.endTimestamp;\n }\n return { clusterIndex, blockIndex, correctBlockFound };\n }\n /** Looks for a packet in the clusters while trying to load as few clusters as possible to retrieve it. */\n async performClusterLookup(\n // This function returns the best-matching block that is currently loaded. Based on this information, we know\n // which clusters we need to load to find the actual match.\n getBestMatch, \n // The timestamp with which we can search the lookup table\n searchTimestamp, \n // The timestamp for which we know the correct block will not come after it\n latestTimestamp, options) {\n const { demuxer, segment } = this.internalTrack;\n const release = await segment.clusterLookupMutex.acquire(); // The algorithm requires exclusivity\n try {\n const { clusterIndex, blockIndex, correctBlockFound } = getBestMatch();\n if (correctBlockFound) {\n // The correct block already exists, easy path.\n const cluster = this.internalTrack.clusters[clusterIndex];\n return this.fetchPacketInCluster(cluster, blockIndex, options);\n }\n // We use the metadata reader to find the cluster, but the cluster reader to load the cluster\n const metadataReader = demuxer.metadataReader;\n const clusterReader = demuxer.clusterReader;\n let prevCluster = null;\n let bestClusterIndex = clusterIndex;\n let bestBlockIndex = blockIndex;\n // Search for a cue point; this way, we won't need to start searching from the start of the file\n // but can jump right into the correct cluster (or at least nearby).\n const cuePointIndex = binarySearchLessOrEqual(this.internalTrack.cuePoints, searchTimestamp, x => x.time);\n const cuePoint = cuePointIndex !== -1 ? this.internalTrack.cuePoints[cuePointIndex] : null;\n let nextClusterIsFirstCluster = false;\n if (clusterIndex === -1) {\n metadataReader.pos = cuePoint?.clusterPosition ?? segment.clusterSeekStartPos;\n nextClusterIsFirstCluster = metadataReader.pos === segment.clusterSeekStartPos;\n }\n else {\n const cluster = this.internalTrack.clusters[clusterIndex];\n if (!cuePoint || cluster.elementStartPos >= cuePoint.clusterPosition) {\n metadataReader.pos = cluster.elementEndPos;\n prevCluster = cluster;\n }\n else {\n // Use the lookup entry\n metadataReader.pos = cuePoint.clusterPosition;\n }\n }\n while (metadataReader.pos < segment.elementEndPos) {\n if (prevCluster) {\n const trackData = prevCluster.trackData.get(this.internalTrack.id);\n if (trackData && trackData.startTimestamp > latestTimestamp) {\n // We're already past the upper bound, no need to keep searching\n break;\n }\n if (prevCluster.nextCluster) {\n // Skip ahead quickly without needing to read the file again\n metadataReader.pos = prevCluster.nextCluster.elementEndPos;\n prevCluster = prevCluster.nextCluster;\n continue;\n }\n }\n // Load the header\n await metadataReader.reader.loadRange(metadataReader.pos, metadataReader.pos + MAX_HEADER_SIZE);\n const elementStartPos = metadataReader.pos;\n const elementHeader = metadataReader.readElementHeader();\n const id = elementHeader.id;\n let size = elementHeader.size;\n const dataStartPos = metadataReader.pos;\n if (id === EBMLId.Cluster) {\n const index = binarySearchExact(segment.clusters, elementStartPos, x => x.elementStartPos);\n let cluster;\n if (index === -1) {\n // This is the first time we've seen this cluster\n metadataReader.pos = elementStartPos;\n cluster = await demuxer.readCluster(segment);\n }\n else {\n // We already know this cluster\n cluster = segment.clusters[index];\n }\n // Even if we already know the cluster, we might not yet know its predecessor, so always do this\n if (prevCluster)\n prevCluster.nextCluster = cluster;\n prevCluster = cluster;\n if (nextClusterIsFirstCluster) {\n cluster.isKnownToBeFirstCluster = true;\n nextClusterIsFirstCluster = false;\n }\n const { clusterIndex, blockIndex, correctBlockFound } = getBestMatch();\n if (correctBlockFound) {\n const cluster = this.internalTrack.clusters[clusterIndex];\n return this.fetchPacketInCluster(cluster, blockIndex, options);\n }\n if (clusterIndex !== -1) {\n bestClusterIndex = clusterIndex;\n bestBlockIndex = blockIndex;\n }\n }\n if (size === null) {\n // Undefined element size (can happen in livestreamed files). In this case, we need to do some\n // searching to determine the actual size of the element.\n if (id === EBMLId.Cluster) {\n // The cluster should have already computed its length, we can just copy that result\n assert(prevCluster);\n size = prevCluster.elementEndPos - dataStartPos;\n }\n else {\n // Search for the next element at level 0 or 1\n clusterReader.pos = dataStartPos;\n const nextElementPos = await clusterReader.searchForNextElementId(LEVEL_0_AND_1_EBML_IDS, segment.elementEndPos);\n size = (nextElementPos ?? segment.elementEndPos) - dataStartPos;\n }\n const endPos = dataStartPos + size;\n if (endPos > segment.elementEndPos - MIN_HEADER_SIZE) {\n // No more elements fit in this segment\n break;\n }\n else {\n // Check the next element. If it's a new segment, we know this segment ends here. The new\n // segment is just ignored, since we're likely in a livestreamed file and thus only care about\n // the first segment.\n clusterReader.pos = endPos;\n const elementId = clusterReader.readElementId();\n if (elementId === EBMLId.Segment) {\n segment.elementEndPos = endPos;\n break;\n }\n }\n }\n metadataReader.pos = dataStartPos + size;\n }\n let result = null;\n const bestCluster = bestClusterIndex !== -1 ? this.internalTrack.clusters[bestClusterIndex] : null;\n if (bestCluster) {\n // If we finished looping but didn't find a perfect match, still return the best match we found\n result = await this.fetchPacketInCluster(bestCluster, bestBlockIndex, options);\n }\n // Catch faulty cue points\n if (!result && cuePoint && (!bestCluster || bestCluster.elementStartPos < cuePoint.clusterPosition)) {\n // The cue point lied to us! We found a cue point but no cluster there that satisfied the match. In this\n // case, let's search again but using the cue point before that.\n const previousCuePoint = this.internalTrack.cuePoints[cuePointIndex - 1];\n const newSearchTimestamp = previousCuePoint?.time ?? -Infinity;\n return this.performClusterLookup(getBestMatch, newSearchTimestamp, latestTimestamp, options);\n }\n return result;\n }\n finally {\n release();\n }\n }\n}\nclass MatroskaVideoTrackBacking extends MatroskaTrackBacking {\n constructor(internalTrack) {\n super(internalTrack);\n this.decoderConfigPromise = null;\n this.internalTrack = internalTrack;\n }\n getCodec() {\n return this.internalTrack.info.codec;\n }\n getCodedWidth() {\n return this.internalTrack.info.width;\n }\n getCodedHeight() {\n return this.internalTrack.info.height;\n }\n getRotation() {\n return this.internalTrack.info.rotation;\n }\n async getColorSpace() {\n return {\n primaries: this.internalTrack.info.colorSpace?.primaries,\n transfer: this.internalTrack.info.colorSpace?.transfer,\n matrix: this.internalTrack.info.colorSpace?.matrix,\n fullRange: this.internalTrack.info.colorSpace?.fullRange,\n };\n }\n async getDecoderConfig() {\n if (!this.internalTrack.info.codec) {\n return null;\n }\n return this.decoderConfigPromise ??= (async () => {\n let firstPacket = null;\n const needsPacketForAdditionalInfo = this.internalTrack.info.codec === 'vp9'\n || this.internalTrack.info.codec === 'av1'\n // Packets are in Annex B format:\n || (this.internalTrack.info.codec === 'avc' && !this.internalTrack.info.codecDescription)\n // Packets are in Annex B format:\n || (this.internalTrack.info.codec === 'hevc' && !this.internalTrack.info.codecDescription);\n if (needsPacketForAdditionalInfo) {\n firstPacket = await this.getFirstPacket({});\n }\n return {\n codec: extractVideoCodecString({\n width: this.internalTrack.info.width,\n height: this.internalTrack.info.height,\n codec: this.internalTrack.info.codec,\n codecDescription: this.internalTrack.info.codecDescription,\n colorSpace: this.internalTrack.info.colorSpace,\n avcCodecInfo: this.internalTrack.info.codec === 'avc' && firstPacket\n ? extractAvcDecoderConfigurationRecord(firstPacket.data)\n : null,\n hevcCodecInfo: this.internalTrack.info.codec === 'hevc' && firstPacket\n ? extractHevcDecoderConfigurationRecord(firstPacket.data)\n : null,\n vp9CodecInfo: this.internalTrack.info.codec === 'vp9' && firstPacket\n ? extractVp9CodecInfoFromPacket(firstPacket.data)\n : null,\n av1CodecInfo: this.internalTrack.info.codec === 'av1' && firstPacket\n ? extractAv1CodecInfoFromPacket(firstPacket.data)\n : null,\n }),\n codedWidth: this.internalTrack.info.width,\n codedHeight: this.internalTrack.info.height,\n description: this.internalTrack.info.codecDescription ?? undefined,\n colorSpace: this.internalTrack.info.colorSpace ?? undefined,\n };\n })();\n }\n}\nclass MatroskaAudioTrackBacking extends MatroskaTrackBacking {\n constructor(internalTrack) {\n super(internalTrack);\n this.decoderConfig = null;\n this.internalTrack = internalTrack;\n }\n getCodec() {\n return this.internalTrack.info.codec;\n }\n getNumberOfChannels() {\n return this.internalTrack.info.numberOfChannels;\n }\n getSampleRate() {\n return this.internalTrack.info.sampleRate;\n }\n async getDecoderConfig() {\n if (!this.internalTrack.info.codec) {\n return null;\n }\n return this.decoderConfig ??= {\n codec: extractAudioCodecString({\n codec: this.internalTrack.info.codec,\n codecDescription: this.internalTrack.info.codecDescription,\n aacCodecInfo: this.internalTrack.info.aacCodecInfo,\n }),\n numberOfChannels: this.internalTrack.info.numberOfChannels,\n sampleRate: this.internalTrack.info.sampleRate,\n description: this.internalTrack.info.codecDescription ?? undefined,\n };\n }\n}\n/** Sorts blocks such that referenced blocks come before the blocks that reference them. */\nconst sortBlocksByReferences = (blocks) => {\n const timestampToBlock = new Map();\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i];\n timestampToBlock.set(block.timestamp, block);\n }\n const processedBlocks = new Set();\n const result = [];\n const processBlock = (block) => {\n if (processedBlocks.has(block)) {\n return;\n }\n // Marking the block as processed here already; prevents this algorithm from dying on cycles\n processedBlocks.add(block);\n for (let j = 0; j < block.referencedTimestamps.length; j++) {\n const timestamp = block.referencedTimestamps[j];\n const otherBlock = timestampToBlock.get(timestamp);\n if (!otherBlock) {\n continue;\n }\n processBlock(otherBlock);\n }\n result.push(block);\n };\n for (let i = 0; i < blocks.length; i++) {\n processBlock(blocks[i]);\n }\n return result;\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { assert } from '../misc.js';\nimport { FRAME_HEADER_SIZE, readFrameHeader } from './mp3-misc.js';\nexport class Mp3Reader {\n constructor(reader) {\n this.reader = reader;\n this.pos = 0;\n this.fileSize = null;\n }\n readBytes(length) {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + length);\n this.pos += length;\n return new Uint8Array(view.buffer, offset, length);\n }\n readU16() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 2);\n this.pos += 2;\n return view.getUint16(offset, false);\n }\n readU32() {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + 4);\n this.pos += 4;\n return view.getUint32(offset, false);\n }\n readAscii(length) {\n const { view, offset } = this.reader.getViewAndOffset(this.pos, this.pos + length);\n this.pos += length;\n let str = '';\n for (let i = 0; i < length; i++) {\n str += String.fromCharCode(view.getUint8(offset + i));\n }\n return str;\n }\n readId3() {\n const tag = this.readAscii(3);\n if (tag !== 'ID3') {\n this.pos -= 3;\n return null;\n }\n this.pos += 3;\n const size = decodeSynchsafe(this.readU32());\n return { size };\n }\n readNextFrameHeader(until) {\n assert(this.fileSize);\n until ??= this.fileSize;\n while (this.pos <= until - FRAME_HEADER_SIZE) {\n const word = this.readU32();\n this.pos -= 4;\n const header = readFrameHeader(word, this);\n if (header) {\n return header;\n }\n }\n return null;\n }\n}\nexport const decodeSynchsafe = (synchsafed) => {\n let mask = 0x7f000000;\n let unsynchsafed = 0;\n while (mask !== 0) {\n unsynchsafed >>= 1;\n unsynchsafed |= synchsafed & mask;\n mask >>= 8;\n }\n return unsynchsafed;\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack } from '../input-track.js';\nimport { assert, binarySearchExact, binarySearchLessOrEqual, last, UNDETERMINED_LANGUAGE } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { getXingOffset, INFO, XING } from './mp3-misc.js';\nimport { Mp3Reader } from './mp3-reader.js';\nexport class Mp3Demuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.metadataPromise = null;\n this.firstFrameHeader = null;\n this.allSamples = [];\n this.tracks = [];\n this.reader = new Mp3Reader(input._mainReader);\n }\n async readMetadata() {\n return this.metadataPromise ??= (async () => {\n const fileSize = await this.input.source.getSize();\n this.reader.fileSize = fileSize;\n // Just load the entire file. Primitive, but the only way to actually ensure 100% correct timestamps.\n // Random access in MP3 can be flaky and unreliable.\n await this.reader.reader.loadRange(0, fileSize);\n const id3Tag = this.reader.readId3();\n if (id3Tag) {\n this.reader.pos += id3Tag.size;\n }\n let nextTimestampInSamples = 0;\n // Let's read all samples\n while (true) {\n const header = this.reader.readNextFrameHeader();\n if (!header) {\n break;\n }\n const xingOffset = getXingOffset(header.mpegVersionId, header.channel);\n this.reader.pos = header.startPos + xingOffset;\n const word = this.reader.readU32();\n const isXing = word === XING || word === INFO;\n this.reader.pos = header.startPos + header.totalSize - 1; // -1 in case the frame is 1 byte too short\n if (isXing) {\n // There's no actual audio data in this frame, so let's skip it\n continue;\n }\n if (!this.firstFrameHeader) {\n this.firstFrameHeader = header;\n }\n const sampleDuration = header.audioSamplesInFrame / header.sampleRate;\n const sample = {\n timestamp: nextTimestampInSamples / header.sampleRate,\n duration: sampleDuration,\n dataStart: header.startPos,\n dataSize: header.totalSize,\n };\n this.allSamples.push(sample);\n nextTimestampInSamples += header.audioSamplesInFrame;\n }\n if (!this.firstFrameHeader) {\n throw new Error('No MP3 frames found.');\n }\n this.tracks = [new InputAudioTrack(new Mp3AudioTrackBacking(this))];\n })();\n }\n async getMimeType() {\n return 'audio/mpeg';\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks;\n }\n async computeDuration() {\n await this.readMetadata();\n const lastSample = last(this.allSamples);\n assert(lastSample);\n return lastSample.timestamp + lastSample.duration;\n }\n}\nclass Mp3AudioTrackBacking {\n constructor(demuxer) {\n this.demuxer = demuxer;\n }\n getId() {\n return 1;\n }\n async getFirstTimestamp() {\n return 0;\n }\n getTimeResolution() {\n assert(this.demuxer.firstFrameHeader);\n return this.demuxer.firstFrameHeader.sampleRate / this.demuxer.firstFrameHeader.audioSamplesInFrame;\n }\n computeDuration() {\n return this.demuxer.computeDuration();\n }\n getLanguageCode() {\n return UNDETERMINED_LANGUAGE;\n }\n getCodec() {\n return 'mp3';\n }\n getNumberOfChannels() {\n assert(this.demuxer.firstFrameHeader);\n return this.demuxer.firstFrameHeader.channel === 3 ? 1 : 2;\n }\n getSampleRate() {\n assert(this.demuxer.firstFrameHeader);\n return this.demuxer.firstFrameHeader.sampleRate;\n }\n async getDecoderConfig() {\n assert(this.demuxer.firstFrameHeader);\n return {\n codec: 'mp3',\n numberOfChannels: this.demuxer.firstFrameHeader.channel === 3 ? 1 : 2,\n sampleRate: this.demuxer.firstFrameHeader.sampleRate,\n };\n }\n getPacketAtIndex(sampleIndex, options) {\n if (sampleIndex === -1) {\n return null;\n }\n const rawSample = this.demuxer.allSamples[sampleIndex];\n if (!rawSample) {\n return null;\n }\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n this.demuxer.reader.pos = rawSample.dataStart;\n data = this.demuxer.reader.readBytes(rawSample.dataSize);\n }\n return new EncodedPacket(data, 'key', rawSample.timestamp, rawSample.duration, sampleIndex, rawSample.dataSize);\n }\n async getFirstPacket(options) {\n return this.getPacketAtIndex(0, options);\n }\n async getNextPacket(packet, options) {\n const sampleIndex = binarySearchExact(this.demuxer.allSamples, packet.timestamp, x => x.timestamp);\n if (sampleIndex === -1) {\n throw new Error('Packet was not created from this track.');\n }\n return this.getPacketAtIndex(sampleIndex + 1, options);\n }\n async getPacket(timestamp, options) {\n const index = binarySearchLessOrEqual(this.demuxer.allSamples, timestamp, x => x.timestamp);\n return this.getPacketAtIndex(index, options);\n }\n getKeyPacket(timestamp, options) {\n return this.getPacket(timestamp, options);\n }\n getNextKeyPacket(packet, options) {\n return this.getNextPacket(packet, options);\n }\n}\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { OPUS_INTERNAL_SAMPLE_RATE } from '../codec.js';\nimport { parseModesFromVorbisSetupPacket, parseOpusIdentificationHeader } from '../codec-data.js';\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack } from '../input-track.js';\nimport { assert, AsyncMutex, findLast, roundToPrecision, toDataView, UNDETERMINED_LANGUAGE } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { Reader } from '../reader.js';\nimport { buildOggMimeType, computeOggPageCrc, extractSampleMetadata } from './ogg-misc.js';\nimport { MAX_PAGE_HEADER_SIZE, MAX_PAGE_SIZE, MIN_PAGE_HEADER_SIZE, OggReader } from './ogg-reader.js';\nexport class OggDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n /**\n * Lots of reading operations require multiple async reads and thus need to be mutually exclusive to avoid\n * conflicts in reader position.\n */\n this.readingMutex = new AsyncMutex();\n this.metadataPromise = null;\n this.fileSize = null;\n this.bitstreams = [];\n this.tracks = [];\n // We don't need a persistent metadata reader as we read all metadata once at the start and then never again\n this.reader = new OggReader(new Reader(input.source, 64 * 2 ** 20));\n }\n async readMetadata() {\n return this.metadataPromise ??= (async () => {\n this.fileSize = await this.input.source.getSize();\n while (this.reader.pos < this.fileSize - MIN_PAGE_HEADER_SIZE) {\n await this.reader.reader.loadRange(this.reader.pos, this.reader.pos + MAX_PAGE_HEADER_SIZE);\n const page = this.reader.readPageHeader();\n if (!page) {\n break;\n }\n const isBos = !!(page.headerType & 0x02);\n if (!isBos) {\n // All bos pages for all bitstreams are required to be at the start, so if the page is not bos then\n // we know we've seen all bitstreams (minus chaining)\n break;\n }\n this.bitstreams.push({\n serialNumber: page.serialNumber,\n bosPage: page,\n description: null,\n numberOfChannels: -1,\n sampleRate: -1,\n codecInfo: {\n codec: null,\n vorbisInfo: null,\n opusInfo: null,\n },\n lastMetadataPacket: null,\n });\n this.reader.pos = page.headerStartPos + page.totalSize;\n }\n for (const bitstream of this.bitstreams) {\n const firstPacket = await this.readPacket(this.reader, bitstream.bosPage, 0);\n if (!firstPacket) {\n continue;\n }\n if (\n // Check for Vorbis\n firstPacket.data.byteLength >= 7\n && firstPacket.data[0] === 0x01 // Packet type 1 = identification header\n && firstPacket.data[1] === 0x76 // 'v'\n && firstPacket.data[2] === 0x6f // 'o'\n && firstPacket.data[3] === 0x72 // 'r'\n && firstPacket.data[4] === 0x62 // 'b'\n && firstPacket.data[5] === 0x69 // 'i'\n && firstPacket.data[6] === 0x73 // 's'\n ) {\n await this.readVorbisMetadata(firstPacket, bitstream);\n }\n else if (\n // Check for Opus\n firstPacket.data.byteLength >= 8\n && firstPacket.data[0] === 0x4f // 'O'\n && firstPacket.data[1] === 0x70 // 'p'\n && firstPacket.data[2] === 0x75 // 'u'\n && firstPacket.data[3] === 0x73 // 's'\n && firstPacket.data[4] === 0x48 // 'H'\n && firstPacket.data[5] === 0x65 // 'e'\n && firstPacket.data[6] === 0x61 // 'a'\n && firstPacket.data[7] === 0x64 // 'd'\n ) {\n await this.readOpusMetadata(firstPacket, bitstream);\n }\n if (bitstream.codecInfo.codec !== null) {\n this.tracks.push(new InputAudioTrack(new OggAudioTrackBacking(bitstream, this)));\n }\n }\n })();\n }\n async readVorbisMetadata(firstPacket, bitstream) {\n let nextPacketPosition = await this.findNextPacketStart(this.reader, firstPacket);\n if (!nextPacketPosition) {\n return;\n }\n const secondPacket = await this.readPacket(this.reader, nextPacketPosition.startPage, nextPacketPosition.startSegmentIndex);\n if (!secondPacket) {\n return;\n }\n nextPacketPosition = await this.findNextPacketStart(this.reader, secondPacket);\n if (!nextPacketPosition) {\n return;\n }\n const thirdPacket = await this.readPacket(this.reader, nextPacketPosition.startPage, nextPacketPosition.startSegmentIndex);\n if (!thirdPacket) {\n return;\n }\n if (secondPacket.data[0] !== 0x03 || thirdPacket.data[0] !== 0x05) {\n return;\n }\n const lacingValues = [];\n const addBytesToSegmentTable = (bytes) => {\n while (true) {\n lacingValues.push(Math.min(255, bytes));\n if (bytes < 255) {\n break;\n }\n bytes -= 255;\n }\n };\n addBytesToSegmentTable(firstPacket.data.length);\n addBytesToSegmentTable(secondPacket.data.length);\n // We don't add the last packet to the segment table, as it is assumed to be whatever bytes remain\n const description = new Uint8Array(1 + lacingValues.length\n + firstPacket.data.length + secondPacket.data.length + thirdPacket.data.length);\n description[0] = lacingValues.length;\n description.set(lacingValues, 1);\n description.set(firstPacket.data, 1 + lacingValues.length);\n description.set(secondPacket.data, 1 + lacingValues.length + firstPacket.data.length);\n description.set(thirdPacket.data, 1 + lacingValues.length + firstPacket.data.length + secondPacket.data.length);\n bitstream.codecInfo.codec = 'vorbis';\n bitstream.description = description;\n bitstream.lastMetadataPacket = thirdPacket;\n const view = toDataView(firstPacket.data);\n bitstream.numberOfChannels = view.getUint8(11);\n bitstream.sampleRate = view.getUint32(12, true);\n const blockSizeByte = view.getUint8(28);\n bitstream.codecInfo.vorbisInfo = {\n blocksizes: [\n 1 << (blockSizeByte & 0xf),\n 1 << (blockSizeByte >> 4),\n ],\n modeBlockflags: parseModesFromVorbisSetupPacket(thirdPacket.data).modeBlockflags,\n };\n }\n async readOpusMetadata(firstPacket, bitstream) {\n // From https://datatracker.ietf.org/doc/html/rfc7845#section-5:\n // \"An Ogg Opus logical stream contains exactly two mandatory header packets: an identification header and a\n // comment header.\"\n const nextPacketPosition = await this.findNextPacketStart(this.reader, firstPacket);\n if (!nextPacketPosition) {\n return;\n }\n const secondPacket = await this.readPacket(this.reader, nextPacketPosition.startPage, nextPacketPosition.startSegmentIndex);\n if (!secondPacket) {\n return;\n }\n // We don't make use of the comment header's data\n bitstream.codecInfo.codec = 'opus';\n bitstream.description = firstPacket.data;\n bitstream.lastMetadataPacket = secondPacket;\n const header = parseOpusIdentificationHeader(firstPacket.data);\n bitstream.numberOfChannels = header.outputChannelCount;\n bitstream.sampleRate = header.inputSampleRate;\n bitstream.codecInfo.opusInfo = {\n preSkip: header.preSkip,\n };\n }\n async readPacket(reader, startPage, startSegmentIndex) {\n assert(startSegmentIndex < startPage.lacingValues.length);\n assert(this.fileSize);\n let startDataOffset = 0;\n for (let i = 0; i < startSegmentIndex; i++) {\n startDataOffset += startPage.lacingValues[i];\n }\n let currentPage = startPage;\n let currentDataOffset = startDataOffset;\n let currentSegmentIndex = startSegmentIndex;\n const chunks = [];\n outer: while (true) {\n // Load the entire page data\n await reader.reader.loadRange(currentPage.dataStartPos, currentPage.dataStartPos + currentPage.dataSize);\n reader.pos = currentPage.dataStartPos;\n const pageData = reader.readBytes(currentPage.dataSize);\n while (true) {\n if (currentSegmentIndex === currentPage.lacingValues.length) {\n chunks.push(pageData.subarray(startDataOffset, currentDataOffset));\n break;\n }\n const lacingValue = currentPage.lacingValues[currentSegmentIndex];\n currentDataOffset += lacingValue;\n if (lacingValue < 255) {\n chunks.push(pageData.subarray(startDataOffset, currentDataOffset));\n break outer;\n }\n currentSegmentIndex++;\n }\n // The packet extends to the next page; let's find it\n while (true) {\n reader.pos = currentPage.headerStartPos + currentPage.totalSize;\n if (reader.pos >= this.fileSize - MIN_PAGE_HEADER_SIZE) {\n return null;\n }\n await reader.reader.loadRange(reader.pos, reader.pos + MAX_PAGE_HEADER_SIZE);\n const nextPage = reader.readPageHeader();\n if (!nextPage) {\n return null;\n }\n currentPage = nextPage;\n if (currentPage.serialNumber === startPage.serialNumber) {\n break;\n }\n }\n startDataOffset = 0;\n currentDataOffset = 0;\n currentSegmentIndex = 0;\n }\n const totalPacketSize = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const packetData = new Uint8Array(totalPacketSize);\n let offset = 0;\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n packetData.set(chunk, offset);\n offset += chunk.length;\n }\n return {\n data: packetData,\n endPage: currentPage,\n endSegmentIndex: currentSegmentIndex,\n };\n }\n async findNextPacketStart(reader, lastPacket) {\n assert(this.fileSize !== null);\n // If there's another segment in the same page, return it\n if (lastPacket.endSegmentIndex < lastPacket.endPage.lacingValues.length - 1) {\n return { startPage: lastPacket.endPage, startSegmentIndex: lastPacket.endSegmentIndex + 1 };\n }\n const isEos = !!(lastPacket.endPage.headerType & 0x04);\n if (isEos) {\n // The page is marked as the last page of the logical bitstream, so we won't find anything beyond it\n return null;\n }\n // Otherwise, search for the next page belonging to the same bitstream\n reader.pos = lastPacket.endPage.headerStartPos + lastPacket.endPage.totalSize;\n while (true) {\n if (reader.pos >= this.fileSize - MIN_PAGE_HEADER_SIZE) {\n return null;\n }\n await reader.reader.loadRange(reader.pos, reader.pos + MAX_PAGE_HEADER_SIZE);\n const nextPage = reader.readPageHeader();\n if (!nextPage) {\n return null;\n }\n if (nextPage.serialNumber === lastPacket.endPage.serialNumber) {\n return { startPage: nextPage, startSegmentIndex: 0 };\n }\n reader.pos = nextPage.headerStartPos + nextPage.totalSize;\n }\n }\n async getMimeType() {\n await this.readMetadata();\n const codecStrings = await Promise.all(this.tracks.map(x => x.getCodecParameterString()));\n return buildOggMimeType({\n codecStrings: codecStrings.filter(Boolean),\n });\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks;\n }\n async computeDuration() {\n const tracks = await this.getTracks();\n const trackDurations = await Promise.all(tracks.map(x => x.computeDuration()));\n return Math.max(0, ...trackDurations);\n }\n}\nclass OggAudioTrackBacking {\n constructor(bitstream, demuxer) {\n this.bitstream = bitstream;\n this.demuxer = demuxer;\n this.encodedPacketToMetadata = new WeakMap();\n // Opus always uses a fixed sample rate for its internal calculations, even if the actual rate is different\n this.internalSampleRate = bitstream.codecInfo.codec === 'opus'\n ? OPUS_INTERNAL_SAMPLE_RATE\n : bitstream.sampleRate;\n }\n getId() {\n return this.bitstream.serialNumber;\n }\n getNumberOfChannels() {\n return this.bitstream.numberOfChannels;\n }\n getSampleRate() {\n return this.bitstream.sampleRate;\n }\n getTimeResolution() {\n return this.bitstream.sampleRate;\n }\n getCodec() {\n return this.bitstream.codecInfo.codec;\n }\n async getDecoderConfig() {\n assert(this.bitstream.codecInfo.codec);\n return {\n codec: this.bitstream.codecInfo.codec,\n numberOfChannels: this.bitstream.numberOfChannels,\n sampleRate: this.bitstream.sampleRate,\n description: this.bitstream.description ?? undefined,\n };\n }\n getLanguageCode() {\n return UNDETERMINED_LANGUAGE;\n }\n async getFirstTimestamp() {\n return 0;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n granulePositionToTimestampInSamples(granulePosition) {\n if (this.bitstream.codecInfo.codec === 'opus') {\n assert(this.bitstream.codecInfo.opusInfo);\n return granulePosition - this.bitstream.codecInfo.opusInfo.preSkip;\n }\n return granulePosition;\n }\n createEncodedPacketFromOggPacket(packet, additional, options) {\n if (!packet) {\n return null;\n }\n const { durationInSamples, vorbisBlockSize } = extractSampleMetadata(packet.data, this.bitstream.codecInfo, additional.vorbisLastBlocksize);\n const encodedPacket = new EncodedPacket(options.metadataOnly ? PLACEHOLDER_DATA : packet.data, 'key', Math.max(0, additional.timestampInSamples) / this.internalSampleRate, durationInSamples / this.internalSampleRate, packet.endPage.headerStartPos + packet.endSegmentIndex, packet.data.byteLength);\n this.encodedPacketToMetadata.set(encodedPacket, {\n packet,\n timestampInSamples: additional.timestampInSamples,\n durationInSamples,\n vorbisBlockSize,\n });\n return encodedPacket;\n }\n async getFirstPacket(options, exclusive = true) {\n const release = exclusive ? await this.demuxer.readingMutex.acquire() : null;\n try {\n assert(this.bitstream.lastMetadataPacket);\n const packetPosition = await this.demuxer.findNextPacketStart(this.demuxer.reader, this.bitstream.lastMetadataPacket);\n if (!packetPosition) {\n return null;\n }\n let timestampInSamples = 0;\n if (this.bitstream.codecInfo.codec === 'opus') {\n assert(this.bitstream.codecInfo.opusInfo);\n timestampInSamples -= this.bitstream.codecInfo.opusInfo.preSkip;\n }\n const packet = await this.demuxer.readPacket(this.demuxer.reader, packetPosition.startPage, packetPosition.startSegmentIndex);\n return this.createEncodedPacketFromOggPacket(packet, {\n timestampInSamples,\n vorbisLastBlocksize: null,\n }, options);\n }\n finally {\n release?.();\n }\n }\n async getNextPacket(prevPacket, options) {\n const release = await this.demuxer.readingMutex.acquire();\n try {\n const prevMetadata = this.encodedPacketToMetadata.get(prevPacket);\n if (!prevMetadata) {\n throw new Error('Packet was not created from this track.');\n }\n const packetPosition = await this.demuxer.findNextPacketStart(this.demuxer.reader, prevMetadata.packet);\n if (!packetPosition) {\n return null;\n }\n const timestampInSamples = prevMetadata.timestampInSamples + prevMetadata.durationInSamples;\n const packet = await this.demuxer.readPacket(this.demuxer.reader, packetPosition.startPage, packetPosition.startSegmentIndex);\n return this.createEncodedPacketFromOggPacket(packet, {\n timestampInSamples,\n vorbisLastBlocksize: prevMetadata.vorbisBlockSize,\n }, options);\n }\n finally {\n release();\n }\n }\n async getPacket(timestamp, options) {\n const release = await this.demuxer.readingMutex.acquire();\n try {\n assert(this.demuxer.fileSize !== null);\n const timestampInSamples = roundToPrecision(timestamp * this.internalSampleRate, 14);\n if (timestampInSamples === 0) {\n // Fast path for timestamp 0 - avoids binary search when playing back from the start\n return this.getFirstPacket(options, false);\n }\n if (timestampInSamples < 0) {\n // There's nothing here\n return null;\n }\n const reader = this.demuxer.reader;\n assert(this.bitstream.lastMetadataPacket);\n const startPosition = await this.demuxer.findNextPacketStart(reader, this.bitstream.lastMetadataPacket);\n if (!startPosition) {\n return null;\n }\n let lowPage = startPosition.startPage;\n let high = this.demuxer.fileSize;\n const lowPages = [lowPage];\n // First, let's perform a binary serach (bisection search) on the file to find the approximate page where\n // we'll find the packet. We want to find a page whose end packet position is less than or equal to the\n // packet position we're searching for.\n // Outer loop: Does the binary serach\n outer: while (lowPage.headerStartPos + lowPage.totalSize < high) {\n const low = lowPage.headerStartPos;\n const mid = Math.floor((low + high) / 2);\n let searchStartPos = mid;\n // Inner loop: Does a linear forward scan if the page cannot be found immediately\n while (true) {\n const until = Math.min(searchStartPos + MAX_PAGE_SIZE, high - MIN_PAGE_HEADER_SIZE);\n await reader.reader.loadRange(searchStartPos, until);\n reader.pos = searchStartPos;\n const found = reader.findNextPageHeader(until);\n if (!found) {\n high = mid + MIN_PAGE_HEADER_SIZE;\n continue outer;\n }\n await reader.reader.loadRange(reader.pos, reader.pos + MAX_PAGE_HEADER_SIZE);\n const page = reader.readPageHeader();\n assert(page);\n let pageValid = false;\n if (page.serialNumber === this.bitstream.serialNumber) {\n // Serial numbers are basically random numbers, and the chance of finding a fake page with\n // matching serial number is astronomically low, so we can be pretty sure this page is legit.\n pageValid = true;\n }\n else {\n await reader.reader.loadRange(page.headerStartPos, page.headerStartPos + page.totalSize);\n // Validate the page by checking checksum\n reader.pos = page.headerStartPos;\n const bytes = reader.readBytes(page.totalSize);\n const crc = computeOggPageCrc(bytes);\n pageValid = crc === page.checksum;\n }\n if (!pageValid) {\n // Keep searching for a valid page\n searchStartPos = page.headerStartPos + 4; // 'OggS' is 4 bytes\n continue;\n }\n if (pageValid && page.serialNumber !== this.bitstream.serialNumber) {\n // Page is valid but from a different bitstream, so keep searching forward until we find one\n // belonging to the our bitstream\n searchStartPos = page.headerStartPos + page.totalSize;\n continue;\n }\n const isContinuationPage = page.granulePosition === -1;\n if (isContinuationPage) {\n // No packet ends on this page - keep looking\n searchStartPos = page.headerStartPos + page.totalSize;\n continue;\n }\n // The page is valid and belongs to our bitstream; let's check its granule position to see where we\n // need to take the bisection search.\n if (this.granulePositionToTimestampInSamples(page.granulePosition) > timestampInSamples) {\n high = page.headerStartPos;\n }\n else {\n lowPage = page;\n lowPages.push(page);\n }\n continue outer;\n }\n }\n // Now we have the last page with a packet position <= the packet position we're looking for, but there\n // might be multiple pages with the packet position, in which case we actually need to find the first of\n // such pages. We'll do this in two steps: First, let's find the latest page we know with an earlier packet\n // position, and then linear scan ourselves forward until we find the correct page.\n let lowerPage = startPosition.startPage;\n for (const otherLowPage of lowPages) {\n if (otherLowPage.granulePosition === lowPage.granulePosition) {\n break;\n }\n if (!lowerPage || otherLowPage.headerStartPos > lowerPage.headerStartPos) {\n lowerPage = otherLowPage;\n }\n }\n let currentPage = lowerPage;\n // Keep track of the pages we traversed, we need these later for backwards seeking\n const previousPages = [currentPage];\n while (true) {\n // This loop must terminate as we'll eventually reach lowPage\n if (currentPage.serialNumber === this.bitstream.serialNumber\n && currentPage.granulePosition === lowPage.granulePosition) {\n break;\n }\n reader.pos = currentPage.headerStartPos + currentPage.totalSize;\n await reader.reader.loadRange(reader.pos, reader.pos + MAX_PAGE_HEADER_SIZE);\n const nextPage = reader.readPageHeader();\n assert(nextPage);\n currentPage = nextPage;\n if (currentPage.serialNumber === this.bitstream.serialNumber) {\n previousPages.push(currentPage);\n }\n }\n assert(currentPage.granulePosition !== -1);\n let currentSegmentIndex = null;\n let currentTimestampInSamples;\n let currentTimestampIsCorrect;\n // These indicate the end position of the packet that the granule position belongs to\n let endPage = currentPage;\n let endSegmentIndex = 0;\n if (currentPage.headerStartPos === startPosition.startPage.headerStartPos) {\n currentTimestampInSamples = this.granulePositionToTimestampInSamples(0);\n currentTimestampIsCorrect = true;\n currentSegmentIndex = 0;\n }\n else {\n currentTimestampInSamples = 0; // Placeholder value! We'll refine it once we can\n currentTimestampIsCorrect = false;\n // Find the segment index of the next packet\n for (let i = currentPage.lacingValues.length - 1; i >= 0; i--) {\n const value = currentPage.lacingValues[i];\n if (value < 255) {\n // We know the last packet ended at i, so the next one starts at i + 1\n currentSegmentIndex = i + 1;\n break;\n }\n }\n // This must hold: Since this page has a granule position set, that means there must be a packet that\n // ends in this page.\n if (currentSegmentIndex === null) {\n throw new Error('Invalid page with granule position: no packets end on this page.');\n }\n endSegmentIndex = currentSegmentIndex - 1;\n const pseudopacket = {\n data: PLACEHOLDER_DATA,\n endPage,\n endSegmentIndex,\n };\n const nextPosition = await this.demuxer.findNextPacketStart(reader, pseudopacket);\n if (nextPosition) {\n // Let's rewind a single step (packet) - this previous packet ensures that we'll correctly compute\n // the duration for the packet we're looking for.\n const endPosition = findPreviousPacketEndPosition(previousPages, currentPage, currentSegmentIndex);\n assert(endPosition);\n const startPosition = findPacketStartPosition(previousPages, endPosition.page, endPosition.segmentIndex);\n if (startPosition) {\n currentPage = startPosition.page;\n currentSegmentIndex = startPosition.segmentIndex;\n }\n }\n else {\n // There is no next position, which means we're looking for the last packet in the bitstream. The\n // granule position on the last page tends to be fucky, so let's instead start the search on the\n // page before that. So let's loop until we find a packet that ends in a previous page.\n while (true) {\n const endPosition = findPreviousPacketEndPosition(previousPages, currentPage, currentSegmentIndex);\n if (!endPosition) {\n break;\n }\n const startPosition = findPacketStartPosition(previousPages, endPosition.page, endPosition.segmentIndex);\n if (!startPosition) {\n break;\n }\n currentPage = startPosition.page;\n currentSegmentIndex = startPosition.segmentIndex;\n if (endPosition.page.headerStartPos !== endPage.headerStartPos) {\n endPage = endPosition.page;\n endSegmentIndex = endPosition.segmentIndex;\n break;\n }\n }\n }\n }\n let lastEncodedPacket = null;\n let lastEncodedPacketMetadata = null;\n // Alright, now it's time for the final, granular seek: We keep iterating over packets until we've found the\n // one with the correct timestamp - i.e., the last one with a timestamp <= the timestamp we're looking for.\n while (currentPage !== null) {\n assert(currentSegmentIndex !== null);\n const packet = await this.demuxer.readPacket(reader, currentPage, currentSegmentIndex);\n if (!packet) {\n break;\n }\n // We might need to skip the packet if it's a metadata one\n const skipPacket = currentPage.headerStartPos === startPosition.startPage.headerStartPos\n && currentSegmentIndex < startPosition.startSegmentIndex;\n if (!skipPacket) {\n let encodedPacket = this.createEncodedPacketFromOggPacket(packet, {\n timestampInSamples: currentTimestampInSamples,\n vorbisLastBlocksize: lastEncodedPacketMetadata?.vorbisBlockSize ?? null,\n }, options);\n assert(encodedPacket);\n let encodedPacketMetadata = this.encodedPacketToMetadata.get(encodedPacket);\n assert(encodedPacketMetadata);\n if (!currentTimestampIsCorrect\n && packet.endPage.headerStartPos === endPage.headerStartPos\n && packet.endSegmentIndex === endSegmentIndex) {\n // We know this packet end timestamp can be derived from the page's granule position\n currentTimestampInSamples = this.granulePositionToTimestampInSamples(currentPage.granulePosition);\n currentTimestampIsCorrect = true;\n // Let's backpatch the packet we just created with the correct timestamp\n encodedPacket = this.createEncodedPacketFromOggPacket(packet, {\n timestampInSamples: currentTimestampInSamples - encodedPacketMetadata.durationInSamples,\n vorbisLastBlocksize: lastEncodedPacketMetadata?.vorbisBlockSize ?? null,\n }, options);\n assert(encodedPacket);\n encodedPacketMetadata = this.encodedPacketToMetadata.get(encodedPacket);\n assert(encodedPacketMetadata);\n }\n else {\n currentTimestampInSamples += encodedPacketMetadata.durationInSamples;\n }\n lastEncodedPacket = encodedPacket;\n lastEncodedPacketMetadata = encodedPacketMetadata;\n if (currentTimestampIsCorrect\n && (\n // Next timestamp will be too late\n Math.max(currentTimestampInSamples, 0) > timestampInSamples\n // This timestamp already matches\n || Math.max(encodedPacketMetadata.timestampInSamples, 0) === timestampInSamples)) {\n break;\n }\n }\n const nextPosition = await this.demuxer.findNextPacketStart(reader, packet);\n if (!nextPosition) {\n break;\n }\n currentPage = nextPosition.startPage;\n currentSegmentIndex = nextPosition.startSegmentIndex;\n }\n return lastEncodedPacket;\n }\n finally {\n release();\n }\n }\n getKeyPacket(timestamp, options) {\n return this.getPacket(timestamp, options);\n }\n getNextKeyPacket(packet, options) {\n return this.getNextPacket(packet, options);\n }\n}\n/** Finds the start position of a packet given its end position. */\nconst findPacketStartPosition = (pageList, endPage, endSegmentIndex) => {\n let page = endPage;\n let segmentIndex = endSegmentIndex;\n outer: while (true) {\n segmentIndex--;\n for (segmentIndex; segmentIndex >= 0; segmentIndex--) {\n const lacingValue = page.lacingValues[segmentIndex];\n if (lacingValue < 255) {\n segmentIndex++; // We know the last packet starts here\n break outer;\n }\n }\n assert(segmentIndex === -1);\n const pageStartsWithFreshPacket = !(page.headerType & 0x01);\n if (pageStartsWithFreshPacket) {\n // Fast exit: We know we don't need to look in the previous page\n segmentIndex = 0;\n break;\n }\n const previousPage = findLast(pageList, x => x.headerStartPos < page.headerStartPos);\n if (!previousPage) {\n return null;\n }\n page = previousPage;\n segmentIndex = page.lacingValues.length;\n }\n assert(segmentIndex !== -1);\n if (segmentIndex === page.lacingValues.length) {\n // Wrap back around to the first segment of the next page\n const nextPage = pageList[pageList.indexOf(page) + 1];\n assert(nextPage);\n page = nextPage;\n segmentIndex = 0;\n }\n return { page, segmentIndex };\n};\n/** Finds the end position of a packet given the start position of the following packet. */\nconst findPreviousPacketEndPosition = (pageList, startPage, startSegmentIndex) => {\n if (startSegmentIndex > 0) {\n // Easy\n return { page: startPage, segmentIndex: startSegmentIndex - 1 };\n }\n const previousPage = findLast(pageList, x => x.headerStartPos < startPage.headerStartPos);\n if (!previousPage) {\n return null;\n }\n return { page: previousPage, segmentIndex: previousPage.lacingValues.length - 1 };\n};\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { IsobmffDemuxer } from './isobmff/isobmff-demuxer.js';\nimport { IsobmffReader } from './isobmff/isobmff-reader.js';\nimport { EBMLId, EBMLReader } from './matroska/ebml.js';\nimport { MatroskaDemuxer } from './matroska/matroska-demuxer.js';\nimport { Mp3Demuxer } from './mp3/mp3-demuxer.js';\nimport { FRAME_HEADER_SIZE } from './mp3/mp3-misc.js';\nimport { Mp3Reader } from './mp3/mp3-reader.js';\nimport { OggDemuxer } from './ogg/ogg-demuxer.js';\nimport { OggReader } from './ogg/ogg-reader.js';\nimport { RiffReader } from './wave/riff-reader.js';\nimport { WaveDemuxer } from './wave/wave-demuxer.js';\n/**\n * Base class representing an input media file format.\n * @public\n */\nexport class InputFormat {\n}\n/**\n * Format representing files compatible with the ISO base media file format (ISOBMFF), like MP4 or MOV files.\n * @public\n */\nexport class IsobmffInputFormat extends InputFormat {\n /** @internal */\n async _getMajorBrand(input) {\n const sourceSize = await input._mainReader.source.getSize();\n if (sourceSize < 12) {\n return null;\n }\n const isobmffReader = new IsobmffReader(input._mainReader);\n isobmffReader.pos = 4;\n const fourCc = isobmffReader.readAscii(4);\n if (fourCc !== 'ftyp') {\n return null;\n }\n return isobmffReader.readAscii(4);\n }\n /** @internal */\n _createDemuxer(input) {\n return new IsobmffDemuxer(input);\n }\n}\n/**\n * MPEG-4 Part 14 (MP4) file format.\n * @public\n */\nexport class Mp4InputFormat extends IsobmffInputFormat {\n /** @internal */\n async _canReadInput(input) {\n const majorBrand = await this._getMajorBrand(input);\n return !!majorBrand && majorBrand !== 'qt ';\n }\n get name() {\n return 'MP4';\n }\n get mimeType() {\n return 'video/mp4';\n }\n}\n/**\n * QuickTime File Format (QTFF), often called MOV.\n * @public\n */\nexport class QuickTimeInputFormat extends IsobmffInputFormat {\n /** @internal */\n async _canReadInput(input) {\n const majorBrand = await this._getMajorBrand(input);\n return majorBrand === 'qt ';\n }\n get name() {\n return 'QuickTime File Format';\n }\n get mimeType() {\n return 'video/quicktime';\n }\n}\n/**\n * Matroska file format.\n * @public\n */\nexport class MatroskaInputFormat extends InputFormat {\n /** @internal */\n async isSupportedEBMLOfDocType(input, desiredDocType) {\n const sourceSize = await input._mainReader.source.getSize();\n if (sourceSize < 8) {\n return false;\n }\n const ebmlReader = new EBMLReader(input._mainReader);\n const varIntSize = ebmlReader.readVarIntSize();\n if (varIntSize < 1 || varIntSize > 8) {\n return false;\n }\n const id = ebmlReader.readUnsignedInt(varIntSize);\n if (id !== EBMLId.EBML) {\n return false;\n }\n const dataSize = ebmlReader.readElementSize();\n if (dataSize === null) {\n return false; // Miss me with that shit\n }\n const startPos = ebmlReader.pos;\n while (ebmlReader.pos < startPos + dataSize) {\n const { id, size } = ebmlReader.readElementHeader();\n const dataStartPos = ebmlReader.pos;\n if (size === null)\n return false;\n switch (id) {\n case EBMLId.EBMLVersion:\n {\n const ebmlVersion = ebmlReader.readUnsignedInt(size);\n if (ebmlVersion !== 1) {\n return false;\n }\n }\n ;\n break;\n case EBMLId.EBMLReadVersion:\n {\n const ebmlReadVersion = ebmlReader.readUnsignedInt(size);\n if (ebmlReadVersion !== 1) {\n return false;\n }\n }\n ;\n break;\n case EBMLId.DocType:\n {\n const docType = ebmlReader.readString(size);\n if (docType !== desiredDocType) {\n return false;\n }\n }\n ;\n break;\n case EBMLId.DocTypeVersion:\n {\n const docTypeVersion = ebmlReader.readUnsignedInt(size);\n if (docTypeVersion > 4) { // Support up to Matroska v4\n return false;\n }\n }\n ;\n break;\n }\n ebmlReader.pos = dataStartPos + size;\n }\n return true;\n }\n /** @internal */\n _canReadInput(input) {\n return this.isSupportedEBMLOfDocType(input, 'matroska');\n }\n /** @internal */\n _createDemuxer(input) {\n return new MatroskaDemuxer(input);\n }\n get name() {\n return 'Matroska';\n }\n get mimeType() {\n return 'video/x-matroska';\n }\n}\n/**\n * WebM file format, based on Matroska.\n * @public\n */\nexport class WebMInputFormat extends MatroskaInputFormat {\n /** @internal */\n _canReadInput(input) {\n return this.isSupportedEBMLOfDocType(input, 'webm');\n }\n get name() {\n return 'WebM';\n }\n get mimeType() {\n return 'video/webm';\n }\n}\n/**\n * MP3 file format.\n * @public\n */\nexport class Mp3InputFormat extends InputFormat {\n /** @internal */\n async _canReadInput(input) {\n const sourceSize = await input._mainReader.source.getSize();\n if (sourceSize < 4) {\n return false;\n }\n const mp3Reader = new Mp3Reader(input._mainReader);\n mp3Reader.fileSize = sourceSize;\n const id3Tag = mp3Reader.readId3();\n if (id3Tag) {\n mp3Reader.pos += id3Tag.size;\n }\n const framesStartPos = mp3Reader.pos;\n await mp3Reader.reader.loadRange(mp3Reader.pos, mp3Reader.pos + 4096);\n const firstHeader = mp3Reader.readNextFrameHeader(Math.min(framesStartPos + 4096, sourceSize));\n if (!firstHeader) {\n return false;\n }\n if (id3Tag) {\n // If there was an ID3 tag at the start, we can be pretty sure this is MP3 by now\n return true;\n }\n // Fine, we found one frame header, but we're still not entirely sure this is MP3. Let's check if we can find\n // another header right after it:\n mp3Reader.pos = firstHeader.startPos + firstHeader.totalSize;\n await mp3Reader.reader.loadRange(mp3Reader.pos, mp3Reader.pos + FRAME_HEADER_SIZE);\n const secondHeader = mp3Reader.readNextFrameHeader(mp3Reader.pos + FRAME_HEADER_SIZE);\n if (!secondHeader) {\n return false;\n }\n // In a well-formed MP3 file, we'd expect these two frames to share some similarities:\n if (firstHeader.channel !== secondHeader.channel || firstHeader.sampleRate !== secondHeader.sampleRate) {\n return false;\n }\n // We have found two matching consecutive MP3 frames, a strong indicator that this is an MP3 file\n return true;\n }\n /** @internal */\n _createDemuxer(input) {\n return new Mp3Demuxer(input);\n }\n get name() {\n return 'MP3';\n }\n get mimeType() {\n return 'audio/mpeg';\n }\n}\n/**\n * WAVE file format, based on RIFF.\n * @public\n */\nexport class WaveInputFormat extends InputFormat {\n /** @internal */\n async _canReadInput(input) {\n const sourceSize = await input._mainReader.source.getSize();\n if (sourceSize < 12) {\n return false;\n }\n const riffReader = new RiffReader(input._mainReader);\n const riffType = riffReader.readAscii(4);\n if (riffType !== 'RIFF' && riffType !== 'RIFX' && riffType !== 'RF64') {\n return false;\n }\n riffReader.pos = 8;\n const format = riffReader.readAscii(4);\n return format === 'WAVE';\n }\n /** @internal */\n _createDemuxer(input) {\n return new WaveDemuxer(input);\n }\n get name() {\n return 'WAVE';\n }\n get mimeType() {\n return 'audio/wav';\n }\n}\n/**\n * Ogg file format.\n * @public\n */\nexport class OggInputFormat extends InputFormat {\n /** @internal */\n async _canReadInput(input) {\n const sourceSize = await input._mainReader.source.getSize();\n if (sourceSize < 4) {\n return false;\n }\n const oggReader = new OggReader(input._mainReader);\n return oggReader.readAscii(4) === 'OggS';\n }\n /** @internal */\n _createDemuxer(input) {\n return new OggDemuxer(input);\n }\n get name() {\n return 'Ogg';\n }\n get mimeType() {\n return 'application/ogg';\n }\n}\n/**\n * MP4 input format singleton.\n * @public\n */\nexport const MP4 = new Mp4InputFormat();\n/**\n * QuickTime File Format input format singleton.\n * @public\n */\nexport const QTFF = new QuickTimeInputFormat();\n/**\n * Matroska input format singleton.\n * @public\n */\nexport const MATROSKA = new MatroskaInputFormat();\n/**\n * WebM input format singleton.\n * @public\n */\nexport const WEBM = new WebMInputFormat();\n/**\n * MP3 input format singleton.\n * @public\n */\nexport const MP3 = new Mp3InputFormat();\n/**\n * WAVE input format singleton.\n * @public\n */\nexport const WAVE = new WaveInputFormat();\n/**\n * Ogg input format singleton.\n * @public\n */\nexport const OGG = new OggInputFormat();\n/**\n * List of all input format singletons. If you don't need to support all input formats, you should specify the\n * formats individually for better tree shaking.\n * @public\n */\nexport const ALL_FORMATS = [MP4, QTFF, MATROSKA, WEBM, WAVE, OGG, MP3];\n", "/*!\n * Copyright (c) 2025-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { InputFormat } from './input-format.js';\nimport { assert } from './misc.js';\nimport { Reader } from './reader.js';\nimport { Source } from './source.js';\n/**\n * Represents an input media file. This is the root object from which all media read operations start.\n * @public\n */\nexport class Input {\n constructor(options) {\n /** @internal */\n this._demuxerPromise = null;\n /** @internal */\n this._format = null;\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (!Array.isArray(options.formats) || options.formats.some(x => !(x instanceof InputFormat))) {\n throw new TypeError('options.formats must be an array of InputFormat.');\n }\n if (!(options.source instanceof Source)) {\n throw new TypeError('options.source must be a Source.');\n }\n this._formats = options.formats;\n this._source = options.source;\n this._mainReader = new Reader(options.source);\n }\n /** @internal */\n _getDemuxer() {\n return this._demuxerPromise ??= (async () => {\n await this._mainReader.loadRange(0, 4096); // Load the first 4 kiB so we can determine the format\n for (const format of this._formats) {\n const canRead = await format._canReadInput(this);\n if (canRead) {\n this._format = format;\n return format._createDemuxer(this);\n }\n }\n throw new Error('Input has an unsupported or unrecognizable format.');\n })();\n }\n /**\n * Returns the source from which this input file reads its data. This is the same source that was passed to the\n * constructor.\n */\n get source() {\n return this._source;\n }\n /**\n * Returns the format of the input file. You can compare this result directly to the InputFormat singletons or use\n * `instanceof` checks for subset-aware logic (for example, `format instanceof MatroskaInputFormat` is true for\n * both MKV and WebM).\n */\n async getFormat() {\n await this._getDemuxer();\n assert(this._format);\n return this._format;\n }\n /**\n * Computes the duration of the input file, in seconds. More precisely, returns the largest end timestamp among\n * all tracks.\n */\n async computeDuration() {\n const demuxer = await this._getDemuxer();\n return demuxer.computeDuration();\n }\n /** Returns the list of all tracks of this input file. */\n async getTracks() {\n const demuxer = await this._getDemuxer();\n return demuxer.getTracks();\n }\n /** Returns the list of all video tracks of this input file. */\n async getVideoTracks() {\n const tracks = await this.getTracks();\n return tracks.filter(x => x.isVideoTrack());\n }\n /** Returns the primary video track of this input file, or null if there are no video tracks. */\n async getPrimaryVideoTrack() {\n const tracks = await this.getTracks();\n return tracks.find(x => x.isVideoTrack()) ?? null;\n }\n /** Returns the list of all audio tracks of this input file. */\n async getAudioTracks() {\n const tracks = await this.getTracks();\n return tracks.filter(x => x.isAudioTrack());\n }\n /** Returns the primary audio track of this input file, or null if there are no audio tracks. */\n async getPrimaryAudioTrack() {\n const tracks = await this.getTracks();\n return tracks.find(x => x.isAudioTrack()) ?? null;\n }\n /** Returns the full MIME type of this input file, including track codecs. */\n async getMimeType() {\n const demuxer = await this._getDemuxer();\n return demuxer.getMimeType();\n }\n}\n", "import {WebMediaInfo} from \"web-demuxer\"\n\ntype Events =\n\t| {type: \"config\", config: {audio: AudioDecoderConfig, video: VideoDecoderConfig}}\n\t| {type: \"info\", data: WebMediaInfo}\n\t| {type: \"encoderQueueSize\", size: number}\n\ntype Handler = (event: Events) => void\n\nexport class Machina {\n\tcount = 0\n\n\t#handlers = new Map<number, Handler>()\n\n\tregister(id: number, handler: Handler) {\n\t\tthis.#handlers.set(id, handler)\n\t}\n\n\tunregister(id: number) {\n\t\tthis.#handlers.delete(id)\n\t}\n\n\tdispatch(id: number, event: Events) {\n\t\tthis.#handlers.get(id)?.(event)\n\t}\n}\n\n", "\nimport {Comrade} from \"@e280/comrade\"\nimport {Machina} from \"../parts/machina.js\"\nimport {DriverSchematic} from \"./schematic.js\"\n\nexport const setupDriverHost = (machina: Machina) => (\n\tComrade.host<DriverSchematic>(_shell => ({\n\t\tasync world() {\n\t\t\tmachina.count++\n\t\t},\n\t}))\n)\n\n", "import {BlobSource, UrlSource} from \"mediabunny\"\nimport {DecoderSource} from \"../fns/schematic.js\"\n\n// only streamable sources\nexport async function loadDecoderSource(source: DecoderSource): Promise<UrlSource | BlobSource> {\n\tif(source instanceof Blob) {\n\t\treturn new BlobSource(source)\n\t} else {\n\t\treturn new UrlSource(source)\n\t}\n}\n\n", "import {Comrade, tune, Thread} from \"@e280/comrade\"\nimport {ALL_FORMATS, Input, type StreamTargetChunk} from \"mediabunny\"\n\nimport {Machina} from \"./parts/machina.js\"\nimport {setupDriverHost} from \"./fns/host.js\"\nimport {loadDecoderSource} from \"./utils/load-decoder-source.js\"\nimport {DecoderInput, DriverSchematic, Composition, EncoderInput, DecoderSource} from \"./fns/schematic.js\"\n\nexport type DriverOptions = {\n\tworkerUrl: URL | string\n}\n\nexport class Driver {\n\tstatic async setup(options: DriverOptions) {\n\t\tconst machina = new Machina()\n\t\tconst thread = await Comrade.thread<DriverSchematic>({\n\t\t\tlabel: \"OmnitoolDriver\",\n\t\t\tworkerUrl: options.workerUrl,\n\t\t\tsetupHost: setupDriverHost(machina),\n\t\t})\n\t\treturn new this(machina, thread)\n\t}\n\n\tconstructor(\n\t\tpublic machina: Machina,\n\t\tpublic thread: Thread<DriverSchematic>\n\t) {}\n\n\tasync hello() {\n\t\treturn this.thread.work.hello()\n\t}\n\n\tasync getAudioDuration(source: DecoderSource) {\n\t\tconst input = new Input({\n\t\t\tsource: await loadDecoderSource(source),\n\t\t\tformats: ALL_FORMATS\n\t\t})\n\n\t\tconst audioTrack = await input.getPrimaryAudioTrack()\n\t\treturn await audioTrack?.computeDuration()\n\t}\n\n\tasync getVideoDuration(source: DecoderSource) {\n\t\tconst input = new Input({\n\t\t\tsource: await loadDecoderSource(source),\n\t\t\tformats: ALL_FORMATS\n\t\t})\n\n\t\tconst videoTrack = await input.getPrimaryVideoTrack()\n\t\treturn await videoTrack?.computeDuration()\n\t}\n\n\tdecode(input: DecoderInput) {\n\t\tlet lastFrame: VideoFrame | null = null\n\t\tconst videoTransform = new TransformStream<VideoFrame, VideoFrame>({\n\t\t\tasync transform(chunk, controller) {\n\t\t\t\tconst frame = await input.onFrame?.(chunk) ?? chunk\n\t\t\t\t// below code is to prevent mem leaks and hardware accelerated decoder stall\n\t\t\t\tlastFrame?.close()\n\t\t\t\tcontroller.enqueue(frame)\n\t\t\t\tlastFrame = frame\n\t\t\t}\n\t\t})\n\t\tconst audioTransform = new TransformStream<AudioData, AudioData>()\n\t\tthis.thread.work.decode[tune]({transfer: [videoTransform.writable, audioTransform.writable]})({\n\t\t\tsource: input.source,\n\t\t\tvideo: videoTransform.writable,\n\t\t\taudio: audioTransform.writable,\n\t\t})\n\t\treturn {\n\t\t\taudio: audioTransform.readable,\n\t\t\tvideo: videoTransform.readable\n\t\t}\n\t}\n\n\tasync encode({readables, config}: EncoderInput) {\n\t\tconst handle = await window.showSaveFilePicker()\n\t\tconst writable = await handle.createWritable()\n\t\t// making bridge because file picker writable is not transferable\n\t\tconst bridge = new WritableStream<StreamTargetChunk>({\n\t\t\tasync write(chunk) {\n\t\t\t\tawait writable.write(chunk)\n\t\t\t},\n\t\t\tasync close() {\n\t\t\t\tawait writable.close()\n\t\t\t}\n\t\t})\n\t\treturn await this.thread.work.encode[tune]({transfer: [readables.audio, readables.video, bridge]})({readables, config, bridge})\n\t}\n\n\tasync composite(\n\t\tcomposition: Composition,\n\t) {\n\t\tconst transfer = this.#collectTransferablesFromComposition(composition)\n\t\treturn await this.thread.work.composite[tune]({transfer})(composition)\n\t}\n\n\t#collectTransferablesFromComposition(composition: Composition) {\n\t\tconst transferables: Transferable[] = []\n\n\t\tconst visit = (node: Composition) => {\n\t\t\tif (Array.isArray(node)) {\n\t\t\t\tfor (const child of node)\n\t\t\t\t\tvisit(child)\n\t\t\t}\n\t\t\telse if (node && typeof node === 'object' && 'kind' in node) {\n\t\t\t\tif (node.kind === 'image' && node.frame instanceof VideoFrame)\n\t\t\t\t\ttransferables.push(node.frame)\n\t\t\t}\n\t\t}\n\n\t\tvisit(composition)\n\t\treturn transferables\n\t}\n}\n\n", "import {Driver} from \"./driver/driver.js\"\n\nconst workerUrl = new URL(\"../driver/driver.worker.bundle.min.js\", import.meta.url)\n\nexport const context = {\n\tdriver: Driver.setup({workerUrl})\n}\n", "function t(t,e,i,s){return new(i||(i=Promise))((function(n,r){function o(t){try{h(s.next(t))}catch(t){r(t)}}function a(t){try{h(s.throw(t))}catch(t){r(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(o,a)}h((s=s.apply(t,e||[])).next())}))}\"function\"==typeof SuppressedError&&SuppressedError;class e{constructor(){this.listeners={}}on(t,e,i){if(this.listeners[t]||(this.listeners[t]=new Set),this.listeners[t].add(e),null==i?void 0:i.once){const i=()=>{this.un(t,i),this.un(t,e)};return this.on(t,i),i}return()=>this.un(t,e)}un(t,e){var i;null===(i=this.listeners[t])||void 0===i||i.delete(e)}once(t,e){return this.on(t,e,{once:!0})}unAll(){this.listeners={}}emit(t,...e){this.listeners[t]&&this.listeners[t].forEach((t=>t(...e)))}}const i={decode:function(e,i){return t(this,void 0,void 0,(function*(){const t=new AudioContext({sampleRate:i});return t.decodeAudioData(e).finally((()=>t.close()))}))},createBuffer:function(t,e){return\"number\"==typeof t[0]&&(t=[t]),function(t){const e=t[0];if(e.some((t=>t>1||t<-1))){const i=e.length;let s=0;for(let t=0;t<i;t++){const i=Math.abs(e[t]);i>s&&(s=i)}for(const e of t)for(let t=0;t<i;t++)e[t]/=s}}(t),{duration:e,length:t[0].length,sampleRate:t[0].length/e,numberOfChannels:t.length,getChannelData:e=>null==t?void 0:t[e],copyFromChannel:AudioBuffer.prototype.copyFromChannel,copyToChannel:AudioBuffer.prototype.copyToChannel}}};function s(t,e){const i=e.xmlns?document.createElementNS(e.xmlns,t):document.createElement(t);for(const[t,n]of Object.entries(e))if(\"children\"===t&&n)for(const[t,e]of Object.entries(n))e instanceof Node?i.appendChild(e):\"string\"==typeof e?i.appendChild(document.createTextNode(e)):i.appendChild(s(t,e));else\"style\"===t?Object.assign(i.style,n):\"textContent\"===t?i.textContent=n:i.setAttribute(t,n.toString());return i}function n(t,e,i){const n=s(t,e||{});return null==i||i.appendChild(n),n}var r=Object.freeze({__proto__:null,createElement:n,default:n});const o={fetchBlob:function(e,i,s){return t(this,void 0,void 0,(function*(){const n=yield fetch(e,s);if(n.status>=400)throw new Error(`Failed to fetch ${e}: ${n.status} (${n.statusText})`);return function(e,i){t(this,void 0,void 0,(function*(){if(!e.body||!e.headers)return;const s=e.body.getReader(),n=Number(e.headers.get(\"Content-Length\"))||0;let r=0;const o=e=>t(this,void 0,void 0,(function*(){r+=(null==e?void 0:e.length)||0;const t=Math.round(r/n*100);i(t)})),a=()=>t(this,void 0,void 0,(function*(){let t;try{t=yield s.read()}catch(t){return}t.done||(o(t.value),yield a())}));a()}))}(n.clone(),i),n.blob()}))}};class a extends e{constructor(t){super(),this.isExternalMedia=!1,t.media?(this.media=t.media,this.isExternalMedia=!0):this.media=document.createElement(\"audio\"),t.mediaControls&&(this.media.controls=!0),t.autoplay&&(this.media.autoplay=!0),null!=t.playbackRate&&this.onMediaEvent(\"canplay\",(()=>{null!=t.playbackRate&&(this.media.playbackRate=t.playbackRate)}),{once:!0})}onMediaEvent(t,e,i){return this.media.addEventListener(t,e,i),()=>this.media.removeEventListener(t,e,i)}getSrc(){return this.media.currentSrc||this.media.src||\"\"}revokeSrc(){const t=this.getSrc();t.startsWith(\"blob:\")&&URL.revokeObjectURL(t)}canPlayType(t){return\"\"!==this.media.canPlayType(t)}setSrc(t,e){const i=this.getSrc();if(t&&i===t)return;this.revokeSrc();const s=e instanceof Blob&&(this.canPlayType(e.type)||!t)?URL.createObjectURL(e):t;if(i&&this.media.removeAttribute(\"src\"),s||t)try{this.media.src=s}catch(e){this.media.src=t}}destroy(){this.isExternalMedia||(this.media.pause(),this.media.remove(),this.revokeSrc(),this.media.removeAttribute(\"src\"),this.media.load())}setMediaElement(t){this.media=t}play(){return t(this,void 0,void 0,(function*(){return this.media.play()}))}pause(){this.media.pause()}isPlaying(){return!this.media.paused&&!this.media.ended}setTime(t){this.media.currentTime=Math.max(0,Math.min(t,this.getDuration()))}getDuration(){return this.media.duration}getCurrentTime(){return this.media.currentTime}getVolume(){return this.media.volume}setVolume(t){this.media.volume=t}getMuted(){return this.media.muted}setMuted(t){this.media.muted=t}getPlaybackRate(){return this.media.playbackRate}isSeeking(){return this.media.seeking}setPlaybackRate(t,e){null!=e&&(this.media.preservesPitch=e),this.media.playbackRate=t}getMediaElement(){return this.media}setSinkId(t){return this.media.setSinkId(t)}}class h extends e{constructor(t,e){super(),this.timeouts=[],this.isScrollable=!1,this.audioData=null,this.resizeObserver=null,this.lastContainerWidth=0,this.isDragging=!1,this.subscriptions=[],this.unsubscribeOnScroll=[],this.subscriptions=[],this.options=t;const i=this.parentFromOptionsContainer(t.container);this.parent=i;const[s,n]=this.initHtml();i.appendChild(s),this.container=s,this.scrollContainer=n.querySelector(\".scroll\"),this.wrapper=n.querySelector(\".wrapper\"),this.canvasWrapper=n.querySelector(\".canvases\"),this.progressWrapper=n.querySelector(\".progress\"),this.cursor=n.querySelector(\".cursor\"),e&&n.appendChild(e),this.initEvents()}parentFromOptionsContainer(t){let e;if(\"string\"==typeof t?e=document.querySelector(t):t instanceof HTMLElement&&(e=t),!e)throw new Error(\"Container not found\");return e}initEvents(){const t=t=>{const e=this.wrapper.getBoundingClientRect(),i=t.clientX-e.left,s=t.clientY-e.top;return[i/e.width,s/e.height]};if(this.wrapper.addEventListener(\"click\",(e=>{const[i,s]=t(e);this.emit(\"click\",i,s)})),this.wrapper.addEventListener(\"dblclick\",(e=>{const[i,s]=t(e);this.emit(\"dblclick\",i,s)})),!0!==this.options.dragToSeek&&\"object\"!=typeof this.options.dragToSeek||this.initDrag(),this.scrollContainer.addEventListener(\"scroll\",(()=>{const{scrollLeft:t,scrollWidth:e,clientWidth:i}=this.scrollContainer,s=t/e,n=(t+i)/e;this.emit(\"scroll\",s,n,t,t+i)})),\"function\"==typeof ResizeObserver){const t=this.createDelay(100);this.resizeObserver=new ResizeObserver((()=>{t().then((()=>this.onContainerResize())).catch((()=>{}))})),this.resizeObserver.observe(this.scrollContainer)}}onContainerResize(){const t=this.parent.clientWidth;t===this.lastContainerWidth&&\"auto\"!==this.options.height||(this.lastContainerWidth=t,this.reRender())}initDrag(){this.subscriptions.push(function(t,e,i,s,n=3,r=0,o=100){if(!t)return()=>{};const a=matchMedia(\"(pointer: coarse)\").matches;let h=()=>{};const l=l=>{if(l.button!==r)return;l.preventDefault(),l.stopPropagation();let d=l.clientX,c=l.clientY,u=!1;const p=Date.now(),m=s=>{if(s.preventDefault(),s.stopPropagation(),a&&Date.now()-p<o)return;const r=s.clientX,h=s.clientY,l=r-d,m=h-c;if(u||Math.abs(l)>n||Math.abs(m)>n){const s=t.getBoundingClientRect(),{left:n,top:o}=s;u||(null==i||i(d-n,c-o),u=!0),e(l,m,r-n,h-o),d=r,c=h}},f=e=>{if(u){const i=e.clientX,n=e.clientY,r=t.getBoundingClientRect(),{left:o,top:a}=r;null==s||s(i-o,n-a)}h()},g=t=>{t.relatedTarget&&t.relatedTarget!==document.documentElement||f(t)},v=t=>{u&&(t.stopPropagation(),t.preventDefault())},b=t=>{u&&t.preventDefault()};document.addEventListener(\"pointermove\",m),document.addEventListener(\"pointerup\",f),document.addEventListener(\"pointerout\",g),document.addEventListener(\"pointercancel\",g),document.addEventListener(\"touchmove\",b,{passive:!1}),document.addEventListener(\"click\",v,{capture:!0}),h=()=>{document.removeEventListener(\"pointermove\",m),document.removeEventListener(\"pointerup\",f),document.removeEventListener(\"pointerout\",g),document.removeEventListener(\"pointercancel\",g),document.removeEventListener(\"touchmove\",b),setTimeout((()=>{document.removeEventListener(\"click\",v,{capture:!0})}),10)}};return t.addEventListener(\"pointerdown\",l),()=>{h(),t.removeEventListener(\"pointerdown\",l)}}(this.wrapper,((t,e,i)=>{this.emit(\"drag\",Math.max(0,Math.min(1,i/this.wrapper.getBoundingClientRect().width)))}),(t=>{this.isDragging=!0,this.emit(\"dragstart\",Math.max(0,Math.min(1,t/this.wrapper.getBoundingClientRect().width)))}),(t=>{this.isDragging=!1,this.emit(\"dragend\",Math.max(0,Math.min(1,t/this.wrapper.getBoundingClientRect().width)))})))}getHeight(t,e){var i;const s=(null===(i=this.audioData)||void 0===i?void 0:i.numberOfChannels)||1;if(null==t)return 128;if(!isNaN(Number(t)))return Number(t);if(\"auto\"===t){const t=this.parent.clientHeight||128;return(null==e?void 0:e.every((t=>!t.overlay)))?t/s:t}return 128}initHtml(){const t=document.createElement(\"div\"),e=t.attachShadow({mode:\"open\"}),i=this.options.cspNonce&&\"string\"==typeof this.options.cspNonce?this.options.cspNonce.replace(/\"/g,\"\"):\"\";return e.innerHTML=`\\n <style${i?` nonce=\"${i}\"`:\"\"}>\\n :host {\\n user-select: none;\\n min-width: 1px;\\n }\\n :host audio {\\n display: block;\\n width: 100%;\\n }\\n :host .scroll {\\n overflow-x: auto;\\n overflow-y: hidden;\\n width: 100%;\\n position: relative;\\n }\\n :host .noScrollbar {\\n scrollbar-color: transparent;\\n scrollbar-width: none;\\n }\\n :host .noScrollbar::-webkit-scrollbar {\\n display: none;\\n -webkit-appearance: none;\\n }\\n :host .wrapper {\\n position: relative;\\n overflow: visible;\\n z-index: 2;\\n }\\n :host .canvases {\\n min-height: ${this.getHeight(this.options.height,this.options.splitChannels)}px;\\n }\\n :host .canvases > div {\\n position: relative;\\n }\\n :host canvas {\\n display: block;\\n position: absolute;\\n top: 0;\\n image-rendering: pixelated;\\n }\\n :host .progress {\\n pointer-events: none;\\n position: absolute;\\n z-index: 2;\\n top: 0;\\n left: 0;\\n width: 0;\\n height: 100%;\\n overflow: hidden;\\n }\\n :host .progress > div {\\n position: relative;\\n }\\n :host .cursor {\\n pointer-events: none;\\n position: absolute;\\n z-index: 5;\\n top: 0;\\n left: 0;\\n height: 100%;\\n border-radius: 2px;\\n }\\n </style>\\n\\n <div class=\"scroll\" part=\"scroll\">\\n <div class=\"wrapper\" part=\"wrapper\">\\n <div class=\"canvases\" part=\"canvases\"></div>\\n <div class=\"progress\" part=\"progress\"></div>\\n <div class=\"cursor\" part=\"cursor\"></div>\\n </div>\\n </div>\\n `,[t,e]}setOptions(t){if(this.options.container!==t.container){const e=this.parentFromOptionsContainer(t.container);e.appendChild(this.container),this.parent=e}!0!==t.dragToSeek&&\"object\"!=typeof this.options.dragToSeek||this.initDrag(),this.options=t,this.reRender()}getWrapper(){return this.wrapper}getWidth(){return this.scrollContainer.clientWidth}getScroll(){return this.scrollContainer.scrollLeft}setScroll(t){this.scrollContainer.scrollLeft=t}setScrollPercentage(t){const{scrollWidth:e}=this.scrollContainer,i=e*t;this.setScroll(i)}destroy(){var t,e;this.subscriptions.forEach((t=>t())),this.container.remove(),null===(t=this.resizeObserver)||void 0===t||t.disconnect(),null===(e=this.unsubscribeOnScroll)||void 0===e||e.forEach((t=>t())),this.unsubscribeOnScroll=[]}createDelay(t=10){let e,i;const s=()=>{e&&clearTimeout(e),i&&i()};return this.timeouts.push(s),()=>new Promise(((n,r)=>{s(),i=r,e=setTimeout((()=>{e=void 0,i=void 0,n()}),t)}))}convertColorValues(t){if(!Array.isArray(t))return t||\"\";if(t.length<2)return t[0]||\"\";const e=document.createElement(\"canvas\"),i=e.getContext(\"2d\"),s=e.height*(window.devicePixelRatio||1),n=i.createLinearGradient(0,0,0,s),r=1/(t.length-1);return t.forEach(((t,e)=>{const i=e*r;n.addColorStop(i,t)})),n}getPixelRatio(){return Math.max(1,window.devicePixelRatio||1)}renderBarWaveform(t,e,i,s){const n=t[0],r=t[1]||t[0],o=n.length,{width:a,height:h}=i.canvas,l=h/2,d=this.getPixelRatio(),c=e.barWidth?e.barWidth*d:1,u=e.barGap?e.barGap*d:e.barWidth?c/2:0,p=e.barRadius||0,m=a/(c+u)/o,f=p&&\"roundRect\"in i?\"roundRect\":\"rect\";i.beginPath();let g=0,v=0,b=0;for(let t=0;t<=o;t++){const o=Math.round(t*m);if(o>g){const t=Math.round(v*l*s),n=t+Math.round(b*l*s)||1;let r=l-t;\"top\"===e.barAlign?r=0:\"bottom\"===e.barAlign&&(r=h-n),i[f](g*(c+u),r,c,n,p),g=o,v=0,b=0}const a=Math.abs(n[t]||0),d=Math.abs(r[t]||0);a>v&&(v=a),d>b&&(b=d)}i.fill(),i.closePath()}renderLineWaveform(t,e,i,s){const n=e=>{const n=t[e]||t[0],r=n.length,{height:o}=i.canvas,a=o/2,h=i.canvas.width/r;i.moveTo(0,a);let l=0,d=0;for(let t=0;t<=r;t++){const r=Math.round(t*h);if(r>l){const t=a+(Math.round(d*a*s)||1)*(0===e?-1:1);i.lineTo(l,t),l=r,d=0}const o=Math.abs(n[t]||0);o>d&&(d=o)}i.lineTo(l,a)};i.beginPath(),n(0),n(1),i.fill(),i.closePath()}renderWaveform(t,e,i){if(i.fillStyle=this.convertColorValues(e.waveColor),e.renderFunction)return void e.renderFunction(t,i);let s=e.barHeight||1;if(e.normalize){const e=Array.from(t[0]).reduce(((t,e)=>Math.max(t,Math.abs(e))),0);s=e?1/e:1}e.barWidth||e.barGap||e.barAlign?this.renderBarWaveform(t,e,i,s):this.renderLineWaveform(t,e,i,s)}renderSingleCanvas(t,e,i,s,n,r,o){const a=this.getPixelRatio(),h=document.createElement(\"canvas\");h.width=Math.round(i*a),h.height=Math.round(s*a),h.style.width=`${i}px`,h.style.height=`${s}px`,h.style.left=`${Math.round(n)}px`,r.appendChild(h);const l=h.getContext(\"2d\");if(this.renderWaveform(t,e,l),h.width>0&&h.height>0){const t=h.cloneNode(),i=t.getContext(\"2d\");i.drawImage(h,0,0),i.globalCompositeOperation=\"source-in\",i.fillStyle=this.convertColorValues(e.progressColor),i.fillRect(0,0,h.width,h.height),o.appendChild(t)}}renderMultiCanvas(t,e,i,s,n,r){const o=this.getPixelRatio(),{clientWidth:a}=this.scrollContainer,l=i/o;let d=Math.min(h.MAX_CANVAS_WIDTH,a,l),c={};if(e.barWidth||e.barGap){const t=e.barWidth||.5,i=t+(e.barGap||t/2);d%i!=0&&(d=Math.floor(d/i)*i)}if(0===d)return;const u=i=>{if(i<0||i>=p)return;if(c[i])return;c[i]=!0;const o=i*d;let a=Math.min(l-o,d);if(e.barWidth||e.barGap){const t=e.barWidth||.5,i=t+(e.barGap||t/2);a=Math.floor(a/i)*i}if(a<=0)return;const h=t.map((t=>{const e=Math.floor(o/l*t.length),i=Math.floor((o+a)/l*t.length);return t.slice(e,i)}));this.renderSingleCanvas(h,e,a,s,o,n,r)},p=Math.ceil(l/d);if(!this.isScrollable){for(let t=0;t<p;t++)u(t);return}const m=this.scrollContainer.scrollLeft/l,f=Math.floor(m*p);if(u(f-1),u(f),u(f+1),p>1){const t=this.on(\"scroll\",(()=>{const{scrollLeft:t}=this.scrollContainer,e=Math.floor(t/l*p);Object.keys(c).length>h.MAX_NODES&&(n.innerHTML=\"\",r.innerHTML=\"\",c={}),u(e-1),u(e),u(e+1)}));this.unsubscribeOnScroll.push(t)}}renderChannel(t,e,i,s){var{overlay:n}=e,r=function(t,e){var i={};for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&e.indexOf(s)<0&&(i[s]=t[s]);if(null!=t&&\"function\"==typeof Object.getOwnPropertySymbols){var n=0;for(s=Object.getOwnPropertySymbols(t);n<s.length;n++)e.indexOf(s[n])<0&&Object.prototype.propertyIsEnumerable.call(t,s[n])&&(i[s[n]]=t[s[n]])}return i}(e,[\"overlay\"]);const o=document.createElement(\"div\"),a=this.getHeight(r.height,r.splitChannels);o.style.height=`${a}px`,n&&s>0&&(o.style.marginTop=`-${a}px`),this.canvasWrapper.style.minHeight=`${a}px`,this.canvasWrapper.appendChild(o);const h=o.cloneNode();this.progressWrapper.appendChild(h),this.renderMultiCanvas(t,r,i,a,o,h)}render(e){return t(this,void 0,void 0,(function*(){var t;this.timeouts.forEach((t=>t())),this.timeouts=[],this.canvasWrapper.innerHTML=\"\",this.progressWrapper.innerHTML=\"\",null!=this.options.width&&(this.scrollContainer.style.width=\"number\"==typeof this.options.width?`${this.options.width}px`:this.options.width);const i=this.getPixelRatio(),s=this.scrollContainer.clientWidth,n=Math.ceil(e.duration*(this.options.minPxPerSec||0));this.isScrollable=n>s;const r=this.options.fillParent&&!this.isScrollable,o=(r?s:n)*i;if(this.wrapper.style.width=r?\"100%\":`${n}px`,this.scrollContainer.style.overflowX=this.isScrollable?\"auto\":\"hidden\",this.scrollContainer.classList.toggle(\"noScrollbar\",!!this.options.hideScrollbar),this.cursor.style.backgroundColor=`${this.options.cursorColor||this.options.progressColor}`,this.cursor.style.width=`${this.options.cursorWidth}px`,this.audioData=e,this.emit(\"render\"),this.options.splitChannels)for(let i=0;i<e.numberOfChannels;i++){const s=Object.assign(Object.assign({},this.options),null===(t=this.options.splitChannels)||void 0===t?void 0:t[i]);this.renderChannel([e.getChannelData(i)],s,o,i)}else{const t=[e.getChannelData(0)];e.numberOfChannels>1&&t.push(e.getChannelData(1)),this.renderChannel(t,this.options,o,0)}Promise.resolve().then((()=>this.emit(\"rendered\")))}))}reRender(){if(this.unsubscribeOnScroll.forEach((t=>t())),this.unsubscribeOnScroll=[],!this.audioData)return;const{scrollWidth:t}=this.scrollContainer,{right:e}=this.progressWrapper.getBoundingClientRect();if(this.render(this.audioData),this.isScrollable&&t!==this.scrollContainer.scrollWidth){const{right:t}=this.progressWrapper.getBoundingClientRect();let i=t-e;i*=2,i=i<0?Math.floor(i):Math.ceil(i),i/=2,this.scrollContainer.scrollLeft+=i}}zoom(t){this.options.minPxPerSec=t,this.reRender()}scrollIntoView(t,e=!1){const{scrollLeft:i,scrollWidth:s,clientWidth:n}=this.scrollContainer,r=t*s,o=i,a=i+n,h=n/2;if(this.isDragging){const t=30;r+t>a?this.scrollContainer.scrollLeft+=t:r-t<o&&(this.scrollContainer.scrollLeft-=t)}else{(r<o||r>a)&&(this.scrollContainer.scrollLeft=r-(this.options.autoCenter?h:0));const t=r-i-h;e&&this.options.autoCenter&&t>0&&(this.scrollContainer.scrollLeft+=Math.min(t,10))}{const t=this.scrollContainer.scrollLeft,e=t/s,i=(t+n)/s;this.emit(\"scroll\",e,i,t,t+n)}}renderProgress(t,e){if(isNaN(t))return;const i=100*t;this.canvasWrapper.style.clipPath=`polygon(${i}% 0%, 100% 0%, 100% 100%, ${i}% 100%)`,this.progressWrapper.style.width=`${i}%`,this.cursor.style.left=`${i}%`,this.cursor.style.transform=`translateX(-${100===Math.round(i)?this.options.cursorWidth:0}px)`,this.isScrollable&&this.options.autoScroll&&this.scrollIntoView(t,e)}exportImage(e,i,s){return t(this,void 0,void 0,(function*(){const t=this.canvasWrapper.querySelectorAll(\"canvas\");if(!t.length)throw new Error(\"No waveform data\");if(\"dataURL\"===s){const s=Array.from(t).map((t=>t.toDataURL(e,i)));return Promise.resolve(s)}return Promise.all(Array.from(t).map((t=>new Promise(((s,n)=>{t.toBlob((t=>{t?s(t):n(new Error(\"Could not export image\"))}),e,i)})))))}))}}h.MAX_CANVAS_WIDTH=8e3,h.MAX_NODES=10;class l extends e{constructor(){super(...arguments),this.unsubscribe=()=>{}}start(){this.unsubscribe=this.on(\"tick\",(()=>{requestAnimationFrame((()=>{this.emit(\"tick\")}))})),this.emit(\"tick\")}stop(){this.unsubscribe()}destroy(){this.unsubscribe()}}class d extends e{constructor(t=new AudioContext){super(),this.bufferNode=null,this.playStartTime=0,this.playedDuration=0,this._muted=!1,this._playbackRate=1,this._duration=void 0,this.buffer=null,this.currentSrc=\"\",this.paused=!0,this.crossOrigin=null,this.seeking=!1,this.autoplay=!1,this.addEventListener=this.on,this.removeEventListener=this.un,this.audioContext=t,this.gainNode=this.audioContext.createGain(),this.gainNode.connect(this.audioContext.destination)}load(){return t(this,void 0,void 0,(function*(){}))}get src(){return this.currentSrc}set src(t){if(this.currentSrc=t,this._duration=void 0,!t)return this.buffer=null,void this.emit(\"emptied\");fetch(t).then((e=>{if(e.status>=400)throw new Error(`Failed to fetch ${t}: ${e.status} (${e.statusText})`);return e.arrayBuffer()})).then((e=>this.currentSrc!==t?null:this.audioContext.decodeAudioData(e))).then((e=>{this.currentSrc===t&&(this.buffer=e,this.emit(\"loadedmetadata\"),this.emit(\"canplay\"),this.autoplay&&this.play())}))}_play(){var t;if(!this.paused)return;this.paused=!1,null===(t=this.bufferNode)||void 0===t||t.disconnect(),this.bufferNode=this.audioContext.createBufferSource(),this.buffer&&(this.bufferNode.buffer=this.buffer),this.bufferNode.playbackRate.value=this._playbackRate,this.bufferNode.connect(this.gainNode);let e=this.playedDuration*this._playbackRate;(e>=this.duration||e<0)&&(e=0,this.playedDuration=0),this.bufferNode.start(this.audioContext.currentTime,e),this.playStartTime=this.audioContext.currentTime,this.bufferNode.onended=()=>{this.currentTime>=this.duration&&(this.pause(),this.emit(\"ended\"))}}_pause(){var t;this.paused=!0,null===(t=this.bufferNode)||void 0===t||t.stop(),this.playedDuration+=this.audioContext.currentTime-this.playStartTime}play(){return t(this,void 0,void 0,(function*(){this.paused&&(this._play(),this.emit(\"play\"))}))}pause(){this.paused||(this._pause(),this.emit(\"pause\"))}stopAt(t){const e=t-this.currentTime,i=this.bufferNode;null==i||i.stop(this.audioContext.currentTime+e),null==i||i.addEventListener(\"ended\",(()=>{i===this.bufferNode&&(this.bufferNode=null,this.pause())}),{once:!0})}setSinkId(e){return t(this,void 0,void 0,(function*(){return this.audioContext.setSinkId(e)}))}get playbackRate(){return this._playbackRate}set playbackRate(t){this._playbackRate=t,this.bufferNode&&(this.bufferNode.playbackRate.value=t)}get currentTime(){return(this.paused?this.playedDuration:this.playedDuration+(this.audioContext.currentTime-this.playStartTime))*this._playbackRate}set currentTime(t){const e=!this.paused;e&&this._pause(),this.playedDuration=t/this._playbackRate,e&&this._play(),this.emit(\"seeking\"),this.emit(\"timeupdate\")}get duration(){var t,e;return null!==(t=this._duration)&&void 0!==t?t:(null===(e=this.buffer)||void 0===e?void 0:e.duration)||0}set duration(t){this._duration=t}get volume(){return this.gainNode.gain.value}set volume(t){this.gainNode.gain.value=t,this.emit(\"volumechange\")}get muted(){return this._muted}set muted(t){this._muted!==t&&(this._muted=t,this._muted?this.gainNode.disconnect():this.gainNode.connect(this.audioContext.destination))}canPlayType(t){return/^(audio|video)\\//.test(t)}getGainNode(){return this.gainNode}getChannelData(){const t=[];if(!this.buffer)return t;const e=this.buffer.numberOfChannels;for(let i=0;i<e;i++)t.push(this.buffer.getChannelData(i));return t}}const c={waveColor:\"#999\",progressColor:\"#555\",cursorWidth:1,minPxPerSec:0,fillParent:!0,interact:!0,dragToSeek:!1,autoScroll:!0,autoCenter:!0,sampleRate:8e3};class u extends a{static create(t){return new u(t)}constructor(t){const e=t.media||(\"WebAudio\"===t.backend?new d:void 0);super({media:e,mediaControls:t.mediaControls,autoplay:t.autoplay,playbackRate:t.audioRate}),this.plugins=[],this.decodedData=null,this.stopAtPosition=null,this.subscriptions=[],this.mediaSubscriptions=[],this.abortController=null,this.options=Object.assign({},c,t),this.timer=new l;const i=e?void 0:this.getMediaElement();this.renderer=new h(this.options,i),this.initPlayerEvents(),this.initRendererEvents(),this.initTimerEvents(),this.initPlugins();const s=this.options.url||this.getSrc()||\"\";Promise.resolve().then((()=>{this.emit(\"init\");const{peaks:t,duration:e}=this.options;(s||t&&e)&&this.load(s,t,e).catch((()=>null))}))}updateProgress(t=this.getCurrentTime()){return this.renderer.renderProgress(t/this.getDuration(),this.isPlaying()),t}initTimerEvents(){this.subscriptions.push(this.timer.on(\"tick\",(()=>{if(!this.isSeeking()){const t=this.updateProgress();this.emit(\"timeupdate\",t),this.emit(\"audioprocess\",t),null!=this.stopAtPosition&&this.isPlaying()&&t>=this.stopAtPosition&&this.pause()}})))}initPlayerEvents(){this.isPlaying()&&(this.emit(\"play\"),this.timer.start()),this.mediaSubscriptions.push(this.onMediaEvent(\"timeupdate\",(()=>{const t=this.updateProgress();this.emit(\"timeupdate\",t)})),this.onMediaEvent(\"play\",(()=>{this.emit(\"play\"),this.timer.start()})),this.onMediaEvent(\"pause\",(()=>{this.emit(\"pause\"),this.timer.stop(),this.stopAtPosition=null})),this.onMediaEvent(\"emptied\",(()=>{this.timer.stop(),this.stopAtPosition=null})),this.onMediaEvent(\"ended\",(()=>{this.emit(\"timeupdate\",this.getDuration()),this.emit(\"finish\"),this.stopAtPosition=null})),this.onMediaEvent(\"seeking\",(()=>{this.emit(\"seeking\",this.getCurrentTime())})),this.onMediaEvent(\"error\",(()=>{var t;this.emit(\"error\",null!==(t=this.getMediaElement().error)&&void 0!==t?t:new Error(\"Media error\")),this.stopAtPosition=null})))}initRendererEvents(){this.subscriptions.push(this.renderer.on(\"click\",((t,e)=>{this.options.interact&&(this.seekTo(t),this.emit(\"interaction\",t*this.getDuration()),this.emit(\"click\",t,e))})),this.renderer.on(\"dblclick\",((t,e)=>{this.emit(\"dblclick\",t,e)})),this.renderer.on(\"scroll\",((t,e,i,s)=>{const n=this.getDuration();this.emit(\"scroll\",t*n,e*n,i,s)})),this.renderer.on(\"render\",(()=>{this.emit(\"redraw\")})),this.renderer.on(\"rendered\",(()=>{this.emit(\"redrawcomplete\")})),this.renderer.on(\"dragstart\",(t=>{this.emit(\"dragstart\",t)})),this.renderer.on(\"dragend\",(t=>{this.emit(\"dragend\",t)})));{let t;this.subscriptions.push(this.renderer.on(\"drag\",(e=>{if(!this.options.interact)return;let i;this.renderer.renderProgress(e),clearTimeout(t),this.isPlaying()?i=0:!0===this.options.dragToSeek?i=200:\"object\"==typeof this.options.dragToSeek&&void 0!==this.options.dragToSeek&&(i=this.options.dragToSeek.debounceTime),t=setTimeout((()=>{this.seekTo(e)}),i),this.emit(\"interaction\",e*this.getDuration()),this.emit(\"drag\",e)})))}}initPlugins(){var t;(null===(t=this.options.plugins)||void 0===t?void 0:t.length)&&this.options.plugins.forEach((t=>{this.registerPlugin(t)}))}unsubscribePlayerEvents(){this.mediaSubscriptions.forEach((t=>t())),this.mediaSubscriptions=[]}setOptions(t){this.options=Object.assign({},this.options,t),t.duration&&!t.peaks&&(this.decodedData=i.createBuffer(this.exportPeaks(),t.duration)),t.peaks&&t.duration&&(this.decodedData=i.createBuffer(t.peaks,t.duration)),this.renderer.setOptions(this.options),t.audioRate&&this.setPlaybackRate(t.audioRate),null!=t.mediaControls&&(this.getMediaElement().controls=t.mediaControls)}registerPlugin(t){if(this.plugins.includes(t))return t;t._init(this),this.plugins.push(t);const e=t.once(\"destroy\",(()=>{this.plugins=this.plugins.filter((e=>e!==t)),this.subscriptions=this.subscriptions.filter((t=>t!==e))}));return this.subscriptions.push(e),t}unregisterPlugin(t){this.plugins=this.plugins.filter((e=>e!==t)),t.destroy()}getWrapper(){return this.renderer.getWrapper()}getWidth(){return this.renderer.getWidth()}getScroll(){return this.renderer.getScroll()}setScroll(t){return this.renderer.setScroll(t)}setScrollTime(t){const e=t/this.getDuration();this.renderer.setScrollPercentage(e)}getActivePlugins(){return this.plugins}loadAudio(e,s,n,r){return t(this,void 0,void 0,(function*(){var t;if(this.emit(\"load\",e),!this.options.media&&this.isPlaying()&&this.pause(),this.decodedData=null,this.stopAtPosition=null,!s&&!n){const i=this.options.fetchParams||{};window.AbortController&&!i.signal&&(this.abortController=new AbortController,i.signal=null===(t=this.abortController)||void 0===t?void 0:t.signal);const n=t=>this.emit(\"loading\",t);s=yield o.fetchBlob(e,n,i);const r=this.options.blobMimeType;r&&(s=new Blob([s],{type:r}))}this.setSrc(e,s);const a=yield new Promise((t=>{const e=r||this.getDuration();e?t(e):this.mediaSubscriptions.push(this.onMediaEvent(\"loadedmetadata\",(()=>t(this.getDuration())),{once:!0}))}));if(!e&&!s){const t=this.getMediaElement();t instanceof d&&(t.duration=a)}if(n)this.decodedData=i.createBuffer(n,a||0);else if(s){const t=yield s.arrayBuffer();this.decodedData=yield i.decode(t,this.options.sampleRate)}this.decodedData&&(this.emit(\"decode\",this.getDuration()),this.renderer.render(this.decodedData)),this.emit(\"ready\",this.getDuration())}))}load(e,i,s){return t(this,void 0,void 0,(function*(){try{return yield this.loadAudio(e,void 0,i,s)}catch(t){throw this.emit(\"error\",t),t}}))}loadBlob(e,i,s){return t(this,void 0,void 0,(function*(){try{return yield this.loadAudio(\"\",e,i,s)}catch(t){throw this.emit(\"error\",t),t}}))}zoom(t){if(!this.decodedData)throw new Error(\"No audio loaded\");this.renderer.zoom(t),this.emit(\"zoom\",t)}getDecodedData(){return this.decodedData}exportPeaks({channels:t=2,maxLength:e=8e3,precision:i=1e4}={}){if(!this.decodedData)throw new Error(\"The audio has not been decoded yet\");const s=Math.min(t,this.decodedData.numberOfChannels),n=[];for(let t=0;t<s;t++){const s=this.decodedData.getChannelData(t),r=[],o=s.length/e;for(let t=0;t<e;t++){const e=s.slice(Math.floor(t*o),Math.ceil((t+1)*o));let n=0;for(let t=0;t<e.length;t++){const i=e[t];Math.abs(i)>Math.abs(n)&&(n=i)}r.push(Math.round(n*i)/i)}n.push(r)}return n}getDuration(){let t=super.getDuration()||0;return 0!==t&&t!==1/0||!this.decodedData||(t=this.decodedData.duration),t}toggleInteraction(t){this.options.interact=t}setTime(t){this.stopAtPosition=null,super.setTime(t),this.updateProgress(t),this.emit(\"timeupdate\",t)}seekTo(t){const e=this.getDuration()*t;this.setTime(e)}play(e,i){const s=Object.create(null,{play:{get:()=>super.play}});return t(this,void 0,void 0,(function*(){null!=e&&this.setTime(e);const t=yield s.play.call(this);return null!=i&&(this.media instanceof d?this.media.stopAt(i):this.stopAtPosition=i),t}))}playPause(){return t(this,void 0,void 0,(function*(){return this.isPlaying()?this.pause():this.play()}))}stop(){this.pause(),this.setTime(0)}skip(t){this.setTime(this.getCurrentTime()+t)}empty(){this.load(\"\",[[0]],.001)}setMediaElement(t){this.unsubscribePlayerEvents(),super.setMediaElement(t),this.initPlayerEvents()}exportImage(){return t(this,arguments,void 0,(function*(t=\"image/png\",e=1,i=\"dataURL\"){return this.renderer.exportImage(t,e,i)}))}destroy(){var t;this.emit(\"destroy\"),null===(t=this.abortController)||void 0===t||t.abort(),this.plugins.forEach((t=>t.destroy())),this.subscriptions.forEach((t=>t())),this.unsubscribePlayerEvents(),this.timer.destroy(),this.renderer.destroy(),super.destroy()}}u.BasePlugin=class extends e{constructor(t){super(),this.subscriptions=[],this.isDestroyed=!1,this.options=t}onInit(){}_init(t){this.isDestroyed&&(this.subscriptions=[],this.isDestroyed=!1),this.wavesurfer=t,this.onInit()}destroy(){this.emit(\"destroy\"),this.subscriptions.forEach((t=>t())),this.subscriptions=[],this.isDestroyed=!0,this.wavesurfer=void 0}},u.dom=r;export{u as default};\n", "import WaveSurfer from \"wavesurfer.js\"\n\nimport {context} from \"../../context.js\"\nimport {DecoderSource} from \"../../driver/fns/schematic.js\"\n\nexport class Waveform {\n\twavesurfer: WaveSurfer\n\n\tconstructor(peaks: number[], container: HTMLElement, duration: number) {\n\t\tthis.wavesurfer = WaveSurfer.create({\n \t\tcontainer,\n \t\twaveColor: 'rgb(200, 0, 200)',\n \t\tprogressColor: 'rgb(100, 0, 100)',\n \t\tbarWidth: 10,\n \t\tbarRadius: 10,\n \t\tbarGap: 2,\n \t\tpeaks: [peaks],\n \t\tduration\n\t\t})\n\t}\n\n\tstatic async init(source: DecoderSource, container: HTMLElement) {\n\t\tconst driver = await context.driver\n\t\tconst reader = driver.decode({ source }).audio.getReader()\n\n\t\tconst peaks: number[] = []\n\t\tlet buffer: number[] = []\n\t\tconst samplesPerPeak = 1024\n\t\tconst duration = await driver.getAudioDuration(source)\n\n\t\twhile (true) {\n\t\t\tconst {done, value: audioData} = await reader.read()\n\t\t\tif (done) break\n\n\t\t\tconst frames = audioData.numberOfFrames\n\t\t\tconst plane = new Float32Array(frames)\n\t\t\taudioData.copyTo(plane, {planeIndex: 0}) // Use left channel only\n\n\t\t\tfor (let i = 0; i < plane.length; i++) {\n\t\t\t\tbuffer.push(plane[i])\n\t\t\t\tif (buffer.length >= samplesPerPeak) {\n\t\t\t\t\tconst chunk = buffer.splice(0, samplesPerPeak)\n\t\t\t\t\tconst min = Math.min(...chunk)\n\t\t\t\t\tconst max = Math.max(...chunk)\n\t\t\t\t\tpeaks.push(min, max)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\taudioData.close()\n\t\t}\n\n\t\treturn new Waveform(peaks, container, duration ?? 0)\n\t}\n\n\t// set zoom(value: number) {\n\t// \tthis.wavesurfer.zoom(value)\n\t// }\n\n\tset width(value: number) {\n\t\tthis.wavesurfer.setOptions({width: value})\n\t}\n}\n", "import {Waveform} from \"../../timeline/parts/waveform.js\"\n\nexport async function waveformTest() {\n\tconst container = document.querySelector(\".waveform-demo\") as HTMLElement\n\tconst widthSlider = document.querySelector(\".width\") as HTMLInputElement\n\tconst waveform = await Waveform.init(\"/assets/temp/gl.mp4\", container)\n\n\twidthSlider.addEventListener(\"change\", () => {\n\t\tconst width = +widthSlider.value\n\t\twaveform.width = width\n\t})\n}\n", "import {\n\tALL_FORMATS,\n\tCanvasSink,\n\tCanvasSinkOptions,\n\tInput,\n\tInputVideoTrack,\n\tWrappedCanvas,\n} from \"mediabunny\"\n\nimport {DecoderSource} from '../../driver/fns/schematic.js'\nimport {loadDecoderSource} from '../../driver/utils/load-decoder-source.js'\n\nexport class Filmstrip {\n\t#sink: CanvasSink\n\t#cache: Map<number, WrappedCanvas> = new Map()\n\t#activeRange: TimeRange = [0, 0]\n\n\tprivate constructor(\n\t\tprivate videoTrack: InputVideoTrack,\n\t\tprivate options: Required<FilmstripOptions>\n\t) {\n\t\tthis.#sink = new CanvasSink(videoTrack, options.canvasSinkOptions)\n\t}\n\n\tstatic async init(source: DecoderSource, options: FilmstripOptions) {\n\t\tconst input = new Input({\n\t\t\tformats: ALL_FORMATS,\n\t\t\tsource: await loadDecoderSource(source)\n\t\t})\n\t\tconst videoTrack = await input.getPrimaryVideoTrack()\n\t\tif(videoTrack)\n\t\t\treturn new Filmstrip(\n\t\t\t\tvideoTrack, {\n\t\t\t\t\tfrequency: options.frequency ?? 1,\n\t\t\t\t\tcanvasSinkOptions: options.canvasSinkOptions ?? {width: 80, height: 50, fit: \"fill\"},\n\t\t\t\t\tonChange: options.onChange\n\t\t\t})\n\t\telse throw new Error(\"Source has no video track\")\n\t}\n\n\t/**\n \t* Sets the frequency (granularity) of filmstrip thumbnails.\n \t* Changing this triggers a filmstrip refresh after any ongoing update finishes.\n \t* @param value - The new frequency in seconds.\n \t*/\n\tset frequency(value: number) {\n\t\tif(value !== this.options.frequency) {\n\t\t\tthis.options.frequency = value\n\t\t\tthis.#update()\n\t\t}\n\t}\n\n\tget frequency() {\n\t\treturn this.options.frequency\n\t}\n\n\t#computeActiveRange([start, end]: TimeRange): TimeRange {\n\t\tconst tileSize = end - start\n\t\treturn [start - tileSize, end + tileSize]\n\t}\n\n\tasync #generateTiles() {\n\t\tconst [rangeStart, rangeEnd] = this.#activeRange\n\t\tconst neededTimestamps = new Set<number>()\n\n\t\t// duration should be computed but with trim etc also\n\t\tconst duration = await this.videoTrack.computeDuration()\n\t\tfor (\n\t\t\tlet timestamp = rangeStart;\n\t\t\ttimestamp <= rangeEnd;\n\t\t\ttimestamp += this.options.frequency\n\t\t) {\n\t\t\t// Clamp to valid time range\n\t\t\tif (timestamp >= 0 && timestamp <= duration)\n\t\t\t\tneededTimestamps.add(+timestamp.toFixed(3))\n\t\t}\n\n\t\tconst missingTimestamps = [...neededTimestamps]\n\t\t\t.filter(t => !this.#cache.has(t))\n\n\t\tlet i = 0\n\t\tfor await (const canvas of this.#sink.canvasesAtTimestamps(missingTimestamps)) {\n\t\t\tif(canvas) {\n\t\t\t\tconst requestedTime = missingTimestamps[i++]\n\t\t\t\tthis.#cache.set(requestedTime, canvas)\n\t\t\t}\n\t\t}\n\n\t\t// Dispose canvases outside the new range\n\t\tfor (const key of this.#cache.keys()) {\n\t\t\tif (!neededTimestamps.has(key)) {\n\t\t\t\tthis.#cache.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst tiles = [...this.#cache.entries()]\n\t\t\t.map(([time, canvas]) => ({time, canvas}))\n\t\tthis.options.onChange(tiles)\n\t}\n\n\t/**\n \t* Updates the visible time range for the filmstrip.\n \t*\n \t* Triggers a thumbnails update, with extended margins to preload\n \t* thumbnails slightly outside the visible range.\n \t* @param visibleRange - The current timeline viewport as a [start, end] tuple in seconds.\n \t*/\n\tset range(visibleRange: TimeRange) {\n\t\tconst newRange = this.#computeActiveRange(visibleRange)\n\t\t// Avoid redundant updates\n\t\tif (\n\t\t\tthis.#activeRange[0] === newRange[0] &&\n\t\t\tthis.#activeRange[1] === newRange[1]\n\t\t)\n\t\t\treturn\n\n\t\tthis.#activeRange = newRange\n\t\tthis.#update()\n\t}\n\n\t#updating: Promise<void> | null = null\n\t#shouldRunAgain = false\n\n\tasync #update() {\n\t\t// Perform update immediately. If multiple updates are requested while updating,\n\t\t// only the latest one will run after the current finishes (skips intermediate ones).\n\t\tif(this.#updating) {\n\t\t\tthis.#shouldRunAgain = true\n\t\t\treturn\n\t\t}\n\n\t\tthis.#updating = this.#generateTiles()\n\t\tawait this.#updating\n\t\tthis.#updating = null\n\n\t\tif(this.#shouldRunAgain) {\n\t\t\tthis.#shouldRunAgain = false\n\t\t\tawait this.#update()\n\t\t}\n\t}\n\t/**\n \t* Returns the cached thumbnail (if any) for a given timestamp.\n \t* @param time - The timestamp to retrieve the canvas for.\n \t*/\n\tgetThumbnail(time: number) {\n\t\treturn this.#cache.get(time)\n\t}\n}\n\ntype TimeRange = [number, number]\n\ninterface FilmstripOptions {\n\tfrequency?: number\n\tcanvasSinkOptions?: CanvasSinkOptions\n\tonChange: (tiles: {\n\t\ttime: number\n\t\tcanvas: WrappedCanvas\n\t}[]) => void\n}\n", "import {Filmstrip} from \"../../timeline/parts/filmstrip.js\"\n\nexport async function filmstripTest(file: File) {\n\tconst rangeSlider = document.querySelector(\".range\") as HTMLInputElement\n\tconst rangeView = document.querySelector(\".range-view\")!\n\tconst rangeSizeSlider = document.querySelector(\".range-size\")! as HTMLInputElement\n\tconst frequencySlider = document.querySelector(\".frequency\")! as HTMLInputElement\n\tconst frequencyView = document.querySelector(\".frequency-view\")!\n\tconst container = document.querySelector(\"#filmstrip\")!\n\tconst FPS_10 = 1000/10 / 1000\n\tlet rangeSize = 0.5\n\tconst filmstrip = await Filmstrip.init(\n\t\t\tfile,\n\t\t\t{\n\t\t\t\tonChange(tiles) {\n\t\t\t\t\t// Sort by time (optional, for clean ordering)\n\t\t\t\t\tconst sorted = tiles.sort((a, b) => a.time - b.time)\n\t\t\t\t\t// Clear previous thumbnails\n\t\t\t\t\tcontainer.replaceChildren(\n\t\t\t\t\t\t...sorted.map(({ time, canvas }) => createLabeledCanvas(time, canvas.canvas as HTMLCanvasElement))\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\tfrequency: FPS_10,\n\t\t\t\tcanvasSinkOptions: {\n\t\t\t\t\twidth: 80,\n\t\t\t\t\theight: 50,\n\t\t\t\t\tfit: \"fill\"\n\t\t\t\t}\n\t\t\t}\n\t\t)\n\trangeSizeSlider.addEventListener(\"change\", () => {\n\t\trangeSize = +rangeSizeSlider.value\n\t\tconst [start, end] = [+rangeSlider.value, +rangeSlider.value+rangeSize]\n\t\tfilmstrip.range = [start, end]\n\t\trangeView.textContent = `visible time range: [${start}, ${end}]`\n\t})\n\trangeSlider.addEventListener(\"change\", () => {\n\t\tconst [start, end] = [+rangeSlider.value, +rangeSlider.value+rangeSize]\n\t\tfilmstrip.range = [start, end]\n\t\trangeView.textContent = `visible time range: [${start}, ${end}]`\n\t})\n\tfrequencySlider.addEventListener(\"change\", () => {\n\t\tfilmstrip.frequency = 1000/+frequencySlider.value/1000\n\t\tfrequencyView.textContent = `frame every ${filmstrip.frequency.toFixed(3)} second (${frequencySlider.value} frames per second)`\n\t})\n\tfilmstrip.range = [10, 10.5]\n}\n\nfunction createLabeledCanvas(time: number, canvas: HTMLCanvasElement) {\n\tconst wrapper = document.createElement('div')\n\twrapper.style.position = 'relative'\n\twrapper.style.display = 'inline-block'\n\twrapper.style.marginRight = '4px'\n\twrapper.appendChild(canvas)\n\tconst label = document.createElement('div')\n\tlabel.textContent = `${time.toFixed(2)}s`\n\tlabel.style.position = 'absolute'\n\tlabel.style.top = '2px'\n\tlabel.style.right = '4px'\n\tlabel.style.fontSize = '10px'\n\tlabel.style.color = 'white'\n\tlabel.style.background = 'rgba(0,0,0,0.6)'\n\tlabel.style.padding = '2px 4px'\n\tlabel.style.borderRadius = '4px'\n\tlabel.style.pointerEvents = 'none'\n\twrapper.appendChild(label)\n\treturn wrapper\n}\n", "\nimport {Driver} from \"../../../../driver/driver.js\"\n\nexport async function prepAudio(driver: Driver, source: Blob) {\n\tconst arrayBuffer = await source.arrayBuffer()\n\tconst audioCTX = new AudioContext({sampleRate: 16000})\n\tconst audioData = await audioCTX.decodeAudioData(arrayBuffer)\n\tlet audio: Float32Array\n\tif (audioData.numberOfChannels === 2) {\n\t\tconst SCALING_FACTOR = Math.sqrt(2)\n\t\tconst left = audioData.getChannelData(0)\n\t\tconst right = audioData.getChannelData(1)\n\t\taudio = new Float32Array(left.length)\n\t\tfor (let i = 0; i < audioData.length; ++i) {\n\t\t\taudio[i] = (SCALING_FACTOR * (left[i] + right[i])) / 2\n\t\t}\n\t} else {\n\t\taudio = audioData.getChannelData(0)\n\t}\n\tconst duration = await driver.getAudioDuration(source)\n\treturn {audio, duration}\n}\n\n", "\nimport {Comrade} from \"@e280/comrade\"\nimport {coalesce, queue, sub} from \"@e280/stz\"\n\nimport {prepAudio} from \"./parts/prep-audio.js\"\nimport {TranscriberOptions, TranscriberSchematic, TranscriptionOptions, TranscriptionReport} from \"./types.js\"\n\nexport async function makeTranscriber({driver, spec, workerUrl, onLoading}: TranscriberOptions) {\n\tconst onReport = sub<[report: TranscriptionReport]>()\n\tconst onTranscription = sub<[transcription: string]>()\n\n\tconst thread = await Comrade.thread<TranscriberSchematic>({\n\t\tlabel: \"OmnitoolSpeechTranscriber\",\n\t\tworkerUrl,\n\t\tsetupHost: () => ({\n\t\t\tloading: async loading => onLoading(loading),\n\t\t\tdeliverReport: async report => onReport.pub(report),\n\t\t\tdeliverTranscription: async transcription => onTranscription.pub(transcription),\n\t\t}),\n\t})\n\n\tawait thread.work.prepare(spec)\n\n\treturn {\n\t\ttranscribe: queue(async(info: TranscriptionOptions) => {\n\t\t\tconst {source, language} = info\n\t\t\tconst {audio, duration} = await prepAudio(driver, source)\n\n\t\t\tconst detachCallbacks = coalesce(\n\t\t\t\tonReport(info.onReport),\n\t\t\t\tonTranscription(info.onTranscription),\n\t\t\t)\n\n\t\t\tconst result = await thread.work.transcribe({\n\t\t\t\tduration,\n\t\t\t\tlanguage,\n\t\t\t\taudio: audio.buffer,\n\t\t\t})\n\n\t\t\tdetachCallbacks()\n\t\t\treturn result\n\t\t}),\n\t\tdispose: thread.terminate()\n\t}\n}\n\n", "import {Driver} from \"../../driver/driver.js\"\nimport {makeTranscriber} from \"../../features/speech/transcribe/transcriber.js\"\n\nexport async function transcriberTest(driver: Driver) {\n\tconst transcriber = await makeTranscriber({\n\t\tdriver,\n\t\tspec: {\n\t\t\tmodel: \"onnx-community/whisper-tiny_timestamped\",\n\t\t\tdevice: \"webgpu\",\n\t\t\tstrideLength: 5,\n\t\t\tchunkLength: 30,\n\t\t\tdtype: \"fp32\"\n\t\t},\n\t\tworkerUrl: new URL(\"/features/speech/transcribe/worker.bundle.min.js\", import.meta.url),\n\t\tonLoading({progress, total}) {\n\t \tconsole.log(progress, total, \"total\")\n\t\t},\n\t})\n\treturn {\n\t\ttranscribe: async (file: File) => {\n\t\t\tconst result = await transcriber.transcribe({\n\t\t\t\tsource: file,\n\t\t\t\tlanguage: \"english\",\n\t\t\t\tonReport(report) {\n\t \t\t\tconsole.log(\"report\", report)\n\t\t\t\t},\n\t\t\t\tonTranscription(transcription) {\n\t \t\t\tconsole.log(\"transcript\", transcription)\n\t\t\t\t}\n\t\t\t})\n\t\t\tconsole.log(result, \"transcript result\")\n\t\t}\n\t}\n}\n", "import {Driver} from \"../../driver/driver.js\"\nimport {DecoderSource} from \"../../driver/fns/schematic.js\"\n\nexport function setupTranscodeTest(driver: Driver, source: DecoderSource) {\n\tconst dimensions = {width: 1920, height: 1080}\n\n\tconst canvas = document.createElement(\"canvas\")\n\tcanvas.width = dimensions.width\n\tcanvas.height = dimensions.height\n\tconst ctx = canvas.getContext(\"2d\")\n\n\tasync function run() {\n\t\tconst readables = driver.decode({\n\t\t\tsource,\n\t\t\tasync onFrame(frame) {\n\t\t\t\tconst composed = await driver.composite([\n\t\t\t\t\t{\n\t\t\t\t\t\tkind: \"image\",\n\t\t\t\t\t\tframe\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tkind: \"text\",\n\t\t\t\t\t\tcontent: \"omnitool\",\n\t\t\t\t\t\tfontSize: 50,\n\t\t\t\t\t\tcolor: \"green\"\n\t\t\t\t\t}\n\t\t\t\t])\n\t\t\t\tframe.close()\n\t\t\t\tctx?.drawImage(composed, 0, 0)\n\t\t\t\treturn composed\n\t\t\t}\n\t\t})\n\n\t\tawait driver.encode({\n\t\t\treadables,\n\t\t\tconfig: {\n\t\t\t\taudio: {codec: \"opus\", bitrate: 128000},\n\t\t\t\tvideo: {codec: \"vp9\", bitrate: 1000000}\n\t\t\t}\n\t\t})\n\t}\n\n\treturn {canvas, run}\n}\n", "\nimport {context} from \"../context.js\"\nimport {waveformTest} from \"./routines/waveform-test.js\"\nimport {filmstripTest} from \"./routines/filmstrip-test.js\"\nimport {transcriberTest} from \"./routines/transcriber-test.js\"\nimport {setupTranscodeTest} from \"./routines/transcode-test.js\"\n\nconst driver = await context.driver\nconst results = document.querySelector(\".results\")!\n\nconst fetchButton = document.querySelector(\".fetch\")\nconst importButton = document.querySelector(\".import\") as HTMLButtonElement\n\nfetchButton?.addEventListener(\"click\", startDemoFetch)\nimportButton?.addEventListener(\"click\", startDemoImport)\n\nwaveformTest()\nconst transcriber = await transcriberTest(driver)\n\n// hello world test\n{\n\tawait driver.thread.work.hello()\n\tif (driver.machina.count === 1) console.log(\"\u2705 driver works\")\n\telse console.error(\"\u274C FAIL driver call didn't work\")\n}\n\n// transcoding tests\nasync function startDemoImport()\n{\n\tconst [fileHandle] = await window.showOpenFilePicker()\n\tconst file = await fileHandle.getFile()\n\tconst transcode = setupTranscodeTest(driver, file)\n\tawait filmstripTest(file)\n\trun(transcode, fileHandle.name)\n\tawait transcriber.transcribe(file)\n}\n\nasync function startDemoFetch()\n{\n\n\t// which videos to run tests on\n\tconst videos = [\n\t\t\"/assets/temp/gl.mp4\",\n\t]\n\n\t// running each test in sequence\n\tfor (const url of videos) {\n\t\tconst transcode = setupTranscodeTest(driver, \"/assets/temp/gl.mp4\")\n\t\trun(transcode, url)\n\t}\n}\n\nasync function run(transcode: ReturnType<typeof setupTranscodeTest>, label: string) {\n\t// create result div\n\tconst div = document.createElement(\"div\")\n\tresults.append(div)\n\n\t// add video label\n\tconst p = document.createElement(\"p\")\n\tp.textContent = label\n\tdiv.append(p)\n\n\t// add the canvas to dom\n\tdiv.append(transcode.canvas)\n\n\t// run the test\n\tawait transcode.run()\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["bindTap", "tap", "ctx", "o", "basicTheme", "colors", "autoTheme", "basicTheme", "codes", "colorFns", "s", "uncolor", "mix", "hex", "rgb", "bgRgb", "fn", "bigint", "r", "g", "b", "c", "code", "codes", "colorless", "codes", "key", "s", "colorFns", "colorful", "codes", "key", "code", "s", "colorFns", "isDeno", "isNode", "isColorSupported", "autoColors", "isColorSupported", "colorful", "colorless", "errorsShaper", "colors", "theme", "palette", "errstring", "error", "stack", "processErrors", "item", "processAll", "items", "combineShapers", "shapers", "context", "items", "shaper", "defaultTimestampOptions", "timestampShaper", "options", "colors", "theme", "opts", "palette", "date", "year", "month", "day", "calendar", "hour", "minute", "second", "milliseconds", "clock", "stamp", "items", "autoShaper", "combineShapers", "errorsShaper", "timestampShaper", "denoWriter", "line", "nodeWriter", "line", "consoleWriter", "line", "autoWriter", "isDeno", "denoWriter", "isNode", "nodeWriter", "consoleWriter", "voidWriter", "noneShaper", "items", "Logger", "_Logger", "autoWriter", "voidWriter", "denoWriter", "nodeWriter", "consoleWriter", "autoColors", "colorful", "colorless", "autoTheme", "basicTheme", "autoShaper", "noneShaper", "errorsShaper", "timestampShaper", "items", "writer", "colors", "theme", "shapers", "combineShapers", "LoggerTap", "Logger", "request", "context", "g", "#context", "error", "meta", "label", "remote", "cRemote", "cLocal", "#meta", "headers", "ErrorTap", "LoggerTap", "Bytes", "a", "b", "i", "count", "Hex", "bytes", "byte", "string", "i", "byteCount", "Bytes", "base", "characters", "Base58", "bytes", "intVal", "Hex", "encoded", "remainder", "byte", "string", "char", "index", "hex", "leadingZeroes", "decoded", "count", "Bytes", "BaseX", "lexicon", "char", "i", "s", "bitsPerChar", "bitBuffer", "bitCount", "output", "val", "num", "base", "negative", "out", "bytes", "byte", "index", "n", "value", "count", "Bytes", "Base64", "bytes", "string", "char", "count", "Bytes", "Txt", "bytes", "string", "is", "x", "queue", "fn", "last", "args", "job", "current", "coalesce", "fns", "a", "fn", "DeadlineError", "milliseconds", "deadline", "fn", "resolve", "reject", "id", "defer", "resolve", "reject", "promise", "res", "rej", "entangle", "outside", "drill", "object", "path", "current", "key", "is", "ob", "o", "transform", "obMap", "predicate", "obFilter", "key", "value", "xub", "set", "sub", "fn", "pub", "a", "next", "promise", "resolve", "defer", "unsubscribe", "clear", "listener", "Trash", "#fns", "fns", "x", "fn", "JsonRpc", "getId", "request", "ExposedError", "RemoteError", "execute", "tap", "request", "action", "id", "JsonRpc", "result", "error", "ExposedError", "makeEndpoint", "options", "tap", "ErrorTap", "request", "path", "fn", "drill", "action", "execute", "tune", "query", "notify", "settings", "remoteProxy", "executor", "recurse", "path", "currentSettings", "_", "_this", "args", "target", "key", "value", "makeRemote", "options", "endpoint", "tap", "ErrorTap", "id", "remoteProxy", "path", "params", "settings", "notify", "transfer", "base", "request", "response", "RemoteError", "makeMock", "options", "makeRemote", "makeEndpoint", "Conduit", "pub", "origin", "a", "b", "disposers", "data", "fn", "onMessage", "channel", "fn", "makeRemoteEndpoint", "waiter", "sendRequest", "request", "transfer", "done", "defer", "response", "interpretIncoming", "json", "requests", "responses", "item", "handleIncomingRequests", "localEndpoint", "PostableConduit", "Conduit", "#trash", "Trash", "channel", "m", "transfer", "onMessage", "e", "MessengerMeta", "remote", "defaults", "ResponseWaiter", "timeout", "id", "method", "deferred", "defer", "deadline", "error", "DeadlineError", "response", "pend", "RemoteError", "Messenger", "#waiter", "#trash", "Trash", "options", "conduit", "tap", "ResponseWaiter", "defaults", "makeRemoteEndpoint", "makeRemote", "bindTap", "m", "incoming", "meta", "MessengerMeta", "rpc", "requests", "responses", "interpretIncoming", "response", "fns", "endpoint", "makeEndpoint", "outgoing", "handleIncomingRequests", "shells", "meta", "t", "defaultTap", "ErrorTap", "worker", "compat", "setupWork", "options", "tap", "defaultTap", "messenger", "Messenger", "PostableConduit", "m", "shells", "Thread", "worker", "messenger", "compat", "options", "tap", "defaultTap", "label", "readyprom", "defer", "infra", "Messenger", "PostableConduit", "m", "shells", "Cluster", "compat", "options", "workerCount", "threads", "_", "index", "Thread", "#available", "#tasks", "tap", "defaultTap", "remoteEndpoint", "request", "special", "#scheduleTask", "defer", "makeRemote", "t", "thread", "task", "#distributeTasks", "callprom", "setupComrade", "compat", "options", "Thread", "Cluster", "setupWork", "worker", "fn", "setupHost", "tap", "defaultTap", "hostShell", "shells", "workShell", "makeMock", "setupBrowserCompat", "count", "url", "name", "compat", "setupBrowserCompat", "Comrade", "setupComrade", "assert", "x", "normalizeRotation", "rotation", "mappedRotation", "last", "arr", "Bitstream", "_Bitstream", "bytes", "byteOffset", "byteIndex", "byte", "bitIndex", "bit", "n", "result", "i", "clone", "readExpGolomb", "bitstream", "leadingZeroBits", "readSignedExpGolomb", "codeNum", "toUint8Array", "source", "toDataView", "textEncoder", "invertObject", "object", "key", "value", "COLOR_PRIMARIES_MAP", "COLOR_PRIMARIES_MAP_INVERSE", "TRANSFER_CHARACTERISTICS_MAP", "TRANSFER_CHARACTERISTICS_MAP_INVERSE", "MATRIX_COEFFICIENTS_MAP", "MATRIX_COEFFICIENTS_MAP_INVERSE", "isAllowSharedBufferSource", "x", "AsyncMutex", "resolver", "nextPromise", "resolve", "currentPromiseAlias", "bytesToHexString", "bytes", "reverseBitsU32", "binarySearchExact", "arr", "key", "valueGetter", "low", "high", "ans", "mid", "midVal", "binarySearchLessOrEqual", "promiseWithResolvers", "reject", "res", "rej", "removeItem", "item", "index", "findLast", "predicate", "i", "findLastIndex", "toAsyncIterator", "source", "validateAnyIterable", "iterable", "assertNever", "mapAsyncGenerator", "generator", "map", "result", "error", "UNDETERMINED_LANGUAGE", "roundToPrecision", "value", "digits", "factor", "roundToMultiple", "multiple", "ilog", "x", "ret", "ISO_639_2_REGEX", "isIso639Dash2LanguageCode", "SECOND_TO_MICROSECOND_FACTOR", "mergeObjectsDeeply", "a", "b", "result", "key", "retriedFetch", "url", "requestInit", "getRetryDelay", "attempts", "error", "retryDelayInSeconds", "resolve", "CallSerializer", "fn", "customVideoDecoders", "customAudioDecoders", "PCM_AUDIO_CODECS", "NON_PCM_AUDIO_CODECS", "AUDIO_CODECS", "VP9_LEVEL_TABLE", "VP9_DEFAULT_SUFFIX", "AV1_DEFAULT_SUFFIX", "extractVideoCodecString", "trackInfo", "codec", "codecDescription", "colorSpace", "avcCodecInfo", "hevcCodecInfo", "vp9CodecInfo", "av1CodecInfo", "bytes", "bytesToHexString", "generalProfileSpace", "generalProfileIdc", "compatibilityFlags", "generalTierFlag", "generalLevelIdc", "constraintFlags", "reverseBitsU32", "view", "toDataView", "profileByte", "i", "codecString", "x", "pictureSize", "level", "last", "VP9_LEVEL_TABLE", "entry", "profile", "bitDepth", "chromaSubsampling", "colourPrimaries", "transferCharacteristics", "matrixCoefficients", "videoFullRangeFlag", "string", "VP9_DEFAULT_SUFFIX", "tier", "monochrome", "colorPrimaries", "COLOR_PRIMARIES_MAP", "TRANSFER_CHARACTERISTICS_MAP", "MATRIX_COEFFICIENTS_MAP", "AV1_DEFAULT_SUFFIX", "extractAudioCodecString", "trackInfo", "codec", "codecDescription", "aacCodecInfo", "parseAacAudioSpecificConfig", "PCM_AUDIO_CODECS", "bytes", "bitstream", "Bitstream", "objectType", "frequencyIndex", "sampleRate", "freqTable", "channelConfiguration", "numberOfChannels", "OPUS_INTERNAL_SAMPLE_RATE", "PCM_CODEC_REGEX", "parsePcmCodec", "assert", "match", "dataType", "sampleSize", "littleEndian", "silentValue", "Quality", "factor", "codec", "width", "height", "pixels", "codecEfficiencyFactors", "referencePixels", "referenceBitrate", "scaleFactor", "finalBitrate", "PCM_AUDIO_CODECS", "baseBitrate", "prev", "curr", "QUALITY_VERY_LOW", "QUALITY_LOW", "QUALITY_MEDIUM", "QUALITY_HIGH", "QUALITY_VERY_HIGH", "findNalUnitsInAnnexB", "packetData", "nalUnits", "i", "startCodePos", "startCodeLength", "j", "nalData", "findNalUnitsInLengthPrefixed", "lengthSize", "offset", "dataView", "nalUnitLength", "assertNever", "assert", "nalUnit", "removeEmulationPreventionBytes", "data", "result", "len", "extractNalUnitTypeForAvc", "data", "extractAvcDecoderConfigurationRecord", "packetData", "nalUnits", "findNalUnitsInAnnexB", "spsUnits", "unit", "ppsUnits", "spsExtUnits", "spsData", "bitstream", "Bitstream", "removeEmulationPreventionBytes", "profile_idc", "constraint_flags", "level_idc", "record", "readExpGolomb", "chroma_format_idc", "bit_depth_luma_minus8", "bit_depth_chroma_minus8", "error", "NALU_TYPE_VPS", "NALU_TYPE_SPS", "NALU_TYPE_PPS", "NALU_TYPE_SEI_PREFIX", "NALU_TYPE_SEI_SUFFIX", "extractNalUnitTypeForHevc", "data", "extractHevcDecoderConfigurationRecord", "packetData", "nalUnits", "findNalUnitsInAnnexB", "vpsUnits", "unit", "spsUnits", "ppsUnits", "seiUnits", "sps", "bitstream", "Bitstream", "removeEmulationPreventionBytes", "sps_max_sub_layers_minus1", "sps_temporal_id_nesting_flag", "general_profile_space", "general_tier_flag", "general_profile_idc", "general_profile_compatibility_flags", "general_constraint_indicator_flags", "general_level_idc", "parseProfileTierLevel", "readExpGolomb", "chroma_format_idc", "bit_depth_luma_minus8", "bit_depth_chroma_minus8", "maxNum", "i", "skipScalingListData", "num_short_term_ref_pic_sets", "skipAllStRefPicSets", "num_long_term_ref_pics_sps", "min_spatial_segmentation_idc", "parseVuiForMinSpatialSegmentationIdc", "parallelismType", "pps", "ppsBitstream", "readSignedExpGolomb", "tiles_enabled_flag", "entropy_coding_sync_enabled_flag", "arrays", "error", "maxNumSubLayersMinus1", "sub_layer_profile_present_flag", "sub_layer_level_present_flag", "sizeId", "matrixId", "coefNum", "NumDeltaPocs", "stRpsIdx", "skipStRefPicSet", "NumDeltaPocsThis", "inter_ref_pic_set_prediction_flag", "RefRpsIdx", "delta_idx_minus1", "numDelta", "j", "num_negative_pics", "num_positive_pics", "skipHrdParameters", "commonInfPresentFlag", "nal_hrd_parameters_present_flag", "vcl_hrd_parameters_present_flag", "sub_pic_hrd_params_present_flag", "fixed_pic_rate_general_flag", "fixed_pic_rate_within_cvs_flag", "low_delay_hrd_flag", "CpbCnt", "skipSubLayerHrdParameters", "extractVp9CodecInfoFromPacket", "packet", "bitstream", "Bitstream", "profileLowBit", "profile", "bitDepth", "colorSpace", "chromaSubsampling", "videoFullRangeFlag", "subsamplingX", "subsamplingY", "widthMinusOne", "heightMinusOne", "width", "height", "pictureSize", "level", "last", "VP9_LEVEL_TABLE", "entry", "iterateAv1PacketObus", "readLeb128", "value", "i", "byte", "obuType", "obuExtension", "obuHasSizeField", "obuSize", "obuSizeValue", "assert", "extractAv1CodecInfoFromPacket", "type", "data", "seqProfile", "stillPicture", "reducedStillPictureHeader", "seqLevel", "seqTier", "bufferDelayLengthMinus1", "decoderModelInfoPresentFlag", "operatingPointsCntMinus1", "seqLevelIdx", "seqTierTemp", "n", "highBitdepth", "monochrome", "chromaSubsamplingX", "chromaSubsamplingY", "chromaSamplePosition", "parseOpusIdentificationHeader", "bytes", "view", "toDataView", "outputChannelCount", "preSkip", "inputSampleRate", "outputGain", "channelMappingFamily", "channelMappingTable", "OPUS_FRAME_DURATION_TABLE", "parseOpusTocByte", "config", "parseModesFromVorbisSetupPacket", "setupHeader", "bufSize", "revBuffer", "gotFramingBit", "modeCount", "gotModeHeader", "lastModeCount", "tempPos", "a", "b", "c", "finalModeCount", "modeBlockflags", "determineVideoPacketType", "videoTrack", "decoderConfig", "nalUnits", "lengthSize", "toUint8Array", "findNalUnitsInLengthPrefixed", "findNalUnitsInAnnexB", "x", "extractNalUnitTypeForAvc", "extractNalUnitTypeForHevc", "assertNever", "buildIsobmffMimeType", "info", "string", "uniqueCodecMimeTypes", "IsobmffReader", "reader", "length", "view", "offset", "high", "low", "str", "result", "i", "nextByte", "totalSize", "name", "headerSize", "EBMLId", "LEVEL_0_EBML_IDS", "LEVEL_1_EBML_IDS", "LEVEL_0_AND_1_EBML_IDS", "MAX_VAR_INT_SIZE", "MIN_HEADER_SIZE", "MAX_HEADER_SIZE", "EBMLReader", "reader", "length", "view", "offset", "firstByte", "width", "mask", "fullView", "fullOffset", "value", "i", "size", "id", "ids", "until", "idsSet", "elementStartPos", "elementHeader", "assertDefinedSize", "CODEC_STRING_MAP", "buildMatroskaMimeType", "info", "string", "uniqueCodecMimeTypes", "MPEG_V1_BITRATES", "MPEG_V2_BITRATES", "SAMPLING_RATES", "XING", "INFO", "computeMp3FrameSize", "layer", "bitrate", "sampleRate", "padding", "getXingOffset", "mpegVersionId", "channel", "readFrameHeader", "word", "reader", "startPos", "firstByte", "secondByte", "thirdByte", "fourthByte", "bitrateIndex", "frequencyIndex", "modeExtension", "copyright", "original", "emphasis", "kilobitRate", "frameLength", "audioSamplesInFrame", "OGGS", "OGG_CRC_POLYNOMIAL", "OGG_CRC_TABLE", "crc", "k", "computeOggPageCrc", "bytes", "view", "toDataView", "originalChecksum", "i", "byte", "extractSampleMetadata", "data", "codecInfo", "vorbisLastBlocksize", "durationInSamples", "currentBlocksize", "assert", "vorbisModeCount", "modeMask", "ilog", "modeNumber", "prevBlocksize", "blockflag", "prevMask", "flag", "parseOpusTocByte", "buildOggMimeType", "info", "string", "uniqueCodecMimeTypes", "MIN_PAGE_HEADER_SIZE", "MAX_PAGE_HEADER_SIZE", "MAX_PAGE_SIZE", "OggReader", "reader", "length", "view", "offset", "low", "str", "startPos", "OGGS", "headerType", "granulePosition", "serialNumber", "sequenceNumber", "checksum", "numberPageSegments", "lacingValues", "i", "headerSize", "dataSize", "a", "b", "totalSize", "until", "word", "firstByte", "secondByte", "thirdByte", "fourthByte", "O", "Demuxer", "input", "PLACEHOLDER_DATA", "EncodedPacket", "_EncodedPacket", "data", "type", "timestamp", "duration", "sequenceNumber", "byteLength", "SECOND_TO_MICROSECOND_FACTOR", "chunk", "options", "VideoSample", "_VideoSample", "SECOND_TO_MICROSECOND_FACTOR", "data", "init", "toUint8Array", "width", "height", "canvas", "context", "assert", "isVideoFrame", "destination", "isAllowSharedBufferSource", "imageData", "arg1", "arg2", "arg3", "arg4", "arg5", "arg6", "arg7", "arg8", "sx", "sy", "sWidth", "sHeight", "dx", "dy", "dWidth", "dHeight", "source", "centerX", "centerY", "aspectRatioChange", "videoFrame", "newRotation", "newTimestamp", "newDuration", "x", "validatePacketRetrievalOptions", "options", "validateTimestamp", "timestamp", "maybeFixPacketType", "track", "promise", "packet", "determinedType", "EncodedPacketSink", "InputTrack", "EncodedPacket", "nextPacket", "startPacket", "endPacket", "packetQueue", "queueNotEmpty", "onQueueNotEmpty", "promiseWithResolvers", "queueDequeue", "onQueueDequeue", "ended", "terminated", "outOfBandError", "timestamps", "maxQueueSize", "error", "value", "now", "DecoderWrapper", "onSample", "onError", "BaseMediaSampleSink", "startTimestamp", "endTimestamp", "sampleQueue", "firstSampleQueued", "lastSample", "decoderIsFlushed", "decoderError", "decoder", "sample", "packetSink", "keyPacket", "currentPacket", "packets", "computeMaxQueueSize", "packetResult", "validateAnyIterable", "timestampIterator", "toAsyncIterator", "timestampsOfInterest", "pushToQueue", "sampleUses", "i", "lastPacket", "lastKeyPacket", "maxSequenceNumber", "decodePackets", "assert", "flushDecoder", "targetPacket", "decodedSampleQueueSize", "VideoDecoderWrapper", "codec", "decoderConfig", "rotation", "timeResolution", "CallSerializer", "sampleHandler", "last", "insertionIndex", "binarySearchLessOrEqual", "x", "MatchingCustomDecoder", "customVideoDecoders", "VideoSample", "frame", "VideoSampleSink", "videoTrack", "InputVideoTrack", "CanvasSink", "width", "height", "originalAspectRatio", "canvas", "context", "dx", "dy", "newWidth", "newHeight", "sampleWidth", "sampleHeight", "scale", "aspectRatioChange", "result", "mapAsyncGenerator", "InputTrack", "backing", "InputVideoTrack", "InputAudioTrack", "targetPacketCount", "sink", "EncodedPacketSink", "startTimestamp", "endTimestamp", "packetCount", "totalPacketBytes", "packet", "colorSpace", "decoderConfig", "codec", "assert", "customVideoDecoders", "x", "error", "EncodedPacket", "determineVideoPacketType", "customAudioDecoders", "Reader", "source", "maxStorableBytes", "start", "end", "matchingLoadingSegment", "x", "index", "binarySearchLessOrEqual", "i", "segment", "bytesPromise", "loadingSegment", "bytes", "removeItem", "otherSegment", "oldestSegment", "oldestSegmentIndex", "candidate", "assert", "startIndex", "RiffReader", "reader", "length", "view", "offset", "low", "high", "str", "WaveFormat", "WaveDemuxer", "Demuxer", "input", "RiffReader", "Reader", "actualFileSize", "riffType", "isRf64", "outerChunkSize", "totalFileSize", "chunksRead", "dataChunkSize", "chunkId", "chunkSize", "startPos", "riffChunkSize", "blockSize", "InputAudioTrack", "WaveAudioTrackBacking", "size", "formatTag", "numChannels", "sampleRate", "blockAlign", "bitsPerSample", "cbSize", "remainingSize", "subFormat", "assert", "PACKET_SIZE_IN_FRAMES", "demuxer", "codec", "UNDETERMINED_LANGUAGE", "packetIndex", "options", "startOffset", "sizeInBytes", "data", "PLACEHOLDER_DATA", "sizeOfOnePacket", "chunkStart", "chunkEnd", "timestamp", "duration", "EncodedPacket", "packet", "Source", "BlobSource", "Source", "blob", "start", "end", "buffer", "UrlSource", "url", "options", "range", "headers", "response", "retriedFetch", "mergeObjectsDeeply", "statusCode", "headResponse", "contentLength", "rangeResponse", "contentRange", "match", "IsobmffDemuxer", "Demuxer", "input", "AsyncMutex", "IsobmffReader", "Reader", "tracks", "trackDurations", "x", "track", "codecStrings", "buildIsobmffMimeType", "sourceSize", "startPos", "boxInfo", "majorBrand", "previousSegmentDurationsInSeconds", "lastWord", "potentialMfraPos", "internalTrack", "sampleTable", "PCM_AUDIO_CODECS", "assert", "pcmInfo", "parsePcmCodec", "newSampleTimingEntries", "newSampleSizes", "i", "chunkEntry", "nextEntry", "chunkCount", "j", "startSampleIndex", "endSampleIndex", "startTimingEntryIndex", "binarySearchLessOrEqual", "startTimingEntry", "endTimingEntryIndex", "endTimingEntry", "firstSampleTimestamp", "delta", "lastSampleTimingEntry", "last", "chunkSize", "entry", "sampleIndex", "sample", "a", "b", "moofBoxInfo", "contentStart", "index", "binarySearchExact", "fragment", "trackId", "trackData", "currentFragment", "lastFragment", "nextFragmentIsFirstFragment", "otherTrackData", "offsetFragmentTrackDataByTimestamp", "totalSize", "startIndex", "boxEndPos", "version", "UNDETERMINED_LANGUAGE", "videoTrack", "InputVideoTrack", "IsobmffVideoTrackBacking", "audioTrack", "InputAudioTrack", "IsobmffAudioTrackBacking", "matrix", "rotation", "normalizeRotation", "roundToMultiple", "extractRotationFromMatrix", "relevantEntryFound", "previousSegmentDurations", "entryCount", "segmentDuration", "mediaTime", "mediaRate", "language", "isIso639Dash2LanguageCode", "handlerType", "stsdVersion", "entries", "sampleBoxInfo", "lowercaseBoxName", "channelCount", "sampleSize", "sampleRate", "flags", "bytesPerSample", "isFloat", "isBigEndian", "sFlags", "profile", "level", "thirdByte", "bitDepth", "chromaSubsampling", "videoFullRangeFlag", "colourPrimaries", "transferCharacteristics", "matrixCoefficients", "secondByte", "tier", "highBitDepth", "twelveBit", "monochrome", "chromaSubsamplingX", "chromaSubsamplingY", "chromaSamplePosition", "fullRangeFlag", "COLOR_PRIMARIES_MAP_INVERSE", "TRANSFER_CHARACTERISTICS_MAP_INVERSE", "MATRIX_COEFFICIENTS_MAP_INVERSE", "tag", "mixed", "streamDependenceFlag", "urlFlag", "ocrStreamFlag", "urlLength", "decoderConfigTag", "decoderConfigDescriptorLength", "payloadStart", "objectTypeIndication", "decoderSpecificInfoTag", "decoderSpecificInfoLength", "audioSpecificConfig", "parseAacAudioSpecificConfig", "isLittleEndian", "pcmSampleSize", "outputChannelCount", "preSkip", "inputSampleRate", "outputGain", "channelMappingFamily", "channelMappingTable", "description", "view", "BLOCK_TYPE_MASK", "LAST_METADATA_BLOCK_FLAG_MASK", "flagAndType", "metadataBlockLength", "word", "numberOfChannels", "endPos", "bytes", "currentIndex", "currentTimestamp", "sampleCount", "sampleDelta", "sampleOffset", "fieldSize", "bitstream", "Bitstream", "startChunkIndex", "samplesPerChunk", "sampleDescriptionIndex", "chunkOffset", "fragmentDuration", "defaultSampleDescriptionIndex", "defaultSampleDuration", "defaultSampleSize", "defaultSampleFlags", "lengthSizeOfTrafNum", "lengthSizeOfTrunNum", "lengthSizeOfSampleNum", "functions", "readTrafNum", "readTrunNum", "readSampleNum", "numberOfEntries", "time", "moofOffset", "trafNumber", "trunNumber", "sampleNumber", "insertionIndex", "firstSample", "lastSample", "currentFragmentState", "baseDataOffsetPresent", "sampleDescriptionIndexPresent", "defaultSampleDurationPresent", "defaultSampleSizePresent", "defaultSampleFlagsPresent", "durationIsEmpty", "defaultBaseIsMoof", "defaults", "baseMediaDecodeTime", "dataOffsetPresent", "firstSampleFlagsPresent", "sampleDurationPresent", "sampleSizePresent", "sampleFlagsPresent", "sampleCompositionTimeOffsetsPresent", "dataOffset", "firstSampleFlags", "currentOffset", "sampleDuration", "sampleFlags", "sampleCompositionTimeOffset", "isKeyFrame", "currentEntry", "currentSample", "IsobmffTrackBacking", "lastPacket", "options", "regularPacket", "startFragment", "timestamp", "roundToPrecision", "timestampInTimescale", "getSampleIndexForTimestamp", "sampleTableIsEmpty", "packet", "regularSampleIndex", "locationInFragment", "fragmentSample", "fragmentIndex", "keyFrameSampleIndex", "getRelevantKeyframeIndexForSample", "nextKeyFrameSampleIndex", "getNextKeyframeIndexForSample", "nextKeyFrameIndex", "keyFrameIndex", "sampleInfo", "getSampleInfo", "data", "PLACEHOLDER_DATA", "duration", "EncodedPacket", "correctSampleFound", "indexInKeyFrameFragments", "findLastIndex", "getBestMatch", "searchTimestamp", "latestTimestamp", "demuxer", "release", "metadataReader", "prevFragment", "bestFragmentIndex", "bestSampleIndex", "lookupEntryIndex", "lookupEntry", "result", "bestFragment", "newSearchTimestamp", "firstPacket", "extractVp9CodecInfoFromPacket", "extractAv1CodecInfoFromPacket", "extractVideoCodecString", "extractAudioCodecString", "timescaleUnits", "timingEntryIndex", "timingEntry", "presentationTimestamp", "offsetEntryIndex", "offsetEntry", "chunkEntryIndex", "chunkIndex", "startSampleIndexOfChunk", "presentationIndex", "m11", "m21", "scaleX", "cosTheta", "sinTheta", "METADATA_ELEMENTS", "EBMLId", "MatroskaDemuxer", "Demuxer", "input", "EBMLReader", "Reader", "tracks", "trackDurations", "x", "segment", "track", "codecStrings", "buildMatroskaMimeType", "fileSize", "MIN_HEADER_SIZE", "MAX_HEADER_SIZE", "header", "id", "size", "startPos", "assertDefinedSize", "LEVEL_0_AND_1_EBML_IDS", "lastSegment", "last", "dataSize", "segmentDataStart", "AsyncMutex", "clusterEncountered", "elementStartPos", "dataStartPos", "metadataElementIndex", "field", "hasInfo", "hasTracks", "hasCues", "entry", "target", "seekEntry", "a", "b", "allTrackIds", "remainingTrackIds", "lastClusterPosition", "lastCuePoint", "cuePoint", "assert", "elementHeader", "cluster", "trackId", "trackData", "blockReferencesExist", "i", "block", "sortBlocksByReferences", "currentEntry", "currentBlock", "nextEntry", "firstBlock", "lastBlock", "insertionIndex", "binarySearchLessOrEqual", "trackNumber", "reader", "totalSize", "startIndex", "lastSeekEntry", "UNDETERMINED_LANGUAGE", "slashIndex", "codecIdWithoutSuffix", "CODEC_STRING_MAP", "videoTrack", "inputTrack", "InputVideoTrack", "MatroskaVideoTrackBacking", "audioTrack", "InputAudioTrack", "MatroskaAudioTrackBacking", "type", "isIso639Dash2LanguageCode", "matrixCoefficients", "mapped", "MATRIX_COEFFICIENTS_MAP_INVERSE", "transferCharacteristics", "TRANSFER_CHARACTERISTICS_MAP_INVERSE", "primaries", "COLOR_PRIMARIES_MAP_INVERSE", "flippedRotation", "normalizeRotation", "relativeTimestamp", "isKeyFrame", "flags", "MatroskaTrackBacking", "internalTrack", "lastPacket", "options", "startCluster", "currentCluster", "binarySearchExact", "timestamp", "roundToPrecision", "timestampInTimescale", "packet", "locationInCluster", "clusterIndex", "nextKeyFrameIndex", "keyFrameIndex", "blockIndex", "data", "PLACEHOLDER_DATA", "duration", "EncodedPacket", "correctBlockFound", "index", "indexInKeyFrameClusters", "findLastIndex", "getBestMatch", "searchTimestamp", "latestTimestamp", "demuxer", "release", "metadataReader", "clusterReader", "prevCluster", "bestClusterIndex", "bestBlockIndex", "cuePointIndex", "nextClusterIsFirstCluster", "endPos", "result", "bestCluster", "newSearchTimestamp", "firstPacket", "extractVideoCodecString", "extractAvcDecoderConfigurationRecord", "extractHevcDecoderConfigurationRecord", "extractVp9CodecInfoFromPacket", "extractAv1CodecInfoFromPacket", "extractAudioCodecString", "blocks", "timestampToBlock", "processedBlocks", "processBlock", "j", "otherBlock", "Mp3Reader", "reader", "length", "view", "offset", "str", "decodeSynchsafe", "until", "assert", "word", "header", "readFrameHeader", "synchsafed", "mask", "unsynchsafed", "Mp3Demuxer", "Demuxer", "input", "Mp3Reader", "fileSize", "id3Tag", "nextTimestampInSamples", "header", "xingOffset", "getXingOffset", "word", "isXing", "XING", "INFO", "sampleDuration", "sample", "InputAudioTrack", "Mp3AudioTrackBacking", "lastSample", "last", "assert", "demuxer", "UNDETERMINED_LANGUAGE", "sampleIndex", "options", "rawSample", "data", "PLACEHOLDER_DATA", "EncodedPacket", "packet", "binarySearchExact", "x", "timestamp", "index", "binarySearchLessOrEqual", "OggDemuxer", "Demuxer", "input", "AsyncMutex", "OggReader", "Reader", "MIN_PAGE_HEADER_SIZE", "MAX_PAGE_HEADER_SIZE", "page", "bitstream", "firstPacket", "InputAudioTrack", "OggAudioTrackBacking", "nextPacketPosition", "secondPacket", "thirdPacket", "lacingValues", "addBytesToSegmentTable", "bytes", "description", "view", "toDataView", "blockSizeByte", "parseModesFromVorbisSetupPacket", "header", "parseOpusIdentificationHeader", "reader", "startPage", "startSegmentIndex", "assert", "startDataOffset", "i", "currentPage", "currentDataOffset", "currentSegmentIndex", "chunks", "outer", "pageData", "lacingValue", "nextPage", "totalPacketSize", "sum", "chunk", "packetData", "offset", "lastPacket", "codecStrings", "x", "buildOggMimeType", "tracks", "trackDurations", "demuxer", "OPUS_INTERNAL_SAMPLE_RATE", "UNDETERMINED_LANGUAGE", "granulePosition", "packet", "additional", "options", "durationInSamples", "vorbisBlockSize", "extractSampleMetadata", "encodedPacket", "EncodedPacket", "PLACEHOLDER_DATA", "exclusive", "release", "packetPosition", "timestampInSamples", "prevPacket", "prevMetadata", "timestamp", "roundToPrecision", "startPosition", "lowPage", "high", "lowPages", "low", "mid", "searchStartPos", "until", "MAX_PAGE_SIZE", "pageValid", "computeOggPageCrc", "lowerPage", "otherLowPage", "previousPages", "currentTimestampInSamples", "currentTimestampIsCorrect", "endPage", "endSegmentIndex", "pseudopacket", "endPosition", "findPreviousPacketEndPosition", "findPacketStartPosition", "lastEncodedPacket", "lastEncodedPacketMetadata", "encodedPacketMetadata", "nextPosition", "pageList", "segmentIndex", "previousPage", "findLast", "InputFormat", "IsobmffInputFormat", "input", "isobmffReader", "IsobmffReader", "IsobmffDemuxer", "Mp4InputFormat", "majorBrand", "QuickTimeInputFormat", "MatroskaInputFormat", "desiredDocType", "ebmlReader", "EBMLReader", "varIntSize", "EBMLId", "dataSize", "startPos", "id", "size", "dataStartPos", "MatroskaDemuxer", "WebMInputFormat", "Mp3InputFormat", "sourceSize", "mp3Reader", "Mp3Reader", "id3Tag", "framesStartPos", "firstHeader", "secondHeader", "Mp3Demuxer", "WaveInputFormat", "riffReader", "RiffReader", "riffType", "WaveDemuxer", "OggInputFormat", "OggReader", "OggDemuxer", "MP4", "QTFF", "MATROSKA", "WEBM", "MP3", "WAVE", "OGG", "ALL_FORMATS", "Input", "options", "x", "InputFormat", "Source", "Reader", "format", "assert", "Machina", "#handlers", "id", "handler", "event", "setupDriverHost", "machina", "Comrade", "_shell", "loadDecoderSource", "source", "BlobSource", "UrlSource", "Driver", "options", "machina", "Machina", "thread", "Comrade", "setupDriverHost", "source", "Input", "loadDecoderSource", "ALL_FORMATS", "input", "lastFrame", "videoTransform", "chunk", "controller", "frame", "audioTransform", "tune", "readables", "config", "writable", "bridge", "composition", "transfer", "#collectTransferablesFromComposition", "transferables", "visit", "node", "child", "workerUrl", "context", "Driver", "t", "i", "s", "n", "r", "o", "h", "a", "e", "e", "t", "i", "s", "n", "r", "o", "a", "h", "_h", "l", "d", "c", "u", "p", "m", "f", "g", "v", "b", "_u", "Waveform", "_Waveform", "peaks", "container", "duration", "u", "source", "driver", "context", "reader", "buffer", "samplesPerPeak", "done", "audioData", "frames", "plane", "i", "chunk", "min", "max", "value", "waveformTest", "container", "widthSlider", "waveform", "Waveform", "width", "Filmstrip", "_Filmstrip", "#sink", "#cache", "#activeRange", "videoTrack", "options", "CanvasSink", "source", "Input", "ALL_FORMATS", "loadDecoderSource", "value", "#update", "#computeActiveRange", "start", "end", "tileSize", "#generateTiles", "rangeStart", "rangeEnd", "neededTimestamps", "duration", "timestamp", "missingTimestamps", "t", "i", "canvas", "requestedTime", "key", "tiles", "time", "visibleRange", "newRange", "#updating", "#shouldRunAgain", "filmstripTest", "file", "rangeSlider", "rangeView", "rangeSizeSlider", "frequencySlider", "frequencyView", "container", "FPS_10", "rangeSize", "filmstrip", "Filmstrip", "tiles", "sorted", "a", "b", "time", "canvas", "createLabeledCanvas", "start", "end", "wrapper", "label", "prepAudio", "driver", "source", "arrayBuffer", "audioData", "audio", "SCALING_FACTOR", "left", "right", "i", "duration", "makeTranscriber", "driver", "spec", "workerUrl", "onLoading", "onReport", "sub", "onTranscription", "thread", "Comrade", "loading", "report", "transcription", "queue", "info", "source", "language", "audio", "duration", "prepAudio", "detachCallbacks", "coalesce", "result", "transcriberTest", "driver", "transcriber", "makeTranscriber", "progress", "total", "file", "result", "report", "transcription", "setupTranscodeTest", "driver", "source", "dimensions", "canvas", "ctx", "run", "readables", "frame", "composed", "driver", "context", "results", "fetchButton", "importButton", "startDemoFetch", "startDemoImport", "waveformTest", "transcriber", "transcriberTest", "fileHandle", "file", "transcode", "setupTranscodeTest", "filmstripTest", "run", "videos", "url", "label", "div", "p"]
7
7
  }