fabric
Version:
Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.
1 lines • 25.2 kB
Source Map (JSON)
{"version":3,"file":"BaseFilter.mjs","sources":["../../../src/filters/BaseFilter.ts"],"sourcesContent":["import { getEnv } from '../env';\nimport { createCanvasElement } from '../util/misc/dom';\nimport type {\n T2DPipelineState,\n TWebGLAttributeLocationMap,\n TWebGLPipelineState,\n TWebGLProgramCacheItem,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport { isWebGLPipelineState } from './utils';\nimport {\n highPsourceCode,\n identityFragmentShader,\n vertexSource,\n} from './shaders/baseFilter';\nimport type { Abortable } from '../typedefs';\nimport { FabricError } from '../util/internals/console';\n\nconst regex = new RegExp(highPsourceCode, 'g');\n\nexport class BaseFilter<\n Name extends string,\n OwnProps extends Record<string, any> = object\n> {\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n get type(): Name {\n return (this.constructor as typeof BaseFilter).type as Name;\n }\n\n /**\n * The class type. Used to identify which class this is.\n * This is used for serialization purposes and internally it can be used\n * to identify classes. As a developer you could use `instance of Class`\n * but to avoid importing all the code and blocking tree shaking we try\n * to avoid doing that.\n */\n static type = 'BaseFilter';\n\n /**\n * Contains the uniform locations for the fragment shader.\n * uStepW and uStepH are handled by the BaseFilter, each filter class\n * needs to specify all the one that are needed\n */\n static uniformLocations: string[] = [];\n\n declare static defaults: Record<string, unknown>;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor({\n type,\n ...options\n }: { type?: never } & Partial<OwnProps> & Record<string, any> = {}) {\n Object.assign(\n this,\n (this.constructor as typeof BaseFilter).defaults,\n options\n );\n }\n\n protected getFragmentSource(): string {\n return identityFragmentShader;\n }\n\n getVertexSource(): string {\n return vertexSource;\n }\n\n /**\n * Compile this filter's shader program.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n * @param {String} fragmentSource fragmentShader source for compilation\n * @param {String} vertexSource vertexShader source for compilation\n */\n createProgram(\n gl: WebGLRenderingContext,\n fragmentSource: string = this.getFragmentSource(),\n vertexSource: string = this.getVertexSource()\n ) {\n const {\n WebGLProbe: { GLPrecision = 'highp' },\n } = getEnv();\n if (GLPrecision !== 'highp') {\n fragmentSource = fragmentSource.replace(\n regex,\n highPsourceCode.replace('highp', GLPrecision)\n );\n }\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n const program = gl.createProgram();\n\n if (!vertexShader || !fragmentShader || !program) {\n throw new FabricError(\n 'Vertex, fragment shader or program creation error'\n );\n }\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Vertex shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n vertexShader\n )}`\n );\n }\n\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n throw new FabricError(\n `Fragment shader compile error for ${this.type}: ${gl.getShaderInfoLog(\n fragmentShader\n )}`\n );\n }\n\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new FabricError(\n `Shader link error for \"${this.type}\" ${gl.getProgramInfoLog(program)}`\n );\n }\n\n const uniformLocations = this.getUniformLocations(gl, program) || {};\n uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n\n return {\n program,\n attributeLocations: this.getAttributeLocations(gl, program),\n uniformLocations,\n };\n }\n\n /**\n * Return a map of attribute names to WebGLAttributeLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n * @returns {Object} A map of attribute names to attribute locations.\n */\n getAttributeLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram\n ): TWebGLAttributeLocationMap {\n return {\n aPosition: gl.getAttribLocation(program, 'aPosition'),\n };\n }\n\n /**\n * Return a map of uniform names to WebGLUniformLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n * @returns {Object} A map of uniform names to uniform locations.\n */\n getUniformLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram\n ): TWebGLUniformLocationMap {\n const locations = (this.constructor as unknown as typeof BaseFilter<string>)\n .uniformLocations;\n\n const uniformLocations: Record<string, WebGLUniformLocation | null> = {};\n for (let i = 0; i < locations.length; i++) {\n uniformLocations[locations[i]] = gl.getUniformLocation(\n program,\n locations[i]\n );\n }\n return uniformLocations;\n }\n\n /**\n * Send attribute data from this filter to its shader program on the GPU.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} attributeLocations A map of shader attribute names to their locations.\n */\n sendAttributeData(\n gl: WebGLRenderingContext,\n attributeLocations: Record<string, number>,\n aPositionData: Float32Array\n ) {\n const attributeLocation = attributeLocations.aPosition;\n const buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(attributeLocation);\n gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n }\n\n _setupFrameBuffer(options: TWebGLPipelineState) {\n const gl = options.context;\n if (options.passes > 1) {\n const width = options.destinationWidth;\n const height = options.destinationHeight;\n if (options.sourceWidth !== width || options.sourceHeight !== height) {\n gl.deleteTexture(options.targetTexture);\n options.targetTexture = options.filterBackend.createTexture(\n gl,\n width,\n height\n );\n }\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n options.targetTexture,\n 0\n );\n } else {\n // draw last filter on canvas and not to framebuffer.\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.finish();\n }\n }\n\n _swapTextures(options: TWebGLPipelineState) {\n options.passes--;\n options.pass++;\n const temp = options.targetTexture;\n options.targetTexture = options.sourceTexture;\n options.sourceTexture = temp;\n }\n\n /**\n * Generic isNeutral implementation for one parameter based filters.\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n * @param {Object} options\n **/\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n isNeutralState(options?: any): boolean {\n return false;\n }\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo(options: TWebGLPipelineState | T2DPipelineState) {\n if (isWebGLPipelineState(options)) {\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n } else {\n this.applyTo2d(options);\n }\n }\n\n applyTo2d(options: T2DPipelineState): void {\n // override by subclass\n }\n\n /**\n * Returns a string that represent the current selected shader code for the filter.\n * Used to force recompilation when parameters change or to retrieve the shader from cache\n * @type string\n **/\n getCacheKey(): string {\n return this.type;\n }\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n * @return {WebGLProgram} the compiled program shader\n */\n retrieveShader(options: TWebGLPipelineState): TWebGLProgramCacheItem {\n const key = this.getCacheKey();\n if (!options.programCache[key]) {\n options.programCache[key] = this.createProgram(options.context);\n }\n return options.programCache[key];\n }\n\n /**\n * Apply this filter using webgl.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context;\n const shader = this.retrieveShader(options);\n if (options.pass === 0 && options.originalTexture) {\n gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n } else {\n gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n }\n gl.useProgram(shader.program);\n this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n this.sendUniformData(gl, shader.uniformLocations);\n gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n }\n\n bindAdditionalTexture(\n gl: WebGLRenderingContext,\n texture: WebGLTexture,\n textureUnit: number\n ) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n // reset active texture to 0 as usual\n gl.activeTexture(gl.TEXTURE0);\n }\n\n unbindAdditionalTexture(gl: WebGLRenderingContext, textureUnit: number) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.activeTexture(gl.TEXTURE0);\n }\n\n /**\n * Send uniform data from this filter to its shader program on the GPU.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} uniformLocations A map of shader uniform names to their locations.\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap\n ): void {\n // override by subclass\n }\n\n /**\n * If needed by a 2d filter, this functions can create an helper canvas to be used\n * remember that options.targetCanvas is available for use till end of chain.\n */\n createHelpLayer(options: T2DPipelineState) {\n if (!options.helpLayer) {\n const helpLayer = createCanvasElement();\n helpLayer.width = options.sourceWidth;\n helpLayer.height = options.sourceHeight;\n options.helpLayer = helpLayer;\n }\n }\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject(): { type: Name } & OwnProps {\n const defaultKeys = Object.keys(\n (this.constructor as typeof BaseFilter).defaults\n ) as (keyof OwnProps)[];\n\n return {\n type: this.type,\n ...defaultKeys.reduce<OwnProps>((acc, key) => {\n //@ts-expect-error TS doesn't get i want an object that looks like this\n acc[key] = this[key as keyof this];\n return acc;\n }, {} as OwnProps),\n };\n }\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON() {\n // delegate, not alias\n return this.toObject();\n }\n\n static async fromObject(\n { type, ...filterOptions }: Record<string, any>,\n options: Abortable\n ): Promise<BaseFilter<string, object>> {\n return new this(filterOptions);\n }\n}\n"],"names":["regex","RegExp","highPsourceCode","BaseFilter","type","constructor","_ref","arguments","length","undefined","options","_objectWithoutProperties","_excluded","Object","assign","defaults","getFragmentSource","identityFragmentShader","getVertexSource","vertexSource","createProgram","gl","fragmentSource","WebGLProbe","GLPrecision","getEnv","replace","vertexShader","createShader","VERTEX_SHADER","fragmentShader","FRAGMENT_SHADER","program","FabricError","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","concat","getShaderInfoLog","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","uniformLocations","getUniformLocations","uStepW","getUniformLocation","uStepH","attributeLocations","getAttributeLocations","aPosition","getAttribLocation","locations","i","sendAttributeData","aPositionData","attributeLocation","buffer","createBuffer","bindBuffer","ARRAY_BUFFER","enableVertexAttribArray","vertexAttribPointer","FLOAT","bufferData","STATIC_DRAW","_setupFrameBuffer","context","passes","width","destinationWidth","height","destinationHeight","sourceWidth","sourceHeight","deleteTexture","targetTexture","filterBackend","createTexture","framebufferTexture2D","FRAMEBUFFER","COLOR_ATTACHMENT0","TEXTURE_2D","bindFramebuffer","finish","_swapTextures","pass","temp","sourceTexture","isNeutralState","applyTo","isWebGLPipelineState","applyToWebGL","applyTo2d","getCacheKey","retrieveShader","key","programCache","shader","originalTexture","bindTexture","useProgram","uniform1f","sendUniformData","viewport","drawArrays","TRIANGLE_STRIP","bindAdditionalTexture","texture","textureUnit","activeTexture","TEXTURE0","unbindAdditionalTexture","createHelpLayer","helpLayer","createCanvasElement","toObject","defaultKeys","keys","_objectSpread","reduce","acc","toJSON","fromObject","_ref2","filterOptions","_excluded2","_defineProperty"],"mappings":";;;;;;;;;AAkBA,MAAMA,KAAK,GAAG,IAAIC,MAAM,CAACC,eAAe,EAAE,GAAG,CAAC,CAAA;AAEvC,MAAMC,UAAU,CAGrB;AACA;AACF;AACA;AACA;AACA;EACE,IAAIC,IAAIA,GAAS;AACf,IAAA,OAAQ,IAAI,CAACC,WAAW,CAAuBD,IAAI,CAAA;AACrD,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;;AAYE;AACF;AACA;AACA;AACEC,EAAAA,WAAWA,GAGyD;AAAA,IAAA,IAAAC,IAAA,GAAAC,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAA,CAAA,CAAA,GAAJ,EAAE,CAAA;AAHtD,MAEPG,OAAO,GAAAC,wBAAA,CAAAL,IAAA,EAAAM,SAAA,EAAA;AAEVC,IAAAA,MAAM,CAACC,MAAM,CACX,IAAI,EACH,IAAI,CAACT,WAAW,CAAuBU,QAAQ,EAChDL,OACF,CAAC,CAAA;AACH,GAAA;AAEUM,EAAAA,iBAAiBA,GAAW;AACpC,IAAA,OAAOC,sBAAsB,CAAA;AAC/B,GAAA;AAEAC,EAAAA,eAAeA,GAAW;AACxB,IAAA,OAAOC,YAAY,CAAA;AACrB,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACEC,aAAaA,CACXC,EAAyB,EAGzB;AAAA,IAAA,IAFAC,cAAsB,GAAAf,SAAA,CAAAC,MAAA,QAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAG,CAAA,CAAA,GAAA,IAAI,CAACS,iBAAiB,EAAE,CAAA;AAAA,IAAA,IACjDG,YAAoB,GAAAZ,SAAA,CAAAC,MAAA,QAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAG,CAAA,CAAA,GAAA,IAAI,CAACW,eAAe,EAAE,CAAA;IAE7C,MAAM;AACJK,MAAAA,UAAU,EAAE;AAAEC,QAAAA,WAAW,GAAG,OAAA;AAAQ,OAAA;KACrC,GAAGC,MAAM,EAAE,CAAA;IACZ,IAAID,WAAW,KAAK,OAAO,EAAE;AAC3BF,MAAAA,cAAc,GAAGA,cAAc,CAACI,OAAO,CACrC1B,KAAK,EACLE,eAAe,CAACwB,OAAO,CAAC,OAAO,EAAEF,WAAW,CAC9C,CAAC,CAAA;AACH,KAAA;IACA,MAAMG,YAAY,GAAGN,EAAE,CAACO,YAAY,CAACP,EAAE,CAACQ,aAAa,CAAC,CAAA;IACtD,MAAMC,cAAc,GAAGT,EAAE,CAACO,YAAY,CAACP,EAAE,CAACU,eAAe,CAAC,CAAA;AAC1D,IAAA,MAAMC,OAAO,GAAGX,EAAE,CAACD,aAAa,EAAE,CAAA;IAElC,IAAI,CAACO,YAAY,IAAI,CAACG,cAAc,IAAI,CAACE,OAAO,EAAE;AAChD,MAAA,MAAM,IAAIC,WAAW,CACnB,mDACF,CAAC,CAAA;AACH,KAAA;AACAZ,IAAAA,EAAE,CAACa,YAAY,CAACP,YAAY,EAAER,YAAY,CAAC,CAAA;AAC3CE,IAAAA,EAAE,CAACc,aAAa,CAACR,YAAY,CAAC,CAAA;IAC9B,IAAI,CAACN,EAAE,CAACe,kBAAkB,CAACT,YAAY,EAAEN,EAAE,CAACgB,cAAc,CAAC,EAAE;AAC3D,MAAA,MAAM,IAAIJ,WAAW,CAAA,kCAAA,CAAAK,MAAA,CACgB,IAAI,CAAClC,IAAI,EAAA,IAAA,CAAA,CAAAkC,MAAA,CAAKjB,EAAE,CAACkB,gBAAgB,CAClEZ,YACF,CAAC,CACH,CAAC,CAAA;AACH,KAAA;AAEAN,IAAAA,EAAE,CAACa,YAAY,CAACJ,cAAc,EAAER,cAAc,CAAC,CAAA;AAC/CD,IAAAA,EAAE,CAACc,aAAa,CAACL,cAAc,CAAC,CAAA;IAChC,IAAI,CAACT,EAAE,CAACe,kBAAkB,CAACN,cAAc,EAAET,EAAE,CAACgB,cAAc,CAAC,EAAE;AAC7D,MAAA,MAAM,IAAIJ,WAAW,CAAA,oCAAA,CAAAK,MAAA,CACkB,IAAI,CAAClC,IAAI,EAAA,IAAA,CAAA,CAAAkC,MAAA,CAAKjB,EAAE,CAACkB,gBAAgB,CACpET,cACF,CAAC,CACH,CAAC,CAAA;AACH,KAAA;AAEAT,IAAAA,EAAE,CAACmB,YAAY,CAACR,OAAO,EAAEL,YAAY,CAAC,CAAA;AACtCN,IAAAA,EAAE,CAACmB,YAAY,CAACR,OAAO,EAAEF,cAAc,CAAC,CAAA;AACxCT,IAAAA,EAAE,CAACoB,WAAW,CAACT,OAAO,CAAC,CAAA;IACvB,IAAI,CAACX,EAAE,CAACqB,mBAAmB,CAACV,OAAO,EAAEX,EAAE,CAACsB,WAAW,CAAC,EAAE;AACpD,MAAA,MAAM,IAAIV,WAAW,CAAA,0BAAA,CAAAK,MAAA,CACO,IAAI,CAAClC,IAAI,EAAA,KAAA,CAAA,CAAAkC,MAAA,CAAKjB,EAAE,CAACuB,iBAAiB,CAACZ,OAAO,CAAC,CACvE,CAAC,CAAA;AACH,KAAA;AAEA,IAAA,MAAMa,gBAAgB,GAAG,IAAI,CAACC,mBAAmB,CAACzB,EAAE,EAAEW,OAAO,CAAC,IAAI,EAAE,CAAA;IACpEa,gBAAgB,CAACE,MAAM,GAAG1B,EAAE,CAAC2B,kBAAkB,CAAChB,OAAO,EAAE,QAAQ,CAAC,CAAA;IAClEa,gBAAgB,CAACI,MAAM,GAAG5B,EAAE,CAAC2B,kBAAkB,CAAChB,OAAO,EAAE,QAAQ,CAAC,CAAA;IAElE,OAAO;MACLA,OAAO;MACPkB,kBAAkB,EAAE,IAAI,CAACC,qBAAqB,CAAC9B,EAAE,EAAEW,OAAO,CAAC;AAC3Da,MAAAA,gBAAAA;KACD,CAAA;AACH,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACEM,EAAAA,qBAAqBA,CACnB9B,EAAyB,EACzBW,OAAqB,EACO;IAC5B,OAAO;AACLoB,MAAAA,SAAS,EAAE/B,EAAE,CAACgC,iBAAiB,CAACrB,OAAO,EAAE,WAAW,CAAA;KACrD,CAAA;AACH,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACEc,EAAAA,mBAAmBA,CACjBzB,EAAyB,EACzBW,OAAqB,EACK;AAC1B,IAAA,MAAMsB,SAAS,GAAI,IAAI,CAACjD,WAAW,CAChCwC,gBAAgB,CAAA;IAEnB,MAAMA,gBAA6D,GAAG,EAAE,CAAA;AACxE,IAAA,KAAK,IAAIU,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGD,SAAS,CAAC9C,MAAM,EAAE+C,CAAC,EAAE,EAAE;AACzCV,MAAAA,gBAAgB,CAACS,SAAS,CAACC,CAAC,CAAC,CAAC,GAAGlC,EAAE,CAAC2B,kBAAkB,CACpDhB,OAAO,EACPsB,SAAS,CAACC,CAAC,CACb,CAAC,CAAA;AACH,KAAA;AACA,IAAA,OAAOV,gBAAgB,CAAA;AACzB,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACEW,EAAAA,iBAAiBA,CACfnC,EAAyB,EACzB6B,kBAA0C,EAC1CO,aAA2B,EAC3B;AACA,IAAA,MAAMC,iBAAiB,GAAGR,kBAAkB,CAACE,SAAS,CAAA;AACtD,IAAA,MAAMO,MAAM,GAAGtC,EAAE,CAACuC,YAAY,EAAE,CAAA;IAChCvC,EAAE,CAACwC,UAAU,CAACxC,EAAE,CAACyC,YAAY,EAAEH,MAAM,CAAC,CAAA;AACtCtC,IAAAA,EAAE,CAAC0C,uBAAuB,CAACL,iBAAiB,CAAC,CAAA;AAC7CrC,IAAAA,EAAE,CAAC2C,mBAAmB,CAACN,iBAAiB,EAAE,CAAC,EAAErC,EAAE,CAAC4C,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AACnE5C,IAAAA,EAAE,CAAC6C,UAAU,CAAC7C,EAAE,CAACyC,YAAY,EAAEL,aAAa,EAAEpC,EAAE,CAAC8C,WAAW,CAAC,CAAA;AAC/D,GAAA;EAEAC,iBAAiBA,CAAC1D,OAA4B,EAAE;AAC9C,IAAA,MAAMW,EAAE,GAAGX,OAAO,CAAC2D,OAAO,CAAA;AAC1B,IAAA,IAAI3D,OAAO,CAAC4D,MAAM,GAAG,CAAC,EAAE;AACtB,MAAA,MAAMC,KAAK,GAAG7D,OAAO,CAAC8D,gBAAgB,CAAA;AACtC,MAAA,MAAMC,MAAM,GAAG/D,OAAO,CAACgE,iBAAiB,CAAA;MACxC,IAAIhE,OAAO,CAACiE,WAAW,KAAKJ,KAAK,IAAI7D,OAAO,CAACkE,YAAY,KAAKH,MAAM,EAAE;AACpEpD,QAAAA,EAAE,CAACwD,aAAa,CAACnE,OAAO,CAACoE,aAAa,CAAC,CAAA;AACvCpE,QAAAA,OAAO,CAACoE,aAAa,GAAGpE,OAAO,CAACqE,aAAa,CAACC,aAAa,CACzD3D,EAAE,EACFkD,KAAK,EACLE,MACF,CAAC,CAAA;AACH,OAAA;MACApD,EAAE,CAAC4D,oBAAoB,CACrB5D,EAAE,CAAC6D,WAAW,EACd7D,EAAE,CAAC8D,iBAAiB,EACpB9D,EAAE,CAAC+D,UAAU,EACb1E,OAAO,CAACoE,aAAa,EACrB,CACF,CAAC,CAAA;AACH,KAAC,MAAM;AACL;MACAzD,EAAE,CAACgE,eAAe,CAAChE,EAAE,CAAC6D,WAAW,EAAE,IAAI,CAAC,CAAA;MACxC7D,EAAE,CAACiE,MAAM,EAAE,CAAA;AACb,KAAA;AACF,GAAA;EAEAC,aAAaA,CAAC7E,OAA4B,EAAE;IAC1CA,OAAO,CAAC4D,MAAM,EAAE,CAAA;IAChB5D,OAAO,CAAC8E,IAAI,EAAE,CAAA;AACd,IAAA,MAAMC,IAAI,GAAG/E,OAAO,CAACoE,aAAa,CAAA;AAClCpE,IAAAA,OAAO,CAACoE,aAAa,GAAGpE,OAAO,CAACgF,aAAa,CAAA;IAC7ChF,OAAO,CAACgF,aAAa,GAAGD,IAAI,CAAA;AAC9B,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACE;EACAE,cAAcA,CAACjF,OAAa,EAAW;AACrC,IAAA,OAAO,KAAK,CAAA;AACd,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEkF,OAAOA,CAAClF,OAA+C,EAAE;AACvD,IAAA,IAAImF,oBAAoB,CAACnF,OAAO,CAAC,EAAE;AACjC,MAAA,IAAI,CAAC0D,iBAAiB,CAAC1D,OAAO,CAAC,CAAA;AAC/B,MAAA,IAAI,CAACoF,YAAY,CAACpF,OAAO,CAAC,CAAA;AAC1B,MAAA,IAAI,CAAC6E,aAAa,CAAC7E,OAAO,CAAC,CAAA;AAC7B,KAAC,MAAM;AACL,MAAA,IAAI,CAACqF,SAAS,CAACrF,OAAO,CAAC,CAAA;AACzB,KAAA;AACF,GAAA;EAEAqF,SAASA,CAACrF,OAAyB,EAAQ;AACzC;AAAA,GAAA;;AAGF;AACF;AACA;AACA;AACA;AACEsF,EAAAA,WAAWA,GAAW;IACpB,OAAO,IAAI,CAAC5F,IAAI,CAAA;AAClB,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACE6F,cAAcA,CAACvF,OAA4B,EAA0B;AACnE,IAAA,MAAMwF,GAAG,GAAG,IAAI,CAACF,WAAW,EAAE,CAAA;AAC9B,IAAA,IAAI,CAACtF,OAAO,CAACyF,YAAY,CAACD,GAAG,CAAC,EAAE;AAC9BxF,MAAAA,OAAO,CAACyF,YAAY,CAACD,GAAG,CAAC,GAAG,IAAI,CAAC9E,aAAa,CAACV,OAAO,CAAC2D,OAAO,CAAC,CAAA;AACjE,KAAA;AACA,IAAA,OAAO3D,OAAO,CAACyF,YAAY,CAACD,GAAG,CAAC,CAAA;AAClC,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEJ,YAAYA,CAACpF,OAA4B,EAAE;AACzC,IAAA,MAAMW,EAAE,GAAGX,OAAO,CAAC2D,OAAO,CAAA;AAC1B,IAAA,MAAM+B,MAAM,GAAG,IAAI,CAACH,cAAc,CAACvF,OAAO,CAAC,CAAA;IAC3C,IAAIA,OAAO,CAAC8E,IAAI,KAAK,CAAC,IAAI9E,OAAO,CAAC2F,eAAe,EAAE;MACjDhF,EAAE,CAACiF,WAAW,CAACjF,EAAE,CAAC+D,UAAU,EAAE1E,OAAO,CAAC2F,eAAe,CAAC,CAAA;AACxD,KAAC,MAAM;MACLhF,EAAE,CAACiF,WAAW,CAACjF,EAAE,CAAC+D,UAAU,EAAE1E,OAAO,CAACgF,aAAa,CAAC,CAAA;AACtD,KAAA;AACArE,IAAAA,EAAE,CAACkF,UAAU,CAACH,MAAM,CAACpE,OAAO,CAAC,CAAA;AAC7B,IAAA,IAAI,CAACwB,iBAAiB,CAACnC,EAAE,EAAE+E,MAAM,CAAClD,kBAAkB,EAAExC,OAAO,CAAC0C,SAAS,CAAC,CAAA;AAExE/B,IAAAA,EAAE,CAACmF,SAAS,CAACJ,MAAM,CAACvD,gBAAgB,CAACE,MAAM,EAAE,CAAC,GAAGrC,OAAO,CAACiE,WAAW,CAAC,CAAA;AACrEtD,IAAAA,EAAE,CAACmF,SAAS,CAACJ,MAAM,CAACvD,gBAAgB,CAACI,MAAM,EAAE,CAAC,GAAGvC,OAAO,CAACkE,YAAY,CAAC,CAAA;IAEtE,IAAI,CAAC6B,eAAe,CAACpF,EAAE,EAAE+E,MAAM,CAACvD,gBAAgB,CAAC,CAAA;AACjDxB,IAAAA,EAAE,CAACqF,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAEhG,OAAO,CAAC8D,gBAAgB,EAAE9D,OAAO,CAACgE,iBAAiB,CAAC,CAAA;IACtErD,EAAE,CAACsF,UAAU,CAACtF,EAAE,CAACuF,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AACxC,GAAA;AAEAC,EAAAA,qBAAqBA,CACnBxF,EAAyB,EACzByF,OAAqB,EACrBC,WAAmB,EACnB;AACA1F,IAAAA,EAAE,CAAC2F,aAAa,CAACD,WAAW,CAAC,CAAA;IAC7B1F,EAAE,CAACiF,WAAW,CAACjF,EAAE,CAAC+D,UAAU,EAAE0B,OAAO,CAAC,CAAA;AACtC;AACAzF,IAAAA,EAAE,CAAC2F,aAAa,CAAC3F,EAAE,CAAC4F,QAAQ,CAAC,CAAA;AAC/B,GAAA;AAEAC,EAAAA,uBAAuBA,CAAC7F,EAAyB,EAAE0F,WAAmB,EAAE;AACtE1F,IAAAA,EAAE,CAAC2F,aAAa,CAACD,WAAW,CAAC,CAAA;IAC7B1F,EAAE,CAACiF,WAAW,CAACjF,EAAE,CAAC+D,UAAU,EAAE,IAAI,CAAC,CAAA;AACnC/D,IAAAA,EAAE,CAAC2F,aAAa,CAAC3F,EAAE,CAAC4F,QAAQ,CAAC,CAAA;AAC/B,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACER,EAAAA,eAAeA,CACbpF,EAAyB,EACzBwB,gBAA0C,EACpC;AACN;AAAA,GAAA;;AAGF;AACF;AACA;AACA;EACEsE,eAAeA,CAACzG,OAAyB,EAAE;AACzC,IAAA,IAAI,CAACA,OAAO,CAAC0G,SAAS,EAAE;AACtB,MAAA,MAAMA,SAAS,GAAGC,mBAAmB,EAAE,CAAA;AACvCD,MAAAA,SAAS,CAAC7C,KAAK,GAAG7D,OAAO,CAACiE,WAAW,CAAA;AACrCyC,MAAAA,SAAS,CAAC3C,MAAM,GAAG/D,OAAO,CAACkE,YAAY,CAAA;MACvClE,OAAO,CAAC0G,SAAS,GAAGA,SAAS,CAAA;AAC/B,KAAA;AACF,GAAA;;AAEA;AACF;AACA;AACA;AACEE,EAAAA,QAAQA,GAA8B;IACpC,MAAMC,WAAW,GAAG1G,MAAM,CAAC2G,IAAI,CAC5B,IAAI,CAACnH,WAAW,CAAuBU,QAC1C,CAAuB,CAAA;AAEvB,IAAA,OAAA0G,cAAA,CAAA;MACErH,IAAI,EAAE,IAAI,CAACA,IAAAA;KACRmH,EAAAA,WAAW,CAACG,MAAM,CAAW,CAACC,GAAG,EAAEzB,GAAG,KAAK;AAC5C;AACAyB,MAAAA,GAAG,CAACzB,GAAG,CAAC,GAAG,IAAI,CAACA,GAAG,CAAe,CAAA;AAClC,MAAA,OAAOyB,GAAG,CAAA;KACX,EAAE,EAAc,CAAC,CAAA,CAAA;AAEtB,GAAA;;AAEA;AACF;AACA;AACA;AACEC,EAAAA,MAAMA,GAAG;AACP;AACA,IAAA,OAAO,IAAI,CAACN,QAAQ,EAAE,CAAA;AACxB,GAAA;AAEA,EAAA,aAAaO,UAAUA,CAAAC,KAAA,EAErBpH,OAAkB,EACmB;IAFrC,IAAWqH,aAAa,GAAApH,wBAAA,CAAAmH,KAAA,EAAAE,UAAA,EAAA;AAGxB,IAAA,OAAO,IAAI,IAAI,CAACD,aAAa,CAAC,CAAA;AAChC,GAAA;AACF,CAAA;AAACE,eAAA,CAvYY9H,UAAU,EAAA,MAAA,EAoBP,YAAY,CAAA,CAAA;AAE1B;AACF;AACA;AACA;AACA;AAJE8H,eAAA,CAtBW9H,UAAU,EAAA,kBAAA,EA2Be,EAAE,CAAA;;;;"}