Files
nothoughts/node_modules/pixi.js/lib/rendering/renderers/gpu/GpuEncoderSystem.mjs.map
2025-08-04 18:57:35 +02:00

1 line
16 KiB
Plaintext

{"version":3,"file":"GpuEncoderSystem.mjs","sources":["../../../../src/rendering/renderers/gpu/GpuEncoderSystem.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\n\nimport type { Rectangle } from '../../../maths/shapes/Rectangle';\nimport type { Buffer } from '../shared/buffer/Buffer';\nimport type { Topology } from '../shared/geometry/const';\nimport type { Geometry } from '../shared/geometry/Geometry';\nimport type { Shader } from '../shared/shader/Shader';\nimport type { UniformGroup } from '../shared/shader/UniformGroup';\nimport type { State } from '../shared/state/State';\nimport type { System } from '../shared/system/System';\nimport type { GPU } from './GpuDeviceSystem';\nimport type { GpuRenderTarget } from './renderTarget/GpuRenderTarget';\nimport type { GpuRenderTargetAdaptor } from './renderTarget/GpuRenderTargetAdaptor';\nimport type { BindGroup } from './shader/BindGroup';\nimport type { GpuProgram } from './shader/GpuProgram';\nimport type { WebGPURenderer } from './WebGPURenderer';\n\n/**\n * The system that handles encoding commands for the GPU.\n * @memberof rendering\n */\nexport class GpuEncoderSystem implements System\n{\n /** @ignore */\n public static extension = {\n type: [ExtensionType.WebGPUSystem],\n name: 'encoder',\n priority: 1\n } as const;\n\n public commandEncoder: GPUCommandEncoder;\n public renderPassEncoder: GPURenderPassEncoder;\n public commandFinished: Promise<void>;\n\n private _resolveCommandFinished: (value: void) => void;\n\n private _gpu: GPU;\n private _boundBindGroup: Record<number, BindGroup> = Object.create(null);\n private _boundVertexBuffer: Record<number, Buffer> = Object.create(null);\n private _boundIndexBuffer: Buffer;\n private _boundPipeline: GPURenderPipeline;\n\n private readonly _renderer: WebGPURenderer;\n\n constructor(renderer: WebGPURenderer)\n {\n this._renderer = renderer;\n }\n\n public renderStart(): void\n {\n this.commandFinished = new Promise((resolve) =>\n {\n this._resolveCommandFinished = resolve;\n });\n\n // generate a render pass description..\n // create an encoder..\n this.commandEncoder = this._renderer.gpu.device.createCommandEncoder();\n }\n\n public beginRenderPass(gpuRenderTarget: GpuRenderTarget)\n {\n this.endRenderPass();\n\n this._clearCache();\n\n this.renderPassEncoder = this.commandEncoder.beginRenderPass(gpuRenderTarget.descriptor);\n }\n\n public endRenderPass()\n {\n if (this.renderPassEncoder)\n {\n this.renderPassEncoder.end();\n }\n\n this.renderPassEncoder = null;\n }\n\n public setViewport(viewport: Rectangle): void\n {\n this.renderPassEncoder.setViewport(viewport.x, viewport.y, viewport.width, viewport.height, 0, 1);\n }\n\n public setPipelineFromGeometryProgramAndState(\n geometry: Geometry,\n program: GpuProgram,\n state: any,\n topology?: Topology,\n ): void\n {\n const pipeline = this._renderer.pipeline.getPipeline(geometry, program, state, topology);\n\n this.setPipeline(pipeline);\n }\n\n public setPipeline(pipeline: GPURenderPipeline)\n {\n if (this._boundPipeline === pipeline) return;\n this._boundPipeline = pipeline;\n\n this.renderPassEncoder.setPipeline(pipeline);\n }\n\n private _setVertexBuffer(index: number, buffer: Buffer)\n {\n if (this._boundVertexBuffer[index] === buffer) return;\n\n this._boundVertexBuffer[index] = buffer;\n\n this.renderPassEncoder.setVertexBuffer(index, this._renderer.buffer.updateBuffer(buffer));\n }\n\n private _setIndexBuffer(buffer: Buffer)\n {\n if (this._boundIndexBuffer === buffer) return;\n\n this._boundIndexBuffer = buffer;\n\n const indexFormat = buffer.data.BYTES_PER_ELEMENT === 2 ? 'uint16' : 'uint32';\n\n this.renderPassEncoder.setIndexBuffer(this._renderer.buffer.updateBuffer(buffer), indexFormat);\n }\n\n public resetBindGroup(index: number)\n {\n this._boundBindGroup[index] = null;\n }\n\n public setBindGroup(index: number, bindGroup: BindGroup, program: GpuProgram)\n {\n if (this._boundBindGroup[index] === bindGroup) return;\n this._boundBindGroup[index] = bindGroup;\n\n bindGroup._touch(this._renderer.textureGC.count);\n\n // TODO getting the bind group works as it looks at th e assets and generates a key\n // should this just be hidden behind a dirty flag?\n const gpuBindGroup = this._renderer.bindGroup.getBindGroup(bindGroup, program, index);\n\n // mark each item as having been used..\n this.renderPassEncoder.setBindGroup(index, gpuBindGroup);\n }\n\n public setGeometry(geometry: Geometry, program: GpuProgram)\n {\n // when binding a buffers for geometry, there is no need to bind a buffer more than once if it is interleaved.\n // which is often the case for Pixi. This is a performance optimisation.\n // Instead of looping through the attributes, we instead call getBufferNamesToBind\n // which returns a list of buffer names that need to be bound.\n // we can then loop through this list and bind the buffers.\n // essentially only binding a single time for any buffers that are interleaved.\n const buffersToBind = this._renderer.pipeline.getBufferNamesToBind(geometry, program);\n\n for (const i in buffersToBind)\n {\n this._setVertexBuffer(i as any as number, geometry.attributes[buffersToBind[i]].buffer);\n }\n\n if (geometry.indexBuffer)\n {\n this._setIndexBuffer(geometry.indexBuffer);\n }\n }\n\n private _setShaderBindGroups(shader: Shader, skipSync?: boolean)\n {\n for (const i in shader.groups)\n {\n const bindGroup = shader.groups[i] as BindGroup;\n\n // update any uniforms?\n if (!skipSync)\n {\n this._syncBindGroup(bindGroup);\n }\n\n this.setBindGroup(i as unknown as number, bindGroup, shader.gpuProgram);\n }\n }\n\n private _syncBindGroup(bindGroup: BindGroup)\n {\n for (const j in bindGroup.resources)\n {\n const resource = bindGroup.resources[j];\n\n if ((resource as UniformGroup).isUniformGroup)\n {\n this._renderer.ubo.updateUniformGroup(resource as UniformGroup);\n }\n }\n }\n\n public draw(options: {\n geometry: Geometry;\n shader: Shader;\n state?: State;\n topology?: Topology;\n size?: number;\n start?: number;\n instanceCount?: number;\n skipSync?: boolean;\n })\n {\n const { geometry, shader, state, topology, size, start, instanceCount, skipSync } = options;\n\n this.setPipelineFromGeometryProgramAndState(geometry, shader.gpuProgram, state, topology);\n this.setGeometry(geometry, shader.gpuProgram);\n this._setShaderBindGroups(shader, skipSync);\n\n if (geometry.indexBuffer)\n {\n this.renderPassEncoder.drawIndexed(\n size || geometry.indexBuffer.data.length,\n instanceCount || geometry.instanceCount,\n start || 0\n );\n }\n else\n {\n this.renderPassEncoder.draw(size || geometry.getSize(), instanceCount || geometry.instanceCount, start || 0);\n }\n }\n\n public finishRenderPass()\n {\n if (this.renderPassEncoder)\n {\n this.renderPassEncoder.end();\n this.renderPassEncoder = null;\n }\n }\n\n public postrender()\n {\n this.finishRenderPass();\n\n this._gpu.device.queue.submit([this.commandEncoder.finish()]);\n\n this._resolveCommandFinished();\n\n this.commandEncoder = null;\n }\n\n // restores a render pass if finishRenderPass was called\n // not optimised as really used for debugging!\n // used when we want to stop drawing and log a texture..\n public restoreRenderPass()\n {\n const descriptor = (this._renderer.renderTarget.adaptor as GpuRenderTargetAdaptor).getDescriptor(\n this._renderer.renderTarget.renderTarget,\n false,\n [0, 0, 0, 1],\n );\n\n this.renderPassEncoder = this.commandEncoder.beginRenderPass(descriptor);\n\n const boundPipeline = this._boundPipeline;\n const boundVertexBuffer = { ...this._boundVertexBuffer };\n const boundIndexBuffer = this._boundIndexBuffer;\n const boundBindGroup = { ...this._boundBindGroup };\n\n this._clearCache();\n\n const viewport = this._renderer.renderTarget.viewport;\n\n this.renderPassEncoder.setViewport(viewport.x, viewport.y, viewport.width, viewport.height, 0, 1);\n\n // reinstate the cache...\n\n this.setPipeline(boundPipeline);\n\n for (const i in boundVertexBuffer)\n {\n this._setVertexBuffer(i as unknown as number, boundVertexBuffer[i]);\n }\n\n for (const i in boundBindGroup)\n {\n this.setBindGroup(i as unknown as number, boundBindGroup[i], null);\n }\n\n this._setIndexBuffer(boundIndexBuffer);\n }\n\n private _clearCache()\n {\n for (let i = 0; i < 16; i++)\n {\n this._boundBindGroup[i] = null;\n this._boundVertexBuffer[i] = null;\n }\n\n this._boundIndexBuffer = null;\n this._boundPipeline = null;\n }\n\n public destroy()\n {\n (this._renderer as null) = null;\n this._gpu = null;\n this._boundBindGroup = null;\n this._boundVertexBuffer = null;\n this._boundIndexBuffer = null;\n this._boundPipeline = null;\n }\n\n protected contextChange(gpu: GPU): void\n {\n this._gpu = gpu;\n }\n}\n"],"names":[],"mappings":";;;AAqBO,MAAM,gBACb,CAAA;AAAA,EAsBI,YAAY,QACZ,EAAA;AARA,IAAQ,IAAA,CAAA,eAAA,mBAAoD,MAAA,CAAA,MAAA,CAAO,IAAI,CAAA,CAAA;AACvE,IAAQ,IAAA,CAAA,kBAAA,mBAAoD,MAAA,CAAA,MAAA,CAAO,IAAI,CAAA,CAAA;AAQnE,IAAA,IAAA,CAAK,SAAY,GAAA,QAAA,CAAA;AAAA,GACrB;AAAA,EAEO,WACP,GAAA;AACI,IAAA,IAAA,CAAK,eAAkB,GAAA,IAAI,OAAQ,CAAA,CAAC,OACpC,KAAA;AACI,MAAA,IAAA,CAAK,uBAA0B,GAAA,OAAA,CAAA;AAAA,KAClC,CAAA,CAAA;AAID,IAAA,IAAA,CAAK,cAAiB,GAAA,IAAA,CAAK,SAAU,CAAA,GAAA,CAAI,OAAO,oBAAqB,EAAA,CAAA;AAAA,GACzE;AAAA,EAEO,gBAAgB,eACvB,EAAA;AACI,IAAA,IAAA,CAAK,aAAc,EAAA,CAAA;AAEnB,IAAA,IAAA,CAAK,WAAY,EAAA,CAAA;AAEjB,IAAA,IAAA,CAAK,iBAAoB,GAAA,IAAA,CAAK,cAAe,CAAA,eAAA,CAAgB,gBAAgB,UAAU,CAAA,CAAA;AAAA,GAC3F;AAAA,EAEO,aACP,GAAA;AACI,IAAA,IAAI,KAAK,iBACT,EAAA;AACI,MAAA,IAAA,CAAK,kBAAkB,GAAI,EAAA,CAAA;AAAA,KAC/B;AAEA,IAAA,IAAA,CAAK,iBAAoB,GAAA,IAAA,CAAA;AAAA,GAC7B;AAAA,EAEO,YAAY,QACnB,EAAA;AACI,IAAK,IAAA,CAAA,iBAAA,CAAkB,WAAY,CAAA,QAAA,CAAS,CAAG,EAAA,QAAA,CAAS,CAAG,EAAA,QAAA,CAAS,KAAO,EAAA,QAAA,CAAS,MAAQ,EAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AAAA,GACpG;AAAA,EAEO,sCACH,CAAA,QAAA,EACA,OACA,EAAA,KAAA,EACA,QAEJ,EAAA;AACI,IAAM,MAAA,QAAA,GAAW,KAAK,SAAU,CAAA,QAAA,CAAS,YAAY,QAAU,EAAA,OAAA,EAAS,OAAO,QAAQ,CAAA,CAAA;AAEvF,IAAA,IAAA,CAAK,YAAY,QAAQ,CAAA,CAAA;AAAA,GAC7B;AAAA,EAEO,YAAY,QACnB,EAAA;AACI,IAAA,IAAI,KAAK,cAAmB,KAAA,QAAA;AAAU,MAAA,OAAA;AACtC,IAAA,IAAA,CAAK,cAAiB,GAAA,QAAA,CAAA;AAEtB,IAAK,IAAA,CAAA,iBAAA,CAAkB,YAAY,QAAQ,CAAA,CAAA;AAAA,GAC/C;AAAA,EAEQ,gBAAA,CAAiB,OAAe,MACxC,EAAA;AACI,IAAI,IAAA,IAAA,CAAK,kBAAmB,CAAA,KAAK,CAAM,KAAA,MAAA;AAAQ,MAAA,OAAA;AAE/C,IAAK,IAAA,CAAA,kBAAA,CAAmB,KAAK,CAAI,GAAA,MAAA,CAAA;AAEjC,IAAK,IAAA,CAAA,iBAAA,CAAkB,gBAAgB,KAAO,EAAA,IAAA,CAAK,UAAU,MAAO,CAAA,YAAA,CAAa,MAAM,CAAC,CAAA,CAAA;AAAA,GAC5F;AAAA,EAEQ,gBAAgB,MACxB,EAAA;AACI,IAAA,IAAI,KAAK,iBAAsB,KAAA,MAAA;AAAQ,MAAA,OAAA;AAEvC,IAAA,IAAA,CAAK,iBAAoB,GAAA,MAAA,CAAA;AAEzB,IAAA,MAAM,WAAc,GAAA,MAAA,CAAO,IAAK,CAAA,iBAAA,KAAsB,IAAI,QAAW,GAAA,QAAA,CAAA;AAErE,IAAK,IAAA,CAAA,iBAAA,CAAkB,eAAe,IAAK,CAAA,SAAA,CAAU,OAAO,YAAa,CAAA,MAAM,GAAG,WAAW,CAAA,CAAA;AAAA,GACjG;AAAA,EAEO,eAAe,KACtB,EAAA;AACI,IAAK,IAAA,CAAA,eAAA,CAAgB,KAAK,CAAI,GAAA,IAAA,CAAA;AAAA,GAClC;AAAA,EAEO,YAAA,CAAa,KAAe,EAAA,SAAA,EAAsB,OACzD,EAAA;AACI,IAAI,IAAA,IAAA,CAAK,eAAgB,CAAA,KAAK,CAAM,KAAA,SAAA;AAAW,MAAA,OAAA;AAC/C,IAAK,IAAA,CAAA,eAAA,CAAgB,KAAK,CAAI,GAAA,SAAA,CAAA;AAE9B,IAAA,SAAA,CAAU,MAAO,CAAA,IAAA,CAAK,SAAU,CAAA,SAAA,CAAU,KAAK,CAAA,CAAA;AAI/C,IAAA,MAAM,eAAe,IAAK,CAAA,SAAA,CAAU,UAAU,YAAa,CAAA,SAAA,EAAW,SAAS,KAAK,CAAA,CAAA;AAGpF,IAAK,IAAA,CAAA,iBAAA,CAAkB,YAAa,CAAA,KAAA,EAAO,YAAY,CAAA,CAAA;AAAA,GAC3D;AAAA,EAEO,WAAA,CAAY,UAAoB,OACvC,EAAA;AAOI,IAAA,MAAM,gBAAgB,IAAK,CAAA,SAAA,CAAU,QAAS,CAAA,oBAAA,CAAqB,UAAU,OAAO,CAAA,CAAA;AAEpF,IAAA,KAAA,MAAW,KAAK,aAChB,EAAA;AACI,MAAK,IAAA,CAAA,gBAAA,CAAiB,GAAoB,QAAS,CAAA,UAAA,CAAW,cAAc,CAAC,CAAC,EAAE,MAAM,CAAA,CAAA;AAAA,KAC1F;AAEA,IAAA,IAAI,SAAS,WACb,EAAA;AACI,MAAK,IAAA,CAAA,eAAA,CAAgB,SAAS,WAAW,CAAA,CAAA;AAAA,KAC7C;AAAA,GACJ;AAAA,EAEQ,oBAAA,CAAqB,QAAgB,QAC7C,EAAA;AACI,IAAW,KAAA,MAAA,CAAA,IAAK,OAAO,MACvB,EAAA;AACI,MAAM,MAAA,SAAA,GAAY,MAAO,CAAA,MAAA,CAAO,CAAC,CAAA,CAAA;AAGjC,MAAA,IAAI,CAAC,QACL,EAAA;AACI,QAAA,IAAA,CAAK,eAAe,SAAS,CAAA,CAAA;AAAA,OACjC;AAEA,MAAA,IAAA,CAAK,YAAa,CAAA,CAAA,EAAwB,SAAW,EAAA,MAAA,CAAO,UAAU,CAAA,CAAA;AAAA,KAC1E;AAAA,GACJ;AAAA,EAEQ,eAAe,SACvB,EAAA;AACI,IAAW,KAAA,MAAA,CAAA,IAAK,UAAU,SAC1B,EAAA;AACI,MAAM,MAAA,QAAA,GAAW,SAAU,CAAA,SAAA,CAAU,CAAC,CAAA,CAAA;AAEtC,MAAA,IAAK,SAA0B,cAC/B,EAAA;AACI,QAAK,IAAA,CAAA,SAAA,CAAU,GAAI,CAAA,kBAAA,CAAmB,QAAwB,CAAA,CAAA;AAAA,OAClE;AAAA,KACJ;AAAA,GACJ;AAAA,EAEO,KAAK,OAUZ,EAAA;AACI,IAAM,MAAA,EAAE,UAAU,MAAQ,EAAA,KAAA,EAAO,UAAU,IAAM,EAAA,KAAA,EAAO,aAAe,EAAA,QAAA,EAAa,GAAA,OAAA,CAAA;AAEpF,IAAA,IAAA,CAAK,sCAAuC,CAAA,QAAA,EAAU,MAAO,CAAA,UAAA,EAAY,OAAO,QAAQ,CAAA,CAAA;AACxF,IAAK,IAAA,CAAA,WAAA,CAAY,QAAU,EAAA,MAAA,CAAO,UAAU,CAAA,CAAA;AAC5C,IAAK,IAAA,CAAA,oBAAA,CAAqB,QAAQ,QAAQ,CAAA,CAAA;AAE1C,IAAA,IAAI,SAAS,WACb,EAAA;AACI,MAAA,IAAA,CAAK,iBAAkB,CAAA,WAAA;AAAA,QACnB,IAAA,IAAQ,QAAS,CAAA,WAAA,CAAY,IAAK,CAAA,MAAA;AAAA,QAClC,iBAAiB,QAAS,CAAA,aAAA;AAAA,QAC1B,KAAS,IAAA,CAAA;AAAA,OACb,CAAA;AAAA,KAGJ,MAAA;AACI,MAAK,IAAA,CAAA,iBAAA,CAAkB,IAAK,CAAA,IAAA,IAAQ,QAAS,CAAA,OAAA,IAAW,aAAiB,IAAA,QAAA,CAAS,aAAe,EAAA,KAAA,IAAS,CAAC,CAAA,CAAA;AAAA,KAC/G;AAAA,GACJ;AAAA,EAEO,gBACP,GAAA;AACI,IAAA,IAAI,KAAK,iBACT,EAAA;AACI,MAAA,IAAA,CAAK,kBAAkB,GAAI,EAAA,CAAA;AAC3B,MAAA,IAAA,CAAK,iBAAoB,GAAA,IAAA,CAAA;AAAA,KAC7B;AAAA,GACJ;AAAA,EAEO,UACP,GAAA;AACI,IAAA,IAAA,CAAK,gBAAiB,EAAA,CAAA;AAEtB,IAAK,IAAA,CAAA,IAAA,CAAK,OAAO,KAAM,CAAA,MAAA,CAAO,CAAC,IAAK,CAAA,cAAA,CAAe,MAAO,EAAC,CAAC,CAAA,CAAA;AAE5D,IAAA,IAAA,CAAK,uBAAwB,EAAA,CAAA;AAE7B,IAAA,IAAA,CAAK,cAAiB,GAAA,IAAA,CAAA;AAAA,GAC1B;AAAA;AAAA;AAAA;AAAA,EAKO,iBACP,GAAA;AACI,IAAA,MAAM,UAAc,GAAA,IAAA,CAAK,SAAU,CAAA,YAAA,CAAa,OAAmC,CAAA,aAAA;AAAA,MAC/E,IAAA,CAAK,UAAU,YAAa,CAAA,YAAA;AAAA,MAC5B,KAAA;AAAA,MACA,CAAC,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAC,CAAA;AAAA,KACf,CAAA;AAEA,IAAA,IAAA,CAAK,iBAAoB,GAAA,IAAA,CAAK,cAAe,CAAA,eAAA,CAAgB,UAAU,CAAA,CAAA;AAEvE,IAAA,MAAM,gBAAgB,IAAK,CAAA,cAAA,CAAA;AAC3B,IAAA,MAAM,iBAAoB,GAAA,EAAE,GAAG,IAAA,CAAK,kBAAmB,EAAA,CAAA;AACvD,IAAA,MAAM,mBAAmB,IAAK,CAAA,iBAAA,CAAA;AAC9B,IAAA,MAAM,cAAiB,GAAA,EAAE,GAAG,IAAA,CAAK,eAAgB,EAAA,CAAA;AAEjD,IAAA,IAAA,CAAK,WAAY,EAAA,CAAA;AAEjB,IAAM,MAAA,QAAA,GAAW,IAAK,CAAA,SAAA,CAAU,YAAa,CAAA,QAAA,CAAA;AAE7C,IAAK,IAAA,CAAA,iBAAA,CAAkB,WAAY,CAAA,QAAA,CAAS,CAAG,EAAA,QAAA,CAAS,CAAG,EAAA,QAAA,CAAS,KAAO,EAAA,QAAA,CAAS,MAAQ,EAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AAIhG,IAAA,IAAA,CAAK,YAAY,aAAa,CAAA,CAAA;AAE9B,IAAA,KAAA,MAAW,KAAK,iBAChB,EAAA;AACI,MAAA,IAAA,CAAK,gBAAiB,CAAA,CAAA,EAAwB,iBAAkB,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,KACtE;AAEA,IAAA,KAAA,MAAW,KAAK,cAChB,EAAA;AACI,MAAA,IAAA,CAAK,YAAa,CAAA,CAAA,EAAwB,cAAe,CAAA,CAAC,GAAG,IAAI,CAAA,CAAA;AAAA,KACrE;AAEA,IAAA,IAAA,CAAK,gBAAgB,gBAAgB,CAAA,CAAA;AAAA,GACzC;AAAA,EAEQ,WACR,GAAA;AACI,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,EAAA,EAAI,CACxB,EAAA,EAAA;AACI,MAAK,IAAA,CAAA,eAAA,CAAgB,CAAC,CAAI,GAAA,IAAA,CAAA;AAC1B,MAAK,IAAA,CAAA,kBAAA,CAAmB,CAAC,CAAI,GAAA,IAAA,CAAA;AAAA,KACjC;AAEA,IAAA,IAAA,CAAK,iBAAoB,GAAA,IAAA,CAAA;AACzB,IAAA,IAAA,CAAK,cAAiB,GAAA,IAAA,CAAA;AAAA,GAC1B;AAAA,EAEO,OACP,GAAA;AACI,IAAC,KAAK,SAAqB,GAAA,IAAA,CAAA;AAC3B,IAAA,IAAA,CAAK,IAAO,GAAA,IAAA,CAAA;AACZ,IAAA,IAAA,CAAK,eAAkB,GAAA,IAAA,CAAA;AACvB,IAAA,IAAA,CAAK,kBAAqB,GAAA,IAAA,CAAA;AAC1B,IAAA,IAAA,CAAK,iBAAoB,GAAA,IAAA,CAAA;AACzB,IAAA,IAAA,CAAK,cAAiB,GAAA,IAAA,CAAA;AAAA,GAC1B;AAAA,EAEU,cAAc,GACxB,EAAA;AACI,IAAA,IAAA,CAAK,IAAO,GAAA,GAAA,CAAA;AAAA,GAChB;AACJ,CAAA;AAAA;AApSa,gBAAA,CAGK,SAAY,GAAA;AAAA,EACtB,IAAA,EAAM,CAAC,aAAA,CAAc,YAAY,CAAA;AAAA,EACjC,IAAM,EAAA,SAAA;AAAA,EACN,QAAU,EAAA,CAAA;AACd,CAAA;;;;"}