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

1 line
20 KiB
Plaintext

{"version":3,"file":"Shader.mjs","sources":["../../../../../src/rendering/renderers/shared/shader/Shader.ts"],"sourcesContent":["/* eslint-disable no-new */\nimport EventEmitter from 'eventemitter3';\nimport { GlProgram } from '../../gl/shader/GlProgram';\nimport { BindGroup } from '../../gpu/shader/BindGroup';\nimport { GpuProgram } from '../../gpu/shader/GpuProgram';\nimport { RendererType } from '../../types';\nimport { UniformGroup } from './UniformGroup';\n\nimport type { GlProgramOptions } from '../../gl/shader/GlProgram';\nimport type { BindResource } from '../../gpu/shader/BindResource';\nimport type { GpuProgramOptions } from '../../gpu/shader/GpuProgram';\n\n/**\n * A record of {@link BindGroup}'s used by the shader.\n *\n * `Record<number, BindGroup>`\n * @memberof rendering\n */\nexport type ShaderGroups = Record<number, BindGroup>;\n\ninterface ShaderBase\n{\n /** The WebGL program used by the WebGL renderer. */\n glProgram?: GlProgram\n /** The WebGPU program used by the WebGPU renderer. */\n gpuProgram?: GpuProgram\n /**\n * A number that uses two bits on whether the shader is compatible with the WebGL renderer and/or the WebGPU renderer.\n * 0b00 - not compatible with either\n * 0b01 - compatible with WebGL\n * 0b10 - compatible with WebGPU\n * This is automatically set based on if a {@link GlProgram} or {@link GpuProgram} is provided.\n */\n compatibleRenderers?: number\n}\n\nexport interface GlShaderWith extends ShaderBase\n{\n /** The WebGL program used by the WebGL renderer. */\n glProgram: GlProgram\n}\n\nexport interface GpuShaderWith extends ShaderBase\n{\n /** The WebGPU program used by the WebGPU renderer. */\n gpuProgram: GpuProgram\n}\n\nexport interface ShaderWithGroupsDescriptor\n{\n /** A record of {@link BindGroup}'s used by the shader. */\n groups: ShaderGroups;\n /** an optional map of how to bind the groups. This is automatically generated by reading the WebGPU program */\n groupMap?: Record<string, Record<string, any>>;\n}\n\ninterface ShaderWithResourcesDescriptor\n{\n /**\n * A key value of uniform resources used by the shader.\n * Under the hood pixi will look at the provided shaders and figure out where\n * the resources are mapped. Its up to you to make sure the resource key\n * matches the uniform name in the webGPU program. WebGL is a little more forgiving!\n */\n resources?: Record<string, any>;\n}\n\ninterface GroupsData\n{\n group: number\n binding: number\n name: string\n}\n\n/**\n * A descriptor for a shader\n * @memberof rendering\n */\nexport type ShaderWith = GlShaderWith | GpuShaderWith;\n\n/**\n * A descriptor for a shader with groups.\n * @memberof rendering\n */\nexport type ShaderWithGroups = ShaderWithGroupsDescriptor & ShaderWith;\nexport interface IShaderWithGroups extends ShaderWithGroupsDescriptor, ShaderBase {}\n\n/**\n * A descriptor for a shader with resources. This is an easier way to work with uniforms.\n * especially when you are not working with bind groups\n * @memberof rendering\n */\nexport type ShaderWithResources = ShaderWithResourcesDescriptor & ShaderWith;\nexport interface IShaderWithResources extends ShaderWithResourcesDescriptor, ShaderBase {}\n\nexport type ShaderDescriptor = ShaderWithGroups & ShaderWithResources;\n\ntype GlShaderFromWith = {\n gpu?: GpuProgramOptions,\n gl: GlProgramOptions\n};\ntype GpuShaderFromWith = {\n gpu: GpuProgramOptions,\n gl?: GlProgramOptions\n};\nexport type ShaderFromGroups = (GlShaderFromWith | GpuShaderFromWith) & Omit<ShaderWithGroups, 'glProgram' | 'gpuProgram'>;\nexport type ShaderFromResources = (GlShaderFromWith | GpuShaderFromWith)\n& Omit<ShaderWithResources, 'glProgram' | 'gpuProgram'>;\n\n/**\n * The Shader class is an integral part of the PixiJS graphics pipeline.\n * Central to rendering in PixiJS are two key elements: A [shader] and a [geometry].\n * The shader incorporates a {@link GlProgram} for WebGL or a {@link GpuProgram} for WebGPU,\n * instructing the respective technology on how to render the geometry.\n *\n * The primary goal of the Shader class is to offer a unified interface compatible with both WebGL and WebGPU.\n * When constructing a shader, you need to provide both a WebGL program and a WebGPU program due to the distinctions\n * between the two rendering engines. If only one is provided, the shader won't function with the omitted renderer.\n *\n * Both WebGL and WebGPU utilize the same resource object when passed into the shader.\n * Post-creation, the shader's interface remains consistent across both WebGL and WebGPU.\n * The sole distinction lies in whether a glProgram or a gpuProgram is employed.\n *\n * Modifying shader uniforms, which can encompass:\n * - TextureSampler {@link TextureStyle}\n * - TextureSource {@link TextureSource}\n * - UniformsGroups {@link UniformGroup}\n * @example\n *\n * const shader = new Shader({\n * glProgram: glProgram,\n * gpuProgram: gpuProgram,\n * resources: {\n * uTexture: texture.source,\n * uSampler: texture.sampler,\n * uColor: [1, 0, 0, 1],\n * },\n * });\n *\n * // update the uniforms\n * shader.resources.uColor[1] = 1;\n * shader.resources.uTexture = texture2.source;\n * @class\n * @memberof rendering\n */\nexport class Shader extends EventEmitter<{'destroy': Shader}>\n{\n /** An instance of the GPU program used by the WebGPU renderer */\n public gpuProgram: GpuProgram;\n /** An instance of the GL program used by the WebGL renderer */\n public glProgram: GlProgram;\n /**\n * A number that uses two bits on whether the shader is compatible with the WebGL renderer and/or the WebGPU renderer.\n * 0b00 - not compatible with either\n * 0b01 - compatible with WebGL\n * 0b10 - compatible with WebGPU\n * This is automatically set based on if a {@link GlProgram} or {@link GpuProgram} is provided.\n */\n public readonly compatibleRenderers: number;\n /** */\n public groups: Record<number, BindGroup>;\n /** A record of the resources used by the shader. */\n public resources: Record<string, any>;\n /**\n * A record of the uniform groups and resources used by the shader.\n * This is used by WebGL renderer to sync uniform data.\n * @internal\n * @ignore\n */\n public _uniformBindMap: Record<number, Record<number, string>> = Object.create(null);\n private readonly _ownedBindGroups: BindGroup[] = [];\n\n /**\n * Fired after rendering finishes.\n * @event rendering.Shader#destroy\n */\n\n /**\n * There are two ways to create a shader.\n * one is to pass in resources which is a record of uniform groups and resources.\n * another is to pass in groups which is a record of {@link BindGroup}s.\n * this second method is really to make use of shared {@link BindGroup}s.\n * For most cases you will want to use resources as they are easier to work with.\n * USe Groups if you want to share {@link BindGroup}s between shaders.\n * you cannot mix and match - either use resources or groups.\n * @param {ShaderWithResourcesDescriptor} options - The options for the shader using ShaderWithResourcesDescriptor.\n */\n constructor(options: ShaderWithResources);\n constructor(options: ShaderWithGroups);\n constructor(options: ShaderDescriptor)\n {\n super();\n\n /* eslint-disable prefer-const */\n let {\n gpuProgram,\n glProgram,\n groups,\n resources,\n compatibleRenderers,\n groupMap\n } = options;\n /* eslint-enable prefer-const */\n\n this.gpuProgram = gpuProgram;\n this.glProgram = glProgram;\n\n if (compatibleRenderers === undefined)\n {\n compatibleRenderers = 0;\n\n if (gpuProgram)compatibleRenderers |= RendererType.WEBGPU;\n if (glProgram)compatibleRenderers |= RendererType.WEBGL;\n }\n\n this.compatibleRenderers = compatibleRenderers;\n\n const nameHash: Record<string, GroupsData> = {};\n\n if (!resources && !groups)\n {\n resources = {};\n }\n\n if (resources && groups)\n {\n throw new Error('[Shader] Cannot have both resources and groups');\n }\n else if (!gpuProgram && groups && !groupMap)\n {\n throw new Error('[Shader] No group map or WebGPU shader provided - consider using resources instead.');\n }\n else if (!gpuProgram && groups && groupMap)\n {\n for (const i in groupMap)\n {\n for (const j in groupMap[i])\n {\n const uniformName = groupMap[i][j];\n\n nameHash[uniformName] = {\n group: i as unknown as number,\n binding: j as unknown as number,\n name: uniformName\n };\n }\n }\n }\n else if (gpuProgram && groups && !groupMap)\n {\n const groupData = gpuProgram.structsAndGroups.groups;\n\n groupMap = {};\n\n groupData.forEach((data) =>\n {\n groupMap[data.group] = groupMap[data.group] || {};\n groupMap[data.group][data.binding] = data.name;\n\n nameHash[data.name] = data;\n });\n }\n else if (resources)\n {\n groups = {};\n groupMap = {};\n\n if (gpuProgram)\n {\n const groupData = gpuProgram.structsAndGroups.groups;\n\n groupData.forEach((data) =>\n {\n groupMap[data.group] = groupMap[data.group] || {};\n groupMap[data.group][data.binding] = data.name;\n\n nameHash[data.name] = data;\n });\n }\n\n let bindTick = 0;\n\n for (const i in resources)\n {\n if (nameHash[i]) continue;\n\n // build out a dummy bind group..\n if (!groups[99])\n {\n groups[99] = new BindGroup();\n this._ownedBindGroups.push(groups[99]);\n }\n // Yes i know this is a little strange, but wil line up the shaders neatly\n // basically we want to be driven by how webGPU does things.\n // so making a fake group will work and not affect gpu as it means no gpu shader was provided..\n nameHash[i] = { group: 99, binding: bindTick, name: i };\n\n groupMap[99] = groupMap[99] || {};\n groupMap[99][bindTick] = i;\n\n bindTick++;\n }\n\n for (const i in resources)\n {\n const name = i;\n let value = resources[i];\n\n if (!(value.source) && !(value as BindResource)._resourceType)\n {\n value = new UniformGroup(value);\n }\n\n const data = nameHash[name];\n\n if (data)\n {\n if (!groups[data.group])\n {\n groups[data.group] = new BindGroup();\n\n this._ownedBindGroups.push(groups[data.group]);\n }\n\n groups[data.group].setResource(value, data.binding);\n }\n }\n }\n\n this.groups = groups;\n this._uniformBindMap = groupMap;\n\n this.resources = this._buildResourceAccessor(groups, nameHash);\n }\n\n /**\n * Sometimes a resource group will be provided later (for example global uniforms)\n * In such cases, this method can be used to let the shader know about the group.\n * @param name - the name of the resource group\n * @param groupIndex - the index of the group (should match the webGPU shader group location)\n * @param bindIndex - the index of the bind point (should match the webGPU shader bind point)\n */\n public addResource(name: string, groupIndex: number, bindIndex: number): void\n {\n this._uniformBindMap[groupIndex] ||= {};\n\n this._uniformBindMap[groupIndex][bindIndex] ||= name;\n\n if (!this.groups[groupIndex])\n {\n this.groups[groupIndex] = new BindGroup();\n this._ownedBindGroups.push(this.groups[groupIndex]);\n }\n }\n\n private _buildResourceAccessor(groups: ShaderGroups, nameHash: Record<string, GroupsData>)\n {\n const uniformsOut = {};\n\n for (const i in nameHash)\n {\n const data = nameHash[i];\n\n // add getter setter for uniforms\n Object.defineProperty(uniformsOut, data.name, {\n get()\n {\n return groups[data.group].getResource(data.binding);\n },\n set(value)\n {\n groups[data.group].setResource(value, data.binding);\n }\n });\n }\n\n return uniformsOut;\n }\n\n /**\n * Use to destroy the shader when its not longer needed.\n * It will destroy the resources and remove listeners.\n * @param destroyPrograms - if the programs should be destroyed as well.\n * Make sure its not being used by other shaders!\n */\n public destroy(destroyPrograms = false): void\n {\n this.emit('destroy', this);\n\n if (destroyPrograms)\n {\n this.gpuProgram?.destroy();\n this.glProgram?.destroy();\n }\n\n this.gpuProgram = null;\n this.glProgram = null;\n\n this.removeAllListeners();\n\n this._uniformBindMap = null;\n\n this._ownedBindGroups.forEach((bindGroup) =>\n {\n bindGroup.destroy();\n });\n\n (this._ownedBindGroups as null) = null;\n\n this.resources = null;\n this.groups = null;\n }\n\n /**\n * A short hand function to create a shader based of a vertex and fragment shader.\n * @param options\n * @returns A shiny new PixiJS shader!\n */\n public static from(options: ShaderFromGroups): Shader;\n public static from(options: ShaderFromResources): Shader;\n public static from(options: ShaderFromGroups & ShaderFromResources): Shader\n {\n const { gpu, gl, ...rest } = options;\n\n let gpuProgram: GpuProgram;\n let glProgram: GlProgram;\n\n if (gpu)\n {\n gpuProgram = GpuProgram.from(gpu);\n }\n\n if (gl)\n {\n glProgram = GlProgram.from(gl);\n }\n\n return new Shader({\n gpuProgram,\n glProgram,\n ...rest\n });\n }\n}\n"],"names":[],"mappings":";;;;;;;;AAiJO,MAAM,eAAe,YAC5B,CAAA;AAAA,EA2CI,YAAY,OACZ,EAAA;AACI,IAAM,KAAA,EAAA,CAAA;AAtBV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAO,IAAA,CAAA,eAAA,mBAAiE,MAAA,CAAA,MAAA,CAAO,IAAI,CAAA,CAAA;AACnF,IAAA,IAAA,CAAiB,mBAAgC,EAAC,CAAA;AAwB9C,IAAI,IAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,mBAAA;AAAA,MACA,QAAA;AAAA,KACA,GAAA,OAAA,CAAA;AAGJ,IAAA,IAAA,CAAK,UAAa,GAAA,UAAA,CAAA;AAClB,IAAA,IAAA,CAAK,SAAY,GAAA,SAAA,CAAA;AAEjB,IAAA,IAAI,wBAAwB,KAC5B,CAAA,EAAA;AACI,MAAsB,mBAAA,GAAA,CAAA,CAAA;AAEtB,MAAI,IAAA,UAAA;AAAW,QAAA,mBAAA,IAAuB,YAAa,CAAA,MAAA,CAAA;AACnD,MAAI,IAAA,SAAA;AAAU,QAAA,mBAAA,IAAuB,YAAa,CAAA,KAAA,CAAA;AAAA,KACtD;AAEA,IAAA,IAAA,CAAK,mBAAsB,GAAA,mBAAA,CAAA;AAE3B,IAAA,MAAM,WAAuC,EAAC,CAAA;AAE9C,IAAI,IAAA,CAAC,SAAa,IAAA,CAAC,MACnB,EAAA;AACI,MAAA,SAAA,GAAY,EAAC,CAAA;AAAA,KACjB;AAEA,IAAA,IAAI,aAAa,MACjB,EAAA;AACI,MAAM,MAAA,IAAI,MAAM,gDAAgD,CAAA,CAAA;AAAA,KAE3D,MAAA,IAAA,CAAC,UAAc,IAAA,MAAA,IAAU,CAAC,QACnC,EAAA;AACI,MAAM,MAAA,IAAI,MAAM,qFAAqF,CAAA,CAAA;AAAA,KAEhG,MAAA,IAAA,CAAC,UAAc,IAAA,MAAA,IAAU,QAClC,EAAA;AACI,MAAA,KAAA,MAAW,KAAK,QAChB,EAAA;AACI,QAAW,KAAA,MAAA,CAAA,IAAK,QAAS,CAAA,CAAC,CAC1B,EAAA;AACI,UAAA,MAAM,WAAc,GAAA,QAAA,CAAS,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA;AAEjC,UAAA,QAAA,CAAS,WAAW,CAAI,GAAA;AAAA,YACpB,KAAO,EAAA,CAAA;AAAA,YACP,OAAS,EAAA,CAAA;AAAA,YACT,IAAM,EAAA,WAAA;AAAA,WACV,CAAA;AAAA,SACJ;AAAA,OACJ;AAAA,KAEK,MAAA,IAAA,UAAA,IAAc,MAAU,IAAA,CAAC,QAClC,EAAA;AACI,MAAM,MAAA,SAAA,GAAY,WAAW,gBAAiB,CAAA,MAAA,CAAA;AAE9C,MAAA,QAAA,GAAW,EAAC,CAAA;AAEZ,MAAU,SAAA,CAAA,OAAA,CAAQ,CAAC,IACnB,KAAA;AACI,QAAA,QAAA,CAAS,KAAK,KAAK,CAAA,GAAI,SAAS,IAAK,CAAA,KAAK,KAAK,EAAC,CAAA;AAChD,QAAA,QAAA,CAAS,KAAK,KAAK,CAAA,CAAE,IAAK,CAAA,OAAO,IAAI,IAAK,CAAA,IAAA,CAAA;AAE1C,QAAS,QAAA,CAAA,IAAA,CAAK,IAAI,CAAI,GAAA,IAAA,CAAA;AAAA,OACzB,CAAA,CAAA;AAAA,eAEI,SACT,EAAA;AACI,MAAA,MAAA,GAAS,EAAC,CAAA;AACV,MAAA,QAAA,GAAW,EAAC,CAAA;AAEZ,MAAA,IAAI,UACJ,EAAA;AACI,QAAM,MAAA,SAAA,GAAY,WAAW,gBAAiB,CAAA,MAAA,CAAA;AAE9C,QAAU,SAAA,CAAA,OAAA,CAAQ,CAAC,IACnB,KAAA;AACI,UAAA,QAAA,CAAS,KAAK,KAAK,CAAA,GAAI,SAAS,IAAK,CAAA,KAAK,KAAK,EAAC,CAAA;AAChD,UAAA,QAAA,CAAS,KAAK,KAAK,CAAA,CAAE,IAAK,CAAA,OAAO,IAAI,IAAK,CAAA,IAAA,CAAA;AAE1C,UAAS,QAAA,CAAA,IAAA,CAAK,IAAI,CAAI,GAAA,IAAA,CAAA;AAAA,SACzB,CAAA,CAAA;AAAA,OACL;AAEA,MAAA,IAAI,QAAW,GAAA,CAAA,CAAA;AAEf,MAAA,KAAA,MAAW,KAAK,SAChB,EAAA;AACI,QAAA,IAAI,SAAS,CAAC,CAAA;AAAG,UAAA,SAAA;AAGjB,QAAI,IAAA,CAAC,MAAO,CAAA,EAAE,CACd,EAAA;AACI,UAAO,MAAA,CAAA,EAAE,CAAI,GAAA,IAAI,SAAU,EAAA,CAAA;AAC3B,UAAA,IAAA,CAAK,gBAAiB,CAAA,IAAA,CAAK,MAAO,CAAA,EAAE,CAAC,CAAA,CAAA;AAAA,SACzC;AAIA,QAAS,QAAA,CAAA,CAAC,IAAI,EAAE,KAAA,EAAO,IAAI,OAAS,EAAA,QAAA,EAAU,MAAM,CAAE,EAAA,CAAA;AAEtD,QAAA,QAAA,CAAS,EAAE,CAAA,GAAI,QAAS,CAAA,EAAE,KAAK,EAAC,CAAA;AAChC,QAAS,QAAA,CAAA,EAAE,CAAE,CAAA,QAAQ,CAAI,GAAA,CAAA,CAAA;AAEzB,QAAA,QAAA,EAAA,CAAA;AAAA,OACJ;AAEA,MAAA,KAAA,MAAW,KAAK,SAChB,EAAA;AACI,QAAA,MAAM,IAAO,GAAA,CAAA,CAAA;AACb,QAAI,IAAA,KAAA,GAAQ,UAAU,CAAC,CAAA,CAAA;AAEvB,QAAA,IAAI,CAAE,KAAA,CAAM,MAAW,IAAA,CAAE,MAAuB,aAChD,EAAA;AACI,UAAQ,KAAA,GAAA,IAAI,aAAa,KAAK,CAAA,CAAA;AAAA,SAClC;AAEA,QAAM,MAAA,IAAA,GAAO,SAAS,IAAI,CAAA,CAAA;AAE1B,QAAA,IAAI,IACJ,EAAA;AACI,UAAA,IAAI,CAAC,MAAA,CAAO,IAAK,CAAA,KAAK,CACtB,EAAA;AACI,YAAA,MAAA,CAAO,IAAK,CAAA,KAAK,CAAI,GAAA,IAAI,SAAU,EAAA,CAAA;AAEnC,YAAA,IAAA,CAAK,gBAAiB,CAAA,IAAA,CAAK,MAAO,CAAA,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA;AAAA,WACjD;AAEA,UAAA,MAAA,CAAO,KAAK,KAAK,CAAA,CAAE,WAAY,CAAA,KAAA,EAAO,KAAK,OAAO,CAAA,CAAA;AAAA,SACtD;AAAA,OACJ;AAAA,KACJ;AAEA,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA,CAAA;AACd,IAAA,IAAA,CAAK,eAAkB,GAAA,QAAA,CAAA;AAEvB,IAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAK,sBAAuB,CAAA,MAAA,EAAQ,QAAQ,CAAA,CAAA;AAAA,GACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,WAAA,CAAY,IAAc,EAAA,UAAA,EAAoB,SACrD,EAAA;AAvVJ,IAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAwVQ,IAAK,CAAA,EAAA,GAAA,IAAA,CAAA,eAAA,EAAL,iCAAqC,EAAC,CAAA,CAAA;AAEtC,IAAK,CAAA,EAAA,GAAA,IAAA,CAAA,eAAA,CAAgB,UAAU,CAAA,EAA/B,SAAgD,CAAA,KAAA,EAAA,CAAA,SAAA,CAAA,GAAA,IAAA,CAAA,CAAA;AAEhD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAO,CAAA,UAAU,CAC3B,EAAA;AACI,MAAA,IAAA,CAAK,MAAO,CAAA,UAAU,CAAI,GAAA,IAAI,SAAU,EAAA,CAAA;AACxC,MAAA,IAAA,CAAK,gBAAiB,CAAA,IAAA,CAAK,IAAK,CAAA,MAAA,CAAO,UAAU,CAAC,CAAA,CAAA;AAAA,KACtD;AAAA,GACJ;AAAA,EAEQ,sBAAA,CAAuB,QAAsB,QACrD,EAAA;AACI,IAAA,MAAM,cAAc,EAAC,CAAA;AAErB,IAAA,KAAA,MAAW,KAAK,QAChB,EAAA;AACI,MAAM,MAAA,IAAA,GAAO,SAAS,CAAC,CAAA,CAAA;AAGvB,MAAO,MAAA,CAAA,cAAA,CAAe,WAAa,EAAA,IAAA,CAAK,IAAM,EAAA;AAAA,QAC1C,GACA,GAAA;AACI,UAAA,OAAO,OAAO,IAAK,CAAA,KAAK,CAAE,CAAA,WAAA,CAAY,KAAK,OAAO,CAAA,CAAA;AAAA,SACtD;AAAA,QACA,IAAI,KACJ,EAAA;AACI,UAAA,MAAA,CAAO,KAAK,KAAK,CAAA,CAAE,WAAY,CAAA,KAAA,EAAO,KAAK,OAAO,CAAA,CAAA;AAAA,SACtD;AAAA,OACH,CAAA,CAAA;AAAA,KACL;AAEA,IAAO,OAAA,WAAA,CAAA;AAAA,GACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,OAAA,CAAQ,kBAAkB,KACjC,EAAA;AACI,IAAK,IAAA,CAAA,IAAA,CAAK,WAAW,IAAI,CAAA,CAAA;AAEzB,IAAA,IAAI,eACJ,EAAA;AACI,MAAA,IAAA,CAAK,YAAY,OAAQ,EAAA,CAAA;AACzB,MAAA,IAAA,CAAK,WAAW,OAAQ,EAAA,CAAA;AAAA,KAC5B;AAEA,IAAA,IAAA,CAAK,UAAa,GAAA,IAAA,CAAA;AAClB,IAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAA;AAEjB,IAAA,IAAA,CAAK,kBAAmB,EAAA,CAAA;AAExB,IAAA,IAAA,CAAK,eAAkB,GAAA,IAAA,CAAA;AAEvB,IAAK,IAAA,CAAA,gBAAA,CAAiB,OAAQ,CAAA,CAAC,SAC/B,KAAA;AACI,MAAA,SAAA,CAAU,OAAQ,EAAA,CAAA;AAAA,KACrB,CAAA,CAAA;AAED,IAAC,KAAK,gBAA4B,GAAA,IAAA,CAAA;AAElC,IAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAA;AACjB,IAAA,IAAA,CAAK,MAAS,GAAA,IAAA,CAAA;AAAA,GAClB;AAAA,EASA,OAAc,KAAK,OACnB,EAAA;AACI,IAAA,MAAM,EAAE,GAAA,EAAK,EAAI,EAAA,GAAG,MAAS,GAAA,OAAA,CAAA;AAE7B,IAAI,IAAA,UAAA,CAAA;AACJ,IAAI,IAAA,SAAA,CAAA;AAEJ,IAAA,IAAI,GACJ,EAAA;AACI,MAAa,UAAA,GAAA,UAAA,CAAW,KAAK,GAAG,CAAA,CAAA;AAAA,KACpC;AAEA,IAAA,IAAI,EACJ,EAAA;AACI,MAAY,SAAA,GAAA,SAAA,CAAU,KAAK,EAAE,CAAA,CAAA;AAAA,KACjC;AAEA,IAAA,OAAO,IAAI,MAAO,CAAA;AAAA,MACd,UAAA;AAAA,MACA,SAAA;AAAA,MACA,GAAG,IAAA;AAAA,KACN,CAAA,CAAA;AAAA,GACL;AACJ;;;;"}