UNPKG

@pixi-spine/base

Version:

Base of pixi-spine integration, common files for spine runtimes of different versions

1 lines 39.2 kB
{"version":3,"file":"SpineDebugRenderer.mjs","sources":["../src/SpineDebugRenderer.ts"],"sourcesContent":["import { Container } from '@pixi/display';\nimport { Graphics } from '@pixi/graphics';\nimport type { IAnimationState, IAnimationStateData } from './core/IAnimation';\nimport type { IClippingAttachment, IMeshAttachment, IRegionAttachment, ISkeleton, ISkeletonData, IVertexAttachment } from './core/ISkeleton';\nimport type { SpineBase } from './SpineBase';\nimport { AttachmentType } from './core/AttachmentType';\nimport { SkeletonBoundsBase } from './core/SkeletonBoundsBase';\n\n/**\n * Make a class that extends from this interface to create your own debug renderer.\n * @public\n */\nexport interface ISpineDebugRenderer {\n /**\n * This will be called every frame, after the spine has been updated.\n */\n renderDebug(spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>): void;\n\n /**\n * This is called when the `spine.debug` object is set to null or when the spine is destroyed.\n */\n unregisterSpine(spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>): void;\n\n /**\n * This is called when the `spine.debug` object is set to a new instance of a debug renderer.\n */\n registerSpine(spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>): void;\n}\n\ntype DebugDisplayObjects = {\n bones: Container;\n skeletonXY: Graphics;\n regionAttachmentsShape: Graphics;\n meshTrianglesLine: Graphics;\n meshHullLine: Graphics;\n clippingPolygon: Graphics;\n boundingBoxesRect: Graphics;\n boundingBoxesCircle: Graphics;\n boundingBoxesPolygon: Graphics;\n pathsCurve: Graphics;\n pathsLine: Graphics;\n parentDebugContainer: Container;\n};\n\n/**\n * This is a debug renderer that uses PixiJS Graphics under the hood.\n * @public\n */\nexport class SpineDebugRenderer implements ISpineDebugRenderer {\n private registeredSpines: Map<SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>, DebugDisplayObjects> = new Map();\n\n public drawDebug = true;\n public drawMeshHull = true;\n public drawMeshTriangles = true;\n public drawBones = true;\n public drawPaths = true;\n public drawBoundingBoxes = true;\n public drawClipping = true;\n public drawRegionAttachments = true;\n\n public lineWidth = 1;\n public regionAttachmentsColor = 0x0078ff;\n public meshHullColor = 0x0078ff;\n public meshTrianglesColor = 0xffcc00;\n public clippingPolygonColor = 0xff00ff;\n public boundingBoxesRectColor = 0x00ff00;\n public boundingBoxesPolygonColor = 0x00ff00;\n public boundingBoxesCircleColor = 0x00ff00;\n public pathsCurveColor = 0xff0000;\n public pathsLineColor = 0xff00ff;\n public skeletonXYColor = 0xff0000;\n public bonesColor = 0x00eecc;\n\n /**\n * The debug is attached by force to each spine object. So we need to create it inside the spine when we get the first update\n */\n public registerSpine(spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>) {\n if (this.registeredSpines.has(spine)) {\n console.warn('SpineDebugRenderer.registerSpine() - this spine is already registered!', spine);\n }\n const debugDisplayObjects = {\n parentDebugContainer: new Container(),\n bones: new Container(),\n skeletonXY: new Graphics(),\n regionAttachmentsShape: new Graphics(),\n meshTrianglesLine: new Graphics(),\n meshHullLine: new Graphics(),\n clippingPolygon: new Graphics(),\n boundingBoxesRect: new Graphics(),\n boundingBoxesCircle: new Graphics(),\n boundingBoxesPolygon: new Graphics(),\n pathsCurve: new Graphics(),\n pathsLine: new Graphics(),\n };\n\n debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.bones);\n debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.skeletonXY);\n debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.regionAttachmentsShape);\n debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.meshTrianglesLine);\n debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.meshHullLine);\n debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.clippingPolygon);\n debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.boundingBoxesRect);\n debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.boundingBoxesCircle);\n debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.boundingBoxesPolygon);\n debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.pathsCurve);\n debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.pathsLine);\n\n spine.addChild(debugDisplayObjects.parentDebugContainer);\n\n this.registeredSpines.set(spine, debugDisplayObjects);\n }\n public renderDebug(spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>): void {\n if (!this.registeredSpines.has(spine)) {\n // This should never happen. Spines are registered when you assign spine.debug\n this.registerSpine(spine);\n }\n\n const debugDisplayObjects = this.registeredSpines.get(spine);\n\n debugDisplayObjects.skeletonXY.clear();\n debugDisplayObjects.regionAttachmentsShape.clear();\n debugDisplayObjects.meshTrianglesLine.clear();\n debugDisplayObjects.meshHullLine.clear();\n debugDisplayObjects.clippingPolygon.clear();\n debugDisplayObjects.boundingBoxesRect.clear();\n debugDisplayObjects.boundingBoxesCircle.clear();\n debugDisplayObjects.boundingBoxesPolygon.clear();\n debugDisplayObjects.pathsCurve.clear();\n debugDisplayObjects.pathsLine.clear();\n\n for (let len = debugDisplayObjects.bones.children.length; len > 0; len--) {\n debugDisplayObjects.bones.children[len - 1].destroy({ children: true, texture: true, baseTexture: true });\n }\n\n const scale = spine.scale.x || spine.scale.y || 1;\n const lineWidth = this.lineWidth / scale;\n\n if (this.drawBones) {\n this.drawBonesFunc(spine, debugDisplayObjects, lineWidth, scale);\n }\n\n if (this.drawPaths) {\n this.drawPathsFunc(spine, debugDisplayObjects, lineWidth);\n }\n\n if (this.drawBoundingBoxes) {\n this.drawBoundingBoxesFunc(spine, debugDisplayObjects, lineWidth);\n }\n\n if (this.drawClipping) {\n this.drawClippingFunc(spine, debugDisplayObjects, lineWidth);\n }\n\n if (this.drawMeshHull || this.drawMeshTriangles) {\n this.drawMeshHullAndMeshTriangles(spine, debugDisplayObjects, lineWidth);\n }\n\n if (this.drawRegionAttachments) {\n this.drawRegionAttachmentsFunc(spine, debugDisplayObjects, lineWidth);\n }\n }\n\n private drawBonesFunc(\n spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>,\n debugDisplayObjects: DebugDisplayObjects,\n lineWidth: number,\n scale: number\n ): void {\n const skeleton = spine.skeleton;\n const skeletonX = skeleton.x;\n const skeletonY = skeleton.y;\n const bones = skeleton.bones;\n\n debugDisplayObjects.skeletonXY.lineStyle(lineWidth, this.skeletonXYColor, 1);\n\n for (let i = 0, len = bones.length; i < len; i++) {\n const bone = bones[i];\n const boneLen = bone.data.length;\n const starX = skeletonX + bone.matrix.tx;\n const starY = skeletonY + bone.matrix.ty;\n const endX = skeletonX + boneLen * bone.matrix.a + bone.matrix.tx;\n const endY = skeletonY + boneLen * bone.matrix.b + bone.matrix.ty;\n\n if (bone.data.name === 'root' || bone.data.parent === null) {\n continue;\n }\n\n // Triangle calculation formula\n // area: A=sqrt((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c))/4\n // alpha: alpha=acos((pow(b, 2)+pow(c, 2)-pow(a, 2))/(2*b*c))\n // beta: beta=acos((pow(a, 2)+pow(c, 2)-pow(b, 2))/(2*a*c))\n // gamma: gamma=acos((pow(a, 2)+pow(b, 2)-pow(c, 2))/(2*a*b))\n\n const w = Math.abs(starX - endX);\n const h = Math.abs(starY - endY);\n // a = w, // side length a\n const a2 = Math.pow(w, 2); // square root of side length a\n const b = h; // side length b\n const b2 = Math.pow(h, 2); // square root of side length b\n const c = Math.sqrt(a2 + b2); // side length c\n const c2 = Math.pow(c, 2); // square root of side length c\n const rad = Math.PI / 180;\n // A = Math.acos([a2 + c2 - b2] / [2 * a * c]) || 0, // Angle A\n // C = Math.acos([a2 + b2 - c2] / [2 * a * b]) || 0, // C angle\n const B = Math.acos((c2 + b2 - a2) / (2 * b * c)) || 0; // angle of corner B\n\n if (c === 0) {\n continue;\n }\n\n const gp = new Graphics();\n\n debugDisplayObjects.bones.addChild(gp);\n\n // draw bone\n const refRation = c / 50 / scale;\n\n gp.beginFill(this.bonesColor, 1);\n gp.drawPolygon(0, 0, 0 - refRation, c - refRation * 3, 0, c - refRation, 0 + refRation, c - refRation * 3);\n gp.endFill();\n gp.x = starX;\n gp.y = starY;\n gp.pivot.y = c;\n\n // Calculate bone rotation angle\n let rotation = 0;\n\n if (starX < endX && starY < endY) {\n // bottom right\n rotation = -B + 180 * rad;\n } else if (starX > endX && starY < endY) {\n // bottom left\n rotation = 180 * rad + B;\n } else if (starX > endX && starY > endY) {\n // top left\n rotation = -B;\n } else if (starX < endX && starY > endY) {\n // bottom left\n rotation = B;\n } else if (starY === endY && starX < endX) {\n // To the right\n rotation = 90 * rad;\n } else if (starY === endY && starX > endX) {\n // go left\n rotation = -90 * rad;\n } else if (starX === endX && starY < endY) {\n // down\n rotation = 180 * rad;\n } else if (starX === endX && starY > endY) {\n // up\n rotation = 0;\n }\n gp.rotation = rotation;\n\n // Draw the starting rotation point of the bone\n gp.lineStyle(lineWidth + refRation / 2.4, this.bonesColor, 1);\n gp.beginFill(0x000000, 0.6);\n gp.drawCircle(0, c, refRation * 1.2);\n gp.endFill();\n }\n\n // Draw the skeleton starting point \"X\" form\n const startDotSize = lineWidth * 3;\n\n debugDisplayObjects.skeletonXY.moveTo(skeletonX - startDotSize, skeletonY - startDotSize);\n debugDisplayObjects.skeletonXY.lineTo(skeletonX + startDotSize, skeletonY + startDotSize);\n debugDisplayObjects.skeletonXY.moveTo(skeletonX + startDotSize, skeletonY - startDotSize);\n debugDisplayObjects.skeletonXY.lineTo(skeletonX - startDotSize, skeletonY + startDotSize);\n }\n\n private drawRegionAttachmentsFunc(\n spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>,\n debugDisplayObjects: DebugDisplayObjects,\n lineWidth: number\n ): void {\n const skeleton = spine.skeleton;\n const slots = skeleton.slots;\n\n debugDisplayObjects.regionAttachmentsShape.lineStyle(lineWidth, this.regionAttachmentsColor, 1);\n\n for (let i = 0, len = slots.length; i < len; i++) {\n const slot = slots[i];\n const attachment = slot.getAttachment();\n\n if (attachment == null || attachment.type !== AttachmentType.Region) {\n continue;\n }\n\n const regionAttachment = attachment as IRegionAttachment & {\n computeWorldVertices: (slot: unknown, worldVertices: unknown, offset: unknown, stride: unknown) => void;\n updateOffset?: () => void;\n };\n\n const vertices = new Float32Array(8);\n\n if (regionAttachment.updateOffset) regionAttachment.updateOffset(); // We don't need this on all versions\n\n regionAttachment.computeWorldVertices(slot, vertices, 0, 2);\n debugDisplayObjects.regionAttachmentsShape.drawPolygon(Array.from(vertices.slice(0, 8)));\n }\n }\n\n private drawMeshHullAndMeshTriangles(\n spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>,\n debugDisplayObjects: DebugDisplayObjects,\n lineWidth: number\n ): void {\n const skeleton = spine.skeleton;\n const slots = skeleton.slots;\n\n debugDisplayObjects.meshHullLine.lineStyle(lineWidth, this.meshHullColor, 1);\n debugDisplayObjects.meshTrianglesLine.lineStyle(lineWidth, this.meshTrianglesColor, 1);\n\n for (let i = 0, len = slots.length; i < len; i++) {\n const slot = slots[i];\n\n if (!slot.bone.active) {\n continue;\n }\n const attachment = slot.getAttachment();\n\n if (attachment == null || attachment.type !== AttachmentType.Mesh) {\n continue;\n }\n\n const meshAttachment: IMeshAttachment = attachment as IMeshAttachment;\n\n const vertices = new Float32Array(meshAttachment.worldVerticesLength);\n const triangles = meshAttachment.triangles;\n let hullLength = meshAttachment.hullLength;\n\n meshAttachment.computeWorldVertices(slot, 0, meshAttachment.worldVerticesLength, vertices, 0, 2);\n // draw the skinned mesh (triangle)\n if (this.drawMeshTriangles) {\n for (let i = 0, len = triangles.length; i < len; i += 3) {\n const v1 = triangles[i] * 2;\n const v2 = triangles[i + 1] * 2;\n const v3 = triangles[i + 2] * 2;\n\n debugDisplayObjects.meshTrianglesLine.moveTo(vertices[v1], vertices[v1 + 1]);\n debugDisplayObjects.meshTrianglesLine.lineTo(vertices[v2], vertices[v2 + 1]);\n debugDisplayObjects.meshTrianglesLine.lineTo(vertices[v3], vertices[v3 + 1]);\n }\n }\n\n // draw skin border\n if (this.drawMeshHull && hullLength > 0) {\n hullLength = (hullLength >> 1) * 2;\n let lastX = vertices[hullLength - 2];\n let lastY = vertices[hullLength - 1];\n\n for (let i = 0, len = hullLength; i < len; i += 2) {\n const x = vertices[i];\n const y = vertices[i + 1];\n\n debugDisplayObjects.meshHullLine.moveTo(x, y);\n debugDisplayObjects.meshHullLine.lineTo(lastX, lastY);\n lastX = x;\n lastY = y;\n }\n }\n }\n }\n\n private drawClippingFunc(spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>, debugDisplayObjects: DebugDisplayObjects, lineWidth: number): void {\n const skeleton = spine.skeleton;\n const slots = skeleton.slots;\n\n debugDisplayObjects.clippingPolygon.lineStyle(lineWidth, this.clippingPolygonColor, 1);\n for (let i = 0, len = slots.length; i < len; i++) {\n const slot = slots[i];\n\n if (!slot.bone.active) {\n continue;\n }\n const attachment = slot.getAttachment();\n\n if (attachment == null || attachment.type !== AttachmentType.Clipping) {\n continue;\n }\n\n const clippingAttachment: IClippingAttachment = attachment as IClippingAttachment;\n\n const nn = clippingAttachment.worldVerticesLength;\n const world = new Float32Array(nn);\n\n clippingAttachment.computeWorldVertices(slot, 0, nn, world, 0, 2);\n debugDisplayObjects.clippingPolygon.drawPolygon(Array.from(world));\n }\n }\n\n private drawBoundingBoxesFunc(\n spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>,\n debugDisplayObjects: DebugDisplayObjects,\n lineWidth: number\n ): void {\n // draw the total outline of the bounding box\n debugDisplayObjects.boundingBoxesRect.lineStyle(lineWidth, this.boundingBoxesRectColor, 5);\n\n const bounds = new SkeletonBoundsBase();\n\n bounds.update(spine.skeleton, true);\n debugDisplayObjects.boundingBoxesRect.drawRect(bounds.minX, bounds.minY, bounds.getWidth(), bounds.getHeight());\n\n const polygons = bounds.polygons;\n const drawPolygon = (polygonVertices: ArrayLike<number>, _offset: unknown, count: number): void => {\n debugDisplayObjects.boundingBoxesPolygon.lineStyle(lineWidth, this.boundingBoxesPolygonColor, 1);\n debugDisplayObjects.boundingBoxesPolygon.beginFill(this.boundingBoxesPolygonColor, 0.1);\n\n if (count < 3) {\n throw new Error('Polygon must contain at least 3 vertices');\n }\n const paths = [];\n const dotSize = lineWidth * 2;\n\n for (let i = 0, len = polygonVertices.length; i < len; i += 2) {\n const x1 = polygonVertices[i];\n const y1 = polygonVertices[i + 1];\n\n // draw the bounding box node\n debugDisplayObjects.boundingBoxesCircle.lineStyle(0);\n debugDisplayObjects.boundingBoxesCircle.beginFill(this.boundingBoxesCircleColor);\n debugDisplayObjects.boundingBoxesCircle.drawCircle(x1, y1, dotSize);\n debugDisplayObjects.boundingBoxesCircle.endFill();\n\n paths.push(x1, y1);\n }\n\n // draw the bounding box area\n debugDisplayObjects.boundingBoxesPolygon.drawPolygon(paths);\n debugDisplayObjects.boundingBoxesPolygon.endFill();\n };\n\n for (let i = 0, len = polygons.length; i < len; i++) {\n const polygon = polygons[i];\n\n drawPolygon(polygon, 0, polygon.length);\n }\n }\n\n private drawPathsFunc(spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>, debugDisplayObjects: DebugDisplayObjects, lineWidth: number): void {\n const skeleton = spine.skeleton;\n const slots = skeleton.slots;\n\n debugDisplayObjects.pathsCurve.lineStyle(lineWidth, this.pathsCurveColor, 1);\n debugDisplayObjects.pathsLine.lineStyle(lineWidth, this.pathsLineColor, 1);\n\n for (let i = 0, len = slots.length; i < len; i++) {\n const slot = slots[i];\n\n if (!slot.bone.active) {\n continue;\n }\n const attachment = slot.getAttachment();\n\n if (attachment == null || attachment.type !== AttachmentType.Path) {\n continue;\n }\n\n const pathAttachment = attachment as IVertexAttachment & { closed: boolean };\n let nn = pathAttachment.worldVerticesLength;\n const world = new Float32Array(nn);\n\n pathAttachment.computeWorldVertices(slot, 0, nn, world, 0, 2);\n let x1 = world[2];\n let y1 = world[3];\n let x2 = 0;\n let y2 = 0;\n\n if (pathAttachment.closed) {\n const cx1 = world[0];\n const cy1 = world[1];\n const cx2 = world[nn - 2];\n const cy2 = world[nn - 1];\n\n x2 = world[nn - 4];\n y2 = world[nn - 3];\n\n // curve\n debugDisplayObjects.pathsCurve.moveTo(x1, y1);\n debugDisplayObjects.pathsCurve.bezierCurveTo(cx1, cy1, cx2, cy2, x2, y2);\n\n // handle\n debugDisplayObjects.pathsLine.moveTo(x1, y1);\n debugDisplayObjects.pathsLine.lineTo(cx1, cy1);\n debugDisplayObjects.pathsLine.moveTo(x2, y2);\n debugDisplayObjects.pathsLine.lineTo(cx2, cy2);\n }\n nn -= 4;\n for (let ii = 4; ii < nn; ii += 6) {\n const cx1 = world[ii];\n const cy1 = world[ii + 1];\n const cx2 = world[ii + 2];\n const cy2 = world[ii + 3];\n\n x2 = world[ii + 4];\n y2 = world[ii + 5];\n // curve\n debugDisplayObjects.pathsCurve.moveTo(x1, y1);\n debugDisplayObjects.pathsCurve.bezierCurveTo(cx1, cy1, cx2, cy2, x2, y2);\n\n // handle\n debugDisplayObjects.pathsLine.moveTo(x1, y1);\n debugDisplayObjects.pathsLine.lineTo(cx1, cy1);\n debugDisplayObjects.pathsLine.moveTo(x2, y2);\n debugDisplayObjects.pathsLine.lineTo(cx2, cy2);\n x1 = x2;\n y1 = y2;\n }\n }\n }\n\n public unregisterSpine(spine: SpineBase<ISkeleton, ISkeletonData, IAnimationState, IAnimationStateData>): void {\n if (!this.registeredSpines.has(spine)) {\n console.warn(\"SpineDebugRenderer.unregisterSpine() - spine is not registered, can't unregister!\", spine);\n }\n const debugDisplayObjects = this.registeredSpines.get(spine);\n\n debugDisplayObjects.parentDebugContainer.destroy({ baseTexture: true, children: true, texture: true });\n this.registeredSpines.delete(spine);\n }\n}\n"],"names":["i","len"],"mappings":";;;;;AAgDO,MAAM,kBAAkD,CAAA;AAAA,EAAxD,WAAA,GAAA;AACH,IAAQ,IAAA,CAAA,gBAAA,uBAA4H,GAAI,EAAA,CAAA;AAExI,IAAA,IAAA,CAAO,SAAY,GAAA,IAAA,CAAA;AACnB,IAAA,IAAA,CAAO,YAAe,GAAA,IAAA,CAAA;AACtB,IAAA,IAAA,CAAO,iBAAoB,GAAA,IAAA,CAAA;AAC3B,IAAA,IAAA,CAAO,SAAY,GAAA,IAAA,CAAA;AACnB,IAAA,IAAA,CAAO,SAAY,GAAA,IAAA,CAAA;AACnB,IAAA,IAAA,CAAO,iBAAoB,GAAA,IAAA,CAAA;AAC3B,IAAA,IAAA,CAAO,YAAe,GAAA,IAAA,CAAA;AACtB,IAAA,IAAA,CAAO,qBAAwB,GAAA,IAAA,CAAA;AAE/B,IAAA,IAAA,CAAO,SAAY,GAAA,CAAA,CAAA;AACnB,IAAA,IAAA,CAAO,sBAAyB,GAAA,KAAA,CAAA;AAChC,IAAA,IAAA,CAAO,aAAgB,GAAA,KAAA,CAAA;AACvB,IAAA,IAAA,CAAO,kBAAqB,GAAA,QAAA,CAAA;AAC5B,IAAA,IAAA,CAAO,oBAAuB,GAAA,QAAA,CAAA;AAC9B,IAAA,IAAA,CAAO,sBAAyB,GAAA,KAAA,CAAA;AAChC,IAAA,IAAA,CAAO,yBAA4B,GAAA,KAAA,CAAA;AACnC,IAAA,IAAA,CAAO,wBAA2B,GAAA,KAAA,CAAA;AAClC,IAAA,IAAA,CAAO,eAAkB,GAAA,QAAA,CAAA;AACzB,IAAA,IAAA,CAAO,cAAiB,GAAA,QAAA,CAAA;AACxB,IAAA,IAAA,CAAO,eAAkB,GAAA,QAAA,CAAA;AACzB,IAAA,IAAA,CAAO,UAAa,GAAA,KAAA,CAAA;AAAA,GAAA;AAAA;AAAA;AAAA;AAAA,EAKb,cAAc,KAAkF,EAAA;AACnG,IAAA,IAAI,IAAK,CAAA,gBAAA,CAAiB,GAAI,CAAA,KAAK,CAAG,EAAA;AAClC,MAAQ,OAAA,CAAA,IAAA,CAAK,0EAA0E,KAAK,CAAA,CAAA;AAAA,KAChG;AACA,IAAA,MAAM,mBAAsB,GAAA;AAAA,MACxB,oBAAA,EAAsB,IAAI,SAAU,EAAA;AAAA,MACpC,KAAA,EAAO,IAAI,SAAU,EAAA;AAAA,MACrB,UAAA,EAAY,IAAI,QAAS,EAAA;AAAA,MACzB,sBAAA,EAAwB,IAAI,QAAS,EAAA;AAAA,MACrC,iBAAA,EAAmB,IAAI,QAAS,EAAA;AAAA,MAChC,YAAA,EAAc,IAAI,QAAS,EAAA;AAAA,MAC3B,eAAA,EAAiB,IAAI,QAAS,EAAA;AAAA,MAC9B,iBAAA,EAAmB,IAAI,QAAS,EAAA;AAAA,MAChC,mBAAA,EAAqB,IAAI,QAAS,EAAA;AAAA,MAClC,oBAAA,EAAsB,IAAI,QAAS,EAAA;AAAA,MACnC,UAAA,EAAY,IAAI,QAAS,EAAA;AAAA,MACzB,SAAA,EAAW,IAAI,QAAS,EAAA;AAAA,KAC5B,CAAA;AAEA,IAAoB,mBAAA,CAAA,oBAAA,CAAqB,QAAS,CAAA,mBAAA,CAAoB,KAAK,CAAA,CAAA;AAC3E,IAAoB,mBAAA,CAAA,oBAAA,CAAqB,QAAS,CAAA,mBAAA,CAAoB,UAAU,CAAA,CAAA;AAChF,IAAoB,mBAAA,CAAA,oBAAA,CAAqB,QAAS,CAAA,mBAAA,CAAoB,sBAAsB,CAAA,CAAA;AAC5F,IAAoB,mBAAA,CAAA,oBAAA,CAAqB,QAAS,CAAA,mBAAA,CAAoB,iBAAiB,CAAA,CAAA;AACvF,IAAoB,mBAAA,CAAA,oBAAA,CAAqB,QAAS,CAAA,mBAAA,CAAoB,YAAY,CAAA,CAAA;AAClF,IAAoB,mBAAA,CAAA,oBAAA,CAAqB,QAAS,CAAA,mBAAA,CAAoB,eAAe,CAAA,CAAA;AACrF,IAAoB,mBAAA,CAAA,oBAAA,CAAqB,QAAS,CAAA,mBAAA,CAAoB,iBAAiB,CAAA,CAAA;AACvF,IAAoB,mBAAA,CAAA,oBAAA,CAAqB,QAAS,CAAA,mBAAA,CAAoB,mBAAmB,CAAA,CAAA;AACzF,IAAoB,mBAAA,CAAA,oBAAA,CAAqB,QAAS,CAAA,mBAAA,CAAoB,oBAAoB,CAAA,CAAA;AAC1F,IAAoB,mBAAA,CAAA,oBAAA,CAAqB,QAAS,CAAA,mBAAA,CAAoB,UAAU,CAAA,CAAA;AAChF,IAAoB,mBAAA,CAAA,oBAAA,CAAqB,QAAS,CAAA,mBAAA,CAAoB,SAAS,CAAA,CAAA;AAE/E,IAAM,KAAA,CAAA,QAAA,CAAS,oBAAoB,oBAAoB,CAAA,CAAA;AAEvD,IAAK,IAAA,CAAA,gBAAA,CAAiB,GAAI,CAAA,KAAA,EAAO,mBAAmB,CAAA,CAAA;AAAA,GACxD;AAAA,EACO,YAAY,KAAwF,EAAA;AACvG,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAiB,CAAA,GAAA,CAAI,KAAK,CAAG,EAAA;AAEnC,MAAA,IAAA,CAAK,cAAc,KAAK,CAAA,CAAA;AAAA,KAC5B;AAEA,IAAA,MAAM,mBAAsB,GAAA,IAAA,CAAK,gBAAiB,CAAA,GAAA,CAAI,KAAK,CAAA,CAAA;AAE3D,IAAA,mBAAA,CAAoB,WAAW,KAAM,EAAA,CAAA;AACrC,IAAA,mBAAA,CAAoB,uBAAuB,KAAM,EAAA,CAAA;AACjD,IAAA,mBAAA,CAAoB,kBAAkB,KAAM,EAAA,CAAA;AAC5C,IAAA,mBAAA,CAAoB,aAAa,KAAM,EAAA,CAAA;AACvC,IAAA,mBAAA,CAAoB,gBAAgB,KAAM,EAAA,CAAA;AAC1C,IAAA,mBAAA,CAAoB,kBAAkB,KAAM,EAAA,CAAA;AAC5C,IAAA,mBAAA,CAAoB,oBAAoB,KAAM,EAAA,CAAA;AAC9C,IAAA,mBAAA,CAAoB,qBAAqB,KAAM,EAAA,CAAA;AAC/C,IAAA,mBAAA,CAAoB,WAAW,KAAM,EAAA,CAAA;AACrC,IAAA,mBAAA,CAAoB,UAAU,KAAM,EAAA,CAAA;AAEpC,IAAA,KAAA,IAAS,MAAM,mBAAoB,CAAA,KAAA,CAAM,SAAS,MAAQ,EAAA,GAAA,GAAM,GAAG,GAAO,EAAA,EAAA;AACtE,MAAA,mBAAA,CAAoB,KAAM,CAAA,QAAA,CAAS,GAAM,GAAA,CAAC,CAAE,CAAA,OAAA,CAAQ,EAAE,QAAA,EAAU,IAAM,EAAA,OAAA,EAAS,IAAM,EAAA,WAAA,EAAa,MAAM,CAAA,CAAA;AAAA,KAC5G;AAEA,IAAA,MAAM,QAAQ,KAAM,CAAA,KAAA,CAAM,CAAK,IAAA,KAAA,CAAM,MAAM,CAAK,IAAA,CAAA,CAAA;AAChD,IAAM,MAAA,SAAA,GAAY,KAAK,SAAY,GAAA,KAAA,CAAA;AAEnC,IAAA,IAAI,KAAK,SAAW,EAAA;AAChB,MAAA,IAAA,CAAK,aAAc,CAAA,KAAA,EAAO,mBAAqB,EAAA,SAAA,EAAW,KAAK,CAAA,CAAA;AAAA,KACnE;AAEA,IAAA,IAAI,KAAK,SAAW,EAAA;AAChB,MAAK,IAAA,CAAA,aAAA,CAAc,KAAO,EAAA,mBAAA,EAAqB,SAAS,CAAA,CAAA;AAAA,KAC5D;AAEA,IAAA,IAAI,KAAK,iBAAmB,EAAA;AACxB,MAAK,IAAA,CAAA,qBAAA,CAAsB,KAAO,EAAA,mBAAA,EAAqB,SAAS,CAAA,CAAA;AAAA,KACpE;AAEA,IAAA,IAAI,KAAK,YAAc,EAAA;AACnB,MAAK,IAAA,CAAA,gBAAA,CAAiB,KAAO,EAAA,mBAAA,EAAqB,SAAS,CAAA,CAAA;AAAA,KAC/D;AAEA,IAAI,IAAA,IAAA,CAAK,YAAgB,IAAA,IAAA,CAAK,iBAAmB,EAAA;AAC7C,MAAK,IAAA,CAAA,4BAAA,CAA6B,KAAO,EAAA,mBAAA,EAAqB,SAAS,CAAA,CAAA;AAAA,KAC3E;AAEA,IAAA,IAAI,KAAK,qBAAuB,EAAA;AAC5B,MAAK,IAAA,CAAA,yBAAA,CAA0B,KAAO,EAAA,mBAAA,EAAqB,SAAS,CAAA,CAAA;AAAA,KACxE;AAAA,GACJ;AAAA,EAEQ,aACJ,CAAA,KAAA,EACA,mBACA,EAAA,SAAA,EACA,KACI,EAAA;AACJ,IAAA,MAAM,WAAW,KAAM,CAAA,QAAA,CAAA;AACvB,IAAA,MAAM,YAAY,QAAS,CAAA,CAAA,CAAA;AAC3B,IAAA,MAAM,YAAY,QAAS,CAAA,CAAA,CAAA;AAC3B,IAAA,MAAM,QAAQ,QAAS,CAAA,KAAA,CAAA;AAEvB,IAAA,mBAAA,CAAoB,UAAW,CAAA,SAAA,CAAU,SAAW,EAAA,IAAA,CAAK,iBAAiB,CAAC,CAAA,CAAA;AAE3E,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,GAAA,GAAM,MAAM,MAAQ,EAAA,CAAA,GAAI,KAAK,CAAK,EAAA,EAAA;AAC9C,MAAM,MAAA,IAAA,GAAO,MAAM,CAAC,CAAA,CAAA;AACpB,MAAM,MAAA,OAAA,GAAU,KAAK,IAAK,CAAA,MAAA,CAAA;AAC1B,MAAM,MAAA,KAAA,GAAQ,SAAY,GAAA,IAAA,CAAK,MAAO,CAAA,EAAA,CAAA;AACtC,MAAM,MAAA,KAAA,GAAQ,SAAY,GAAA,IAAA,CAAK,MAAO,CAAA,EAAA,CAAA;AACtC,MAAA,MAAM,OAAO,SAAY,GAAA,OAAA,GAAU,KAAK,MAAO,CAAA,CAAA,GAAI,KAAK,MAAO,CAAA,EAAA,CAAA;AAC/D,MAAA,MAAM,OAAO,SAAY,GAAA,OAAA,GAAU,KAAK,MAAO,CAAA,CAAA,GAAI,KAAK,MAAO,CAAA,EAAA,CAAA;AAE/D,MAAA,IAAI,KAAK,IAAK,CAAA,IAAA,KAAS,UAAU,IAAK,CAAA,IAAA,CAAK,WAAW,IAAM,EAAA;AACxD,QAAA,SAAA;AAAA,OACJ;AAQA,MAAA,MAAM,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,KAAA,GAAQ,IAAI,CAAA,CAAA;AAC/B,MAAA,MAAM,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,KAAA,GAAQ,IAAI,CAAA,CAAA;AAE/B,MAAA,MAAM,EAAK,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AACxB,MAAA,MAAM,CAAI,GAAA,CAAA,CAAA;AACV,MAAA,MAAM,EAAK,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AACxB,MAAA,MAAM,CAAI,GAAA,IAAA,CAAK,IAAK,CAAA,EAAA,GAAK,EAAE,CAAA,CAAA;AAC3B,MAAA,MAAM,EAAK,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AACxB,MAAM,MAAA,GAAA,GAAM,KAAK,EAAK,GAAA,GAAA,CAAA;AAGtB,MAAM,MAAA,CAAA,GAAI,KAAK,IAAM,CAAA,CAAA,EAAA,GAAK,KAAK,EAAO,KAAA,CAAA,GAAI,CAAI,GAAA,CAAA,CAAE,CAAK,IAAA,CAAA,CAAA;AAErD,MAAA,IAAI,MAAM,CAAG,EAAA;AACT,QAAA,SAAA;AAAA,OACJ;AAEA,MAAM,MAAA,EAAA,GAAK,IAAI,QAAS,EAAA,CAAA;AAExB,MAAoB,mBAAA,CAAA,KAAA,CAAM,SAAS,EAAE,CAAA,CAAA;AAGrC,MAAM,MAAA,SAAA,GAAY,IAAI,EAAK,GAAA,KAAA,CAAA;AAE3B,MAAG,EAAA,CAAA,SAAA,CAAU,IAAK,CAAA,UAAA,EAAY,CAAC,CAAA,CAAA;AAC/B,MAAA,EAAA,CAAG,WAAY,CAAA,CAAA,EAAG,CAAG,EAAA,CAAA,GAAI,WAAW,CAAI,GAAA,SAAA,GAAY,CAAG,EAAA,CAAA,EAAG,IAAI,SAAW,EAAA,CAAA,GAAI,SAAW,EAAA,CAAA,GAAI,YAAY,CAAC,CAAA,CAAA;AACzG,MAAA,EAAA,CAAG,OAAQ,EAAA,CAAA;AACX,MAAA,EAAA,CAAG,CAAI,GAAA,KAAA,CAAA;AACP,MAAA,EAAA,CAAG,CAAI,GAAA,KAAA,CAAA;AACP,MAAA,EAAA,CAAG,MAAM,CAAI,GAAA,CAAA,CAAA;AAGb,MAAA,IAAI,QAAW,GAAA,CAAA,CAAA;AAEf,MAAI,IAAA,KAAA,GAAQ,IAAQ,IAAA,KAAA,GAAQ,IAAM,EAAA;AAE9B,QAAW,QAAA,GAAA,CAAC,IAAI,GAAM,GAAA,GAAA,CAAA;AAAA,OACf,MAAA,IAAA,KAAA,GAAQ,IAAQ,IAAA,KAAA,GAAQ,IAAM,EAAA;AAErC,QAAA,QAAA,GAAW,MAAM,GAAM,GAAA,CAAA,CAAA;AAAA,OAChB,MAAA,IAAA,KAAA,GAAQ,IAAQ,IAAA,KAAA,GAAQ,IAAM,EAAA;AAErC,QAAA,QAAA,GAAW,CAAC,CAAA,CAAA;AAAA,OACL,MAAA,IAAA,KAAA,GAAQ,IAAQ,IAAA,KAAA,GAAQ,IAAM,EAAA;AAErC,QAAW,QAAA,GAAA,CAAA,CAAA;AAAA,OACJ,MAAA,IAAA,KAAA,KAAU,IAAQ,IAAA,KAAA,GAAQ,IAAM,EAAA;AAEvC,QAAA,QAAA,GAAW,EAAK,GAAA,GAAA,CAAA;AAAA,OACT,MAAA,IAAA,KAAA,KAAU,IAAQ,IAAA,KAAA,GAAQ,IAAM,EAAA;AAEvC,QAAA,QAAA,GAAW,CAAM,EAAA,GAAA,GAAA,CAAA;AAAA,OACV,MAAA,IAAA,KAAA,KAAU,IAAQ,IAAA,KAAA,GAAQ,IAAM,EAAA;AAEvC,QAAA,QAAA,GAAW,GAAM,GAAA,GAAA,CAAA;AAAA,OACV,MAAA,IAAA,KAAA,KAAU,IAAQ,IAAA,KAAA,GAAQ,IAAM,EAAA;AAEvC,QAAW,QAAA,GAAA,CAAA,CAAA;AAAA,OACf;AACA,MAAA,EAAA,CAAG,QAAW,GAAA,QAAA,CAAA;AAGd,MAAA,EAAA,CAAG,UAAU,SAAY,GAAA,SAAA,GAAY,GAAK,EAAA,IAAA,CAAK,YAAY,CAAC,CAAA,CAAA;AAC5D,MAAG,EAAA,CAAA,SAAA,CAAU,GAAU,GAAG,CAAA,CAAA;AAC1B,MAAA,EAAA,CAAG,UAAW,CAAA,CAAA,EAAG,CAAG,EAAA,SAAA,GAAY,GAAG,CAAA,CAAA;AACnC,MAAA,EAAA,CAAG,OAAQ,EAAA,CAAA;AAAA,KACf;AAGA,IAAA,MAAM,eAAe,SAAY,GAAA,CAAA,CAAA;AAEjC,IAAA,mBAAA,CAAoB,UAAW,CAAA,MAAA,CAAO,SAAY,GAAA,YAAA,EAAc,YAAY,YAAY,CAAA,CAAA;AACxF,IAAA,mBAAA,CAAoB,UAAW,CAAA,MAAA,CAAO,SAAY,GAAA,YAAA,EAAc,YAAY,YAAY,CAAA,CAAA;AACxF,IAAA,mBAAA,CAAoB,UAAW,CAAA,MAAA,CAAO,SAAY,GAAA,YAAA,EAAc,YAAY,YAAY,CAAA,CAAA;AACxF,IAAA,mBAAA,CAAoB,UAAW,CAAA,MAAA,CAAO,SAAY,GAAA,YAAA,EAAc,YAAY,YAAY,CAAA,CAAA;AAAA,GAC5F;AAAA,EAEQ,yBAAA,CACJ,KACA,EAAA,mBAAA,EACA,SACI,EAAA;AACJ,IAAA,MAAM,WAAW,KAAM,CAAA,QAAA,CAAA;AACvB,IAAA,MAAM,QAAQ,QAAS,CAAA,KAAA,CAAA;AAEvB,IAAA,mBAAA,CAAoB,sBAAuB,CAAA,SAAA,CAAU,SAAW,EAAA,IAAA,CAAK,wBAAwB,CAAC,CAAA,CAAA;AAE9F,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,GAAA,GAAM,MAAM,MAAQ,EAAA,CAAA,GAAI,KAAK,CAAK,EAAA,EAAA;AAC9C,MAAM,MAAA,IAAA,GAAO,MAAM,CAAC,CAAA,CAAA;AACpB,MAAM,MAAA,UAAA,GAAa,KAAK,aAAc,EAAA,CAAA;AAEtC,MAAA,IAAI,UAAc,IAAA,IAAA,IAAQ,UAAW,CAAA,IAAA,KAAS,eAAe,MAAQ,EAAA;AACjE,QAAA,SAAA;AAAA,OACJ;AAEA,MAAA,MAAM,gBAAmB,GAAA,UAAA,CAAA;AAKzB,MAAM,MAAA,QAAA,GAAW,IAAI,YAAA,CAAa,CAAC,CAAA,CAAA;AAEnC,MAAA,IAAI,gBAAiB,CAAA,YAAA;AAAc,QAAA,gBAAA,CAAiB,YAAa,EAAA,CAAA;AAEjE,MAAA,gBAAA,CAAiB,oBAAqB,CAAA,IAAA,EAAM,QAAU,EAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AAC1D,MAAoB,mBAAA,CAAA,sBAAA,CAAuB,YAAY,KAAM,CAAA,IAAA,CAAK,SAAS,KAAM,CAAA,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA,CAAA;AAAA,KAC3F;AAAA,GACJ;AAAA,EAEQ,4BAAA,CACJ,KACA,EAAA,mBAAA,EACA,SACI,EAAA;AACJ,IAAA,MAAM,WAAW,KAAM,CAAA,QAAA,CAAA;AACvB,IAAA,MAAM,QAAQ,QAAS,CAAA,KAAA,CAAA;AAEvB,IAAA,mBAAA,CAAoB,YAAa,CAAA,SAAA,CAAU,SAAW,EAAA,IAAA,CAAK,eAAe,CAAC,CAAA,CAAA;AAC3E,IAAA,mBAAA,CAAoB,iBAAkB,CAAA,SAAA,CAAU,SAAW,EAAA,IAAA,CAAK,oBAAoB,CAAC,CAAA,CAAA;AAErF,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,GAAA,GAAM,MAAM,MAAQ,EAAA,CAAA,GAAI,KAAK,CAAK,EAAA,EAAA;AAC9C,MAAM,MAAA,IAAA,GAAO,MAAM,CAAC,CAAA,CAAA;AAEpB,MAAI,IAAA,CAAC,IAAK,CAAA,IAAA,CAAK,MAAQ,EAAA;AACnB,QAAA,SAAA;AAAA,OACJ;AACA,MAAM,MAAA,UAAA,GAAa,KAAK,aAAc,EAAA,CAAA;AAEtC,MAAA,IAAI,UAAc,IAAA,IAAA,IAAQ,UAAW,CAAA,IAAA,KAAS,eAAe,IAAM,EAAA;AAC/D,QAAA,SAAA;AAAA,OACJ;AAEA,MAAA,MAAM,cAAkC,GAAA,UAAA,CAAA;AAExC,MAAA,MAAM,QAAW,GAAA,IAAI,YAAa,CAAA,cAAA,CAAe,mBAAmB,CAAA,CAAA;AACpE,MAAA,MAAM,YAAY,cAAe,CAAA,SAAA,CAAA;AACjC,MAAA,IAAI,aAAa,cAAe,CAAA,UAAA,CAAA;AAEhC,MAAA,cAAA,CAAe,qBAAqB,IAAM,EAAA,CAAA,EAAG,eAAe,mBAAqB,EAAA,QAAA,EAAU,GAAG,CAAC,CAAA,CAAA;AAE/F,MAAA,IAAI,KAAK,iBAAmB,EAAA;AACxB,QAASA,KAAAA,IAAAA,EAAAA,GAAI,GAAGC,IAAM,GAAA,SAAA,CAAU,QAAQD,EAAIC,GAAAA,IAAAA,EAAKD,MAAK,CAAG,EAAA;AACrD,UAAM,MAAA,EAAA,GAAK,SAAUA,CAAAA,EAAC,CAAI,GAAA,CAAA,CAAA;AAC1B,UAAA,MAAM,EAAK,GAAA,SAAA,CAAUA,EAAI,GAAA,CAAC,CAAI,GAAA,CAAA,CAAA;AAC9B,UAAA,MAAM,EAAK,GAAA,SAAA,CAAUA,EAAI,GAAA,CAAC,CAAI,GAAA,CAAA,CAAA;AAE9B,UAAoB,mBAAA,CAAA,iBAAA,CAAkB,OAAO,QAAS,CAAA,EAAE,GAAG,QAAS,CAAA,EAAA,GAAK,CAAC,CAAC,CAAA,CAAA;AAC3E,UAAoB,mBAAA,CAAA,iBAAA,CAAkB,OAAO,QAAS,CAAA,EAAE,GAAG,QAAS,CAAA,EAAA,GAAK,CAAC,CAAC,CAAA,CAAA;AAC3E,UAAoB,mBAAA,CAAA,iBAAA,CAAkB,OAAO,QAAS,CAAA,EAAE,GAAG,QAAS,CAAA,EAAA,GAAK,CAAC,CAAC,CAAA,CAAA;AAAA,SAC/E;AAAA,OACJ;AAGA,MAAI,IAAA,IAAA,CAAK,YAAgB,IAAA,UAAA,GAAa,CAAG,EAAA;AACrC,QAAA,UAAA,GAAA,CAAc,cAAc,CAAK,IAAA,CAAA,CAAA;AACjC,QAAI,IAAA,KAAA,GAAQ,QAAS,CAAA,UAAA,GAAa,CAAC,CAAA,CAAA;AACnC,QAAI,IAAA,KAAA,GAAQ,QAAS,CAAA,UAAA,GAAa,CAAC,CAAA,CAAA;AAEnC,QAAA,KAAA,IAASA,KAAI,CAAGC,EAAAA,IAAAA,GAAM,YAAYD,EAAIC,GAAAA,IAAAA,EAAKD,MAAK,CAAG,EAAA;AAC/C,UAAM,MAAA,CAAA,GAAI,SAASA,EAAC,CAAA,CAAA;AACpB,UAAM,MAAA,CAAA,GAAI,QAASA,CAAAA,EAAAA,GAAI,CAAC,CAAA,CAAA;AAExB,UAAoB,mBAAA,CAAA,YAAA,CAAa,MAAO,CAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AAC5C,UAAoB,mBAAA,CAAA,YAAA,CAAa,MAAO,CAAA,KAAA,EAAO,KAAK,CAAA,CAAA;AACpD,UAAQ,KAAA,GAAA,CAAA,CAAA;AACR,UAAQ,KAAA,GAAA,CAAA,CAAA;AAAA,SACZ;AAAA,OACJ;AAAA,KACJ;AAAA,GACJ;AAAA,EAEQ,gBAAA,CAAiB,KAAkF,EAAA,mBAAA,EAA0C,SAAyB,EAAA;AAC1K,IAAA,MAAM,WAAW,KAAM,CAAA,QAAA,CAAA;AACvB,IAAA,MAAM,QAAQ,QAAS,CAAA,KAAA,CAAA;AAEvB,IAAA,mBAAA,CAAoB,eAAgB,CAAA,SAAA,CAAU,SAAW,EAAA,IAAA,CAAK,sBAAsB,CAAC,CAAA,CAAA;AACrF,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,GAAA,GAAM,MAAM,MAAQ,EAAA,CAAA,GAAI,KAAK,CAAK,EAAA,EAAA;AAC9C,MAAM,MAAA,IAAA,GAAO,MAAM,CAAC,CAAA,CAAA;AAEpB,MAAI,IAAA,CAAC,IAAK,CAAA,IAAA,CAAK,MAAQ,EAAA;AACnB,QAAA,SAAA;AAAA,OACJ;AACA,MAAM,MAAA,UAAA,GAAa,KAAK,aAAc,EAAA,CAAA;AAEtC,MAAA,IAAI,UAAc,IAAA,IAAA,IAAQ,UAAW,CAAA,IAAA,KAAS,eAAe,QAAU,EAAA;AACnE,QAAA,SAAA;AAAA,OACJ;AAEA,MAAA,MAAM,kBAA0C,GAAA,UAAA,CAAA;AAEhD,MAAA,MAAM,KAAK,kBAAmB,CAAA,mBAAA,CAAA;AAC9B,MAAM,MAAA,KAAA,GAAQ,IAAI,YAAA,CAAa,EAAE,CAAA,CAAA;AAEjC,MAAA,kBAAA,CAAmB,qBAAqB,IAAM,EAAA,CAAA,EAAG,EAAI,EAAA,KAAA,EAAO,GAAG,CAAC,CAAA,CAAA;AAChE,MAAA,mBAAA,CAAoB,eAAgB,CAAA,WAAA,CAAY,KAAM,CAAA,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA;AAAA,KACrE;AAAA,GACJ;AAAA,EAEQ,qBAAA,CACJ,KACA,EAAA,mBAAA,EACA,SACI,EAAA;AAEJ,IAAA,mBAAA,CAAoB,iBAAkB,CAAA,SAAA,CAAU,SAAW,EAAA,IAAA,CAAK,wBAAwB,CAAC,CAAA,CAAA;AAEzF,IAAM,MAAA,MAAA,GAAS,IAAI,kBAAmB,EAAA,CAAA;AAEtC,IAAO,MAAA,CAAA,MAAA,CAAO,KAAM,CAAA,QAAA,EAAU,IAAI,CAAA,CAAA;AAClC,IAAoB,mBAAA,CAAA,iBAAA,CAAkB,QAAS,CAAA,MAAA,CAAO,IAAM,EAAA,MAAA,CAAO,IAAM,EAAA,MAAA,CAAO,QAAS,EAAA,EAAG,MAAO,CAAA,SAAA,EAAW,CAAA,CAAA;AAE9G,IAAA,MAAM,WAAW,MAAO,CAAA,QAAA,CAAA;AACxB,IAAA,MAAM,WAAc,GAAA,CAAC,eAAoC,EAAA,OAAA,EAAkB,KAAwB,KAAA;AAC/F,MAAA,mBAAA,CAAoB,oBAAqB,CAAA,SAAA,CAAU,SAAW,EAAA,IAAA,CAAK,2BAA2B,CAAC,CAAA,CAAA;AAC/F,MAAA,mBAAA,CAAoB,oBAAqB,CAAA,SAAA,CAAU,IAAK,CAAA,yBAAA,EAA2B,GAAG,CAAA,CAAA;AAEtF,MAAA,IAAI,QAAQ,CAAG,EAAA;AACX,QAAM,MAAA,IAAI,MAAM,0CAA0C,CAAA,CAAA;AAAA,OAC9D;AACA,MAAA,MAAM,QAAQ,EAAC,CAAA;AACf,MAAA,MAAM,UAAU,SAAY,GAAA,CAAA,CAAA;AAE5B,MAAS,KAAA,IAAA,CAAA,GAAI,GAAG,GAAM,GAAA,eAAA,CAAgB,QAAQ,CAAI,GAAA,GAAA,EAAK,KAAK,CAAG,EAAA;AAC3D,QAAM,MAAA,EAAA,GAAK,gBAAgB,CAAC,CAAA,CAAA;AAC5B,QAAM,MAAA,EAAA,GAAK,eAAgB,CAAA,CAAA,GAAI,CAAC,CAAA,CAAA;AAGhC,QAAoB,mBAAA,CAAA,mBAAA,CAAoB,UAAU,CAAC,CAAA,CAAA;AACnD,QAAoB,mBAAA,CAAA,mBAAA,CAAoB,SAAU,CAAA,IAAA,CAAK,wBAAwB,CAAA,CAAA;AAC/E,QAAA,mBAAA,CAAoB,mBAAoB,CAAA,UAAA,CAAW,EAAI,EAAA,EAAA,EAAI,OAAO,CAAA,CAAA;AAClE,QAAA,mBAAA,CAAoB,oBAAoB,OAAQ,EAAA,CAAA;AAEhD,QAAM,KAAA,CAAA,IAAA,CAAK,IAAI,EAAE,CAAA,CAAA;AAAA,OACrB;AAGA,MAAoB,mBAAA,CAAA,oBAAA,CAAqB,YAAY,KAAK,CAAA,CAAA;AAC1D,MAAA,mBAAA,CAAoB,qBAAqB,OAAQ,EAAA,CAAA;AAAA,KACrD,CAAA;AAEA,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,GAAA,GAAM,SAAS,MAAQ,EAAA,CAAA,GAAI,KAAK,CAAK,EAAA,EAAA;AACjD,MAAM,MAAA,OAAA,GAAU,SAAS,CAAC,CAAA,CAAA;AAE1B,MAAY,WAAA,CAAA,OAAA,EAAS,CAAG,EAAA,OAAA,CAAQ,MAAM,CAAA,CAAA;AAAA,KAC1C;AAAA,GACJ;AAAA,EAEQ,aAAA,CAAc,KAAkF,EAAA,mBAAA,EAA0C,SAAyB,EAAA;AACvK,IAAA,MAAM,WAAW,KAAM,CAAA,QAAA,CAAA;AACvB,IAAA,MAAM,QAAQ,QAAS,CAAA,KAAA,CAAA;AAEvB,IAAA,mBAAA,CAAoB,UAAW,CAAA,SAAA,CAAU,SAAW,EAAA,IAAA,CAAK,iBAAiB,CAAC,CAAA,CAAA;AAC3E,IAAA,mBAAA,CAAoB,SAAU,CAAA,SAAA,CAAU,SAAW,EAAA,IAAA,CAAK,gBAAgB,CAAC,CAAA,CAAA;AAEzE,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,GAAA,GAAM,MAAM,MAAQ,EAAA,CAAA,GAAI,KAAK,CAAK,EAAA,EAAA;AAC9C,MAAM,MAAA,IAAA,GAAO,MAAM,CAAC,CAAA,CAAA;AAEpB,MAAI,IAAA,CAAC,IAAK,CAAA,IAAA,CAAK,MAAQ,EAAA;AACnB,QAAA,SAAA;AAAA,OACJ;AACA,MAAM,MAAA,UAAA,GAAa,KAAK,aAAc,EAAA,CAAA;AAEtC,MAAA,IAAI,UAAc,IAAA,IAAA,IAAQ,UAAW,CAAA,IAAA,KAAS,eAAe,IAAM,EAAA;AAC/D,QAAA,SAAA;AAAA,OACJ;AAEA,MAAA,MAAM,cAAiB,GAAA,UAAA,CAAA;AACvB,MAAA,IAAI,KAAK,cAAe,CAAA,mBAAA,CAAA;AACxB,MAAM,MAAA,KAAA,GAAQ,IAAI,YAAA,CAAa,EAAE,CAAA,CAAA;AAEjC,MAAA,cAAA,CAAe,qBAAqB,IAAM,EAAA,CAAA,EAAG,EAAI,EAAA,KAAA,EAAO,GAAG,CAAC,CAAA,CAAA;AAC5D,MAAI,IAAA,EAAA,GAAK,MAAM,CAAC,CAAA,CAAA;AAChB,MAAI,IAAA,EAAA,GAAK,MAAM,CAAC,CAAA,CAAA;AAChB,MAAA,IAAI,EAAK,GAAA,CAAA,CAAA;AACT,MAAA,IAAI,EAAK,GAAA,CAAA,CAAA;AAET,MAAA,IAAI,eAAe,MAAQ,EAAA;AACvB,QAAM,MAAA,GAAA,GAAM,MAAM,CAAC,CAAA,CAAA;AACnB,QAAM,MAAA,GAAA,GAAM,MAAM,CAAC,CAAA,CAAA;AACnB,QAAM,MAAA,GAAA,GAAM,KAAM,CAAA,EAAA,GAAK,CAAC,CAAA,CAAA;AACxB,QAAM,MAAA,GAAA,GAAM,KAAM,CAAA,EAAA,GAAK,CAAC,CAAA,CAAA;AAExB,QAAK,EAAA,GAAA,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA;AACjB,QAAK,EAAA,GAAA,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA;AAGjB,QAAoB,mBAAA,CAAA,UAAA,CAAW,MAAO,CAAA,EAAA,EAAI,EAAE,CAAA,CAAA;AAC5C,QAAA,mBAAA,CAAoB,WAAW,aAAc,CAAA,GAAA,EAAK,KAAK,GAAK,EAAA,GAAA,EAAK,IAAI,EAAE,CAAA,CAAA;AAGvE,QAAoB,mBAAA,CAAA,SAAA,CAAU,MAAO,CAAA,EAAA,EAAI,EAAE,CAAA,CAAA;AAC3C,QAAoB,mBAAA,CAAA,SAAA,CAAU,MAAO,CAAA,GAAA,EAAK,GAAG,CAAA,CAAA;AAC7C,QAAoB,mBAAA,CAAA,SAAA,CAAU,MAAO,CAAA,EAAA,EAAI,EAAE,CAAA,CAAA;AAC3C,QAAoB,mBAAA,CAAA,SAAA,CAAU,MAAO,CAAA,GAAA,EAAK,GAAG,CAAA,CAAA;AAAA,OACjD;AACA,MAAM,EAAA,IAAA,CAAA,CAAA;AACN,MAAA,KAAA,IAAS,EAAK,GAAA,CAAA,EAAG,EAAK,GAAA,EAAA,EAAI,MAAM,CAAG,EAAA;AAC/B,QAAM,MAAA,GAAA,GAAM,MAAM,EAAE,CAAA,CAAA;AACpB,QAAM,MAAA,GAAA,GAAM,KAAM,CAAA,EAAA,GAAK,CAAC,CAAA,CAAA;AACxB,QAAM,MAAA,GAAA,GAAM,KAAM,CAAA,EAAA,GAAK,CAAC,CAAA,CAAA;AACxB,QAAM,MAAA,GAAA,GAAM,KAAM,CAAA,EAAA,GAAK,CAAC,CAAA,CAAA;AAExB,QAAK,EAAA,GAAA,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA;AACjB,QAAK,EAAA,GAAA,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA;AAEjB,QAAoB,mBAAA,CAAA,UAAA,CAAW,MAAO,CAAA,EAAA,EAAI,EAAE,CAAA,CAAA;AAC5C,QAAA,mBAAA,CAAoB,WAAW,aAAc,CAAA,GAAA,EAAK,KAAK,GAAK,EAAA,GAAA,EAAK,IAAI,EAAE,CAAA,CAAA;AAGvE,QAAoB,mBAAA,CAAA,SAAA,CAAU,MAAO,CAAA,EAAA,EAAI,EAAE,CAAA,CAAA;AAC3C,QAAoB,mBAAA,CAAA,SAAA,CAAU,MAAO,CAAA,GAAA,EAAK,GAAG,CAAA,CAAA;AAC7C,QAAoB,mBAAA,CAAA,SAAA,CAAU,MAAO,CAAA,EAAA,EAAI,EAAE,CAAA,CAAA;AAC3C,QAAoB,mBAAA,CAAA,SAAA,CAAU,MAAO,CAAA,GAAA,EAAK,GAAG,CAAA,CAAA;AAC7C,QAAK,EAAA,GAAA,EAAA,CAAA;AACL,QAAK,EAAA,GAAA,EAAA,CAAA;AAAA,OACT;AAAA,KACJ;AAAA,GACJ;AAAA,EAEO,gBAAgB,KAAwF,EAAA;AAC3G,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAiB,CAAA,GAAA,CAAI,KAAK,CAAG,EAAA;AACnC,MAAQ,OAAA,CAAA,IAAA,CAAK,qFAAqF,KAAK,CAAA,CAAA;AAAA,KAC3G;AACA,IAAA,MAAM,mBAAsB,GAAA,IAAA,CAAK,gBAAiB,CAAA,GAAA,CAAI,KAAK,CAAA,CAAA;AAE3D,IAAoB,mBAAA,CAAA,oBAAA,CAAqB,QAAQ,EAAE,WAAA,EAAa,MAAM,QAAU,EAAA,IAAA,EAAM,OAAS,EAAA,IAAA,EAAM,CAAA,CAAA;AACrG,IAAK,IAAA,CAAA,gBAAA,CAAiB,OAAO,KAAK,CAAA,CAAA;AAAA,GACtC;AACJ;;;;"}