{"version":3,"file":"runtime-4.1.mjs","sources":["../src/core/attachments/Attachment.ts","../src/core/attachments/BoundingBoxAttachment.ts","../src/core/attachments/ClippingAttachment.ts","../src/core/attachments/MeshAttachment.ts","../src/core/attachments/PathAttachment.ts","../src/core/attachments/PointAttachment.ts","../src/core/attachments/RegionAttachment.ts","../src/core/attachments/Sequence.ts","../src/core/Animation.ts","../src/core/AnimationState.ts","../src/core/AnimationStateData.ts","../src/core/AtlasAttachmentLoader.ts","../src/core/Bone.ts","../src/core/BoneData.ts","../src/core/ConstraintData.ts","../src/core/Event.ts","../src/core/EventData.ts","../src/core/IkConstraint.ts","../src/core/IkConstraintData.ts","../src/core/PathConstraintData.ts","../src/core/PathConstraint.ts","../src/core/Slot.ts","../src/core/TransformConstraint.ts","../src/core/Skeleton.ts","../src/core/SkeletonData.ts","../src/core/SlotData.ts","../src/core/TransformConstraintData.ts","../src/core/Skin.ts","../src/core/SkeletonBinary.ts","../src/core/SkeletonBounds.ts","../src/core/SkeletonJson.ts","../src/Spine.ts"],"sourcesContent":["import { AttachmentType, Utils } from '@pixi-spine/base';\nimport type { IAttachment, NumberArrayLike } from '@pixi-spine/base';\n\nimport type { Slot } from '../Slot';\n\n/**\n * The base class for all attachments.\n * @public\n */\nexport abstract class Attachment implements IAttachment {\n    name: string;\n    type: AttachmentType;\n\n    constructor(name: string) {\n        if (!name) throw new Error('name cannot be null.');\n        this.name = name;\n    }\n\n    abstract copy(): Attachment;\n}\n\n/**\n * Base class for an attachment with vertices that are transformed by one or more bones and can be deformed by a slot's\n * {@link Slot#deform}.\n * @public\n */\nexport abstract class VertexAttachment extends Attachment {\n    private static nextID = 0;\n\n    /** The unique ID for this attachment. */\n    id = VertexAttachment.nextID++;\n\n    /** The bones which affect the {@link #getVertices()}. The array entries are, for each vertex, the number of bones affecting\n     * the vertex followed by that many bone indices, which is the index of the bone in {@link Skeleton#bones}. Will be null\n     * if this attachment has no weights. */\n    bones: Array<number> | null = null;\n\n    /** The vertex positions in the bone's coordinate system. For a non-weighted attachment, the values are `x,y`\n     * entries for each vertex. For a weighted attachment, the values are `x,y,weight` entries for each bone affecting\n     * each vertex. */\n    vertices: NumberArrayLike = [];\n\n    /** The maximum number of world vertex values that can be output by\n     * {@link #computeWorldVertices()} using the `count` parameter. */\n    worldVerticesLength = 0;\n\n    /** Timelines for the timeline attachment are also applied to this attachment.\n     * May be null if no attachment-specific timelines should be applied. */\n    timelineAttachment: Attachment = this;\n\n    constructor(name: string) {\n        super(name);\n    }\n\n    computeWorldVerticesOld(slot: Slot, worldVertices: ArrayLike<number>) {\n        this.computeWorldVertices(slot, 0, this.worldVerticesLength, worldVertices, 0, 2);\n    }\n    /** Transforms the attachment's local {@link #vertices} to world coordinates. If the slot's {@link Slot#deform} is\n     * not empty, it is used to deform the vertices.\n     *\n     * See [World transforms](http://esotericsoftware.com/spine-runtime-skeletons#World-transforms) in the Spine\n     * Runtimes Guide.\n     * @param start The index of the first {@link #vertices} value to transform. Each vertex has 2 values, x and y.\n     * @param count The number of world vertex values to output. Must be <= {@link #worldVerticesLength} - `start`.\n     * @param worldVertices The output world vertices. Must have a length >= `offset` + `count` *\n     *           `stride` / 2.\n     * @param offset The `worldVertices` index to begin writing values.\n     * @param stride The number of `worldVertices` entries between the value pairs written. */\n    computeWorldVertices(slot: Slot, start: number, count: number, worldVertices: NumberArrayLike, offset: number, stride: number) {\n        count = offset + (count >> 1) * stride;\n        const skeleton = slot.bone.skeleton;\n        const deformArray = slot.deform;\n        let vertices = this.vertices;\n        const bones = this.bones;\n\n        if (!bones) {\n            if (deformArray.length > 0) vertices = deformArray;\n            const mat = slot.bone.matrix;\n            const x = mat.tx;\n            const y = mat.ty;\n            const a = mat.a;\n            const b = mat.c;\n            const c = mat.b;\n            const d = mat.d;\n\n            for (let v = start, w = offset; w < count; v += 2, w += stride) {\n                const vx = vertices[v];\n                const vy = vertices[v + 1];\n\n                worldVertices[w] = vx * a + vy * b + x;\n                worldVertices[w + 1] = vx * c + vy * d + y;\n            }\n\n            return;\n        }\n        let v = 0;\n        let skip = 0;\n\n        for (let i = 0; i < start; i += 2) {\n            const n = bones[v];\n\n            v += n + 1;\n            skip += n;\n        }\n        const skeletonBones = skeleton.bones;\n\n        if (deformArray.length == 0) {\n            for (let w = offset, b = skip * 3; w < count; w += stride) {\n                let wx = 0;\n                let wy = 0;\n                let n = bones[v++];\n\n                n += v;\n                for (; v < n; v++, b += 3) {\n                    const mat = skeletonBones[bones[v]].matrix;\n                    const vx = vertices[b];\n                    const vy = vertices[b + 1];\n                    const weight = vertices[b + 2];\n\n                    wx += (vx * mat.a + vy * mat.c + mat.tx) * weight;\n                    wy += (vx * mat.b + vy * mat.d + mat.ty) * weight;\n                }\n                worldVertices[w] = wx;\n                worldVertices[w + 1] = wy;\n            }\n        } else {\n            const deform = deformArray;\n\n            for (let w = offset, b = skip * 3, f = skip << 1; w < count; w += stride) {\n                let wx = 0;\n                let wy = 0;\n                let n = bones[v++];\n\n                n += v;\n                for (; v < n; v++, b += 3, f += 2) {\n                    const mat = skeletonBones[bones[v]].matrix;\n                    const vx = vertices[b] + deform[f];\n                    const vy = vertices[b + 1] + deform[f + 1];\n                    const weight = vertices[b + 2];\n\n                    wx += (vx * mat.a + vy * mat.c + mat.tx) * weight;\n                    wy += (vx * mat.b + vy * mat.d + mat.ty) * weight;\n                }\n                worldVertices[w] = wx;\n                worldVertices[w + 1] = wy;\n            }\n        }\n    }\n\n    /** Does not copy id (generated) or name (set on construction). **/\n    copyTo(attachment: VertexAttachment) {\n        if (this.bones) {\n            attachment.bones = new Array<number>(this.bones.length);\n            Utils.arrayCopy(this.bones, 0, attachment.bones, 0, this.bones.length);\n        } else attachment.bones = null;\n\n        if (this.vertices) {\n            attachment.vertices = Utils.newFloatArray(this.vertices.length);\n            Utils.arrayCopy(this.vertices, 0, attachment.vertices, 0, this.vertices.length);\n        }\n\n        attachment.worldVerticesLength = this.worldVerticesLength;\n        attachment.timelineAttachment = this.timelineAttachment;\n    }\n}\n","import { Attachment, VertexAttachment } from './Attachment';\nimport { AttachmentType, Color } from '@pixi-spine/base';\n\n/**\n * @public\n */\nexport class BoundingBoxAttachment extends VertexAttachment {\n    type = AttachmentType.BoundingBox;\n    color = new Color(1, 1, 1, 1);\n\n    constructor(name: string) {\n        super(name);\n    }\n\n    copy(): Attachment {\n        const copy = new BoundingBoxAttachment(this.name);\n\n        this.copyTo(copy);\n        copy.color.setFromColor(this.color);\n\n        return copy;\n    }\n}\n","import { Attachment, VertexAttachment } from './Attachment';\nimport { AttachmentType, Color, IClippingAttachment } from '@pixi-spine/base';\nimport type { SlotData } from '../SlotData';\n\n/**\n * @public\n */\nexport class ClippingAttachment extends VertexAttachment implements IClippingAttachment {\n    type = AttachmentType.Clipping;\n    /** Clipping is performed between the clipping polygon's slot and the end slot. Returns null if clipping is done until the end of\n     * the skeleton's rendering. */\n    endSlot: SlotData | null = null;\n\n    // Nonessential.\n    /** The color of the clipping polygon as it was in Spine. Available only when nonessential data was exported. Clipping polygons\n     * are not usually rendered at runtime. */\n    color = new Color(0.2275, 0.2275, 0.8078, 1); // ce3a3aff\n\n    constructor(name: string) {\n        super(name);\n    }\n\n    copy(): Attachment {\n        const copy = new ClippingAttachment(this.name);\n\n        this.copyTo(copy);\n        copy.endSlot = this.endSlot;\n        copy.color.setFromColor(this.color);\n\n        return copy;\n    }\n}\n","import { Attachment, VertexAttachment } from './Attachment';\nimport { AttachmentType, Color, IMeshAttachment, IHasTextureRegion, NumberArrayLike, TextureRegion, Utils } from '@pixi-spine/base';\nimport type { Sequence } from './Sequence';\nimport type { Slot } from '../Slot';\n\n/**\n * @public\n */\nexport class MeshAttachment extends VertexAttachment implements IMeshAttachment, IHasTextureRegion {\n    type = AttachmentType.Mesh;\n\n    region: TextureRegion | null = null;\n\n    /** The name of the texture region for this attachment. */\n    path: string;\n\n    /** The UV pair for each vertex, normalized within the texture region. */\n    regionUVs: Float32Array;\n\n    /** Triplets of vertex indices which describe the mesh's triangulation. */\n    triangles: Array<number> = [];\n\n    /** The color to tint the mesh. */\n    color = new Color(1, 1, 1, 1);\n\n    /** The width of the mesh's image. Available only when nonessential data was exported. */\n    width = 0;\n\n    /** The height of the mesh's image. Available only when nonessential data was exported. */\n    height = 0;\n\n    /** The number of entries at the beginning of {@link #vertices} that make up the mesh hull. */\n    hullLength = 0;\n\n    /** Vertex index pairs describing edges for controling triangulation. Mesh triangles will never cross edges. Only available if\n     * nonessential data was exported. Triangulation is not performed at runtime. */\n    edges: Array<number> = [];\n\n    private parentMesh: MeshAttachment | null = null;\n\n    sequence: Sequence | null = null;\n\n    tempColor = new Color(0, 0, 0, 0);\n\n    constructor(name: string, path: string) {\n        super(name);\n        this.path = path;\n    }\n\n    /** The parent mesh if this is a linked mesh, else null. A linked mesh shares the {@link #bones}, {@link #vertices},\n     * {@link #regionUVs}, {@link #triangles}, {@link #hullLength}, {@link #edges}, {@link #width}, and {@link #height} with the\n     * parent mesh, but may have a different {@link #name} or {@link #path} (and therefore a different texture). */\n    getParentMesh() {\n        return this.parentMesh;\n    }\n\n    /** @param parentMesh May be null. */\n    setParentMesh(parentMesh: MeshAttachment) {\n        this.parentMesh = parentMesh;\n        if (parentMesh) {\n            this.bones = parentMesh.bones;\n            this.vertices = parentMesh.vertices;\n            this.worldVerticesLength = parentMesh.worldVerticesLength;\n            this.regionUVs = parentMesh.regionUVs;\n            this.triangles = parentMesh.triangles;\n            this.hullLength = parentMesh.hullLength;\n            this.worldVerticesLength = parentMesh.worldVerticesLength;\n        }\n    }\n\n    copy(): Attachment {\n        if (this.parentMesh) return this.newLinkedMesh();\n\n        const copy = new MeshAttachment(this.name, this.path);\n\n        copy.region = this.region;\n        copy.color.setFromColor(this.color);\n\n        this.copyTo(copy);\n        copy.regionUVs = new Float32Array(this.regionUVs.length);\n        Utils.arrayCopy(this.regionUVs, 0, copy.regionUVs, 0, this.regionUVs.length);\n        copy.triangles = new Array<number>(this.triangles.length);\n        Utils.arrayCopy(this.triangles, 0, copy.triangles, 0, this.triangles.length);\n        copy.hullLength = this.hullLength;\n\n        copy.sequence = this.sequence != null ? this.sequence.copy() : null;\n\n        // Nonessential.\n        if (this.edges) {\n            copy.edges = new Array<number>(this.edges.length);\n            Utils.arrayCopy(this.edges, 0, copy.edges, 0, this.edges.length);\n        }\n        copy.width = this.width;\n        copy.height = this.height;\n\n        return copy;\n    }\n\n    computeWorldVertices(slot: Slot, start: number, count: number, worldVertices: NumberArrayLike, offset: number, stride: number) {\n        if (this.sequence != null) this.sequence.apply(slot, this);\n        super.computeWorldVertices(slot, start, count, worldVertices, offset, stride);\n    }\n\n    /** Returns a new mesh with the {@link #parentMesh} set to this mesh's parent mesh, if any, else to this mesh. **/\n    newLinkedMesh(): MeshAttachment {\n        const copy = new MeshAttachment(this.name, this.path);\n\n        copy.region = this.region;\n        copy.color.setFromColor(this.color);\n        copy.timelineAttachment = this.timelineAttachment;\n        copy.setParentMesh(this.parentMesh ? this.parentMesh : this);\n        // if (copy.region != null) copy.updateRegion();\n\n        return copy;\n    }\n}\n","import { Attachment, VertexAttachment } from './Attachment';\nimport { AttachmentType, Color, Utils } from '@pixi-spine/base';\n\n/**\n * @public\n */\nexport class PathAttachment extends VertexAttachment {\n    type = AttachmentType.Path;\n\n    /** The lengths along the path in the setup pose from the start of the path to the end of each Bezier curve. */\n    lengths: Array<number> = [];\n\n    /** If true, the start and end knots are connected. */\n    closed = false;\n\n    /** If true, additional calculations are performed to make calculating positions along the path more accurate. If false, fewer\n     * calculations are performed but calculating positions along the path is less accurate. */\n    constantSpeed = false;\n\n    /** The color of the path as it was in Spine. Available only when nonessential data was exported. Paths are not usually\n     * rendered at runtime. */\n    color = new Color(1, 1, 1, 1);\n\n    constructor(name: string) {\n        super(name);\n    }\n\n    copy(): Attachment {\n        const copy = new PathAttachment(this.name);\n\n        this.copyTo(copy);\n        copy.lengths = new Array<number>(this.lengths.length);\n        Utils.arrayCopy(this.lengths, 0, copy.lengths, 0, this.lengths.length);\n        copy.closed = closed;\n        copy.constantSpeed = this.constantSpeed;\n        copy.color.setFromColor(this.color);\n\n        return copy;\n    }\n}\n","import { Attachment, VertexAttachment } from './Attachment';\nimport { AttachmentType, Color, MathUtils, Vector2 } from '@pixi-spine/base';\nimport type { Bone } from '../Bone';\n\n/**\n * @public\n */\nexport class PointAttachment extends VertexAttachment {\n    type = AttachmentType.Point;\n\n    x = 0;\n    y = 0;\n    rotation = 0;\n\n    /** The color of the point attachment as it was in Spine. Available only when nonessential data was exported. Point attachments\n     * are not usually rendered at runtime. */\n    color = new Color(0.38, 0.94, 0, 1);\n\n    constructor(name: string) {\n        super(name);\n    }\n\n    computeWorldPosition(bone: Bone, point: Vector2) {\n        const mat = bone.matrix;\n\n        point.x = this.x * mat.a + this.y * mat.c + bone.worldX;\n        point.y = this.x * mat.b + this.y * mat.d + bone.worldY;\n\n        return point;\n    }\n\n    computeWorldRotation(bone: Bone) {\n        const mat = bone.matrix;\n        const cos = MathUtils.cosDeg(this.rotation);\n        const sin = MathUtils.sinDeg(this.rotation);\n        const x = cos * mat.a + sin * mat.c;\n        const y = cos * mat.b + sin * mat.d;\n\n        return Math.atan2(y, x) * MathUtils.radDeg;\n    }\n\n    copy(): Attachment {\n        const copy = new PointAttachment(this.name);\n\n        copy.x = this.x;\n        copy.y = this.y;\n        copy.rotation = this.rotation;\n        copy.color.setFromColor(this.color);\n\n        return copy;\n    }\n}\n","import { Attachment } from './Attachment';\nimport { AttachmentType, NumberArrayLike, Color, TextureRegion, Utils, IHasTextureRegion, IRegionAttachment } from '@pixi-spine/base';\nimport type { Sequence } from './Sequence';\nimport type { Slot } from '../Slot';\n\n/**\n * @public\n */\nexport class RegionAttachment extends Attachment implements IRegionAttachment, IHasTextureRegion {\n    type = AttachmentType.Region;\n\n    /** The local x translation. */\n    x = 0;\n\n    /** The local y translation. */\n    y = 0;\n\n    /** The local scaleX. */\n    scaleX = 1;\n\n    /** The local scaleY. */\n    scaleY = 1;\n\n    /** The local rotation. */\n    rotation = 0;\n\n    /** The width of the region attachment in Spine. */\n    width = 0;\n\n    /** The height of the region attachment in Spine. */\n    height = 0;\n\n    /** The color to tint the region attachment. */\n    color = new Color(1, 1, 1, 1);\n\n    /** The name of the texture region for this attachment. */\n    path: string;\n\n    private rendererObject: any = null;\n    region: TextureRegion | null = null;\n    sequence: Sequence | null = null;\n\n    /** For each of the 4 vertices, a pair of <code>x,y</code> values that is the local position of the vertex.\n     *\n     * See {@link #updateOffset()}. */\n    offset = Utils.newFloatArray(8);\n\n    uvs = Utils.newFloatArray(8);\n\n    tempColor = new Color(1, 1, 1, 1);\n\n    constructor(name: string, path: string) {\n        super(name);\n        this.path = path;\n    }\n\n    /** Calculates the {@link #offset} using the region settings. Must be called after changing region settings. */\n    updateRegion(): void {\n        if (!this.region) throw new Error('Region not set.');\n        const region = this.region;\n        const regionScaleX = (this.width / this.region.originalWidth) * this.scaleX;\n        const regionScaleY = (this.height / this.region.originalHeight) * this.scaleY;\n        const localX = (-this.width / 2) * this.scaleX + this.region.offsetX * regionScaleX;\n        const localY = (-this.height / 2) * this.scaleY + this.region.offsetY * regionScaleY;\n        const localX2 = localX + this.region.width * regionScaleX;\n        const localY2 = localY + this.region.height * regionScaleY;\n        const radians = (this.rotation * Math.PI) / 180;\n        const cos = Math.cos(radians);\n        const sin = Math.sin(radians);\n        const x = this.x;\n        const y = this.y;\n        const localXCos = localX * cos + x;\n        const localXSin = localX * sin;\n        const localYCos = localY * cos + y;\n        const localYSin = localY * sin;\n        const localX2Cos = localX2 * cos + x;\n        const localX2Sin = localX2 * sin;\n        const localY2Cos = localY2 * cos + y;\n        const localY2Sin = localY2 * sin;\n        const offset = this.offset;\n\n        offset[0] = localXCos - localYSin;\n        offset[1] = localYCos + localXSin;\n        offset[2] = localXCos - localY2Sin;\n        offset[3] = localY2Cos + localXSin;\n        offset[4] = localX2Cos - localY2Sin;\n        offset[5] = localY2Cos + localX2Sin;\n        offset[6] = localX2Cos - localYSin;\n        offset[7] = localYCos + localX2Sin;\n\n        const uvs = this.uvs;\n\n        if (region.degrees == 90) {\n            uvs[2] = region.u;\n            uvs[3] = region.v2;\n            uvs[4] = region.u;\n            uvs[5] = region.v;\n            uvs[6] = region.u2;\n            uvs[7] = region.v;\n            uvs[0] = region.u2;\n            uvs[1] = region.v2;\n        } else {\n            uvs[0] = region.u;\n            uvs[1] = region.v2;\n            uvs[2] = region.u;\n            uvs[3] = region.v;\n            uvs[4] = region.u2;\n            uvs[5] = region.v;\n            uvs[6] = region.u2;\n            uvs[7] = region.v2;\n        }\n    }\n\n    /** Transforms the attachment's four vertices to world coordinates. If the attachment has a {@link #sequence}, the region may\n     * be changed.\n     * <p>\n     * See <a href=\"http://esotericsoftware.com/spine-runtime-skeletons#World-transforms\">World transforms</a> in the Spine\n     * Runtimes Guide.\n     * @param worldVertices The output world vertices. Must have a length >= <code>offset</code> + 8.\n     * @param offset The <code>worldVertices</code> index to begin writing values.\n     * @param stride The number of <code>worldVertices</code> entries between the value pairs written. */\n    computeWorldVertices(slot: Slot, worldVertices: NumberArrayLike, offset: number, stride: number) {\n        if (this.sequence != null) this.sequence.apply(slot, this);\n\n        const bone = slot.bone;\n        const vertexOffset = this.offset;\n        const mat = bone.matrix;\n        const x = mat.tx;\n        const y = mat.ty;\n        const a = mat.a;\n        const b = mat.c;\n        const c = mat.b;\n        const d = mat.d;\n        let offsetX = 0;\n        let offsetY = 0;\n\n        offsetX = vertexOffset[0];\n        offsetY = vertexOffset[1];\n        worldVertices[offset] = offsetX * a + offsetY * b + x; // br\n        worldVertices[offset + 1] = offsetX * c + offsetY * d + y;\n        offset += stride;\n\n        offsetX = vertexOffset[2];\n        offsetY = vertexOffset[3];\n        worldVertices[offset] = offsetX * a + offsetY * b + x; // bl\n        worldVertices[offset + 1] = offsetX * c + offsetY * d + y;\n        offset += stride;\n\n        offsetX = vertexOffset[4];\n        offsetY = vertexOffset[5];\n        worldVertices[offset] = offsetX * a + offsetY * b + x; // ul\n        worldVertices[offset + 1] = offsetX * c + offsetY * d + y;\n        offset += stride;\n\n        offsetX = vertexOffset[6];\n        offsetY = vertexOffset[7];\n        worldVertices[offset] = offsetX * a + offsetY * b + x; // ur\n        worldVertices[offset + 1] = offsetX * c + offsetY * d + y;\n    }\n\n    copy(): Attachment {\n        const copy = new RegionAttachment(this.name, this.path);\n\n        copy.region = this.region;\n        copy.rendererObject = this.rendererObject;\n        copy.x = this.x;\n        copy.y = this.y;\n        copy.scaleX = this.scaleX;\n        copy.scaleY = this.scaleY;\n        copy.rotation = this.rotation;\n        copy.width = this.width;\n        copy.height = this.height;\n        Utils.arrayCopy(this.uvs, 0, copy.uvs, 0, 8);\n        Utils.arrayCopy(this.offset, 0, copy.offset, 0, 8);\n        copy.color.setFromColor(this.color);\n        copy.sequence = this.sequence != null ? this.sequence.copy() : null;\n\n        return copy;\n    }\n\n    static X1 = 0;\n    static Y1 = 1;\n    static C1R = 2;\n    static C1G = 3;\n    static C1B = 4;\n    static C1A = 5;\n    static U1 = 6;\n    static V1 = 7;\n\n    static X2 = 8;\n    static Y2 = 9;\n    static C2R = 10;\n    static C2G = 11;\n    static C2B = 12;\n    static C2A = 13;\n    static U2 = 14;\n    static V2 = 15;\n\n    static X3 = 16;\n    static Y3 = 17;\n    static C3R = 18;\n    static C3G = 19;\n    static C3B = 20;\n    static C3A = 21;\n    static U3 = 22;\n    static V3 = 23;\n\n    static X4 = 24;\n    static Y4 = 25;\n    static C4R = 26;\n    static C4G = 27;\n    static C4B = 28;\n    static C4A = 29;\n    static U4 = 30;\n    static V4 = 31;\n}\n","import { Utils, TextureRegion, IHasTextureRegion, ISequence } from '@pixi-spine/base';\nimport type { Slot } from '../Slot';\n\n/**\n * @public\n */\nexport class Sequence implements ISequence {\n    private static _nextID = 0;\n\n    id = Sequence.nextID();\n    regions: TextureRegion[];\n    start = 0;\n    digits = 0;\n    /** The index of the region to show for the setup pose. */\n    setupIndex = 0;\n\n    constructor(count: number) {\n        this.regions = new Array<TextureRegion>(count);\n    }\n\n    copy(): Sequence {\n        const copy = new Sequence(this.regions.length);\n\n        Utils.arrayCopy(this.regions, 0, copy.regions, 0, this.regions.length);\n        copy.start = this.start;\n        copy.digits = this.digits;\n        copy.setupIndex = this.setupIndex;\n\n        return copy;\n    }\n\n    apply(slot: Slot, attachment: IHasTextureRegion) {\n        let index = slot.sequenceIndex;\n\n        if (index == -1) index = this.setupIndex;\n        if (index >= this.regions.length) index = this.regions.length - 1;\n        const region = this.regions[index];\n\n        if (attachment.region != region) {\n            attachment.region = region;\n            // attachment.updateRegion();\n        }\n    }\n\n    getPath(basePath: string, index: number): string {\n        let result = basePath;\n        const frame = (this.start + index).toString();\n\n        for (let i = this.digits - frame.length; i > 0; i--) result += '0';\n        result += frame;\n\n        return result;\n    }\n\n    private static nextID(): number {\n        return Sequence._nextID++;\n    }\n}\n\n/**\n * @public\n */\nexport enum SequenceMode {\n    hold = 0,\n    once = 1,\n    loop = 2,\n    pingpong = 3,\n    onceReverse = 4,\n    loopReverse = 5,\n    pingpongReverse = 6,\n}\n\n/**\n * @public\n */\nexport const SequenceModeValues = [\n    SequenceMode.hold,\n    SequenceMode.once,\n    SequenceMode.loop,\n    SequenceMode.pingpong,\n    SequenceMode.onceReverse,\n    SequenceMode.loopReverse,\n    SequenceMode.pingpongReverse,\n];\n","import type { Event } from './Event';\nimport type { Skeleton } from './Skeleton';\nimport { Attachment, VertexAttachment } from './attachments';\nimport { NumberArrayLike, IAnimation, ITimeline, MathUtils, MixBlend, StringSet, Utils, MixDirection, IHasTextureRegion } from '@pixi-spine/base';\nimport type { Slot } from './Slot';\nimport type { IkConstraint } from './IkConstraint';\nimport type { TransformConstraint } from './TransformConstraint';\nimport type { PathConstraint } from './PathConstraint';\nimport { SequenceMode, SequenceModeValues } from './attachments/Sequence';\n\n/**\n * A simple container for a list of timelines and a name.\n * @public\n * */\nexport class Animation implements IAnimation<Timeline> {\n    /** The animation's name, which is unique across all animations in the skeleton. */\n    name: string;\n    timelines: Array<Timeline> = [];\n    timelineIds: StringSet = new StringSet();\n\n    /** The duration of the animation in seconds, which is the highest time of all keys in the timeline. */\n    duration: number;\n\n    constructor(name: string, timelines: Array<Timeline>, duration: number) {\n        if (!name) throw new Error('name cannot be null.');\n        this.name = name;\n        this.setTimelines(timelines);\n        this.duration = duration;\n    }\n\n    setTimelines(timelines: Array<Timeline>) {\n        if (!timelines) throw new Error('timelines cannot be null.');\n        this.timelines = timelines;\n        this.timelineIds.clear();\n        for (let i = 0; i < timelines.length; i++) this.timelineIds.addAll(timelines[i].getPropertyIds());\n    }\n\n    hasTimeline(ids: string[]): boolean {\n        for (let i = 0; i < ids.length; i++) if (this.timelineIds.contains(ids[i])) return true;\n\n        return false;\n    }\n\n    /** Applies all the animation's timelines to the specified skeleton.\n     *\n     * See Timeline {@link Timeline#apply(Skeleton, float, float, Array, float, MixBlend, MixDirection)}.\n     * @param loop If true, the animation repeats after {@link #getDuration()}.\n     * @param events May be null to ignore fired events. */\n    apply(skeleton: Skeleton, lastTime: number, time: number, loop: boolean, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        if (!skeleton) throw new Error('skeleton cannot be null.');\n\n        if (loop && this.duration != 0) {\n            time %= this.duration;\n            if (lastTime > 0) lastTime %= this.duration;\n        }\n\n        const timelines = this.timelines;\n\n        for (let i = 0, n = timelines.length; i < n; i++) timelines[i].apply(skeleton, lastTime, time, events, alpha, blend, direction);\n    }\n}\n\nconst Property = {\n    rotate: 0,\n    x: 1,\n    y: 2,\n    scaleX: 3,\n    scaleY: 4,\n    shearX: 5,\n    shearY: 6,\n\n    rgb: 7,\n    alpha: 8,\n    rgb2: 9,\n\n    attachment: 10,\n    deform: 11,\n\n    event: 12,\n    drawOrder: 13,\n\n    ikConstraint: 14,\n    transformConstraint: 15,\n\n    pathConstraintPosition: 16,\n    pathConstraintSpacing: 17,\n    pathConstraintMix: 18,\n\n    sequence: 19,\n};\n\n/** The interface for all timelines.\n * @public\n * */\nexport abstract class Timeline implements ITimeline {\n    propertyIds: string[];\n    frames: NumberArrayLike;\n\n    constructor(frameCount: number, propertyIds: string[]) {\n        this.propertyIds = propertyIds;\n        this.frames = Utils.newFloatArray(frameCount * this.getFrameEntries());\n    }\n\n    getPropertyIds() {\n        return this.propertyIds;\n    }\n\n    getFrameEntries(): number {\n        return 1;\n    }\n\n    getFrameCount() {\n        return this.frames.length / this.getFrameEntries();\n    }\n\n    getDuration(): number {\n        return this.frames[this.frames.length - this.getFrameEntries()];\n    }\n\n    abstract apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event> | null, alpha: number, blend: MixBlend, direction: MixDirection): void;\n\n    static search1(frames: NumberArrayLike, time: number) {\n        const n = frames.length;\n\n        for (let i = 1; i < n; i++) if (frames[i] > time) return i - 1;\n\n        return n - 1;\n    }\n\n    static search(frames: NumberArrayLike, time: number, step: number) {\n        const n = frames.length;\n\n        for (let i = step; i < n; i += step) if (frames[i] > time) return i - step;\n\n        return n - step;\n    }\n}\n\n/**\n * @public\n */\nexport interface BoneTimeline {\n    /** The index of the bone in {@link Skeleton#bones} that will be changed. */\n    boneIndex: number;\n}\n\n/**\n * @public\n */\nexport interface SlotTimeline {\n    /** The index of the slot in {@link Skeleton#slots} that will be changed. */\n    slotIndex: number;\n}\n\n/** The base class for timelines that use interpolation between key frame values.\n * @public\n * */\nexport abstract class CurveTimeline extends Timeline {\n    protected curves: NumberArrayLike; // type, x, y, ...\n\n    constructor(frameCount: number, bezierCount: number, propertyIds: string[]) {\n        super(frameCount, propertyIds);\n        this.curves = Utils.newFloatArray(frameCount + bezierCount * 18 /* BEZIER_SIZE*/);\n        this.curves[frameCount - 1] = 1 /* STEPPED*/;\n    }\n\n    /** Sets the specified key frame to linear interpolation. */\n    setLinear(frame: number) {\n        this.curves[frame] = 0 /* LINEAR*/;\n    }\n\n    /** Sets the specified key frame to stepped interpolation. */\n    setStepped(frame: number) {\n        this.curves[frame] = 1 /* STEPPED*/;\n    }\n\n    /** Shrinks the storage for Bezier curves, for use when <code>bezierCount</code> (specified in the constructor) was larger\n     * than the actual number of Bezier curves. */\n    shrink(bezierCount: number) {\n        const size = this.getFrameCount() + bezierCount * 18; /* BEZIER_SIZE*/\n\n        if (this.curves.length > size) {\n            const newCurves = Utils.newFloatArray(size);\n\n            Utils.arrayCopy(this.curves, 0, newCurves, 0, size);\n            this.curves = newCurves;\n        }\n    }\n\n    /** Stores the segments for the specified Bezier curve. For timelines that modify multiple values, there may be more than\n     * one curve per frame.\n     * @param bezier The ordinal of this Bezier curve for this timeline, between 0 and <code>bezierCount - 1</code> (specified\n     *           in the constructor), inclusive.\n     * @param frame Between 0 and <code>frameCount - 1</code>, inclusive.\n     * @param value The index of the value for this frame that this curve is used for.\n     * @param time1 The time for the first key.\n     * @param value1 The value for the first key.\n     * @param cx1 The time for the first Bezier handle.\n     * @param cy1 The value for the first Bezier handle.\n     * @param cx2 The time of the second Bezier handle.\n     * @param cy2 The value for the second Bezier handle.\n     * @param time2 The time for the second key.\n     * @param value2 The value for the second key. */\n    setBezier(bezier: number, frame: number, value: number, time1: number, value1: number, cx1: number, cy1: number, cx2: number, cy2: number, time2: number, value2: number) {\n        const curves = this.curves;\n        let i = this.getFrameCount() + bezier * 18; /* BEZIER_SIZE*/\n\n        if (value == 0) curves[frame] = 2 /* BEZIER*/ + i;\n        const tmpx = (time1 - cx1 * 2 + cx2) * 0.03;\n        const tmpy = (value1 - cy1 * 2 + cy2) * 0.03;\n        const dddx = ((cx1 - cx2) * 3 - time1 + time2) * 0.006;\n        const dddy = ((cy1 - cy2) * 3 - value1 + value2) * 0.006;\n        let ddx = tmpx * 2 + dddx;\n        let ddy = tmpy * 2 + dddy;\n        let dx = (cx1 - time1) * 0.3 + tmpx + dddx * 0.16666667;\n        let dy = (cy1 - value1) * 0.3 + tmpy + dddy * 0.16666667;\n        let x = time1 + dx;\n        let y = value1 + dy;\n\n        for (let n = i + 18 /* BEZIER_SIZE*/; i < n; i += 2) {\n            curves[i] = x;\n            curves[i + 1] = y;\n            dx += ddx;\n            dy += ddy;\n            ddx += dddx;\n            ddy += dddy;\n            x += dx;\n            y += dy;\n        }\n    }\n\n    /** Returns the Bezier interpolated value for the specified time.\n     * @param frameIndex The index into {@link #getFrames()} for the values of the frame before <code>time</code>.\n     * @param valueOffset The offset from <code>frameIndex</code> to the value this curve is used for.\n     * @param i The index of the Bezier segments. See {@link #getCurveType(int)}. */\n    getBezierValue(time: number, frameIndex: number, valueOffset: number, i: number) {\n        const curves = this.curves;\n\n        if (curves[i] > time) {\n            const x = this.frames[frameIndex];\n            const y = this.frames[frameIndex + valueOffset];\n\n            return y + ((time - x) / (curves[i] - x)) * (curves[i + 1] - y);\n        }\n        const n = i + 18; /* BEZIER_SIZE*/\n\n        for (i += 2; i < n; i += 2) {\n            if (curves[i] >= time) {\n                const x = curves[i - 2];\n                const y = curves[i - 1];\n\n                return y + ((time - x) / (curves[i] - x)) * (curves[i + 1] - y);\n            }\n        }\n        frameIndex += this.getFrameEntries();\n        const x = curves[n - 2];\n        const y = curves[n - 1];\n\n        return y + ((time - x) / (this.frames[frameIndex] - x)) * (this.frames[frameIndex + valueOffset] - y);\n    }\n}\n/**\n * @public\n */\nexport abstract class CurveTimeline1 extends CurveTimeline {\n    constructor(frameCount: number, bezierCount: number, propertyId: string) {\n        super(frameCount, bezierCount, [propertyId]);\n    }\n\n    getFrameEntries() {\n        return 2 /* ENTRIES*/;\n    }\n\n    /** Sets the time and value for the specified frame.\n     * @param frame Between 0 and <code>frameCount</code>, inclusive.\n     * @param time The frame time in seconds. */\n    setFrame(frame: number, time: number, value: number) {\n        frame <<= 1;\n        this.frames[frame] = time;\n        this.frames[frame + 1 /* VALUE*/] = value;\n    }\n\n    /** Returns the interpolated value for the specified time. */\n    getCurveValue(time: number) {\n        const frames = this.frames;\n        let i = frames.length - 2;\n\n        for (let ii = 2; ii <= i; ii += 2) {\n            if (frames[ii] > time) {\n                i = ii - 2;\n                break;\n            }\n        }\n\n        const curveType = this.curves[i >> 1];\n\n        switch (curveType) {\n            case 0 /* LINEAR*/:\n                const before = frames[i];\n                const value = frames[i + 1 /* VALUE*/];\n\n                return value + ((time - before) / (frames[i + 2 /* ENTRIES*/] - before)) * (frames[i + 2 /* ENTRIES*/ + 1 /* VALUE*/] - value);\n            case 1 /* STEPPED*/:\n                return frames[i + 1 /* VALUE*/];\n        }\n\n        return this.getBezierValue(time, i, 1 /* VALUE*/, curveType - 2 /* BEZIER*/);\n    }\n}\n\n/** The base class for a {@link CurveTimeline} which sets two properties.\n * @public\n * */\nexport abstract class CurveTimeline2 extends CurveTimeline {\n    /** @param bezierCount The maximum number of Bezier curves. See {@link #shrink(int)}.\n     * @param propertyIds Unique identifiers for the properties the timeline modifies. */\n    constructor(frameCount: number, bezierCount: number, propertyId1: string, propertyId2: string) {\n        super(frameCount, bezierCount, [propertyId1, propertyId2]);\n    }\n\n    getFrameEntries() {\n        return 3 /* ENTRIES*/;\n    }\n\n    /** Sets the time and values for the specified frame.\n     * @param frame Between 0 and <code>frameCount</code>, inclusive.\n     * @param time The frame time in seconds. */\n    setFrame(frame: number, time: number, value1: number, value2: number) {\n        frame *= 3 /* ENTRIES*/;\n        this.frames[frame] = time;\n        this.frames[frame + 1 /* VALUE1*/] = value1;\n        this.frames[frame + 2 /* VALUE2*/] = value2;\n    }\n}\n\n/** Changes a bone's local {@link Bone#rotation}.\n * @public\n * */\nexport class RotateTimeline extends CurveTimeline1 implements BoneTimeline {\n    boneIndex = 0;\n\n    constructor(frameCount: number, bezierCount: number, boneIndex: number) {\n        super(frameCount, bezierCount, `${Property.rotate}|${boneIndex}`);\n        this.boneIndex = boneIndex;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event> | null, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const bone = skeleton.bones[this.boneIndex];\n\n        if (!bone.active) return;\n\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    bone.rotation = bone.data.rotation;\n\n                    return;\n                case MixBlend.first:\n                    bone.rotation += (bone.data.rotation - bone.rotation) * alpha;\n            }\n\n            return;\n        }\n\n        let r = this.getCurveValue(time);\n\n        switch (blend) {\n            case MixBlend.setup:\n                bone.rotation = bone.data.rotation + r * alpha;\n                break;\n            case MixBlend.first:\n            case MixBlend.replace:\n                r += bone.data.rotation - bone.rotation;\n            case MixBlend.add:\n                bone.rotation += r * alpha;\n        }\n    }\n}\n\n/** Changes a bone's local {@link Bone#x} and {@link Bone#y}.\n * @public\n * */\nexport class TranslateTimeline extends CurveTimeline2 implements BoneTimeline {\n    boneIndex = 0;\n\n    constructor(frameCount: number, bezierCount: number, boneIndex: number) {\n        super(frameCount, bezierCount, `${Property.x}|${boneIndex}`, `${Property.y}|${boneIndex}`);\n        this.boneIndex = boneIndex;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const bone = skeleton.bones[this.boneIndex];\n\n        if (!bone.active) return;\n\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    bone.x = bone.data.x;\n                    bone.y = bone.data.y;\n\n                    return;\n                case MixBlend.first:\n                    bone.x += (bone.data.x - bone.x) * alpha;\n                    bone.y += (bone.data.y - bone.y) * alpha;\n            }\n\n            return;\n        }\n\n        let x = 0;\n        let y = 0;\n        const i = Timeline.search(frames, time, 3 /* ENTRIES*/);\n        const curveType = this.curves[i / 3 /* ENTRIES*/];\n\n        switch (curveType) {\n            case 0 /* LINEAR*/:\n                const before = frames[i];\n\n                x = frames[i + 1 /* VALUE1*/];\n                y = frames[i + 2 /* VALUE2*/];\n                const t = (time - before) / (frames[i + 3 /* ENTRIES*/] - before);\n\n                x += (frames[i + 3 /* ENTRIES*/ + 1 /* VALUE1*/] - x) * t;\n                y += (frames[i + 3 /* ENTRIES*/ + 2 /* VALUE2*/] - y) * t;\n                break;\n            case 1 /* STEPPED*/:\n                x = frames[i + 1 /* VALUE1*/];\n                y = frames[i + 2 /* VALUE2*/];\n                break;\n            default:\n                x = this.getBezierValue(time, i, 1 /* VALUE1*/, curveType - 2 /* BEZIER*/);\n                y = this.getBezierValue(time, i, 2 /* VALUE2*/, curveType + 18 /* BEZIER_SIZE*/ - 2 /* BEZIER*/);\n        }\n\n        switch (blend) {\n            case MixBlend.setup:\n                bone.x = bone.data.x + x * alpha;\n                bone.y = bone.data.y + y * alpha;\n                break;\n            case MixBlend.first:\n            case MixBlend.replace:\n                bone.x += (bone.data.x + x - bone.x) * alpha;\n                bone.y += (bone.data.y + y - bone.y) * alpha;\n                break;\n            case MixBlend.add:\n                bone.x += x * alpha;\n                bone.y += y * alpha;\n        }\n    }\n}\n\n/** Changes a bone's local {@link Bone#x}.\n * @public\n * */\nexport class TranslateXTimeline extends CurveTimeline1 implements BoneTimeline {\n    boneIndex = 0;\n\n    constructor(frameCount: number, bezierCount: number, boneIndex: number) {\n        super(frameCount, bezierCount, `${Property.x}|${boneIndex}`);\n        this.boneIndex = boneIndex;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const bone = skeleton.bones[this.boneIndex];\n\n        if (!bone.active) return;\n\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    bone.x = bone.data.x;\n\n                    return;\n                case MixBlend.first:\n                    bone.x += (bone.data.x - bone.x) * alpha;\n            }\n\n            return;\n        }\n\n        const x = this.getCurveValue(time);\n\n        switch (blend) {\n            case MixBlend.setup:\n                bone.x = bone.data.x + x * alpha;\n                break;\n            case MixBlend.first:\n            case MixBlend.replace:\n                bone.x += (bone.data.x + x - bone.x) * alpha;\n                break;\n            case MixBlend.add:\n                bone.x += x * alpha;\n        }\n    }\n}\n\n/** Changes a bone's local {@link Bone#x}.\n * @public\n * */\nexport class TranslateYTimeline extends CurveTimeline1 implements BoneTimeline {\n    boneIndex = 0;\n\n    constructor(frameCount: number, bezierCount: number, boneIndex: number) {\n        super(frameCount, bezierCount, `${Property.y}|${boneIndex}`);\n        this.boneIndex = boneIndex;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const bone = skeleton.bones[this.boneIndex];\n\n        if (!bone.active) return;\n\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    bone.y = bone.data.y;\n\n                    return;\n                case MixBlend.first:\n                    bone.y += (bone.data.y - bone.y) * alpha;\n            }\n\n            return;\n        }\n\n        const y = this.getCurveValue(time);\n\n        switch (blend) {\n            case MixBlend.setup:\n                bone.y = bone.data.y + y * alpha;\n                break;\n            case MixBlend.first:\n            case MixBlend.replace:\n                bone.y += (bone.data.y + y - bone.y) * alpha;\n                break;\n            case MixBlend.add:\n                bone.y += y * alpha;\n        }\n    }\n}\n\n/** Changes a bone's local {@link Bone#scaleX)} and {@link Bone#scaleY}.\n * @public\n * */\nexport class ScaleTimeline extends CurveTimeline2 implements BoneTimeline {\n    boneIndex = 0;\n\n    constructor(frameCount: number, bezierCount: number, boneIndex: number) {\n        super(frameCount, bezierCount, `${Property.scaleX}|${boneIndex}`, `${Property.scaleY}|${boneIndex}`);\n        this.boneIndex = boneIndex;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const bone = skeleton.bones[this.boneIndex];\n\n        if (!bone.active) return;\n\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    bone.scaleX = bone.data.scaleX;\n                    bone.scaleY = bone.data.scaleY;\n\n                    return;\n                case MixBlend.first:\n                    bone.scaleX += (bone.data.scaleX - bone.scaleX) * alpha;\n                    bone.scaleY += (bone.data.scaleY - bone.scaleY) * alpha;\n            }\n\n            return;\n        }\n\n        let x;\n        let y;\n        const i = Timeline.search(frames, time, 3 /* ENTRIES*/);\n        const curveType = this.curves[i / 3 /* ENTRIES*/];\n\n        switch (curveType) {\n            case 0 /* LINEAR*/:\n                const before = frames[i];\n\n                x = frames[i + 1 /* VALUE1*/];\n                y = frames[i + 2 /* VALUE2*/];\n                const t = (time - before) / (frames[i + 3 /* ENTRIES*/] - before);\n\n                x += (frames[i + 3 /* ENTRIES*/ + 1 /* VALUE1*/] - x) * t;\n                y += (frames[i + 3 /* ENTRIES*/ + 2 /* VALUE2*/] - y) * t;\n                break;\n            case 1 /* STEPPED*/:\n                x = frames[i + 1 /* VALUE1*/];\n                y = frames[i + 2 /* VALUE2*/];\n                break;\n            default:\n                x = this.getBezierValue(time, i, 1 /* VALUE1*/, curveType - 2 /* BEZIER*/);\n                y = this.getBezierValue(time, i, 2 /* VALUE2*/, curveType + 18 /* BEZIER_SIZE*/ - 2 /* BEZIER*/);\n        }\n        x *= bone.data.scaleX;\n        y *= bone.data.scaleY;\n\n        if (alpha == 1) {\n            if (blend == MixBlend.add) {\n                bone.scaleX += x - bone.data.scaleX;\n                bone.scaleY += y - bone.data.scaleY;\n            } else {\n                bone.scaleX = x;\n                bone.scaleY = y;\n            }\n        } else {\n            let bx = 0;\n            let by = 0;\n\n            if (direction == MixDirection.mixOut) {\n                switch (blend) {\n                    case MixBlend.setup:\n                        bx = bone.data.scaleX;\n                        by = bone.data.scaleY;\n                        bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;\n                        bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;\n                        break;\n                    case MixBlend.first:\n                    case MixBlend.replace:\n                        bx = bone.scaleX;\n                        by = bone.scaleY;\n                        bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;\n                        bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;\n                        break;\n                    case MixBlend.add:\n                        bone.scaleX += (x - bone.data.scaleX) * alpha;\n                        bone.scaleY += (y - bone.data.scaleY) * alpha;\n                }\n            } else {\n                switch (blend) {\n                    case MixBlend.setup:\n                        bx = Math.abs(bone.data.scaleX) * MathUtils.signum(x);\n                        by = Math.abs(bone.data.scaleY) * MathUtils.signum(y);\n                        bone.scaleX = bx + (x - bx) * alpha;\n                        bone.scaleY = by + (y - by) * alpha;\n                        break;\n                    case MixBlend.first:\n                    case MixBlend.replace:\n                        bx = Math.abs(bone.scaleX) * MathUtils.signum(x);\n                        by = Math.abs(bone.scaleY) * MathUtils.signum(y);\n                        bone.scaleX = bx + (x - bx) * alpha;\n                        bone.scaleY = by + (y - by) * alpha;\n                        break;\n                    case MixBlend.add:\n                        bone.scaleX += (x - bone.data.scaleX) * alpha;\n                        bone.scaleY += (y - bone.data.scaleY) * alpha;\n                }\n            }\n        }\n    }\n}\n\n/** Changes a bone's local {@link Bone#scaleX)} and {@link Bone#scaleY}.\n * @public\n * */\nexport class ScaleXTimeline extends CurveTimeline1 implements BoneTimeline {\n    boneIndex = 0;\n\n    constructor(frameCount: number, bezierCount: number, boneIndex: number) {\n        super(frameCount, bezierCount, `${Property.scaleX}|${boneIndex}`);\n        this.boneIndex = boneIndex;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const bone = skeleton.bones[this.boneIndex];\n\n        if (!bone.active) return;\n\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    bone.scaleX = bone.data.scaleX;\n\n                    return;\n                case MixBlend.first:\n                    bone.scaleX += (bone.data.scaleX - bone.scaleX) * alpha;\n            }\n\n            return;\n        }\n\n        const x = this.getCurveValue(time) * bone.data.scaleX;\n\n        if (alpha == 1) {\n            if (blend == MixBlend.add) bone.scaleX += x - bone.data.scaleX;\n            else bone.scaleX = x;\n        } else {\n            // Mixing out uses sign of setup or current pose, else use sign of key.\n            let bx = 0;\n\n            if (direction == MixDirection.mixOut) {\n                switch (blend) {\n                    case MixBlend.setup:\n                        bx = bone.data.scaleX;\n                        bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;\n                        break;\n                    case MixBlend.first:\n                    case MixBlend.replace:\n                        bx = bone.scaleX;\n                        bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;\n                        break;\n                    case MixBlend.add:\n                        bone.scaleX += (x - bone.data.scaleX) * alpha;\n                }\n            } else {\n                switch (blend) {\n                    case MixBlend.setup:\n                        bx = Math.abs(bone.data.scaleX) * MathUtils.signum(x);\n                        bone.scaleX = bx + (x - bx) * alpha;\n                        break;\n                    case MixBlend.first:\n                    case MixBlend.replace:\n                        bx = Math.abs(bone.scaleX) * MathUtils.signum(x);\n                        bone.scaleX = bx + (x - bx) * alpha;\n                        break;\n                    case MixBlend.add:\n                        bone.scaleX += (x - bone.data.scaleX) * alpha;\n                }\n            }\n        }\n    }\n}\n\n/** Changes a bone's local {@link Bone#scaleX)} and {@link Bone#scaleY}.\n * @public\n * */\nexport class ScaleYTimeline extends CurveTimeline1 implements BoneTimeline {\n    boneIndex = 0;\n\n    constructor(frameCount: number, bezierCount: number, boneIndex: number) {\n        super(frameCount, bezierCount, `${Property.scaleY}|${boneIndex}`);\n        this.boneIndex = boneIndex;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const bone = skeleton.bones[this.boneIndex];\n\n        if (!bone.active) return;\n\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    bone.scaleY = bone.data.scaleY;\n\n                    return;\n                case MixBlend.first:\n                    bone.scaleY += (bone.data.scaleY - bone.scaleY) * alpha;\n            }\n\n            return;\n        }\n\n        const y = this.getCurveValue(time) * bone.data.scaleY;\n\n        if (alpha == 1) {\n            if (blend == MixBlend.add) bone.scaleY += y - bone.data.scaleY;\n            else bone.scaleY = y;\n        } else {\n            // Mixing out uses sign of setup or current pose, else use sign of key.\n            let by = 0;\n\n            if (direction == MixDirection.mixOut) {\n                switch (blend) {\n                    case MixBlend.setup:\n                        by = bone.data.scaleY;\n                        bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;\n                        break;\n                    case MixBlend.first:\n                    case MixBlend.replace:\n                        by = bone.scaleY;\n                        bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;\n                        break;\n                    case MixBlend.add:\n                        bone.scaleY += (y - bone.data.scaleY) * alpha;\n                }\n            } else {\n                switch (blend) {\n                    case MixBlend.setup:\n                        by = Math.abs(bone.data.scaleY) * MathUtils.signum(y);\n                        bone.scaleY = by + (y - by) * alpha;\n                        break;\n                    case MixBlend.first:\n                    case MixBlend.replace:\n                        by = Math.abs(bone.scaleY) * MathUtils.signum(y);\n                        bone.scaleY = by + (y - by) * alpha;\n                        break;\n                    case MixBlend.add:\n                        bone.scaleY += (y - bone.data.scaleY) * alpha;\n                }\n            }\n        }\n    }\n}\n\n/** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}.\n * @public\n * */\nexport class ShearTimeline extends CurveTimeline2 implements BoneTimeline {\n    boneIndex = 0;\n\n    constructor(frameCount: number, bezierCount: number, boneIndex: number) {\n        super(frameCount, bezierCount, `${Property.shearX}|${boneIndex}`, `${Property.shearY}|${boneIndex}`);\n        this.boneIndex = boneIndex;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const bone = skeleton.bones[this.boneIndex];\n\n        if (!bone.active) return;\n\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    bone.shearX = bone.data.shearX;\n                    bone.shearY = bone.data.shearY;\n\n                    return;\n                case MixBlend.first:\n                    bone.shearX += (bone.data.shearX - bone.shearX) * alpha;\n                    bone.shearY += (bone.data.shearY - bone.shearY) * alpha;\n            }\n\n            return;\n        }\n\n        let x = 0;\n        let y = 0;\n        const i = Timeline.search(frames, time, 3 /* ENTRIES*/);\n        const curveType = this.curves[i / 3 /* ENTRIES*/];\n\n        switch (curveType) {\n            case 0 /* LINEAR*/:\n                const before = frames[i];\n\n                x = frames[i + 1 /* VALUE1*/];\n                y = frames[i + 2 /* VALUE2*/];\n                const t = (time - before) / (frames[i + 3 /* ENTRIES*/] - before);\n\n                x += (frames[i + 3 /* ENTRIES*/ + 1 /* VALUE1*/] - x) * t;\n                y += (frames[i + 3 /* ENTRIES*/ + 2 /* VALUE2*/] - y) * t;\n                break;\n            case 1 /* STEPPED*/:\n                x = frames[i + 1 /* VALUE1*/];\n                y = frames[i + 2 /* VALUE2*/];\n                break;\n            default:\n                x = this.getBezierValue(time, i, 1 /* VALUE1*/, curveType - 2 /* BEZIER*/);\n                y = this.getBezierValue(time, i, 2 /* VALUE2*/, curveType + 18 /* BEZIER_SIZE*/ - 2 /* BEZIER*/);\n        }\n\n        switch (blend) {\n            case MixBlend.setup:\n                bone.shearX = bone.data.shearX + x * alpha;\n                bone.shearY = bone.data.shearY + y * alpha;\n                break;\n            case MixBlend.first:\n            case MixBlend.replace:\n                bone.shearX += (bone.data.shearX + x - bone.shearX) * alpha;\n                bone.shearY += (bone.data.shearY + y - bone.shearY) * alpha;\n                break;\n            case MixBlend.add:\n                bone.shearX += x * alpha;\n                bone.shearY += y * alpha;\n        }\n    }\n}\n\n/** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}.\n * @public\n * */\nexport class ShearXTimeline extends CurveTimeline1 implements BoneTimeline {\n    boneIndex = 0;\n\n    constructor(frameCount: number, bezierCount: number, boneIndex: number) {\n        super(frameCount, bezierCount, `${Property.shearX}|${boneIndex}`);\n        this.boneIndex = boneIndex;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const bone = skeleton.bones[this.boneIndex];\n\n        if (!bone.active) return;\n\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    bone.shearX = bone.data.shearX;\n\n                    return;\n                case MixBlend.first:\n                    bone.shearX += (bone.data.shearX - bone.shearX) * alpha;\n            }\n\n            return;\n        }\n\n        const x = this.getCurveValue(time);\n\n        switch (blend) {\n            case MixBlend.setup:\n                bone.shearX = bone.data.shearX + x * alpha;\n                break;\n            case MixBlend.first:\n            case MixBlend.replace:\n                bone.shearX += (bone.data.shearX + x - bone.shearX) * alpha;\n                break;\n            case MixBlend.add:\n                bone.shearX += x * alpha;\n        }\n    }\n}\n\n/** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}.\n * @public\n * */\nexport class ShearYTimeline extends CurveTimeline1 implements BoneTimeline {\n    boneIndex = 0;\n\n    constructor(frameCount: number, bezierCount: number, boneIndex: number) {\n        super(frameCount, bezierCount, `${Property.shearY}|${boneIndex}`);\n        this.boneIndex = boneIndex;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const bone = skeleton.bones[this.boneIndex];\n\n        if (!bone.active) return;\n\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    bone.shearY = bone.data.shearY;\n\n                    return;\n                case MixBlend.first:\n                    bone.shearY += (bone.data.shearY - bone.shearY) * alpha;\n            }\n\n            return;\n        }\n\n        const y = this.getCurveValue(time);\n\n        switch (blend) {\n            case MixBlend.setup:\n                bone.shearY = bone.data.shearY + y * alpha;\n                break;\n            case MixBlend.first:\n            case MixBlend.replace:\n                bone.shearY += (bone.data.shearY + y - bone.shearY) * alpha;\n                break;\n            case MixBlend.add:\n                bone.shearY += y * alpha;\n        }\n    }\n}\n\n/** Changes a slot's {@link Slot#color}.\n * @public\n * */\nexport class RGBATimeline extends CurveTimeline implements SlotTimeline {\n    slotIndex = 0;\n\n    constructor(frameCount: number, bezierCount: number, slotIndex: number) {\n        super(frameCount, bezierCount, [`${Property.rgb}|${slotIndex}`, `${Property.alpha}|${slotIndex}`]);\n        this.slotIndex = slotIndex;\n    }\n\n    getFrameEntries() {\n        return 5 /* ENTRIES*/;\n    }\n\n    /** Sets the time in seconds, red, green, blue, and alpha for the specified key frame. */\n    setFrame(frame: number, time: number, r: number, g: number, b: number, a: number) {\n        frame *= 5 /* ENTRIES*/;\n        this.frames[frame] = time;\n        this.frames[frame + 1 /* R*/] = r;\n        this.frames[frame + 2 /* G*/] = g;\n        this.frames[frame + 3 /* B*/] = b;\n        this.frames[frame + 4 /* A*/] = a;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const slot = skeleton.slots[this.slotIndex];\n\n        if (!slot.bone.active) return;\n\n        const frames = this.frames;\n        const color = slot.color;\n\n        if (time < frames[0]) {\n            const setup = slot.data.color;\n\n            switch (blend) {\n                case MixBlend.setup:\n                    color.setFromColor(setup);\n\n                    return;\n                case MixBlend.first:\n                    color.add((setup.r - color.r) * alpha, (setup.g - color.g) * alpha, (setup.b - color.b) * alpha, (setup.a - color.a) * alpha);\n            }\n\n            return;\n        }\n\n        let r = 0;\n        let g = 0;\n        let b = 0;\n        let a = 0;\n        const i = Timeline.search(frames, time, 5 /* ENTRIES*/);\n        const curveType = this.curves[i / 5 /* ENTRIES*/];\n\n        switch (curveType) {\n            case 0 /* LINEAR*/:\n                const before = frames[i];\n\n                r = frames[i + 1 /* R*/];\n                g = frames[i + 2 /* G*/];\n                b = frames[i + 3 /* B*/];\n                a = frames[i + 4 /* A*/];\n                const t = (time - before) / (frames[i + 5 /* ENTRIES*/] - before);\n\n                r += (frames[i + 5 /* ENTRIES*/ + 1 /* R*/] - r) * t;\n                g += (frames[i + 5 /* ENTRIES*/ + 2 /* G*/] - g) * t;\n                b += (frames[i + 5 /* ENTRIES*/ + 3 /* B*/] - b) * t;\n                a += (frames[i + 5 /* ENTRIES*/ + 4 /* A*/] - a) * t;\n                break;\n            case 1 /* STEPPED*/:\n                r = frames[i + 1 /* R*/];\n                g = frames[i + 2 /* G*/];\n                b = frames[i + 3 /* B*/];\n                a = frames[i + 4 /* A*/];\n                break;\n            default:\n                r = this.getBezierValue(time, i, 1 /* R*/, curveType - 2 /* BEZIER*/);\n                g = this.getBezierValue(time, i, 2 /* G*/, curveType + 18 /* BEZIER_SIZE*/ - 2 /* BEZIER*/);\n                b = this.getBezierValue(time, i, 3 /* B*/, curveType + 18 /* BEZIER_SIZE*/ * 2 - 2 /* BEZIER*/);\n                a = this.getBezierValue(time, i, 4 /* A*/, curveType + 18 /* BEZIER_SIZE*/ * 3 - 2 /* BEZIER*/);\n        }\n        if (alpha == 1) color.set(r, g, b, a);\n        else {\n            if (blend == MixBlend.setup) color.setFromColor(slot.data.color);\n            color.add((r - color.r) * alpha, (g - color.g) * alpha, (b - color.b) * alpha, (a - color.a) * alpha);\n        }\n    }\n}\n\n/** Changes a slot's {@link Slot#color}.\n * @public\n * */\nexport class RGBTimeline extends CurveTimeline implements SlotTimeline {\n    slotIndex = 0;\n\n    constructor(frameCount: number, bezierCount: number, slotIndex: number) {\n        super(frameCount, bezierCount, [`${Property.rgb}|${slotIndex}`]);\n        this.slotIndex = slotIndex;\n    }\n\n    getFrameEntries() {\n        return 4 /* ENTRIES*/;\n    }\n\n    /** Sets the time in seconds, red, green, blue, and alpha for the specified key frame. */\n    setFrame(frame: number, time: number, r: number, g: number, b: number) {\n        frame <<= 2;\n        this.frames[frame] = time;\n        this.frames[frame + 1 /* R*/] = r;\n        this.frames[frame + 2 /* G*/] = g;\n        this.frames[frame + 3 /* B*/] = b;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const slot = skeleton.slots[this.slotIndex];\n\n        if (!slot.bone.active) return;\n\n        const frames = this.frames;\n        const color = slot.color;\n\n        if (time < frames[0]) {\n            const setup = slot.data.color;\n\n            switch (blend) {\n                case MixBlend.setup:\n                    color.r = setup.r;\n                    color.g = setup.g;\n                    color.b = setup.b;\n\n                    return;\n                case MixBlend.first:\n                    color.r += (setup.r - color.r) * alpha;\n                    color.g += (setup.g - color.g) * alpha;\n                    color.b += (setup.b - color.b) * alpha;\n            }\n\n            return;\n        }\n\n        let r = 0;\n        let g = 0;\n        let b = 0;\n        const i = Timeline.search(frames, time, 4 /* ENTRIES*/);\n        const curveType = this.curves[i >> 2];\n\n        switch (curveType) {\n            case 0 /* LINEAR*/:\n                const before = frames[i];\n\n                r = frames[i + 1 /* R*/];\n                g = frames[i + 2 /* G*/];\n                b = frames[i + 3 /* B*/];\n                const t = (time - before) / (frames[i + 4 /* ENTRIES*/] - before);\n\n                r += (frames[i + 4 /* ENTRIES*/ + 1 /* R*/] - r) * t;\n                g += (frames[i + 4 /* ENTRIES*/ + 2 /* G*/] - g) * t;\n                b += (frames[i + 4 /* ENTRIES*/ + 3 /* B*/] - b) * t;\n                break;\n            case 1 /* STEPPED*/:\n                r = frames[i + 1 /* R*/];\n                g = frames[i + 2 /* G*/];\n                b = frames[i + 3 /* B*/];\n                break;\n            default:\n                r = this.getBezierValue(time, i, 1 /* R*/, curveType - 2 /* BEZIER*/);\n                g = this.getBezierValue(time, i, 2 /* G*/, curveType + 18 /* BEZIER_SIZE*/ - 2 /* BEZIER*/);\n                b = this.getBezierValue(time, i, 3 /* B*/, curveType + 18 /* BEZIER_SIZE*/ * 2 - 2 /* BEZIER*/);\n        }\n        if (alpha == 1) {\n            color.r = r;\n            color.g = g;\n            color.b = b;\n        } else {\n            if (blend == MixBlend.setup) {\n                const setup = slot.data.color;\n\n                color.r = setup.r;\n                color.g = setup.g;\n                color.b = setup.b;\n            }\n            color.r += (r - color.r) * alpha;\n            color.g += (g - color.g) * alpha;\n            color.b += (b - color.b) * alpha;\n        }\n    }\n}\n\n/** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}.\n * @public\n * */\nexport class AlphaTimeline extends CurveTimeline1 implements SlotTimeline {\n    slotIndex = 0;\n\n    constructor(frameCount: number, bezierCount: number, slotIndex: number) {\n        super(frameCount, bezierCount, `${Property.alpha}|${slotIndex}`);\n        this.slotIndex = slotIndex;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const slot = skeleton.slots[this.slotIndex];\n\n        if (!slot.bone.active) return;\n\n        const color = slot.color;\n\n        if (time < this.frames[0]) {\n            // Time is before first frame.\n            const setup = slot.data.color;\n\n            switch (blend) {\n                case MixBlend.setup:\n                    color.a = setup.a;\n\n                    return;\n                case MixBlend.first:\n                    color.a += (setup.a - color.a) * alpha;\n            }\n\n            return;\n        }\n\n        const a = this.getCurveValue(time);\n\n        if (alpha == 1) color.a = a;\n        else {\n            if (blend == MixBlend.setup) color.a = slot.data.color.a;\n            color.a += (a - color.a) * alpha;\n        }\n    }\n}\n\n/** Changes a slot's {@link Slot#color} and {@link Slot#darkColor} for two color tinting.\n * @public\n * */\nexport class RGBA2Timeline extends CurveTimeline implements SlotTimeline {\n    slotIndex = 0;\n\n    constructor(frameCount: number, bezierCount: number, slotIndex: number) {\n        super(frameCount, bezierCount, [`${Property.rgb}|${slotIndex}`, `${Property.alpha}|${slotIndex}`, `${Property.rgb2}|${slotIndex}`]);\n        this.slotIndex = slotIndex;\n    }\n\n    getFrameEntries() {\n        return 8 /* ENTRIES*/;\n    }\n\n    /** Sets the time in seconds, light, and dark colors for the specified key frame. */\n    setFrame(frame: number, time: number, r: number, g: number, b: number, a: number, r2: number, g2: number, b2: number) {\n        frame <<= 3;\n        this.frames[frame] = time;\n        this.frames[frame + 1 /* R*/] = r;\n        this.frames[frame + 2 /* G*/] = g;\n        this.frames[frame + 3 /* B*/] = b;\n        this.frames[frame + 4 /* A*/] = a;\n        this.frames[frame + 5 /* R2*/] = r2;\n        this.frames[frame + 6 /* G2*/] = g2;\n        this.frames[frame + 7 /* B2*/] = b2;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const slot = skeleton.slots[this.slotIndex];\n\n        if (!slot.bone.active) return;\n\n        const frames = this.frames;\n        const light = slot.color;\n        const dark = slot.darkColor;\n\n        if (time < frames[0]) {\n            const setupLight = slot.data.color;\n            const setupDark = slot.data.darkColor;\n\n            switch (blend) {\n                case MixBlend.setup:\n                    light.setFromColor(setupLight);\n                    dark.r = setupDark.r;\n                    dark.g = setupDark.g;\n                    dark.b = setupDark.b;\n\n                    return;\n                case MixBlend.first:\n                    light.add((setupLight.r - light.r) * alpha, (setupLight.g - light.g) * alpha, (setupLight.b - light.b) * alpha, (setupLight.a - light.a) * alpha);\n                    dark.r += (setupDark.r - dark.r) * alpha;\n                    dark.g += (setupDark.g - dark.g) * alpha;\n                    dark.b += (setupDark.b - dark.b) * alpha;\n            }\n\n            return;\n        }\n\n        let r = 0;\n        let g = 0;\n        let b = 0;\n        let a = 0;\n        let r2 = 0;\n        let g2 = 0;\n        let b2 = 0;\n        const i = Timeline.search(frames, time, 8 /* ENTRIES*/);\n        const curveType = this.curves[i >> 3];\n\n        switch (curveType) {\n            case 0 /* LINEAR*/:\n                const before = frames[i];\n\n                r = frames[i + 1 /* R*/];\n                g = frames[i + 2 /* G*/];\n                b = frames[i + 3 /* B*/];\n                a = frames[i + 4 /* A*/];\n                r2 = frames[i + 5 /* R2*/];\n                g2 = frames[i + 6 /* G2*/];\n                b2 = frames[i + 7 /* B2*/];\n                const t = (time - before) / (frames[i + 8 /* ENTRIES*/] - before);\n\n                r += (frames[i + 8 /* ENTRIES*/ + 1 /* R*/] - r) * t;\n                g += (frames[i + 8 /* ENTRIES*/ + 2 /* G*/] - g) * t;\n                b += (frames[i + 8 /* ENTRIES*/ + 3 /* B*/] - b) * t;\n                a += (frames[i + 8 /* ENTRIES*/ + 4 /* A*/] - a) * t;\n                r2 += (frames[i + 8 /* ENTRIES*/ + 5 /* R2*/] - r2) * t;\n                g2 += (frames[i + 8 /* ENTRIES*/ + 6 /* G2*/] - g2) * t;\n                b2 += (frames[i + 8 /* ENTRIES*/ + 7 /* B2*/] - b2) * t;\n                break;\n            case 1 /* STEPPED*/:\n                r = frames[i + 1 /* R*/];\n                g = frames[i + 2 /* G*/];\n                b = frames[i + 3 /* B*/];\n                a = frames[i + 4 /* A*/];\n                r2 = frames[i + 5 /* R2*/];\n                g2 = frames[i + 6 /* G2*/];\n                b2 = frames[i + 7 /* B2*/];\n                break;\n            default:\n                r = this.getBezierValue(time, i, 1 /* R*/, curveType - 2 /* BEZIER*/);\n                g = this.getBezierValue(time, i, 2 /* G*/, curveType + 18 /* BEZIER_SIZE*/ - 2 /* BEZIER*/);\n                b = this.getBezierValue(time, i, 3 /* B*/, curveType + 18 /* BEZIER_SIZE*/ * 2 - 2 /* BEZIER*/);\n                a = this.getBezierValue(time, i, 4 /* A*/, curveType + 18 /* BEZIER_SIZE*/ * 3 - 2 /* BEZIER*/);\n                r2 = this.getBezierValue(time, i, 5 /* R2*/, curveType + 18 /* BEZIER_SIZE*/ * 4 - 2 /* BEZIER*/);\n                g2 = this.getBezierValue(time, i, 6 /* G2*/, curveType + 18 /* BEZIER_SIZE*/ * 5 - 2 /* BEZIER*/);\n                b2 = this.getBezierValue(time, i, 7 /* B2*/, curveType + 18 /* BEZIER_SIZE*/ * 6 - 2 /* BEZIER*/);\n        }\n\n        if (alpha == 1) {\n            light.set(r, g, b, a);\n            dark.r = r2;\n            dark.g = g2;\n            dark.b = b2;\n        } else {\n            if (blend == MixBlend.setup) {\n                light.setFromColor(slot.data.color);\n                const setupDark = slot.data.darkColor;\n\n                dark.r = setupDark.r;\n                dark.g = setupDark.g;\n                dark.b = setupDark.b;\n            }\n            light.add((r - light.r) * alpha, (g - light.g) * alpha, (b - light.b) * alpha, (a - light.a) * alpha);\n            dark.r += (r2 - dark.r) * alpha;\n            dark.g += (g2 - dark.g) * alpha;\n            dark.b += (b2 - dark.b) * alpha;\n        }\n    }\n}\n\n/** Changes a slot's {@link Slot#color} and {@link Slot#darkColor} for two color tinting.\n * @public\n * */\nexport class RGB2Timeline extends CurveTimeline implements SlotTimeline {\n    slotIndex = 0;\n\n    constructor(frameCount: number, bezierCount: number, slotIndex: number) {\n        super(frameCount, bezierCount, [`${Property.rgb}|${slotIndex}`, `${Property.rgb2}|${slotIndex}`]);\n        this.slotIndex = slotIndex;\n    }\n\n    getFrameEntries() {\n        return 7 /* ENTRIES*/;\n    }\n\n    /** Sets the time in seconds, light, and dark colors for the specified key frame. */\n    setFrame(frame: number, time: number, r: number, g: number, b: number, r2: number, g2: number, b2: number) {\n        frame *= 7 /* ENTRIES*/;\n        this.frames[frame] = time;\n        this.frames[frame + 1 /* R*/] = r;\n        this.frames[frame + 2 /* G*/] = g;\n        this.frames[frame + 3 /* B*/] = b;\n        this.frames[frame + 4 /* R2*/] = r2;\n        this.frames[frame + 5 /* G2*/] = g2;\n        this.frames[frame + 6 /* B2*/] = b2;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const slot = skeleton.slots[this.slotIndex];\n\n        if (!slot.bone.active) return;\n\n        const frames = this.frames;\n        const light = slot.color;\n        const dark = slot.darkColor;\n\n        if (time < frames[0]) {\n            const setupLight = slot.data.color;\n            const setupDark = slot.data.darkColor;\n\n            switch (blend) {\n                case MixBlend.setup:\n                    light.r = setupLight.r;\n                    light.g = setupLight.g;\n                    light.b = setupLight.b;\n                    dark.r = setupDark.r;\n                    dark.g = setupDark.g;\n                    dark.b = setupDark.b;\n\n                    return;\n                case MixBlend.first:\n                    light.r += (setupLight.r - light.r) * alpha;\n                    light.g += (setupLight.g - light.g) * alpha;\n                    light.b += (setupLight.b - light.b) * alpha;\n                    dark.r += (setupDark.r - dark.r) * alpha;\n                    dark.g += (setupDark.g - dark.g) * alpha;\n                    dark.b += (setupDark.b - dark.b) * alpha;\n            }\n\n            return;\n        }\n\n        let r = 0;\n        let g = 0;\n        let b = 0;\n        let r2 = 0;\n        let g2 = 0;\n        let b2 = 0;\n        const i = Timeline.search(frames, time, 7 /* ENTRIES*/);\n        const curveType = this.curves[i / 7 /* ENTRIES*/];\n\n        switch (curveType) {\n            case 0 /* LINEAR*/:\n                const before = frames[i];\n\n                r = frames[i + 1 /* R*/];\n                g = frames[i + 2 /* G*/];\n                b = frames[i + 3 /* B*/];\n                r2 = frames[i + 4 /* R2*/];\n                g2 = frames[i + 5 /* G2*/];\n                b2 = frames[i + 6 /* B2*/];\n                const t = (time - before) / (frames[i + 7 /* ENTRIES*/] - before);\n\n                r += (frames[i + 7 /* ENTRIES*/ + 1 /* R*/] - r) * t;\n                g += (frames[i + 7 /* ENTRIES*/ + 2 /* G*/] - g) * t;\n                b += (frames[i + 7 /* ENTRIES*/ + 3 /* B*/] - b) * t;\n                r2 += (frames[i + 7 /* ENTRIES*/ + 4 /* R2*/] - r2) * t;\n                g2 += (frames[i + 7 /* ENTRIES*/ + 5 /* G2*/] - g2) * t;\n                b2 += (frames[i + 7 /* ENTRIES*/ + 6 /* B2*/] - b2) * t;\n                break;\n            case 1 /* STEPPED*/:\n                r = frames[i + 1 /* R*/];\n                g = frames[i + 2 /* G*/];\n                b = frames[i + 3 /* B*/];\n                r2 = frames[i + 4 /* R2*/];\n                g2 = frames[i + 5 /* G2*/];\n                b2 = frames[i + 6 /* B2*/];\n                break;\n            default:\n                r = this.getBezierValue(time, i, 1 /* R*/, curveType - 2 /* BEZIER*/);\n                g = this.getBezierValue(time, i, 2 /* G*/, curveType + 18 /* BEZIER_SIZE*/ - 2 /* BEZIER*/);\n                b = this.getBezierValue(time, i, 3 /* B*/, curveType + 18 /* BEZIER_SIZE*/ * 2 - 2 /* BEZIER*/);\n                r2 = this.getBezierValue(time, i, 4 /* R2*/, curveType + 18 /* BEZIER_SIZE*/ * 3 - 2 /* BEZIER*/);\n                g2 = this.getBezierValue(time, i, 5 /* G2*/, curveType + 18 /* BEZIER_SIZE*/ * 4 - 2 /* BEZIER*/);\n                b2 = this.getBezierValue(time, i, 6 /* B2*/, curveType + 18 /* BEZIER_SIZE*/ * 5 - 2 /* BEZIER*/);\n        }\n\n        if (alpha == 1) {\n            light.r = r;\n            light.g = g;\n            light.b = b;\n            dark.r = r2;\n            dark.g = g2;\n            dark.b = b2;\n        } else {\n            if (blend == MixBlend.setup) {\n                const setupLight = slot.data.color;\n                const setupDark = slot.data.darkColor;\n\n                light.r = setupLight.r;\n                light.g = setupLight.g;\n                light.b = setupLight.b;\n                dark.r = setupDark.r;\n                dark.g = setupDark.g;\n                dark.b = setupDark.b;\n            }\n            light.r += (r - light.r) * alpha;\n            light.g += (g - light.g) * alpha;\n            light.b += (b - light.b) * alpha;\n            dark.r += (r2 - dark.r) * alpha;\n            dark.g += (g2 - dark.g) * alpha;\n            dark.b += (b2 - dark.b) * alpha;\n        }\n    }\n}\n\n/** Changes a slot's {@link Slot#attachment}.\n * @public\n * */\nexport class AttachmentTimeline extends Timeline implements SlotTimeline {\n    slotIndex = 0;\n\n    /** The attachment name for each key frame. May contain null values to clear the attachment. */\n    attachmentNames: Array<string | null>;\n\n    constructor(frameCount: number, slotIndex: number) {\n        super(frameCount, [`${Property.attachment}|${slotIndex}`]);\n        this.slotIndex = slotIndex;\n        this.attachmentNames = new Array<string>(frameCount);\n    }\n\n    getFrameCount() {\n        return this.frames.length;\n    }\n\n    /** Sets the time in seconds and the attachment name for the specified key frame. */\n    setFrame(frame: number, time: number, attachmentName: string | null) {\n        this.frames[frame] = time;\n        this.attachmentNames[frame] = attachmentName;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const slot = skeleton.slots[this.slotIndex];\n\n        if (!slot.bone.active) return;\n\n        if (direction == MixDirection.mixOut) {\n            if (blend == MixBlend.setup) this.setAttachment(skeleton, slot, slot.data.attachmentName);\n\n            return;\n        }\n\n        if (time < this.frames[0]) {\n            if (blend == MixBlend.setup || blend == MixBlend.first) this.setAttachment(skeleton, slot, slot.data.attachmentName);\n\n            return;\n        }\n\n        this.setAttachment(skeleton, slot, this.attachmentNames[Timeline.search1(this.frames, time)]);\n    }\n\n    setAttachment(skeleton: Skeleton, slot: Slot, attachmentName: string | null) {\n        slot.setAttachment(!attachmentName ? null : skeleton.getAttachment(this.slotIndex, attachmentName));\n    }\n}\n\n/** Changes a slot's {@link Slot#deform} to deform a {@link VertexAttachment}.\n * @public\n * */\nexport class DeformTimeline extends CurveTimeline implements SlotTimeline {\n    slotIndex = 0;\n\n    /** The attachment that will be deformed. */\n    attachment: VertexAttachment;\n\n    /** The vertices for each key frame. */\n    vertices: Array<NumberArrayLike>;\n\n    constructor(frameCount: number, bezierCount: number, slotIndex: number, attachment: VertexAttachment) {\n        super(frameCount, bezierCount, [`${Property.deform}|${slotIndex}|${attachment.id}`]);\n        this.slotIndex = slotIndex;\n        this.attachment = attachment;\n        this.vertices = new Array<NumberArrayLike>(frameCount);\n    }\n\n    getFrameCount() {\n        return this.frames.length;\n    }\n\n    /** Sets the time in seconds and the vertices for the specified key frame.\n     * @param vertices Vertex positions for an unweighted VertexAttachment, or deform offsets if it has weights. */\n    setFrame(frame: number, time: number, vertices: NumberArrayLike) {\n        this.frames[frame] = time;\n        this.vertices[frame] = vertices;\n    }\n\n    /** @param value1 Ignored (0 is used for a deform timeline).\n     * @param value2 Ignored (1 is used for a deform timeline). */\n    setBezier(bezier: number, frame: number, value: number, time1: number, value1: number, cx1: number, cy1: number, cx2: number, cy2: number, time2: number, value2: number) {\n        const curves = this.curves;\n        let i = this.getFrameCount() + bezier * 18; /* BEZIER_SIZE*/\n\n        if (value == 0) curves[frame] = 2 /* BEZIER*/ + i;\n        const tmpx = (time1 - cx1 * 2 + cx2) * 0.03;\n        const tmpy = cy2 * 0.03 - cy1 * 0.06;\n        const dddx = ((cx1 - cx2) * 3 - time1 + time2) * 0.006;\n        const dddy = (cy1 - cy2 + 0.33333333) * 0.018;\n        let ddx = tmpx * 2 + dddx;\n        let ddy = tmpy * 2 + dddy;\n        let dx = (cx1 - time1) * 0.3 + tmpx + dddx * 0.16666667;\n        let dy = cy1 * 0.3 + tmpy + dddy * 0.16666667;\n        let x = time1 + dx;\n        let y = dy;\n\n        for (let n = i + 18 /* BEZIER_SIZE*/; i < n; i += 2) {\n            curves[i] = x;\n            curves[i + 1] = y;\n            dx += ddx;\n            dy += ddy;\n            ddx += dddx;\n            ddy += dddy;\n            x += dx;\n            y += dy;\n        }\n    }\n\n    getCurvePercent(time: number, frame: number) {\n        const curves = this.curves;\n        let i = curves[frame];\n\n        switch (i) {\n            case 0 /* LINEAR*/:\n                const x = this.frames[frame];\n\n                return (time - x) / (this.frames[frame + this.getFrameEntries()] - x);\n            case 1 /* STEPPED*/:\n                return 0;\n        }\n        i -= 2 /* BEZIER*/;\n        if (curves[i] > time) {\n            const x = this.frames[frame];\n\n            return (curves[i + 1] * (time - x)) / (curves[i] - x);\n        }\n        const n = i + 18; /* BEZIER_SIZE*/\n\n        for (i += 2; i < n; i += 2) {\n            if (curves[i] >= time) {\n                const x = curves[i - 2];\n                const y = curves[i - 1];\n\n                return y + ((time - x) / (curves[i] - x)) * (curves[i + 1] - y);\n            }\n        }\n        const x = curves[n - 2];\n        const y = curves[n - 1];\n\n        return y + ((1 - y) * (time - x)) / (this.frames[frame + this.getFrameEntries()] - x);\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const slot: Slot = skeleton.slots[this.slotIndex];\n\n        if (!slot.bone.active) return;\n        const slotAttachment: Attachment | null = slot.getAttachment();\n\n        if (!slotAttachment) return;\n        if (!(slotAttachment instanceof VertexAttachment) || (<VertexAttachment>slotAttachment).timelineAttachment != this.attachment) return;\n\n        const deform: Array<number> = slot.deform;\n\n        if (deform.length == 0) blend = MixBlend.setup;\n\n        const vertices = this.vertices;\n        const vertexCount = vertices[0].length;\n\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    deform.length = 0;\n\n                    return;\n                case MixBlend.first:\n                    if (alpha == 1) {\n                        deform.length = 0;\n\n                        return;\n                    }\n                    deform.length = vertexCount;\n                    const vertexAttachment = <VertexAttachment>slotAttachment;\n\n                    if (!vertexAttachment.bones) {\n                        // Unweighted vertex positions.\n                        const setupVertices = vertexAttachment.vertices;\n\n                        for (let i = 0; i < vertexCount; i++) deform[i] += (setupVertices[i] - deform[i]) * alpha;\n                    } else {\n                        // Weighted deform offsets.\n                        alpha = 1 - alpha;\n                        for (let i = 0; i < vertexCount; i++) deform[i] *= alpha;\n                    }\n            }\n\n            return;\n        }\n\n        deform.length = vertexCount;\n        if (time >= frames[frames.length - 1]) {\n            // Time is after last frame.\n            const lastVertices = vertices[frames.length - 1];\n\n            if (alpha == 1) {\n                if (blend == MixBlend.add) {\n                    const vertexAttachment = slotAttachment as VertexAttachment;\n\n                    if (!vertexAttachment.bones) {\n                        // Unweighted vertex positions, with alpha.\n                        const setupVertices = vertexAttachment.vertices;\n\n                        for (let i = 0; i < vertexCount; i++) deform[i] += lastVertices[i] - setupVertices[i];\n                    } else {\n                        // Weighted deform offsets, with alpha.\n                        for (let i = 0; i < vertexCount; i++) deform[i] += lastVertices[i];\n                    }\n                } else Utils.arrayCopy(lastVertices, 0, deform, 0, vertexCount);\n            } else {\n                switch (blend) {\n                    case MixBlend.setup: {\n                        const vertexAttachment = slotAttachment as VertexAttachment;\n\n                        if (!vertexAttachment.bones) {\n                            // Unweighted vertex positions, with alpha.\n                            const setupVertices = vertexAttachment.vertices;\n\n                            for (let i = 0; i < vertexCount; i++) {\n                                const setup = setupVertices[i];\n\n                                deform[i] = setup + (lastVertices[i] - setup) * alpha;\n                            }\n                        } else {\n                            // Weighted deform offsets, with alpha.\n                            for (let i = 0; i < vertexCount; i++) deform[i] = lastVertices[i] * alpha;\n                        }\n                        break;\n                    }\n                    case MixBlend.first:\n                    case MixBlend.replace:\n                        for (let i = 0; i < vertexCount; i++) deform[i] += (lastVertices[i] - deform[i]) * alpha;\n                        break;\n                    case MixBlend.add:\n                        const vertexAttachment = slotAttachment as VertexAttachment;\n\n                        if (!vertexAttachment.bones) {\n                            // Unweighted vertex positions, with alpha.\n                            const setupVertices = vertexAttachment.vertices;\n\n                            for (let i = 0; i < vertexCount; i++) deform[i] += (lastVertices[i] - setupVertices[i]) * alpha;\n                        } else {\n                            // Weighted deform offsets, with alpha.\n                            for (let i = 0; i < vertexCount; i++) deform[i] += lastVertices[i] * alpha;\n                        }\n                }\n            }\n\n            return;\n        }\n\n        // Interpolate between the previous frame and the current frame.\n        const frame = Timeline.search1(frames, time);\n        const percent = this.getCurvePercent(time, frame);\n        const prevVertices = vertices[frame];\n        const nextVertices = vertices[frame + 1];\n\n        if (alpha == 1) {\n            if (blend == MixBlend.add) {\n                const vertexAttachment = slotAttachment as VertexAttachment;\n\n                if (!vertexAttachment.bones) {\n                    // Unweighted vertex positions, with alpha.\n                    const setupVertices = vertexAttachment.vertices;\n\n                    for (let i = 0; i < vertexCount; i++) {\n                        const prev = prevVertices[i];\n\n                        deform[i] += prev + (nextVertices[i] - prev) * percent - setupVertices[i];\n                    }\n                } else {\n                    // Weighted deform offsets, with alpha.\n                    for (let i = 0; i < vertexCount; i++) {\n                        const prev = prevVertices[i];\n\n                        deform[i] += prev + (nextVertices[i] - prev) * percent;\n                    }\n                }\n            } else {\n                for (let i = 0; i < vertexCount; i++) {\n                    const prev = prevVertices[i];\n\n                    deform[i] = prev + (nextVertices[i] - prev) * percent;\n                }\n            }\n        } else {\n            switch (blend) {\n                case MixBlend.setup: {\n                    const vertexAttachment = slotAttachment as VertexAttachment;\n\n                    if (!vertexAttachment.bones) {\n                        // Unweighted vertex positions, with alpha.\n                        const setupVertices = vertexAttachment.vertices;\n\n                        for (let i = 0; i < vertexCount; i++) {\n                            const prev = prevVertices[i];\n                            const setup = setupVertices[i];\n\n                            deform[i] = setup + (prev + (nextVertices[i] - prev) * percent - setup) * alpha;\n                        }\n                    } else {\n                        // Weighted deform offsets, with alpha.\n                        for (let i = 0; i < vertexCount; i++) {\n                            const prev = prevVertices[i];\n\n                            deform[i] = (prev + (nextVertices[i] - prev) * percent) * alpha;\n                        }\n                    }\n                    break;\n                }\n                case MixBlend.first:\n                case MixBlend.replace:\n                    for (let i = 0; i < vertexCount; i++) {\n                        const prev = prevVertices[i];\n\n                        deform[i] += (prev + (nextVertices[i] - prev) * percent - deform[i]) * alpha;\n                    }\n                    break;\n                case MixBlend.add:\n                    const vertexAttachment = slotAttachment as VertexAttachment;\n\n                    if (!vertexAttachment.bones) {\n                        // Unweighted vertex positions, with alpha.\n                        const setupVertices = vertexAttachment.vertices;\n\n                        for (let i = 0; i < vertexCount; i++) {\n                            const prev = prevVertices[i];\n\n                            deform[i] += (prev + (nextVertices[i] - prev) * percent - setupVertices[i]) * alpha;\n                        }\n                    } else {\n                        // Weighted deform offsets, with alpha.\n                        for (let i = 0; i < vertexCount; i++) {\n                            const prev = prevVertices[i];\n\n                            deform[i] += (prev + (nextVertices[i] - prev) * percent) * alpha;\n                        }\n                    }\n            }\n        }\n    }\n}\n\n/** Fires an {@link Event} when specific animation times are reached.\n * @public\n * */\nexport class EventTimeline extends Timeline {\n    static propertyIds = [`${Property.event}`];\n\n    /** The event for each key frame. */\n    events: Array<Event>;\n\n    constructor(frameCount: number) {\n        super(frameCount, EventTimeline.propertyIds);\n\n        this.events = new Array<Event>(frameCount);\n    }\n\n    getFrameCount() {\n        return this.frames.length;\n    }\n\n    /** Sets the time in seconds and the event for the specified key frame. */\n    setFrame(frame: number, event: Event) {\n        this.frames[frame] = event.time;\n        this.events[frame] = event;\n    }\n\n    /** Fires events for frames > `lastTime` and <= `time`. */\n    apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        if (!firedEvents) return;\n\n        const frames = this.frames;\n        const frameCount = this.frames.length;\n\n        if (lastTime > time) {\n            // Fire events after last time for looped animations.\n            this.apply(skeleton, lastTime, Number.MAX_VALUE, firedEvents, alpha, blend, direction);\n            lastTime = -1;\n        } else if (lastTime >= frames[frameCount - 1])\n            // Last time is after last frame.\n            return;\n        if (time < frames[0]) return; // Time is before first frame.\n\n        let i = 0;\n\n        if (lastTime < frames[0]) i = 0;\n        else {\n            i = Timeline.search1(frames, lastTime) + 1;\n            const frameTime = frames[i];\n\n            while (i > 0) {\n                // Fire multiple events with the same frame.\n                if (frames[i - 1] != frameTime) break;\n                i--;\n            }\n        }\n        for (; i < frameCount && time >= frames[i]; i++) firedEvents.push(this.events[i]);\n    }\n}\n\n/** Changes a skeleton's {@link Skeleton#drawOrder}.\n * @public\n * */\nexport class DrawOrderTimeline extends Timeline {\n    static propertyIds = [`${Property.drawOrder}`];\n\n    /** The draw order for each key frame. See {@link #setFrame(int, float, int[])}. */\n    drawOrders: Array<Array<number> | null>;\n\n    constructor(frameCount: number) {\n        super(frameCount, DrawOrderTimeline.propertyIds);\n        this.drawOrders = new Array<Array<number> | null>(frameCount);\n    }\n\n    getFrameCount() {\n        return this.frames.length;\n    }\n\n    /** Sets the time in seconds and the draw order for the specified key frame.\n     * @param drawOrder For each slot in {@link Skeleton#slots}, the index of the new draw order. May be null to use setup pose\n     *           draw order. */\n    setFrame(frame: number, time: number, drawOrder: Array<number> | null) {\n        this.frames[frame] = time;\n        this.drawOrders[frame] = drawOrder;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        if (direction == MixDirection.mixOut) {\n            if (blend == MixBlend.setup) Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);\n\n            return;\n        }\n\n        if (time < this.frames[0]) {\n            if (blend == MixBlend.setup || blend == MixBlend.first) Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);\n\n            return;\n        }\n\n        const idx = Timeline.search1(this.frames, time);\n        const drawOrderToSetupIndex = this.drawOrders[idx];\n\n        if (!drawOrderToSetupIndex) Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);\n        else {\n            const drawOrder: Array<Slot> = skeleton.drawOrder;\n            const slots: Array<Slot> = skeleton.slots;\n\n            for (let i = 0, n = drawOrderToSetupIndex.length; i < n; i++) drawOrder[i] = slots[drawOrderToSetupIndex[i]];\n        }\n    }\n}\n\n/** Changes an IK constraint's {@link IkConstraint#mix}, {@link IkConstraint#softness},\n * {@link IkConstraint#bendDirection}, {@link IkConstraint#stretch}, and {@link IkConstraint#compress}.\n * @public\n * */\nexport class IkConstraintTimeline extends CurveTimeline {\n    /** The index of the IK constraint slot in {@link Skeleton#ikConstraints} that will be changed. */\n    ikConstraintIndex = 0;\n\n    constructor(frameCount: number, bezierCount: number, ikConstraintIndex: number) {\n        super(frameCount, bezierCount, [`${Property.ikConstraint}|${ikConstraintIndex}`]);\n        this.ikConstraintIndex = ikConstraintIndex;\n    }\n\n    getFrameEntries() {\n        return 6 /* ENTRIES*/;\n    }\n\n    /** Sets the time in seconds, mix, softness, bend direction, compress, and stretch for the specified key frame. */\n    setFrame(frame: number, time: number, mix: number, softness: number, bendDirection: number, compress: boolean, stretch: boolean) {\n        frame *= 6 /* ENTRIES*/;\n        this.frames[frame] = time;\n        this.frames[frame + 1 /* MIX*/] = mix;\n        this.frames[frame + 2 /* SOFTNESS*/] = softness;\n        this.frames[frame + 3 /* BEND_DIRECTION*/] = bendDirection;\n        this.frames[frame + 4 /* COMPRESS*/] = compress ? 1 : 0;\n        this.frames[frame + 5 /* STRETCH*/] = stretch ? 1 : 0;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const constraint: IkConstraint = skeleton.ikConstraints[this.ikConstraintIndex];\n\n        if (!constraint.active) return;\n\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    constraint.mix = constraint.data.mix;\n                    constraint.softness = constraint.data.softness;\n                    constraint.bendDirection = constraint.data.bendDirection;\n                    constraint.compress = constraint.data.compress;\n                    constraint.stretch = constraint.data.stretch;\n\n                    return;\n                case MixBlend.first:\n                    constraint.mix += (constraint.data.mix - constraint.mix) * alpha;\n                    constraint.softness += (constraint.data.softness - constraint.softness) * alpha;\n                    constraint.bendDirection = constraint.data.bendDirection;\n                    constraint.compress = constraint.data.compress;\n                    constraint.stretch = constraint.data.stretch;\n            }\n\n            return;\n        }\n\n        let mix = 0;\n        let softness = 0;\n        const i = Timeline.search(frames, time, 6 /* ENTRIES*/);\n        const curveType = this.curves[i / 6 /* ENTRIES*/];\n\n        switch (curveType) {\n            case 0 /* LINEAR*/:\n                const before = frames[i];\n\n                mix = frames[i + 1 /* MIX*/];\n                softness = frames[i + 2 /* SOFTNESS*/];\n                const t = (time - before) / (frames[i + 6 /* ENTRIES*/] - before);\n\n                mix += (frames[i + 6 /* ENTRIES*/ + 1 /* MIX*/] - mix) * t;\n                softness += (frames[i + 6 /* ENTRIES*/ + 2 /* SOFTNESS*/] - softness) * t;\n                break;\n            case 1 /* STEPPED*/:\n                mix = frames[i + 1 /* MIX*/];\n                softness = frames[i + 2 /* SOFTNESS*/];\n                break;\n            default:\n                mix = this.getBezierValue(time, i, 1 /* MIX*/, curveType - 2 /* BEZIER*/);\n                softness = this.getBezierValue(time, i, 2 /* SOFTNESS*/, curveType + 18 /* BEZIER_SIZE*/ - 2 /* BEZIER*/);\n        }\n\n        if (blend == MixBlend.setup) {\n            constraint.mix = constraint.data.mix + (mix - constraint.data.mix) * alpha;\n            constraint.softness = constraint.data.softness + (softness - constraint.data.softness) * alpha;\n\n            if (direction == MixDirection.mixOut) {\n                constraint.bendDirection = constraint.data.bendDirection;\n                constraint.compress = constraint.data.compress;\n                constraint.stretch = constraint.data.stretch;\n            } else {\n                constraint.bendDirection = frames[i + 3 /* BEND_DIRECTION*/];\n                constraint.compress = frames[i + 4 /* COMPRESS*/] != 0;\n                constraint.stretch = frames[i + 5 /* STRETCH*/] != 0;\n            }\n        } else {\n            constraint.mix += (mix - constraint.mix) * alpha;\n            constraint.softness += (softness - constraint.softness) * alpha;\n            if (direction == MixDirection.mixIn) {\n                constraint.bendDirection = frames[i + 3 /* BEND_DIRECTION*/];\n                constraint.compress = frames[i + 4 /* COMPRESS*/] != 0;\n                constraint.stretch = frames[i + 5 /* STRETCH*/] != 0;\n            }\n        }\n    }\n}\n\n/** Changes a transform constraint's {@link TransformConstraint#rotateMix}, {@link TransformConstraint#translateMix},\n * {@link TransformConstraint#scaleMix}, and {@link TransformConstraint#shearMix}.\n * @public\n * */\nexport class TransformConstraintTimeline extends CurveTimeline {\n    /** The index of the transform constraint slot in {@link Skeleton#transformConstraints} that will be changed. */\n    transformConstraintIndex = 0;\n\n    constructor(frameCount: number, bezierCount: number, transformConstraintIndex: number) {\n        super(frameCount, bezierCount, [`${Property.transformConstraint}|${transformConstraintIndex}`]);\n        this.transformConstraintIndex = transformConstraintIndex;\n    }\n\n    getFrameEntries() {\n        return 7 /* ENTRIES*/;\n    }\n\n    /** The time in seconds, rotate mix, translate mix, scale mix, and shear mix for the specified key frame. */\n    setFrame(frame: number, time: number, mixRotate: number, mixX: number, mixY: number, mixScaleX: number, mixScaleY: number, mixShearY: number) {\n        const frames = this.frames;\n\n        frame *= 7 /* ENTRIES*/;\n        frames[frame] = time;\n        frames[frame + 1 /* ROTATE*/] = mixRotate;\n        frames[frame + 2 /* X*/] = mixX;\n        frames[frame + 3 /* Y*/] = mixY;\n        frames[frame + 4 /* SCALEX*/] = mixScaleX;\n        frames[frame + 5 /* SCALEY*/] = mixScaleY;\n        frames[frame + 6 /* SHEARY*/] = mixShearY;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const constraint: TransformConstraint = skeleton.transformConstraints[this.transformConstraintIndex];\n\n        if (!constraint.active) return;\n\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            const data = constraint.data;\n\n            switch (blend) {\n                case MixBlend.setup:\n                    constraint.mixRotate = data.mixRotate;\n                    constraint.mixX = data.mixX;\n                    constraint.mixY = data.mixY;\n                    constraint.mixScaleX = data.mixScaleX;\n                    constraint.mixScaleY = data.mixScaleY;\n                    constraint.mixShearY = data.mixShearY;\n\n                    return;\n                case MixBlend.first:\n                    constraint.mixRotate += (data.mixRotate - constraint.mixRotate) * alpha;\n                    constraint.mixX += (data.mixX - constraint.mixX) * alpha;\n                    constraint.mixY += (data.mixY - constraint.mixY) * alpha;\n                    constraint.mixScaleX += (data.mixScaleX - constraint.mixScaleX) * alpha;\n                    constraint.mixScaleY += (data.mixScaleY - constraint.mixScaleY) * alpha;\n                    constraint.mixShearY += (data.mixShearY - constraint.mixShearY) * alpha;\n            }\n\n            return;\n        }\n\n        let rotate;\n        let x;\n        let y;\n        let scaleX;\n        let scaleY;\n        let shearY;\n        const i = Timeline.search(frames, time, 7 /* ENTRIES*/);\n        const curveType = this.curves[i / 7 /* ENTRIES*/];\n\n        switch (curveType) {\n            case 0 /* LINEAR*/:\n                const before = frames[i];\n\n                rotate = frames[i + 1 /* ROTATE*/];\n                x = frames[i + 2 /* X*/];\n                y = frames[i + 3 /* Y*/];\n                scaleX = frames[i + 4 /* SCALEX*/];\n                scaleY = frames[i + 5 /* SCALEY*/];\n                shearY = frames[i + 6 /* SHEARY*/];\n                const t = (time - before) / (frames[i + 7 /* ENTRIES*/] - before);\n\n                rotate += (frames[i + 7 /* ENTRIES*/ + 1 /* ROTATE*/] - rotate) * t;\n                x += (frames[i + 7 /* ENTRIES*/ + 2 /* X*/] - x) * t;\n                y += (frames[i + 7 /* ENTRIES*/ + 3 /* Y*/] - y) * t;\n                scaleX += (frames[i + 7 /* ENTRIES*/ + 4 /* SCALEX*/] - scaleX) * t;\n                scaleY += (frames[i + 7 /* ENTRIES*/ + 5 /* SCALEY*/] - scaleY) * t;\n                shearY += (frames[i + 7 /* ENTRIES*/ + 6 /* SHEARY*/] - shearY) * t;\n                break;\n            case 1 /* STEPPED*/:\n                rotate = frames[i + 1 /* ROTATE*/];\n                x = frames[i + 2 /* X*/];\n                y = frames[i + 3 /* Y*/];\n                scaleX = frames[i + 4 /* SCALEX*/];\n                scaleY = frames[i + 5 /* SCALEY*/];\n                shearY = frames[i + 6 /* SHEARY*/];\n                break;\n            default:\n                rotate = this.getBezierValue(time, i, 1 /* ROTATE*/, curveType - 2 /* BEZIER*/);\n                x = this.getBezierValue(time, i, 2 /* X*/, curveType + 18 /* BEZIER_SIZE*/ - 2 /* BEZIER*/);\n                y = this.getBezierValue(time, i, 3 /* Y*/, curveType + 18 /* BEZIER_SIZE*/ * 2 - 2 /* BEZIER*/);\n                scaleX = this.getBezierValue(time, i, 4 /* SCALEX*/, curveType + 18 /* BEZIER_SIZE*/ * 3 - 2 /* BEZIER*/);\n                scaleY = this.getBezierValue(time, i, 5 /* SCALEY*/, curveType + 18 /* BEZIER_SIZE*/ * 4 - 2 /* BEZIER*/);\n                shearY = this.getBezierValue(time, i, 6 /* SHEARY*/, curveType + 18 /* BEZIER_SIZE*/ * 5 - 2 /* BEZIER*/);\n        }\n\n        if (blend == MixBlend.setup) {\n            const data = constraint.data;\n\n            constraint.mixRotate = data.mixRotate + (rotate - data.mixRotate) * alpha;\n            constraint.mixX = data.mixX + (x - data.mixX) * alpha;\n            constraint.mixY = data.mixY + (y - data.mixY) * alpha;\n            constraint.mixScaleX = data.mixScaleX + (scaleX - data.mixScaleX) * alpha;\n            constraint.mixScaleY = data.mixScaleY + (scaleY - data.mixScaleY) * alpha;\n            constraint.mixShearY = data.mixShearY + (shearY - data.mixShearY) * alpha;\n        } else {\n            constraint.mixRotate += (rotate - constraint.mixRotate) * alpha;\n            constraint.mixX += (x - constraint.mixX) * alpha;\n            constraint.mixY += (y - constraint.mixY) * alpha;\n            constraint.mixScaleX += (scaleX - constraint.mixScaleX) * alpha;\n            constraint.mixScaleY += (scaleY - constraint.mixScaleY) * alpha;\n            constraint.mixShearY += (shearY - constraint.mixShearY) * alpha;\n        }\n    }\n}\n\n/** Changes a path constraint's {@link PathConstraint#position}.\n * @public\n * */\nexport class PathConstraintPositionTimeline extends CurveTimeline1 {\n    /** The index of the path constraint slot in {@link Skeleton#pathConstraints} that will be changed. */\n    pathConstraintIndex = 0;\n\n    constructor(frameCount: number, bezierCount: number, pathConstraintIndex: number) {\n        super(frameCount, bezierCount, `${Property.pathConstraintPosition}|${pathConstraintIndex}`);\n        this.pathConstraintIndex = pathConstraintIndex;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const constraint: PathConstraint = skeleton.pathConstraints[this.pathConstraintIndex];\n\n        if (!constraint.active) return;\n\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    constraint.position = constraint.data.position;\n\n                    return;\n                case MixBlend.first:\n                    constraint.position += (constraint.data.position - constraint.position) * alpha;\n            }\n\n            return;\n        }\n\n        const position = this.getCurveValue(time);\n\n        if (blend == MixBlend.setup) constraint.position = constraint.data.position + (position - constraint.data.position) * alpha;\n        else constraint.position += (position - constraint.position) * alpha;\n    }\n}\n\n/** Changes a path constraint's {@link PathConstraint#spacing}.\n * @public\n * */\nexport class PathConstraintSpacingTimeline extends CurveTimeline1 {\n    /** The index of the path constraint slot in {@link Skeleton#getPathConstraints()} that will be changed. */\n    pathConstraintIndex = 0;\n\n    constructor(frameCount: number, bezierCount: number, pathConstraintIndex: number) {\n        super(frameCount, bezierCount, `${Property.pathConstraintSpacing}|${pathConstraintIndex}`);\n        this.pathConstraintIndex = pathConstraintIndex;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const constraint: PathConstraint = skeleton.pathConstraints[this.pathConstraintIndex];\n\n        if (!constraint.active) return;\n\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    constraint.spacing = constraint.data.spacing;\n\n                    return;\n                case MixBlend.first:\n                    constraint.spacing += (constraint.data.spacing - constraint.spacing) * alpha;\n            }\n\n            return;\n        }\n\n        const spacing = this.getCurveValue(time);\n\n        if (blend == MixBlend.setup) constraint.spacing = constraint.data.spacing + (spacing - constraint.data.spacing) * alpha;\n        else constraint.spacing += (spacing - constraint.spacing) * alpha;\n    }\n}\n\n/** Changes a transform constraint's {@link PathConstraint#getMixRotate()}, {@link PathConstraint#getMixX()}, and\n * {@link PathConstraint#getMixY()}.\n * @public\n * */\nexport class PathConstraintMixTimeline extends CurveTimeline {\n    /** The index of the path constraint slot in {@link Skeleton#getPathConstraints()} that will be changed. */\n    pathConstraintIndex = 0;\n\n    constructor(frameCount: number, bezierCount: number, pathConstraintIndex: number) {\n        super(frameCount, bezierCount, [`${Property.pathConstraintMix}|${pathConstraintIndex}`]);\n        this.pathConstraintIndex = pathConstraintIndex;\n    }\n\n    getFrameEntries() {\n        return 4 /* ENTRIES*/;\n    }\n\n    setFrame(frame: number, time: number, mixRotate: number, mixX: number, mixY: number) {\n        const frames = this.frames;\n\n        frame <<= 2;\n        frames[frame] = time;\n        frames[frame + 1 /* ROTATE*/] = mixRotate;\n        frames[frame + 2 /* X*/] = mixX;\n        frames[frame + 3 /* Y*/] = mixY;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const constraint: PathConstraint = skeleton.pathConstraints[this.pathConstraintIndex];\n\n        if (!constraint.active) return;\n\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    constraint.mixRotate = constraint.data.mixRotate;\n                    constraint.mixX = constraint.data.mixX;\n                    constraint.mixY = constraint.data.mixY;\n\n                    return;\n                case MixBlend.first:\n                    constraint.mixRotate += (constraint.data.mixRotate - constraint.mixRotate) * alpha;\n                    constraint.mixX += (constraint.data.mixX - constraint.mixX) * alpha;\n                    constraint.mixY += (constraint.data.mixY - constraint.mixY) * alpha;\n            }\n\n            return;\n        }\n\n        let rotate;\n        let x;\n        let y;\n        const i = Timeline.search(frames, time, 4 /* ENTRIES*/);\n        const curveType = this.curves[i >> 2];\n\n        switch (curveType) {\n            case 0 /* LINEAR*/:\n                const before = frames[i];\n\n                rotate = frames[i + 1 /* ROTATE*/];\n                x = frames[i + 2 /* X*/];\n                y = frames[i + 3 /* Y*/];\n                const t = (time - before) / (frames[i + 4 /* ENTRIES*/] - before);\n\n                rotate += (frames[i + 4 /* ENTRIES*/ + 1 /* ROTATE*/] - rotate) * t;\n                x += (frames[i + 4 /* ENTRIES*/ + 2 /* X*/] - x) * t;\n                y += (frames[i + 4 /* ENTRIES*/ + 3 /* Y*/] - y) * t;\n                break;\n            case 1 /* STEPPED*/:\n                rotate = frames[i + 1 /* ROTATE*/];\n                x = frames[i + 2 /* X*/];\n                y = frames[i + 3 /* Y*/];\n                break;\n            default:\n                rotate = this.getBezierValue(time, i, 1 /* ROTATE*/, curveType - 2 /* BEZIER*/);\n                x = this.getBezierValue(time, i, 2 /* X*/, curveType + 18 /* BEZIER_SIZE*/ - 2 /* BEZIER*/);\n                y = this.getBezierValue(time, i, 3 /* Y*/, curveType + 18 /* BEZIER_SIZE*/ * 2 - 2 /* BEZIER*/);\n        }\n\n        if (blend == MixBlend.setup) {\n            const data = constraint.data;\n\n            constraint.mixRotate = data.mixRotate + (rotate - data.mixRotate) * alpha;\n            constraint.mixX = data.mixX + (x - data.mixX) * alpha;\n            constraint.mixY = data.mixY + (y - data.mixY) * alpha;\n        } else {\n            constraint.mixRotate += (rotate - constraint.mixRotate) * alpha;\n            constraint.mixX += (x - constraint.mixX) * alpha;\n            constraint.mixY += (y - constraint.mixY) * alpha;\n        }\n    }\n}\n\n/** Changes a slot's {@link Slot#getSequenceIndex()} for an attachment's {@link Sequence}.\n * @public\n * */\nexport class SequenceTimeline extends Timeline implements SlotTimeline {\n    static ENTRIES = 3;\n    static MODE = 1;\n    static DELAY = 2;\n\n    slotIndex: number;\n    attachment: IHasTextureRegion;\n\n    constructor(frameCount: number, slotIndex: number, attachment: IHasTextureRegion) {\n        super(frameCount, [`${Property.sequence}|${slotIndex}|${attachment.sequence.id}`]);\n        this.slotIndex = slotIndex;\n        this.attachment = attachment;\n    }\n\n    getFrameEntries() {\n        return SequenceTimeline.ENTRIES;\n    }\n\n    getSlotIndex() {\n        return this.slotIndex;\n    }\n\n    getAttachment() {\n        return this.attachment as unknown as Attachment;\n    }\n\n    /** Sets the time, mode, index, and frame time for the specified frame.\n     * @param frame Between 0 and <code>frameCount</code>, inclusive.\n     * @param time Seconds between frames. */\n    setFrame(frame: number, time: number, mode: SequenceMode, index: number, delay: number) {\n        const frames = this.frames;\n\n        frame *= SequenceTimeline.ENTRIES;\n        frames[frame] = time;\n        frames[frame + SequenceTimeline.MODE] = mode | (index << 4);\n        frames[frame + SequenceTimeline.DELAY] = delay;\n    }\n\n    apply(skeleton: Skeleton, lastTime: number, time: number, events: Array<Event>, alpha: number, blend: MixBlend, direction: MixDirection) {\n        const slot = skeleton.slots[this.slotIndex];\n\n        if (!slot.bone.active) return;\n        const slotAttachment = slot.attachment;\n        const attachment = this.attachment as unknown as Attachment;\n\n        if (slotAttachment != attachment) {\n            if (!(slotAttachment instanceof VertexAttachment) || (slotAttachment as VertexAttachment).timelineAttachment != attachment) return;\n        }\n\n        const frames = this.frames;\n\n        if (time < frames[0]) {\n            // Time is before first frame.\n            if (blend == MixBlend.setup || blend == MixBlend.first) slot.sequenceIndex = -1;\n\n            return;\n        }\n\n        const i = Timeline.search(frames, time, SequenceTimeline.ENTRIES);\n        const before = frames[i];\n        const modeAndIndex = frames[i + SequenceTimeline.MODE];\n        const delay = frames[i + SequenceTimeline.DELAY];\n\n        if (!this.attachment.sequence) return;\n        let index = modeAndIndex >> 4;\n        const count = this.attachment.sequence.regions.length;\n        const mode = SequenceModeValues[modeAndIndex & 0xf];\n\n        if (mode != SequenceMode.hold) {\n            index += ((time - before) / delay + 0.00001) | 0;\n            switch (mode) {\n                case SequenceMode.once:\n                    index = Math.min(count - 1, index);\n                    break;\n                case SequenceMode.loop:\n                    index %= count;\n                    break;\n                case SequenceMode.pingpong: {\n                    const n = (count << 1) - 2;\n\n                    index = n == 0 ? 0 : index % n;\n                    if (index >= count) index = n - index;\n                    break;\n                }\n                case SequenceMode.onceReverse:\n                    index = Math.max(count - 1 - index, 0);\n                    break;\n                case SequenceMode.loopReverse:\n                    index = count - 1 - (index % count);\n                    break;\n                case SequenceMode.pingpongReverse: {\n                    const n = (count << 1) - 2;\n\n                    index = n == 0 ? 0 : (index + count - 1) % n;\n                    if (index >= count) index = n - index;\n                }\n            }\n        }\n        slot.sequenceIndex = index;\n    }\n}\n","import { IAnimationState, IAnimationStateListener, ITrackEntry, MathUtils, MixBlend, MixDirection, Pool, StringSet, Utils } from '@pixi-spine/base';\nimport { Animation, AttachmentTimeline, DrawOrderTimeline, EventTimeline, RotateTimeline, Timeline } from './Animation';\nimport type { AnimationStateData } from './AnimationStateData';\nimport type { Event } from './Event';\nimport type { Skeleton } from './Skeleton';\nimport type { Slot } from './Slot';\n\n/** Applies animations over time, queues animations for later playback, mixes (crossfading) between animations, and applies\n * multiple animations on top of each other (layering).\n *\n * See [Applying Animations](http://esotericsoftware.com/spine-applying-animations/) in the Spine Runtimes Guide.\n * @public\n * */\nexport class AnimationState implements IAnimationState<AnimationStateData> {\n    static _emptyAnimation = new Animation('<empty>', [], 0);\n    private static emptyAnimation(): Animation {\n        return AnimationState._emptyAnimation;\n    }\n\n    /** The AnimationStateData to look up mix durations. */\n    data: AnimationStateData;\n\n    /** The list of tracks that currently have animations, which may contain null entries. */\n    tracks = new Array<TrackEntry | null>();\n\n    /** Multiplier for the delta time when the animation state is updated, causing time for all animations and mixes to play slower\n     * or faster. Defaults to 1.\n     *\n     * See TrackEntry {@link TrackEntry#timeScale} for affecting a single animation. */\n    timeScale = 1;\n    unkeyedState = 0;\n\n    events = new Array<Event>();\n    listeners = new Array<AnimationStateListener>();\n    queue = new EventQueue(this);\n    propertyIDs = new StringSet();\n    animationsChanged = false;\n\n    trackEntryPool = new Pool<TrackEntry>(() => new TrackEntry());\n\n    constructor(data: AnimationStateData) {\n        this.data = data;\n    }\n\n    /** Increments each track entry {@link TrackEntry#trackTime()}, setting queued animations as current if needed. */\n    update(delta: number) {\n        delta *= this.timeScale;\n        const tracks = this.tracks;\n\n        for (let i = 0, n = tracks.length; i < n; i++) {\n            const current = tracks[i];\n\n            if (!current) continue;\n\n            current.animationLast = current.nextAnimationLast;\n            current.trackLast = current.nextTrackLast;\n\n            let currentDelta = delta * current.timeScale;\n\n            if (current.delay > 0) {\n                current.delay -= currentDelta;\n                if (current.delay > 0) continue;\n                currentDelta = -current.delay;\n                current.delay = 0;\n            }\n\n            let next = current.next;\n\n            if (next) {\n                // When the next entry's delay is passed, change to the next entry, preserving leftover time.\n                const nextTime = current.trackLast - next.delay;\n\n                if (nextTime >= 0) {\n                    next.delay = 0;\n                    next.trackTime += current.timeScale == 0 ? 0 : (nextTime / current.timeScale + delta) * next.timeScale;\n                    current.trackTime += currentDelta;\n                    this.setCurrent(i, next, true);\n                    while (next.mixingFrom) {\n                        next.mixTime += delta;\n                        next = next.mixingFrom;\n                    }\n                    continue;\n                }\n            } else if (current.trackLast >= current.trackEnd && !current.mixingFrom) {\n                tracks[i] = null;\n                this.queue.end(current);\n                this.clearNext(current);\n                continue;\n            }\n            if (current.mixingFrom && this.updateMixingFrom(current, delta)) {\n                // End mixing from entries once all have completed.\n                let from: TrackEntry | null = current.mixingFrom;\n\n                current.mixingFrom = null;\n                if (from) from.mixingTo = null;\n                while (from) {\n                    this.queue.end(from);\n                    from = from.mixingFrom;\n                }\n            }\n\n            current.trackTime += currentDelta;\n        }\n\n        this.queue.drain();\n    }\n\n    /** Returns true when all mixing from entries are complete. */\n    updateMixingFrom(to: TrackEntry, delta: number): boolean {\n        const from = to.mixingFrom;\n\n        if (!from) return true;\n\n        const finished = this.updateMixingFrom(from, delta);\n\n        from.animationLast = from.nextAnimationLast;\n        from.trackLast = from.nextTrackLast;\n\n        // Require mixTime > 0 to ensure the mixing from entry was applied at least once.\n        if (to.mixTime > 0 && to.mixTime >= to.mixDuration) {\n            // Require totalAlpha == 0 to ensure mixing is complete, unless mixDuration == 0 (the transition is a single frame).\n            if (from.totalAlpha == 0 || to.mixDuration == 0) {\n                to.mixingFrom = from.mixingFrom;\n                if (from.mixingFrom) from.mixingFrom.mixingTo = to;\n                to.interruptAlpha = from.interruptAlpha;\n                this.queue.end(from);\n            }\n\n            return finished;\n        }\n\n        from.trackTime += delta * from.timeScale;\n        to.mixTime += delta;\n\n        return false;\n    }\n\n    /** Poses the skeleton using the track entry animations. There are no side effects other than invoking listeners, so the\n     * animation state can be applied to multiple skeletons to pose them identically.\n     * @returns True if any animations were applied. */\n    apply(skeleton: Skeleton): boolean {\n        if (!skeleton) throw new Error('skeleton cannot be null.');\n        if (this.animationsChanged) this._animationsChanged();\n\n        const events = this.events;\n        const tracks = this.tracks;\n        let applied = false;\n\n        for (let i = 0, n = tracks.length; i < n; i++) {\n            const current = tracks[i];\n\n            if (!current || current.delay > 0) continue;\n            applied = true;\n            const blend: MixBlend = i == 0 ? MixBlend.first : current.mixBlend;\n\n            // Apply mixing from entries first.\n            let mix = current.alpha;\n\n            if (current.mixingFrom) mix *= this.applyMixingFrom(current, skeleton, blend);\n            else if (current.trackTime >= current.trackEnd && !current.next) mix = 0;\n\n            // Apply current entry.\n            const animationLast = current.animationLast;\n            const animationTime = current.getAnimationTime();\n            let applyTime = animationTime;\n            let applyEvents: Event[] | null = events;\n\n            if (current.reverse) {\n                applyTime = current.animation.duration - applyTime;\n                applyEvents = null;\n            }\n            const timelines = current.animation.timelines;\n            const timelineCount = timelines.length;\n\n            if ((i == 0 && mix == 1) || blend == MixBlend.add) {\n                for (let ii = 0; ii < timelineCount; ii++) {\n                    // Fixes issue #302 on IOS9 where mix, blend sometimes became undefined and caused assets\n                    // to sometimes stop rendering when using color correction, as their RGBA values become NaN.\n                    // (https://github.com/pixijs/pixi-spine/issues/302)\n                    Utils.webkit602BugfixHelper(mix, blend);\n                    const timeline = timelines[ii];\n\n                    if (timeline instanceof AttachmentTimeline) this.applyAttachmentTimeline(timeline, skeleton, applyTime, blend, true);\n                    else timeline.apply(skeleton, animationLast, applyTime, applyEvents, mix, blend, MixDirection.mixIn);\n                }\n            } else {\n                const timelineMode = current.timelineMode;\n\n                const shortestRotation = current.shortestRotation;\n                const firstFrame = !shortestRotation && current.timelinesRotation.length != timelineCount << 1;\n\n                if (firstFrame) current.timelinesRotation.length = timelineCount << 1;\n\n                for (let ii = 0; ii < timelineCount; ii++) {\n                    const timeline = timelines[ii];\n                    const timelineBlend = timelineMode[ii] == SUBSEQUENT ? blend : MixBlend.setup;\n\n                    if (!shortestRotation && timeline instanceof RotateTimeline) {\n                        this.applyRotateTimeline(timeline, skeleton, applyTime, mix, timelineBlend, current.timelinesRotation, ii << 1, firstFrame);\n                    } else if (timeline instanceof AttachmentTimeline) {\n                        this.applyAttachmentTimeline(timeline, skeleton, applyTime, blend, true);\n                    } else {\n                        // This fixes the WebKit 602 specific issue described at http://esotericsoftware.com/forum/iOS-10-disappearing-graphics-10109\n                        Utils.webkit602BugfixHelper(mix, blend);\n                        timeline.apply(skeleton, animationLast, applyTime, applyEvents, mix, timelineBlend, MixDirection.mixIn);\n                    }\n                }\n            }\n            this.queueEvents(current, animationTime);\n            events.length = 0;\n            current.nextAnimationLast = animationTime;\n            current.nextTrackLast = current.trackTime;\n        }\n\n        // Set slots attachments to the setup pose, if needed. This occurs if an animation that is mixing out sets attachments so\n        // subsequent timelines see any deform, but the subsequent timelines don't set an attachment (eg they are also mixing out or\n        // the time is before the first key).\n        const setupState = this.unkeyedState + SETUP;\n        const slots = skeleton.slots;\n\n        for (let i = 0, n = skeleton.slots.length; i < n; i++) {\n            const slot = slots[i];\n\n            if (slot.attachmentState == setupState) {\n                const attachmentName = slot.data.attachmentName;\n\n                slot.setAttachment(!attachmentName ? null : skeleton.getAttachment(slot.data.index, attachmentName));\n            }\n        }\n        this.unkeyedState += 2; // Increasing after each use avoids the need to reset attachmentState for every slot.\n\n        this.queue.drain();\n\n        return applied;\n    }\n\n    applyMixingFrom(to: TrackEntry, skeleton: Skeleton, blend: MixBlend) {\n        const from = to.mixingFrom;\n\n        if (from.mixingFrom) this.applyMixingFrom(from, skeleton, blend);\n\n        let mix = 0;\n\n        if (to.mixDuration == 0) {\n            // Single frame mix to undo mixingFrom changes.\n            mix = 1;\n            if (blend == MixBlend.first) blend = MixBlend.setup;\n        } else {\n            mix = to.mixTime / to.mixDuration;\n            if (mix > 1) mix = 1;\n            if (blend != MixBlend.first) blend = from.mixBlend;\n        }\n\n        const attachments = mix < from.attachmentThreshold;\n        const drawOrder = mix < from.drawOrderThreshold;\n        const timelines = from.animation.timelines;\n        const timelineCount = timelines.length;\n        const alphaHold = from.alpha * to.interruptAlpha;\n        const alphaMix = alphaHold * (1 - mix);\n        const animationLast = from.animationLast;\n        const animationTime = from.getAnimationTime();\n        let applyTime = animationTime;\n        let events = null;\n\n        if (from.reverse) applyTime = from.animation.duration - applyTime;\n        else if (mix < from.eventThreshold) events = this.events;\n\n        if (blend == MixBlend.add) {\n            for (let i = 0; i < timelineCount; i++) timelines[i].apply(skeleton, animationLast, applyTime, events, alphaMix, blend, MixDirection.mixOut);\n        } else {\n            const timelineMode = from.timelineMode;\n            const timelineHoldMix = from.timelineHoldMix;\n\n            const shortestRotation = from.shortestRotation;\n            const firstFrame = !shortestRotation && from.timelinesRotation.length != timelineCount << 1;\n\n            if (firstFrame) from.timelinesRotation.length = timelineCount << 1;\n\n            from.totalAlpha = 0;\n            for (let i = 0; i < timelineCount; i++) {\n                const timeline = timelines[i];\n                let direction = MixDirection.mixOut;\n                let timelineBlend: MixBlend;\n                let alpha = 0;\n\n                switch (timelineMode[i]) {\n                    case SUBSEQUENT:\n                        if (!drawOrder && timeline instanceof DrawOrderTimeline) continue;\n                        timelineBlend = blend;\n                        alpha = alphaMix;\n                        break;\n                    case FIRST:\n                        timelineBlend = MixBlend.setup;\n                        alpha = alphaMix;\n                        break;\n                    case HOLD_SUBSEQUENT:\n                        timelineBlend = blend;\n                        alpha = alphaHold;\n                        break;\n                    case HOLD_FIRST:\n                        timelineBlend = MixBlend.setup;\n                        alpha = alphaHold;\n                        break;\n                    default:\n                        timelineBlend = MixBlend.setup;\n                        const holdMix = timelineHoldMix[i];\n\n                        alpha = alphaHold * Math.max(0, 1 - holdMix.mixTime / holdMix.mixDuration);\n                        break;\n                }\n                from.totalAlpha += alpha;\n\n                if (!shortestRotation && timeline instanceof RotateTimeline)\n                    this.applyRotateTimeline(timeline, skeleton, applyTime, alpha, timelineBlend, from.timelinesRotation, i << 1, firstFrame);\n                else if (timeline instanceof AttachmentTimeline) this.applyAttachmentTimeline(timeline, skeleton, applyTime, timelineBlend, attachments);\n                else {\n                    // This fixes the WebKit 602 specific issue described at http://esotericsoftware.com/forum/iOS-10-disappearing-graphics-10109\n                    Utils.webkit602BugfixHelper(alpha, blend);\n                    if (drawOrder && timeline instanceof DrawOrderTimeline && timelineBlend == MixBlend.setup) direction = MixDirection.mixIn;\n                    timeline.apply(skeleton, animationLast, applyTime, events, alpha, timelineBlend, direction);\n                }\n            }\n        }\n\n        if (to.mixDuration > 0) this.queueEvents(from, animationTime);\n        this.events.length = 0;\n        from.nextAnimationLast = animationTime;\n        from.nextTrackLast = from.trackTime;\n\n        return mix;\n    }\n\n    applyAttachmentTimeline(timeline: AttachmentTimeline, skeleton: Skeleton, time: number, blend: MixBlend, attachments: boolean) {\n        const slot = skeleton.slots[timeline.slotIndex];\n\n        if (!slot.bone.active) return;\n\n        if (time < timeline.frames[0]) {\n            // Time is before first frame.\n            if (blend == MixBlend.setup || blend == MixBlend.first) this.setAttachment(skeleton, slot, slot.data.attachmentName, attachments);\n        } else this.setAttachment(skeleton, slot, timeline.attachmentNames[Timeline.search1(timeline.frames, time)], attachments);\n\n        // If an attachment wasn't set (ie before the first frame or attachments is false), set the setup attachment later.\n        if (slot.attachmentState <= this.unkeyedState) slot.attachmentState = this.unkeyedState + SETUP;\n    }\n\n    setAttachment(skeleton: Skeleton, slot: Slot, attachmentName: string | null, attachments: boolean) {\n        slot.setAttachment(!attachmentName ? null : skeleton.getAttachment(slot.data.index, attachmentName));\n        if (attachments) slot.attachmentState = this.unkeyedState + CURRENT;\n    }\n\n    applyRotateTimeline(\n        timeline: RotateTimeline,\n        skeleton: Skeleton,\n        time: number,\n        alpha: number,\n        blend: MixBlend,\n        timelinesRotation: Array<number>,\n        i: number,\n        firstFrame: boolean\n    ) {\n        if (firstFrame) timelinesRotation[i] = 0;\n\n        if (alpha == 1) {\n            timeline.apply(skeleton, 0, time, null, 1, blend, MixDirection.mixIn);\n\n            return;\n        }\n\n        const bone = skeleton.bones[timeline.boneIndex];\n\n        if (!bone.active) return;\n        const frames = timeline.frames;\n        let r1 = 0;\n        let r2 = 0;\n\n        if (time < frames[0]) {\n            switch (blend) {\n                case MixBlend.setup:\n                    bone.rotation = bone.data.rotation;\n                default:\n                    return;\n                case MixBlend.first:\n                    r1 = bone.rotation;\n                    r2 = bone.data.rotation;\n            }\n        } else {\n            r1 = blend == MixBlend.setup ? bone.data.rotation : bone.rotation;\n            r2 = bone.data.rotation + timeline.getCurveValue(time);\n        }\n\n        // Mix between rotations using the direction of the shortest route on the first frame while detecting crosses.\n        let total = 0;\n        let diff = r2 - r1;\n\n        diff -= (16384 - ((16384.499999999996 - diff / 360) | 0)) * 360;\n        if (diff == 0) {\n            total = timelinesRotation[i];\n        } else {\n            let lastTotal = 0;\n            let lastDiff = 0;\n\n            if (firstFrame) {\n                lastTotal = 0;\n                lastDiff = diff;\n            } else {\n                lastTotal = timelinesRotation[i]; // Angle and direction of mix, including loops.\n                lastDiff = timelinesRotation[i + 1]; // Difference between bones.\n            }\n            const current = diff > 0;\n            let dir = lastTotal >= 0;\n            // Detect cross at 0 (not 180).\n\n            if (MathUtils.signum(lastDiff) != MathUtils.signum(diff) && Math.abs(lastDiff) <= 90) {\n                // A cross after a 360 rotation is a loop.\n                if (Math.abs(lastTotal) > 180) lastTotal += 360 * MathUtils.signum(lastTotal);\n                dir = current;\n            }\n            total = diff + lastTotal - (lastTotal % 360); // Store loops as part of lastTotal.\n            if (dir != current) total += 360 * MathUtils.signum(lastTotal);\n            timelinesRotation[i] = total;\n        }\n        timelinesRotation[i + 1] = diff;\n        bone.rotation = r1 + total * alpha;\n    }\n\n    queueEvents(entry: TrackEntry, animationTime: number) {\n        const animationStart = entry.animationStart;\n        const animationEnd = entry.animationEnd;\n        const duration = animationEnd - animationStart;\n        const trackLastWrapped = entry.trackLast % duration;\n\n        // Queue events before complete.\n        const events = this.events;\n        let i = 0;\n        const n = events.length;\n\n        for (; i < n; i++) {\n            const event = events[i];\n\n            if (event.time < trackLastWrapped) break;\n            if (event.time > animationEnd) continue; // Discard events outside animation start/end.\n            this.queue.event(entry, event);\n        }\n\n        // Queue complete if completed a loop iteration or the animation.\n        let complete = false;\n\n        if (entry.loop) complete = duration == 0 || trackLastWrapped > entry.trackTime % duration;\n        else complete = animationTime >= animationEnd && entry.animationLast < animationEnd;\n        if (complete) this.queue.complete(entry);\n\n        // Queue events after complete.\n        for (; i < n; i++) {\n            const event = events[i];\n\n            if (event.time < animationStart) continue; // Discard events outside animation start/end.\n            this.queue.event(entry, event);\n        }\n    }\n\n    /** Removes all animations from all tracks, leaving skeletons in their current pose.\n     *\n     * It may be desired to use {@link AnimationState#setEmptyAnimation()} to mix the skeletons back to the setup pose,\n     * rather than leaving them in their current pose. */\n    clearTracks() {\n        const oldDrainDisabled = this.queue.drainDisabled;\n\n        this.queue.drainDisabled = true;\n        for (let i = 0, n = this.tracks.length; i < n; i++) this.clearTrack(i);\n        this.tracks.length = 0;\n        this.queue.drainDisabled = oldDrainDisabled;\n        this.queue.drain();\n    }\n\n    /** Removes all animations from the track, leaving skeletons in their current pose.\n     *\n     * It may be desired to use {@link AnimationState#setEmptyAnimation()} to mix the skeletons back to the setup pose,\n     * rather than leaving them in their current pose. */\n    clearTrack(trackIndex: number) {\n        if (trackIndex >= this.tracks.length) return;\n        const current = this.tracks[trackIndex];\n\n        if (!current) return;\n\n        this.queue.end(current);\n\n        this.clearNext(current);\n\n        let entry = current;\n\n        while (true) {\n            const from = entry.mixingFrom;\n\n            if (!from) break;\n            this.queue.end(from);\n            entry.mixingFrom = null;\n            entry.mixingTo = null;\n            entry = from;\n        }\n\n        this.tracks[current.trackIndex] = null;\n\n        this.queue.drain();\n    }\n\n    setCurrent(index: number, current: TrackEntry, interrupt: boolean) {\n        const from = this.expandToIndex(index);\n\n        this.tracks[index] = current;\n        current.previous = null;\n\n        if (from) {\n            if (interrupt) this.queue.interrupt(from);\n            current.mixingFrom = from;\n            from.mixingTo = current;\n            current.mixTime = 0;\n\n            // Store the interrupted mix percentage.\n            if (from.mixingFrom && from.mixDuration > 0) current.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration);\n\n            from.timelinesRotation.length = 0; // Reset rotation for mixing out, in case entry was mixed in.\n        }\n\n        this.queue.start(current);\n    }\n\n    /** Sets an animation by name.\n     *\n     * See {@link #setAnimationWith()}. */\n    setAnimation(trackIndex: number, animationName: string, loop = false) {\n        const animation = this.data.skeletonData.findAnimation(animationName);\n\n        if (!animation) throw new Error(`Animation not found: ${animationName}`);\n\n        return this.setAnimationWith(trackIndex, animation, loop);\n    }\n\n    /** Sets the current animation for a track, discarding any queued animations. If the formerly current track entry was never\n     * applied to a skeleton, it is replaced (not mixed from).\n     * @param loop If true, the animation will repeat. If false it will not, instead its last frame is applied if played beyond its\n     *           duration. In either case {@link TrackEntry#trackEnd} determines when the track is cleared.\n     * @returns A track entry to allow further customization of animation playback. References to the track entry must not be kept\n     *         after the {@link AnimationStateListener#dispose()} event occurs. */\n    setAnimationWith(trackIndex: number, animation: Animation, loop = false) {\n        if (!animation) throw new Error('animation cannot be null.');\n        let interrupt = true;\n        let current = this.expandToIndex(trackIndex);\n\n        if (current) {\n            if (current.nextTrackLast == -1) {\n                // Don't mix from an entry that was never applied.\n                this.tracks[trackIndex] = current.mixingFrom;\n                this.queue.interrupt(current);\n                this.queue.end(current);\n                this.clearNext(current);\n                current = current.mixingFrom;\n                interrupt = false;\n            } else this.clearNext(current);\n        }\n        const entry = this.trackEntry(trackIndex, animation, loop, current);\n\n        this.setCurrent(trackIndex, entry, interrupt);\n        this.queue.drain();\n\n        return entry;\n    }\n\n    /** Queues an animation by name.\n     *\n     * See {@link #addAnimationWith()}. */\n    addAnimation(trackIndex: number, animationName: string, loop = false, delay = 0) {\n        const animation = this.data.skeletonData.findAnimation(animationName);\n\n        if (!animation) throw new Error(`Animation not found: ${animationName}`);\n\n        return this.addAnimationWith(trackIndex, animation, loop, delay);\n    }\n\n    /** Adds an animation to be played after the current or last queued animation for a track. If the track is empty, it is\n     * equivalent to calling {@link #setAnimationWith()}.\n     * @param delay If > 0, sets {@link TrackEntry#delay}. If <= 0, the delay set is the duration of the previous track entry\n     *           minus any mix duration (from the {@link AnimationStateData}) plus the specified `delay` (ie the mix\n     *           ends at (`delay` = 0) or before (`delay` < 0) the previous track entry duration). If the\n     *           previous entry is looping, its next loop completion is used instead of its duration.\n     * @returns A track entry to allow further customization of animation playback. References to the track entry must not be kept\n     *         after the {@link AnimationStateListener#dispose()} event occurs. */\n    addAnimationWith(trackIndex: number, animation: Animation, loop = false, delay = 0) {\n        if (!animation) throw new Error('animation cannot be null.');\n\n        let last = this.expandToIndex(trackIndex);\n\n        if (last) {\n            while (last.next) last = last.next;\n        }\n\n        const entry = this.trackEntry(trackIndex, animation, loop, last);\n\n        if (!last) {\n            this.setCurrent(trackIndex, entry, true);\n            this.queue.drain();\n        } else {\n            last.next = entry;\n            entry.previous = last;\n            if (delay <= 0) delay += last.getTrackComplete() - entry.mixDuration;\n        }\n\n        entry.delay = delay;\n\n        return entry;\n    }\n\n    /** Sets an empty animation for a track, discarding any queued animations, and sets the track entry's\n     * {@link TrackEntry#mixduration}. An empty animation has no timelines and serves as a placeholder for mixing in or out.\n     *\n     * Mixing out is done by setting an empty animation with a mix duration using either {@link #setEmptyAnimation()},\n     * {@link #setEmptyAnimations()}, or {@link #addEmptyAnimation()}. Mixing to an empty animation causes\n     * the previous animation to be applied less and less over the mix duration. Properties keyed in the previous animation\n     * transition to the value from lower tracks or to the setup pose value if no lower tracks key the property. A mix duration of\n     * 0 still mixes out over one frame.\n     *\n     * Mixing in is done by first setting an empty animation, then adding an animation using\n     * {@link #addAnimation()} and on the returned track entry, set the\n     * {@link TrackEntry#setMixDuration()}. Mixing from an empty animation causes the new animation to be applied more and\n     * more over the mix duration. Properties keyed in the new animation transition from the value from lower tracks or from the\n     * setup pose value if no lower tracks key the property to the value keyed in the new animation. */\n    setEmptyAnimation(trackIndex: number, mixDuration = 0) {\n        const entry = this.setAnimationWith(trackIndex, AnimationState.emptyAnimation(), false);\n\n        entry.mixDuration = mixDuration;\n        entry.trackEnd = mixDuration;\n\n        return entry;\n    }\n\n    /** Adds an empty animation to be played after the current or last queued animation for a track, and sets the track entry's\n     * {@link TrackEntry#mixDuration}. If the track is empty, it is equivalent to calling\n     * {@link #setEmptyAnimation()}.\n     *\n     * See {@link #setEmptyAnimation()}.\n     * @param delay If > 0, sets {@link TrackEntry#delay}. If <= 0, the delay set is the duration of the previous track entry\n     *           minus any mix duration plus the specified `delay` (ie the mix ends at (`delay` = 0) or\n     *           before (`delay` < 0) the previous track entry duration). If the previous entry is looping, its next\n     *           loop completion is used instead of its duration.\n     * @return A track entry to allow further customization of animation playback. References to the track entry must not be kept\n     *         after the {@link AnimationStateListener#dispose()} event occurs. */\n    addEmptyAnimation(trackIndex: number, mixDuration = 0, delay = 0) {\n        const entry = this.addAnimationWith(trackIndex, AnimationState.emptyAnimation(), false, delay);\n\n        if (delay <= 0) entry.delay += entry.mixDuration - mixDuration;\n        entry.mixDuration = mixDuration;\n        entry.trackEnd = mixDuration;\n\n        return entry;\n    }\n\n    /** Sets an empty animation for every track, discarding any queued animations, and mixes to it over the specified mix\n     * duration. */\n    setEmptyAnimations(mixDuration = 0) {\n        const oldDrainDisabled = this.queue.drainDisabled;\n\n        this.queue.drainDisabled = true;\n        for (let i = 0, n = this.tracks.length; i < n; i++) {\n            const current = this.tracks[i];\n\n            if (current) this.setEmptyAnimation(current.trackIndex, mixDuration);\n        }\n        this.queue.drainDisabled = oldDrainDisabled;\n        this.queue.drain();\n    }\n\n    expandToIndex(index: number) {\n        if (index < this.tracks.length) return this.tracks[index];\n        Utils.ensureArrayCapacity(this.tracks, index + 1, null);\n        this.tracks.length = index + 1;\n\n        return null;\n    }\n\n    /** @param last May be null. */\n    trackEntry(trackIndex: number, animation: Animation, loop: boolean, last: TrackEntry | null) {\n        const entry = this.trackEntryPool.obtain();\n\n        entry.reset();\n        entry.trackIndex = trackIndex;\n        entry.animation = animation;\n        entry.loop = loop;\n        entry.holdPrevious = false;\n\n        entry.reverse = false;\n        entry.shortestRotation = false;\n\n        entry.eventThreshold = 0;\n        entry.attachmentThreshold = 0;\n        entry.drawOrderThreshold = 0;\n\n        entry.animationStart = 0;\n        entry.animationEnd = animation.duration;\n        entry.animationLast = -1;\n        entry.nextAnimationLast = -1;\n\n        entry.delay = 0;\n        entry.trackTime = 0;\n        entry.trackLast = -1;\n        entry.nextTrackLast = -1;\n        entry.trackEnd = Number.MAX_VALUE;\n        entry.timeScale = 1;\n\n        entry.alpha = 1;\n        entry.mixTime = 0;\n        entry.mixDuration = !last ? 0 : this.data.getMix(last.animation, animation);\n        entry.interruptAlpha = 1;\n        entry.totalAlpha = 0;\n        entry.mixBlend = MixBlend.replace;\n\n        return entry;\n    }\n\n    /** Removes the {@link TrackEntry#getNext() next entry} and all entries after it for the specified entry. */\n    clearNext(entry: TrackEntry) {\n        let next = entry.next;\n\n        while (next) {\n            this.queue.dispose(next);\n            next = next.next;\n        }\n        entry.next = null;\n    }\n\n    _animationsChanged() {\n        this.animationsChanged = false;\n\n        this.propertyIDs.clear();\n        const tracks = this.tracks;\n\n        for (let i = 0, n = tracks.length; i < n; i++) {\n            let entry = tracks[i];\n\n            if (!entry) continue;\n            while (entry.mixingFrom) entry = entry.mixingFrom;\n            do {\n                if (!entry.mixingTo || entry.mixBlend != MixBlend.add) this.computeHold(entry);\n                entry = entry.mixingTo;\n            } while (entry);\n        }\n    }\n\n    computeHold(entry: TrackEntry) {\n        const to = entry.mixingTo;\n        const timelines = entry.animation.timelines;\n        const timelinesCount = entry.animation.timelines.length;\n        const timelineMode = entry.timelineMode;\n\n        timelineMode.length = timelinesCount;\n        const timelineHoldMix = entry.timelineHoldMix;\n\n        timelineHoldMix.length = 0;\n        const propertyIDs = this.propertyIDs;\n\n        if (to && to.holdPrevious) {\n            for (let i = 0; i < timelinesCount; i++) timelineMode[i] = propertyIDs.addAll(timelines[i].getPropertyIds()) ? HOLD_FIRST : HOLD_SUBSEQUENT;\n\n            return;\n        }\n\n        // eslint-disable-next-line no-restricted-syntax, no-labels\n        outer: for (let i = 0; i < timelinesCount; i++) {\n            const timeline = timelines[i];\n            const ids = timeline.getPropertyIds();\n\n            if (!propertyIDs.addAll(ids)) timelineMode[i] = SUBSEQUENT;\n            else if (\n                !to ||\n                timeline instanceof AttachmentTimeline ||\n                timeline instanceof DrawOrderTimeline ||\n                timeline instanceof EventTimeline ||\n                !to.animation.hasTimeline(ids)\n            ) {\n                timelineMode[i] = FIRST;\n            } else {\n                for (let next = to.mixingTo; next; next = next.mixingTo) {\n                    if (next.animation.hasTimeline(ids)) continue;\n                    if (entry.mixDuration > 0) {\n                        timelineMode[i] = HOLD_MIX;\n                        timelineHoldMix[i] = next;\n                        // eslint-disable-next-line no-labels\n                        continue outer;\n                    }\n                    break;\n                }\n                timelineMode[i] = HOLD_FIRST;\n            }\n        }\n    }\n\n    /** Returns the track entry for the animation currently playing on the track, or null if no animation is currently playing. */\n    getCurrent(trackIndex: number) {\n        if (trackIndex >= this.tracks.length) return null;\n\n        return this.tracks[trackIndex];\n    }\n\n    /** Adds a listener to receive events for all track entries. */\n    addListener(listener: AnimationStateListener) {\n        if (!listener) throw new Error('listener cannot be null.');\n        this.listeners.push(listener);\n    }\n\n    /** Removes the listener added with {@link #addListener()}. */\n    removeListener(listener: AnimationStateListener) {\n        const index = this.listeners.indexOf(listener);\n\n        if (index >= 0) this.listeners.splice(index, 1);\n    }\n\n    /** Removes all listeners added with {@link #addListener()}. */\n    clearListeners() {\n        this.listeners.length = 0;\n    }\n\n    /** Discards all listener notifications that have not yet been delivered. This can be useful to call from an\n     * {@link AnimationStateListener} when it is known that further notifications that may have been already queued for delivery\n     * are not wanted because new animations are being set. */\n    clearListenerNotifications() {\n        this.queue.clear();\n    }\n\n    // deprecated stuff\n    onComplete: (trackIndex: number, loopCount: number) => any;\n    onEvent: (trackIndex: number, event: Event) => any;\n    onStart: (trackIndex: number) => any;\n    onEnd: (trackIndex: number) => any;\n\n    private static deprecatedWarning1 = false;\n\n    setAnimationByName(trackIndex: number, animationName: string, loop: boolean) {\n        if (!AnimationState.deprecatedWarning1) {\n            AnimationState.deprecatedWarning1 = true;\n            console.warn('Spine Deprecation Warning: AnimationState.setAnimationByName is deprecated, please use setAnimation from now on.');\n        }\n        this.setAnimation(trackIndex, animationName, loop);\n    }\n\n    private static deprecatedWarning2 = false;\n\n    addAnimationByName(trackIndex: number, animationName: string, loop: boolean, delay: number) {\n        if (!AnimationState.deprecatedWarning2) {\n            AnimationState.deprecatedWarning2 = true;\n            console.warn('Spine Deprecation Warning: AnimationState.addAnimationByName is deprecated, please use addAnimation from now on.');\n        }\n        this.addAnimation(trackIndex, animationName, loop, delay);\n    }\n\n    private static deprecatedWarning3 = false;\n\n    hasAnimation(animationName: string): boolean {\n        const animation = this.data.skeletonData.findAnimation(animationName);\n\n        return animation !== null;\n    }\n\n    hasAnimationByName(animationName: string): boolean {\n        if (!AnimationState.deprecatedWarning3) {\n            AnimationState.deprecatedWarning3 = true;\n            console.warn('Spine Deprecation Warning: AnimationState.hasAnimationByName is deprecated, please use hasAnimation from now on.');\n        }\n\n        return this.hasAnimation(animationName);\n    }\n}\n\n/** Stores settings and other state for the playback of an animation on an {@link AnimationState} track.\n *\n * References to a track entry must not be kept after the {@link AnimationStateListener#dispose()} event occurs.\n * @public\n * */\nexport class TrackEntry implements ITrackEntry {\n    /** The animation to apply for this track entry. */\n    animation: Animation | null = null;\n\n    previous: TrackEntry | null = null;\n\n    /** The animation queued to start after this animation, or null. `next` makes up a linked list. */\n    next: TrackEntry | null = null;\n\n    /** The track entry for the previous animation when mixing from the previous animation to this animation, or null if no\n     * mixing is currently occuring. When mixing from multiple animations, `mixingFrom` makes up a linked list. */\n    mixingFrom: TrackEntry | null = null;\n\n    /** The track entry for the next animation when mixing from this animation to the next animation, or null if no mixing is\n     * currently occuring. When mixing to multiple animations, `mixingTo` makes up a linked list. */\n    mixingTo: TrackEntry | null = null;\n\n    /** The listener for events generated by this track entry, or null.\n     *\n     * A track entry returned from {@link AnimationState#setAnimation()} is already the current animation\n     * for the track, so the track entry listener {@link AnimationStateListener#start()} will not be called. */\n    listener: AnimationStateListener | null = null;\n\n    /** The index of the track where this track entry is either current or queued.\n     *\n     * See {@link AnimationState#getCurrent()}. */\n    trackIndex = 0;\n\n    /** If true, the animation will repeat. If false it will not, instead its last frame is applied if played beyond its\n     * duration. */\n    loop = false;\n\n    /** If true, when mixing from the previous animation to this animation, the previous animation is applied as normal instead\n     * of being mixed out.\n     *\n     * When mixing between animations that key the same property, if a lower track also keys that property then the value will\n     * briefly dip toward the lower track value during the mix. This happens because the first animation mixes from 100% to 0%\n     * while the second animation mixes from 0% to 100%. Setting `holdPrevious` to true applies the first animation\n     * at 100% during the mix so the lower track value is overwritten. Such dipping does not occur on the lowest track which\n     * keys the property, only when a higher track also keys the property.\n     *\n     * Snapping will occur if `holdPrevious` is true and this animation does not key all the same properties as the\n     * previous animation. */\n    holdPrevious = false;\n\n    reverse = false;\n\n    shortestRotation = false;\n\n    /** When the mix percentage ({@link #mixTime} / {@link #mixDuration}) is less than the\n     * `eventThreshold`, event timelines are applied while this animation is being mixed out. Defaults to 0, so event\n     * timelines are not applied while this animation is being mixed out. */\n    eventThreshold = 0;\n\n    /** When the mix percentage ({@link #mixtime} / {@link #mixDuration}) is less than the\n     * `attachmentThreshold`, attachment timelines are applied while this animation is being mixed out. Defaults to\n     * 0, so attachment timelines are not applied while this animation is being mixed out. */\n    attachmentThreshold = 0;\n\n    /** When the mix percentage ({@link #mixTime} / {@link #mixDuration}) is less than the\n     * `drawOrderThreshold`, draw order timelines are applied while this animation is being mixed out. Defaults to 0,\n     * so draw order timelines are not applied while this animation is being mixed out. */\n    drawOrderThreshold = 0;\n\n    /** Seconds when this animation starts, both initially and after looping. Defaults to 0.\n     *\n     * When changing the `animationStart` time, it often makes sense to set {@link #animationLast} to the same\n     * value to prevent timeline keys before the start time from triggering. */\n    animationStart = 0;\n\n    /** Seconds for the last frame of this animation. Non-looping animations won't play past this time. Looping animations will\n     * loop back to {@link #animationStart} at this time. Defaults to the animation {@link Animation#duration}. */\n    animationEnd = 0;\n\n    /** The time in seconds this animation was last applied. Some timelines use this for one-time triggers. Eg, when this\n     * animation is applied, event timelines will fire all events between the `animationLast` time (exclusive) and\n     * `animationTime` (inclusive). Defaults to -1 to ensure triggers on frame 0 happen the first time this animation\n     * is applied. */\n    animationLast = 0;\n\n    nextAnimationLast = 0;\n\n    /** Seconds to postpone playing the animation. When this track entry is the current track entry, `delay`\n     * postpones incrementing the {@link #trackTime}. When this track entry is queued, `delay` is the time from\n     * the start of the previous animation to when this track entry will become the current track entry (ie when the previous\n     * track entry {@link TrackEntry#trackTime} >= this track entry's `delay`).\n     *\n     * {@link #timeScale} affects the delay. */\n    delay = 0;\n\n    /** Current time in seconds this track entry has been the current track entry. The track time determines\n     * {@link #animationTime}. The track time can be set to start the animation at a time other than 0, without affecting\n     * looping. */\n    trackTime = 0;\n\n    trackLast = 0;\n    nextTrackLast = 0;\n\n    /** The track time in seconds when this animation will be removed from the track. Defaults to the highest possible float\n     * value, meaning the animation will be applied until a new animation is set or the track is cleared. If the track end time\n     * is reached, no other animations are queued for playback, and mixing from any previous animations is complete, then the\n     * properties keyed by the animation are set to the setup pose and the track is cleared.\n     *\n     * It may be desired to use {@link AnimationState#addEmptyAnimation()} rather than have the animation\n     * abruptly cease being applied. */\n    trackEnd = 0;\n\n    /** Multiplier for the delta time when this track entry is updated, causing time for this animation to pass slower or\n     * faster. Defaults to 1.\n     *\n     * {@link #mixTime} is not affected by track entry time scale, so {@link #mixDuration} may need to be adjusted to\n     * match the animation speed.\n     *\n     * When using {@link AnimationState#addAnimation()} with a `delay` <= 0, note the\n     * {@link #delay} is set using the mix duration from the {@link AnimationStateData}, assuming time scale to be 1. If\n     * the time scale is not 1, the delay may need to be adjusted.\n     *\n     * See AnimationState {@link AnimationState#timeScale} for affecting all animations. */\n    timeScale = 0;\n\n    /** Values < 1 mix this animation with the skeleton's current pose (usually the pose resulting from lower tracks). Defaults\n     * to 1, which overwrites the skeleton's current pose with this animation.\n     *\n     * Typically track 0 is used to completely pose the skeleton, then alpha is used on higher tracks. It doesn't make sense to\n     * use alpha on track 0 if the skeleton pose is from the last frame render. */\n    alpha = 0;\n\n    /** Seconds from 0 to the {@link #getMixDuration()} when mixing from the previous animation to this animation. May be\n     * slightly more than `mixDuration` when the mix is complete. */\n    mixTime = 0;\n\n    /** Seconds for mixing from the previous animation to this animation. Defaults to the value provided by AnimationStateData\n     * {@link AnimationStateData#getMix()} based on the animation before this animation (if any).\n     *\n     * A mix duration of 0 still mixes out over one frame to provide the track entry being mixed out a chance to revert the\n     * properties it was animating.\n     *\n     * The `mixDuration` can be set manually rather than use the value from\n     * {@link AnimationStateData#getMix()}. In that case, the `mixDuration` can be set for a new\n     * track entry only before {@link AnimationState#update(float)} is first called.\n     *\n     * When using {@link AnimationState#addAnimation()} with a `delay` <= 0, note the\n     * {@link #delay} is set using the mix duration from the {@link AnimationStateData}, not a mix duration set\n     * afterward. */\n    mixDuration = 0;\n    interruptAlpha = 0;\n    totalAlpha = 0;\n\n    /** Controls how properties keyed in the animation are mixed with lower tracks. Defaults to {@link MixBlend#replace}, which\n     * replaces the values from the lower tracks with the animation values. {@link MixBlend#add} adds the animation values to\n     * the values from the lower tracks.\n     *\n     * The `mixBlend` can be set for a new track entry only before {@link AnimationState#apply()} is first\n     * called. */\n    mixBlend = MixBlend.replace;\n    timelineMode = new Array<number>();\n    timelineHoldMix = new Array<TrackEntry>();\n    timelinesRotation = new Array<number>();\n\n    reset() {\n        this.next = null;\n        this.previous = null;\n        this.mixingFrom = null;\n        this.mixingTo = null;\n        this.animation = null;\n        this.listener = null;\n        this.timelineMode.length = 0;\n        this.timelineHoldMix.length = 0;\n        this.timelinesRotation.length = 0;\n    }\n\n    /** Uses {@link #trackTime} to compute the `animationTime`, which is between {@link #animationStart}\n     * and {@link #animationEnd}. When the `trackTime` is 0, the `animationTime` is equal to the\n     * `animationStart` time. */\n    getAnimationTime() {\n        if (this.loop) {\n            const duration = this.animationEnd - this.animationStart;\n\n            if (duration == 0) return this.animationStart;\n\n            return (this.trackTime % duration) + this.animationStart;\n        }\n\n        return Math.min(this.trackTime + this.animationStart, this.animationEnd);\n    }\n\n    setAnimationLast(animationLast: number) {\n        this.animationLast = animationLast;\n        this.nextAnimationLast = animationLast;\n    }\n\n    /** Returns true if at least one loop has been completed.\n     *\n     * See {@link AnimationStateListener#complete()}. */\n    isComplete() {\n        return this.trackTime >= this.animationEnd - this.animationStart;\n    }\n\n    /** Resets the rotation directions for mixing this entry's rotate timelines. This can be useful to avoid bones rotating the\n     * long way around when using {@link #alpha} and starting animations on other tracks.\n     *\n     * Mixing with {@link MixBlend#replace} involves finding a rotation between two others, which has two possible solutions:\n     * the short way or the long way around. The two rotations likely change over time, so which direction is the short or long\n     * way also changes. If the short way was always chosen, bones would flip to the other side when that direction became the\n     * long way. TrackEntry chooses the short way the first time it is applied and remembers that direction. */\n    resetRotationDirections() {\n        this.timelinesRotation.length = 0;\n    }\n\n    getTrackComplete() {\n        const duration = this.animationEnd - this.animationStart;\n\n        if (duration != 0) {\n            if (this.loop) return duration * (1 + ((this.trackTime / duration) | 0)); // Completion of next loop.\n            if (this.trackTime < duration) return duration; // Before duration.\n        }\n\n        return this.trackTime; // Next update.\n    }\n\n    // deprecated stuff\n    onComplete: (trackIndex: number, loopCount: number) => any;\n    onEvent: (trackIndex: number, event: Event) => any;\n    onStart: (trackIndex: number) => any;\n    onEnd: (trackIndex: number) => any;\n\n    private static deprecatedWarning1: Boolean = false;\n    private static deprecatedWarning2: Boolean = false;\n\n    get time() {\n        if (!TrackEntry.deprecatedWarning1) {\n            TrackEntry.deprecatedWarning1 = true;\n            console.warn('Spine Deprecation Warning: TrackEntry.time is deprecated, please use trackTime from now on.');\n        }\n\n        return this.trackTime;\n    }\n\n    set time(value: number) {\n        if (!TrackEntry.deprecatedWarning1) {\n            TrackEntry.deprecatedWarning1 = true;\n            console.warn('Spine Deprecation Warning: TrackEntry.time is deprecated, please use trackTime from now on.');\n        }\n        this.trackTime = value;\n    }\n\n    get endTime() {\n        if (!TrackEntry.deprecatedWarning2) {\n            TrackEntry.deprecatedWarning2 = true;\n            console.warn('Spine Deprecation Warning: TrackEntry.endTime is deprecated, please use trackEnd from now on.');\n        }\n\n        return this.trackTime;\n    }\n\n    set endTime(value: number) {\n        if (!TrackEntry.deprecatedWarning2) {\n            TrackEntry.deprecatedWarning2 = true;\n            console.warn('Spine Deprecation Warning: TrackEntry.endTime is deprecated, please use trackEnd from now on.');\n        }\n        this.trackTime = value;\n    }\n\n    loopsCount() {\n        return Math.floor(this.trackTime / this.trackEnd);\n    }\n}\n\n/**\n * @public\n */\nexport class EventQueue {\n    objects: Array<any> = [];\n    drainDisabled = false;\n    animState: AnimationState;\n\n    constructor(animState: AnimationState) {\n        this.animState = animState;\n    }\n\n    start(entry: TrackEntry) {\n        this.objects.push(EventType.start);\n        this.objects.push(entry);\n        this.animState.animationsChanged = true;\n    }\n\n    interrupt(entry: TrackEntry) {\n        this.objects.push(EventType.interrupt);\n        this.objects.push(entry);\n    }\n\n    end(entry: TrackEntry) {\n        this.objects.push(EventType.end);\n        this.objects.push(entry);\n        this.animState.animationsChanged = true;\n    }\n\n    dispose(entry: TrackEntry) {\n        this.objects.push(EventType.dispose);\n        this.objects.push(entry);\n    }\n\n    complete(entry: TrackEntry) {\n        this.objects.push(EventType.complete);\n        this.objects.push(entry);\n    }\n\n    event(entry: TrackEntry, event: Event) {\n        this.objects.push(EventType.event);\n        this.objects.push(entry);\n        this.objects.push(event);\n    }\n\n    drain() {\n        if (this.drainDisabled) return;\n        this.drainDisabled = true;\n\n        const objects = this.objects;\n        const listeners = this.animState.listeners;\n\n        for (let i = 0; i < objects.length; i += 2) {\n            const type = objects[i] as EventType;\n            const entry = objects[i + 1] as TrackEntry;\n\n            switch (type) {\n                case EventType.start:\n                    if (entry.listener && entry.listener.start) entry.listener.start(entry);\n                    for (let ii = 0; ii < listeners.length; ii++) {\n                        const listener = listeners[ii];\n\n                        if (listener.start) listener.start(entry);\n                    }\n                    break;\n                case EventType.interrupt:\n                    if (entry.listener && entry.listener.interrupt) entry.listener.interrupt(entry);\n                    for (let ii = 0; ii < listeners.length; ii++) {\n                        const listener = listeners[ii];\n\n                        if (listener.interrupt) listener.interrupt(entry);\n                    }\n                    break;\n                case EventType.end:\n                    if (entry.listener && entry.listener.end) entry.listener.end(entry);\n                    for (let ii = 0; ii < listeners.length; ii++) {\n                        const listener = listeners[ii];\n\n                        if (listener.end) listener.end(entry);\n                    }\n                // Fall through.\n                case EventType.dispose:\n                    if (entry.listener && entry.listener.dispose) entry.listener.dispose(entry);\n                    for (let ii = 0; ii < listeners.length; ii++) {\n                        const listener = listeners[ii];\n\n                        if (listener.dispose) listener.dispose(entry);\n                    }\n                    this.animState.trackEntryPool.free(entry);\n                    break;\n                case EventType.complete:\n                    if (entry.listener && entry.listener.complete) entry.listener.complete(entry);\n                    for (let ii = 0; ii < listeners.length; ii++) {\n                        const listener = listeners[ii];\n\n                        if (listener.complete) listener.complete(entry);\n                    }\n                    break;\n                case EventType.event:\n                    const event = objects[i++ + 2] as Event;\n\n                    if (entry.listener && entry.listener.event) entry.listener.event(entry, event);\n                    for (let ii = 0; ii < listeners.length; ii++) {\n                        const listener = listeners[ii];\n\n                        if (listener.event) listener.event(entry, event);\n                    }\n                    break;\n            }\n        }\n        this.clear();\n\n        this.drainDisabled = false;\n    }\n\n    clear() {\n        this.objects.length = 0;\n    }\n}\n\n/**\n * @public\n */\nexport enum EventType {\n    start,\n    interrupt,\n    end,\n    dispose,\n    complete,\n    event,\n}\n\n/** The interface to implement for receiving TrackEntry events. It is always safe to call AnimationState methods when receiving\n * events.\n *\n * See TrackEntry {@link TrackEntry#listener} and AnimationState\n * {@link AnimationState#addListener()}.\n * @public\n * */\nexport interface AnimationStateListener extends IAnimationStateListener {\n    /** Invoked when this entry has been set as the current entry. */\n    start?: (entry: TrackEntry) => void;\n\n    /** Invoked when another entry has replaced this entry as the current entry. This entry may continue being applied for\n     * mixing. */\n    interrupt?: (entry: TrackEntry) => void;\n\n    /** Invoked when this entry is no longer the current entry and will never be applied again. */\n    end?: (entry: TrackEntry) => void;\n\n    /** Invoked when this entry will be disposed. This may occur without the entry ever being set as the current entry.\n     * References to the entry should not be kept after dispose is called, as it may be destroyed or reused. */\n    dispose?: (entry: TrackEntry) => void;\n\n    /** Invoked every time this entry's animation completes a loop. */\n    complete?: (entry: TrackEntry) => void;\n\n    /** Invoked when this entry's animation triggers an event. */\n    event?: (entry: TrackEntry, event: Event) => void;\n}\n\n/**\n * @public\n */\nexport abstract class AnimationStateAdapter implements AnimationStateListener {\n    start(entry: TrackEntry) {}\n\n    interrupt(entry: TrackEntry) {}\n\n    end(entry: TrackEntry) {}\n\n    dispose(entry: TrackEntry) {}\n\n    complete(entry: TrackEntry) {}\n\n    event(entry: TrackEntry, event: Event) {}\n}\n\n/** 1. A previously applied timeline has set this property.\n *\n * Result: Mix from the current pose to the timeline pose. */\nconst SUBSEQUENT = 0;\n/** 1. This is the first timeline to set this property.\n * 2. The next track entry applied after this one does not have a timeline to set this property.\n *\n * Result: Mix from the setup pose to the timeline pose. */\nconst FIRST = 1;\n/** 1) A previously applied timeline has set this property.<br>\n * 2) The next track entry to be applied does have a timeline to set this property.<br>\n * 3) The next track entry after that one does not have a timeline to set this property.<br>\n * Result: Mix from the current pose to the timeline pose, but do not mix out. This avoids \"dipping\" when crossfading\n * animations that key the same property. A subsequent timeline will set this property using a mix. */\nconst HOLD_SUBSEQUENT = 2;\n/** 1) This is the first timeline to set this property.<br>\n * 2) The next track entry to be applied does have a timeline to set this property.<br>\n * 3) The next track entry after that one does not have a timeline to set this property.<br>\n * Result: Mix from the setup pose to the timeline pose, but do not mix out. This avoids \"dipping\" when crossfading animations\n * that key the same property. A subsequent timeline will set this property using a mix. */\nconst HOLD_FIRST = 3;\n/** 1. This is the first timeline to set this property.\n * 2. The next track entry to be applied does have a timeline to set this property.\n * 3. The next track entry after that one does have a timeline to set this property.\n * 4. timelineHoldMix stores the first subsequent track entry that does not have a timeline to set this property.\n *\n * Result: The same as HOLD except the mix percentage from the timelineHoldMix track entry is used. This handles when more than\n * 2 track entries in a row have a timeline that sets the same property.\n *\n * Eg, A -> B -> C -> D where A, B, and C have a timeline setting same property, but D does not. When A is applied, to avoid\n * \"dipping\" A is not mixed out, however D (the first entry that doesn't set the property) mixing in is used to mix out A\n * (which affects B and C). Without using D to mix out, A would be applied fully until mixing completes, then snap into\n * place. */\nconst HOLD_MIX = 4;\n\nconst SETUP = 1;\nconst CURRENT = 2;\n","import type { SkeletonData } from './SkeletonData';\nimport type { IAnimationStateData, StringMap } from '@pixi-spine/base';\nimport type { Animation } from './Animation';\n\n/** Stores mix (crossfade) durations to be applied when {@link AnimationState} animations are changed.\n * @public\n * */\nexport class AnimationStateData implements IAnimationStateData<SkeletonData, Animation> {\n    /** The SkeletonData to look up animations when they are specified by name. */\n    skeletonData: SkeletonData;\n\n    animationToMixTime: StringMap<number> = {};\n\n    /** The mix duration to use when no mix duration has been defined between two animations. */\n    defaultMix = 0;\n\n    constructor(skeletonData: SkeletonData) {\n        if (!skeletonData) throw new Error('skeletonData cannot be null.');\n        this.skeletonData = skeletonData;\n    }\n\n    /** Sets a mix duration by animation name.\n     *\n     * See {@link #setMixWith()}. */\n    setMix(fromName: string, toName: string, duration: number) {\n        const from = this.skeletonData.findAnimation(fromName);\n\n        if (!from) throw new Error(`Animation not found: ${fromName}`);\n        const to = this.skeletonData.findAnimation(toName);\n\n        if (!to) throw new Error(`Animation not found: ${toName}`);\n        this.setMixWith(from, to, duration);\n    }\n\n    /** Sets the mix duration when changing from the specified animation to the other.\n     *\n     * See {@link TrackEntry#mixDuration}. */\n    setMixWith(from: Animation, to: Animation, duration: number) {\n        if (!from) throw new Error('from cannot be null.');\n        if (!to) throw new Error('to cannot be null.');\n        const key = `${from.name}.${to.name}`;\n\n        this.animationToMixTime[key] = duration;\n    }\n\n    /** Returns the mix duration to use when changing from the specified animation to the other, or the {@link #defaultMix} if\n     * no mix duration has been set. */\n    getMix(from: Animation, to: Animation) {\n        const key = `${from.name}.${to.name}`;\n        const value = this.animationToMixTime[key];\n\n        return value === undefined ? this.defaultMix : value;\n    }\n}\n","import { AttachmentLoader, RegionAttachment, MeshAttachment, BoundingBoxAttachment, PathAttachment, PointAttachment, ClippingAttachment, Sequence } from './attachments';\nimport type { TextureAtlas } from '@pixi-spine/base';\nimport type { Skin } from './Skin';\n\n/**\n * @public\n */\nexport class AtlasAttachmentLoader implements AttachmentLoader {\n    atlas: TextureAtlas;\n\n    constructor(atlas: TextureAtlas) {\n        this.atlas = atlas;\n    }\n\n    loadSequence(name: string, basePath: string, sequence: Sequence) {\n        const regions = sequence.regions;\n\n        for (let i = 0, n = regions.length; i < n; i++) {\n            const path = sequence.getPath(basePath, i);\n            const region = this.atlas.findRegion(path);\n\n            if (region == null) throw new Error(`Region not found in atlas: ${path} (sequence: ${name})`);\n            regions[i] = region;\n            regions[i].renderObject = regions[i];\n        }\n    }\n\n    newRegionAttachment(skin: Skin, name: string, path: string, sequence: Sequence): RegionAttachment {\n        const attachment = new RegionAttachment(name, path);\n\n        if (sequence != null) {\n            this.loadSequence(name, path, sequence);\n        } else {\n            const region = this.atlas.findRegion(path);\n\n            if (!region) throw new Error(`Region not found in atlas: ${path} (region attachment: ${name})`);\n            region.renderObject = region;\n            attachment.region = region;\n        }\n\n        return attachment;\n    }\n\n    newMeshAttachment(skin: Skin, name: string, path: string, sequence: Sequence): MeshAttachment {\n        const attachment = new MeshAttachment(name, path);\n\n        if (sequence != null) {\n            this.loadSequence(name, path, sequence);\n        } else {\n            const region = this.atlas.findRegion(path);\n\n            if (!region) throw new Error(`Region not found in atlas: ${path} (mesh attachment: ${name})`);\n            region.renderObject = region;\n            attachment.region = region;\n        }\n\n        return attachment;\n    }\n\n    newBoundingBoxAttachment(skin: Skin, name: string): BoundingBoxAttachment {\n        return new BoundingBoxAttachment(name);\n    }\n\n    newPathAttachment(skin: Skin, name: string): PathAttachment {\n        return new PathAttachment(name);\n    }\n\n    newPointAttachment(skin: Skin, name: string): PointAttachment {\n        return new PointAttachment(name);\n    }\n\n    newClippingAttachment(skin: Skin, name: string): ClippingAttachment {\n        return new ClippingAttachment(name);\n    }\n}\n","import { Matrix } from '@pixi/core';\nimport type { Updatable } from './Updatable';\nimport type { BoneData } from './BoneData';\nimport type { Skeleton } from './Skeleton';\nimport { IBone, MathUtils, settings, TransformMode, Vector2 } from '@pixi-spine/base';\n\n/** Stores a bone's current pose.\n *\n * A bone has a local transform which is used to compute its world transform. A bone also has an applied transform, which is a\n * local transform that can be applied to compute the world transform. The local transform and applied transform may differ if a\n * constraint or application code modifies the world transform after it was computed from the local transform.\n * @public\n * */\nexport class Bone implements Updatable, IBone {\n    // be careful! Spine b,c is c,b in pixi matrix\n    matrix = new Matrix();\n\n    get worldX(): number {\n        return this.matrix.tx;\n    }\n\n    get worldY(): number {\n        return this.matrix.ty;\n    }\n\n    /** The bone's setup pose data. */\n    data: BoneData;\n\n    /** The skeleton this bone belongs to. */\n    skeleton: Skeleton;\n\n    /** The parent bone, or null if this is the root bone. */\n    parent: Bone | null = null;\n\n    /** The immediate children of this bone. */\n    children = new Array<Bone>();\n\n    /** The local x translation. */\n    x = 0;\n\n    /** The local y translation. */\n    y = 0;\n\n    /** The local rotation in degrees, counter clockwise. */\n    rotation = 0;\n\n    /** The local scaleX. */\n    scaleX = 0;\n\n    /** The local scaleY. */\n    scaleY = 0;\n\n    /** The local shearX. */\n    shearX = 0;\n\n    /** The local shearY. */\n    shearY = 0;\n\n    /** The applied local x translation. */\n    ax = 0;\n\n    /** The applied local y translation. */\n    ay = 0;\n\n    /** The applied local rotation in degrees, counter clockwise. */\n    arotation = 0;\n\n    /** The applied local scaleX. */\n    ascaleX = 0;\n\n    /** The applied local scaleY. */\n    ascaleY = 0;\n\n    /** The applied local shearX. */\n    ashearX = 0;\n\n    /** The applied local shearY. */\n    ashearY = 0;\n\n    sorted = false;\n    active = false;\n\n    /** @param parent May be null. */\n    constructor(data: BoneData, skeleton: Skeleton, parent: Bone | null) {\n        if (!data) throw new Error('data cannot be null.');\n        if (!skeleton) throw new Error('skeleton cannot be null.');\n        this.data = data;\n        this.skeleton = skeleton;\n        this.parent = parent;\n        this.setToSetupPose();\n    }\n\n    /** Returns false when the bone has not been computed because {@link BoneData#skinRequired} is true and the\n     * {@link Skeleton#skin active skin} does not {@link Skin#bones contain} this bone. */\n    isActive() {\n        return this.active;\n    }\n\n    /** Computes the world transform using the parent bone and this bone's local applied transform. */\n    update() {\n        this.updateWorldTransformWith(this.ax, this.ay, this.arotation, this.ascaleX, this.ascaleY, this.ashearX, this.ashearY);\n    }\n\n    /** Computes the world transform using the parent bone and this bone's local transform.\n     *\n     * See {@link #updateWorldTransformWith()}. */\n    updateWorldTransform() {\n        this.updateWorldTransformWith(this.x, this.y, this.rotation, this.scaleX, this.scaleY, this.shearX, this.shearY);\n    }\n\n    /** Computes the world transform using the parent bone and the specified local transform. The applied transform is set to the\n     * specified local transform. Child bones are not updated.\n     *\n     * See [World transforms](http://esotericsoftware.com/spine-runtime-skeletons#World-transforms) in the Spine\n     * Runtimes Guide. */\n    updateWorldTransformWith(x: number, y: number, rotation: number, scaleX: number, scaleY: number, shearX: number, shearY: number) {\n        this.ax = x;\n        this.ay = y;\n        this.arotation = rotation;\n        this.ascaleX = scaleX;\n        this.ascaleY = scaleY;\n        this.ashearX = shearX;\n        this.ashearY = shearY;\n\n        const parent = this.parent;\n        const m = this.matrix;\n\n        const sx = this.skeleton.scaleX;\n        const sy = settings.yDown ? -this.skeleton.scaleY : this.skeleton.scaleY;\n\n        if (!parent) {\n            // Root bone.\n            const skeleton = this.skeleton;\n            const rotationY = rotation + 90 + shearY;\n\n            m.a = MathUtils.cosDeg(rotation + shearX) * scaleX * sx;\n            m.c = MathUtils.cosDeg(rotationY) * scaleY * sx;\n            m.b = MathUtils.sinDeg(rotation + shearX) * scaleX * sy;\n            m.d = MathUtils.sinDeg(rotationY) * scaleY * sy;\n            m.tx = x * sx + skeleton.x;\n            m.ty = y * sy + skeleton.y;\n\n            return;\n        }\n\n        let pa = parent.matrix.a;\n        let pb = parent.matrix.c;\n        let pc = parent.matrix.b;\n        let pd = parent.matrix.d;\n\n        m.tx = pa * x + pb * y + parent.matrix.tx;\n        m.ty = pc * x + pd * y + parent.matrix.ty;\n\n        switch (this.data.transformMode) {\n            case TransformMode.Normal: {\n                const rotationY = rotation + 90 + shearY;\n                const la = MathUtils.cosDeg(rotation + shearX) * scaleX;\n                const lb = MathUtils.cosDeg(rotationY) * scaleY;\n                const lc = MathUtils.sinDeg(rotation + shearX) * scaleX;\n                const ld = MathUtils.sinDeg(rotationY) * scaleY;\n\n                m.a = pa * la + pb * lc;\n                m.c = pa * lb + pb * ld;\n                m.b = pc * la + pd * lc;\n                m.d = pc * lb + pd * ld;\n\n                return;\n            }\n            case TransformMode.OnlyTranslation: {\n                const rotationY = rotation + 90 + shearY;\n\n                m.a = MathUtils.cosDeg(rotation + shearX) * scaleX;\n                m.c = MathUtils.cosDeg(rotationY) * scaleY;\n                m.b = MathUtils.sinDeg(rotation + shearX) * scaleX;\n                m.d = MathUtils.sinDeg(rotationY) * scaleY;\n                break;\n            }\n            case TransformMode.NoRotationOrReflection: {\n                let s = pa * pa + pc * pc;\n                let prx = 0;\n\n                if (s > 0.0001) {\n                    s = Math.abs(pa * pd - pb * pc) / s;\n                    pa /= sx;\n                    pc /= sy;\n                    pb = pc * s;\n                    pd = pa * s;\n                    prx = Math.atan2(pc, pa) * MathUtils.radDeg;\n                } else {\n                    pa = 0;\n                    pc = 0;\n                    prx = 90 - Math.atan2(pd, pb) * MathUtils.radDeg;\n                }\n                const rx = rotation + shearX - prx;\n                const ry = rotation + shearY - prx + 90;\n                const la = MathUtils.cosDeg(rx) * scaleX;\n                const lb = MathUtils.cosDeg(ry) * scaleY;\n                const lc = MathUtils.sinDeg(rx) * scaleX;\n                const ld = MathUtils.sinDeg(ry) * scaleY;\n\n                m.a = pa * la - pb * lc;\n                m.c = pa * lb - pb * ld;\n                m.b = pc * la + pd * lc;\n                m.d = pc * lb + pd * ld;\n                break;\n            }\n            case TransformMode.NoScale:\n            case TransformMode.NoScaleOrReflection: {\n                const cos = MathUtils.cosDeg(rotation);\n                const sin = MathUtils.sinDeg(rotation);\n                let za = (pa * cos + pb * sin) / sx;\n                let zc = (pc * cos + pd * sin) / sy;\n                let s = Math.sqrt(za * za + zc * zc);\n\n                if (s > 0.00001) s = 1 / s;\n                za *= s;\n                zc *= s;\n                s = Math.sqrt(za * za + zc * zc);\n                if (this.data.transformMode == TransformMode.NoScale && pa * pd - pb * pc < 0 != (sx < 0 != sy < 0)) s = -s;\n                const r = Math.PI / 2 + Math.atan2(zc, za);\n                const zb = Math.cos(r) * s;\n                const zd = Math.sin(r) * s;\n                const la = MathUtils.cosDeg(shearX) * scaleX;\n                const lb = MathUtils.cosDeg(90 + shearY) * scaleY;\n                const lc = MathUtils.sinDeg(shearX) * scaleX;\n                const ld = MathUtils.sinDeg(90 + shearY) * scaleY;\n\n                m.a = za * la + zb * lc;\n                m.c = za * lb + zb * ld;\n                m.b = zc * la + zd * lc;\n                m.d = zc * lb + zd * ld;\n                break;\n            }\n        }\n        m.a *= sx;\n        m.c *= sx;\n        m.b *= sy;\n        m.d *= sy;\n    }\n\n    /** Sets this bone's local transform to the setup pose. */\n    setToSetupPose() {\n        const data = this.data;\n\n        this.x = data.x;\n        this.y = data.y;\n        this.rotation = data.rotation;\n        this.scaleX = data.scaleX;\n        this.scaleY = data.scaleY;\n        this.shearX = data.shearX;\n        this.shearY = data.shearY;\n    }\n\n    /** The world rotation for the X axis, calculated using {@link #a} and {@link #c}. */\n    getWorldRotationX() {\n        return Math.atan2(this.matrix.b, this.matrix.a) * MathUtils.radDeg;\n    }\n\n    /** The world rotation for the Y axis, calculated using {@link #b} and {@link #d}. */\n    getWorldRotationY() {\n        return Math.atan2(this.matrix.d, this.matrix.c) * MathUtils.radDeg;\n    }\n\n    /** The magnitude (always positive) of the world scale X, calculated using {@link #a} and {@link #c}. */\n    getWorldScaleX() {\n        const m = this.matrix;\n\n        return Math.sqrt(m.a * m.a + m.b * m.b);\n    }\n\n    /** The magnitude (always positive) of the world scale Y, calculated using {@link #b} and {@link #d}. */\n    getWorldScaleY() {\n        const m = this.matrix;\n\n        return Math.sqrt(m.c * m.c + m.d * m.d);\n    }\n\n    /** Computes the applied transform values from the world transform.\n     *\n     * If the world transform is modified (by a constraint, {@link #rotateWorld(float)}, etc) then this method should be called so\n     * the applied transform matches the world transform. The applied transform may be needed by other code (eg to apply other\n     * constraints).\n     *\n     * Some information is ambiguous in the world transform, such as -1,-1 scale versus 180 rotation. The applied transform after\n     * calling this method is equivalent to the local transform used to compute the world transform, but may not be identical. */\n    updateAppliedTransform() {\n        const parent = this.parent;\n        const m = this.matrix;\n\n        if (!parent) {\n            this.ax = m.tx - this.skeleton.x;\n            this.ay = m.ty - this.skeleton.y;\n            this.arotation = Math.atan2(m.b, m.a) * MathUtils.radDeg;\n            this.ascaleX = Math.sqrt(m.a * m.a + m.b * m.b);\n            this.ascaleY = Math.sqrt(m.c * m.c + m.d * m.d);\n            this.ashearX = 0;\n            this.ashearY = Math.atan2(m.a * m.c + m.b * m.d, m.a * m.d - m.b * m.c) * MathUtils.radDeg;\n\n            return;\n        }\n        const pm = parent.matrix;\n        const pid = 1 / (pm.a * pm.d - pm.b * pm.c);\n        const dx = m.tx - pm.tx;\n        const dy = m.ty - pm.ty;\n\n        this.ax = dx * pm.d * pid - dy * pm.c * pid;\n        this.ay = dy * pm.a * pid - dx * pm.b * pid;\n        const ia = pid * pm.d;\n        const id = pid * pm.a;\n        const ib = pid * pm.c;\n        const ic = pid * pm.b;\n        const ra = ia * m.a - ib * m.b;\n        const rb = ia * m.c - ib * m.d;\n        const rc = id * m.b - ic * m.a;\n        const rd = id * m.d - ic * m.c;\n\n        this.ashearX = 0;\n        this.ascaleX = Math.sqrt(ra * ra + rc * rc);\n        if (this.ascaleX > 0.0001) {\n            const det = ra * rd - rb * rc;\n\n            this.ascaleY = det / this.ascaleX;\n            this.ashearY = Math.atan2(ra * rb + rc * rd, det) * MathUtils.radDeg;\n            this.arotation = Math.atan2(rc, ra) * MathUtils.radDeg;\n        } else {\n            this.ascaleX = 0;\n            this.ascaleY = Math.sqrt(rb * rb + rd * rd);\n            this.ashearY = 0;\n            this.arotation = 90 - Math.atan2(rd, rb) * MathUtils.radDeg;\n        }\n    }\n\n    /** Transforms a point from world coordinates to the bone's local coordinates. */\n    worldToLocal(world: Vector2) {\n        const m = this.matrix;\n        const a = m.a;\n        const b = m.c;\n        const c = m.b;\n        const d = m.d;\n        const invDet = 1 / (a * d - b * c);\n        const x = world.x - m.tx;\n        const y = world.y - m.ty;\n\n        world.x = x * d * invDet - y * b * invDet;\n        world.y = y * a * invDet - x * c * invDet;\n\n        return world;\n    }\n\n    /** Transforms a point from the bone's local coordinates to world coordinates. */\n    localToWorld(local: Vector2) {\n        const m = this.matrix;\n        const x = local.x;\n        const y = local.y;\n\n        local.x = x * m.a + y * m.c + m.tx;\n        local.y = x * m.b + y * m.d + m.ty;\n\n        return local;\n    }\n\n    /** Transforms a world rotation to a local rotation. */\n    worldToLocalRotation(worldRotation: number) {\n        const sin = MathUtils.sinDeg(worldRotation);\n        const cos = MathUtils.cosDeg(worldRotation);\n        const mat = this.matrix;\n\n        return Math.atan2(mat.a * sin - mat.b * cos, mat.d * cos - mat.c * sin) * MathUtils.radDeg;\n    }\n\n    /** Transforms a local rotation to a world rotation. */\n    localToWorldRotation(localRotation: number) {\n        localRotation -= this.rotation - this.shearX;\n        const sin = MathUtils.sinDeg(localRotation);\n        const cos = MathUtils.cosDeg(localRotation);\n        const mat = this.matrix;\n\n        return Math.atan2(cos * mat.b + sin * mat.d, cos * mat.a + sin * mat.c) * MathUtils.radDeg;\n    }\n\n    /** Rotates the world transform the specified amount.\n     * <p>\n     * After changes are made to the world transform, {@link #updateAppliedTransform()} should be called and {@link #update()} will\n     * need to be called on any child bones, recursively. */\n    rotateWorld(degrees: number) {\n        const mat = this.matrix;\n        const a = mat.a;\n        const b = mat.c;\n        const c = mat.b;\n        const d = mat.d;\n        const cos = MathUtils.cosDeg(degrees);\n        const sin = MathUtils.sinDeg(degrees);\n\n        mat.a = cos * a - sin * c;\n        mat.c = cos * b - sin * d;\n        mat.b = sin * a + cos * c;\n        mat.d = sin * b + cos * d;\n    }\n}\n","import { Color, TransformMode } from '@pixi-spine/base';\n\n/** Stores the setup pose for a {@link Bone}.\n * @public\n * */\nexport class BoneData {\n    /** The index of the bone in {@link Skeleton#getBones()}. */\n    index = 0;\n\n    /** The name of the bone, which is unique across all bones in the skeleton. */\n    name: string;\n\n    /** @returns May be null. */\n    parent: BoneData | null = null;\n\n    /** The bone's length. */\n    length = 0;\n\n    /** The local x translation. */\n    x = 0;\n\n    /** The local y translation. */\n    y = 0;\n\n    /** The local rotation. */\n    rotation = 0;\n\n    /** The local scaleX. */\n    scaleX = 1;\n\n    /** The local scaleY. */\n    scaleY = 1;\n\n    /** The local shearX. */\n    shearX = 0;\n\n    /** The local shearX. */\n    shearY = 0;\n\n    /** The transform mode for how parent world transforms affect this bone. */\n    transformMode = TransformMode.Normal;\n\n    /** When true, {@link Skeleton#updateWorldTransform()} only updates this bone if the {@link Skeleton#skin} contains this\n     * bone.\n     * @see Skin#bones */\n    skinRequired = false;\n\n    /** The color of the bone as it was in Spine. Available only when nonessential data was exported. Bones are not usually\n     * rendered at runtime. */\n    color = new Color();\n\n    constructor(index: number, name: string, parent: BoneData | null) {\n        if (index < 0) throw new Error('index must be >= 0.');\n        if (!name) throw new Error('name cannot be null.');\n        this.index = index;\n        this.name = name;\n        this.parent = parent;\n    }\n}\n","/** The base class for all constraint datas.\n * @public\n * */\nexport abstract class ConstraintData {\n    constructor(public name: string, public order: number, public skinRequired: boolean) {}\n}\n","import type { EventData } from './EventData';\nimport type { IEvent } from '@pixi-spine/base';\n\n/** Stores the current pose values for an {@link Event}.\n *\n * See Timeline {@link Timeline#apply()},\n * AnimationStateListener {@link AnimationStateListener#event()}, and\n * [Events](http://esotericsoftware.com/spine-events) in the Spine User Guide.\n * @public\n * */\nexport class Event implements IEvent {\n    data: EventData;\n    intValue = 0;\n    floatValue = 0;\n    stringValue: string | null = null;\n    time = 0;\n    volume = 0;\n    balance = 0;\n\n    constructor(time: number, data: EventData) {\n        if (!data) throw new Error('data cannot be null.');\n        this.time = time;\n        this.data = data;\n    }\n}\n","import type { IEventData } from '@pixi-spine/base';\n\n/** Stores the setup pose values for an {@link Event}.\n *\n * See [Events](http://esotericsoftware.com/spine-events) in the Spine User Guide.\n * @public\n * */\nexport class EventData implements IEventData {\n    name: string;\n    intValue = 0;\n    floatValue = 0;\n    stringValue: string | null = null;\n    audioPath: string | null = null;\n    volume = 0;\n    balance = 0;\n\n    constructor(name: string) {\n        this.name = name;\n    }\n}\n","import type { Updatable } from './Updatable';\nimport type { IkConstraintData } from './IkConstraintData';\nimport type { Bone } from './Bone';\nimport type { Skeleton } from './Skeleton';\nimport { MathUtils, settings, TransformMode } from '@pixi-spine/base';\n\n/** Stores the current pose for an IK constraint. An IK constraint adjusts the rotation of 1 or 2 constrained bones so the tip of\n * the last bone is as close to the target bone as possible.\n *\n * See [IK constraints](http://esotericsoftware.com/spine-ik-constraints) in the Spine User Guide.\n * @public\n * */\nexport class IkConstraint implements Updatable {\n    /** The IK constraint's setup pose data. */\n    data: IkConstraintData;\n\n    /** The bones that will be modified by this IK constraint. */\n    bones: Array<Bone>;\n\n    /** The bone that is the IK target. */\n    target: Bone;\n\n    /** Controls the bend direction of the IK bones, either 1 or -1. */\n    bendDirection = 0;\n\n    /** When true and only a single bone is being constrained, if the target is too close, the bone is scaled to reach it. */\n    compress = false;\n\n    /** When true, if the target is out of range, the parent bone is scaled to reach it. If more than one bone is being constrained\n     * and the parent bone has local nonuniform scale, stretch is not applied. */\n    stretch = false;\n\n    /** A percentage (0-1) that controls the mix between the constrained and unconstrained rotations. */\n    mix = 1;\n\n    /** For two bone IK, the distance from the maximum reach of the bones that rotation will slow. */\n    softness = 0;\n    active = false;\n\n    constructor(data: IkConstraintData, skeleton: Skeleton) {\n        if (!data) throw new Error('data cannot be null.');\n        if (!skeleton) throw new Error('skeleton cannot be null.');\n        this.data = data;\n        this.mix = data.mix;\n        this.softness = data.softness;\n        this.bendDirection = data.bendDirection;\n        this.compress = data.compress;\n        this.stretch = data.stretch;\n\n        this.bones = new Array<Bone>();\n        for (let i = 0; i < data.bones.length; i++) {\n            const bone = skeleton.findBone(data.bones[i].name);\n\n            if (!bone) throw new Error(`Couldn't find bone ${data.bones[i].name}`);\n            this.bones.push(bone);\n        }\n        const target = skeleton.findBone(data.target.name);\n\n        if (!target) throw new Error(`Couldn't find bone ${data.target.name}`);\n        this.target = target;\n    }\n\n    isActive() {\n        return this.active;\n    }\n\n    update() {\n        if (this.mix == 0) return;\n        const target = this.target;\n        const bones = this.bones;\n\n        switch (bones.length) {\n            case 1:\n                this.apply1(bones[0], target.worldX, target.worldY, this.compress, this.stretch, this.data.uniform, this.mix);\n                break;\n            case 2:\n                this.apply2(bones[0], bones[1], target.worldX, target.worldY, this.bendDirection, this.stretch, this.data.uniform, this.softness, this.mix);\n                break;\n        }\n    }\n\n    /** Applies 1 bone IK. The target is specified in the world coordinate system. */\n    apply1(bone: Bone, targetX: number, targetY: number, compress: boolean, stretch: boolean, uniform: boolean, alpha: number) {\n        const p = bone.parent.matrix;\n\n        if (!p) throw new Error('IK bone must have parent.');\n        const pa = p.a;\n        let pb = p.c;\n        const pc = p.b;\n        let pd = p.d;\n        let rotationIK = -bone.ashearX - bone.arotation;\n        let tx = 0;\n        let ty = 0;\n\n        const skelX = bone.skeleton.scaleX;\n        const skelY = settings.yDown ? -bone.skeleton.scaleY : bone.skeleton.scaleY;\n\n        switch (bone.data.transformMode) {\n            case TransformMode.OnlyTranslation:\n                tx = (targetX - bone.worldX) * MathUtils.signum(skelX);\n                ty = (targetY - bone.worldY) * MathUtils.signum(skelY);\n                break;\n            case TransformMode.NoRotationOrReflection:\n                const s = Math.abs(pa * pd - pb * pc) / (pa * pa + pc * pc);\n                const sa = pa / skelX;\n                const sc = pc / skelY;\n\n                pb = -sc * s * skelX;\n                pd = sa * s * skelY;\n                rotationIK += Math.atan2(sc, sa) * MathUtils.radDeg;\n            // Fall through\n            default:\n                const x = targetX - p.tx;\n                const y = targetY - p.ty;\n                const d = pa * pd - pb * pc;\n\n                tx = (x * pd - y * pb) / d - bone.ax;\n                ty = (y * pa - x * pc) / d - bone.ay;\n        }\n        rotationIK += Math.atan2(ty, tx) * MathUtils.radDeg;\n        if (bone.ascaleX < 0) rotationIK += 180;\n        if (rotationIK > 180) rotationIK -= 360;\n        else if (rotationIK < -180) rotationIK += 360;\n        let sx = bone.ascaleX;\n        let sy = bone.ascaleY;\n\n        if (compress || stretch) {\n            switch (bone.data.transformMode) {\n                case TransformMode.NoScale:\n                case TransformMode.NoScaleOrReflection:\n                    tx = targetX - bone.worldX;\n                    ty = targetY - bone.worldY;\n            }\n            const b = bone.data.length * sx;\n            const dd = Math.sqrt(tx * tx + ty * ty);\n\n            if ((compress && dd < b) || (stretch && dd > b && b > 0.0001)) {\n                const s = (dd / b - 1) * alpha + 1;\n\n                sx *= s;\n                if (uniform) sy *= s;\n            }\n        }\n        bone.updateWorldTransformWith(bone.ax, bone.ay, bone.arotation + rotationIK * alpha, sx, sy, bone.ashearX, bone.ashearY);\n    }\n\n    /** Applies 2 bone IK. The target is specified in the world coordinate system.\n     * @param child A direct descendant of the parent bone. */\n    apply2(parent: Bone, child: Bone, targetX: number, targetY: number, bendDir: number, stretch: boolean, uniform: boolean, softness: number, alpha: number) {\n        const px = parent.ax;\n        const py = parent.ay;\n        let psx = parent.ascaleX;\n        let psy = parent.ascaleY;\n        let sx = psx;\n        let sy = psy;\n        let csx = child.ascaleX;\n        const pmat = parent.matrix;\n        let os1 = 0;\n        let os2 = 0;\n        let s2 = 0;\n\n        if (psx < 0) {\n            psx = -psx;\n            os1 = 180;\n            s2 = -1;\n        } else {\n            os1 = 0;\n            s2 = 1;\n        }\n        if (psy < 0) {\n            psy = -psy;\n            s2 = -s2;\n        }\n        if (csx < 0) {\n            csx = -csx;\n            os2 = 180;\n        } else os2 = 0;\n        const cx = child.ax;\n        let cy = 0;\n        let cwx = 0;\n        let cwy = 0;\n        let a = pmat.a;\n        let b = pmat.c;\n        let c = pmat.b;\n        let d = pmat.d;\n        const u = Math.abs(psx - psy) <= 0.0001;\n\n        if (!u || stretch) {\n            cy = 0;\n            cwx = a * cx + pmat.tx;\n            cwy = c * cx + pmat.ty;\n        } else {\n            cy = child.ay;\n            cwx = a * cx + b * cy + pmat.tx;\n            cwy = c * cx + d * cy + pmat.ty;\n        }\n        const pp = parent.parent.matrix;\n\n        if (!pp) throw new Error('IK parent must itself have a parent.');\n        a = pp.a;\n        b = pp.c;\n        c = pp.b;\n        d = pp.d;\n        const id = 1 / (a * d - b * c);\n        let x = cwx - pp.tx;\n        let y = cwy - pp.ty;\n        const dx = (x * d - y * b) * id - px;\n        const dy = (y * a - x * c) * id - py;\n        const l1 = Math.sqrt(dx * dx + dy * dy);\n        let l2 = child.data.length * csx;\n        let a1;\n        let a2;\n\n        if (l1 < 0.0001) {\n            this.apply1(parent, targetX, targetY, false, stretch, false, alpha);\n            child.updateWorldTransformWith(cx, cy, 0, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY);\n\n            return;\n        }\n        x = targetX - pp.tx;\n        y = targetY - pp.ty;\n        let tx = (x * d - y * b) * id - px;\n        let ty = (y * a - x * c) * id - py;\n        let dd = tx * tx + ty * ty;\n\n        if (softness != 0) {\n            softness *= psx * (csx + 1) * 0.5;\n            const td = Math.sqrt(dd);\n            const sd = td - l1 - l2 * psx + softness;\n\n            if (sd > 0) {\n                let p = Math.min(1, sd / (softness * 2)) - 1;\n\n                p = (sd - softness * (1 - p * p)) / td;\n                tx -= p * tx;\n                ty -= p * ty;\n                dd = tx * tx + ty * ty;\n            }\n        }\n        // eslint-disable-next-line no-restricted-syntax, no-labels\n        outer: if (u) {\n            l2 *= psx;\n            let cos = (dd - l1 * l1 - l2 * l2) / (2 * l1 * l2);\n\n            if (cos < -1) {\n                cos = -1;\n                a2 = Math.PI * bendDir;\n            } else if (cos > 1) {\n                cos = 1;\n                a2 = 0;\n                if (stretch) {\n                    a = (Math.sqrt(dd) / (l1 + l2) - 1) * alpha + 1;\n                    sx *= a;\n                    if (uniform) sy *= a;\n                }\n            } else a2 = Math.acos(cos) * bendDir;\n            a = l1 + l2 * cos;\n            b = l2 * Math.sin(a2);\n            a1 = Math.atan2(ty * a - tx * b, tx * a + ty * b);\n        } else {\n            a = psx * l2;\n            b = psy * l2;\n            const aa = a * a;\n            const bb = b * b;\n            const ta = Math.atan2(ty, tx);\n\n            c = bb * l1 * l1 + aa * dd - aa * bb;\n            const c1 = -2 * bb * l1;\n            const c2 = bb - aa;\n\n            d = c1 * c1 - 4 * c2 * c;\n            if (d >= 0) {\n                let q = Math.sqrt(d);\n\n                if (c1 < 0) q = -q;\n                q = -(c1 + q) * 0.5;\n                const r0 = q / c2;\n                const r1 = c / q;\n                const r = Math.abs(r0) < Math.abs(r1) ? r0 : r1;\n\n                if (r * r <= dd) {\n                    y = Math.sqrt(dd - r * r) * bendDir;\n                    a1 = ta - Math.atan2(y, r);\n                    a2 = Math.atan2(y / psy, (r - l1) / psx);\n                    // eslint-disable-next-line no-labels\n                    break outer;\n                }\n            }\n            let minAngle = MathUtils.PI;\n            let minX = l1 - a;\n            let minDist = minX * minX;\n            let minY = 0;\n            let maxAngle = 0;\n            let maxX = l1 + a;\n            let maxDist = maxX * maxX;\n            let maxY = 0;\n\n            c = (-a * l1) / (aa - bb);\n            if (c >= -1 && c <= 1) {\n                c = Math.acos(c);\n                x = a * Math.cos(c) + l1;\n                y = b * Math.sin(c);\n                d = x * x + y * y;\n                if (d < minDist) {\n                    minAngle = c;\n                    minDist = d;\n                    minX = x;\n                    minY = y;\n                }\n                if (d > maxDist) {\n                    maxAngle = c;\n                    maxDist = d;\n                    maxX = x;\n                    maxY = y;\n                }\n            }\n            if (dd <= (minDist + maxDist) * 0.5) {\n                a1 = ta - Math.atan2(minY * bendDir, minX);\n                a2 = minAngle * bendDir;\n            } else {\n                a1 = ta - Math.atan2(maxY * bendDir, maxX);\n                a2 = maxAngle * bendDir;\n            }\n        }\n        const os = Math.atan2(cy, cx) * s2;\n        let rotation = parent.arotation;\n\n        a1 = (a1 - os) * MathUtils.radDeg + os1 - rotation;\n        if (a1 > 180) a1 -= 360;\n        else if (a1 < -180)\n            //\n            a1 += 360;\n        parent.updateWorldTransformWith(px, py, rotation + a1 * alpha, sx, sy, 0, 0);\n        rotation = child.arotation;\n        a2 = ((a2 + os) * MathUtils.radDeg - child.ashearX) * s2 + os2 - rotation;\n        if (a2 > 180) a2 -= 360;\n        else if (a2 < -180)\n            //\n            a2 += 360;\n        child.updateWorldTransformWith(cx, cy, rotation + a2 * alpha, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY);\n    }\n}\n","import { ConstraintData } from './ConstraintData';\nimport type { BoneData } from './BoneData';\n\n/** Stores the setup pose for an {@link IkConstraint}.\n * <p>\n * See [IK constraints](http://esotericsoftware.com/spine-ik-constraints) in the Spine User Guide.\n * @public\n * */\nexport class IkConstraintData extends ConstraintData {\n    /** The bones that are constrained by this IK constraint. */\n    bones = new Array<BoneData>();\n\n    /** The bone that is the IK target. */\n    private _target: BoneData | null = null;\n    public set target(boneData: BoneData) {\n        this._target = boneData;\n    }\n    public get target() {\n        if (!this._target) throw new Error('BoneData not set.');\n        else return this._target;\n    }\n\n    /** Controls the bend direction of the IK bones, either 1 or -1. */\n    bendDirection = 1;\n\n    /** When true and only a single bone is being constrained, if the target is too close, the bone is scaled to reach it. */\n    compress = false;\n\n    /** When true, if the target is out of range, the parent bone is scaled to reach it. If more than one bone is being constrained\n     * and the parent bone has local nonuniform scale, stretch is not applied. */\n    stretch = false;\n\n    /** When true, only a single bone is being constrained, and {@link #getCompress()} or {@link #getStretch()} is used, the bone\n     * is scaled on both the X and Y axes. */\n    uniform = false;\n\n    /** A percentage (0-1) that controls the mix between the constrained and unconstrained rotations. */\n    mix = 1;\n\n    /** For two bone IK, the distance from the maximum reach of the bones that rotation will slow. */\n    softness = 0;\n\n    constructor(name: string) {\n        super(name, 0, false);\n    }\n}\n","import { ConstraintData } from './ConstraintData';\nimport type { SlotData } from './SlotData';\nimport type { BoneData } from './BoneData';\nimport { PositionMode, RotateMode } from '@pixi-spine/base';\n\n/** Stores the setup pose for a {@link PathConstraint}.\n *\n * See [Path constraints](http://esotericsoftware.com/spine-path-constraints) in the Spine User Guide.\n * @public\n * */\nexport class PathConstraintData extends ConstraintData {\n    /** The bones that will be modified by this path constraint. */\n    bones = new Array<BoneData>();\n\n    /** The slot whose path attachment will be used to constrained the bones. */\n    private _target: SlotData | null = null;\n    public set target(slotData: SlotData) {\n        this._target = slotData;\n    }\n    public get target() {\n        if (!this._target) throw new Error('SlotData not set.');\n        else return this._target;\n    }\n\n    /** The mode for positioning the first bone on the path. */\n    positionMode: PositionMode = PositionMode.Fixed;\n\n    /** The mode for positioning the bones after the first bone on the path. */\n    spacingMode: SpacingMode = SpacingMode.Fixed;\n\n    /** The mode for adjusting the rotation of the bones. */\n    rotateMode: RotateMode = RotateMode.Chain;\n\n    /** An offset added to the constrained bone rotation. */\n    offsetRotation = 0;\n\n    /** The position along the path. */\n    position = 0;\n\n    /** The spacing between bones. */\n    spacing = 0;\n\n    mixRotate = 0;\n    mixX = 0;\n    mixY = 0;\n\n    constructor(name: string) {\n        super(name, 0, false);\n    }\n}\n\n/** Controls how bones after the first bone are positioned along the path.\n *\n * [Spacing mode](http://esotericsoftware.com/spine-path-constraints#Spacing-mode) in the Spine User Guide.\n * @public\n * */\nexport enum SpacingMode {\n    Length,\n    Fixed,\n    Percent,\n    Proportional,\n}\n","import { PathAttachment } from './attachments';\nimport type { Updatable } from './Updatable';\nimport { PathConstraintData, SpacingMode } from './PathConstraintData';\nimport type { Bone } from './Bone';\nimport type { Slot } from './Slot';\nimport type { Skeleton } from './Skeleton';\nimport { MathUtils, PositionMode, RotateMode, Utils } from '@pixi-spine/base';\n/** Stores the current pose for a path constraint. A path constraint adjusts the rotation, translation, and scale of the\n * constrained bones so they follow a {@link PathAttachment}.\n *\n * See [Path constraints](http://esotericsoftware.com/spine-path-constraints) in the Spine User Guide.\n * @public\n * */\nexport class PathConstraint implements Updatable {\n    static NONE = -1;\n    static BEFORE = -2;\n    static AFTER = -3;\n    static epsilon = 0.00001;\n\n    /** The path constraint's setup pose data. */\n    data: PathConstraintData;\n\n    /** The bones that will be modified by this path constraint. */\n    bones: Array<Bone>;\n\n    /** The slot whose path attachment will be used to constrained the bones. */\n    target: Slot;\n\n    /** The position along the path. */\n    position = 0;\n\n    /** The spacing between bones. */\n    spacing = 0;\n\n    mixRotate = 0;\n\n    mixX = 0;\n\n    mixY = 0;\n\n    spaces = new Array<number>();\n    positions = new Array<number>();\n    world = new Array<number>();\n    curves = new Array<number>();\n    lengths = new Array<number>();\n    segments = new Array<number>();\n\n    active = false;\n\n    constructor(data: PathConstraintData, skeleton: Skeleton) {\n        if (!data) throw new Error('data cannot be null.');\n        if (!skeleton) throw new Error('skeleton cannot be null.');\n        this.data = data;\n        this.bones = new Array<Bone>();\n        for (let i = 0, n = data.bones.length; i < n; i++) {\n            const bone = skeleton.findBone(data.bones[i].name);\n\n            if (!bone) throw new Error(`Couldn't find bone ${data.bones[i].name}.`);\n            this.bones.push(bone);\n        }\n        const target = skeleton.findSlot(data.target.name);\n\n        if (!target) throw new Error(`Couldn't find target bone ${data.target.name}`);\n        this.target = target;\n        this.position = data.position;\n        this.spacing = data.spacing;\n        this.mixRotate = data.mixRotate;\n        this.mixX = data.mixX;\n        this.mixY = data.mixY;\n    }\n\n    isActive() {\n        return this.active;\n    }\n\n    update() {\n        const attachment = this.target.getAttachment();\n\n        if (!(attachment instanceof PathAttachment)) return;\n\n        const mixRotate = this.mixRotate;\n        const mixX = this.mixX;\n        const mixY = this.mixY;\n\n        if (mixRotate == 0 && mixX == 0 && mixY == 0) return;\n\n        const data = this.data;\n        const tangents = data.rotateMode == RotateMode.Tangent;\n        const scale = data.rotateMode == RotateMode.ChainScale;\n\n        const bones = this.bones;\n        const boneCount = bones.length;\n        const spacesCount = tangents ? boneCount : boneCount + 1;\n        const spaces = Utils.setArraySize(this.spaces, spacesCount);\n        const lengths: Array<number> = scale ? (this.lengths = Utils.setArraySize(this.lengths, boneCount)) : [];\n        const spacing = this.spacing;\n\n        switch (data.spacingMode) {\n            case SpacingMode.Percent:\n                if (scale) {\n                    for (let i = 0, n = spacesCount - 1; i < n; i++) {\n                        const bone = bones[i];\n                        const setupLength = bone.data.length;\n\n                        if (setupLength < PathConstraint.epsilon) lengths[i] = 0;\n                        else {\n                            const x = setupLength * bone.matrix.a;\n                            const y = setupLength * bone.matrix.b;\n\n                            lengths[i] = Math.sqrt(x * x + y * y);\n                        }\n                    }\n                }\n                Utils.arrayFill(spaces, 1, spacesCount, spacing);\n                break;\n            case SpacingMode.Proportional:\n                let sum = 0;\n\n                for (let i = 0, n = spacesCount - 1; i < n; ) {\n                    const bone = bones[i];\n                    const setupLength = bone.data.length;\n\n                    if (setupLength < PathConstraint.epsilon) {\n                        if (scale) lengths[i] = 0;\n                        spaces[++i] = spacing;\n                    } else {\n                        const x = setupLength * bone.matrix.a;\n                        const y = setupLength * bone.matrix.b;\n                        const length = Math.sqrt(x * x + y * y);\n\n                        if (scale) lengths[i] = length;\n                        spaces[++i] = length;\n                        sum += length;\n                    }\n                }\n                if (sum > 0) {\n                    sum = (spacesCount / sum) * spacing;\n                    for (let i = 1; i < spacesCount; i++) spaces[i] *= sum;\n                }\n                break;\n            default:\n                const lengthSpacing = data.spacingMode == SpacingMode.Length;\n\n                for (let i = 0, n = spacesCount - 1; i < n; ) {\n                    const bone = bones[i];\n                    const setupLength = bone.data.length;\n\n                    if (setupLength < PathConstraint.epsilon) {\n                        if (scale) lengths[i] = 0;\n                        spaces[++i] = spacing;\n                    } else {\n                        const x = setupLength * bone.matrix.a;\n                        const y = setupLength * bone.matrix.b;\n                        const length = Math.sqrt(x * x + y * y);\n\n                        if (scale) lengths[i] = length;\n                        spaces[++i] = ((lengthSpacing ? setupLength + spacing : spacing) * length) / setupLength;\n                    }\n                }\n        }\n\n        const positions = this.computeWorldPositions(<PathAttachment>attachment, spacesCount, tangents);\n        let boneX = positions[0];\n        let boneY = positions[1];\n        let offsetRotation = data.offsetRotation;\n        let tip = false;\n\n        if (offsetRotation == 0) tip = data.rotateMode == RotateMode.Chain;\n        else {\n            tip = false;\n            const p = this.target.bone.matrix;\n\n            offsetRotation *= p.a * p.d - p.b * p.c > 0 ? MathUtils.degRad : -MathUtils.degRad;\n        }\n        for (let i = 0, p = 3; i < boneCount; i++, p += 3) {\n            const bone = bones[i];\n            const mat = bone.matrix;\n\n            mat.tx += (boneX - mat.tx) * mixX;\n            mat.ty += (boneY - mat.ty) * mixY;\n            const x = positions[p];\n            const y = positions[p + 1];\n            const dx = x - boneX;\n            const dy = y - boneY;\n\n            if (scale) {\n                const length = lengths[i];\n\n                if (length != 0) {\n                    const s = (Math.sqrt(dx * dx + dy * dy) / length - 1) * mixRotate + 1;\n\n                    mat.a *= s;\n                    mat.b *= s;\n                }\n            }\n            boneX = x;\n            boneY = y;\n            if (mixRotate > 0) {\n                const a = mat.a;\n                const b = mat.c;\n                const c = mat.b;\n                const d = mat.d;\n                let r = 0;\n                let cos = 0;\n                let sin = 0;\n\n                if (tangents) r = positions[p - 1];\n                else if (spaces[i + 1] == 0) r = positions[p + 2];\n                else r = Math.atan2(dy, dx);\n                r -= Math.atan2(c, a);\n                if (tip) {\n                    cos = Math.cos(r);\n                    sin = Math.sin(r);\n                    const length = bone.data.length;\n\n                    boneX += (length * (cos * a - sin * c) - dx) * mixRotate;\n                    boneY += (length * (sin * a + cos * c) - dy) * mixRotate;\n                } else {\n                    r += offsetRotation;\n                }\n                if (r > MathUtils.PI) r -= MathUtils.PI2;\n                else if (r < -MathUtils.PI)\n                    //\n                    r += MathUtils.PI2;\n                r *= mixRotate;\n                cos = Math.cos(r);\n                sin = Math.sin(r);\n                mat.a = cos * a - sin * c;\n                mat.c = cos * b - sin * d;\n                mat.b = sin * a + cos * c;\n                mat.d = sin * b + cos * d;\n            }\n            bone.updateAppliedTransform();\n        }\n    }\n\n    computeWorldPositions(path: PathAttachment, spacesCount: number, tangents: boolean) {\n        const target = this.target;\n        let position = this.position;\n        const spaces = this.spaces;\n        const out = Utils.setArraySize(this.positions, spacesCount * 3 + 2);\n        let world: Array<number> = this.world;\n        const closed = path.closed;\n        let verticesLength = path.worldVerticesLength;\n        let curveCount = verticesLength / 6;\n        let prevCurve = PathConstraint.NONE;\n\n        if (!path.constantSpeed) {\n            const lengths = path.lengths;\n\n            curveCount -= closed ? 1 : 2;\n            const pathLength = lengths[curveCount];\n\n            if (this.data.positionMode == PositionMode.Percent) position *= pathLength;\n\n            let multiplier;\n\n            switch (this.data.spacingMode) {\n                case SpacingMode.Percent:\n                    multiplier = pathLength;\n                    break;\n                case SpacingMode.Proportional:\n                    multiplier = pathLength / spacesCount;\n                    break;\n                default:\n                    multiplier = 1;\n            }\n            world = Utils.setArraySize(this.world, 8);\n            for (let i = 0, o = 0, curve = 0; i < spacesCount; i++, o += 3) {\n                const space = spaces[i] * multiplier;\n\n                position += space;\n                let p = position;\n\n                if (closed) {\n                    p %= pathLength;\n                    if (p < 0) p += pathLength;\n                    curve = 0;\n                } else if (p < 0) {\n                    if (prevCurve != PathConstraint.BEFORE) {\n                        prevCurve = PathConstraint.BEFORE;\n                        path.computeWorldVertices(target, 2, 4, world, 0, 2);\n                    }\n                    this.addBeforePosition(p, world, 0, out, o);\n                    continue;\n                } else if (p > pathLength) {\n                    if (prevCurve != PathConstraint.AFTER) {\n                        prevCurve = PathConstraint.AFTER;\n                        path.computeWorldVertices(target, verticesLength - 6, 4, world, 0, 2);\n                    }\n                    this.addAfterPosition(p - pathLength, world, 0, out, o);\n                    continue;\n                }\n\n                // Determine curve containing position.\n                for (; ; curve++) {\n                    const length = lengths[curve];\n\n                    if (p > length) continue;\n                    if (curve == 0) p /= length;\n                    else {\n                        const prev = lengths[curve - 1];\n\n                        p = (p - prev) / (length - prev);\n                    }\n                    break;\n                }\n                if (curve != prevCurve) {\n                    prevCurve = curve;\n                    if (closed && curve == curveCount) {\n                        path.computeWorldVertices(target, verticesLength - 4, 4, world, 0, 2);\n                        path.computeWorldVertices(target, 0, 4, world, 4, 2);\n                    } else path.computeWorldVertices(target, curve * 6 + 2, 8, world, 0, 2);\n                }\n                this.addCurvePosition(p, world[0], world[1], world[2], world[3], world[4], world[5], world[6], world[7], out, o, tangents || (i > 0 && space == 0));\n            }\n\n            return out;\n        }\n\n        // World vertices.\n        if (closed) {\n            verticesLength += 2;\n            world = Utils.setArraySize(this.world, verticesLength);\n            path.computeWorldVertices(target, 2, verticesLength - 4, world, 0, 2);\n            path.computeWorldVertices(target, 0, 2, world, verticesLength - 4, 2);\n            world[verticesLength - 2] = world[0];\n            world[verticesLength - 1] = world[1];\n        } else {\n            curveCount--;\n            verticesLength -= 4;\n            world = Utils.setArraySize(this.world, verticesLength);\n            path.computeWorldVertices(target, 2, verticesLength, world, 0, 2);\n        }\n\n        // Curve lengths.\n        const curves = Utils.setArraySize(this.curves, curveCount);\n        let pathLength = 0;\n        let x1 = world[0];\n        let y1 = world[1];\n        let cx1 = 0;\n        let cy1 = 0;\n        let cx2 = 0;\n        let cy2 = 0;\n        let x2 = 0;\n        let y2 = 0;\n        let tmpx = 0;\n        let tmpy = 0;\n        let dddfx = 0;\n        let dddfy = 0;\n        let ddfx = 0;\n        let ddfy = 0;\n        let dfx = 0;\n        let dfy = 0;\n\n        for (let i = 0, w = 2; i < curveCount; i++, w += 6) {\n            cx1 = world[w];\n            cy1 = world[w + 1];\n            cx2 = world[w + 2];\n            cy2 = world[w + 3];\n            x2 = world[w + 4];\n            y2 = world[w + 5];\n            tmpx = (x1 - cx1 * 2 + cx2) * 0.1875;\n            tmpy = (y1 - cy1 * 2 + cy2) * 0.1875;\n            dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.09375;\n            dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.09375;\n            ddfx = tmpx * 2 + dddfx;\n            ddfy = tmpy * 2 + dddfy;\n            dfx = (cx1 - x1) * 0.75 + tmpx + dddfx * 0.16666667;\n            dfy = (cy1 - y1) * 0.75 + tmpy + dddfy * 0.16666667;\n            pathLength += Math.sqrt(dfx * dfx + dfy * dfy);\n            dfx += ddfx;\n            dfy += ddfy;\n            ddfx += dddfx;\n            ddfy += dddfy;\n            pathLength += Math.sqrt(dfx * dfx + dfy * dfy);\n            dfx += ddfx;\n            dfy += ddfy;\n            pathLength += Math.sqrt(dfx * dfx + dfy * dfy);\n            dfx += ddfx + dddfx;\n            dfy += ddfy + dddfy;\n            pathLength += Math.sqrt(dfx * dfx + dfy * dfy);\n            curves[i] = pathLength;\n            x1 = x2;\n            y1 = y2;\n        }\n\n        if (this.data.positionMode == PositionMode.Percent) position *= pathLength;\n\n        let multiplier;\n\n        switch (this.data.spacingMode) {\n            case SpacingMode.Percent:\n                multiplier = pathLength;\n                break;\n            case SpacingMode.Proportional:\n                multiplier = pathLength / spacesCount;\n                break;\n            default:\n                multiplier = 1;\n        }\n\n        const segments = this.segments;\n        let curveLength = 0;\n\n        for (let i = 0, o = 0, curve = 0, segment = 0; i < spacesCount; i++, o += 3) {\n            const space = spaces[i] * multiplier;\n\n            position += space;\n            let p = position;\n\n            if (closed) {\n                p %= pathLength;\n                if (p < 0) p += pathLength;\n                curve = 0;\n            } else if (p < 0) {\n                this.addBeforePosition(p, world, 0, out, o);\n                continue;\n            } else if (p > pathLength) {\n                this.addAfterPosition(p - pathLength, world, verticesLength - 4, out, o);\n                continue;\n            }\n\n            // Determine curve containing position.\n            for (; ; curve++) {\n                const length = curves[curve];\n\n                if (p > length) continue;\n                if (curve == 0) p /= length;\n                else {\n                    const prev = curves[curve - 1];\n\n                    p = (p - prev) / (length - prev);\n                }\n                break;\n            }\n\n            // Curve segment lengths.\n            if (curve != prevCurve) {\n                prevCurve = curve;\n                let ii = curve * 6;\n\n                x1 = world[ii];\n                y1 = world[ii + 1];\n                cx1 = world[ii + 2];\n                cy1 = world[ii + 3];\n                cx2 = world[ii + 4];\n                cy2 = world[ii + 5];\n                x2 = world[ii + 6];\n                y2 = world[ii + 7];\n                tmpx = (x1 - cx1 * 2 + cx2) * 0.03;\n                tmpy = (y1 - cy1 * 2 + cy2) * 0.03;\n                dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.006;\n                dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.006;\n                ddfx = tmpx * 2 + dddfx;\n                ddfy = tmpy * 2 + dddfy;\n                dfx = (cx1 - x1) * 0.3 + tmpx + dddfx * 0.16666667;\n                dfy = (cy1 - y1) * 0.3 + tmpy + dddfy * 0.16666667;\n                curveLength = Math.sqrt(dfx * dfx + dfy * dfy);\n                segments[0] = curveLength;\n                for (ii = 1; ii < 8; ii++) {\n                    dfx += ddfx;\n                    dfy += ddfy;\n                    ddfx += dddfx;\n                    ddfy += dddfy;\n                    curveLength += Math.sqrt(dfx * dfx + dfy * dfy);\n                    segments[ii] = curveLength;\n                }\n                dfx += ddfx;\n                dfy += ddfy;\n                curveLength += Math.sqrt(dfx * dfx + dfy * dfy);\n                segments[8] = curveLength;\n                dfx += ddfx + dddfx;\n                dfy += ddfy + dddfy;\n                curveLength += Math.sqrt(dfx * dfx + dfy * dfy);\n                segments[9] = curveLength;\n                segment = 0;\n            }\n\n            // Weight by segment length.\n            p *= curveLength;\n            for (; ; segment++) {\n                const length = segments[segment];\n\n                if (p > length) continue;\n                if (segment == 0) p /= length;\n                else {\n                    const prev = segments[segment - 1];\n\n                    p = segment + (p - prev) / (length - prev);\n                }\n                break;\n            }\n            this.addCurvePosition(p * 0.1, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents || (i > 0 && space == 0));\n        }\n\n        return out;\n    }\n\n    addBeforePosition(p: number, temp: Array<number>, i: number, out: Array<number>, o: number) {\n        const x1 = temp[i];\n        const y1 = temp[i + 1];\n        const dx = temp[i + 2] - x1;\n        const dy = temp[i + 3] - y1;\n        const r = Math.atan2(dy, dx);\n\n        out[o] = x1 + p * Math.cos(r);\n        out[o + 1] = y1 + p * Math.sin(r);\n        out[o + 2] = r;\n    }\n\n    addAfterPosition(p: number, temp: Array<number>, i: number, out: Array<number>, o: number) {\n        const x1 = temp[i + 2];\n        const y1 = temp[i + 3];\n        const dx = x1 - temp[i];\n        const dy = y1 - temp[i + 1];\n        const r = Math.atan2(dy, dx);\n\n        out[o] = x1 + p * Math.cos(r);\n        out[o + 1] = y1 + p * Math.sin(r);\n        out[o + 2] = r;\n    }\n\n    addCurvePosition(\n        p: number,\n        x1: number,\n        y1: number,\n        cx1: number,\n        cy1: number,\n        cx2: number,\n        cy2: number,\n        x2: number,\n        y2: number,\n        out: Array<number>,\n        o: number,\n        tangents: boolean\n    ) {\n        if (p == 0 || isNaN(p)) {\n            out[o] = x1;\n            out[o + 1] = y1;\n            out[o + 2] = Math.atan2(cy1 - y1, cx1 - x1);\n\n            return;\n        }\n        const tt = p * p;\n        const ttt = tt * p;\n        const u = 1 - p;\n        const uu = u * u;\n        const uuu = uu * u;\n        const ut = u * p;\n        const ut3 = ut * 3;\n        const uut3 = u * ut3;\n        const utt3 = ut3 * p;\n        const x = x1 * uuu + cx1 * uut3 + cx2 * utt3 + x2 * ttt;\n        const y = y1 * uuu + cy1 * uut3 + cy2 * utt3 + y2 * ttt;\n\n        out[o] = x;\n        out[o + 1] = y;\n        if (tangents) {\n            if (p < 0.001) out[o + 2] = Math.atan2(cy1 - y1, cx1 - x1);\n            else out[o + 2] = Math.atan2(y - (y1 * uu + cy1 * ut * 2 + cy2 * tt), x - (x1 * uu + cx1 * ut * 2 + cx2 * tt));\n        }\n    }\n}\n","import { Color, ISlot } from '@pixi-spine/base';\n\nimport { Attachment, VertexAttachment } from './attachments/Attachment';\nimport type { Bone } from './Bone';\nimport type { SlotData } from './SlotData';\nimport type { Skeleton } from './Skeleton';\n\n/** Stores a slot's current pose. Slots organize attachments for {@link Skeleton#drawOrder} purposes and provide a place to store\n * state for an attachment. State cannot be stored in an attachment itself because attachments are stateless and may be shared\n * across multiple skeletons.\n * @public\n * */\nexport class Slot implements ISlot {\n    // this is canon\n    blendMode: number;\n    /** The slot's setup pose data. */\n    data: SlotData;\n\n    /** The bone this slot belongs to. */\n    bone: Bone;\n\n    /** The color used to tint the slot's attachment. If {@link #getDarkColor()} is set, this is used as the light color for two\n     * color tinting. */\n    color: Color;\n\n    /** The dark color used to tint the slot's attachment for two color tinting, or null if two color tinting is not used. The dark\n     * color's alpha is not used. */\n    darkColor: Color | null = null;\n\n    attachment: Attachment | null = null;\n\n    attachmentState = 0;\n\n    /** The index of the texture region to display when the slot's attachment has a {@link Sequence}. -1 represents the\n     * {@link Sequence#getSetupIndex()}. */\n    sequenceIndex = -1;\n\n    /** Values to deform the slot's attachment. For an unweighted mesh, the entries are local positions for each vertex. For a\n     * weighted mesh, the entries are an offset for each vertex which will be added to the mesh's local vertex positions.\n     *\n     * See {@link VertexAttachment#computeWorldVertices()} and {@link DeformTimeline}. */\n    deform = new Array<number>();\n\n    constructor(data: SlotData, bone: Bone) {\n        if (!data) throw new Error('data cannot be null.');\n        if (!bone) throw new Error('bone cannot be null.');\n        this.data = data;\n        this.bone = bone;\n        this.color = new Color();\n        this.darkColor = !data.darkColor ? null : new Color();\n        this.setToSetupPose();\n\n        this.blendMode = this.data.blendMode;\n    }\n\n    /** The skeleton this slot belongs to. */\n    getSkeleton(): Skeleton {\n        return this.bone.skeleton;\n    }\n\n    /** The current attachment for the slot, or null if the slot has no attachment. */\n    getAttachment(): Attachment | null {\n        return this.attachment;\n    }\n\n    /** Sets the slot's attachment and, if the attachment changed, resets {@link #sequenceIndex} and clears the {@link #deform}.\n     * The deform is not cleared if the old attachment has the same {@link VertexAttachment#getTimelineAttachment()} as the\n     * specified attachment. */\n    setAttachment(attachment: Attachment | null) {\n        if (this.attachment == attachment) return;\n        if (\n            !(attachment instanceof VertexAttachment) ||\n            !(this.attachment instanceof VertexAttachment) ||\n            (<VertexAttachment>attachment).timelineAttachment != (<VertexAttachment>this.attachment).timelineAttachment\n        ) {\n            this.deform.length = 0;\n        }\n        this.attachment = attachment;\n        this.sequenceIndex = -1;\n    }\n\n    /** Sets this slot to the setup pose. */\n    setToSetupPose() {\n        this.color.setFromColor(this.data.color);\n        if (this.darkColor) this.darkColor.setFromColor(this.data.darkColor);\n        if (!this.data.attachmentName) this.attachment = null;\n        else {\n            this.attachment = null;\n            this.setAttachment(this.bone.skeleton.getAttachment(this.data.index, this.data.attachmentName));\n        }\n    }\n}\n","import type { Updatable } from './Updatable';\nimport type { TransformConstraintData } from './TransformConstraintData';\nimport type { Bone } from './Bone';\nimport { MathUtils, Vector2 } from '@pixi-spine/base';\nimport type { Skeleton } from './Skeleton';\n\n/** Stores the current pose for a transform constraint. A transform constraint adjusts the world transform of the constrained\n * bones to match that of the target bone.\n *\n * See [Transform constraints](http://esotericsoftware.com/spine-transform-constraints) in the Spine User Guide.\n * @public\n * */\nexport class TransformConstraint implements Updatable {\n    /** The transform constraint's setup pose data. */\n    data: TransformConstraintData;\n\n    /** The bones that will be modified by this transform constraint. */\n    bones: Array<Bone>;\n\n    /** The target bone whose world transform will be copied to the constrained bones. */\n    target: Bone;\n\n    mixRotate = 0;\n    mixX = 0;\n    mixY = 0;\n    mixScaleX = 0;\n    mixScaleY = 0;\n    mixShearY = 0;\n\n    temp = new Vector2();\n    active = false;\n\n    constructor(data: TransformConstraintData, skeleton: Skeleton) {\n        if (!data) throw new Error('data cannot be null.');\n        if (!skeleton) throw new Error('skeleton cannot be null.');\n        this.data = data;\n        this.mixRotate = data.mixRotate;\n        this.mixX = data.mixX;\n        this.mixY = data.mixY;\n        this.mixScaleX = data.mixScaleX;\n        this.mixScaleY = data.mixScaleY;\n        this.mixShearY = data.mixShearY;\n        this.bones = new Array<Bone>();\n        for (let i = 0; i < data.bones.length; i++) {\n            const bone = skeleton.findBone(data.bones[i].name);\n\n            if (!bone) throw new Error(`Couldn't find bone ${data.bones[i].name}.`);\n            this.bones.push(bone);\n        }\n        const target = skeleton.findBone(data.target.name);\n\n        if (!target) throw new Error(`Couldn't find target bone ${data.target.name}.`);\n        this.target = target;\n    }\n\n    isActive() {\n        return this.active;\n    }\n\n    update() {\n        if (this.mixRotate == 0 && this.mixX == 0 && this.mixY == 0 && this.mixScaleX == 0 && this.mixScaleX == 0 && this.mixShearY == 0) return;\n\n        if (this.data.local) {\n            if (this.data.relative) this.applyRelativeLocal();\n            else this.applyAbsoluteLocal();\n        } else if (this.data.relative) this.applyRelativeWorld();\n        else this.applyAbsoluteWorld();\n    }\n\n    applyAbsoluteWorld() {\n        const mixRotate = this.mixRotate;\n        const mixX = this.mixX;\n        const mixY = this.mixY;\n        const mixScaleX = this.mixScaleX;\n        const mixScaleY = this.mixScaleY;\n        const mixShearY = this.mixShearY;\n        const translate = mixX != 0 || mixY != 0;\n\n        const target = this.target;\n        const targetMat = target.matrix;\n        const ta = targetMat.a;\n        const tb = targetMat.c;\n        const tc = targetMat.b;\n        const td = targetMat.d;\n        const degRadReflect = ta * td - tb * tc > 0 ? MathUtils.degRad : -MathUtils.degRad;\n        const offsetRotation = this.data.offsetRotation * degRadReflect;\n        const offsetShearY = this.data.offsetShearY * degRadReflect;\n\n        const bones = this.bones;\n\n        for (let i = 0, n = bones.length; i < n; i++) {\n            const bone = bones[i];\n            const mat = bone.matrix;\n\n            if (mixRotate != 0) {\n                const a = mat.a;\n                const b = mat.c;\n                const c = mat.b;\n                const d = mat.d;\n                let r = Math.atan2(tc, ta) - Math.atan2(c, a) + offsetRotation;\n\n                if (r > MathUtils.PI) r -= MathUtils.PI2;\n                else if (r < -MathUtils.PI)\n                    //\n                    r += MathUtils.PI2;\n                r *= mixRotate;\n                const cos = Math.cos(r);\n                const sin = Math.sin(r);\n\n                mat.a = cos * a - sin * c;\n                mat.c = cos * b - sin * d;\n                mat.b = sin * a + cos * c;\n                mat.d = sin * b + cos * d;\n            }\n\n            if (translate) {\n                const temp = this.temp;\n\n                target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY));\n                mat.tx += (temp.x - mat.tx) * mixX;\n                mat.ty += (temp.y - mat.ty) * mixY;\n            }\n\n            if (mixScaleX != 0) {\n                let s = Math.sqrt(mat.a * mat.a + mat.b * mat.b);\n\n                if (s != 0) s = (s + (Math.sqrt(ta * ta + tc * tc) - s + this.data.offsetScaleX) * mixScaleX) / s;\n                mat.a *= s;\n                mat.b *= s;\n            }\n            if (mixScaleY != 0) {\n                let s = Math.sqrt(mat.c * mat.c + mat.d * mat.d);\n\n                if (s != 0) s = (s + (Math.sqrt(tb * tb + td * td) - s + this.data.offsetScaleY) * mixScaleY) / s;\n                mat.c *= s;\n                mat.d *= s;\n            }\n\n            if (mixShearY > 0) {\n                const b = mat.c;\n                const d = mat.d;\n                const by = Math.atan2(d, b);\n                let r = Math.atan2(td, tb) - Math.atan2(tc, ta) - (by - Math.atan2(mat.b, mat.a));\n\n                if (r > MathUtils.PI) r -= MathUtils.PI2;\n                else if (r < -MathUtils.PI)\n                    //\n                    r += MathUtils.PI2;\n                r = by + (r + offsetShearY) * mixShearY;\n                const s = Math.sqrt(b * b + d * d);\n\n                mat.c = Math.cos(r) * s;\n                mat.d = Math.sin(r) * s;\n            }\n\n            bone.updateAppliedTransform();\n        }\n    }\n\n    applyRelativeWorld() {\n        const mixRotate = this.mixRotate;\n        const mixX = this.mixX;\n        const mixY = this.mixY;\n        const mixScaleX = this.mixScaleX;\n        const mixScaleY = this.mixScaleY;\n        const mixShearY = this.mixShearY;\n        const translate = mixX != 0 || mixY != 0;\n\n        const target = this.target;\n        const targetMat = target.matrix;\n        const ta = targetMat.a;\n        const tb = targetMat.c;\n        const tc = targetMat.b;\n        const td = targetMat.d;\n        const degRadReflect = ta * td - tb * tc > 0 ? MathUtils.degRad : -MathUtils.degRad;\n        const offsetRotation = this.data.offsetRotation * degRadReflect;\n        const offsetShearY = this.data.offsetShearY * degRadReflect;\n\n        const bones = this.bones;\n\n        for (let i = 0, n = bones.length; i < n; i++) {\n            const bone = bones[i];\n            const mat = bone.matrix;\n\n            if (mixRotate != 0) {\n                const a = mat.a;\n                const b = mat.c;\n                const c = mat.b;\n                const d = mat.d;\n                let r = Math.atan2(tc, ta) + offsetRotation;\n\n                if (r > MathUtils.PI) r -= MathUtils.PI2;\n                else if (r < -MathUtils.PI)\n                    //\n                    r += MathUtils.PI2;\n                r *= mixRotate;\n                const cos = Math.cos(r);\n                const sin = Math.sin(r);\n\n                mat.a = cos * a - sin * c;\n                mat.c = cos * b - sin * d;\n                mat.b = sin * a + cos * c;\n                mat.d = sin * b + cos * d;\n            }\n\n            if (translate) {\n                const temp = this.temp;\n\n                target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY));\n                mat.tx += temp.x * mixX;\n                mat.ty += temp.y * mixY;\n            }\n\n            if (mixScaleX != 0) {\n                const s = (Math.sqrt(ta * ta + tc * tc) - 1 + this.data.offsetScaleX) * mixScaleX + 1;\n\n                mat.a *= s;\n                mat.b *= s;\n            }\n            if (mixScaleY != 0) {\n                const s = (Math.sqrt(tb * tb + td * td) - 1 + this.data.offsetScaleY) * mixScaleY + 1;\n\n                mat.c *= s;\n                mat.d *= s;\n            }\n\n            if (mixShearY > 0) {\n                let r = Math.atan2(td, tb) - Math.atan2(tc, ta);\n\n                if (r > MathUtils.PI) r -= MathUtils.PI2;\n                else if (r < -MathUtils.PI)\n                    //\n                    r += MathUtils.PI2;\n                const b = mat.c;\n                const d = mat.d;\n\n                r = Math.atan2(d, b) + (r - MathUtils.PI / 2 + offsetShearY) * mixShearY;\n                const s = Math.sqrt(b * b + d * d);\n\n                mat.c = Math.cos(r) * s;\n                mat.d = Math.sin(r) * s;\n            }\n\n            bone.updateAppliedTransform();\n        }\n    }\n\n    applyAbsoluteLocal() {\n        const mixRotate = this.mixRotate;\n        const mixX = this.mixX;\n        const mixY = this.mixY;\n        const mixScaleX = this.mixScaleX;\n        const mixScaleY = this.mixScaleY;\n        const mixShearY = this.mixShearY;\n\n        const target = this.target;\n\n        const bones = this.bones;\n\n        for (let i = 0, n = bones.length; i < n; i++) {\n            const bone = bones[i];\n\n            let rotation = bone.arotation;\n\n            if (mixRotate != 0) {\n                let r = target.arotation - rotation + this.data.offsetRotation;\n\n                r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360;\n                rotation += r * mixRotate;\n            }\n\n            let x = bone.ax;\n            let y = bone.ay;\n\n            x += (target.ax - x + this.data.offsetX) * mixX;\n            y += (target.ay - y + this.data.offsetY) * mixY;\n\n            let scaleX = bone.ascaleX;\n            let scaleY = bone.ascaleY;\n\n            if (mixScaleX != 0 && scaleX != 0) scaleX = (scaleX + (target.ascaleX - scaleX + this.data.offsetScaleX) * mixScaleX) / scaleX;\n            if (mixScaleY != 0 && scaleY != 0) scaleY = (scaleY + (target.ascaleY - scaleY + this.data.offsetScaleY) * mixScaleY) / scaleY;\n\n            let shearY = bone.ashearY;\n\n            if (mixShearY != 0) {\n                let r = target.ashearY - shearY + this.data.offsetShearY;\n\n                r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360;\n                shearY += r * mixShearY;\n            }\n\n            bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY);\n        }\n    }\n\n    applyRelativeLocal() {\n        const mixRotate = this.mixRotate;\n        const mixX = this.mixX;\n        const mixY = this.mixY;\n        const mixScaleX = this.mixScaleX;\n        const mixScaleY = this.mixScaleY;\n        const mixShearY = this.mixShearY;\n\n        const target = this.target;\n\n        const bones = this.bones;\n\n        for (let i = 0, n = bones.length; i < n; i++) {\n            const bone = bones[i];\n\n            const rotation = bone.arotation + (target.arotation + this.data.offsetRotation) * mixRotate;\n            const x = bone.ax + (target.ax + this.data.offsetX) * mixX;\n            const y = bone.ay + (target.ay + this.data.offsetY) * mixY;\n            const scaleX = bone.ascaleX * ((target.ascaleX - 1 + this.data.offsetScaleX) * mixScaleX + 1);\n            const scaleY = bone.ascaleY * ((target.ascaleY - 1 + this.data.offsetScaleY) * mixScaleY + 1);\n            const shearY = bone.ashearY + (target.ashearY + this.data.offsetShearY) * mixShearY;\n\n            bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY);\n        }\n    }\n}\n","import { Attachment, RegionAttachment, MeshAttachment, PathAttachment } from './attachments';\nimport { Bone } from './Bone';\nimport { Slot } from './Slot';\nimport type { Updatable } from './Updatable';\nimport type { SkeletonData } from './SkeletonData';\nimport { IkConstraint } from './IkConstraint';\nimport { TransformConstraint } from './TransformConstraint';\nimport { PathConstraint } from './PathConstraint';\nimport type { Skin } from './Skin';\nimport { Color, MathUtils, NumberArrayLike, settings, Utils, Vector2, ISkeleton } from '@pixi-spine/base';\n\n/** Stores the current pose for a skeleton.\n *\n * See [Instance objects](http://esotericsoftware.com/spine-runtime-architecture#Instance-objects) in the Spine Runtimes Guide.\n * @public\n * */\nexport class Skeleton implements ISkeleton<SkeletonData, Bone, Slot, Skin> {\n    /** The skeleton's setup pose data. */\n    data: SkeletonData;\n\n    /** The skeleton's bones, sorted parent first. The root bone is always the first bone. */\n    bones: Array<Bone>;\n\n    /** The skeleton's slots. */\n    slots: Array<Slot>;\n\n    /** The skeleton's slots in the order they should be drawn. The returned array may be modified to change the draw order. */\n    drawOrder: Array<Slot>;\n\n    /** The skeleton's IK constraints. */\n    ikConstraints: Array<IkConstraint>;\n\n    /** The skeleton's transform constraints. */\n    transformConstraints: Array<TransformConstraint>;\n\n    /** The skeleton's path constraints. */\n    pathConstraints: Array<PathConstraint>;\n\n    /** The list of bones and constraints, sorted in the order they should be updated, as computed by {@link #updateCache()}. */\n    _updateCache = new Array<Updatable>();\n\n    /** The skeleton's current skin. May be null. */\n    skin: Skin | null = null;\n\n    /** The color to tint all the skeleton's attachments. */\n    color: Color;\n\n    /** Scales the entire skeleton on the X axis. This affects all bones, even if the bone's transform mode disallows scale\n     * inheritance. */\n    scaleX = 1;\n\n    /** Scales the entire skeleton on the Y axis. This affects all bones, even if the bone's transform mode disallows scale\n     * inheritance. */\n    scaleY = 1;\n\n    /** Sets the skeleton X position, which is added to the root bone worldX position. */\n    x = 0;\n\n    /** Sets the skeleton Y position, which is added to the root bone worldY position. */\n    y = 0;\n\n    constructor(data: SkeletonData) {\n        if (!data) throw new Error('data cannot be null.');\n        this.data = data;\n\n        this.bones = new Array<Bone>();\n        for (let i = 0; i < data.bones.length; i++) {\n            const boneData = data.bones[i];\n            let bone: Bone;\n\n            if (!boneData.parent) bone = new Bone(boneData, this, null);\n            else {\n                const parent = this.bones[boneData.parent.index];\n\n                bone = new Bone(boneData, this, parent);\n                parent.children.push(bone);\n            }\n            this.bones.push(bone);\n        }\n\n        this.slots = new Array<Slot>();\n        this.drawOrder = new Array<Slot>();\n        for (let i = 0; i < data.slots.length; i++) {\n            const slotData = data.slots[i];\n            const bone = this.bones[slotData.boneData.index];\n            const slot = new Slot(slotData, bone);\n\n            this.slots.push(slot);\n            this.drawOrder.push(slot);\n        }\n\n        this.ikConstraints = new Array<IkConstraint>();\n        for (let i = 0; i < data.ikConstraints.length; i++) {\n            const ikConstraintData = data.ikConstraints[i];\n\n            this.ikConstraints.push(new IkConstraint(ikConstraintData, this));\n        }\n\n        this.transformConstraints = new Array<TransformConstraint>();\n        for (let i = 0; i < data.transformConstraints.length; i++) {\n            const transformConstraintData = data.transformConstraints[i];\n\n            this.transformConstraints.push(new TransformConstraint(transformConstraintData, this));\n        }\n\n        this.pathConstraints = new Array<PathConstraint>();\n        for (let i = 0; i < data.pathConstraints.length; i++) {\n            const pathConstraintData = data.pathConstraints[i];\n\n            this.pathConstraints.push(new PathConstraint(pathConstraintData, this));\n        }\n\n        this.color = new Color(1, 1, 1, 1);\n        this.updateCache();\n    }\n\n    /** Caches information about bones and constraints. Must be called if the {@link #getSkin()} is modified or if bones,\n     * constraints, or weighted path attachments are added or removed. */\n    updateCache() {\n        const updateCache = this._updateCache;\n\n        updateCache.length = 0;\n\n        const bones = this.bones;\n\n        for (let i = 0, n = bones.length; i < n; i++) {\n            const bone = bones[i];\n\n            bone.sorted = bone.data.skinRequired;\n            bone.active = !bone.sorted;\n        }\n\n        if (this.skin) {\n            const skinBones = this.skin.bones;\n\n            for (let i = 0, n = this.skin.bones.length; i < n; i++) {\n                let bone: Bone | null = this.bones[skinBones[i].index];\n\n                do {\n                    bone.sorted = false;\n                    bone.active = true;\n                    bone = bone.parent;\n                } while (bone);\n            }\n        }\n\n        // IK first, lowest hierarchy depth first.\n        const ikConstraints = this.ikConstraints;\n        const transformConstraints = this.transformConstraints;\n        const pathConstraints = this.pathConstraints;\n        const ikCount = ikConstraints.length;\n        const transformCount = transformConstraints.length;\n        const pathCount = pathConstraints.length;\n        const constraintCount = ikCount + transformCount + pathCount;\n\n        // eslint-disable-next-line no-restricted-syntax, no-labels\n        outer: for (let i = 0; i < constraintCount; i++) {\n            for (let ii = 0; ii < ikCount; ii++) {\n                const constraint = ikConstraints[ii];\n\n                if (constraint.data.order == i) {\n                    this.sortIkConstraint(constraint);\n                    // eslint-disable-next-line no-labels\n                    continue outer;\n                }\n            }\n            for (let ii = 0; ii < transformCount; ii++) {\n                const constraint = transformConstraints[ii];\n\n                if (constraint.data.order == i) {\n                    this.sortTransformConstraint(constraint);\n                    // eslint-disable-next-line no-labels\n                    continue outer;\n                }\n            }\n            for (let ii = 0; ii < pathCount; ii++) {\n                const constraint = pathConstraints[ii];\n\n                if (constraint.data.order == i) {\n                    this.sortPathConstraint(constraint);\n                    // eslint-disable-next-line no-labels\n                    continue outer;\n                }\n            }\n        }\n\n        for (let i = 0, n = bones.length; i < n; i++) this.sortBone(bones[i]);\n    }\n\n    sortIkConstraint(constraint: IkConstraint) {\n        constraint.active = constraint.target.isActive() && (!constraint.data.skinRequired || (this.skin && Utils.contains(this.skin.constraints, constraint.data, true)));\n        if (!constraint.active) return;\n\n        const target = constraint.target;\n\n        this.sortBone(target);\n\n        const constrained = constraint.bones;\n        const parent = constrained[0];\n\n        this.sortBone(parent);\n\n        if (constrained.length == 1) {\n            this._updateCache.push(constraint);\n            this.sortReset(parent.children);\n        } else {\n            const child = constrained[constrained.length - 1];\n\n            this.sortBone(child);\n\n            this._updateCache.push(constraint);\n\n            this.sortReset(parent.children);\n            child.sorted = true;\n        }\n    }\n\n    sortPathConstraint(constraint: PathConstraint) {\n        constraint.active = constraint.target.bone.isActive() && (!constraint.data.skinRequired || (this.skin && Utils.contains(this.skin.constraints, constraint.data, true)));\n        if (!constraint.active) return;\n\n        const slot = constraint.target;\n        const slotIndex = slot.data.index;\n        const slotBone = slot.bone;\n\n        if (this.skin) this.sortPathConstraintAttachment(this.skin, slotIndex, slotBone);\n        if (this.data.defaultSkin && this.data.defaultSkin != this.skin) this.sortPathConstraintAttachment(this.data.defaultSkin, slotIndex, slotBone);\n        for (let i = 0, n = this.data.skins.length; i < n; i++) this.sortPathConstraintAttachment(this.data.skins[i], slotIndex, slotBone);\n\n        const attachment = slot.getAttachment();\n\n        if (attachment instanceof PathAttachment) this.sortPathConstraintAttachmentWith(attachment, slotBone);\n\n        const constrained = constraint.bones;\n        const boneCount = constrained.length;\n\n        for (let i = 0; i < boneCount; i++) this.sortBone(constrained[i]);\n\n        this._updateCache.push(constraint);\n\n        for (let i = 0; i < boneCount; i++) this.sortReset(constrained[i].children);\n        for (let i = 0; i < boneCount; i++) constrained[i].sorted = true;\n    }\n\n    sortTransformConstraint(constraint: TransformConstraint) {\n        constraint.active = constraint.target.isActive() && (!constraint.data.skinRequired || (this.skin && Utils.contains(this.skin.constraints, constraint.data, true)));\n        if (!constraint.active) return;\n\n        this.sortBone(constraint.target);\n\n        const constrained = constraint.bones;\n        const boneCount = constrained.length;\n\n        if (constraint.data.local) {\n            for (let i = 0; i < boneCount; i++) {\n                const child = constrained[i];\n\n                this.sortBone(child.parent);\n                this.sortBone(child);\n            }\n        } else {\n            for (let i = 0; i < boneCount; i++) {\n                this.sortBone(constrained[i]);\n            }\n        }\n\n        this._updateCache.push(constraint);\n\n        for (let i = 0; i < boneCount; i++) this.sortReset(constrained[i].children);\n        for (let i = 0; i < boneCount; i++) constrained[i].sorted = true;\n    }\n\n    sortPathConstraintAttachment(skin: Skin, slotIndex: number, slotBone: Bone) {\n        const attachments = skin.attachments[slotIndex];\n\n        if (!attachments) return;\n        for (const key in attachments) {\n            this.sortPathConstraintAttachmentWith(attachments[key], slotBone);\n        }\n    }\n\n    sortPathConstraintAttachmentWith(attachment: Attachment, slotBone: Bone) {\n        if (!(attachment instanceof PathAttachment)) return;\n        const pathBones = (<PathAttachment>attachment).bones;\n\n        if (!pathBones) this.sortBone(slotBone);\n        else {\n            const bones = this.bones;\n\n            for (let i = 0, n = pathBones.length; i < n; ) {\n                let nn = pathBones[i++];\n\n                nn += i;\n                while (i < nn) this.sortBone(bones[pathBones[i++]]);\n            }\n        }\n    }\n\n    sortBone(bone: Bone) {\n        if (!bone) return;\n        if (bone.sorted) return;\n        const parent = bone.parent;\n\n        if (parent) this.sortBone(parent);\n        bone.sorted = true;\n        this._updateCache.push(bone);\n    }\n\n    sortReset(bones: Array<Bone>) {\n        for (let i = 0, n = bones.length; i < n; i++) {\n            const bone = bones[i];\n\n            if (!bone.active) continue;\n            if (bone.sorted) this.sortReset(bone.children);\n            bone.sorted = false;\n        }\n    }\n\n    /** Updates the world transform for each bone and applies all constraints.\n     *\n     * See [World transforms](http://esotericsoftware.com/spine-runtime-skeletons#World-transforms) in the Spine\n     * Runtimes Guide. */\n    updateWorldTransform() {\n        const bones = this.bones;\n\n        for (let i = 0, n = bones.length; i < n; i++) {\n            const bone = bones[i];\n\n            bone.ax = bone.x;\n            bone.ay = bone.y;\n            bone.arotation = bone.rotation;\n            bone.ascaleX = bone.scaleX;\n            bone.ascaleY = bone.scaleY;\n            bone.ashearX = bone.shearX;\n            bone.ashearY = bone.shearY;\n        }\n\n        const updateCache = this._updateCache;\n\n        for (let i = 0, n = updateCache.length; i < n; i++) updateCache[i].update();\n    }\n\n    updateWorldTransformWith(parent: Bone) {\n        // Apply the parent bone transform to the root bone. The root bone always inherits scale, rotation and reflection.\n        const rootBone = this.getRootBone();\n        const pa = parent.matrix.a;\n        const pb = parent.matrix.c;\n        const pc = parent.matrix.b;\n        const pd = parent.matrix.d;\n\n        rootBone.matrix.tx = pa * this.x + pb * this.y + parent.worldX;\n        rootBone.matrix.ty = pc * this.x + pd * this.y + parent.worldY;\n\n        const rotationY = rootBone.rotation + 90 + rootBone.shearY;\n        const la = MathUtils.cosDeg(rootBone.rotation + rootBone.shearX) * rootBone.scaleX;\n        const lb = MathUtils.cosDeg(rotationY) * rootBone.scaleY;\n        const lc = MathUtils.sinDeg(rootBone.rotation + rootBone.shearX) * rootBone.scaleX;\n        const ld = MathUtils.sinDeg(rotationY) * rootBone.scaleY;\n\n        const sx = this.scaleX;\n        const sy = settings.yDown ? -this.scaleY : this.scaleY;\n\n        rootBone.matrix.a = (pa * la + pb * lc) * sx;\n        rootBone.matrix.c = (pa * lb + pb * ld) * sx;\n        rootBone.matrix.b = (pc * la + pd * lc) * sy;\n        rootBone.matrix.d = (pc * lb + pd * ld) * sy;\n\n        // Update everything except root bone.\n        const updateCache = this._updateCache;\n\n        for (let i = 0, n = updateCache.length; i < n; i++) {\n            const updatable = updateCache[i];\n\n            if (updatable != rootBone) updatable.update();\n        }\n    }\n\n    /** Sets the bones, constraints, and slots to their setup pose values. */\n    setToSetupPose() {\n        this.setBonesToSetupPose();\n        this.setSlotsToSetupPose();\n    }\n\n    /** Sets the bones and constraints to their setup pose values. */\n    setBonesToSetupPose() {\n        const bones = this.bones;\n\n        for (let i = 0, n = bones.length; i < n; i++) bones[i].setToSetupPose();\n\n        const ikConstraints = this.ikConstraints;\n\n        for (let i = 0, n = ikConstraints.length; i < n; i++) {\n            const constraint = ikConstraints[i];\n\n            constraint.mix = constraint.data.mix;\n            constraint.softness = constraint.data.softness;\n            constraint.bendDirection = constraint.data.bendDirection;\n            constraint.compress = constraint.data.compress;\n            constraint.stretch = constraint.data.stretch;\n        }\n\n        const transformConstraints = this.transformConstraints;\n\n        for (let i = 0, n = transformConstraints.length; i < n; i++) {\n            const constraint = transformConstraints[i];\n            const data = constraint.data;\n\n            constraint.mixRotate = data.mixRotate;\n            constraint.mixX = data.mixX;\n            constraint.mixY = data.mixY;\n            constraint.mixScaleX = data.mixScaleX;\n            constraint.mixScaleY = data.mixScaleY;\n            constraint.mixShearY = data.mixShearY;\n        }\n\n        const pathConstraints = this.pathConstraints;\n\n        for (let i = 0, n = pathConstraints.length; i < n; i++) {\n            const constraint = pathConstraints[i];\n            const data = constraint.data;\n\n            constraint.position = data.position;\n            constraint.spacing = data.spacing;\n            constraint.mixRotate = data.mixRotate;\n            constraint.mixX = data.mixX;\n            constraint.mixY = data.mixY;\n        }\n    }\n\n    /** Sets the slots and draw order to their setup pose values. */\n    setSlotsToSetupPose() {\n        const slots = this.slots;\n\n        Utils.arrayCopy(slots, 0, this.drawOrder, 0, slots.length);\n        for (let i = 0, n = slots.length; i < n; i++) slots[i].setToSetupPose();\n    }\n\n    /** @returns May return null. */\n    getRootBone() {\n        if (this.bones.length == 0) return null;\n\n        return this.bones[0];\n    }\n\n    /** @returns May be null. */\n    findBone(boneName: string) {\n        if (!boneName) throw new Error('boneName cannot be null.');\n        const bones = this.bones;\n\n        for (let i = 0, n = bones.length; i < n; i++) {\n            const bone = bones[i];\n\n            if (bone.data.name == boneName) return bone;\n        }\n\n        return null;\n    }\n\n    /** @returns -1 if the bone was not found. */\n    findBoneIndex(boneName: string) {\n        if (!boneName) throw new Error('boneName cannot be null.');\n        const bones = this.bones;\n\n        for (let i = 0, n = bones.length; i < n; i++) if (bones[i].data.name == boneName) return i;\n\n        return -1;\n    }\n\n    /** Finds a slot by comparing each slot's name. It is more efficient to cache the results of this method than to call it\n     * repeatedly.\n     * @returns May be null. */\n    findSlot(slotName: string) {\n        if (!slotName) throw new Error('slotName cannot be null.');\n        const slots = this.slots;\n\n        for (let i = 0, n = slots.length; i < n; i++) {\n            const slot = slots[i];\n\n            if (slot.data.name == slotName) return slot;\n        }\n\n        return null;\n    }\n\n    /** @returns -1 if the bone was not found. */\n    findSlotIndex(slotName: string) {\n        if (!slotName) throw new Error('slotName cannot be null.');\n        const slots = this.slots;\n\n        for (let i = 0, n = slots.length; i < n; i++) if (slots[i].data.name == slotName) return i;\n\n        return -1;\n    }\n\n    /** Sets a skin by name.\n     *\n     * See {@link #setSkin()}. */\n    setSkinByName(skinName: string) {\n        const skin = this.data.findSkin(skinName);\n\n        if (!skin) throw new Error(`Skin not found: ${skinName}`);\n        this.setSkin(skin);\n    }\n\n    /** Sets the skin used to look up attachments before looking in the {@link SkeletonData#defaultSkin default skin}. If the\n     * skin is changed, {@link #updateCache()} is called.\n     *\n     * Attachments from the new skin are attached if the corresponding attachment from the old skin was attached. If there was no\n     * old skin, each slot's setup mode attachment is attached from the new skin.\n     *\n     * After changing the skin, the visible attachments can be reset to those attached in the setup pose by calling\n     * {@link #setSlotsToSetupPose()}. Also, often {@link AnimationState#apply()} is called before the next time the\n     * skeleton is rendered to allow any attachment keys in the current animation(s) to hide or show attachments from the new skin.\n     * @param newSkin May be null. */\n    setSkin(newSkin: Skin) {\n        if (newSkin == this.skin) return;\n        if (newSkin) {\n            if (this.skin) newSkin.attachAll(this, this.skin);\n            else {\n                const slots = this.slots;\n\n                for (let i = 0, n = slots.length; i < n; i++) {\n                    const slot = slots[i];\n                    const name = slot.data.attachmentName;\n\n                    if (name) {\n                        const attachment = newSkin.getAttachment(i, name);\n\n                        if (attachment) slot.setAttachment(attachment);\n                    }\n                }\n            }\n        }\n        this.skin = newSkin;\n        this.updateCache();\n    }\n\n    /** Finds an attachment by looking in the {@link #skin} and {@link SkeletonData#defaultSkin} using the slot name and attachment\n     * name.\n     *\n     * See {@link #getAttachment()}.\n     * @returns May be null. */\n    getAttachmentByName(slotName: string, attachmentName: string): Attachment | null {\n        const slot = this.data.findSlot(slotName);\n\n        if (!slot) throw new Error(`Can't find slot with name ${slotName}`);\n\n        return this.getAttachment(slot.index, attachmentName);\n    }\n\n    /** Finds an attachment by looking in the {@link #skin} and {@link SkeletonData#defaultSkin} using the slot index and\n     * attachment name. First the skin is checked and if the attachment was not found, the default skin is checked.\n     *\n     * See [Runtime skins](http://esotericsoftware.com/spine-runtime-skins) in the Spine Runtimes Guide.\n     * @returns May be null. */\n    getAttachment(slotIndex: number, attachmentName: string): Attachment | null {\n        if (!attachmentName) throw new Error('attachmentName cannot be null.');\n        if (this.skin) {\n            const attachment = this.skin.getAttachment(slotIndex, attachmentName);\n\n            if (attachment) return attachment;\n        }\n        if (this.data.defaultSkin) return this.data.defaultSkin.getAttachment(slotIndex, attachmentName);\n\n        return null;\n    }\n\n    /** A convenience method to set an attachment by finding the slot with {@link #findSlot()}, finding the attachment with\n     * {@link #getAttachment()}, then setting the slot's {@link Slot#attachment}.\n     * @param attachmentName May be null to clear the slot's attachment. */\n    setAttachment(slotName: string, attachmentName: string) {\n        if (!slotName) throw new Error('slotName cannot be null.');\n        const slots = this.slots;\n\n        for (let i = 0, n = slots.length; i < n; i++) {\n            const slot = slots[i];\n\n            if (slot.data.name == slotName) {\n                let attachment: Attachment | null = null;\n\n                if (attachmentName) {\n                    attachment = this.getAttachment(i, attachmentName);\n                    if (!attachment) throw new Error(`Attachment not found: ${attachmentName}, for slot: ${slotName}`);\n                }\n                slot.setAttachment(attachment);\n\n                return;\n            }\n        }\n        throw new Error(`Slot not found: ${slotName}`);\n    }\n\n    /** Finds an IK constraint by comparing each IK constraint's name. It is more efficient to cache the results of this method\n     * than to call it repeatedly.\n     * @return May be null. */\n    findIkConstraint(constraintName: string) {\n        if (!constraintName) throw new Error('constraintName cannot be null.');\n        const ikConstraints = this.ikConstraints;\n\n        for (let i = 0, n = ikConstraints.length; i < n; i++) {\n            const ikConstraint = ikConstraints[i];\n\n            if (ikConstraint.data.name == constraintName) return ikConstraint;\n        }\n\n        return null;\n    }\n\n    /** Finds a transform constraint by comparing each transform constraint's name. It is more efficient to cache the results of\n     * this method than to call it repeatedly.\n     * @return May be null. */\n    findTransformConstraint(constraintName: string) {\n        if (!constraintName) throw new Error('constraintName cannot be null.');\n        const transformConstraints = this.transformConstraints;\n\n        for (let i = 0, n = transformConstraints.length; i < n; i++) {\n            const constraint = transformConstraints[i];\n\n            if (constraint.data.name == constraintName) return constraint;\n        }\n\n        return null;\n    }\n\n    /** Finds a path constraint by comparing each path constraint's name. It is more efficient to cache the results of this method\n     * than to call it repeatedly.\n     * @return May be null. */\n    findPathConstraint(constraintName: string) {\n        if (!constraintName) throw new Error('constraintName cannot be null.');\n        const pathConstraints = this.pathConstraints;\n\n        for (let i = 0, n = pathConstraints.length; i < n; i++) {\n            const constraint = pathConstraints[i];\n\n            if (constraint.data.name == constraintName) return constraint;\n        }\n\n        return null;\n    }\n\n    /** Returns the axis aligned bounding box (AABB) of the region and mesh attachments for the current pose as `{ x: number, y: number, width: number, height: number }`.\n     * Note that this method will create temporary objects which can add to garbage collection pressure. Use `getBounds()` if garbage collection is a concern. */\n    getBoundsRect() {\n        const offset = new Vector2();\n        const size = new Vector2();\n\n        this.getBounds(offset, size);\n\n        return { x: offset.x, y: offset.y, width: size.x, height: size.y };\n    }\n\n    /** Returns the axis aligned bounding box (AABB) of the region and mesh attachments for the current pose.\n     * @param offset An output value, the distance from the skeleton origin to the bottom left corner of the AABB.\n     * @param size An output value, the width and height of the AABB.\n     * @param temp Working memory to temporarily store attachments' computed world vertices. */\n    getBounds(offset: Vector2, size: Vector2, temp: Array<number> = new Array<number>(2)) {\n        if (!offset) throw new Error('offset cannot be null.');\n        if (!size) throw new Error('size cannot be null.');\n        const drawOrder = this.drawOrder;\n        let minX = Number.POSITIVE_INFINITY;\n        let minY = Number.POSITIVE_INFINITY;\n        let maxX = Number.NEGATIVE_INFINITY;\n        let maxY = Number.NEGATIVE_INFINITY;\n\n        for (let i = 0, n = drawOrder.length; i < n; i++) {\n            const slot = drawOrder[i];\n\n            if (!slot.bone.active) continue;\n            let verticesLength = 0;\n            let vertices: NumberArrayLike | null = null;\n            const attachment = slot.getAttachment();\n\n            if (attachment instanceof RegionAttachment) {\n                verticesLength = 8;\n                vertices = Utils.setArraySize(temp, verticesLength, 0);\n                (<RegionAttachment>attachment).computeWorldVertices(slot, vertices, 0, 2);\n            } else if (attachment instanceof MeshAttachment) {\n                const mesh = <MeshAttachment>attachment;\n\n                verticesLength = mesh.worldVerticesLength;\n                vertices = Utils.setArraySize(temp, verticesLength, 0);\n                mesh.computeWorldVertices(slot, 0, verticesLength, vertices, 0, 2);\n            }\n            if (vertices) {\n                for (let ii = 0, nn = vertices.length; ii < nn; ii += 2) {\n                    const x = vertices[ii];\n                    const y = vertices[ii + 1];\n\n                    minX = Math.min(minX, x);\n                    minY = Math.min(minY, y);\n                    maxX = Math.max(maxX, x);\n                    maxY = Math.max(maxY, y);\n                }\n            }\n        }\n        offset.set(minX, minY);\n        size.set(maxX - minX, maxY - minY);\n    }\n\n    get flipX(): boolean {\n        return this.scaleX == -1;\n    }\n\n    set flipX(value: boolean) {\n        if (!Skeleton.deprecatedWarning1) {\n            Skeleton.deprecatedWarning1 = true;\n            console.warn('Spine Deprecation Warning: `Skeleton.flipX/flipY` was deprecated, please use scaleX/scaleY');\n        }\n        this.scaleX = value ? 1.0 : -1.0;\n    }\n\n    get flipY(): boolean {\n        return this.scaleY == -1;\n    }\n\n    set flipY(value: boolean) {\n        if (!Skeleton.deprecatedWarning1) {\n            Skeleton.deprecatedWarning1 = true;\n            console.warn('Spine Deprecation Warning: `Skeleton.flipX/flipY` was deprecated, please use scaleX/scaleY');\n        }\n        this.scaleY = value ? 1.0 : -1.0;\n    }\n\n    private static deprecatedWarning1 = false;\n}\n","import type { ISkeletonData } from '@pixi-spine/base';\nimport type { Animation } from './Animation';\nimport type { BoneData } from './BoneData';\nimport type { SlotData } from './SlotData';\nimport type { Skin } from './Skin';\nimport type { EventData } from './EventData';\nimport type { IkConstraintData } from './IkConstraintData';\nimport type { TransformConstraintData } from './TransformConstraintData';\nimport type { PathConstraintData } from './PathConstraintData';\n\n/** Stores the setup pose and all of the stateless data for a skeleton.\n *\n * See [Data objects](http://esotericsoftware.com/spine-runtime-architecture#Data-objects) in the Spine Runtimes\n * Guide.\n * @public\n * */\nexport class SkeletonData implements ISkeletonData<BoneData, SlotData, Skin, Animation, EventData, IkConstraintData, TransformConstraintData, PathConstraintData> {\n    /** The skeleton's name, which by default is the name of the skeleton data file, if possible. May be null. */\n    name: string | null = null;\n\n    /** The skeleton's bones, sorted parent first. The root bone is always the first bone. */\n    bones = new Array<BoneData>(); // Ordered parents first.\n\n    /** The skeleton's slots. */\n    slots = new Array<SlotData>(); // Setup pose draw order.\n    skins = new Array<Skin>();\n\n    /** The skeleton's default skin. By default this skin contains all attachments that were not in a skin in Spine.\n     *\n     * See {@link Skeleton#getAttachmentByName()}.\n     * May be null. */\n    defaultSkin: Skin | null = null;\n\n    /** The skeleton's events. */\n    events = new Array<EventData>();\n\n    /** The skeleton's animations. */\n    animations = new Array<Animation>();\n\n    /** The skeleton's IK constraints. */\n    ikConstraints = new Array<IkConstraintData>();\n\n    /** The skeleton's transform constraints. */\n    transformConstraints = new Array<TransformConstraintData>();\n\n    /** The skeleton's path constraints. */\n    pathConstraints = new Array<PathConstraintData>();\n\n    /** The X coordinate of the skeleton's axis aligned bounding box in the setup pose. */\n    x = 0;\n\n    /** The Y coordinate of the skeleton's axis aligned bounding box in the setup pose. */\n    y = 0;\n\n    /** The width of the skeleton's axis aligned bounding box in the setup pose. */\n    width = 0;\n\n    /** The height of the skeleton's axis aligned bounding box in the setup pose. */\n    height = 0;\n\n    /** The Spine version used to export the skeleton data, or null. */\n    version: string | null = null;\n\n    /** The skeleton data hash. This value will change if any of the skeleton data has changed. May be null. */\n    hash: string | null = null;\n\n    // Nonessential\n    /** The dopesheet FPS in Spine. Available only when nonessential data was exported. */\n    fps = 0;\n\n    /** The path to the images directory as defined in Spine. Available only when nonessential data was exported. May be null. */\n    imagesPath: string | null = null;\n\n    /** The path to the audio directory as defined in Spine. Available only when nonessential data was exported. May be null. */\n    audioPath: string | null = null;\n\n    /** Finds a bone by comparing each bone's name. It is more efficient to cache the results of this method than to call it\n     * multiple times.\n     * @returns May be null. */\n    findBone(boneName: string) {\n        if (!boneName) throw new Error('boneName cannot be null.');\n        const bones = this.bones;\n\n        for (let i = 0, n = bones.length; i < n; i++) {\n            const bone = bones[i];\n\n            if (bone.name == boneName) return bone;\n        }\n\n        return null;\n    }\n\n    /** removed from spine-ts runtime **/\n    findBoneIndex(boneName: string) {\n        if (!boneName) throw new Error('boneName cannot be null.');\n        const bones = this.bones;\n\n        for (let i = 0, n = bones.length; i < n; i++) if (bones[i].name == boneName) return i;\n\n        return -1;\n    }\n\n    /** Finds a slot by comparing each slot's name. It is more efficient to cache the results of this method than to call it\n     * multiple times.\n     * @returns May be null. */\n    findSlot(slotName: string) {\n        if (!slotName) throw new Error('slotName cannot be null.');\n        const slots = this.slots;\n\n        for (let i = 0, n = slots.length; i < n; i++) {\n            const slot = slots[i];\n\n            if (slot.name == slotName) return slot;\n        }\n\n        return null;\n    }\n\n    /** removed from spine-ts runtime **/\n    findSlotIndex(slotName: string) {\n        if (!slotName) throw new Error('slotName cannot be null.');\n        const slots = this.slots;\n\n        for (let i = 0, n = slots.length; i < n; i++) if (slots[i].name == slotName) return i;\n\n        return -1;\n    }\n\n    /** Finds a skin by comparing each skin's name. It is more efficient to cache the results of this method than to call it\n     * multiple times.\n     * @returns May be null. */\n    findSkin(skinName: string) {\n        if (!skinName) throw new Error('skinName cannot be null.');\n        const skins = this.skins;\n\n        for (let i = 0, n = skins.length; i < n; i++) {\n            const skin = skins[i];\n\n            if (skin.name == skinName) return skin;\n        }\n\n        return null;\n    }\n\n    /** Finds an event by comparing each events's name. It is more efficient to cache the results of this method than to call it\n     * multiple times.\n     * @returns May be null. */\n    findEvent(eventDataName: string) {\n        if (!eventDataName) throw new Error('eventDataName cannot be null.');\n        const events = this.events;\n\n        for (let i = 0, n = events.length; i < n; i++) {\n            const event = events[i];\n\n            if (event.name == eventDataName) return event;\n        }\n\n        return null;\n    }\n\n    /** Finds an animation by comparing each animation's name. It is more efficient to cache the results of this method than to\n     * call it multiple times.\n     * @returns May be null. */\n    findAnimation(animationName: string) {\n        if (!animationName) throw new Error('animationName cannot be null.');\n        const animations = this.animations;\n\n        for (let i = 0, n = animations.length; i < n; i++) {\n            const animation = animations[i];\n\n            if (animation.name == animationName) return animation;\n        }\n\n        return null;\n    }\n\n    /** Finds an IK constraint by comparing each IK constraint's name. It is more efficient to cache the results of this method\n     * than to call it multiple times.\n     * @return May be null. */\n    findIkConstraint(constraintName: string) {\n        if (!constraintName) throw new Error('constraintName cannot be null.');\n        const ikConstraints = this.ikConstraints;\n\n        for (let i = 0, n = ikConstraints.length; i < n; i++) {\n            const constraint = ikConstraints[i];\n\n            if (constraint.name == constraintName) return constraint;\n        }\n\n        return null;\n    }\n\n    /** Finds a transform constraint by comparing each transform constraint's name. It is more efficient to cache the results of\n     * this method than to call it multiple times.\n     * @return May be null. */\n    findTransformConstraint(constraintName: string) {\n        if (!constraintName) throw new Error('constraintName cannot be null.');\n        const transformConstraints = this.transformConstraints;\n\n        for (let i = 0, n = transformConstraints.length; i < n; i++) {\n            const constraint = transformConstraints[i];\n\n            if (constraint.name == constraintName) return constraint;\n        }\n\n        return null;\n    }\n\n    /** Finds a path constraint by comparing each path constraint's name. It is more efficient to cache the results of this method\n     * than to call it multiple times.\n     * @return May be null. */\n    findPathConstraint(constraintName: string) {\n        if (!constraintName) throw new Error('constraintName cannot be null.');\n        const pathConstraints = this.pathConstraints;\n\n        for (let i = 0, n = pathConstraints.length; i < n; i++) {\n            const constraint = pathConstraints[i];\n\n            if (constraint.name == constraintName) return constraint;\n        }\n\n        return null;\n    }\n\n    /** removed from spine-ts runtime **/ findPathConstraintIndex(pathConstraintName: string) {\n        if (pathConstraintName == null) throw new Error('pathConstraintName cannot be null.');\n        const pathConstraints = this.pathConstraints;\n\n        for (let i = 0, n = pathConstraints.length; i < n; i++) if (pathConstraints[i].name == pathConstraintName) return i;\n\n        return -1;\n    }\n}\n","import { Color } from '@pixi-spine/base';\n\nimport type { ISlotData } from '@pixi-spine/base';\nimport { BLEND_MODES } from '@pixi/core';\nimport type { BoneData } from './BoneData';\n\n/** Stores the setup pose for a {@link Slot}.\n * @public\n * */\nexport class SlotData implements ISlotData {\n    /** The index of the slot in {@link Skeleton#getSlots()}. */\n    index = 0;\n\n    /** The name of the slot, which is unique across all slots in the skeleton. */\n    name: string;\n\n    /** The bone this slot belongs to. */\n    boneData: BoneData;\n\n    /** The color used to tint the slot's attachment. If {@link #getDarkColor()} is set, this is used as the light color for two\n     * color tinting. */\n    color = new Color(1, 1, 1, 1);\n\n    /** The dark color used to tint the slot's attachment for two color tinting, or null if two color tinting is not used. The dark\n     * color's alpha is not used. */\n    darkColor: Color | null = null;\n\n    /** The name of the attachment that is visible for this slot in the setup pose, or null if no attachment is visible. */\n    attachmentName: string | null = null;\n\n    /** The blend mode for drawing the slot's attachment. */\n    blendMode: BLEND_MODES = BLEND_MODES.NORMAL;\n\n    constructor(index: number, name: string, boneData: BoneData) {\n        if (index < 0) throw new Error('index must be >= 0.');\n        if (!name) throw new Error('name cannot be null.');\n        if (!boneData) throw new Error('boneData cannot be null.');\n        this.index = index;\n        this.name = name;\n        this.boneData = boneData;\n    }\n}\n","import type { BoneData } from './BoneData';\nimport { ConstraintData } from './ConstraintData';\n\n/** Stores the setup pose for a {@link TransformConstraint}.\n *\n * See [Transform constraints](http://esotericsoftware.com/spine-transform-constraints) in the Spine User Guide.\n * @public\n * */\nexport class TransformConstraintData extends ConstraintData {\n    /** The bones that will be modified by this transform constraint. */\n    bones = new Array<BoneData>();\n\n    /** The target bone whose world transform will be copied to the constrained bones. */\n    private _target: BoneData | null = null;\n    public set target(boneData: BoneData) {\n        this._target = boneData;\n    }\n    public get target() {\n        if (!this._target) throw new Error('BoneData not set.');\n        else return this._target;\n    }\n\n    mixRotate = 0;\n    mixX = 0;\n    mixY = 0;\n    mixScaleX = 0;\n    mixScaleY = 0;\n    mixShearY = 0;\n\n    /** An offset added to the constrained bone rotation. */\n    offsetRotation = 0;\n\n    /** An offset added to the constrained bone X translation. */\n    offsetX = 0;\n\n    /** An offset added to the constrained bone Y translation. */\n    offsetY = 0;\n\n    /** An offset added to the constrained bone scaleX. */\n    offsetScaleX = 0;\n\n    /** An offset added to the constrained bone scaleY. */\n    offsetScaleY = 0;\n\n    /** An offset added to the constrained bone shearY. */\n    offsetShearY = 0;\n\n    relative = false;\n    local = false;\n\n    constructor(name: string) {\n        super(name, 0, false);\n    }\n}\n","import { Attachment, MeshAttachment } from './attachments';\nimport type { BoneData } from './BoneData';\nimport type { ConstraintData } from './ConstraintData';\nimport type { Skeleton } from './Skeleton';\n\nimport type { StringMap, ISkin } from '@pixi-spine/base';\n\n/** Stores an entry in the skin consisting of the slot index, name, and attachment\n * @public\n * **/\nexport class SkinEntry {\n    constructor(public slotIndex: number, public name: string, public attachment: Attachment) {}\n}\n\n/** Stores attachments by slot index and attachment name.\n *\n * See SkeletonData {@link SkeletonData#defaultSkin}, Skeleton {@link Skeleton#skin}, and\n * [Runtime skins](http://esotericsoftware.com/spine-runtime-skins) in the Spine Runtimes Guide.\n * @public\n * */\nexport class Skin implements ISkin {\n    /** The skin's name, which is unique across all skins in the skeleton. */\n    name: string;\n\n    attachments = new Array<StringMap<Attachment>>();\n    bones = Array<BoneData>();\n    constraints = new Array<ConstraintData>();\n\n    constructor(name: string) {\n        if (!name) throw new Error('name cannot be null.');\n        this.name = name;\n    }\n\n    /** Adds an attachment to the skin for the specified slot index and name. */\n    setAttachment(slotIndex: number, name: string, attachment: Attachment) {\n        if (!attachment) throw new Error('attachment cannot be null.');\n        const attachments = this.attachments;\n\n        if (slotIndex >= attachments.length) attachments.length = slotIndex + 1;\n        if (!attachments[slotIndex]) attachments[slotIndex] = {};\n        attachments[slotIndex][name] = attachment;\n    }\n\n    /** Adds all attachments, bones, and constraints from the specified skin to this skin. */\n    addSkin(skin: Skin) {\n        for (let i = 0; i < skin.bones.length; i++) {\n            const bone = skin.bones[i];\n            let contained = false;\n\n            for (let ii = 0; ii < this.bones.length; ii++) {\n                if (this.bones[ii] == bone) {\n                    contained = true;\n                    break;\n                }\n            }\n            if (!contained) this.bones.push(bone);\n        }\n\n        for (let i = 0; i < skin.constraints.length; i++) {\n            const constraint = skin.constraints[i];\n            let contained = false;\n\n            for (let ii = 0; ii < this.constraints.length; ii++) {\n                if (this.constraints[ii] == constraint) {\n                    contained = true;\n                    break;\n                }\n            }\n            if (!contained) this.constraints.push(constraint);\n        }\n\n        const attachments = skin.getAttachments();\n\n        for (let i = 0; i < attachments.length; i++) {\n            const attachment = attachments[i];\n\n            this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);\n        }\n    }\n\n    /** Adds all bones and constraints and copies of all attachments from the specified skin to this skin. Mesh attachments are not\n     * copied, instead a new linked mesh is created. The attachment copies can be modified without affecting the originals. */\n    copySkin(skin: Skin) {\n        for (let i = 0; i < skin.bones.length; i++) {\n            const bone = skin.bones[i];\n            let contained = false;\n\n            for (let ii = 0; ii < this.bones.length; ii++) {\n                if (this.bones[ii] == bone) {\n                    contained = true;\n                    break;\n                }\n            }\n            if (!contained) this.bones.push(bone);\n        }\n\n        for (let i = 0; i < skin.constraints.length; i++) {\n            const constraint = skin.constraints[i];\n            let contained = false;\n\n            for (let ii = 0; ii < this.constraints.length; ii++) {\n                if (this.constraints[ii] == constraint) {\n                    contained = true;\n                    break;\n                }\n            }\n            if (!contained) this.constraints.push(constraint);\n        }\n\n        const attachments = skin.getAttachments();\n\n        for (let i = 0; i < attachments.length; i++) {\n            const attachment = attachments[i];\n\n            if (!attachment.attachment) continue;\n            if (attachment.attachment instanceof MeshAttachment) {\n                attachment.attachment = attachment.attachment.newLinkedMesh();\n                this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);\n            } else {\n                attachment.attachment = attachment.attachment.copy();\n                this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);\n            }\n        }\n    }\n\n    /** Returns the attachment for the specified slot index and name, or null. */\n    getAttachment(slotIndex: number, name: string): Attachment | null {\n        const dictionary = this.attachments[slotIndex];\n\n        return dictionary ? dictionary[name] : null;\n    }\n\n    /** Removes the attachment in the skin for the specified slot index and name, if any. */\n    removeAttachment(slotIndex: number, name: string) {\n        const dictionary = this.attachments[slotIndex];\n\n        if (dictionary) delete dictionary[name];\n    }\n\n    /** Returns all attachments in this skin. */\n    getAttachments(): Array<SkinEntry> {\n        const entries = new Array<SkinEntry>();\n\n        for (let i = 0; i < this.attachments.length; i++) {\n            const slotAttachments = this.attachments[i];\n\n            if (slotAttachments) {\n                for (const name in slotAttachments) {\n                    const attachment = slotAttachments[name];\n\n                    if (attachment) entries.push(new SkinEntry(i, name, attachment));\n                }\n            }\n        }\n\n        return entries;\n    }\n\n    /** Returns all attachments in this skin for the specified slot index. */\n    getAttachmentsForSlot(slotIndex: number, attachments: Array<SkinEntry>) {\n        const slotAttachments = this.attachments[slotIndex];\n\n        if (slotAttachments) {\n            for (const name in slotAttachments) {\n                const attachment = slotAttachments[name];\n\n                if (attachment) attachments.push(new SkinEntry(slotIndex, name, attachment));\n            }\n        }\n    }\n\n    /** Clears all attachments, bones, and constraints. */\n    clear() {\n        this.attachments.length = 0;\n        this.bones.length = 0;\n        this.constraints.length = 0;\n    }\n\n    /** Attach each attachment in this skin if the corresponding attachment in the old skin is currently attached. */\n    attachAll(skeleton: Skeleton, oldSkin: Skin) {\n        let slotIndex = 0;\n\n        for (let i = 0; i < skeleton.slots.length; i++) {\n            const slot = skeleton.slots[i];\n            const slotAttachment = slot.getAttachment();\n\n            if (slotAttachment && slotIndex < oldSkin.attachments.length) {\n                const dictionary = oldSkin.attachments[slotIndex];\n\n                for (const key in dictionary) {\n                    const skinAttachment: Attachment = dictionary[key];\n\n                    if (slotAttachment == skinAttachment) {\n                        const attachment = this.getAttachment(slotIndex, key);\n\n                        if (attachment) slot.setAttachment(attachment);\n                        break;\n                    }\n                }\n            }\n            slotIndex++;\n        }\n    }\n}\n","import type { Attachment, AttachmentLoader, MeshAttachment, VertexAttachment } from './attachments';\nimport {\n    AlphaTimeline,\n    Animation,\n    AttachmentTimeline,\n    CurveTimeline,\n    CurveTimeline1,\n    CurveTimeline2,\n    DeformTimeline,\n    DrawOrderTimeline,\n    EventTimeline,\n    IkConstraintTimeline,\n    PathConstraintMixTimeline,\n    PathConstraintPositionTimeline,\n    PathConstraintSpacingTimeline,\n    RGB2Timeline,\n    RGBA2Timeline,\n    RGBATimeline,\n    RGBTimeline,\n    RotateTimeline,\n    ScaleTimeline,\n    ScaleXTimeline,\n    ScaleYTimeline,\n    SequenceTimeline,\n    ShearTimeline,\n    ShearXTimeline,\n    ShearYTimeline,\n    Timeline,\n    TransformConstraintTimeline,\n    TranslateTimeline,\n    TranslateXTimeline,\n    TranslateYTimeline,\n} from './Animation';\nimport { Event } from './Event';\nimport { SkeletonData } from './SkeletonData';\nimport { SlotData } from './SlotData';\nimport { BoneData } from './BoneData';\nimport { IkConstraintData } from './IkConstraintData';\nimport { TransformConstraintData } from './TransformConstraintData';\nimport { PathConstraintData, SpacingMode } from './PathConstraintData';\nimport { Skin } from './Skin';\nimport { EventData } from './EventData';\nimport { AttachmentType, BinaryInput, Color, IHasTextureRegion, PositionMode, Utils } from '@pixi-spine/base';\nimport { BLEND_MODES } from '@pixi/core';\nimport { Sequence, SequenceModeValues } from './attachments';\n\n/** Loads skeleton data in the Spine binary format.\n *\n * See [Spine binary format](http://esotericsoftware.com/spine-binary-format) and\n * [JSON and binary data](http://esotericsoftware.com/spine-loading-skeleton-data#JSON-and-binary-data) in the Spine\n * Runtimes Guide.\n * @public\n * */\nexport class SkeletonBinary {\n    ver40 = false;\n    static BlendModeValues = [BLEND_MODES.NORMAL, BLEND_MODES.ADD, BLEND_MODES.MULTIPLY, BLEND_MODES.SCREEN];\n    /** Scales bone positions, image sizes, and translations as they are loaded. This allows different size images to be used at\n     * runtime than were used in Spine.\n     *\n     * See [Scaling](http://esotericsoftware.com/spine-loading-skeleton-data#Scaling) in the Spine Runtimes Guide. */\n    scale = 1;\n\n    attachmentLoader: AttachmentLoader;\n    private linkedMeshes = new Array<LinkedMesh>();\n\n    constructor(attachmentLoader: AttachmentLoader) {\n        this.attachmentLoader = attachmentLoader;\n    }\n\n    readSkeletonData(binary: Uint8Array): SkeletonData {\n        const scale = this.scale;\n\n        const skeletonData = new SkeletonData();\n\n        skeletonData.name = ''; // BOZO\n\n        const input = new BinaryInput(binary);\n\n        const lowHash = input.readInt32();\n        const highHash = input.readInt32();\n\n        skeletonData.hash = highHash == 0 && lowHash == 0 ? null : highHash.toString(16) + lowHash.toString(16);\n        skeletonData.version = input.readString();\n        const verShort = skeletonData.version.substr(0, 3);\n\n        if (verShort !== '4.0' && verShort !== '4.1') {\n            const error = `Spine 4.1 loader cant load version ${skeletonData.version}. Please configure your pixi-spine bundle`;\n\n            console.error(error);\n        }\n        this.ver40 = verShort === '4.0';\n        skeletonData.x = input.readFloat();\n        skeletonData.y = input.readFloat();\n        skeletonData.width = input.readFloat();\n        skeletonData.height = input.readFloat();\n\n        const nonessential = input.readBoolean();\n\n        if (nonessential) {\n            skeletonData.fps = input.readFloat();\n\n            skeletonData.imagesPath = input.readString();\n            skeletonData.audioPath = input.readString();\n        }\n\n        let n = 0;\n        // Strings.\n\n        n = input.readInt(true);\n        for (let i = 0; i < n; i++) {\n            const str = input.readString();\n\n            if (!str) throw new Error('String in string table must not be null.');\n            input.strings.push(str);\n        }\n\n        // Bones.\n        n = input.readInt(true);\n        for (let i = 0; i < n; i++) {\n            const name = input.readString();\n\n            if (!name) throw new Error('Bone name must not be null.');\n            const parent = i == 0 ? null : skeletonData.bones[input.readInt(true)];\n            const data = new BoneData(i, name, parent);\n\n            data.rotation = input.readFloat();\n            data.x = input.readFloat() * scale;\n            data.y = input.readFloat() * scale;\n            data.scaleX = input.readFloat();\n            data.scaleY = input.readFloat();\n            data.shearX = input.readFloat();\n            data.shearY = input.readFloat();\n            data.length = input.readFloat() * scale;\n            data.transformMode = input.readInt(true);\n            data.skinRequired = input.readBoolean();\n            if (nonessential) Color.rgba8888ToColor(data.color, input.readInt32());\n            skeletonData.bones.push(data);\n        }\n\n        // Slots.\n        n = input.readInt(true);\n        for (let i = 0; i < n; i++) {\n            const slotName = input.readString();\n\n            if (!slotName) throw new Error('Slot name must not be null.');\n            const boneData = skeletonData.bones[input.readInt(true)];\n            const data = new SlotData(i, slotName, boneData);\n\n            Color.rgba8888ToColor(data.color, input.readInt32());\n\n            const darkColor = input.readInt32();\n\n            if (darkColor != -1) Color.rgb888ToColor((data.darkColor = new Color()), darkColor);\n\n            data.attachmentName = input.readStringRef();\n            data.blendMode = input.readInt(true);\n            skeletonData.slots.push(data);\n        }\n\n        // IK constraints.\n        n = input.readInt(true);\n        for (let i = 0, nn; i < n; i++) {\n            const name = input.readString();\n\n            if (!name) throw new Error('IK constraint data name must not be null.');\n            const data = new IkConstraintData(name);\n\n            data.order = input.readInt(true);\n            data.skinRequired = input.readBoolean();\n            nn = input.readInt(true);\n            for (let ii = 0; ii < nn; ii++) data.bones.push(skeletonData.bones[input.readInt(true)]);\n            data.target = skeletonData.bones[input.readInt(true)];\n            data.mix = input.readFloat();\n            data.softness = input.readFloat() * scale;\n            data.bendDirection = input.readByte();\n            data.compress = input.readBoolean();\n            data.stretch = input.readBoolean();\n            data.uniform = input.readBoolean();\n            skeletonData.ikConstraints.push(data);\n        }\n\n        // Transform constraints.\n        n = input.readInt(true);\n        for (let i = 0, nn; i < n; i++) {\n            const name = input.readString();\n\n            if (!name) throw new Error('Transform constraint data name must not be null.');\n            const data = new TransformConstraintData(name);\n\n            data.order = input.readInt(true);\n            data.skinRequired = input.readBoolean();\n            nn = input.readInt(true);\n            for (let ii = 0; ii < nn; ii++) data.bones.push(skeletonData.bones[input.readInt(true)]);\n            data.target = skeletonData.bones[input.readInt(true)];\n            data.local = input.readBoolean();\n            data.relative = input.readBoolean();\n            data.offsetRotation = input.readFloat();\n            data.offsetX = input.readFloat() * scale;\n            data.offsetY = input.readFloat() * scale;\n            data.offsetScaleX = input.readFloat();\n            data.offsetScaleY = input.readFloat();\n            data.offsetShearY = input.readFloat();\n            data.mixRotate = input.readFloat();\n            data.mixX = input.readFloat();\n            data.mixY = input.readFloat();\n            data.mixScaleX = input.readFloat();\n            data.mixScaleY = input.readFloat();\n            data.mixShearY = input.readFloat();\n            skeletonData.transformConstraints.push(data);\n        }\n\n        // Path constraints.\n        n = input.readInt(true);\n        for (let i = 0, nn; i < n; i++) {\n            const name = input.readString();\n\n            if (!name) throw new Error('Path constraint data name must not be null.');\n            const data = new PathConstraintData(name);\n\n            data.order = input.readInt(true);\n            data.skinRequired = input.readBoolean();\n            nn = input.readInt(true);\n            for (let ii = 0; ii < nn; ii++) data.bones.push(skeletonData.bones[input.readInt(true)]);\n            data.target = skeletonData.slots[input.readInt(true)];\n            data.positionMode = input.readInt(true);\n            data.spacingMode = input.readInt(true);\n            data.rotateMode = input.readInt(true);\n            data.offsetRotation = input.readFloat();\n            data.position = input.readFloat();\n            if (data.positionMode == PositionMode.Fixed) data.position *= scale;\n            data.spacing = input.readFloat();\n            if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed) data.spacing *= scale;\n            data.mixRotate = input.readFloat();\n            data.mixX = input.readFloat();\n            data.mixY = input.readFloat();\n            skeletonData.pathConstraints.push(data);\n        }\n\n        // Default skin.\n        const defaultSkin = this.readSkin(input, skeletonData, true, nonessential);\n\n        if (defaultSkin) {\n            skeletonData.defaultSkin = defaultSkin;\n            skeletonData.skins.push(defaultSkin);\n        }\n\n        // Skins.\n        {\n            let i = skeletonData.skins.length;\n\n            Utils.setArraySize(skeletonData.skins, (n = i + input.readInt(true)));\n            for (; i < n; i++) {\n                const skin = this.readSkin(input, skeletonData, false, nonessential);\n\n                if (!skin) throw new Error('readSkin() should not have returned null.');\n                skeletonData.skins[i] = skin;\n            }\n        }\n\n        // Linked meshes.\n        n = this.linkedMeshes.length;\n        for (let i = 0; i < n; i++) {\n            const linkedMesh = this.linkedMeshes[i];\n            const skin = !linkedMesh.skin ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin);\n\n            if (!skin) throw new Error('Not skin found for linked mesh.');\n            if (!linkedMesh.parent) throw new Error('Linked mesh parent must not be null');\n            const parent = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent);\n\n            if (!parent) throw new Error(`Parent mesh not found: ${linkedMesh.parent}`);\n            linkedMesh.mesh.timelineAttachment = linkedMesh.inheritTimeline ? (parent as VertexAttachment) : linkedMesh.mesh;\n            linkedMesh.mesh.setParentMesh(parent as MeshAttachment);\n            // if (linkedMesh.mesh.region != null) linkedMesh.mesh.updateRegion();\n        }\n        this.linkedMeshes.length = 0;\n\n        // Events.\n        n = input.readInt(true);\n        for (let i = 0; i < n; i++) {\n            const eventName = input.readStringRef();\n\n            if (!eventName) throw new Error();\n            const data = new EventData(eventName);\n\n            data.intValue = input.readInt(false);\n            data.floatValue = input.readFloat();\n            data.stringValue = input.readString();\n            data.audioPath = input.readString();\n            if (data.audioPath) {\n                data.volume = input.readFloat();\n                data.balance = input.readFloat();\n            }\n            skeletonData.events.push(data);\n        }\n\n        // Animations.\n        n = input.readInt(true);\n        for (let i = 0; i < n; i++) {\n            const animationName = input.readString();\n\n            if (!animationName) throw new Error('Animatio name must not be null.');\n            skeletonData.animations.push(this.readAnimation(input, animationName, skeletonData));\n        }\n\n        return skeletonData;\n    }\n\n    private readSkin(input: BinaryInput, skeletonData: SkeletonData, defaultSkin: boolean, nonessential: boolean): Skin | null {\n        let skin = null;\n        let slotCount = 0;\n\n        if (defaultSkin) {\n            slotCount = input.readInt(true);\n            if (slotCount == 0) return null;\n            skin = new Skin('default');\n        } else {\n            const skinName = input.readStringRef();\n\n            if (!skinName) throw new Error('Skin name must not be null.');\n            skin = new Skin(skinName);\n            skin.bones.length = input.readInt(true);\n            for (let i = 0, n = skin.bones.length; i < n; i++) skin.bones[i] = skeletonData.bones[input.readInt(true)];\n\n            for (let i = 0, n = input.readInt(true); i < n; i++) skin.constraints.push(skeletonData.ikConstraints[input.readInt(true)]);\n            for (let i = 0, n = input.readInt(true); i < n; i++) skin.constraints.push(skeletonData.transformConstraints[input.readInt(true)]);\n            for (let i = 0, n = input.readInt(true); i < n; i++) skin.constraints.push(skeletonData.pathConstraints[input.readInt(true)]);\n\n            slotCount = input.readInt(true);\n        }\n\n        for (let i = 0; i < slotCount; i++) {\n            const slotIndex = input.readInt(true);\n\n            for (let ii = 0, nn = input.readInt(true); ii < nn; ii++) {\n                const name = input.readStringRef();\n\n                if (!name) throw new Error('Attachment name must not be null');\n                const attachment = this.readAttachment(input, skeletonData, skin, slotIndex, name, nonessential);\n\n                if (attachment) skin.setAttachment(slotIndex, name, attachment);\n            }\n        }\n\n        return skin;\n    }\n\n    private readAttachment(input: BinaryInput, skeletonData: SkeletonData, skin: Skin, slotIndex: number, attachmentName: string, nonessential: boolean): Attachment | null {\n        const scale = this.scale;\n\n        let name = input.readStringRef();\n\n        if (!name) name = attachmentName;\n\n        switch (input.readByte()) {\n            case AttachmentType.Region: {\n                let path = input.readStringRef();\n                const rotation = input.readFloat();\n                const x = input.readFloat();\n                const y = input.readFloat();\n                const scaleX = input.readFloat();\n                const scaleY = input.readFloat();\n                const width = input.readFloat();\n                const height = input.readFloat();\n                const color = input.readInt32();\n                const sequence = this.readSequence(input);\n\n                if (!path) path = name;\n                const region = this.attachmentLoader.newRegionAttachment(skin, name, path, sequence);\n\n                if (!region) return null;\n                region.path = path;\n                region.x = x * scale;\n                region.y = y * scale;\n                region.scaleX = scaleX;\n                region.scaleY = scaleY;\n                region.rotation = rotation;\n                region.width = width * scale;\n                region.height = height * scale;\n                Color.rgba8888ToColor(region.color, color);\n                region.sequence = sequence;\n                if (sequence == null) region.updateRegion();\n\n                return region;\n            }\n            case AttachmentType.BoundingBox: {\n                const vertexCount = input.readInt(true);\n                const vertices = this.readVertices(input, vertexCount);\n                const color = nonessential ? input.readInt32() : 0;\n\n                const box = this.attachmentLoader.newBoundingBoxAttachment(skin, name);\n\n                if (!box) return null;\n                box.worldVerticesLength = vertexCount << 1;\n                box.vertices = vertices.vertices;\n                box.bones = vertices.bones;\n                if (nonessential) Color.rgba8888ToColor(box.color, color);\n\n                return box;\n            }\n            case AttachmentType.Mesh: {\n                let path = input.readStringRef();\n                const color = input.readInt32();\n                const vertexCount = input.readInt(true);\n                const uvs = this.readFloatArray(input, vertexCount << 1, 1);\n                const triangles = this.readShortArray(input);\n                const vertices = this.readVertices(input, vertexCount);\n                const hullLength = input.readInt(true);\n                const sequence = this.readSequence(input);\n                let edges: number[] = [];\n                let width = 0;\n                let height = 0;\n\n                if (nonessential) {\n                    edges = this.readShortArray(input);\n                    width = input.readFloat();\n                    height = input.readFloat();\n                }\n\n                if (!path) path = name;\n                const mesh = this.attachmentLoader.newMeshAttachment(skin, name, path, sequence);\n\n                if (!mesh) return null;\n                mesh.path = path;\n                Color.rgba8888ToColor(mesh.color, color);\n                mesh.bones = vertices.bones;\n                mesh.vertices = vertices.vertices;\n                mesh.worldVerticesLength = vertexCount << 1;\n                mesh.triangles = triangles;\n                mesh.regionUVs = new Float32Array(uvs);\n                // if (sequence == null) mesh.updateRegion();\n                mesh.hullLength = hullLength << 1;\n                mesh.sequence = sequence;\n                if (nonessential) {\n                    mesh.edges = edges;\n                    mesh.width = width * scale;\n                    mesh.height = height * scale;\n                }\n\n                return mesh;\n            }\n            case AttachmentType.LinkedMesh: {\n                let path = input.readStringRef();\n                const color = input.readInt32();\n                const skinName = input.readStringRef();\n                const parent = input.readStringRef();\n                const inheritTimelines = input.readBoolean();\n                const sequence = this.readSequence(input);\n                let width = 0;\n                let height = 0;\n\n                if (nonessential) {\n                    width = input.readFloat();\n                    height = input.readFloat();\n                }\n\n                if (!path) path = name;\n                const mesh = this.attachmentLoader.newMeshAttachment(skin, name, path, sequence);\n\n                if (!mesh) return null;\n                mesh.path = path;\n                Color.rgba8888ToColor(mesh.color, color);\n                mesh.sequence = sequence;\n                if (nonessential) {\n                    mesh.width = width * scale;\n                    mesh.height = height * scale;\n                }\n                this.linkedMeshes.push(new LinkedMesh(mesh, skinName, slotIndex, parent, inheritTimelines));\n\n                return mesh;\n            }\n            case AttachmentType.Path: {\n                const closed = input.readBoolean();\n                const constantSpeed = input.readBoolean();\n                const vertexCount = input.readInt(true);\n                const vertices = this.readVertices(input, vertexCount);\n                const lengths = Utils.newArray(vertexCount / 3, 0);\n\n                for (let i = 0, n = lengths.length; i < n; i++) lengths[i] = input.readFloat() * scale;\n                const color = nonessential ? input.readInt32() : 0;\n\n                const path = this.attachmentLoader.newPathAttachment(skin, name);\n\n                if (!path) return null;\n                path.closed = closed;\n                path.constantSpeed = constantSpeed;\n                path.worldVerticesLength = vertexCount << 1;\n                path.vertices = vertices.vertices;\n                path.bones = vertices.bones;\n                path.lengths = lengths;\n                if (nonessential) Color.rgba8888ToColor(path.color, color);\n\n                return path;\n            }\n            case AttachmentType.Point: {\n                const rotation = input.readFloat();\n                const x = input.readFloat();\n                const y = input.readFloat();\n                const color = nonessential ? input.readInt32() : 0;\n\n                const point = this.attachmentLoader.newPointAttachment(skin, name);\n\n                if (!point) return null;\n                point.x = x * scale;\n                point.y = y * scale;\n                point.rotation = rotation;\n                if (nonessential) Color.rgba8888ToColor(point.color, color);\n\n                return point;\n            }\n            case AttachmentType.Clipping: {\n                const endSlotIndex = input.readInt(true);\n                const vertexCount = input.readInt(true);\n                const vertices = this.readVertices(input, vertexCount);\n                const color = nonessential ? input.readInt32() : 0;\n\n                const clip = this.attachmentLoader.newClippingAttachment(skin, name);\n\n                if (!clip) return null;\n                clip.endSlot = skeletonData.slots[endSlotIndex];\n                clip.worldVerticesLength = vertexCount << 1;\n                clip.vertices = vertices.vertices;\n                clip.bones = vertices.bones;\n                if (nonessential) Color.rgba8888ToColor(clip.color, color);\n\n                return clip;\n            }\n        }\n\n        return null;\n    }\n\n    private readSequence(input: BinaryInput) {\n        if (this.ver40 || !input.readBoolean()) return null;\n        const sequence = new Sequence(input.readInt(true));\n\n        sequence.start = input.readInt(true);\n        sequence.digits = input.readInt(true);\n        sequence.setupIndex = input.readInt(true);\n\n        return sequence;\n    }\n\n    private readDeformTimelineType(input: BinaryInput) {\n        if (this.ver40) return ATTACHMENT_DEFORM;\n\n        return input.readByte();\n    }\n\n    private readVertices(input: BinaryInput, vertexCount: number): Vertices {\n        const scale = this.scale;\n        const verticesLength = vertexCount << 1;\n        const vertices = new Vertices();\n\n        if (!input.readBoolean()) {\n            vertices.vertices = this.readFloatArray(input, verticesLength, scale);\n\n            return vertices;\n        }\n        const weights = new Array<number>();\n        const bonesArray = new Array<number>();\n\n        for (let i = 0; i < vertexCount; i++) {\n            const boneCount = input.readInt(true);\n\n            bonesArray.push(boneCount);\n            for (let ii = 0; ii < boneCount; ii++) {\n                bonesArray.push(input.readInt(true));\n                weights.push(input.readFloat() * scale);\n                weights.push(input.readFloat() * scale);\n                weights.push(input.readFloat());\n            }\n        }\n        vertices.vertices = Utils.toFloatArray(weights);\n        vertices.bones = bonesArray;\n\n        return vertices;\n    }\n\n    private readFloatArray(input: BinaryInput, n: number, scale: number): number[] {\n        const array = new Array<number>(n);\n\n        if (scale == 1) {\n            for (let i = 0; i < n; i++) array[i] = input.readFloat();\n        } else {\n            for (let i = 0; i < n; i++) array[i] = input.readFloat() * scale;\n        }\n\n        return array;\n    }\n\n    private readShortArray(input: BinaryInput): number[] {\n        const n = input.readInt(true);\n        const array = new Array<number>(n);\n\n        for (let i = 0; i < n; i++) array[i] = input.readShort();\n\n        return array;\n    }\n\n    private readAnimation(input: BinaryInput, name: string, skeletonData: SkeletonData): Animation {\n        input.readInt(true); // Number of timelines.\n        const timelines = new Array<Timeline>();\n        const scale = this.scale;\n        // Slot timelines.\n\n        for (let i = 0, n = input.readInt(true); i < n; i++) {\n            const slotIndex = input.readInt(true);\n\n            for (let ii = 0, nn = input.readInt(true); ii < nn; ii++) {\n                const timelineType = input.readByte();\n                const frameCount = input.readInt(true);\n                const frameLast = frameCount - 1;\n\n                switch (timelineType) {\n                    case SLOT_ATTACHMENT: {\n                        const timeline = new AttachmentTimeline(frameCount, slotIndex);\n\n                        for (let frame = 0; frame < frameCount; frame++) timeline.setFrame(frame, input.readFloat(), input.readStringRef());\n                        timelines.push(timeline);\n                        break;\n                    }\n                    case SLOT_RGBA: {\n                        const bezierCount = input.readInt(true);\n                        const timeline = new RGBATimeline(frameCount, bezierCount, slotIndex);\n\n                        let time = input.readFloat();\n                        let r = input.readUnsignedByte() / 255.0;\n                        let g = input.readUnsignedByte() / 255.0;\n                        let b = input.readUnsignedByte() / 255.0;\n                        let a = input.readUnsignedByte() / 255.0;\n\n                        for (let frame = 0, bezier = 0; ; frame++) {\n                            timeline.setFrame(frame, time, r, g, b, a);\n                            if (frame == frameLast) break;\n\n                            const time2 = input.readFloat();\n                            const r2 = input.readUnsignedByte() / 255.0;\n                            const g2 = input.readUnsignedByte() / 255.0;\n                            const b2 = input.readUnsignedByte() / 255.0;\n                            const a2 = input.readUnsignedByte() / 255.0;\n\n                            switch (input.readByte()) {\n                                case CURVE_STEPPED:\n                                    timeline.setStepped(frame);\n                                    break;\n                                case CURVE_BEZIER:\n                                    setBezier(input, timeline, bezier++, frame, 0, time, time2, r, r2, 1);\n                                    setBezier(input, timeline, bezier++, frame, 1, time, time2, g, g2, 1);\n                                    setBezier(input, timeline, bezier++, frame, 2, time, time2, b, b2, 1);\n                                    setBezier(input, timeline, bezier++, frame, 3, time, time2, a, a2, 1);\n                            }\n                            time = time2;\n                            r = r2;\n                            g = g2;\n                            b = b2;\n                            a = a2;\n                        }\n                        timelines.push(timeline);\n                        break;\n                    }\n                    case SLOT_RGB: {\n                        const bezierCount = input.readInt(true);\n                        const timeline = new RGBTimeline(frameCount, bezierCount, slotIndex);\n\n                        let time = input.readFloat();\n                        let r = input.readUnsignedByte() / 255.0;\n                        let g = input.readUnsignedByte() / 255.0;\n                        let b = input.readUnsignedByte() / 255.0;\n\n                        for (let frame = 0, bezier = 0; ; frame++) {\n                            timeline.setFrame(frame, time, r, g, b);\n                            if (frame == frameLast) break;\n\n                            const time2 = input.readFloat();\n                            const r2 = input.readUnsignedByte() / 255.0;\n                            const g2 = input.readUnsignedByte() / 255.0;\n                            const b2 = input.readUnsignedByte() / 255.0;\n\n                            switch (input.readByte()) {\n                                case CURVE_STEPPED:\n                                    timeline.setStepped(frame);\n                                    break;\n                                case CURVE_BEZIER:\n                                    setBezier(input, timeline, bezier++, frame, 0, time, time2, r, r2, 1);\n                                    setBezier(input, timeline, bezier++, frame, 1, time, time2, g, g2, 1);\n                                    setBezier(input, timeline, bezier++, frame, 2, time, time2, b, b2, 1);\n                            }\n                            time = time2;\n                            r = r2;\n                            g = g2;\n                            b = b2;\n                        }\n                        timelines.push(timeline);\n                        break;\n                    }\n                    case SLOT_RGBA2: {\n                        const bezierCount = input.readInt(true);\n                        const timeline = new RGBA2Timeline(frameCount, bezierCount, slotIndex);\n\n                        let time = input.readFloat();\n                        let r = input.readUnsignedByte() / 255.0;\n                        let g = input.readUnsignedByte() / 255.0;\n                        let b = input.readUnsignedByte() / 255.0;\n                        let a = input.readUnsignedByte() / 255.0;\n                        let r2 = input.readUnsignedByte() / 255.0;\n                        let g2 = input.readUnsignedByte() / 255.0;\n                        let b2 = input.readUnsignedByte() / 255.0;\n\n                        for (let frame = 0, bezier = 0; ; frame++) {\n                            timeline.setFrame(frame, time, r, g, b, a, r2, g2, b2);\n                            if (frame == frameLast) break;\n                            const time2 = input.readFloat();\n                            const nr = input.readUnsignedByte() / 255.0;\n                            const ng = input.readUnsignedByte() / 255.0;\n                            const nb = input.readUnsignedByte() / 255.0;\n                            const na = input.readUnsignedByte() / 255.0;\n                            const nr2 = input.readUnsignedByte() / 255.0;\n                            const ng2 = input.readUnsignedByte() / 255.0;\n                            const nb2 = input.readUnsignedByte() / 255.0;\n\n                            switch (input.readByte()) {\n                                case CURVE_STEPPED:\n                                    timeline.setStepped(frame);\n                                    break;\n                                case CURVE_BEZIER:\n                                    setBezier(input, timeline, bezier++, frame, 0, time, time2, r, nr, 1);\n                                    setBezier(input, timeline, bezier++, frame, 1, time, time2, g, ng, 1);\n                                    setBezier(input, timeline, bezier++, frame, 2, time, time2, b, nb, 1);\n                                    setBezier(input, timeline, bezier++, frame, 3, time, time2, a, na, 1);\n                                    setBezier(input, timeline, bezier++, frame, 4, time, time2, r2, nr2, 1);\n                                    setBezier(input, timeline, bezier++, frame, 5, time, time2, g2, ng2, 1);\n                                    setBezier(input, timeline, bezier++, frame, 6, time, time2, b2, nb2, 1);\n                            }\n                            time = time2;\n                            r = nr;\n                            g = ng;\n                            b = nb;\n                            a = na;\n                            r2 = nr2;\n                            g2 = ng2;\n                            b2 = nb2;\n                        }\n                        timelines.push(timeline);\n                        break;\n                    }\n                    case SLOT_RGB2: {\n                        const bezierCount = input.readInt(true);\n                        const timeline = new RGB2Timeline(frameCount, bezierCount, slotIndex);\n\n                        let time = input.readFloat();\n                        let r = input.readUnsignedByte() / 255.0;\n                        let g = input.readUnsignedByte() / 255.0;\n                        let b = input.readUnsignedByte() / 255.0;\n                        let r2 = input.readUnsignedByte() / 255.0;\n                        let g2 = input.readUnsignedByte() / 255.0;\n                        let b2 = input.readUnsignedByte() / 255.0;\n\n                        for (let frame = 0, bezier = 0; ; frame++) {\n                            timeline.setFrame(frame, time, r, g, b, r2, g2, b2);\n                            if (frame == frameLast) break;\n                            const time2 = input.readFloat();\n                            const nr = input.readUnsignedByte() / 255.0;\n                            const ng = input.readUnsignedByte() / 255.0;\n                            const nb = input.readUnsignedByte() / 255.0;\n                            const nr2 = input.readUnsignedByte() / 255.0;\n                            const ng2 = input.readUnsignedByte() / 255.0;\n                            const nb2 = input.readUnsignedByte() / 255.0;\n\n                            switch (input.readByte()) {\n                                case CURVE_STEPPED:\n                                    timeline.setStepped(frame);\n                                    break;\n                                case CURVE_BEZIER:\n                                    setBezier(input, timeline, bezier++, frame, 0, time, time2, r, nr, 1);\n                                    setBezier(input, timeline, bezier++, frame, 1, time, time2, g, ng, 1);\n                                    setBezier(input, timeline, bezier++, frame, 2, time, time2, b, nb, 1);\n                                    setBezier(input, timeline, bezier++, frame, 3, time, time2, r2, nr2, 1);\n                                    setBezier(input, timeline, bezier++, frame, 4, time, time2, g2, ng2, 1);\n                                    setBezier(input, timeline, bezier++, frame, 5, time, time2, b2, nb2, 1);\n                            }\n                            time = time2;\n                            r = nr;\n                            g = ng;\n                            b = nb;\n                            r2 = nr2;\n                            g2 = ng2;\n                            b2 = nb2;\n                        }\n                        timelines.push(timeline);\n                        break;\n                    }\n                    case SLOT_ALPHA: {\n                        const timeline = new AlphaTimeline(frameCount, input.readInt(true), slotIndex);\n                        let time = input.readFloat();\n                        let a = input.readUnsignedByte() / 255;\n\n                        for (let frame = 0, bezier = 0; ; frame++) {\n                            timeline.setFrame(frame, time, a);\n                            if (frame == frameLast) break;\n                            const time2 = input.readFloat();\n                            const a2 = input.readUnsignedByte() / 255;\n\n                            switch (input.readByte()) {\n                                case CURVE_STEPPED:\n                                    timeline.setStepped(frame);\n                                    break;\n                                case CURVE_BEZIER:\n                                    setBezier(input, timeline, bezier++, frame, 0, time, time2, a, a2, 1);\n                            }\n                            time = time2;\n                            a = a2;\n                        }\n                        timelines.push(timeline);\n                    }\n                }\n            }\n        }\n\n        // Bone timelines.\n        for (let i = 0, n = input.readInt(true); i < n; i++) {\n            const boneIndex = input.readInt(true);\n\n            for (let ii = 0, nn = input.readInt(true); ii < nn; ii++) {\n                const type = input.readByte();\n                const frameCount = input.readInt(true);\n                const bezierCount = input.readInt(true);\n\n                switch (type) {\n                    case BONE_ROTATE:\n                        timelines.push(readTimeline1(input, new RotateTimeline(frameCount, bezierCount, boneIndex), 1));\n                        break;\n                    case BONE_TRANSLATE:\n                        timelines.push(readTimeline2(input, new TranslateTimeline(frameCount, bezierCount, boneIndex), scale));\n                        break;\n                    case BONE_TRANSLATEX:\n                        timelines.push(readTimeline1(input, new TranslateXTimeline(frameCount, bezierCount, boneIndex), scale));\n                        break;\n                    case BONE_TRANSLATEY:\n                        timelines.push(readTimeline1(input, new TranslateYTimeline(frameCount, bezierCount, boneIndex), scale));\n                        break;\n                    case BONE_SCALE:\n                        timelines.push(readTimeline2(input, new ScaleTimeline(frameCount, bezierCount, boneIndex), 1));\n                        break;\n                    case BONE_SCALEX:\n                        timelines.push(readTimeline1(input, new ScaleXTimeline(frameCount, bezierCount, boneIndex), 1));\n                        break;\n                    case BONE_SCALEY:\n                        timelines.push(readTimeline1(input, new ScaleYTimeline(frameCount, bezierCount, boneIndex), 1));\n                        break;\n                    case BONE_SHEAR:\n                        timelines.push(readTimeline2(input, new ShearTimeline(frameCount, bezierCount, boneIndex), 1));\n                        break;\n                    case BONE_SHEARX:\n                        timelines.push(readTimeline1(input, new ShearXTimeline(frameCount, bezierCount, boneIndex), 1));\n                        break;\n                    case BONE_SHEARY:\n                        timelines.push(readTimeline1(input, new ShearYTimeline(frameCount, bezierCount, boneIndex), 1));\n                }\n            }\n        }\n\n        // IK constraint timelines.\n        for (let i = 0, n = input.readInt(true); i < n; i++) {\n            const index = input.readInt(true);\n            const frameCount = input.readInt(true);\n            const frameLast = frameCount - 1;\n            const timeline = new IkConstraintTimeline(frameCount, input.readInt(true), index);\n            let time = input.readFloat();\n            let mix = input.readFloat();\n            let softness = input.readFloat() * scale;\n\n            for (let frame = 0, bezier = 0; ; frame++) {\n                timeline.setFrame(frame, time, mix, softness, input.readByte(), input.readBoolean(), input.readBoolean());\n                if (frame == frameLast) break;\n                const time2 = input.readFloat();\n                const mix2 = input.readFloat();\n                const softness2 = input.readFloat() * scale;\n\n                switch (input.readByte()) {\n                    case CURVE_STEPPED:\n                        timeline.setStepped(frame);\n                        break;\n                    case CURVE_BEZIER:\n                        setBezier(input, timeline, bezier++, frame, 0, time, time2, mix, mix2, 1);\n                        setBezier(input, timeline, bezier++, frame, 1, time, time2, softness, softness2, scale);\n                }\n                time = time2;\n                mix = mix2;\n                softness = softness2;\n            }\n            timelines.push(timeline);\n        }\n\n        // Transform constraint timelines.\n        for (let i = 0, n = input.readInt(true); i < n; i++) {\n            const index = input.readInt(true);\n            const frameCount = input.readInt(true);\n            const frameLast = frameCount - 1;\n            const timeline = new TransformConstraintTimeline(frameCount, input.readInt(true), index);\n            let time = input.readFloat();\n            let mixRotate = input.readFloat();\n            let mixX = input.readFloat();\n            let mixY = input.readFloat();\n            let mixScaleX = input.readFloat();\n            let mixScaleY = input.readFloat();\n            let mixShearY = input.readFloat();\n\n            for (let frame = 0, bezier = 0; ; frame++) {\n                timeline.setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY);\n                if (frame == frameLast) break;\n                const time2 = input.readFloat();\n                const mixRotate2 = input.readFloat();\n                const mixX2 = input.readFloat();\n                const mixY2 = input.readFloat();\n                const mixScaleX2 = input.readFloat();\n                const mixScaleY2 = input.readFloat();\n                const mixShearY2 = input.readFloat();\n\n                switch (input.readByte()) {\n                    case CURVE_STEPPED:\n                        timeline.setStepped(frame);\n                        break;\n                    case CURVE_BEZIER:\n                        setBezier(input, timeline, bezier++, frame, 0, time, time2, mixRotate, mixRotate2, 1);\n                        setBezier(input, timeline, bezier++, frame, 1, time, time2, mixX, mixX2, 1);\n                        setBezier(input, timeline, bezier++, frame, 2, time, time2, mixY, mixY2, 1);\n                        setBezier(input, timeline, bezier++, frame, 3, time, time2, mixScaleX, mixScaleX2, 1);\n                        setBezier(input, timeline, bezier++, frame, 4, time, time2, mixScaleY, mixScaleY2, 1);\n                        setBezier(input, timeline, bezier++, frame, 5, time, time2, mixShearY, mixShearY2, 1);\n                }\n                time = time2;\n                mixRotate = mixRotate2;\n                mixX = mixX2;\n                mixY = mixY2;\n                mixScaleX = mixScaleX2;\n                mixScaleY = mixScaleY2;\n                mixShearY = mixShearY2;\n            }\n            timelines.push(timeline);\n        }\n\n        // Path constraint timelines.\n        for (let i = 0, n = input.readInt(true); i < n; i++) {\n            const index = input.readInt(true);\n            const data = skeletonData.pathConstraints[index];\n\n            for (let ii = 0, nn = input.readInt(true); ii < nn; ii++) {\n                switch (input.readByte()) {\n                    case PATH_POSITION:\n                        timelines.push(\n                            readTimeline1(\n                                input,\n                                new PathConstraintPositionTimeline(input.readInt(true), input.readInt(true), index),\n                                data.positionMode == PositionMode.Fixed ? scale : 1\n                            )\n                        );\n                        break;\n                    case PATH_SPACING:\n                        timelines.push(\n                            readTimeline1(\n                                input,\n                                new PathConstraintSpacingTimeline(input.readInt(true), input.readInt(true), index),\n                                data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed ? scale : 1\n                            )\n                        );\n                        break;\n                    case PATH_MIX:\n                        const timeline = new PathConstraintMixTimeline(input.readInt(true), input.readInt(true), index);\n                        let time = input.readFloat();\n                        let mixRotate = input.readFloat();\n                        let mixX = input.readFloat();\n                        let mixY = input.readFloat();\n\n                        for (let frame = 0, bezier = 0, frameLast = timeline.getFrameCount() - 1; ; frame++) {\n                            timeline.setFrame(frame, time, mixRotate, mixX, mixY);\n                            if (frame == frameLast) break;\n                            const time2 = input.readFloat();\n                            const mixRotate2 = input.readFloat();\n                            const mixX2 = input.readFloat();\n                            const mixY2 = input.readFloat();\n\n                            switch (input.readByte()) {\n                                case CURVE_STEPPED:\n                                    timeline.setStepped(frame);\n                                    break;\n                                case CURVE_BEZIER:\n                                    setBezier(input, timeline, bezier++, frame, 0, time, time2, mixRotate, mixRotate2, 1);\n                                    setBezier(input, timeline, bezier++, frame, 1, time, time2, mixX, mixX2, 1);\n                                    setBezier(input, timeline, bezier++, frame, 2, time, time2, mixY, mixY2, 1);\n                            }\n                            time = time2;\n                            mixRotate = mixRotate2;\n                            mixX = mixX2;\n                            mixY = mixY2;\n                        }\n                        timelines.push(timeline);\n                }\n            }\n        }\n\n        // Deform timelines.\n        for (let i = 0, n = input.readInt(true); i < n; i++) {\n            const skin = skeletonData.skins[input.readInt(true)];\n\n            for (let ii = 0, nn = input.readInt(true); ii < nn; ii++) {\n                const slotIndex = input.readInt(true);\n\n                for (let iii = 0, nnn = input.readInt(true); iii < nnn; iii++) {\n                    const attachmentName = input.readStringRef();\n\n                    if (!attachmentName) throw new Error('attachmentName must not be null.');\n                    const attachment = skin.getAttachment(slotIndex, attachmentName);\n                    const timelineType = this.readDeformTimelineType(input);\n                    const frameCount = input.readInt(true);\n                    const frameLast = frameCount - 1;\n\n                    switch (timelineType) {\n                        case ATTACHMENT_DEFORM: {\n                            const vertexAttachment = attachment as VertexAttachment;\n                            const weighted = vertexAttachment.bones;\n                            const vertices = vertexAttachment.vertices;\n                            const deformLength = weighted ? (vertices.length / 3) * 2 : vertices.length;\n\n                            const bezierCount = input.readInt(true);\n                            const timeline = new DeformTimeline(frameCount, bezierCount, slotIndex, vertexAttachment);\n\n                            let time = input.readFloat();\n\n                            for (let frame = 0, bezier = 0; ; frame++) {\n                                let deform;\n                                let end = input.readInt(true);\n\n                                if (end == 0) deform = weighted ? Utils.newFloatArray(deformLength) : vertices;\n                                else {\n                                    deform = Utils.newFloatArray(deformLength);\n                                    const start = input.readInt(true);\n\n                                    end += start;\n                                    /* eslint-disable max-depth*/\n                                    if (scale == 1) {\n                                        for (let v = start; v < end; v++) deform[v] = input.readFloat();\n                                    } else {\n                                        for (let v = start; v < end; v++) deform[v] = input.readFloat() * scale;\n                                    }\n                                    if (!weighted) {\n                                        for (let v = 0, vn = deform.length; v < vn; v++) deform[v] += vertices[v];\n                                    }\n                                    /* eslint-enable max-depth*/\n                                }\n\n                                timeline.setFrame(frame, time, deform);\n                                if (frame == frameLast) break;\n                                const time2 = input.readFloat();\n\n                                switch (input.readByte()) {\n                                    case CURVE_STEPPED:\n                                        timeline.setStepped(frame);\n                                        break;\n                                    case CURVE_BEZIER:\n                                        setBezier(input, timeline, bezier++, frame, 0, time, time2, 0, 1, 1);\n                                }\n                                time = time2;\n                            }\n                            timelines.push(timeline);\n                            break;\n                        }\n                        case ATTACHMENT_SEQUENCE: {\n                            const timeline = new SequenceTimeline(frameCount, slotIndex, attachment as unknown as IHasTextureRegion);\n\n                            for (let frame = 0; frame < frameCount; frame++) {\n                                const time = input.readFloat();\n                                const modeAndIndex = input.readInt32();\n\n                                timeline.setFrame(frame, time, SequenceModeValues[modeAndIndex & 0xf], modeAndIndex >> 4, input.readFloat());\n                            }\n                            timelines.push(timeline);\n                            break;\n                        }\n                    }\n                }\n            }\n        }\n\n        // Draw order timeline.\n        const drawOrderCount = input.readInt(true);\n\n        if (drawOrderCount > 0) {\n            const timeline = new DrawOrderTimeline(drawOrderCount);\n            const slotCount = skeletonData.slots.length;\n\n            for (let i = 0; i < drawOrderCount; i++) {\n                const time = input.readFloat();\n                const offsetCount = input.readInt(true);\n                const drawOrder = Utils.newArray(slotCount, 0);\n\n                for (let ii = slotCount - 1; ii >= 0; ii--) drawOrder[ii] = -1;\n                const unchanged = Utils.newArray(slotCount - offsetCount, 0);\n                let originalIndex = 0;\n                let unchangedIndex = 0;\n\n                for (let ii = 0; ii < offsetCount; ii++) {\n                    const slotIndex = input.readInt(true);\n                    // Collect unchanged items.\n\n                    while (originalIndex != slotIndex) unchanged[unchangedIndex++] = originalIndex++;\n                    // Set changed items.\n                    drawOrder[originalIndex + input.readInt(true)] = originalIndex++;\n                }\n                // Collect remaining unchanged items.\n                while (originalIndex < slotCount) unchanged[unchangedIndex++] = originalIndex++;\n                // Fill in unchanged items.\n                for (let ii = slotCount - 1; ii >= 0; ii--) if (drawOrder[ii] == -1) drawOrder[ii] = unchanged[--unchangedIndex];\n                timeline.setFrame(i, time, drawOrder);\n            }\n            timelines.push(timeline);\n        }\n\n        // Event timeline.\n        const eventCount = input.readInt(true);\n\n        if (eventCount > 0) {\n            const timeline = new EventTimeline(eventCount);\n\n            for (let i = 0; i < eventCount; i++) {\n                const time = input.readFloat();\n                const eventData = skeletonData.events[input.readInt(true)];\n                const event = new Event(time, eventData);\n\n                event.intValue = input.readInt(false);\n                event.floatValue = input.readFloat();\n                event.stringValue = input.readBoolean() ? input.readString() : eventData.stringValue;\n                if (event.data.audioPath) {\n                    event.volume = input.readFloat();\n                    event.balance = input.readFloat();\n                }\n                timeline.setFrame(i, event);\n            }\n            timelines.push(timeline);\n        }\n\n        let duration = 0;\n\n        for (let i = 0, n = timelines.length; i < n; i++) duration = Math.max(duration, timelines[i].getDuration());\n\n        return new Animation(name, timelines, duration);\n    }\n}\n\nclass LinkedMesh {\n    parent: string | null;\n    skin: string | null;\n    slotIndex: number;\n    mesh: MeshAttachment;\n    inheritTimeline: boolean;\n\n    constructor(mesh: MeshAttachment, skin: string | null, slotIndex: number, parent: string | null, inheritDeform: boolean) {\n        this.mesh = mesh;\n        this.skin = skin;\n        this.slotIndex = slotIndex;\n        this.parent = parent;\n        this.inheritTimeline = inheritDeform;\n    }\n}\n\nclass Vertices {\n    constructor(public bones: Array<number> | null = null, public vertices: Array<number> | Float32Array | null = null) {}\n}\n\nfunction readTimeline1(input: BinaryInput, timeline: CurveTimeline1, scale: number): CurveTimeline1 {\n    let time = input.readFloat();\n    let value = input.readFloat() * scale;\n\n    for (let frame = 0, bezier = 0, frameLast = timeline.getFrameCount() - 1; ; frame++) {\n        timeline.setFrame(frame, time, value);\n        if (frame == frameLast) break;\n        const time2 = input.readFloat();\n        const value2 = input.readFloat() * scale;\n\n        switch (input.readByte()) {\n            case CURVE_STEPPED:\n                timeline.setStepped(frame);\n                break;\n            case CURVE_BEZIER:\n                setBezier(input, timeline, bezier++, frame, 0, time, time2, value, value2, scale);\n        }\n        time = time2;\n        value = value2;\n    }\n\n    return timeline;\n}\n\nfunction readTimeline2(input: BinaryInput, timeline: CurveTimeline2, scale: number): CurveTimeline2 {\n    let time = input.readFloat();\n    let value1 = input.readFloat() * scale;\n    let value2 = input.readFloat() * scale;\n\n    for (let frame = 0, bezier = 0, frameLast = timeline.getFrameCount() - 1; ; frame++) {\n        timeline.setFrame(frame, time, value1, value2);\n        if (frame == frameLast) break;\n        const time2 = input.readFloat();\n        const nvalue1 = input.readFloat() * scale;\n        const nvalue2 = input.readFloat() * scale;\n\n        switch (input.readByte()) {\n            case CURVE_STEPPED:\n                timeline.setStepped(frame);\n                break;\n            case CURVE_BEZIER:\n                setBezier(input, timeline, bezier++, frame, 0, time, time2, value1, nvalue1, scale);\n                setBezier(input, timeline, bezier++, frame, 1, time, time2, value2, nvalue2, scale);\n        }\n        time = time2;\n        value1 = nvalue1;\n        value2 = nvalue2;\n    }\n\n    return timeline;\n}\n\nfunction setBezier(\n    input: BinaryInput,\n    timeline: CurveTimeline,\n    bezier: number,\n    frame: number,\n    value: number,\n    time1: number,\n    time2: number,\n    value1: number,\n    value2: number,\n    scale: number\n) {\n    timeline.setBezier(bezier, frame, value, time1, value1, input.readFloat(), input.readFloat() * scale, input.readFloat(), input.readFloat() * scale, time2, value2);\n}\n\nconst BONE_ROTATE = 0;\nconst BONE_TRANSLATE = 1;\nconst BONE_TRANSLATEX = 2;\nconst BONE_TRANSLATEY = 3;\nconst BONE_SCALE = 4;\nconst BONE_SCALEX = 5;\nconst BONE_SCALEY = 6;\nconst BONE_SHEAR = 7;\nconst BONE_SHEARX = 8;\nconst BONE_SHEARY = 9;\n\nconst SLOT_ATTACHMENT = 0;\nconst SLOT_RGBA = 1;\nconst SLOT_RGB = 2;\nconst SLOT_RGBA2 = 3;\nconst SLOT_RGB2 = 4;\nconst SLOT_ALPHA = 5;\n\nconst ATTACHMENT_DEFORM = 0;\nconst ATTACHMENT_SEQUENCE = 1;\n\nconst PATH_POSITION = 0;\nconst PATH_SPACING = 1;\nconst PATH_MIX = 2;\n\n// const CURVE_LINEAR = 0;\nconst CURVE_STEPPED = 1;\nconst CURVE_BEZIER = 2;\n","import type { BoundingBoxAttachment } from './attachments';\nimport { SkeletonBoundsBase } from '@pixi-spine/base';\n\n/** Collects each visible {@link BoundingBoxAttachment} and computes the world vertices for its polygon. The polygon vertices are\n * provided along with convenience methods for doing hit detection.\n * @public\n * */\nexport class SkeletonBounds extends SkeletonBoundsBase<BoundingBoxAttachment> {}\n","import type { Attachment, AttachmentLoader, MeshAttachment, VertexAttachment } from './attachments';\nimport {\n    AlphaTimeline,\n    Animation,\n    AttachmentTimeline,\n    CurveTimeline,\n    CurveTimeline1,\n    CurveTimeline2,\n    DeformTimeline,\n    DrawOrderTimeline,\n    EventTimeline,\n    IkConstraintTimeline,\n    PathConstraintMixTimeline,\n    PathConstraintPositionTimeline,\n    PathConstraintSpacingTimeline,\n    RGB2Timeline,\n    RGBA2Timeline,\n    RGBATimeline,\n    RGBTimeline,\n    RotateTimeline,\n    ScaleTimeline,\n    ScaleXTimeline,\n    ScaleYTimeline,\n    SequenceTimeline,\n    ShearTimeline,\n    ShearXTimeline,\n    ShearYTimeline,\n    Timeline,\n    TransformConstraintTimeline,\n    TranslateTimeline,\n    TranslateXTimeline,\n    TranslateYTimeline,\n} from './Animation';\nimport { Event } from './Event';\nimport { SkeletonData } from './SkeletonData';\nimport { SlotData } from './SlotData';\nimport { BoneData } from './BoneData';\nimport { IkConstraintData } from './IkConstraintData';\nimport { TransformConstraintData } from './TransformConstraintData';\nimport { PathConstraintData, SpacingMode } from './PathConstraintData';\nimport { Skin } from './Skin';\nimport { EventData } from './EventData';\nimport { NumberArrayLike, Color, IHasTextureRegion, PositionMode, RotateMode, TransformMode, Utils, settings } from '@pixi-spine/base';\nimport { BLEND_MODES } from '@pixi/core';\nimport { Sequence, SequenceMode } from './attachments/Sequence';\n\n/** Loads skeleton data in the Spine JSON format.\n *\n * See [Spine JSON format](http://esotericsoftware.com/spine-json-format) and\n * [JSON and binary data](http://esotericsoftware.com/spine-loading-skeleton-data#JSON-and-binary-data) in the Spine\n * Runtimes Guide.\n * @public\n * */\nexport class SkeletonJson {\n    attachmentLoader: AttachmentLoader;\n\n    /** Scales bone positions, image sizes, and translations as they are loaded. This allows different size images to be used at\n     * runtime than were used in Spine.\n     *\n     * See [Scaling](http://esotericsoftware.com/spine-loading-skeleton-data#Scaling) in the Spine Runtimes Guide. */\n    scale = 1;\n    private linkedMeshes = new Array<LinkedMesh>();\n\n    constructor(attachmentLoader: AttachmentLoader) {\n        this.attachmentLoader = attachmentLoader;\n    }\n\n    readSkeletonData(json: string | any): SkeletonData {\n        const scale = this.scale;\n        const skeletonData = new SkeletonData();\n        const root = typeof json === 'string' ? JSON.parse(json) : json;\n\n        // Skeleton\n        const skeletonMap = root.skeleton;\n\n        if (skeletonMap) {\n            skeletonData.hash = skeletonMap.hash;\n            skeletonData.version = skeletonMap.spine;\n            const verShort = skeletonData.version.substr(0, 3);\n\n            if (verShort !== '4.0' && verShort !== '4.1') {\n                const error = `Spine 4.1 loader cant load version ${skeletonMap.spine}. Please configure your pixi-spine bundle`;\n\n                console.error(error);\n            }\n            skeletonData.x = skeletonMap.x;\n            skeletonData.y = skeletonMap.y;\n            skeletonData.width = skeletonMap.width;\n            skeletonData.height = skeletonMap.height;\n            skeletonData.fps = skeletonMap.fps;\n            skeletonData.imagesPath = skeletonMap.images;\n        }\n\n        // Bones\n        if (root.bones) {\n            for (let i = 0; i < root.bones.length; i++) {\n                const boneMap = root.bones[i];\n\n                let parent: BoneData = null;\n                const parentName: string = getValue(boneMap, 'parent', null);\n\n                if (parentName != null) {\n                    parent = skeletonData.findBone(parentName);\n                    if (parent == null) throw new Error(`Parent bone not found: ${parentName}`);\n                }\n                const data = new BoneData(skeletonData.bones.length, boneMap.name, parent);\n\n                data.length = getValue(boneMap, 'length', 0) * scale;\n                data.x = getValue(boneMap, 'x', 0) * scale;\n                data.y = getValue(boneMap, 'y', 0) * scale;\n                data.rotation = getValue(boneMap, 'rotation', 0);\n                data.scaleX = getValue(boneMap, 'scaleX', 1);\n                data.scaleY = getValue(boneMap, 'scaleY', 1);\n                data.shearX = getValue(boneMap, 'shearX', 0);\n                data.shearY = getValue(boneMap, 'shearY', 0);\n                data.transformMode = Utils.enumValue(TransformMode, getValue(boneMap, 'transform', 'Normal'));\n                data.skinRequired = getValue(boneMap, 'skin', false);\n\n                const color = getValue(boneMap, 'color', null);\n\n                if (color) data.color.setFromString(color);\n\n                skeletonData.bones.push(data);\n            }\n        }\n\n        // Slots.\n        if (root.slots) {\n            for (let i = 0; i < root.slots.length; i++) {\n                const slotMap = root.slots[i];\n                const boneData = skeletonData.findBone(slotMap.bone);\n\n                if (!boneData) throw new Error(`Couldn't find bone ${slotMap.bone} for slot ${slotMap.name}`);\n                const data = new SlotData(skeletonData.slots.length, slotMap.name, boneData);\n\n                const color: string = getValue(slotMap, 'color', null);\n\n                if (color) data.color.setFromString(color);\n\n                const dark: string = getValue(slotMap, 'dark', null);\n\n                if (dark) data.darkColor = Color.fromString(dark);\n\n                data.attachmentName = getValue(slotMap, 'attachment', null);\n                data.blendMode = SkeletonJson.blendModeFromString(getValue(slotMap, 'blend', 'normal'));\n                skeletonData.slots.push(data);\n            }\n        }\n\n        // IK constraints\n        if (root.ik) {\n            for (let i = 0; i < root.ik.length; i++) {\n                const constraintMap = root.ik[i];\n                const data = new IkConstraintData(constraintMap.name);\n\n                data.order = getValue(constraintMap, 'order', 0);\n                data.skinRequired = getValue(constraintMap, 'skin', false);\n\n                for (let ii = 0; ii < constraintMap.bones.length; ii++) {\n                    const boneName = constraintMap.bones[ii];\n                    const bone = skeletonData.findBone(boneName);\n\n                    if (bone == null) throw new Error(`IK bone not found: ${boneName}`);\n                    data.bones.push(bone);\n                }\n\n                data.target = skeletonData.findBone(constraintMap.target);\n\n                data.mix = getValue(constraintMap, 'mix', 1);\n                data.softness = getValue(constraintMap, 'softness', 0) * scale;\n                data.bendDirection = getValue(constraintMap, 'bendPositive', true) ? 1 : -1;\n                data.compress = getValue(constraintMap, 'compress', false);\n                data.stretch = getValue(constraintMap, 'stretch', false);\n                data.uniform = getValue(constraintMap, 'uniform', false);\n\n                skeletonData.ikConstraints.push(data);\n            }\n        }\n\n        // Transform constraints.\n        if (root.transform) {\n            for (let i = 0; i < root.transform.length; i++) {\n                const constraintMap = root.transform[i];\n                const data = new TransformConstraintData(constraintMap.name);\n\n                data.order = getValue(constraintMap, 'order', 0);\n                data.skinRequired = getValue(constraintMap, 'skin', false);\n\n                for (let ii = 0; ii < constraintMap.bones.length; ii++) {\n                    const boneName = constraintMap.bones[ii];\n                    const bone = skeletonData.findBone(boneName);\n\n                    if (!bone) throw new Error(`Couldn't find bone ${boneName} for transform constraint ${constraintMap.name}.`);\n                    data.bones.push(bone);\n                }\n\n                const targetName: string = constraintMap.target;\n                const target = skeletonData.findBone(targetName);\n\n                if (!target) throw new Error(`Couldn't find target bone ${targetName} for transform constraint ${constraintMap.name}.`);\n                data.target = target;\n\n                data.local = getValue(constraintMap, 'local', false);\n                data.relative = getValue(constraintMap, 'relative', false);\n                data.offsetRotation = getValue(constraintMap, 'rotation', 0);\n                data.offsetX = getValue(constraintMap, 'x', 0) * scale;\n                data.offsetY = getValue(constraintMap, 'y', 0) * scale;\n                data.offsetScaleX = getValue(constraintMap, 'scaleX', 0);\n                data.offsetScaleY = getValue(constraintMap, 'scaleY', 0);\n                data.offsetShearY = getValue(constraintMap, 'shearY', 0);\n\n                data.mixRotate = getValue(constraintMap, 'mixRotate', 1);\n                data.mixX = getValue(constraintMap, 'mixX', 1);\n                data.mixY = getValue(constraintMap, 'mixY', data.mixX);\n                data.mixScaleX = getValue(constraintMap, 'mixScaleX', 1);\n                data.mixScaleY = getValue(constraintMap, 'mixScaleY', data.mixScaleX);\n                data.mixShearY = getValue(constraintMap, 'mixShearY', 1);\n\n                skeletonData.transformConstraints.push(data);\n            }\n        }\n\n        // Path constraints.\n        if (root.path) {\n            for (let i = 0; i < root.path.length; i++) {\n                const constraintMap = root.path[i];\n                const data = new PathConstraintData(constraintMap.name);\n\n                data.order = getValue(constraintMap, 'order', 0);\n                data.skinRequired = getValue(constraintMap, 'skin', false);\n\n                for (let ii = 0; ii < constraintMap.bones.length; ii++) {\n                    const boneName = constraintMap.bones[ii];\n                    const bone = skeletonData.findBone(boneName);\n\n                    if (!bone) throw new Error(`Couldn't find bone ${boneName} for path constraint ${constraintMap.name}.`);\n                    data.bones.push(bone);\n                }\n\n                const targetName: string = constraintMap.target;\n                const target = skeletonData.findSlot(targetName);\n\n                if (!target) throw new Error(`Couldn't find target slot ${targetName} for path constraint ${constraintMap.name}.`);\n                data.target = target;\n\n                data.positionMode = Utils.enumValue(PositionMode, getValue(constraintMap, 'positionMode', 'Percent'));\n                data.spacingMode = Utils.enumValue(SpacingMode, getValue(constraintMap, 'spacingMode', 'Length'));\n                data.rotateMode = Utils.enumValue(RotateMode, getValue(constraintMap, 'rotateMode', 'Tangent'));\n                data.offsetRotation = getValue(constraintMap, 'rotation', 0);\n                data.position = getValue(constraintMap, 'position', 0);\n                if (data.positionMode == PositionMode.Fixed) data.position *= scale;\n                data.spacing = getValue(constraintMap, 'spacing', 0);\n                if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed) data.spacing *= scale;\n                data.mixRotate = getValue(constraintMap, 'mixRotate', 1);\n                data.mixX = getValue(constraintMap, 'mixX', 1);\n                data.mixY = getValue(constraintMap, 'mixY', data.mixX);\n\n                skeletonData.pathConstraints.push(data);\n            }\n        }\n\n        // Skins.\n        if (root.skins) {\n            for (let i = 0; i < root.skins.length; i++) {\n                const skinMap = root.skins[i];\n                const skin = new Skin(skinMap.name);\n\n                if (skinMap.bones) {\n                    for (let ii = 0; ii < skinMap.bones.length; ii++) {\n                        const boneName = skinMap.bones[ii];\n                        const bone = skeletonData.findBone(boneName);\n\n                        if (!bone) throw new Error(`Couldn't find bone ${boneName} for skin ${skinMap.name}.`);\n                        skin.bones.push(bone);\n                    }\n                }\n\n                if (skinMap.ik) {\n                    for (let ii = 0; ii < skinMap.ik.length; ii++) {\n                        const constraintName = skinMap.ik[ii];\n                        const constraint = skeletonData.findIkConstraint(constraintName);\n\n                        if (!constraint) throw new Error(`Couldn't find IK constraint ${constraintName} for skin ${skinMap.name}.`);\n                        skin.constraints.push(constraint);\n                    }\n                }\n\n                if (skinMap.transform) {\n                    for (let ii = 0; ii < skinMap.transform.length; ii++) {\n                        const constraintName = skinMap.transform[ii];\n                        const constraint = skeletonData.findTransformConstraint(constraintName);\n\n                        if (!constraint) throw new Error(`Couldn't find transform constraint ${constraintName} for skin ${skinMap.name}.`);\n                        skin.constraints.push(constraint);\n                    }\n                }\n\n                if (skinMap.path) {\n                    for (let ii = 0; ii < skinMap.path.length; ii++) {\n                        const constraintName = skinMap.path[ii];\n                        const constraint = skeletonData.findPathConstraint(constraintName);\n\n                        if (!constraint) throw new Error(`Couldn't find path constraint ${constraintName} for skin ${skinMap.name}.`);\n                        skin.constraints.push(constraint);\n                    }\n                }\n\n                for (const slotName in skinMap.attachments) {\n                    const slot = skeletonData.findSlot(slotName);\n\n                    if (!slot) throw new Error(`Couldn't find slot ${slotName} for skin ${skinMap.name}.`);\n                    const slotMap = skinMap.attachments[slotName];\n\n                    for (const entryName in slotMap) {\n                        const attachment = this.readAttachment(slotMap[entryName], skin, slot.index, entryName, skeletonData);\n\n                        if (attachment) skin.setAttachment(slot.index, entryName, attachment);\n                    }\n                }\n                skeletonData.skins.push(skin);\n                if (skin.name == 'default') skeletonData.defaultSkin = skin;\n            }\n        }\n\n        // Linked meshes.\n        for (let i = 0, n = this.linkedMeshes.length; i < n; i++) {\n            const linkedMesh = this.linkedMeshes[i];\n            const skin = !linkedMesh.skin ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin);\n\n            if (!skin) throw new Error(`Skin not found: ${linkedMesh.skin}`);\n            const parent = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent);\n\n            if (!parent) throw new Error(`Parent mesh not found: ${linkedMesh.parent}`);\n            linkedMesh.mesh.timelineAttachment = linkedMesh.inheritTimeline ? <VertexAttachment>parent : <VertexAttachment>linkedMesh.mesh;\n            linkedMesh.mesh.setParentMesh(<MeshAttachment>parent);\n            // if (linkedMesh.mesh.region != null) linkedMesh.mesh.updateRegion();\n        }\n        this.linkedMeshes.length = 0;\n\n        // Events.\n        if (root.events) {\n            for (const eventName in root.events) {\n                const eventMap = root.events[eventName];\n                const data = new EventData(eventName);\n\n                data.intValue = getValue(eventMap, 'int', 0);\n                data.floatValue = getValue(eventMap, 'float', 0);\n                data.stringValue = getValue(eventMap, 'string', '');\n                data.audioPath = getValue(eventMap, 'audio', null);\n                if (data.audioPath) {\n                    data.volume = getValue(eventMap, 'volume', 1);\n                    data.balance = getValue(eventMap, 'balance', 0);\n                }\n                skeletonData.events.push(data);\n            }\n        }\n\n        // Animations.\n        if (root.animations) {\n            for (const animationName in root.animations) {\n                const animationMap = root.animations[animationName];\n\n                this.readAnimation(animationMap, animationName, skeletonData);\n            }\n        }\n\n        return skeletonData;\n    }\n\n    readAttachment(map: any, skin: Skin, slotIndex: number, name: string, skeletonData: SkeletonData): Attachment | null {\n        const scale = this.scale;\n\n        name = getValue(map, 'name', name);\n\n        switch (getValue(map, 'type', 'region')) {\n            case 'region': {\n                const path = getValue(map, 'path', name);\n                const sequence = this.readSequence(getValue(map, 'sequence', null));\n                const region = this.attachmentLoader.newRegionAttachment(skin, name, path, sequence);\n\n                if (!region) return null;\n                region.path = path;\n                region.x = getValue(map, 'x', 0) * scale;\n                region.y = getValue(map, 'y', 0) * scale;\n                region.scaleX = getValue(map, 'scaleX', 1);\n                region.scaleY = getValue(map, 'scaleY', 1);\n                region.rotation = getValue(map, 'rotation', 0);\n                region.width = map.width * scale;\n                region.height = map.height * scale;\n                region.sequence = sequence;\n\n                const color: string = getValue(map, 'color', null);\n\n                if (color) region.color.setFromString(color);\n\n                // if (region.region != null) region.updateRegion();\n                return region;\n            }\n            case 'boundingbox': {\n                const box = this.attachmentLoader.newBoundingBoxAttachment(skin, name);\n\n                if (!box) return null;\n                this.readVertices(map, box, map.vertexCount << 1);\n                const color: string = getValue(map, 'color', null);\n\n                if (color) box.color.setFromString(color);\n\n                return box;\n            }\n            case 'mesh':\n            case 'linkedmesh': {\n                const path = getValue(map, 'path', name);\n                const sequence = this.readSequence(getValue(map, 'sequence', null));\n                const mesh = this.attachmentLoader.newMeshAttachment(skin, name, path, sequence);\n\n                if (!mesh) return null;\n                mesh.path = path;\n\n                const color = getValue(map, 'color', null);\n\n                if (color) mesh.color.setFromString(color);\n\n                mesh.width = getValue(map, 'width', 0) * scale;\n                mesh.height = getValue(map, 'height', 0) * scale;\n                mesh.sequence = sequence;\n\n                const parent: string = getValue(map, 'parent', null);\n\n                if (parent) {\n                    this.linkedMeshes.push(new LinkedMesh(mesh, <string>getValue(map, 'skin', null), slotIndex, parent, getValue(map, 'timelines', true)));\n\n                    return mesh;\n                }\n\n                const uvs: Array<number> = map.uvs;\n\n                this.readVertices(map, mesh, uvs.length);\n                mesh.triangles = map.triangles;\n                mesh.regionUVs = new Float32Array(uvs);\n                // if (mesh.region != null) mesh.updateRegion();\n\n                mesh.edges = getValue(map, 'edges', null);\n                mesh.hullLength = getValue(map, 'hull', 0) * 2;\n\n                return mesh;\n            }\n            case 'path': {\n                const path = this.attachmentLoader.newPathAttachment(skin, name);\n\n                if (!path) return null;\n                path.closed = getValue(map, 'closed', false);\n                path.constantSpeed = getValue(map, 'constantSpeed', true);\n\n                const vertexCount = map.vertexCount;\n\n                this.readVertices(map, path, vertexCount << 1);\n\n                const lengths: Array<number> = Utils.newArray(vertexCount / 3, 0);\n\n                for (let i = 0; i < map.lengths.length; i++) lengths[i] = map.lengths[i] * scale;\n                path.lengths = lengths;\n\n                const color: string = getValue(map, 'color', null);\n\n                if (color) path.color.setFromString(color);\n\n                return path;\n            }\n            case 'point': {\n                const point = this.attachmentLoader.newPointAttachment(skin, name);\n\n                if (!point) return null;\n                point.x = getValue(map, 'x', 0) * scale;\n                point.y = getValue(map, 'y', 0) * scale;\n                point.rotation = getValue(map, 'rotation', 0);\n\n                const color = getValue(map, 'color', null);\n\n                if (color) point.color.setFromString(color);\n\n                return point;\n            }\n            case 'clipping': {\n                const clip = this.attachmentLoader.newClippingAttachment(skin, name);\n\n                if (!clip) return null;\n\n                const end = getValue(map, 'end', null);\n\n                if (end != null) {\n                    const slot = skeletonData.findSlot(end);\n\n                    if (slot == null) throw new Error(`Clipping end slot not found: ${end}`);\n                    clip.endSlot = slot;\n                }\n\n                const vertexCount = map.vertexCount;\n\n                this.readVertices(map, clip, vertexCount << 1);\n\n                const color: string = getValue(map, 'color', null);\n\n                if (color) clip.color.setFromString(color);\n\n                return clip;\n            }\n        }\n\n        return null;\n    }\n\n    readSequence(map: any) {\n        if (map == null) return null;\n        const sequence = new Sequence(getValue(map, 'count', 0));\n\n        sequence.start = getValue(map, 'start', 1);\n        sequence.digits = getValue(map, 'digits', 0);\n        sequence.setupIndex = getValue(map, 'setup', 0);\n\n        return sequence;\n    }\n\n    readVertices(map: any, attachment: VertexAttachment, verticesLength: number) {\n        const scale = this.scale;\n\n        attachment.worldVerticesLength = verticesLength;\n        const vertices: Array<number> = map.vertices;\n\n        if (verticesLength == vertices.length) {\n            const scaledVertices = Utils.toFloatArray(vertices);\n\n            if (scale != 1) {\n                for (let i = 0, n = vertices.length; i < n; i++) scaledVertices[i] *= scale;\n            }\n            attachment.vertices = scaledVertices;\n\n            return;\n        }\n        const weights = new Array<number>();\n        const bones = new Array<number>();\n\n        for (let i = 0, n = vertices.length; i < n; ) {\n            const boneCount = vertices[i++];\n\n            bones.push(boneCount);\n            for (let nn = i + boneCount * 4; i < nn; i += 4) {\n                bones.push(vertices[i]);\n                weights.push(vertices[i + 1] * scale);\n                weights.push(vertices[i + 2] * scale);\n                weights.push(vertices[i + 3]);\n            }\n        }\n        attachment.bones = bones;\n        attachment.vertices = Utils.toFloatArray(weights);\n    }\n\n    readAnimation(map: any, name: string, skeletonData: SkeletonData) {\n        const scale = this.scale;\n        const timelines = new Array<Timeline>();\n\n        // Slot timelines.\n        if (map.slots) {\n            for (const slotName in map.slots) {\n                const slotMap = map.slots[slotName];\n                const slot = skeletonData.findSlot(slotName);\n\n                if (!slot) throw new Error(`Slot not found: ${slotName}`);\n                const slotIndex = slot.index;\n\n                for (const timelineName in slotMap) {\n                    const timelineMap = slotMap[timelineName];\n\n                    if (!timelineMap) continue;\n                    const frames = timelineMap.length;\n\n                    if (timelineName == 'attachment') {\n                        const timeline = new AttachmentTimeline(frames, slotIndex);\n\n                        for (let frame = 0; frame < frames; frame++) {\n                            const keyMap = timelineMap[frame];\n\n                            timeline.setFrame(frame, getValue(keyMap, 'time', 0), getValue(keyMap, 'name', null));\n                        }\n                        timelines.push(timeline);\n                    } else if (timelineName == 'rgba') {\n                        const timeline = new RGBATimeline(frames, frames << 2, slotIndex);\n                        let keyMap = timelineMap[0];\n                        let time = getValue(keyMap, 'time', 0);\n                        let color = Color.fromString(keyMap.color);\n\n                        for (let frame = 0, bezier = 0; ; frame++) {\n                            timeline.setFrame(frame, time, color.r, color.g, color.b, color.a);\n                            const nextMap = timelineMap[frame + 1];\n\n                            if (!nextMap) {\n                                timeline.shrink(bezier);\n                                break;\n                            }\n                            const time2 = getValue(nextMap, 'time', 0);\n                            const newColor = Color.fromString(nextMap.color);\n                            const curve = keyMap.curve;\n\n                            if (curve) {\n                                bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);\n                                bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);\n                                bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);\n                                bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1);\n                            }\n                            time = time2;\n                            color = newColor;\n                            keyMap = nextMap;\n                        }\n\n                        timelines.push(timeline);\n                    } else if (timelineName == 'rgb') {\n                        const timeline = new RGBTimeline(frames, frames * 3, slotIndex);\n                        let keyMap = timelineMap[0];\n                        let time = getValue(keyMap, 'time', 0);\n                        let color = Color.fromString(keyMap.color);\n\n                        for (let frame = 0, bezier = 0; ; frame++) {\n                            timeline.setFrame(frame, time, color.r, color.g, color.b);\n                            const nextMap = timelineMap[frame + 1];\n\n                            if (!nextMap) {\n                                timeline.shrink(bezier);\n                                break;\n                            }\n                            const time2 = getValue(nextMap, 'time', 0);\n                            const newColor = Color.fromString(nextMap.color);\n                            const curve = keyMap.curve;\n\n                            if (curve) {\n                                bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);\n                                bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);\n                                bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);\n                            }\n                            time = time2;\n                            color = newColor;\n                            keyMap = nextMap;\n                        }\n\n                        timelines.push(timeline);\n                    } else if (timelineName == 'alpha') {\n                        timelines.push(readTimeline1(timelineMap, new AlphaTimeline(frames, frames, slotIndex), 0, 1));\n                    } else if (timelineName == 'rgba2') {\n                        const timeline = new RGBA2Timeline(frames, frames * 7, slotIndex);\n\n                        let keyMap = timelineMap[0];\n                        let time = getValue(keyMap, 'time', 0);\n                        let color = Color.fromString(keyMap.light);\n                        let color2 = Color.fromString(keyMap.dark);\n\n                        for (let frame = 0, bezier = 0; ; frame++) {\n                            timeline.setFrame(frame, time, color.r, color.g, color.b, color.a, color2.r, color2.g, color2.b);\n                            const nextMap = timelineMap[frame + 1];\n\n                            if (!nextMap) {\n                                timeline.shrink(bezier);\n                                break;\n                            }\n                            const time2 = getValue(nextMap, 'time', 0);\n                            const newColor = Color.fromString(nextMap.light);\n                            const newColor2 = Color.fromString(nextMap.dark);\n                            const curve = keyMap.curve;\n\n                            if (curve) {\n                                bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);\n                                bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);\n                                bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);\n                                bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1);\n                                bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.r, newColor2.r, 1);\n                                bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.g, newColor2.g, 1);\n                                bezier = readCurve(curve, timeline, bezier, frame, 6, time, time2, color2.b, newColor2.b, 1);\n                            }\n                            time = time2;\n                            color = newColor;\n                            color2 = newColor2;\n                            keyMap = nextMap;\n                        }\n\n                        timelines.push(timeline);\n                    } else if (timelineName == 'rgb2') {\n                        const timeline = new RGB2Timeline(frames, frames * 6, slotIndex);\n\n                        let keyMap = timelineMap[0];\n                        let time = getValue(keyMap, 'time', 0);\n                        let color = Color.fromString(keyMap.light);\n                        let color2 = Color.fromString(keyMap.dark);\n\n                        for (let frame = 0, bezier = 0; ; frame++) {\n                            timeline.setFrame(frame, time, color.r, color.g, color.b, color2.r, color2.g, color2.b);\n                            const nextMap = timelineMap[frame + 1];\n\n                            if (!nextMap) {\n                                timeline.shrink(bezier);\n                                break;\n                            }\n                            const time2 = getValue(nextMap, 'time', 0);\n                            const newColor = Color.fromString(nextMap.light);\n                            const newColor2 = Color.fromString(nextMap.dark);\n                            const curve = keyMap.curve;\n\n                            if (curve) {\n                                bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);\n                                bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);\n                                bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);\n                                bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color2.r, newColor2.r, 1);\n                                bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.g, newColor2.g, 1);\n                                bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.b, newColor2.b, 1);\n                            }\n                            time = time2;\n                            color = newColor;\n                            color2 = newColor2;\n                            keyMap = nextMap;\n                        }\n\n                        timelines.push(timeline);\n                    }\n                }\n            }\n        }\n\n        // Bone timelines.\n        if (map.bones) {\n            for (const boneName in map.bones) {\n                const boneMap = map.bones[boneName];\n                const bone = skeletonData.findBone(boneName);\n\n                if (!bone) throw new Error(`Bone not found: ${boneName}`);\n                const boneIndex = bone.index;\n\n                for (const timelineName in boneMap) {\n                    const timelineMap = boneMap[timelineName];\n                    const frames = timelineMap.length;\n\n                    if (frames == 0) continue;\n\n                    if (timelineName === 'rotate') {\n                        timelines.push(readTimeline1(timelineMap, new RotateTimeline(frames, frames, boneIndex), 0, 1));\n                    } else if (timelineName === 'translate') {\n                        const timeline = new TranslateTimeline(frames, frames << 1, boneIndex);\n\n                        timelines.push(readTimeline2(timelineMap, timeline, 'x', 'y', 0, scale));\n                    } else if (timelineName === 'translatex') {\n                        const timeline = new TranslateXTimeline(frames, frames, boneIndex);\n\n                        timelines.push(readTimeline1(timelineMap, timeline, 0, scale));\n                    } else if (timelineName === 'translatey') {\n                        const timeline = new TranslateYTimeline(frames, frames, boneIndex);\n\n                        timelines.push(readTimeline1(timelineMap, timeline, 0, scale));\n                    } else if (timelineName === 'scale') {\n                        const timeline = new ScaleTimeline(frames, frames << 1, boneIndex);\n\n                        timelines.push(readTimeline2(timelineMap, timeline, 'x', 'y', 1, 1));\n                    } else if (timelineName === 'scalex') {\n                        const timeline = new ScaleXTimeline(frames, frames, boneIndex);\n\n                        timelines.push(readTimeline1(timelineMap, timeline, 1, 1));\n                    } else if (timelineName === 'scaley') {\n                        const timeline = new ScaleYTimeline(frames, frames, boneIndex);\n\n                        timelines.push(readTimeline1(timelineMap, timeline, 1, 1));\n                    } else if (timelineName === 'shear') {\n                        const timeline = new ShearTimeline(frames, frames << 1, boneIndex);\n\n                        timelines.push(readTimeline2(timelineMap, timeline, 'x', 'y', 0, 1));\n                    } else if (timelineName === 'shearx') {\n                        const timeline = new ShearXTimeline(frames, frames, boneIndex);\n\n                        timelines.push(readTimeline1(timelineMap, timeline, 0, 1));\n                    } else if (timelineName === 'sheary') {\n                        const timeline = new ShearYTimeline(frames, frames, boneIndex);\n\n                        timelines.push(readTimeline1(timelineMap, timeline, 0, 1));\n                    }\n                }\n            }\n        }\n\n        // IK constraint timelines.\n        if (map.ik) {\n            for (const constraintName in map.ik) {\n                const constraintMap = map.ik[constraintName];\n                let keyMap = constraintMap[0];\n\n                if (!keyMap) continue;\n\n                const constraint = skeletonData.findIkConstraint(constraintName);\n\n                if (!constraint) throw new Error(`IK Constraint not found: ${constraintName}`);\n                const constraintIndex = skeletonData.ikConstraints.indexOf(constraint);\n                const timeline = new IkConstraintTimeline(constraintMap.length, constraintMap.length << 1, constraintIndex);\n\n                let time = getValue(keyMap, 'time', 0);\n                let mix = getValue(keyMap, 'mix', 1);\n                let softness = getValue(keyMap, 'softness', 0) * scale;\n\n                for (let frame = 0, bezier = 0; ; frame++) {\n                    timeline.setFrame(\n                        frame,\n                        time,\n                        mix,\n                        softness,\n                        getValue(keyMap, 'bendPositive', true) ? 1 : -1,\n                        getValue(keyMap, 'compress', false),\n                        getValue(keyMap, 'stretch', false)\n                    );\n                    const nextMap = constraintMap[frame + 1];\n\n                    if (!nextMap) {\n                        timeline.shrink(bezier);\n                        break;\n                    }\n\n                    const time2 = getValue(nextMap, 'time', 0);\n                    const mix2 = getValue(nextMap, 'mix', 1);\n                    const softness2 = getValue(nextMap, 'softness', 0) * scale;\n                    const curve = keyMap.curve;\n\n                    if (curve) {\n                        bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mix, mix2, 1);\n                        bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, softness, softness2, scale);\n                    }\n\n                    time = time2;\n                    mix = mix2;\n                    softness = softness2;\n                    keyMap = nextMap;\n                }\n                timelines.push(timeline);\n            }\n        }\n\n        // Transform constraint timelines.\n        if (map.transform) {\n            for (const constraintName in map.transform) {\n                const timelineMap = map.transform[constraintName];\n                let keyMap = timelineMap[0];\n\n                if (!keyMap) continue;\n\n                const constraint = skeletonData.findTransformConstraint(constraintName);\n\n                if (!constraint) throw new Error(`Transform constraint not found: ${constraintName}`);\n                const constraintIndex = skeletonData.transformConstraints.indexOf(constraint);\n                const timeline = new TransformConstraintTimeline(timelineMap.length, timelineMap.length * 6, constraintIndex);\n\n                let time = getValue(keyMap, 'time', 0);\n                let mixRotate = getValue(keyMap, 'mixRotate', 1);\n                let mixX = getValue(keyMap, 'mixX', 1);\n                let mixY = getValue(keyMap, 'mixY', mixX);\n                let mixScaleX = getValue(keyMap, 'mixScaleX', 1);\n                let mixScaleY = getValue(keyMap, 'mixScaleY', mixScaleX);\n                const mixShearY = getValue(keyMap, 'mixShearY', 1);\n\n                for (let frame = 0, bezier = 0; ; frame++) {\n                    timeline.setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY);\n                    const nextMap = timelineMap[frame + 1];\n\n                    if (!nextMap) {\n                        timeline.shrink(bezier);\n                        break;\n                    }\n\n                    const time2 = getValue(nextMap, 'time', 0);\n                    const mixRotate2 = getValue(nextMap, 'mixRotate', 1);\n                    const mixX2 = getValue(nextMap, 'mixX', 1);\n                    const mixY2 = getValue(nextMap, 'mixY', mixX2);\n                    const mixScaleX2 = getValue(nextMap, 'mixScaleX', 1);\n                    const mixScaleY2 = getValue(nextMap, 'mixScaleY', mixScaleX2);\n                    const mixShearY2 = getValue(nextMap, 'mixShearY', 1);\n                    const curve = keyMap.curve;\n\n                    if (curve) {\n                        bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1);\n                        bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1);\n                        bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, mixY, mixY2, 1);\n                        bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, mixScaleX, mixScaleX2, 1);\n                        bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, mixScaleY, mixScaleY2, 1);\n                        bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, mixShearY, mixShearY2, 1);\n                    }\n\n                    time = time2;\n                    mixRotate = mixRotate2;\n                    mixX = mixX2;\n                    mixY = mixY2;\n                    mixScaleX = mixScaleX2;\n                    mixScaleY = mixScaleY2;\n                    mixScaleX = mixScaleX2;\n                    keyMap = nextMap;\n                }\n                timelines.push(timeline);\n            }\n        }\n\n        // Path constraint timelines.\n        if (map.path) {\n            for (const constraintName in map.path) {\n                const constraintMap = map.path[constraintName];\n                const constraint = skeletonData.findPathConstraint(constraintName);\n\n                if (!constraint) throw new Error(`Path constraint not found: ${constraintName}`);\n                const constraintIndex = skeletonData.pathConstraints.indexOf(constraint);\n\n                for (const timelineName in constraintMap) {\n                    const timelineMap = constraintMap[timelineName];\n                    let keyMap = timelineMap[0];\n\n                    if (!keyMap) continue;\n\n                    const frames = timelineMap.length;\n\n                    if (timelineName === 'position') {\n                        const timeline = new PathConstraintPositionTimeline(frames, frames, constraintIndex);\n\n                        timelines.push(readTimeline1(timelineMap, timeline, 0, constraint.positionMode == PositionMode.Fixed ? scale : 1));\n                    } else if (timelineName === 'spacing') {\n                        const timeline = new PathConstraintSpacingTimeline(frames, frames, constraintIndex);\n\n                        timelines.push(\n                            readTimeline1(timelineMap, timeline, 0, constraint.spacingMode == SpacingMode.Length || constraint.spacingMode == SpacingMode.Fixed ? scale : 1)\n                        );\n                    } else if (timelineName === 'mix') {\n                        const timeline = new PathConstraintMixTimeline(frames, frames * 3, constraintIndex);\n                        let time = getValue(keyMap, 'time', 0);\n                        let mixRotate = getValue(keyMap, 'mixRotate', 1);\n                        let mixX = getValue(keyMap, 'mixX', 1);\n                        let mixY = getValue(keyMap, 'mixY', mixX);\n\n                        for (let frame = 0, bezier = 0; ; frame++) {\n                            timeline.setFrame(frame, time, mixRotate, mixX, mixY);\n                            const nextMap = timelineMap[frame + 1];\n\n                            if (!nextMap) {\n                                timeline.shrink(bezier);\n                                break;\n                            }\n                            const time2 = getValue(nextMap, 'time', 0);\n                            const mixRotate2 = getValue(nextMap, 'mixRotate', 1);\n                            const mixX2 = getValue(nextMap, 'mixX', 1);\n                            const mixY2 = getValue(nextMap, 'mixY', mixX2);\n                            const curve = keyMap.curve;\n\n                            if (curve) {\n                                bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1);\n                                bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1);\n                                bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, mixY, mixY2, 1);\n                            }\n                            time = time2;\n                            mixRotate = mixRotate2;\n                            mixX = mixX2;\n                            mixY = mixY2;\n                            keyMap = nextMap;\n                        }\n                        timelines.push(timeline);\n                    }\n                }\n            }\n        }\n\n        // ver40 compatibility\n        if (map.deform) {\n            map.attachments = {};\n            for (const deformName in map.deform) {\n                const deformMap = map.deform[deformName];\n                const outMap = (map.attachments[deformName] = {});\n\n                for (const slotName in deformMap) {\n                    const slotMap = deformMap[slotName];\n                    const outMap2 = (outMap[slotName] = {});\n\n                    for (const innerMapName in slotMap) {\n                        outMap2[innerMapName] = {\n                            deform: slotMap[innerMapName],\n                        };\n                    }\n                }\n            }\n        }\n\n        // Attachment timelines.\n        if (map.attachments) {\n            for (const attachmentsName in map.attachments) {\n                const attachmentsMap = map.attachments[attachmentsName];\n                const skin = skeletonData.findSkin(attachmentsName);\n\n                if (skin == null) {\n                    if (settings.FAIL_ON_NON_EXISTING_SKIN) {\n                        throw new Error(`Skin not found: ${attachmentsName}`);\n                    } else {\n                        continue;\n                    }\n                }\n                for (const slotMapName in attachmentsMap) {\n                    const slotMap = attachmentsMap[slotMapName];\n                    const slot = skeletonData.findSlot(slotMapName);\n\n                    if (!slot) throw new Error(`Slot not found: ${slotMapName}`);\n                    const slotIndex = slot.index;\n\n                    for (const attachmentMapName in slotMap) {\n                        const attachmentMap = slotMap[attachmentMapName];\n                        const attachment = <VertexAttachment>skin.getAttachment(slotIndex, attachmentMapName);\n\n                        for (const timelineMapName in attachmentMap) {\n                            const timelineMap = attachmentMap[timelineMapName];\n                            let keyMap = timelineMap[0];\n\n                            if (!keyMap) continue;\n\n                            if (timelineMapName == 'deform') {\n                                const weighted = attachment.bones;\n                                const vertices = attachment.vertices;\n                                const deformLength = weighted ? (vertices.length / 3) * 2 : vertices.length;\n\n                                const timeline = new DeformTimeline(timelineMap.length, timelineMap.length, slotIndex, attachment);\n                                let time = getValue(keyMap, 'time', 0);\n\n                                for (let frame = 0, bezier = 0; ; frame++) {\n                                    let deform: NumberArrayLike;\n                                    const verticesValue: Array<Number> = getValue(keyMap, 'vertices', null);\n\n                                    if (!verticesValue) deform = weighted ? Utils.newFloatArray(deformLength) : vertices;\n                                    else {\n                                        deform = Utils.newFloatArray(deformLength);\n                                        const start = <number>getValue(keyMap, 'offset', 0);\n\n                                        Utils.arrayCopy(verticesValue, 0, deform, start, verticesValue.length);\n                                        if (scale != 1) {\n                                            for (let i = start, n = i + verticesValue.length; i < n; i++) deform[i] *= scale;\n                                        }\n                                        if (!weighted) {\n                                            for (let i = 0; i < deformLength; i++) deform[i] += vertices[i];\n                                        }\n                                    }\n\n                                    timeline.setFrame(frame, time, deform);\n                                    const nextMap = timelineMap[frame + 1];\n\n                                    if (!nextMap) {\n                                        timeline.shrink(bezier);\n                                        break;\n                                    }\n                                    const time2 = getValue(nextMap, 'time', 0);\n                                    const curve = keyMap.curve;\n\n                                    if (curve) bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, 0, 1, 1);\n                                    time = time2;\n                                    keyMap = nextMap;\n                                }\n                                timelines.push(timeline);\n                            } else if (timelineMapName == 'sequence') {\n                                const timeline = new SequenceTimeline(timelineMap.length, slotIndex, attachment as unknown as IHasTextureRegion);\n                                let lastDelay = 0;\n\n                                for (let frame = 0; frame < timelineMap.length; frame++) {\n                                    const delay = getValue(keyMap, 'delay', lastDelay);\n                                    const time = getValue(keyMap, 'time', 0);\n                                    const mode = SequenceMode[getValue(keyMap, 'mode', 'hold')] as unknown as number;\n                                    const index = getValue(keyMap, 'index', 0);\n\n                                    timeline.setFrame(frame, time, mode, index, delay);\n                                    lastDelay = delay;\n                                    keyMap = timelineMap[frame + 1];\n                                }\n                                timelines.push(timeline);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n        // Draw order timelines.\n        if (map.drawOrder) {\n            const timeline = new DrawOrderTimeline(map.drawOrder.length);\n            const slotCount = skeletonData.slots.length;\n            let frame = 0;\n\n            for (let i = 0; i < map.drawOrder.length; i++, frame++) {\n                const drawOrderMap = map.drawOrder[i];\n                let drawOrder: Array<number> | null = null;\n                const offsets = getValue(drawOrderMap, 'offsets', null);\n\n                if (offsets) {\n                    drawOrder = Utils.newArray<number>(slotCount, -1);\n                    const unchanged = Utils.newArray<number>(slotCount - offsets.length, 0);\n                    let originalIndex = 0;\n                    let unchangedIndex = 0;\n\n                    for (let ii = 0; ii < offsets.length; ii++) {\n                        const offsetMap = offsets[ii];\n                        const slot = skeletonData.findSlot(offsetMap.slot);\n\n                        if (!slot) throw new Error(`Slot not found: ${slot}`);\n                        const slotIndex = slot.index;\n                        // Collect unchanged items.\n\n                        while (originalIndex != slotIndex) unchanged[unchangedIndex++] = originalIndex++;\n                        // Set changed items.\n                        drawOrder[originalIndex + offsetMap.offset] = originalIndex++;\n                    }\n                    // Collect remaining unchanged items.\n                    while (originalIndex < slotCount) unchanged[unchangedIndex++] = originalIndex++;\n                    // Fill in unchanged items.\n                    for (let ii = slotCount - 1; ii >= 0; ii--) if (drawOrder[ii] == -1) drawOrder[ii] = unchanged[--unchangedIndex];\n                }\n                timeline.setFrame(frame, getValue(drawOrderMap, 'time', 0), drawOrder);\n            }\n            timelines.push(timeline);\n        }\n\n        // Event timelines.\n        if (map.events) {\n            const timeline = new EventTimeline(map.events.length);\n            let frame = 0;\n\n            for (let i = 0; i < map.events.length; i++, frame++) {\n                const eventMap = map.events[i];\n                const eventData = skeletonData.findEvent(eventMap.name);\n\n                if (!eventData) throw new Error(`Event not found: ${eventMap.name}`);\n                const event = new Event(Utils.toSinglePrecision(getValue(eventMap, 'time', 0)), eventData);\n\n                event.intValue = getValue(eventMap, 'int', eventData.intValue);\n                event.floatValue = getValue(eventMap, 'float', eventData.floatValue);\n                event.stringValue = getValue(eventMap, 'string', eventData.stringValue);\n                if (event.data.audioPath) {\n                    event.volume = getValue(eventMap, 'volume', 1);\n                    event.balance = getValue(eventMap, 'balance', 0);\n                }\n                timeline.setFrame(frame, event);\n            }\n            timelines.push(timeline);\n        }\n\n        let duration = 0;\n\n        for (let i = 0, n = timelines.length; i < n; i++) duration = Math.max(duration, timelines[i].getDuration());\n        if (isNaN(duration)) {\n            throw new Error('Error while parsing animation, duration is NaN');\n        }\n\n        skeletonData.animations.push(new Animation(name, timelines, duration));\n    }\n    static blendModeFromString(str: string) {\n        str = str.toLowerCase();\n        if (str == 'normal') return BLEND_MODES.NORMAL;\n        if (str == 'additive') return BLEND_MODES.ADD;\n        if (str == 'multiply') return BLEND_MODES.MULTIPLY;\n        if (str == 'screen') return BLEND_MODES.SCREEN;\n        throw new Error(`Unknown blend mode: ${str}`);\n    }\n}\n\nclass LinkedMesh {\n    parent: string;\n    skin: string;\n    slotIndex: number;\n    mesh: MeshAttachment;\n    inheritTimeline: boolean;\n\n    constructor(mesh: MeshAttachment, skin: string, slotIndex: number, parent: string, inheritDeform: boolean) {\n        this.mesh = mesh;\n        this.skin = skin;\n        this.slotIndex = slotIndex;\n        this.parent = parent;\n        this.inheritTimeline = inheritDeform;\n    }\n}\n\nfunction readTimeline1(keys: any[], timeline: CurveTimeline1, defaultValue: number, scale: number) {\n    let keyMap = keys[0];\n    let time = getValue(keyMap, 'time', 0);\n    let value = getValue(keyMap, 'value', defaultValue) * scale;\n    let bezier = 0;\n\n    for (let frame = 0; ; frame++) {\n        timeline.setFrame(frame, time, value);\n        const nextMap = keys[frame + 1];\n\n        if (!nextMap) {\n            timeline.shrink(bezier);\n\n            return timeline;\n        }\n        const time2 = getValue(nextMap, 'time', 0);\n        const value2 = getValue(nextMap, 'value', defaultValue) * scale;\n\n        if (keyMap.curve) bezier = readCurve(keyMap.curve, timeline, bezier, frame, 0, time, time2, value, value2, scale);\n        time = time2;\n        value = value2;\n        keyMap = nextMap;\n    }\n}\n\nfunction readTimeline2(keys: any[], timeline: CurveTimeline2, name1: string, name2: string, defaultValue: number, scale: number) {\n    let keyMap = keys[0];\n    let time = getValue(keyMap, 'time', 0);\n    let value1 = getValue(keyMap, name1, defaultValue) * scale;\n    let value2 = getValue(keyMap, name2, defaultValue) * scale;\n    let bezier = 0;\n\n    for (let frame = 0; ; frame++) {\n        timeline.setFrame(frame, time, value1, value2);\n        const nextMap = keys[frame + 1];\n\n        if (!nextMap) {\n            timeline.shrink(bezier);\n\n            return timeline;\n        }\n        const time2 = getValue(nextMap, 'time', 0);\n        const nvalue1 = getValue(nextMap, name1, defaultValue) * scale;\n        const nvalue2 = getValue(nextMap, name2, defaultValue) * scale;\n        const curve = keyMap.curve;\n\n        if (curve) {\n            bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, value1, nvalue1, scale);\n            bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, value2, nvalue2, scale);\n        }\n        time = time2;\n        value1 = nvalue1;\n        value2 = nvalue2;\n        keyMap = nextMap;\n    }\n}\n\nfunction readCurve(curve: any, timeline: CurveTimeline, bezier: number, frame: number, value: number, time1: number, time2: number, value1: number, value2: number, scale: number) {\n    if (curve == 'stepped') {\n        timeline.setStepped(frame);\n\n        return bezier;\n    }\n    const i = value << 2;\n    const cx1 = curve[i];\n    const cy1 = curve[i + 1] * scale;\n    const cx2 = curve[i + 2];\n    const cy2 = curve[i + 3] * scale;\n\n    timeline.setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2);\n\n    return bezier + 1;\n}\n\nfunction getValue(map: any, property: string, defaultValue: any) {\n    return map[property] !== undefined ? map[property] : defaultValue;\n}\n","import { SpineBase } from '@pixi-spine/base';\nimport { Skeleton } from './core/Skeleton';\nimport type { SkeletonData } from './core/SkeletonData';\nimport { AnimationState } from './core/AnimationState';\nimport { AnimationStateData } from './core/AnimationStateData';\n\n/**\n * @public\n */\nexport class Spine extends SpineBase<Skeleton, SkeletonData, AnimationState, AnimationStateData> {\n    createSkeleton(spineData: SkeletonData) {\n        this.skeleton = new Skeleton(spineData);\n        this.skeleton.updateWorldTransform();\n        this.stateData = new AnimationStateData(spineData);\n        this.state = new AnimationState(this.stateData);\n    }\n}\n"],"names":["Attachment","name","_VertexAttachment","slot","worldVertices","start","count","offset","stride","skeleton","deformArray","vertices","bones","mat","x","y","a","b","c","d","v","w","vx","vy","skip","i","n","skeletonBones","wx","wy","weight","deform","f","attachment","Utils","VertexAttachment","BoundingBoxAttachment","AttachmentType","Color","copy","ClippingAttachment","MeshAttachment","path","parentMesh","PathAttachment","PointAttachment","bone","point","cos","MathUtils","sin","_RegionAttachment","region","regionScaleX","regionScaleY","localX","localY","localX2","localY2","radians","localXCos","localXSin","localYCos","localYSin","localX2Cos","localX2Sin","localY2Cos","localY2Sin","uvs","vertexOffset","offsetX","offsetY","RegionAttachment","_Sequence","index","basePath","result","frame","Sequence","SequenceMode","t","SequenceModeValues","Animation","timelines","duration","StringSet","ids","lastTime","time","loop","events","alpha","blend","direction","Property","Timeline","frameCount","propertyIds","frames","step","CurveTimeline","bezierCount","size","newCurves","bezier","value","time1","value1","cx1","cy1","cx2","cy2","time2","value2","curves","tmpx","tmpy","dddx","dddy","ddx","ddy","dx","dy","frameIndex","valueOffset","CurveTimeline1","propertyId","ii","curveType","before","CurveTimeline2","propertyId1","propertyId2","RotateTimeline","boneIndex","MixBlend","r","TranslateTimeline","TranslateXTimeline","TranslateYTimeline","ScaleTimeline","bx","by","MixDirection","ScaleXTimeline","ScaleYTimeline","ShearTimeline","ShearXTimeline","ShearYTimeline","RGBATimeline","slotIndex","g","color","setup","RGBTimeline","AlphaTimeline","RGBA2Timeline","r2","g2","b2","light","dark","setupLight","setupDark","RGB2Timeline","AttachmentTimeline","attachmentName","DeformTimeline","firedEvents","slotAttachment","vertexCount","vertexAttachment","setupVertices","lastVertices","percent","prevVertices","nextVertices","prev","_EventTimeline","event","frameTime","EventTimeline","_DrawOrderTimeline","drawOrder","idx","drawOrderToSetupIndex","slots","DrawOrderTimeline","IkConstraintTimeline","ikConstraintIndex","mix","softness","bendDirection","compress","stretch","constraint","TransformConstraintTimeline","transformConstraintIndex","mixRotate","mixX","mixY","mixScaleX","mixScaleY","mixShearY","data","rotate","scaleX","scaleY","shearY","PathConstraintPositionTimeline","pathConstraintIndex","position","PathConstraintSpacingTimeline","spacing","PathConstraintMixTimeline","_SequenceTimeline","mode","delay","modeAndIndex","SequenceTimeline","_AnimationState","EventQueue","Pool","TrackEntry","delta","tracks","current","currentDelta","next","nextTime","from","to","finished","applied","animationLast","animationTime","applyTime","applyEvents","timelineCount","timeline","timelineMode","shortestRotation","firstFrame","timelineBlend","SUBSEQUENT","setupState","SETUP","attachments","alphaHold","alphaMix","timelineHoldMix","FIRST","HOLD_SUBSEQUENT","HOLD_FIRST","holdMix","CURRENT","timelinesRotation","r1","total","diff","lastTotal","lastDiff","dir","entry","animationStart","animationEnd","trackLastWrapped","complete","oldDrainDisabled","trackIndex","interrupt","animationName","animation","last","mixDuration","timelinesCount","propertyIDs","outer","HOLD_MIX","listener","AnimationState","_TrackEntry","animState","EventType","objects","listeners","type","o","AnimationStateAdapter","AnimationStateData","skeletonData","fromName","toName","key","AtlasAttachmentLoader","atlas","sequence","regions","skin","Bone","parent","Matrix","rotation","shearX","m","sx","sy","settings","rotationY","pa","pb","pc","pd","TransformMode","la","lb","lc","ld","s","prx","rx","ry","za","zc","zb","zd","pm","pid","ia","id","ib","ic","ra","rb","rc","rd","det","world","invDet","local","worldRotation","localRotation","degrees","BoneData","ConstraintData","order","skinRequired","Event","EventData","IkConstraint","target","targetX","targetY","uniform","p","rotationIK","tx","ty","skelX","skelY","sa","sc","dd","child","bendDir","px","py","psx","psy","csx","pmat","os1","os2","s2","cx","cy","cwx","cwy","u","pp","l1","l2","a1","a2","td","sd","aa","bb","ta","c1","c2","q","r0","minAngle","minX","minDist","minY","maxAngle","maxX","maxDist","maxY","os","IkConstraintData","boneData","PathConstraintData","PositionMode","SpacingMode","RotateMode","slotData","_PathConstraint","tangents","scale","boneCount","spacesCount","spaces","lengths","setupLength","sum","length","lengthSpacing","positions","boneX","boneY","offsetRotation","tip","out","closed","verticesLength","curveCount","prevCurve","pathLength","multiplier","curve","space","x1","y1","x2","y2","dddfx","dddfy","ddfx","ddfy","dfx","dfy","segments","curveLength","segment","temp","tt","ttt","uu","uuu","ut","ut3","uut3","utt3","PathConstraint","Slot","TransformConstraint","Vector2","translate","targetMat","tb","tc","degRadReflect","offsetShearY","_Skeleton","ikConstraintData","transformConstraintData","pathConstraintData","updateCache","skinBones","ikConstraints","transformConstraints","pathConstraints","ikCount","transformCount","pathCount","constraintCount","constrained","slotBone","pathBones","nn","rootBone","updatable","boneName","slotName","skinName","newSkin","constraintName","ikConstraint","mesh","Skeleton","SkeletonData","skins","eventDataName","animations","pathConstraintName","SlotData","BLEND_MODES","TransformConstraintData","SkinEntry","Skin","contained","dictionary","entries","slotAttachments","oldSkin","skinAttachment","SkeletonBinary","attachmentLoader","binary","input","BinaryInput","lowHash","highHash","verShort","error","nonessential","str","darkColor","defaultSkin","linkedMesh","eventName","slotCount","width","height","box","triangles","hullLength","edges","inheritTimelines","LinkedMesh","constantSpeed","endSlotIndex","clip","ATTACHMENT_DEFORM","Vertices","weights","bonesArray","array","timelineType","frameLast","SLOT_ATTACHMENT","SLOT_RGBA","CURVE_STEPPED","CURVE_BEZIER","setBezier","SLOT_RGB","SLOT_RGBA2","nr","ng","nb","na","nr2","ng2","nb2","SLOT_RGB2","SLOT_ALPHA","BONE_ROTATE","readTimeline1","BONE_TRANSLATE","readTimeline2","BONE_TRANSLATEX","BONE_TRANSLATEY","BONE_SCALE","BONE_SCALEX","BONE_SCALEY","BONE_SHEAR","BONE_SHEARX","BONE_SHEARY","mix2","softness2","mixRotate2","mixX2","mixY2","mixScaleX2","mixScaleY2","mixShearY2","PATH_POSITION","PATH_SPACING","PATH_MIX","iii","nnn","weighted","deformLength","end","vn","ATTACHMENT_SEQUENCE","drawOrderCount","offsetCount","unchanged","originalIndex","unchangedIndex","eventCount","eventData","inheritDeform","nvalue1","nvalue2","SkeletonBounds","SkeletonBoundsBase","SkeletonJson","json","root","skeletonMap","boneMap","parentName","getValue","slotMap","constraintMap","targetName","skinMap","entryName","eventMap","animationMap","map","scaledVertices","timelineName","timelineMap","keyMap","nextMap","newColor","readCurve","color2","newColor2","constraintIndex","deformName","deformMap","outMap","outMap2","innerMapName","attachmentsName","attachmentsMap","slotMapName","attachmentMapName","attachmentMap","timelineMapName","verticesValue","lastDelay","drawOrderMap","offsets","offsetMap","keys","defaultValue","name1","name2","property","Spine","SpineBase","spineData"],"mappings":";;;;;;;;8VASO,MAAeA,EAAkC,CAIpD,YAAYC,EAAc,CACtB,GAAI,CAACA,EAAM,MAAM,IAAI,MAAM,sBAAsB,EACjD,KAAK,KAAOA,CAChB,CAGJ,CAOO,MAAeC,GAAf,cAAwCF,EAAW,CAwBtD,YAAYC,EAAc,CACtB,MAAMA,CAAI,EArBd,KAAKC,GAAAA,GAAiB,SAKtB,KAAA,MAA8B,KAK9B,KAAA,SAA4B,GAI5B,KAAA,oBAAsB,EAItB,KAAA,mBAAiC,IAIjC,CAEA,wBAAwBC,EAAYC,EAAkC,CAClE,KAAK,qBAAqBD,EAAM,EAAG,KAAK,oBAAqBC,EAAe,EAAG,CAAC,CACpF,CAYA,qBAAqBD,EAAYE,EAAeC,EAAeF,EAAgCG,EAAgBC,EAAgB,CAC3HF,EAAQC,GAAUD,GAAS,GAAKE,EAChC,MAAMC,EAAWN,EAAK,KAAK,SACrBO,EAAcP,EAAK,OACzB,IAAIQ,EAAW,KAAK,SACpB,MAAMC,EAAQ,KAAK,MAEnB,GAAI,CAACA,EAAO,CACJF,EAAY,OAAS,IAAGC,EAAWD,GACvC,MAAMG,EAAMV,EAAK,KAAK,OAChBW,EAAID,EAAI,GACRE,EAAIF,EAAI,GACRG,EAAIH,EAAI,EACRI,EAAIJ,EAAI,EACRK,EAAIL,EAAI,EACRM,EAAIN,EAAI,EAEd,QAASO,EAAIf,EAAOgB,EAAId,EAAQc,EAAIf,EAAOc,GAAK,EAAGC,GAAKb,EAAQ,CAC5D,MAAMc,EAAKX,EAASS,CAAC,EACfG,EAAKZ,EAASS,EAAI,CAAC,EAEzBhB,EAAciB,CAAC,EAAIC,EAAKN,EAAIO,EAAKN,EAAIH,EACrCV,EAAciB,EAAI,CAAC,EAAIC,EAAKJ,EAAIK,EAAKJ,EAAIJ,CAC7C,CAEA,MACJ,CACA,IAAIK,EAAI,EACJI,EAAO,EAEX,QAASC,EAAI,EAAGA,EAAIpB,EAAOoB,GAAK,EAAG,CAC/B,MAAMC,EAAId,EAAMQ,CAAC,EAEjBA,GAAKM,EAAI,EACTF,GAAQE,CACZ,CACA,MAAMC,EAAgBlB,EAAS,MAE/B,GAAIC,EAAY,QAAU,EACtB,QAASW,EAAId,EAAQU,EAAIO,EAAO,EAAGH,EAAIf,EAAOe,GAAKb,EAAQ,CACvD,IAAIoB,EAAK,EACLC,EAAK,EACLH,EAAId,EAAMQ,GAAG,EAGjB,IADAM,GAAKN,EACEA,EAAIM,EAAGN,IAAKH,GAAK,EAAG,CACvB,MAAMJ,EAAMc,EAAcf,EAAMQ,CAAC,CAAC,EAAE,OAC9BE,EAAKX,EAASM,CAAC,EACfM,EAAKZ,EAASM,EAAI,CAAC,EACnBa,EAASnB,EAASM,EAAI,CAAC,EAE7BW,IAAON,EAAKT,EAAI,EAAIU,EAAKV,EAAI,EAAIA,EAAI,IAAMiB,EAC3CD,IAAOP,EAAKT,EAAI,EAAIU,EAAKV,EAAI,EAAIA,EAAI,IAAMiB,CAC/C,CACA1B,EAAciB,CAAC,EAAIO,EACnBxB,EAAciB,EAAI,CAAC,EAAIQ,CAC3B,KACG,CACH,MAAME,EAASrB,EAEf,QAASW,EAAId,EAAQU,EAAIO,EAAO,EAAGQ,EAAIR,GAAQ,EAAGH,EAAIf,EAAOe,GAAKb,EAAQ,CACtE,IAAIoB,EAAK,EACLC,EAAK,EACLH,EAAId,EAAMQ,GAAG,EAGjB,IADAM,GAAKN,EACEA,EAAIM,EAAGN,IAAKH,GAAK,EAAGe,GAAK,EAAG,CAC/B,MAAMnB,EAAMc,EAAcf,EAAMQ,CAAC,CAAC,EAAE,OAC9BE,EAAKX,EAASM,CAAC,EAAIc,EAAOC,CAAC,EAC3BT,EAAKZ,EAASM,EAAI,CAAC,EAAIc,EAAOC,EAAI,CAAC,EACnCF,EAASnB,EAASM,EAAI,CAAC,EAE7BW,IAAON,EAAKT,EAAI,EAAIU,EAAKV,EAAI,EAAIA,EAAI,IAAMiB,EAC3CD,IAAOP,EAAKT,EAAI,EAAIU,EAAKV,EAAI,EAAIA,EAAI,IAAMiB,CAC/C,CACA1B,EAAciB,CAAC,EAAIO,EACnBxB,EAAciB,EAAI,CAAC,EAAIQ,CAC3B,CACJ,CACJ,CAGA,OAAOI,EAA8B,CAC7B,KAAK,OACLA,EAAW,MAAQ,IAAI,MAAc,KAAK,MAAM,MAAM,EACtDC,EAAM,UAAU,KAAK,MAAO,EAAGD,EAAW,MAAO,EAAG,KAAK,MAAM,MAAM,GAClEA,EAAW,MAAQ,KAEtB,KAAK,WACLA,EAAW,SAAWC,EAAM,cAAc,KAAK,SAAS,MAAM,EAC9DA,EAAM,UAAU,KAAK,SAAU,EAAGD,EAAW,SAAU,EAAG,KAAK,SAAS,MAAM,GAGlFA,EAAW,oBAAsB,KAAK,oBACtCA,EAAW,mBAAqB,KAAK,kBACzC,CACJ,EA1IsB,IAAAE,GAAfjC,GAAeiC,GACH,OAAS,ECrBf,MAAAC,WAA8BD,EAAiB,CAIxD,YAAYlC,EAAc,CACtB,MAAMA,CAAI,EAJd,KAAOoC,KAAAA,GAAe,YACtB,KAAA,MAAQ,IAAIC,EAAM,EAAG,EAAG,EAAG,CAAC,CAI5B,CAEA,MAAmB,CACf,MAAMC,EAAO,IAAIH,GAAsB,KAAK,IAAI,EAEhD,OAAK,KAAA,OAAOG,CAAI,EAChBA,EAAK,MAAM,aAAa,KAAK,KAAK,EAE3BA,CACX,CACJ,CCfa,MAAAC,WAA2BL,EAAgD,CAWpF,YAAYlC,EAAc,CACtB,MAAMA,CAAI,EAXd,KAAA,KAAOoC,GAAe,SAGtB,KAA2B,QAAA,KAK3B,KAAQ,MAAA,IAAIC,EAAM,MAAQ,MAAQ,MAAQ,CAAC,CAI3C,CAEA,MAAmB,CACf,MAAMC,EAAO,IAAIC,GAAmB,KAAK,IAAI,EAE7C,OAAA,KAAK,OAAOD,CAAI,EAChBA,EAAK,QAAU,KAAK,QACpBA,EAAK,MAAM,aAAa,KAAK,KAAK,EAE3BA,CACX,CACJ,CCvBa,MAAAE,WAAuBN,EAA+D,CAoC/F,YAAYlC,EAAcyC,EAAc,CACpC,MAAMzC,CAAI,EApCd,UAAOoC,GAAe,KAEtB,KAA+B,OAAA,KAS/B,KAA2B,UAAA,CAG3B,EAAA,KAAA,MAAQ,IAAIC,EAAM,EAAG,EAAG,EAAG,CAAC,EAG5B,KAAQ,MAAA,EAGR,YAAS,EAGT,KAAA,WAAa,EAIb,KAAA,MAAuB,CAAA,EAEvB,KAAQ,WAAoC,KAE5C,KAA4B,SAAA,KAE5B,KAAY,UAAA,IAAIA,EAAM,EAAG,EAAG,EAAG,CAAC,EAI5B,KAAK,KAAOI,CAChB,CAKA,eAAgB,CACZ,OAAO,KAAK,UAChB,CAGA,cAAcC,EAA4B,CACtC,KAAK,WAAaA,EACdA,IACA,KAAK,MAAQA,EAAW,MACxB,KAAK,SAAWA,EAAW,SAC3B,KAAK,oBAAsBA,EAAW,oBACtC,KAAK,UAAYA,EAAW,UAC5B,KAAK,UAAYA,EAAW,UAC5B,KAAK,WAAaA,EAAW,WAC7B,KAAK,oBAAsBA,EAAW,oBAE9C,CAEA,MAAmB,CACf,GAAI,KAAK,WAAY,OAAO,KAAK,cAAc,EAE/C,MAAMJ,EAAO,IAAIE,GAAe,KAAK,KAAM,KAAK,IAAI,EAEpD,OAAAF,EAAK,OAAS,KAAK,OACnBA,EAAK,MAAM,aAAa,KAAK,KAAK,EAElC,KAAK,OAAOA,CAAI,EAChBA,EAAK,UAAY,IAAI,aAAa,KAAK,UAAU,MAAM,EACvDL,EAAM,UAAU,KAAK,UAAW,EAAGK,EAAK,UAAW,EAAG,KAAK,UAAU,MAAM,EAC3EA,EAAK,UAAY,IAAI,MAAc,KAAK,UAAU,MAAM,EACxDL,EAAM,UAAU,KAAK,UAAW,EAAGK,EAAK,UAAW,EAAG,KAAK,UAAU,MAAM,EAC3EA,EAAK,WAAa,KAAK,WAEvBA,EAAK,SAAW,KAAK,UAAY,KAAO,KAAK,SAAS,KAAK,EAAI,KAG3D,KAAK,QACLA,EAAK,MAAQ,IAAI,MAAc,KAAK,MAAM,MAAM,EAChDL,EAAM,UAAU,KAAK,MAAO,EAAGK,EAAK,MAAO,EAAG,KAAK,MAAM,MAAM,GAEnEA,EAAK,MAAQ,KAAK,MAClBA,EAAK,OAAS,KAAK,OAEZA,CACX,CAEA,qBAAqBpC,EAAYE,EAAeC,EAAeF,EAAgCG,EAAgBC,EAAgB,CACvH,KAAK,UAAY,MAAM,KAAK,SAAS,MAAML,EAAM,IAAI,EACzD,MAAM,qBAAqBA,EAAME,EAAOC,EAAOF,EAAeG,EAAQC,CAAM,CAChF,CAGA,eAAgC,CAC5B,MAAM+B,EAAO,IAAIE,GAAe,KAAK,KAAM,KAAK,IAAI,EAEpD,OAAAF,EAAK,OAAS,KAAK,OACnBA,EAAK,MAAM,aAAa,KAAK,KAAK,EAClCA,EAAK,mBAAqB,KAAK,mBAC/BA,EAAK,cAAc,KAAK,WAAa,KAAK,WAAa,IAAI,EAGpDA,CACX,CACJ,OC7GaK,WAAuBT,EAAiB,CAiBjD,YAAYlC,EAAc,CACtB,MAAMA,CAAI,EAjBd,KAAA,KAAOoC,GAAe,KAGtB,KAAA,QAAyB,CAAA,EAGzB,KAAA,OAAS,GAIT,KAAgB,cAAA,GAIhB,WAAQ,IAAIC,EAAM,EAAG,EAAG,EAAG,CAAC,CAI5B,CAEA,MAAmB,CACf,MAAMC,EAAO,IAAIK,GAAe,KAAK,IAAI,EAEzC,OAAK,KAAA,OAAOL,CAAI,EAChBA,EAAK,QAAU,IAAI,MAAc,KAAK,QAAQ,MAAM,EACpDL,EAAM,UAAU,KAAK,QAAS,EAAGK,EAAK,QAAS,EAAG,KAAK,QAAQ,MAAM,EACrEA,EAAK,OAAS,OACdA,EAAK,cAAgB,KAAK,cAC1BA,EAAK,MAAM,aAAa,KAAK,KAAK,EAE3BA,CACX,CACJ,CChCa,MAAAM,WAAwBV,EAAiB,CAWlD,YAAYlC,EAAc,CACtB,MAAMA,CAAI,EAXd,KAAA,KAAOoC,GAAe,MAEtB,KAAA,EAAI,EACJ,KAAA,EAAI,EACJ,KAAW,SAAA,EAIX,KAAQ,MAAA,IAAIC,EAAM,IAAM,IAAM,EAAG,CAAC,CAIlC,CAEA,qBAAqBQ,EAAYC,EAAgB,CAC7C,MAAMlC,EAAMiC,EAAK,OAEjB,OAAAC,EAAM,EAAI,KAAK,EAAIlC,EAAI,EAAI,KAAK,EAAIA,EAAI,EAAIiC,EAAK,OACjDC,EAAM,EAAI,KAAK,EAAIlC,EAAI,EAAI,KAAK,EAAIA,EAAI,EAAIiC,EAAK,OAE1CC,CACX,CAEA,qBAAqBD,EAAY,CAC7B,MAAMjC,EAAMiC,EAAK,OACXE,EAAMC,EAAU,OAAO,KAAK,QAAQ,EACpCC,EAAMD,EAAU,OAAO,KAAK,QAAQ,EACpCnC,EAAIkC,EAAMnC,EAAI,EAAIqC,EAAMrC,EAAI,EAC5BE,EAAIiC,EAAMnC,EAAI,EAAIqC,EAAMrC,EAAI,EAElC,OAAO,KAAK,MAAME,EAAGD,CAAC,EAAImC,EAAU,MACxC,CAEA,MAAmB,CACf,MAAMV,EAAO,IAAIM,GAAgB,KAAK,IAAI,EAE1C,OAAAN,EAAK,EAAI,KAAK,EACdA,EAAK,EAAI,KAAK,EACdA,EAAK,SAAW,KAAK,SACrBA,EAAK,MAAM,aAAa,KAAK,KAAK,EAE3BA,CACX,CACJ,CC3CO,MAAMY,GAAN,cAA+BnD,EAA2D,CA2C7F,YAAYC,EAAcyC,EAAc,CACpC,MAAMzC,CAAI,EA3Cd,KAAOoC,KAAAA,GAAe,OAGtB,KAAI,EAAA,EAGJ,KAAI,EAAA,EAGJ,YAAS,EAGT,KAAA,OAAS,EAGT,KAAW,SAAA,EAGX,WAAQ,EAGR,KAAA,OAAS,EAGT,KAAA,MAAQ,IAAIC,EAAM,EAAG,EAAG,EAAG,CAAC,EAK5B,KAAQ,eAAsB,KAC9B,YAA+B,KAC/B,KAAA,SAA4B,KAK5B,KAASJ,OAAAA,EAAM,cAAc,CAAC,EAE9B,KAAMA,IAAAA,EAAM,cAAc,CAAC,EAE3B,KAAY,UAAA,IAAII,EAAM,EAAG,EAAG,EAAG,CAAC,EAI5B,KAAK,KAAOI,CAChB,CAGA,cAAqB,CACjB,GAAI,CAAC,KAAK,OAAQ,MAAM,IAAI,MAAM,iBAAiB,EACnD,MAAMU,EAAS,KAAK,OACdC,EAAgB,KAAK,MAAQ,KAAK,OAAO,cAAiB,KAAK,OAC/DC,EAAgB,KAAK,OAAS,KAAK,OAAO,eAAkB,KAAK,OACjEC,EAAU,CAAC,KAAK,MAAQ,EAAK,KAAK,OAAS,KAAK,OAAO,QAAUF,EACjEG,EAAU,CAAC,KAAK,OAAS,EAAK,KAAK,OAAS,KAAK,OAAO,QAAUF,EAClEG,EAAUF,EAAS,KAAK,OAAO,MAAQF,EACvCK,EAAUF,EAAS,KAAK,OAAO,OAASF,EACxCK,EAAW,KAAK,SAAW,KAAK,GAAM,IACtCX,EAAM,KAAK,IAAIW,CAAO,EACtBT,EAAM,KAAK,IAAIS,CAAO,EACtB7C,EAAI,KAAK,EACTC,EAAI,KAAK,EACT6C,EAAYL,EAASP,EAAMlC,EAC3B+C,EAAYN,EAASL,EACrBY,EAAYN,EAASR,EAAMjC,EAC3BgD,EAAYP,EAASN,EACrBc,EAAaP,EAAUT,EAAMlC,EAC7BmD,EAAaR,EAAUP,EACvBgB,EAAaR,EAAUV,EAAMjC,EAC7BoD,EAAaT,EAAUR,EACvB3C,EAAS,KAAK,OAEpBA,EAAO,CAAC,EAAIqD,EAAYG,EACxBxD,EAAO,CAAC,EAAIuD,EAAYD,EACxBtD,EAAO,CAAC,EAAIqD,EAAYO,EACxB5D,EAAO,CAAC,EAAI2D,EAAaL,EACzBtD,EAAO,CAAC,EAAIyD,EAAaG,EACzB5D,EAAO,CAAC,EAAI2D,EAAaD,EACzB1D,EAAO,CAAC,EAAIyD,EAAaD,EACzBxD,EAAO,CAAC,EAAIuD,EAAYG,EAExB,MAAMG,EAAM,KAAK,IAEbhB,EAAO,SAAW,IAClBgB,EAAI,CAAC,EAAIhB,EAAO,EAChBgB,EAAI,CAAC,EAAIhB,EAAO,GAChBgB,EAAI,CAAC,EAAIhB,EAAO,EAChBgB,EAAI,CAAC,EAAIhB,EAAO,EAChBgB,EAAI,CAAC,EAAIhB,EAAO,GAChBgB,EAAI,CAAC,EAAIhB,EAAO,EAChBgB,EAAI,CAAC,EAAIhB,EAAO,GAChBgB,EAAI,CAAC,EAAIhB,EAAO,KAEhBgB,EAAI,CAAC,EAAIhB,EAAO,EAChBgB,EAAI,CAAC,EAAIhB,EAAO,GAChBgB,EAAI,CAAC,EAAIhB,EAAO,EAChBgB,EAAI,CAAC,EAAIhB,EAAO,EAChBgB,EAAI,CAAC,EAAIhB,EAAO,GAChBgB,EAAI,CAAC,EAAIhB,EAAO,EAChBgB,EAAI,CAAC,EAAIhB,EAAO,GAChBgB,EAAI,CAAC,EAAIhB,EAAO,GAExB,CAUA,qBAAqBjD,EAAYC,EAAgCG,EAAgBC,EAAgB,CACzF,KAAK,UAAY,MAAM,KAAK,SAAS,MAAML,EAAM,IAAI,EAEzD,MAAM2C,EAAO3C,EAAK,KACZkE,EAAe,KAAK,OACpBxD,EAAMiC,EAAK,OACXhC,EAAID,EAAI,GACRE,EAAIF,EAAI,GACRG,EAAIH,EAAI,EACRI,EAAIJ,EAAI,EACRK,EAAIL,EAAI,EACRM,EAAIN,EAAI,EACd,IAAIyD,EAAU,EACVC,EAAU,EAEdD,EAAUD,EAAa,CAAC,EACxBE,EAAUF,EAAa,CAAC,EACxBjE,EAAcG,CAAM,EAAI+D,EAAUtD,EAAIuD,EAAUtD,EAAIH,EACpDV,EAAcG,EAAS,CAAC,EAAI+D,EAAUpD,EAAIqD,EAAUpD,EAAIJ,EACxDR,GAAUC,EAEV8D,EAAUD,EAAa,CAAC,EACxBE,EAAUF,EAAa,CAAC,EACxBjE,EAAcG,CAAM,EAAI+D,EAAUtD,EAAIuD,EAAUtD,EAAIH,EACpDV,EAAcG,EAAS,CAAC,EAAI+D,EAAUpD,EAAIqD,EAAUpD,EAAIJ,EACxDR,GAAUC,EAEV8D,EAAUD,EAAa,CAAC,EACxBE,EAAUF,EAAa,CAAC,EACxBjE,EAAcG,CAAM,EAAI+D,EAAUtD,EAAIuD,EAAUtD,EAAIH,EACpDV,EAAcG,EAAS,CAAC,EAAI+D,EAAUpD,EAAIqD,EAAUpD,EAAIJ,EACxDR,GAAUC,EAEV8D,EAAUD,EAAa,CAAC,EACxBE,EAAUF,EAAa,CAAC,EACxBjE,EAAcG,CAAM,EAAI+D,EAAUtD,EAAIuD,EAAUtD,EAAIH,EACpDV,EAAcG,EAAS,CAAC,EAAI+D,EAAUpD,EAAIqD,EAAUpD,EAAIJ,CAC5D,CAEA,MAAmB,CACf,MAAMwB,EAAO,IAAIY,GAAiB,KAAK,KAAM,KAAK,IAAI,EAEtD,OAAAZ,EAAK,OAAS,KAAK,OACnBA,EAAK,eAAiB,KAAK,eAC3BA,EAAK,EAAI,KAAK,EACdA,EAAK,EAAI,KAAK,EACdA,EAAK,OAAS,KAAK,OACnBA,EAAK,OAAS,KAAK,OACnBA,EAAK,SAAW,KAAK,SACrBA,EAAK,MAAQ,KAAK,MAClBA,EAAK,OAAS,KAAK,OACnBL,EAAM,UAAU,KAAK,IAAK,EAAGK,EAAK,IAAK,EAAG,CAAC,EAC3CL,EAAM,UAAU,KAAK,OAAQ,EAAGK,EAAK,OAAQ,EAAG,CAAC,EACjDA,EAAK,MAAM,aAAa,KAAK,KAAK,EAClCA,EAAK,SAAW,KAAK,UAAY,KAAO,KAAK,SAAS,OAAS,KAExDA,CACX,CAqCJ,EA/MO,IAAMiC,EAANrB,GAAMqB,EA4KF,GAAK,EA5KHA,EA6KF,GAAK,EA7KHA,EA8KF,IAAM,EA9KJA,EA+KF,IAAM,EA/KJA,EAgLF,IAAM,EAhLJA,EAiLF,IAAM,EAjLJA,EAkLF,GAAK,EAlLHA,EAmLF,GAAK,EAnLHA,EAqLF,GAAK,EArLHA,EAsLF,GAAK,EAtLHA,EAuLF,IAAM,GAvLJA,EAwLF,IAAM,GAxLJA,EAyLF,IAAM,GAzLJA,EA0LF,IAAM,GA1LJA,EA2LF,GAAK,GA3LHA,EA4LF,GAAK,GA5LHA,EA8LF,GAAK,GA9LHA,EA+LF,GAAK,GA/LHA,EAgMF,IAAM,GAhMJA,EAiMF,IAAM,GAjMJA,EAkMF,IAAM,GAlMJA,EAmMF,IAAM,GAnMJA,EAoMF,GAAK,GApMHA,EAqMF,GAAK,GArMHA,EAuMF,GAAK,GAvMHA,EAwMF,GAAK,GAxMHA,EAyMF,IAAM,GAzMJA,EA0MF,IAAM,GA1MJA,EA2MF,IAAM,GA3MJA,EA4MF,IAAM,GA5MJA,EA6MF,GAAK,GA7MHA,EA8MF,GAAK,GChNT,MAAMC,GAAN,KAAoC,CAUvC,YAAYnE,EAAe,CAP3B,KAAKmE,GAAAA,GAAS,SAEd,KAAA,MAAQ,EACR,KAAS,OAAA,EAET,gBAAa,EAGT,KAAK,QAAU,IAAI,MAAqBnE,CAAK,CACjD,CAEA,MAAiB,CACb,MAAMiC,EAAO,IAAIkC,GAAS,KAAK,QAAQ,MAAM,EAE7C,OAAAvC,EAAM,UAAU,KAAK,QAAS,EAAGK,EAAK,QAAS,EAAG,KAAK,QAAQ,MAAM,EACrEA,EAAK,MAAQ,KAAK,MAClBA,EAAK,OAAS,KAAK,OACnBA,EAAK,WAAa,KAAK,WAEhBA,CACX,CAEA,MAAMpC,EAAY8B,EAA+B,CAC7C,IAAIyC,EAAQvE,EAAK,cAEbuE,GAAS,KAAIA,EAAQ,KAAK,YAC1BA,GAAS,KAAK,QAAQ,SAAQA,EAAQ,KAAK,QAAQ,OAAS,GAChE,MAAMtB,EAAS,KAAK,QAAQsB,CAAK,EAE7BzC,EAAW,QAAUmB,IACrBnB,EAAW,OAASmB,EAG5B,CAEA,QAAQuB,EAAkBD,EAAuB,CAC7C,IAAIE,EAASD,EACb,MAAME,GAAS,KAAK,MAAQH,GAAO,SAAA,EAEnC,QAASjD,EAAI,KAAK,OAASoD,EAAM,OAAQpD,EAAI,EAAGA,IAAKmD,GAAU,IAC/D,OAAAA,GAAUC,EAEHD,CACX,CAEA,OAAe,QAAiB,CAC5B,OAAOH,GAAS,SACpB,CACJ,EAnDa,IAAAK,GAANL,GAAMK,GACM,QAAU,EAuDjB,IAAAC,IAAAA,IACRA,EAAAC,EAAA,KAAO,GAAP,OACAD,EAAAA,EAAA,KAAO,CAAP,EAAA,OACAA,IAAA,KAAO,CAAA,EAAP,OACAA,EAAAC,EAAA,SAAW,GAAX,WACAD,EAAAA,EAAA,YAAc,CAAd,EAAA,cACAA,IAAA,YAAc,CAAA,EAAd,cACAA,EAAAC,EAAA,gBAAkB,GAAlB,kBAPQD,IAAAA,QAaC,MAAAE,GAAqB,CAC9B,EACA,EACA,EACA,EACA,EACA,EACA,CACJ,ECrEO,MAAMC,EAA0C,CASnD,YAAYjF,EAAckF,EAA4BC,EAAkB,CACpE,GAPJ,KAA6B,UAAA,CAAA,EAC7B,KAAA,YAAyB,IAAIC,GAMrB,CAACpF,EAAM,MAAM,IAAI,MAAM,sBAAsB,EACjD,KAAK,KAAOA,EACZ,KAAK,aAAakF,CAAS,EAC3B,KAAK,SAAWC,CACpB,CAEA,aAAaD,EAA4B,CACrC,GAAI,CAACA,EAAW,MAAM,IAAI,MAAM,2BAA2B,EAC3D,KAAK,UAAYA,EACjB,KAAK,YAAY,MAAM,EACvB,QAAS1D,EAAI,EAAGA,EAAI0D,EAAU,OAAQ1D,IAAK,KAAK,YAAY,OAAO0D,EAAU1D,CAAC,EAAE,eAAA,CAAgB,CACpG,CAEA,YAAY6D,EAAwB,CAChC,QAAS7D,EAAI,EAAGA,EAAI6D,EAAI,OAAQ7D,IAAK,GAAI,KAAK,YAAY,SAAS6D,EAAI7D,CAAC,CAAC,EAAG,MAAO,GAEnF,MAAO,EACX,CAOA,MAAMhB,EAAoB8E,EAAkBC,EAAcC,EAAeC,EAAsBC,EAAeC,EAAiBC,EAAyB,CACpJ,GAAI,CAACpF,EAAU,MAAM,IAAI,MAAM,0BAA0B,EAErDgF,GAAQ,KAAK,UAAY,IACzBD,GAAQ,KAAK,SACTD,EAAW,IAAGA,GAAY,KAAK,WAGvC,MAAMJ,EAAY,KAAK,UAEvB,QAAS1D,EAAI,EAAGC,EAAIyD,EAAU,OAAQ1D,EAAIC,EAAGD,IAAK0D,EAAU1D,CAAC,EAAE,MAAMhB,EAAU8E,EAAUC,EAAME,EAAQC,EAAOC,EAAOC,CAAS,CAClI,CACJ,CAEA,MAAMC,EAAW,CACb,OAAQ,EACR,EAAG,EACH,EAAG,EACH,OAAQ,EACR,OAAQ,EACR,OAAQ,EACR,OAAQ,EAER,IAAK,EACL,MAAO,EACP,KAAM,EAEN,WAAY,GACZ,OAAQ,GAER,MAAO,GACP,UAAW,GAEX,aAAc,GACd,oBAAqB,GAErB,uBAAwB,GACxB,sBAAuB,GACvB,kBAAmB,GAEnB,SAAU,EACd,QAKsBC,CAA8B,CAIhD,YAAYC,EAAoBC,EAAuB,CACnD,KAAK,YAAcA,EACnB,KAAK,OAAS/D,EAAM,cAAc8D,EAAa,KAAK,gBAAiB,CAAA,CACzE,CAEA,gBAAiB,CACb,OAAO,KAAK,WAChB,CAEA,iBAA0B,CACtB,MACJ,EAAA,CAEA,eAAgB,CACZ,OAAO,KAAK,OAAO,OAAS,KAAK,gBACrC,CAAA,CAEA,aAAsB,CAClB,OAAO,KAAK,OAAO,KAAK,OAAO,OAAS,KAAK,gBAAiB,CAAA,CAClE,CAIA,OAAO,QAAQE,EAAyBV,EAAc,CAClD,MAAM9D,EAAIwE,EAAO,OAEjB,QAASzE,EAAI,EAAGA,EAAIC,EAAGD,IAAK,GAAIyE,EAAOzE,CAAC,EAAI+D,EAAM,OAAO/D,EAAI,EAE7D,OAAOC,EAAI,CACf,CAEA,OAAO,OAAOwE,EAAyBV,EAAcW,EAAc,CAC/D,MAAMzE,EAAIwE,EAAO,OAEjB,QAASzE,EAAI0E,EAAM1E,EAAIC,EAAGD,GAAK0E,EAAM,GAAID,EAAOzE,CAAC,EAAI+D,EAAM,OAAO/D,EAAI0E,EAEtE,OAAOzE,EAAIyE,CACf,CACJ,CAqBsB,MAAAC,WAAsBL,CAAS,CAGjD,YAAYC,EAAoBK,EAAqBJ,EAAuB,CACxE,MAAMD,EAAYC,CAAW,EAC7B,KAAK,OAAS/D,EAAM,cAAc8D,EAAaK,EAAc,EAAmB,EAChF,KAAK,OAAOL,EAAa,CAAC,EAAI,CAClC,CAGA,UAAUnB,EAAe,CACrB,KAAK,OAAOA,CAAK,EAAI,CACzB,CAGA,WAAWA,EAAe,CACtB,KAAK,OAAOA,CAAK,EAAI,CACzB,CAIA,OAAOwB,EAAqB,CACxB,MAAMC,EAAO,KAAK,cAAc,EAAID,EAAc,GAElD,GAAI,KAAK,OAAO,OAASC,EAAM,CAC3B,MAAMC,EAAYrE,EAAM,cAAcoE,CAAI,EAE1CpE,EAAM,UAAU,KAAK,OAAQ,EAAGqE,EAAW,EAAGD,CAAI,EAClD,KAAK,OAASC,CAClB,CACJ,CAgBA,UAAUC,EAAgB3B,EAAe4B,EAAeC,EAAeC,EAAgBC,EAAaC,EAAaC,EAAaC,EAAaC,EAAeC,EAAgB,CACtK,MAAMC,EAAS,KAAK,OACpB,IAAIzF,EAAI,KAAK,gBAAkB+E,EAAS,GAEpCC,GAAS,IAAGS,EAAOrC,CAAK,EAAI,EAAgBpD,GAChD,MAAM0F,GAAQT,EAAQE,EAAM,EAAIE,GAAO,IACjCM,GAAQT,EAASE,EAAM,EAAIE,GAAO,IAClCM,IAAST,EAAME,GAAO,EAAIJ,EAAQM,GAAS,KAC3CM,IAAST,EAAME,GAAO,EAAIJ,EAASM,GAAU,KACnD,IAAIM,EAAMJ,EAAO,EAAIE,EACjBG,EAAMJ,EAAO,EAAIE,EACjBG,GAAMb,EAAMF,GAAS,GAAMS,EAAOE,EAAO,UACzCK,GAAMb,EAAMF,GAAU,GAAMS,EAAOE,EAAO,UAC1CxG,EAAI4F,EAAQe,EACZ1G,EAAI4F,EAASe,EAEjB,QAAShG,EAAID,EAAI,GAAqBA,EAAIC,EAAGD,GAAK,EAC9CyF,EAAOzF,CAAC,EAAIX,EACZoG,EAAOzF,EAAI,CAAC,EAAIV,EAChB0G,GAAMF,EACNG,GAAMF,EACND,GAAOF,EACPG,GAAOF,EACPxG,GAAK2G,EACL1G,GAAK2G,CAEb,CAMA,eAAelC,EAAcmC,EAAoBC,EAAqBnG,EAAW,CAC7E,MAAMyF,EAAS,KAAK,OAEpB,GAAIA,EAAOzF,CAAC,EAAI+D,EAAM,CAClB,MAAM1E,EAAI,KAAK,OAAO6G,CAAU,EAC1B5G,EAAI,KAAK,OAAO4G,EAAaC,CAAW,EAE9C,OAAO7G,GAAMyE,EAAO1E,IAAMoG,EAAOzF,CAAC,EAAIX,IAAOoG,EAAOzF,EAAI,CAAC,EAAIV,EACjE,CACA,MAAMW,EAAID,EAAI,GAEd,IAAKA,GAAK,EAAGA,EAAIC,EAAGD,GAAK,EACrB,GAAIyF,EAAOzF,CAAC,GAAK+D,EAAM,CACnB,MAAM1E,EAAIoG,EAAOzF,EAAI,CAAC,EAChBV,EAAImG,EAAOzF,EAAI,CAAC,EAEtB,OAAOV,GAAMyE,EAAO1E,IAAMoG,EAAOzF,CAAC,EAAIX,IAAOoG,EAAOzF,EAAI,CAAC,EAAIV,EACjE,CAEJ4G,GAAc,KAAK,gBAAgB,EACnC,MAAM7G,EAAIoG,EAAOxF,EAAI,CAAC,EAChBX,EAAImG,EAAOxF,EAAI,CAAC,EAEtB,OAAOX,GAAMyE,EAAO1E,IAAM,KAAK,OAAO6G,CAAU,EAAI7G,IAAO,KAAK,OAAO6G,EAAaC,CAAW,EAAI7G,EACvG,CACJ,CAIsB,MAAA8G,WAAuBzB,EAAc,CACvD,YAAYJ,EAAoBK,EAAqByB,EAAoB,CACrE,MAAM9B,EAAYK,EAAa,CAACyB,CAAU,CAAC,CAC/C,CAEA,iBAAkB,CACd,MAAO,EACX,CAKA,SAASjD,EAAeW,EAAciB,EAAe,CACjD5B,IAAU,EACV,KAAK,OAAOA,CAAK,EAAIW,EACrB,KAAK,OAAOX,EAAQ,CAAY,EAAI4B,CACxC,CAGA,cAAcjB,EAAc,CACxB,MAAMU,EAAS,KAAK,OACpB,IAAIzE,EAAIyE,EAAO,OAAS,EAExB,QAAS6B,EAAK,EAAGA,GAAMtG,EAAGsG,GAAM,EAC5B,GAAI7B,EAAO6B,CAAE,EAAIvC,EAAM,CACnB/D,EAAIsG,EAAK,EACT,KACJ,CAGJ,MAAMC,EAAY,KAAK,OAAOvG,GAAK,CAAC,EAEpC,OAAQuG,EACJ,CAAA,IAAK,GACD,MAAMC,EAAS/B,EAAOzE,CAAC,EACjBgF,EAAQP,EAAOzE,EAAI,CAAY,EAErC,OAAOgF,GAAUjB,EAAOyC,IAAW/B,EAAOzE,EAAI,CAAc,EAAIwG,IAAY/B,EAAOzE,EAAI,EAAiB,CAAY,EAAIgF,GAC5H,IAAK,GACD,OAAOP,EAAOzE,EAAI,CAAY,CACtC,CAEA,OAAO,KAAK,eAAe+D,EAAM/D,EAAG,EAAcuG,EAAY,CAAa,CAC/E,CACJ,OAKsBE,WAAuB9B,EAAc,CAGvD,YAAYJ,EAAoBK,EAAqB8B,EAAqBC,EAAqB,CAC3F,MAAMpC,EAAYK,EAAa,CAAC8B,EAAaC,CAAW,CAAC,CAC7D,CAEA,iBAAkB,CACd,MAAO,EACX,CAKA,SAASvD,EAAeW,EAAcmB,EAAgBM,EAAgB,CAClEpC,GAAS,EACT,KAAK,OAAOA,CAAK,EAAIW,EACrB,KAAK,OAAOX,EAAQ,CAAa,EAAI8B,EACrC,KAAK,OAAO9B,EAAQ,CAAa,EAAIoC,CACzC,CACJ,CAKO,MAAMoB,WAAuBR,EAAuC,CAGvE,YAAY7B,EAAoBK,EAAqBiC,EAAmB,CACpE,MAAMtC,EAAYK,EAAa,GAAGP,EAAS,UAAUwC,GAAW,EAHpE,KAAA,UAAY,EAIR,KAAK,UAAYA,CACrB,CAEA,MAAM7H,EAAoB8E,EAAkBC,EAAcE,EAA6BC,EAAeC,EAAiBC,EAAyB,CAC5I,MAAM/C,EAAOrC,EAAS,MAAM,KAAK,SAAS,EAE1C,GAAI,CAACqC,EAAK,OAAQ,OAElB,MAAMoD,EAAS,KAAK,OAEpB,GAAIV,EAAOU,EAAO,CAAC,EAAG,CAClB,OAAQN,EAAO,CACX,KAAK2C,EAAS,MACVzF,EAAK,SAAWA,EAAK,KAAK,SAE1B,OACJ,KAAKyF,EAAS,MACVzF,EAAK,WAAaA,EAAK,KAAK,SAAWA,EAAK,UAAY6C,CAChE,CAEA,MACJ,CAEA,IAAI6C,EAAI,KAAK,cAAchD,CAAI,EAE/B,OAAQI,EAAO,CACX,KAAK2C,EAAS,MACVzF,EAAK,SAAWA,EAAK,KAAK,SAAW0F,EAAI7C,EACzC,MACJ,KAAK4C,EAAS,MACd,KAAKA,EAAS,QACVC,GAAK1F,EAAK,KAAK,SAAWA,EAAK,SACnC,KAAKyF,EAAS,IACVzF,EAAK,UAAY0F,EAAI7C,CAC7B,CACJ,CACJ,CAKa,MAAA8C,WAA0BP,EAAuC,CAG1E,YAAYlC,EAAoBK,EAAqBiC,EAAmB,CACpE,MAAMtC,EAAYK,EAAa,GAAGP,EAAS,KAAKwC,IAAa,GAAGxC,EAAS,KAAKwC,GAAW,EAH7F,KAAY,UAAA,EAIR,KAAK,UAAYA,CACrB,CAEA,MAAM7H,EAAoB8E,EAAkBC,EAAcE,EAAsBC,EAAeC,EAAiBC,EAAyB,CACrI,MAAM/C,EAAOrC,EAAS,MAAM,KAAK,SAAS,EAE1C,GAAI,CAACqC,EAAK,OAAQ,OAElB,MAAMoD,EAAS,KAAK,OAEpB,GAAIV,EAAOU,EAAO,CAAC,EAAG,CAClB,OAAQN,EAAO,CACX,KAAK2C,EAAS,MACVzF,EAAK,EAAIA,EAAK,KAAK,EACnBA,EAAK,EAAIA,EAAK,KAAK,EAEnB,OACJ,KAAKyF,EAAS,MACVzF,EAAK,IAAMA,EAAK,KAAK,EAAIA,EAAK,GAAK6C,EACnC7C,EAAK,IAAMA,EAAK,KAAK,EAAIA,EAAK,GAAK6C,CAC3C,CAEA,MACJ,CAEA,IAAI7E,EAAI,EACJC,EAAI,EACR,MAAMU,EAAIsE,EAAS,OAAOG,EAAQV,EAAM,CAAc,EAChDwC,EAAY,KAAK,OAAOvG,EAAI,CAAc,EAEhD,OAAQuG,EAAW,CACf,IAAK,GACD,MAAMC,EAAS/B,EAAOzE,CAAC,EAEvBX,EAAIoF,EAAOzE,EAAI,CAAa,EAC5BV,EAAImF,EAAOzE,EAAI,CAAa,EAC5B,MAAMuD,GAAKQ,EAAOyC,IAAW/B,EAAOzE,EAAI,CAAc,EAAIwG,GAE1DnH,IAAMoF,EAAOzE,EAAI,EAAiB,CAAa,EAAIX,GAAKkE,EACxDjE,IAAMmF,EAAOzE,EAAI,EAAiB,CAAa,EAAIV,GAAKiE,EACxD,MACJ,IAAK,GACDlE,EAAIoF,EAAOzE,EAAI,CAAa,EAC5BV,EAAImF,EAAOzE,EAAI,CAAa,EAC5B,MACJ,QACIX,EAAI,KAAK,eAAe0E,EAAM/D,EAAG,EAAeuG,EAAY,CAAa,EACzEjH,EAAI,KAAK,eAAeyE,EAAM/D,EAAG,EAAeuG,EAAY,GAAsB,CAAa,CACvG,CAEA,OAAQpC,EAAO,CACX,KAAK2C,EAAS,MACVzF,EAAK,EAAIA,EAAK,KAAK,EAAIhC,EAAI6E,EAC3B7C,EAAK,EAAIA,EAAK,KAAK,EAAI/B,EAAI4E,EAC3B,MACJ,KAAK4C,EAAS,MACd,KAAKA,EAAS,QACVzF,EAAK,IAAMA,EAAK,KAAK,EAAIhC,EAAIgC,EAAK,GAAK6C,EACvC7C,EAAK,IAAMA,EAAK,KAAK,EAAI/B,EAAI+B,EAAK,GAAK6C,EACvC,MACJ,KAAK4C,EAAS,IACVzF,EAAK,GAAKhC,EAAI6E,EACd7C,EAAK,GAAK/B,EAAI4E,CACtB,CACJ,CACJ,CAKa,MAAA+C,WAA2Bb,EAAuC,CAG3E,YAAY7B,EAAoBK,EAAqBiC,EAAmB,CACpE,MAAMtC,EAAYK,EAAa,GAAGP,EAAS,KAAKwC,GAAW,EAH/D,KAAY,UAAA,EAIR,KAAK,UAAYA,CACrB,CAEA,MAAM7H,EAAoB8E,EAAkBC,EAAcE,EAAsBC,EAAeC,EAAiBC,EAAyB,CACrI,MAAM/C,EAAOrC,EAAS,MAAM,KAAK,SAAS,EAE1C,GAAI,CAACqC,EAAK,OAAQ,OAElB,MAAMoD,EAAS,KAAK,OAEpB,GAAIV,EAAOU,EAAO,CAAC,EAAG,CAClB,OAAQN,EACJ,CAAA,KAAK2C,EAAS,MACVzF,EAAK,EAAIA,EAAK,KAAK,EAEnB,OACJ,KAAKyF,EAAS,MACVzF,EAAK,IAAMA,EAAK,KAAK,EAAIA,EAAK,GAAK6C,CAC3C,CAEA,MACJ,CAEA,MAAM7E,EAAI,KAAK,cAAc0E,CAAI,EAEjC,OAAQI,EAAAA,CACJ,KAAK2C,EAAS,MACVzF,EAAK,EAAIA,EAAK,KAAK,EAAIhC,EAAI6E,EAC3B,MACJ,KAAK4C,EAAS,MACd,KAAKA,EAAS,QACVzF,EAAK,IAAMA,EAAK,KAAK,EAAIhC,EAAIgC,EAAK,GAAK6C,EACvC,MACJ,KAAK4C,EAAS,IACVzF,EAAK,GAAKhC,EAAI6E,CACtB,CACJ,CACJ,CAKa,MAAAgD,WAA2Bd,EAAuC,CAG3E,YAAY7B,EAAoBK,EAAqBiC,EAAmB,CACpE,MAAMtC,EAAYK,EAAa,GAAGP,EAAS,KAAKwC,GAAW,EAH/D,KAAA,UAAY,EAIR,KAAK,UAAYA,CACrB,CAEA,MAAM7H,EAAoB8E,EAAkBC,EAAcE,EAAsBC,EAAeC,EAAiBC,EAAyB,CACrI,MAAM/C,EAAOrC,EAAS,MAAM,KAAK,SAAS,EAE1C,GAAI,CAACqC,EAAK,OAAQ,OAElB,MAAMoD,EAAS,KAAK,OAEpB,GAAIV,EAAOU,EAAO,CAAC,EAAG,CAClB,OAAQN,EAAAA,CACJ,KAAK2C,EAAS,MACVzF,EAAK,EAAIA,EAAK,KAAK,EAEnB,OACJ,KAAKyF,EAAS,MACVzF,EAAK,IAAMA,EAAK,KAAK,EAAIA,EAAK,GAAK6C,CAC3C,CAEA,MACJ,CAEA,MAAM5E,EAAI,KAAK,cAAcyE,CAAI,EAEjC,OAAQI,EAAO,CACX,KAAK2C,EAAS,MACVzF,EAAK,EAAIA,EAAK,KAAK,EAAI/B,EAAI4E,EAC3B,MACJ,KAAK4C,EAAS,MACd,KAAKA,EAAS,QACVzF,EAAK,IAAMA,EAAK,KAAK,EAAI/B,EAAI+B,EAAK,GAAK6C,EACvC,MACJ,KAAK4C,EAAS,IACVzF,EAAK,GAAK/B,EAAI4E,CACtB,CACJ,CACJ,CAKO,MAAMiD,WAAsBV,EAAuC,CAGtE,YAAYlC,EAAoBK,EAAqBiC,EAAmB,CACpE,MAAMtC,EAAYK,EAAa,GAAGP,EAAS,UAAUwC,IAAa,GAAGxC,EAAS,UAAUwC,GAAW,EAHvG,KAAY,UAAA,EAIR,KAAK,UAAYA,CACrB,CAEA,MAAM7H,EAAoB8E,EAAkBC,EAAcE,EAAsBC,EAAeC,EAAiBC,EAAyB,CACrI,MAAM/C,EAAOrC,EAAS,MAAM,KAAK,SAAS,EAE1C,GAAI,CAACqC,EAAK,OAAQ,OAElB,MAAMoD,EAAS,KAAK,OAEpB,GAAIV,EAAOU,EAAO,CAAC,EAAG,CAClB,OAAQN,EACJ,CAAA,KAAK2C,EAAS,MACVzF,EAAK,OAASA,EAAK,KAAK,OACxBA,EAAK,OAASA,EAAK,KAAK,OAExB,OACJ,KAAKyF,EAAS,MACVzF,EAAK,SAAWA,EAAK,KAAK,OAASA,EAAK,QAAU6C,EAClD7C,EAAK,SAAWA,EAAK,KAAK,OAASA,EAAK,QAAU6C,CAC1D,CAEA,MACJ,CAEA,IAAI7E,EACAC,EACJ,MAAMU,EAAIsE,EAAS,OAAOG,EAAQV,EAAM,CAAc,EAChDwC,EAAY,KAAK,OAAOvG,EAAI,CAAc,EAEhD,OAAQuG,EAAW,CACf,IAAK,GACD,MAAMC,EAAS/B,EAAOzE,CAAC,EAEvBX,EAAIoF,EAAOzE,EAAI,CAAa,EAC5BV,EAAImF,EAAOzE,EAAI,CAAa,EAC5B,MAAMuD,GAAKQ,EAAOyC,IAAW/B,EAAOzE,EAAI,CAAc,EAAIwG,GAE1DnH,IAAMoF,EAAOzE,EAAI,EAAiB,CAAa,EAAIX,GAAKkE,EACxDjE,IAAMmF,EAAOzE,EAAI,EAAiB,CAAa,EAAIV,GAAKiE,EACxD,MACJ,IACIlE,GAAAA,EAAIoF,EAAOzE,EAAI,CAAa,EAC5BV,EAAImF,EAAOzE,EAAI,CAAa,EAC5B,MACJ,QACIX,EAAI,KAAK,eAAe0E,EAAM/D,EAAG,EAAeuG,EAAY,CAAa,EACzEjH,EAAI,KAAK,eAAeyE,EAAM/D,EAAG,EAAeuG,EAAY,GAAsB,CAAa,CACvG,CAIA,GAHAlH,GAAKgC,EAAK,KAAK,OACf/B,GAAK+B,EAAK,KAAK,OAEX6C,GAAS,EACLC,GAAS2C,EAAS,KAClBzF,EAAK,QAAUhC,EAAIgC,EAAK,KAAK,OAC7BA,EAAK,QAAU/B,EAAI+B,EAAK,KAAK,SAE7BA,EAAK,OAAShC,EACdgC,EAAK,OAAS/B,OAEf,CACH,IAAI8H,EAAK,EACLC,EAAK,EAET,GAAIjD,GAAakD,GAAa,OAC1B,OAAQnD,EAAAA,CACJ,KAAK2C,EAAS,MACVM,EAAK/F,EAAK,KAAK,OACfgG,EAAKhG,EAAK,KAAK,OACfA,EAAK,OAAS+F,GAAM,KAAK,IAAI/H,CAAC,EAAImC,EAAU,OAAO4F,CAAE,EAAIA,GAAMlD,EAC/D7C,EAAK,OAASgG,GAAM,KAAK,IAAI/H,CAAC,EAAIkC,EAAU,OAAO6F,CAAE,EAAIA,GAAMnD,EAC/D,MACJ,KAAK4C,EAAS,MACd,KAAKA,EAAS,QACVM,EAAK/F,EAAK,OACVgG,EAAKhG,EAAK,OACVA,EAAK,OAAS+F,GAAM,KAAK,IAAI/H,CAAC,EAAImC,EAAU,OAAO4F,CAAE,EAAIA,GAAMlD,EAC/D7C,EAAK,OAASgG,GAAM,KAAK,IAAI/H,CAAC,EAAIkC,EAAU,OAAO6F,CAAE,EAAIA,GAAMnD,EAC/D,MACJ,KAAK4C,EAAS,IACVzF,EAAK,SAAWhC,EAAIgC,EAAK,KAAK,QAAU6C,EACxC7C,EAAK,SAAW/B,EAAI+B,EAAK,KAAK,QAAU6C,CAChD,aAEQC,GACJ,KAAK2C,EAAS,MACVM,EAAK,KAAK,IAAI/F,EAAK,KAAK,MAAM,EAAIG,EAAU,OAAOnC,CAAC,EACpDgI,EAAK,KAAK,IAAIhG,EAAK,KAAK,MAAM,EAAIG,EAAU,OAAOlC,CAAC,EACpD+B,EAAK,OAAS+F,GAAM/H,EAAI+H,GAAMlD,EAC9B7C,EAAK,OAASgG,GAAM/H,EAAI+H,GAAMnD,EAC9B,MACJ,KAAK4C,EAAS,MACd,KAAKA,EAAS,QACVM,EAAK,KAAK,IAAI/F,EAAK,MAAM,EAAIG,EAAU,OAAOnC,CAAC,EAC/CgI,EAAK,KAAK,IAAIhG,EAAK,MAAM,EAAIG,EAAU,OAAOlC,CAAC,EAC/C+B,EAAK,OAAS+F,GAAM/H,EAAI+H,GAAMlD,EAC9B7C,EAAK,OAASgG,GAAM/H,EAAI+H,GAAMnD,EAC9B,MACJ,KAAK4C,EAAS,IACVzF,EAAK,SAAWhC,EAAIgC,EAAK,KAAK,QAAU6C,EACxC7C,EAAK,SAAW/B,EAAI+B,EAAK,KAAK,QAAU6C,CAChD,CAER,CACJ,CACJ,CAKO,MAAMqD,WAAuBnB,EAAuC,CAGvE,YAAY7B,EAAoBK,EAAqBiC,EAAmB,CACpE,MAAMtC,EAAYK,EAAa,GAAGP,EAAS,UAAUwC,GAAW,EAHpE,KAAY,UAAA,EAIR,KAAK,UAAYA,CACrB,CAEA,MAAM7H,EAAoB8E,EAAkBC,EAAcE,EAAsBC,EAAeC,EAAiBC,EAAyB,CACrI,MAAM/C,EAAOrC,EAAS,MAAM,KAAK,SAAS,EAE1C,GAAI,CAACqC,EAAK,OAAQ,OAElB,MAAMoD,EAAS,KAAK,OAEpB,GAAIV,EAAOU,EAAO,CAAC,EAAG,CAClB,OAAQN,EAAO,CACX,KAAK2C,EAAS,MACVzF,EAAK,OAASA,EAAK,KAAK,OAExB,OACJ,KAAKyF,EAAS,MACVzF,EAAK,SAAWA,EAAK,KAAK,OAASA,EAAK,QAAU6C,CAC1D,CAEA,MACJ,CAEA,MAAM7E,EAAI,KAAK,cAAc0E,CAAI,EAAI1C,EAAK,KAAK,OAE/C,GAAI6C,GAAS,EACLC,GAAS2C,EAAS,IAAKzF,EAAK,QAAUhC,EAAIgC,EAAK,KAAK,OACnDA,EAAK,OAAShC,MAChB,CAEH,IAAI+H,EAAK,EAET,GAAIhD,GAAakD,GAAa,OAC1B,OAAQnD,EAAO,CACX,KAAK2C,EAAS,MACVM,EAAK/F,EAAK,KAAK,OACfA,EAAK,OAAS+F,GAAM,KAAK,IAAI/H,CAAC,EAAImC,EAAU,OAAO4F,CAAE,EAAIA,GAAMlD,EAC/D,MACJ,KAAK4C,EAAS,MACd,KAAKA,EAAS,QACVM,EAAK/F,EAAK,OACVA,EAAK,OAAS+F,GAAM,KAAK,IAAI/H,CAAC,EAAImC,EAAU,OAAO4F,CAAE,EAAIA,GAAMlD,EAC/D,MACJ,KAAK4C,EAAS,IACVzF,EAAK,SAAWhC,EAAIgC,EAAK,KAAK,QAAU6C,CAChD,KAEA,QAAQC,EAAO,CACX,KAAK2C,EAAS,MACVM,EAAK,KAAK,IAAI/F,EAAK,KAAK,MAAM,EAAIG,EAAU,OAAOnC,CAAC,EACpDgC,EAAK,OAAS+F,GAAM/H,EAAI+H,GAAMlD,EAC9B,MACJ,KAAK4C,EAAS,MACd,KAAKA,EAAS,QACVM,EAAK,KAAK,IAAI/F,EAAK,MAAM,EAAIG,EAAU,OAAOnC,CAAC,EAC/CgC,EAAK,OAAS+F,GAAM/H,EAAI+H,GAAMlD,EAC9B,MACJ,KAAK4C,EAAS,IACVzF,EAAK,SAAWhC,EAAIgC,EAAK,KAAK,QAAU6C,CAChD,CAER,CACJ,CACJ,CAKO,MAAMsD,WAAuBpB,EAAuC,CAGvE,YAAY7B,EAAoBK,EAAqBiC,EAAmB,CACpE,MAAMtC,EAAYK,EAAa,GAAGP,EAAS,UAAUwC,GAAW,EAHpE,KAAA,UAAY,EAIR,KAAK,UAAYA,CACrB,CAEA,MAAM7H,EAAoB8E,EAAkBC,EAAcE,EAAsBC,EAAeC,EAAiBC,EAAyB,CACrI,MAAM/C,EAAOrC,EAAS,MAAM,KAAK,SAAS,EAE1C,GAAI,CAACqC,EAAK,OAAQ,OAElB,MAAMoD,EAAS,KAAK,OAEpB,GAAIV,EAAOU,EAAO,CAAC,EAAG,CAClB,OAAQN,EAAO,CACX,KAAK2C,EAAS,MACVzF,EAAK,OAASA,EAAK,KAAK,OAExB,OACJ,KAAKyF,EAAS,MACVzF,EAAK,SAAWA,EAAK,KAAK,OAASA,EAAK,QAAU6C,CAC1D,CAEA,MACJ,CAEA,MAAM5E,EAAI,KAAK,cAAcyE,CAAI,EAAI1C,EAAK,KAAK,OAE/C,GAAI6C,GAAS,EACLC,GAAS2C,EAAS,IAAKzF,EAAK,QAAU/B,EAAI+B,EAAK,KAAK,OACnDA,EAAK,OAAS/B,MAChB,CAEH,IAAI+H,EAAK,EAET,GAAIjD,GAAakD,GAAa,OAC1B,OAAQnD,EACJ,CAAA,KAAK2C,EAAS,MACVO,EAAKhG,EAAK,KAAK,OACfA,EAAK,OAASgG,GAAM,KAAK,IAAI/H,CAAC,EAAIkC,EAAU,OAAO6F,CAAE,EAAIA,GAAMnD,EAC/D,MACJ,KAAK4C,EAAS,MACd,KAAKA,EAAS,QACVO,EAAKhG,EAAK,OACVA,EAAK,OAASgG,GAAM,KAAK,IAAI/H,CAAC,EAAIkC,EAAU,OAAO6F,CAAE,EAAIA,GAAMnD,EAC/D,MACJ,KAAK4C,EAAS,IACVzF,EAAK,SAAW/B,EAAI+B,EAAK,KAAK,QAAU6C,CAChD,KAEQC,QAAAA,EAAAA,CACJ,KAAK2C,EAAS,MACVO,EAAK,KAAK,IAAIhG,EAAK,KAAK,MAAM,EAAIG,EAAU,OAAOlC,CAAC,EACpD+B,EAAK,OAASgG,GAAM/H,EAAI+H,GAAMnD,EAC9B,MACJ,KAAK4C,EAAS,MACd,KAAKA,EAAS,QACVO,EAAK,KAAK,IAAIhG,EAAK,MAAM,EAAIG,EAAU,OAAOlC,CAAC,EAC/C+B,EAAK,OAASgG,GAAM/H,EAAI+H,GAAMnD,EAC9B,MACJ,KAAK4C,EAAS,IACVzF,EAAK,SAAW/B,EAAI+B,EAAK,KAAK,QAAU6C,CAChD,CAER,CACJ,CACJ,CAKO,MAAMuD,WAAsBhB,EAAuC,CAGtE,YAAYlC,EAAoBK,EAAqBiC,EAAmB,CACpE,MAAMtC,EAAYK,EAAa,GAAGP,EAAS,UAAUwC,IAAa,GAAGxC,EAAS,UAAUwC,GAAW,EAHvG,KAAA,UAAY,EAIR,KAAK,UAAYA,CACrB,CAEA,MAAM7H,EAAoB8E,EAAkBC,EAAcE,EAAsBC,EAAeC,EAAiBC,EAAyB,CACrI,MAAM/C,EAAOrC,EAAS,MAAM,KAAK,SAAS,EAE1C,GAAI,CAACqC,EAAK,OAAQ,OAElB,MAAMoD,EAAS,KAAK,OAEpB,GAAIV,EAAOU,EAAO,CAAC,EAAG,CAClB,OAAQN,EAAAA,CACJ,KAAK2C,EAAS,MACVzF,EAAK,OAASA,EAAK,KAAK,OACxBA,EAAK,OAASA,EAAK,KAAK,OAExB,OACJ,KAAKyF,EAAS,MACVzF,EAAK,SAAWA,EAAK,KAAK,OAASA,EAAK,QAAU6C,EAClD7C,EAAK,SAAWA,EAAK,KAAK,OAASA,EAAK,QAAU6C,CAC1D,CAEA,MACJ,CAEA,IAAI7E,EAAI,EACJC,EAAI,EACR,MAAMU,EAAIsE,EAAS,OAAOG,EAAQV,EAAM,CAAc,EAChDwC,EAAY,KAAK,OAAOvG,EAAI,CAAc,EAEhD,OAAQuG,EAAAA,CACJ,IACI,GAAA,MAAMC,EAAS/B,EAAOzE,CAAC,EAEvBX,EAAIoF,EAAOzE,EAAI,CAAa,EAC5BV,EAAImF,EAAOzE,EAAI,CAAa,EAC5B,MAAMuD,GAAKQ,EAAOyC,IAAW/B,EAAOzE,EAAI,CAAc,EAAIwG,GAE1DnH,IAAMoF,EAAOzE,EAAI,EAAiB,CAAa,EAAIX,GAAKkE,EACxDjE,IAAMmF,EAAOzE,EAAI,EAAiB,CAAa,EAAIV,GAAKiE,EACxD,MACJ,IAAK,GACDlE,EAAIoF,EAAOzE,EAAI,CAAa,EAC5BV,EAAImF,EAAOzE,EAAI,CAAa,EAC5B,MACJ,QACIX,EAAI,KAAK,eAAe0E,EAAM/D,EAAG,EAAeuG,EAAY,CAAa,EACzEjH,EAAI,KAAK,eAAeyE,EAAM/D,EAAG,EAAeuG,EAAY,GAAsB,CAAa,CACvG,CAEA,OAAQpC,GACJ,KAAK2C,EAAS,MACVzF,EAAK,OAASA,EAAK,KAAK,OAAShC,EAAI6E,EACrC7C,EAAK,OAASA,EAAK,KAAK,OAAS/B,EAAI4E,EACrC,MACJ,KAAK4C,EAAS,MACd,KAAKA,EAAS,QACVzF,EAAK,SAAWA,EAAK,KAAK,OAAShC,EAAIgC,EAAK,QAAU6C,EACtD7C,EAAK,SAAWA,EAAK,KAAK,OAAS/B,EAAI+B,EAAK,QAAU6C,EACtD,MACJ,KAAK4C,EAAS,IACVzF,EAAK,QAAUhC,EAAI6E,EACnB7C,EAAK,QAAU/B,EAAI4E,CAC3B,CACJ,CACJ,CAKa,MAAAwD,WAAuBtB,EAAuC,CAGvE,YAAY7B,EAAoBK,EAAqBiC,EAAmB,CACpE,MAAMtC,EAAYK,EAAa,GAAGP,EAAS,UAAUwC,GAAW,EAHpE,KAAY,UAAA,EAIR,KAAK,UAAYA,CACrB,CAEA,MAAM7H,EAAoB8E,EAAkBC,EAAcE,EAAsBC,EAAeC,EAAiBC,EAAyB,CACrI,MAAM/C,EAAOrC,EAAS,MAAM,KAAK,SAAS,EAE1C,GAAI,CAACqC,EAAK,OAAQ,OAElB,MAAMoD,EAAS,KAAK,OAEpB,GAAIV,EAAOU,EAAO,CAAC,EAAG,CAClB,OAAQN,EAAAA,CACJ,KAAK2C,EAAS,MACVzF,EAAK,OAASA,EAAK,KAAK,OAExB,OACJ,KAAKyF,EAAS,MACVzF,EAAK,SAAWA,EAAK,KAAK,OAASA,EAAK,QAAU6C,CAC1D,CAEA,MACJ,CAEA,MAAM7E,EAAI,KAAK,cAAc0E,CAAI,EAEjC,OAAQI,EAAO,CACX,KAAK2C,EAAS,MACVzF,EAAK,OAASA,EAAK,KAAK,OAAShC,EAAI6E,EACrC,MACJ,KAAK4C,EAAS,MACd,KAAKA,EAAS,QACVzF,EAAK,SAAWA,EAAK,KAAK,OAAShC,EAAIgC,EAAK,QAAU6C,EACtD,MACJ,KAAK4C,EAAS,IACVzF,EAAK,QAAUhC,EAAI6E,CAC3B,CACJ,CACJ,CAKO,MAAMyD,WAAuBvB,EAAuC,CAGvE,YAAY7B,EAAoBK,EAAqBiC,EAAmB,CACpE,MAAMtC,EAAYK,EAAa,GAAGP,EAAS,UAAUwC,GAAW,EAHpE,KAAA,UAAY,EAIR,KAAK,UAAYA,CACrB,CAEA,MAAM7H,EAAoB8E,EAAkBC,EAAcE,EAAsBC,EAAeC,EAAiBC,EAAyB,CACrI,MAAM/C,EAAOrC,EAAS,MAAM,KAAK,SAAS,EAE1C,GAAI,CAACqC,EAAK,OAAQ,OAElB,MAAMoD,EAAS,KAAK,OAEpB,GAAIV,EAAOU,EAAO,CAAC,EAAG,CAClB,OAAQN,EACJ,CAAA,KAAK2C,EAAS,MACVzF,EAAK,OAASA,EAAK,KAAK,OAExB,OACJ,KAAKyF,EAAS,MACVzF,EAAK,SAAWA,EAAK,KAAK,OAASA,EAAK,QAAU6C,CAC1D,CAEA,MACJ,CAEA,MAAM5E,EAAI,KAAK,cAAcyE,CAAI,EAEjC,OAAQI,EACJ,CAAA,KAAK2C,EAAS,MACVzF,EAAK,OAASA,EAAK,KAAK,OAAS/B,EAAI4E,EACrC,MACJ,KAAK4C,EAAS,MACd,KAAKA,EAAS,QACVzF,EAAK,SAAWA,EAAK,KAAK,OAAS/B,EAAI+B,EAAK,QAAU6C,EACtD,MACJ,KAAK4C,EAAS,IACVzF,EAAK,QAAU/B,EAAI4E,CAC3B,CACJ,CACJ,CAKa,MAAA0D,WAAqBjD,EAAsC,CAGpE,YAAYJ,EAAoBK,EAAqBiD,EAAmB,CACpE,MAAMtD,EAAYK,EAAa,CAAC,GAAGP,EAAS,OAAOwD,IAAa,GAAGxD,EAAS,SAASwD,GAAW,CAAC,EAHrG,KAAY,UAAA,EAIR,KAAK,UAAYA,CACrB,CAEA,iBAAkB,CACd,MAAO,EACX,CAGA,SAASzE,EAAeW,EAAcgD,EAAWe,EAAWtI,EAAWD,EAAW,CAC9E6D,GAAS,EACT,KAAK,OAAOA,CAAK,EAAIW,EACrB,KAAK,OAAOX,EAAQ,CAAQ,EAAI2D,EAChC,KAAK,OAAO3D,EAAQ,CAAQ,EAAI0E,EAChC,KAAK,OAAO1E,EAAQ,CAAQ,EAAI5D,EAChC,KAAK,OAAO4D,EAAQ,CAAQ,EAAI7D,CACpC,CAEA,MAAMP,EAAoB8E,EAAkBC,EAAcE,EAAsBC,EAAeC,EAAiBC,EAAyB,CACrI,MAAM1F,EAAOM,EAAS,MAAM,KAAK,SAAS,EAE1C,GAAI,CAACN,EAAK,KAAK,OAAQ,OAEvB,MAAM+F,EAAS,KAAK,OACdsD,EAAQrJ,EAAK,MAEnB,GAAIqF,EAAOU,EAAO,CAAC,EAAG,CAClB,MAAMuD,EAAQtJ,EAAK,KAAK,MAExB,OAAQyF,EACJ,CAAA,KAAK2C,EAAS,MACViB,EAAM,aAAaC,CAAK,EAExB,OACJ,KAAKlB,EAAS,MACViB,EAAM,KAAKC,EAAM,EAAID,EAAM,GAAK7D,GAAQ8D,EAAM,EAAID,EAAM,GAAK7D,GAAQ8D,EAAM,EAAID,EAAM,GAAK7D,GAAQ8D,EAAM,EAAID,EAAM,GAAK7D,CAAK,CACpI,CAEA,MACJ,CAEA,IAAI6C,EAAI,EACJe,EAAI,EACJtI,EAAI,EACJD,EAAI,EACR,MAAMS,EAAIsE,EAAS,OAAOG,EAAQV,EAAM,CAAc,EAChDwC,EAAY,KAAK,OAAOvG,EAAI,CAAc,EAEhD,OAAQuG,EACJ,CAAA,IACI,GAAA,MAAMC,EAAS/B,EAAOzE,CAAC,EAEvB+G,EAAItC,EAAOzE,EAAI,CAAQ,EACvB8H,EAAIrD,EAAOzE,EAAI,CAAQ,EACvBR,EAAIiF,EAAOzE,EAAI,CAAQ,EACvBT,EAAIkF,EAAOzE,EAAI,CAAQ,EACvB,MAAMuD,GAAKQ,EAAOyC,IAAW/B,EAAOzE,EAAI,CAAc,EAAIwG,GAE1DO,IAAMtC,EAAOzE,EAAI,EAAiB,CAAQ,EAAI+G,GAAKxD,EACnDuE,IAAMrD,EAAOzE,EAAI,EAAiB,CAAQ,EAAI8H,GAAKvE,EACnD/D,IAAMiF,EAAOzE,EAAI,EAAiB,CAAQ,EAAIR,GAAK+D,EACnDhE,IAAMkF,EAAOzE,EAAI,EAAiB,CAAQ,EAAIT,GAAKgE,EACnD,MACJ,IACIwD,GAAAA,EAAItC,EAAOzE,EAAI,CAAQ,EACvB8H,EAAIrD,EAAOzE,EAAI,CAAQ,EACvBR,EAAIiF,EAAOzE,EAAI,CAAQ,EACvBT,EAAIkF,EAAOzE,EAAI,CAAQ,EACvB,MACJ,QACI+G,EAAI,KAAK,eAAehD,EAAM/D,EAAG,EAAUuG,EAAY,CAAa,EACpEuB,EAAI,KAAK,eAAe/D,EAAM/D,EAAG,EAAUuG,EAAY,GAAsB,CAAa,EAC1F/G,EAAI,KAAK,eAAeuE,EAAM/D,EAAG,EAAUuG,EAAY,GAAsB,EAAI,CAAa,EAC9FhH,EAAI,KAAK,eAAewE,EAAM/D,EAAG,EAAUuG,EAAY,GAAsB,EAAI,CAAa,CACtG,CACIrC,GAAS,EAAG6D,EAAM,IAAIhB,EAAGe,EAAGtI,EAAGD,CAAC,GAE5B4E,GAAS2C,EAAS,OAAOiB,EAAM,aAAarJ,EAAK,KAAK,KAAK,EAC/DqJ,EAAM,KAAKhB,EAAIgB,EAAM,GAAK7D,GAAQ4D,EAAIC,EAAM,GAAK7D,GAAQ1E,EAAIuI,EAAM,GAAK7D,GAAQ3E,EAAIwI,EAAM,GAAK7D,CAAK,EAE5G,CACJ,CAKa,MAAA+D,WAAoBtD,EAAsC,CAGnE,YAAYJ,EAAoBK,EAAqBiD,EAAmB,CACpE,MAAMtD,EAAYK,EAAa,CAAC,GAAGP,EAAS,OAAOwD,GAAW,CAAC,EAHnE,KAAY,UAAA,EAIR,KAAK,UAAYA,CACrB,CAEA,iBAAkB,CACd,MACJ,EAAA,CAGA,SAASzE,EAAeW,EAAcgD,EAAWe,EAAWtI,EAAW,CACnE4D,IAAU,EACV,KAAK,OAAOA,CAAK,EAAIW,EACrB,KAAK,OAAOX,EAAQ,CAAQ,EAAI2D,EAChC,KAAK,OAAO3D,EAAQ,CAAQ,EAAI0E,EAChC,KAAK,OAAO1E,EAAQ,CAAQ,EAAI5D,CACpC,CAEA,MAAMR,EAAoB8E,EAAkBC,EAAcE,EAAsBC,EAAeC,EAAiBC,EAAyB,CACrI,MAAM1F,EAAOM,EAAS,MAAM,KAAK,SAAS,EAE1C,GAAI,CAACN,EAAK,KAAK,OAAQ,OAEvB,MAAM+F,EAAS,KAAK,OACdsD,EAAQrJ,EAAK,MAEnB,GAAIqF,EAAOU,EAAO,CAAC,EAAG,CAClB,MAAMuD,EAAQtJ,EAAK,KAAK,MAExB,OAAQyF,GACJ,KAAK2C,EAAS,MACViB,EAAM,EAAIC,EAAM,EAChBD,EAAM,EAAIC,EAAM,EAChBD,EAAM,EAAIC,EAAM,EAEhB,OACJ,KAAKlB,EAAS,MACViB,EAAM,IAAMC,EAAM,EAAID,EAAM,GAAK7D,EACjC6D,EAAM,IAAMC,EAAM,EAAID,EAAM,GAAK7D,EACjC6D,EAAM,IAAMC,EAAM,EAAID,EAAM,GAAK7D,CACzC,CAEA,MACJ,CAEA,IAAI6C,EAAI,EACJe,EAAI,EACJtI,EAAI,EACR,MAAMQ,EAAIsE,EAAS,OAAOG,EAAQV,EAAM,CAAc,EAChDwC,EAAY,KAAK,OAAOvG,GAAK,CAAC,EAEpC,OAAQuG,EAAW,CACf,IAAK,GACD,MAAMC,EAAS/B,EAAOzE,CAAC,EAEvB+G,EAAItC,EAAOzE,EAAI,CAAQ,EACvB8H,EAAIrD,EAAOzE,EAAI,CAAQ,EACvBR,EAAIiF,EAAOzE,EAAI,CAAQ,EACvB,MAAMuD,GAAKQ,EAAOyC,IAAW/B,EAAOzE,EAAI,CAAc,EAAIwG,GAE1DO,IAAMtC,EAAOzE,EAAI,EAAiB,CAAQ,EAAI+G,GAAKxD,EACnDuE,IAAMrD,EAAOzE,EAAI,EAAiB,CAAQ,EAAI8H,GAAKvE,EACnD/D,IAAMiF,EAAOzE,EAAI,EAAiB,CAAQ,EAAIR,GAAK+D,EACnD,MACJ,IAAK,GACDwD,EAAItC,EAAOzE,EAAI,CAAQ,EACvB8H,EAAIrD,EAAOzE,EAAI,CAAQ,EACvBR,EAAIiF,EAAOzE,EAAI,CAAQ,EACvB,MACJ,QACI+G,EAAI,KAAK,eAAehD,EAAM/D,EAAG,EAAUuG,EAAY,CAAa,EACpEuB,EAAI,KAAK,eAAe/D,EAAM/D,EAAG,EAAUuG,EAAY,GAAsB,CAAa,EAC1F/G,EAAI,KAAK,eAAeuE,EAAM/D,EAAG,EAAUuG,EAAY,GAAsB,EAAI,CAAa,CACtG,CACA,GAAIrC,GAAS,EACT6D,EAAM,EAAIhB,EACVgB,EAAM,EAAID,EACVC,EAAM,EAAIvI,MACP,CACH,GAAI2E,GAAS2C,EAAS,MAAO,CACzB,MAAMkB,EAAQtJ,EAAK,KAAK,MAExBqJ,EAAM,EAAIC,EAAM,EAChBD,EAAM,EAAIC,EAAM,EAChBD,EAAM,EAAIC,EAAM,CACpB,CACAD,EAAM,IAAMhB,EAAIgB,EAAM,GAAK7D,EAC3B6D,EAAM,IAAMD,EAAIC,EAAM,GAAK7D,EAC3B6D,EAAM,IAAMvI,EAAIuI,EAAM,GAAK7D,CAC/B,CACJ,CACJ,CAKa,MAAAgE,WAAsB9B,EAAuC,CAGtE,YAAY7B,EAAoBK,EAAqBiD,EAAmB,CACpE,MAAMtD,EAAYK,EAAa,GAAGP,EAAS,SAASwD,GAAW,EAHnE,KAAA,UAAY,EAIR,KAAK,UAAYA,CACrB,CAEA,MAAM7I,EAAoB8E,EAAkBC,EAAcE,EAAsBC,EAAeC,EAAiBC,EAAyB,CACrI,MAAM1F,EAAOM,EAAS,MAAM,KAAK,SAAS,EAE1C,GAAI,CAACN,EAAK,KAAK,OAAQ,OAEvB,MAAMqJ,EAAQrJ,EAAK,MAEnB,GAAIqF,EAAO,KAAK,OAAO,CAAC,EAAG,CAEvB,MAAMiE,EAAQtJ,EAAK,KAAK,MAExB,OAAQyF,EAAAA,CACJ,KAAK2C,EAAS,MACViB,EAAM,EAAIC,EAAM,EAEhB,OACJ,KAAKlB,EAAS,MACViB,EAAM,IAAMC,EAAM,EAAID,EAAM,GAAK7D,CACzC,CAEA,MACJ,CAEA,MAAM3E,EAAI,KAAK,cAAcwE,CAAI,EAE7BG,GAAS,EAAG6D,EAAM,EAAIxI,GAElB4E,GAAS2C,EAAS,QAAOiB,EAAM,EAAIrJ,EAAK,KAAK,MAAM,GACvDqJ,EAAM,IAAMxI,EAAIwI,EAAM,GAAK7D,EAEnC,CACJ,CAKO,MAAMiE,WAAsBxD,EAAsC,CAGrE,YAAYJ,EAAoBK,EAAqBiD,EAAmB,CACpE,MAAMtD,EAAYK,EAAa,CAAC,GAAGP,EAAS,OAAOwD,IAAa,GAAGxD,EAAS,SAASwD,IAAa,GAAGxD,EAAS,QAAQwD,GAAW,CAAC,EAHtI,KAAA,UAAY,EAIR,KAAK,UAAYA,CACrB,CAEA,iBAAkB,CACd,MAAO,EACX,CAGA,SAASzE,EAAeW,EAAcgD,EAAWe,EAAWtI,EAAWD,EAAW6I,EAAYC,EAAYC,EAAY,CAClHlF,IAAU,EACV,KAAK,OAAOA,CAAK,EAAIW,EACrB,KAAK,OAAOX,EAAQ,CAAQ,EAAI2D,EAChC,KAAK,OAAO3D,EAAQ,CAAQ,EAAI0E,EAChC,KAAK,OAAO1E,EAAQ,CAAQ,EAAI5D,EAChC,KAAK,OAAO4D,EAAQ,CAAQ,EAAI7D,EAChC,KAAK,OAAO6D,EAAQ,CAAS,EAAIgF,EACjC,KAAK,OAAOhF,EAAQ,CAAS,EAAIiF,EACjC,KAAK,OAAOjF,EAAQ,CAAS,EAAIkF,CACrC,CAEA,MAAMtJ,EAAoB8E,EAAkBC,EAAcE,EAAsBC,EAAeC,EAAiBC,EAAyB,CACrI,MAAM1F,EAAOM,EAAS,MAAM,KAAK,SAAS,EAE1C,GAAI,CAACN,EAAK,KAAK,OAAQ,OAEvB,MAAM+F,EAAS,KAAK,OACd8D,EAAQ7J,EAAK,MACb8J,EAAO9J,EAAK,UAElB,GAAIqF,EAAOU,EAAO,CAAC,EAAG,CAClB,MAAMgE,EAAa/J,EAAK,KAAK,MACvBgK,EAAYhK,EAAK,KAAK,UAE5B,OAAQyF,EACJ,CAAA,KAAK2C,EAAS,MACVyB,EAAM,aAAaE,CAAU,EAC7BD,EAAK,EAAIE,EAAU,EACnBF,EAAK,EAAIE,EAAU,EACnBF,EAAK,EAAIE,EAAU,EAEnB,OACJ,KAAK5B,EAAS,MACVyB,EAAM,KAAKE,EAAW,EAAIF,EAAM,GAAKrE,GAAQuE,EAAW,EAAIF,EAAM,GAAKrE,GAAQuE,EAAW,EAAIF,EAAM,GAAKrE,GAAQuE,EAAW,EAAIF,EAAM,GAAKrE,CAAK,EAChJsE,EAAK,IAAME,EAAU,EAAIF,EAAK,GAAKtE,EACnCsE,EAAK,IAAME,EAAU,EAAIF,EAAK,GAAKtE,EACnCsE,EAAK,IAAME,EAAU,EAAIF,EAAK,GAAKtE,CAC3C,CAEA,MACJ,CAEA,IAAI6C,EAAI,EACJe,EAAI,EACJtI,EAAI,EACJD,EAAI,EACJ6I,EAAK,EACLC,EAAK,EACLC,EAAK,EACT,MAAMtI,EAAIsE,EAAS,OAAOG,EAAQV,EAAM,CAAc,EAChDwC,EAAY,KAAK,OAAOvG,GAAK,CAAC,EAEpC,OAAQuG,EACJ,CAAA,IAAK,GACD,MAAMC,EAAS/B,EAAOzE,CAAC,EAEvB+G,EAAItC,EAAOzE,EAAI,CAAQ,EACvB8H,EAAIrD,EAAOzE,EAAI,CAAQ,EACvBR,EAAIiF,EAAOzE,EAAI,CAAQ,EACvBT,EAAIkF,EAAOzE,EAAI,CAAQ,EACvBoI,EAAK3D,EAAOzE,EAAI,CAAS,EACzBqI,EAAK5D,EAAOzE,EAAI,CAAS,EACzBsI,EAAK7D,EAAOzE,EAAI,CAAS,EACzB,MAAMuD,GAAKQ,EAAOyC,IAAW/B,EAAOzE,EAAI,CAAc,EAAIwG,GAE1DO,IAAMtC,EAAOzE,EAAI,EAAiB,CAAQ,EAAI+G,GAAKxD,EACnDuE,IAAMrD,EAAOzE,EAAI,EAAiB,CAAQ,EAAI8H,GAAKvE,EACnD/D,IAAMiF,EAAOzE,EAAI,EAAiB,CAAQ,EAAIR,GAAK+D,EACnDhE,IAAMkF,EAAOzE,EAAI,EAAiB,CAAQ,EAAIT,GAAKgE,EACnD6E,IAAO3D,EAAOzE,EAAI,EAAiB,CAAS,EAAIoI,GAAM7E,EACtD8E,IAAO5D,EAAOzE,EAAI,EAAiB,CAAS,EAAIqI,GAAM9E,EACtD+E,IAAO7D,EAAOzE,EAAI,EAAiB,CAAS,EAAIsI,GAAM/E,EACtD,MACJ,IAAK,GACDwD,EAAItC,EAAOzE,EAAI,CAAQ,EACvB8H,EAAIrD,EAAOzE,EAAI,CAAQ,EACvBR,EAAIiF,EAAOzE,EAAI,CAAQ,EACvBT,EAAIkF,EAAOzE,EAAI,CAAQ,EACvBoI,EAAK3D,EAAOzE,EAAI,CAAS,EACzBqI,EAAK5D,EAAOzE,EAAI,CAAS,EACzBsI,EAAK7D,EAAOzE,EAAI,CAAS,EACzB,MACJ,QACI+G,EAAI,KAAK,eAAehD,EAAM/D,EAAG,EAAUuG,EAAY,CAAa,EACpEuB,EAAI,KAAK,eAAe/D,EAAM/D,EAAG,EAAUuG,EAAY,GAAsB,CAAa,EAC1F/G,EAAI,KAAK,eAAeuE,EAAM/D,EAAG,EAAUuG,EAAY,GAAsB,EAAI,CAAa,EAC9FhH,EAAI,KAAK,eAAewE,EAAM/D,EAAG,EAAUuG,EAAY,GAAsB,EAAI,CAAa,EAC9F6B,EAAK,KAAK,eAAerE,EAAM/D,EAAG,EAAWuG,EAAY,GAAsB,EAAI,CAAa,EAChG8B,EAAK,KAAK,eAAetE,EAAM/D,EAAG,EAAWuG,EAAY,GAAsB,EAAI,CAAa,EAChG+B,EAAK,KAAK,eAAevE,EAAM/D,EAAG,EAAWuG,EAAY,GAAsB,EAAI,CAAa,CACxG,CAEA,GAAIrC,GAAS,EACTqE,EAAM,IAAIxB,EAAGe,EAAGtI,EAAGD,CAAC,EACpBiJ,EAAK,EAAIJ,EACTI,EAAK,EAAIH,EACTG,EAAK,EAAIF,MACN,CACH,GAAInE,GAAS2C,EAAS,MAAO,CACzByB,EAAM,aAAa7J,EAAK,KAAK,KAAK,EAClC,MAAMgK,EAAYhK,EAAK,KAAK,UAE5B8J,EAAK,EAAIE,EAAU,EACnBF,EAAK,EAAIE,EAAU,EACnBF,EAAK,EAAIE,EAAU,CACvB,CACAH,EAAM,KAAKxB,EAAIwB,EAAM,GAAKrE,GAAQ4D,EAAIS,EAAM,GAAKrE,GAAQ1E,EAAI+I,EAAM,GAAKrE,GAAQ3E,EAAIgJ,EAAM,GAAKrE,CAAK,EACpGsE,EAAK,IAAMJ,EAAKI,EAAK,GAAKtE,EAC1BsE,EAAK,IAAMH,EAAKG,EAAK,GAAKtE,EAC1BsE,EAAK,IAAMF,EAAKE,EAAK,GAAKtE,CAC9B,CACJ,CACJ,CAKa,MAAAyE,WAAqBhE,EAAsC,CAGpE,YAAYJ,EAAoBK,EAAqBiD,EAAmB,CACpE,MAAMtD,EAAYK,EAAa,CAAC,GAAGP,EAAS,OAAOwD,IAAa,GAAGxD,EAAS,QAAQwD,GAAW,CAAC,EAHpG,KAAA,UAAY,EAIR,KAAK,UAAYA,CACrB,CAEA,iBAAkB,CACd,MAAO,EACX,CAGA,SAASzE,EAAeW,EAAcgD,EAAWe,EAAWtI,EAAW4I,EAAYC,EAAYC,EAAY,CACvGlF,GAAS,EACT,KAAK,OAAOA,CAAK,EAAIW,EACrB,KAAK,OAAOX,EAAQ,CAAQ,EAAI2D,EAChC,KAAK,OAAO3D,EAAQ,CAAQ,EAAI0E,EAChC,KAAK,OAAO1E,EAAQ,CAAQ,EAAI5D,EAChC,KAAK,OAAO4D,EAAQ,CAAS,EAAIgF,EACjC,KAAK,OAAOhF,EAAQ,CAAS,EAAIiF,EACjC,KAAK,OAAOjF,EAAQ,CAAS,EAAIkF,CACrC,CAEA,MAAMtJ,EAAoB8E,EAAkBC,EAAcE,EAAsBC,EAAeC,EAAiBC,EAAyB,CACrI,MAAM1F,EAAOM,EAAS,MAAM,KAAK,SAAS,EAE1C,GAAI,CAACN,EAAK,KAAK,OAAQ,OAEvB,MAAM+F,EAAS,KAAK,OACd8D,EAAQ7J,EAAK,MACb8J,EAAO9J,EAAK,UAElB,GAAIqF,EAAOU,EAAO,CAAC,EAAG,CAClB,MAAMgE,EAAa/J,EAAK,KAAK,MACvBgK,EAAYhK,EAAK,KAAK,UAE5B,OAAQyF,EAAAA,CACJ,KAAK2C,EAAS,MACVyB,EAAM,EAAIE,EAAW,EACrBF,EAAM,EAAIE,EAAW,EACrBF,EAAM,EAAIE,EAAW,EACrBD,EAAK,EAAIE,EAAU,EACnBF,EAAK,EAAIE,EAAU,EACnBF,EAAK,EAAIE,EAAU,EAEnB,OACJ,KAAK5B,EAAS,MACVyB,EAAM,IAAME,EAAW,EAAIF,EAAM,GAAKrE,EACtCqE,EAAM,IAAME,EAAW,EAAIF,EAAM,GAAKrE,EACtCqE,EAAM,IAAME,EAAW,EAAIF,EAAM,GAAKrE,EACtCsE,EAAK,IAAME,EAAU,EAAIF,EAAK,GAAKtE,EACnCsE,EAAK,IAAME,EAAU,EAAIF,EAAK,GAAKtE,EACnCsE,EAAK,IAAME,EAAU,EAAIF,EAAK,GAAKtE,CAC3C,CAEA,MACJ,CAEA,IAAI6C,EAAI,EACJe,EAAI,EACJtI,EAAI,EACJ4I,EAAK,EACLC,EAAK,EACLC,EAAK,EACT,MAAMtI,EAAIsE,EAAS,OAAOG,EAAQV,EAAM,CAAc,EAChDwC,EAAY,KAAK,OAAOvG,EAAI,CAAc,EAEhD,OAAQuG,EAAW,CACf,IAAK,GACD,MAAMC,EAAS/B,EAAOzE,CAAC,EAEvB+G,EAAItC,EAAOzE,EAAI,CAAQ,EACvB8H,EAAIrD,EAAOzE,EAAI,CAAQ,EACvBR,EAAIiF,EAAOzE,EAAI,CAAQ,EACvBoI,EAAK3D,EAAOzE,EAAI,CAAS,EACzBqI,EAAK5D,EAAOzE,EAAI,CAAS,EACzBsI,EAAK7D,EAAOzE,EAAI,CAAS,EACzB,MAAMuD,GAAKQ,EAAOyC,IAAW/B,EAAOzE,EAAI,CAAc,EAAIwG,GAE1DO,IAAMtC,EAAOzE,EAAI,EAAiB,CAAQ,EAAI+G,GAAKxD,EACnDuE,IAAMrD,EAAOzE,EAAI,EAAiB,CAAQ,EAAI8H,GAAKvE,EACnD/D,IAAMiF,EAAOzE,EAAI,EAAiB,CAAQ,EAAIR,GAAK+D,EACnD6E,IAAO3D,EAAOzE,EAAI,EAAiB,CAAS,EAAIoI,GAAM7E,EACtD8E,IAAO5D,EAAOzE,EAAI,EAAiB,CAAS,EAAIqI,GAAM9E,EACtD+E,IAAO7D,EAAOzE,EAAI,EAAiB,CAAS,EAAIsI,GAAM/E,EACtD,MACJ,IAAK,GACDwD,EAAItC,EAAOzE,EAAI,CAAQ,EACvB8H,EAAIrD,EAAOzE,EAAI,CAAQ,EACvBR,EAAIiF,EAAOzE,EAAI,CAAQ,EACvBoI,EAAK3D,EAAOzE,EAAI,CAAS,EACzBqI,EAAK5D,EAAOzE,EAAI,CAAS,EACzBsI,EAAK7D,EAAOzE,EAAI,CAAS,EACzB,MACJ,QACI+G,EAAI,KAAK,eAAehD,EAAM/D,EAAG,EAAUuG,EAAY,CAAa,EACpEuB,EAAI,KAAK,eAAe/D,EAAM/D,EAAG,EAAUuG,EAAY,GAAsB,CAAa,EAC1F/G,EAAI,KAAK,eAAeuE,EAAM/D,EAAG,EAAUuG,EAAY,GAAsB,EAAI,CAAa,EAC9F6B,EAAK,KAAK,eAAerE,EAAM/D,EAAG,EAAWuG,EAAY,GAAsB,EAAI,CAAa,EAChG8B,EAAK,KAAK,eAAetE,EAAM/D,EAAG,EAAWuG,EAAY,GAAsB,EAAI,CAAa,EAChG+B,EAAK,KAAK,eAAevE,EAAM/D,EAAG,EAAWuG,EAAY,GAAsB,EAAI,CAAa,CACxG,CAEA,GAAIrC,GAAS,EACTqE,EAAM,EAAIxB,EACVwB,EAAM,EAAIT,EACVS,EAAM,EAAI/I,EACVgJ,EAAK,EAAIJ,EACTI,EAAK,EAAIH,EACTG,EAAK,EAAIF,MACN,CACH,GAAInE,GAAS2C,EAAS,MAAO,CACzB,MAAM2B,EAAa/J,EAAK,KAAK,MACvBgK,EAAYhK,EAAK,KAAK,UAE5B6J,EAAM,EAAIE,EAAW,EACrBF,EAAM,EAAIE,EAAW,EACrBF,EAAM,EAAIE,EAAW,EACrBD,EAAK,EAAIE,EAAU,EACnBF,EAAK,EAAIE,EAAU,EACnBF,EAAK,EAAIE,EAAU,CACvB,CACAH,EAAM,IAAMxB,EAAIwB,EAAM,GAAKrE,EAC3BqE,EAAM,IAAMT,EAAIS,EAAM,GAAKrE,EAC3BqE,EAAM,IAAM/I,EAAI+I,EAAM,GAAKrE,EAC3BsE,EAAK,IAAMJ,EAAKI,EAAK,GAAKtE,EAC1BsE,EAAK,IAAMH,EAAKG,EAAK,GAAKtE,EAC1BsE,EAAK,IAAMF,EAAKE,EAAK,GAAKtE,CAC9B,CACJ,CACJ,CAKa,MAAA0E,WAA2BtE,CAAiC,CAMrE,YAAYC,EAAoBsD,EAAmB,CAC/C,MAAMtD,EAAY,CAAC,GAAGF,EAAS,cAAcwD,GAAW,CAAC,EAN7D,KAAY,UAAA,EAOR,KAAK,UAAYA,EACjB,KAAK,gBAAkB,IAAI,MAActD,CAAU,CACvD,CAEA,eAAgB,CACZ,OAAO,KAAK,OAAO,MACvB,CAGA,SAASnB,EAAeW,EAAc8E,EAA+B,CACjE,KAAK,OAAOzF,CAAK,EAAIW,EACrB,KAAK,gBAAgBX,CAAK,EAAIyF,CAClC,CAEA,MAAM7J,EAAoB8E,EAAkBC,EAAcE,EAAsBC,EAAeC,EAAiBC,EAAyB,CACrI,MAAM1F,EAAOM,EAAS,MAAM,KAAK,SAAS,EAE1C,GAAKN,EAAK,KAAK,OAEf,CAAA,GAAI0F,GAAakD,GAAa,OAAQ,CAC9BnD,GAAS2C,EAAS,OAAO,KAAK,cAAc9H,EAAUN,EAAMA,EAAK,KAAK,cAAc,EAExF,MACJ,CAEA,GAAIqF,EAAO,KAAK,OAAO,CAAC,EAAG,EACnBI,GAAS2C,EAAS,OAAS3C,GAAS2C,EAAS,QAAO,KAAK,cAAc9H,EAAUN,EAAMA,EAAK,KAAK,cAAc,EAEnH,MACJ,CAEA,KAAK,cAAcM,EAAUN,EAAM,KAAK,gBAAgB4F,EAAS,QAAQ,KAAK,OAAQP,CAAI,CAAC,CAAC,CAAA,CAChG,CAEA,cAAc/E,EAAoBN,EAAYmK,EAA+B,CACzEnK,EAAK,cAAemK,EAAwB7J,EAAS,cAAc,KAAK,UAAW6J,CAAc,EAA5D,IAA6D,CACtG,CACJ,CAKa,MAAAC,WAAuBnE,EAAsC,CAStE,YAAYJ,EAAoBK,EAAqBiD,EAAmBrH,EAA8B,CAClG,MAAM+D,EAAYK,EAAa,CAAC,GAAGP,EAAS,UAAUwD,KAAarH,EAAW,IAAI,CAAC,EATvF,KAAA,UAAY,EAUR,KAAK,UAAYqH,EACjB,KAAK,WAAarH,EAClB,KAAK,SAAW,IAAI,MAAuB+D,CAAU,CACzD,CAEA,eAAgB,CACZ,OAAO,KAAK,OAAO,MACvB,CAIA,SAASnB,EAAeW,EAAc7E,EAA2B,CAC7D,KAAK,OAAOkE,CAAK,EAAIW,EACrB,KAAK,SAASX,CAAK,EAAIlE,CAC3B,CAIA,UAAU6F,EAAgB3B,EAAe4B,EAAeC,EAAeC,EAAgBC,EAAaC,EAAaC,EAAaC,EAAaC,EAAeC,EAAgB,CACtK,MAAMC,EAAS,KAAK,OACpB,IAAIzF,EAAI,KAAK,cAAA,EAAkB+E,EAAS,GAEpCC,GAAS,IAAGS,EAAOrC,CAAK,EAAI,EAAgBpD,GAChD,MAAM0F,GAAQT,EAAQE,EAAM,EAAIE,GAAO,IACjCM,EAAOL,EAAM,IAAOF,EAAM,IAC1BQ,IAAST,EAAME,GAAO,EAAIJ,EAAQM,GAAS,KAC3CM,GAAQT,EAAME,EAAM,WAAc,KACxC,IAAIQ,EAAMJ,EAAO,EAAIE,EACjBG,EAAMJ,EAAO,EAAIE,EACjBG,GAAMb,EAAMF,GAAS,GAAMS,EAAOE,EAAO,UACzCK,EAAKb,EAAM,GAAMO,EAAOE,EAAO,UAC/BxG,EAAI4F,EAAQe,EACZ1G,EAAI2G,EAER,QAAShG,EAAID,EAAI,GAAqBA,EAAIC,EAAGD,GAAK,EAC9CyF,EAAOzF,CAAC,EAAIX,EACZoG,EAAOzF,EAAI,CAAC,EAAIV,EAChB0G,GAAMF,EACNG,GAAMF,EACND,GAAOF,EACPG,GAAOF,EACPxG,GAAK2G,EACL1G,GAAK2G,CAEb,CAEA,gBAAgBlC,EAAcX,EAAe,CACzC,MAAMqC,EAAS,KAAK,OACpB,IAAIzF,EAAIyF,EAAOrC,CAAK,EAEpB,OAAQpD,GACJ,IAAK,GACD,MAAMX,EAAI,KAAK,OAAO+D,CAAK,EAE3B,OAAQW,EAAO1E,IAAM,KAAK,OAAO+D,EAAQ,KAAK,gBAAiB,CAAA,EAAI/D,GACvE,IAAK,GACD,MAAO,EACf,CAEA,GADAW,GAAK,EACDyF,EAAOzF,CAAC,EAAI+D,EAAM,CAClB,MAAM1E,EAAI,KAAK,OAAO+D,CAAK,EAE3B,OAAQqC,EAAOzF,EAAI,CAAC,GAAK+D,EAAO1E,IAAOoG,EAAOzF,CAAC,EAAIX,EACvD,CACA,MAAMY,EAAID,EAAI,GAEd,IAAKA,GAAK,EAAGA,EAAIC,EAAGD,GAAK,EACrB,GAAIyF,EAAOzF,CAAC,GAAK+D,EAAM,CACnB,MAAM1E,EAAIoG,EAAOzF,EAAI,CAAC,EAChBV,EAAImG,EAAOzF,EAAI,CAAC,EAEtB,OAAOV,GAAMyE,EAAO1E,IAAMoG,EAAOzF,CAAC,EAAIX,IAAOoG,EAAOzF,EAAI,CAAC,EAAIV,EACjE,CAEJ,MAAMD,EAAIoG,EAAOxF,EAAI,CAAC,EAChBX,EAAImG,EAAOxF,EAAI,CAAC,EAEtB,OAAOX,GAAM,EAAIA,IAAMyE,EAAO1E,IAAO,KAAK,OAAO+D,EAAQ,KAAK,iBAAiB,EAAI/D,EACvF,CAEA,MAAML,EAAoB8E,EAAkBC,EAAcgF,EAA2B7E,EAAeC,EAAiBC,EAAyB,CAC1I,MAAM1F,EAAaM,EAAS,MAAM,KAAK,SAAS,EAEhD,GAAI,CAACN,EAAK,KAAK,OAAQ,OACvB,MAAMsK,EAAoCtK,EAAK,cAG/C,EAAA,GADI,CAACsK,GACD,EAAEA,aAA0BtI,KAAwCsI,EAAgB,oBAAsB,KAAK,WAAY,OAE/H,MAAM1I,EAAwB5B,EAAK,OAE/B4B,EAAO,QAAU,IAAG6D,EAAQ2C,EAAS,OAEzC,MAAM5H,EAAW,KAAK,SAChB+J,EAAc/J,EAAS,CAAC,EAAE,OAE1BuF,EAAS,KAAK,OAEpB,GAAIV,EAAOU,EAAO,CAAC,EAAG,CAClB,OAAQN,EAAO,CACX,KAAK2C,EAAS,MACVxG,EAAO,OAAS,EAEhB,OACJ,KAAKwG,EAAS,MACV,GAAI5C,GAAS,EAAG,CACZ5D,EAAO,OAAS,EAEhB,MACJ,CACAA,EAAO,OAAS2I,EAChB,MAAMC,EAAqCF,EAE3C,GAAKE,EAAiB,MAKf,CAEHhF,EAAQ,EAAIA,EACZ,QAASlE,EAAI,EAAGA,EAAIiJ,EAAajJ,IAAKM,EAAON,CAAC,GAAKkE,CACvD,KAT6B,CAEzB,MAAMiF,EAAgBD,EAAiB,SAEvC,QAASlJ,EAAI,EAAGA,EAAIiJ,EAAajJ,IAAKM,EAAON,CAAC,IAAMmJ,EAAcnJ,CAAC,EAAIM,EAAON,CAAC,GAAKkE,CACxF,CAKR,CAEA,MACJ,CAGA,GADA5D,EAAO,OAAS2I,EACZlF,GAAQU,EAAOA,EAAO,OAAS,CAAC,EAAG,CAEnC,MAAM2E,EAAelK,EAASuF,EAAO,OAAS,CAAC,EAE/C,GAAIP,GAAS,EACT,GAAIC,GAAS2C,EAAS,IAAK,CACvB,MAAMoC,EAAmBF,EAEzB,GAAKE,EAAiB,MAOlB,QAASlJ,EAAI,EAAGA,EAAIiJ,EAAajJ,IAAKM,EAAON,CAAC,GAAKoJ,EAAapJ,CAAC,MAPxC,CAEzB,MAAMmJ,EAAgBD,EAAiB,SAEvC,QAASlJ,EAAI,EAAGA,EAAIiJ,EAAajJ,IAAKM,EAAON,CAAC,GAAKoJ,EAAapJ,CAAC,EAAImJ,EAAcnJ,CAAC,CACxF,CAIJ,MAAOS,EAAM,UAAU2I,EAAc,EAAG9I,EAAQ,EAAG2I,CAAW,MAEtD9E,QAAAA,EACJ,CAAA,KAAK2C,EAAS,MAAO,CACjB,MAAMoC,EAAmBF,EAEzB,GAAKE,EAAiB,MAWlB,QAASlJ,EAAI,EAAGA,EAAIiJ,EAAajJ,IAAKM,EAAON,CAAC,EAAIoJ,EAAapJ,CAAC,EAAIkE,MAX3C,CAEzB,MAAMiF,EAAgBD,EAAiB,SAEvC,QAASlJ,EAAI,EAAGA,EAAIiJ,EAAajJ,IAAK,CAClC,MAAMgI,EAAQmB,EAAcnJ,CAAC,EAE7BM,EAAON,CAAC,EAAIgI,GAASoB,EAAapJ,CAAC,EAAIgI,GAAS9D,CACpD,CACJ,CAIA,KACJ,CACA,KAAK4C,EAAS,MACd,KAAKA,EAAS,QACV,QAAS9G,EAAI,EAAGA,EAAIiJ,EAAajJ,IAAKM,EAAON,CAAC,IAAMoJ,EAAapJ,CAAC,EAAIM,EAAON,CAAC,GAAKkE,EACnF,MACJ,KAAK4C,EAAS,IACV,MAAMoC,EAAmBF,EAEzB,GAAKE,EAAiB,MAOlB,QAASlJ,EAAI,EAAGA,EAAIiJ,EAAajJ,IAAKM,EAAON,CAAC,GAAKoJ,EAAapJ,CAAC,EAAIkE,MAP5C,CAEzB,MAAMiF,EAAgBD,EAAiB,SAEvC,QAASlJ,EAAI,EAAGA,EAAIiJ,EAAajJ,IAAKM,EAAON,CAAC,IAAMoJ,EAAapJ,CAAC,EAAImJ,EAAcnJ,CAAC,GAAKkE,CAC9F,CAIR,CAGJ,MACJ,CAGA,MAAMd,EAAQkB,EAAS,QAAQG,EAAQV,CAAI,EACrCsF,EAAU,KAAK,gBAAgBtF,EAAMX,CAAK,EAC1CkG,EAAepK,EAASkE,CAAK,EAC7BmG,EAAerK,EAASkE,EAAQ,CAAC,EAEvC,GAAIc,GAAS,EACT,GAAIC,GAAS2C,EAAS,IAAK,CACvB,MAAMoC,EAAmBF,EAEzB,GAAKE,EAAiB,MAWlB,QAASlJ,EAAI,EAAGA,EAAIiJ,EAAajJ,IAAK,CAClC,MAAMwJ,EAAOF,EAAatJ,CAAC,EAE3BM,EAAON,CAAC,GAAKwJ,GAAQD,EAAavJ,CAAC,EAAIwJ,GAAQH,CACnD,KAfyB,CAEzB,MAAMF,EAAgBD,EAAiB,SAEvC,QAASlJ,EAAI,EAAGA,EAAIiJ,EAAajJ,IAAK,CAClC,MAAMwJ,EAAOF,EAAatJ,CAAC,EAE3BM,EAAON,CAAC,GAAKwJ,GAAQD,EAAavJ,CAAC,EAAIwJ,GAAQH,EAAUF,EAAcnJ,CAAC,CAC5E,CACJ,CAQJ,KACI,SAASA,EAAI,EAAGA,EAAIiJ,EAAajJ,IAAK,CAClC,MAAMwJ,EAAOF,EAAatJ,CAAC,EAE3BM,EAAON,CAAC,EAAIwJ,GAAQD,EAAavJ,CAAC,EAAIwJ,GAAQH,CAClD,KAGJ,QAAQlF,EAAO,CACX,KAAK2C,EAAS,MAAO,CACjB,MAAMoC,EAAmBF,EAEzB,GAAKE,EAAiB,MAYlB,QAASlJ,EAAI,EAAGA,EAAIiJ,EAAajJ,IAAK,CAClC,MAAMwJ,EAAOF,EAAatJ,CAAC,EAE3BM,EAAON,CAAC,GAAKwJ,GAAQD,EAAavJ,CAAC,EAAIwJ,GAAQH,GAAWnF,CAC9D,KAhByB,CAEzB,MAAMiF,EAAgBD,EAAiB,SAEvC,QAASlJ,EAAI,EAAGA,EAAIiJ,EAAajJ,IAAK,CAClC,MAAMwJ,EAAOF,EAAatJ,CAAC,EACrBgI,EAAQmB,EAAcnJ,CAAC,EAE7BM,EAAON,CAAC,EAAIgI,GAASwB,GAAQD,EAAavJ,CAAC,EAAIwJ,GAAQH,EAAUrB,GAAS9D,CAC9E,CACJ,CAQA,KACJ,CACA,KAAK4C,EAAS,MACd,KAAKA,EAAS,QACV,QAAS9G,EAAI,EAAGA,EAAIiJ,EAAajJ,IAAK,CAClC,MAAMwJ,EAAOF,EAAatJ,CAAC,EAE3BM,EAAON,CAAC,IAAMwJ,GAAQD,EAAavJ,CAAC,EAAIwJ,GAAQH,EAAU/I,EAAON,CAAC,GAAKkE,CAC3E,CACA,MACJ,KAAK4C,EAAS,IACV,MAAMoC,EAAmBF,EAEzB,GAAKE,EAAiB,MAWlB,QAASlJ,EAAI,EAAGA,EAAIiJ,EAAajJ,IAAK,CAClC,MAAMwJ,EAAOF,EAAatJ,CAAC,EAE3BM,EAAON,CAAC,IAAMwJ,GAAQD,EAAavJ,CAAC,EAAIwJ,GAAQH,GAAWnF,CAC/D,KAfyB,CAEzB,MAAMiF,EAAgBD,EAAiB,SAEvC,QAASlJ,EAAI,EAAGA,EAAIiJ,EAAajJ,IAAK,CAClC,MAAMwJ,EAAOF,EAAatJ,CAAC,EAE3BM,EAAON,CAAC,IAAMwJ,GAAQD,EAAavJ,CAAC,EAAIwJ,GAAQH,EAAUF,EAAcnJ,CAAC,GAAKkE,CAClF,CACJ,CAQR,CAER,CACJ,CAKO,MAAMuF,GAAN,cAA4BnF,CAAS,CAMxC,YAAYC,EAAoB,CAC5B,MAAMA,EAAYkF,GAAc,WAAW,EAE3C,KAAK,OAAS,IAAI,MAAalF,CAAU,CAC7C,CAEA,eAAgB,CACZ,OAAO,KAAK,OAAO,MACvB,CAGA,SAASnB,EAAesG,EAAc,CAClC,KAAK,OAAOtG,CAAK,EAAIsG,EAAM,KAC3B,KAAK,OAAOtG,CAAK,EAAIsG,CACzB,CAGA,MAAM1K,EAAoB8E,EAAkBC,EAAcgF,EAA2B7E,EAAeC,EAAiBC,EAAyB,CAC1I,GAAI,CAAC2E,EAAa,OAElB,MAAMtE,EAAS,KAAK,OACdF,EAAa,KAAK,OAAO,OAE/B,GAAIT,EAAWC,EAEX,KAAK,MAAM/E,EAAU8E,EAAU,OAAO,UAAWiF,EAAa7E,EAAOC,EAAOC,CAAS,EACrFN,EAAW,WACJA,GAAYW,EAAOF,EAAa,CAAC,EAExC,OACJ,GAAIR,EAAOU,EAAO,CAAC,EAAG,OAEtB,IAAI,EAAI,EAER,GAAIX,EAAWW,EAAO,CAAC,EAAG,EAAI,MACzB,CACD,EAAIH,EAAS,QAAQG,EAAQX,CAAQ,EAAI,EACzC,MAAM6F,EAAYlF,EAAO,CAAC,EAE1B,KAAO,EAAI,GAEHA,EAAO,EAAI,CAAC,GAAKkF,GACrB,GAER,CACA,KAAO,EAAIpF,GAAcR,GAAQU,EAAO,CAAC,EAAG,IAAKsE,EAAY,KAAK,KAAK,OAAO,CAAC,CAAC,CACpF,CACJ,EArDO,IAAMa,GAANH,GAAMG,GACF,YAAc,CAAC,GAAGvF,EAAS,OAAO,EAyDtC,MAAMwF,GAAN,cAAgCvF,CAAS,CAM5C,YAAYC,EAAoB,CAC5B,MAAMA,EAAYsF,GAAkB,WAAW,EAC/C,KAAK,WAAa,IAAI,MAA4BtF,CAAU,CAChE,CAEA,eAAgB,CACZ,OAAO,KAAK,OAAO,MACvB,CAKA,SAASnB,EAAeW,EAAc+F,EAAiC,CACnE,KAAK,OAAO1G,CAAK,EAAIW,EACrB,KAAK,WAAWX,CAAK,EAAI0G,CAC7B,CAEA,MAAM9K,EAAoB8E,EAAkBC,EAAcgF,EAA2B7E,EAAeC,EAAiBC,EAAyB,CAC1I,GAAIA,GAAakD,GAAa,OAAQ,CAC9BnD,GAAS2C,EAAS,OAAOrG,EAAM,UAAUzB,EAAS,MAAO,EAAGA,EAAS,UAAW,EAAGA,EAAS,MAAM,MAAM,EAE5G,MACJ,CAEA,GAAI+E,EAAO,KAAK,OAAO,CAAC,EAAG,EACnBI,GAAS2C,EAAS,OAAS3C,GAAS2C,EAAS,QAAOrG,EAAM,UAAUzB,EAAS,MAAO,EAAGA,EAAS,UAAW,EAAGA,EAAS,MAAM,MAAM,EAEvI,MACJ,CAEA,MAAM+K,EAAMzF,EAAS,QAAQ,KAAK,OAAQP,CAAI,EACxCiG,EAAwB,KAAK,WAAWD,CAAG,EAEjD,GAAI,CAACC,EAAuBvJ,EAAM,UAAUzB,EAAS,MAAO,EAAGA,EAAS,UAAW,EAAGA,EAAS,MAAM,MAAM,MACtG,CACD,MAAM8K,EAAyB9K,EAAS,UAClCiL,EAAqBjL,EAAS,MAEpC,QAASgB,EAAI,EAAGC,EAAI+J,EAAsB,OAAQhK,EAAIC,EAAGD,IAAK8J,EAAU9J,CAAC,EAAIiK,EAAMD,EAAsBhK,CAAC,CAAC,CAC/G,CACJ,CACJ,EA/Ca,IAAAkK,GAANL,GAAMK,GACF,YAAc,CAAC,GAAG7F,EAAS,WAAW,EAoDpC,MAAA8F,WAA6BxF,EAAc,CAIpD,YAAYJ,EAAoBK,EAAqBwF,EAA2B,CAC5E,MAAM7F,EAAYK,EAAa,CAAC,GAAGP,EAAS,gBAAgB+F,GAAmB,CAAC,EAHpF,uBAAoB,EAIhB,KAAK,kBAAoBA,CAC7B,CAEA,iBAAkB,CACd,MACJ,EAAA,CAGA,SAAShH,EAAeW,EAAcsG,EAAaC,EAAkBC,EAAuBC,EAAmBC,EAAkB,CAC7HrH,GAAS,EACT,KAAK,OAAOA,CAAK,EAAIW,EACrB,KAAK,OAAOX,EAAQ,CAAU,EAAIiH,EAClC,KAAK,OAAOjH,EAAQ,CAAe,EAAIkH,EACvC,KAAK,OAAOlH,EAAQ,CAAqB,EAAImH,EAC7C,KAAK,OAAOnH,EAAQ,CAAe,EAAIoH,EAAW,EAAI,EACtD,KAAK,OAAOpH,EAAQ,CAAc,EAAIqH,EAAU,EAAI,CACxD,CAEA,MAAMzL,EAAoB8E,EAAkBC,EAAcgF,EAA2B7E,EAAeC,EAAiBC,EAAyB,CAC1I,MAAMsG,EAA2B1L,EAAS,cAAc,KAAK,iBAAiB,EAE9E,GAAI,CAAC0L,EAAW,OAAQ,OAExB,MAAMjG,EAAS,KAAK,OAEpB,GAAIV,EAAOU,EAAO,CAAC,EAAG,CAClB,OAAQN,EAAO,CACX,KAAK2C,EAAS,MACV4D,EAAW,IAAMA,EAAW,KAAK,IACjCA,EAAW,SAAWA,EAAW,KAAK,SACtCA,EAAW,cAAgBA,EAAW,KAAK,cAC3CA,EAAW,SAAWA,EAAW,KAAK,SACtCA,EAAW,QAAUA,EAAW,KAAK,QAErC,OACJ,KAAK5D,EAAS,MACV4D,EAAW,MAAQA,EAAW,KAAK,IAAMA,EAAW,KAAOxG,EAC3DwG,EAAW,WAAaA,EAAW,KAAK,SAAWA,EAAW,UAAYxG,EAC1EwG,EAAW,cAAgBA,EAAW,KAAK,cAC3CA,EAAW,SAAWA,EAAW,KAAK,SACtCA,EAAW,QAAUA,EAAW,KAAK,OAC7C,CAEA,MACJ,CAEA,IAAIL,EAAM,EACNC,EAAW,EACf,MAAMtK,EAAIsE,EAAS,OAAOG,EAAQV,EAAM,CAAc,EAChDwC,EAAY,KAAK,OAAOvG,EAAI,CAAc,EAEhD,OAAQuG,EACJ,CAAA,IAAK,GACD,MAAMC,EAAS/B,EAAOzE,CAAC,EAEvBqK,EAAM5F,EAAOzE,EAAI,CAAU,EAC3BsK,EAAW7F,EAAOzE,EAAI,CAAe,EACrC,MAAMuD,GAAKQ,EAAOyC,IAAW/B,EAAOzE,EAAI,CAAc,EAAIwG,GAE1D6D,IAAQ5F,EAAOzE,EAAI,EAAiB,CAAU,EAAIqK,GAAO9G,EACzD+G,IAAa7F,EAAOzE,EAAI,EAAiB,CAAe,EAAIsK,GAAY/G,EACxE,MACJ,IAAK,GACD8G,EAAM5F,EAAOzE,EAAI,CAAU,EAC3BsK,EAAW7F,EAAOzE,EAAI,CAAe,EACrC,MACJ,QACIqK,EAAM,KAAK,eAAetG,EAAM/D,EAAG,EAAYuG,EAAY,CAAa,EACxE+D,EAAW,KAAK,eAAevG,EAAM/D,EAAG,EAAiBuG,EAAY,GAAsB,CAAa,CAChH,CAEIpC,GAAS2C,EAAS,OAClB4D,EAAW,IAAMA,EAAW,KAAK,KAAOL,EAAMK,EAAW,KAAK,KAAOxG,EACrEwG,EAAW,SAAWA,EAAW,KAAK,UAAYJ,EAAWI,EAAW,KAAK,UAAYxG,EAErFE,GAAakD,GAAa,QAC1BoD,EAAW,cAAgBA,EAAW,KAAK,cAC3CA,EAAW,SAAWA,EAAW,KAAK,SACtCA,EAAW,QAAUA,EAAW,KAAK,UAErCA,EAAW,cAAgBjG,EAAOzE,EAAI,CAAqB,EAC3D0K,EAAW,SAAWjG,EAAOzE,EAAI,CAAe,GAAK,EACrD0K,EAAW,QAAUjG,EAAOzE,EAAI,CAAc,GAAK,KAGvD0K,EAAW,MAAQL,EAAMK,EAAW,KAAOxG,EAC3CwG,EAAW,WAAaJ,EAAWI,EAAW,UAAYxG,EACtDE,GAAakD,GAAa,QAC1BoD,EAAW,cAAgBjG,EAAOzE,EAAI,CAAqB,EAC3D0K,EAAW,SAAWjG,EAAOzE,EAAI,CAAe,GAAK,EACrD0K,EAAW,QAAUjG,EAAOzE,EAAI,CAAc,GAAK,GAG/D,CACJ,CAMa,MAAA2K,WAAoChG,EAAc,CAI3D,YAAYJ,EAAoBK,EAAqBgG,EAAkC,CACnF,MAAMrG,EAAYK,EAAa,CAAC,GAAGP,EAAS,uBAAuBuG,GAA0B,CAAC,EAHlG,KAA2B,yBAAA,EAIvB,KAAK,yBAA2BA,CACpC,CAEA,iBAAkB,CACd,MACJ,EAAA,CAGA,SAASxH,EAAeW,EAAc8G,EAAmBC,EAAcC,EAAcC,EAAmBC,EAAmBC,EAAmB,CAC1I,MAAMzG,EAAS,KAAK,OAEpBrB,GAAS,EACTqB,EAAOrB,CAAK,EAAIW,EAChBU,EAAOrB,EAAQ,CAAa,EAAIyH,EAChCpG,EAAOrB,EAAQ,CAAQ,EAAI0H,EAC3BrG,EAAOrB,EAAQ,CAAQ,EAAI2H,EAC3BtG,EAAOrB,EAAQ,CAAa,EAAI4H,EAChCvG,EAAOrB,EAAQ,CAAa,EAAI6H,EAChCxG,EAAOrB,EAAQ,CAAa,EAAI8H,CACpC,CAEA,MAAMlM,EAAoB8E,EAAkBC,EAAcgF,EAA2B7E,EAAeC,EAAiBC,EAAyB,CAC1I,MAAMsG,EAAkC1L,EAAS,qBAAqB,KAAK,wBAAwB,EAEnG,GAAI,CAAC0L,EAAW,OAAQ,OAExB,MAAMjG,EAAS,KAAK,OAEpB,GAAIV,EAAOU,EAAO,CAAC,EAAG,CAClB,MAAM0G,EAAOT,EAAW,KAExB,OAAQvG,EACJ,CAAA,KAAK2C,EAAS,MACV4D,EAAW,UAAYS,EAAK,UAC5BT,EAAW,KAAOS,EAAK,KACvBT,EAAW,KAAOS,EAAK,KACvBT,EAAW,UAAYS,EAAK,UAC5BT,EAAW,UAAYS,EAAK,UAC5BT,EAAW,UAAYS,EAAK,UAE5B,OACJ,KAAKrE,EAAS,MACV4D,EAAW,YAAcS,EAAK,UAAYT,EAAW,WAAaxG,EAClEwG,EAAW,OAASS,EAAK,KAAOT,EAAW,MAAQxG,EACnDwG,EAAW,OAASS,EAAK,KAAOT,EAAW,MAAQxG,EACnDwG,EAAW,YAAcS,EAAK,UAAYT,EAAW,WAAaxG,EAClEwG,EAAW,YAAcS,EAAK,UAAYT,EAAW,WAAaxG,EAClEwG,EAAW,YAAcS,EAAK,UAAYT,EAAW,WAAaxG,CAC1E,CAEA,MACJ,CAEA,IAAIkH,EACA/L,EACAC,EACA+L,EACAC,EACAC,EACJ,MAAMvL,EAAIsE,EAAS,OAAOG,EAAQV,EAAM,CAAc,EAChDwC,EAAY,KAAK,OAAOvG,EAAI,CAAc,EAEhD,OAAQuG,GACJ,IAAK,GACD,MAAMC,EAAS/B,EAAOzE,CAAC,EAEvBoL,EAAS3G,EAAOzE,EAAI,CAAa,EACjCX,EAAIoF,EAAOzE,EAAI,CAAQ,EACvBV,EAAImF,EAAOzE,EAAI,CAAQ,EACvBqL,EAAS5G,EAAOzE,EAAI,CAAa,EACjCsL,EAAS7G,EAAOzE,EAAI,CAAa,EACjCuL,EAAS9G,EAAOzE,EAAI,CAAa,EACjC,MAAMuD,GAAKQ,EAAOyC,IAAW/B,EAAOzE,EAAI,CAAc,EAAIwG,GAE1D4E,IAAW3G,EAAOzE,EAAI,EAAiB,CAAa,EAAIoL,GAAU7H,EAClElE,IAAMoF,EAAOzE,EAAI,EAAiB,CAAQ,EAAIX,GAAKkE,EACnDjE,IAAMmF,EAAOzE,EAAI,EAAiB,CAAQ,EAAIV,GAAKiE,EACnD8H,IAAW5G,EAAOzE,EAAI,EAAiB,CAAa,EAAIqL,GAAU9H,EAClE+H,IAAW7G,EAAOzE,EAAI,EAAiB,CAAa,EAAIsL,GAAU/H,EAClEgI,IAAW9G,EAAOzE,EAAI,EAAiB,CAAa,EAAIuL,GAAUhI,EAClE,MACJ,IAAK,GACD6H,EAAS3G,EAAOzE,EAAI,CAAa,EACjCX,EAAIoF,EAAOzE,EAAI,CAAQ,EACvBV,EAAImF,EAAOzE,EAAI,CAAQ,EACvBqL,EAAS5G,EAAOzE,EAAI,CAAa,EACjCsL,EAAS7G,EAAOzE,EAAI,CAAa,EACjCuL,EAAS9G,EAAOzE,EAAI,CAAa,EACjC,MACJ,QACIoL,EAAS,KAAK,eAAerH,EAAM/D,EAAG,EAAeuG,EAAY,CAAa,EAC9ElH,EAAI,KAAK,eAAe0E,EAAM/D,EAAG,EAAUuG,EAAY,GAAsB,CAAa,EAC1FjH,EAAI,KAAK,eAAeyE,EAAM/D,EAAG,EAAUuG,EAAY,GAAsB,EAAI,CAAa,EAC9F8E,EAAS,KAAK,eAAetH,EAAM/D,EAAG,EAAeuG,EAAY,GAAsB,EAAI,CAAa,EACxG+E,EAAS,KAAK,eAAevH,EAAM/D,EAAG,EAAeuG,EAAY,GAAsB,EAAI,CAAa,EACxGgF,EAAS,KAAK,eAAexH,EAAM/D,EAAG,EAAeuG,EAAY,GAAsB,EAAI,CAAa,CAChH,CAEA,GAAIpC,GAAS2C,EAAS,MAAO,CACzB,MAAMqE,EAAOT,EAAW,KAExBA,EAAW,UAAYS,EAAK,WAAaC,EAASD,EAAK,WAAajH,EACpEwG,EAAW,KAAOS,EAAK,MAAQ9L,EAAI8L,EAAK,MAAQjH,EAChDwG,EAAW,KAAOS,EAAK,MAAQ7L,EAAI6L,EAAK,MAAQjH,EAChDwG,EAAW,UAAYS,EAAK,WAAaE,EAASF,EAAK,WAAajH,EACpEwG,EAAW,UAAYS,EAAK,WAAaG,EAASH,EAAK,WAAajH,EACpEwG,EAAW,UAAYS,EAAK,WAAaI,EAASJ,EAAK,WAAajH,CACxE,MACIwG,EAAW,YAAcU,EAASV,EAAW,WAAaxG,EAC1DwG,EAAW,OAASrL,EAAIqL,EAAW,MAAQxG,EAC3CwG,EAAW,OAASpL,EAAIoL,EAAW,MAAQxG,EAC3CwG,EAAW,YAAcW,EAASX,EAAW,WAAaxG,EAC1DwG,EAAW,YAAcY,EAASZ,EAAW,WAAaxG,EAC1DwG,EAAW,YAAca,EAASb,EAAW,WAAaxG,CAElE,CACJ,CAKa,MAAAsH,WAAuCpF,EAAe,CAI/D,YAAY7B,EAAoBK,EAAqB6G,EAA6B,CAC9E,MAAMlH,EAAYK,EAAa,GAAGP,EAAS,0BAA0BoH,GAAqB,EAH9F,KAAsB,oBAAA,EAIlB,KAAK,oBAAsBA,CAC/B,CAEA,MAAMzM,EAAoB8E,EAAkBC,EAAcgF,EAA2B7E,EAAeC,EAAiBC,EAAyB,CAC1I,MAAMsG,EAA6B1L,EAAS,gBAAgB,KAAK,mBAAmB,EAEpF,GAAI,CAAC0L,EAAW,OAAQ,OAExB,MAAMjG,EAAS,KAAK,OAEpB,GAAIV,EAAOU,EAAO,CAAC,EAAG,CAClB,OAAQN,EAAAA,CACJ,KAAK2C,EAAS,MACV4D,EAAW,SAAWA,EAAW,KAAK,SAEtC,OACJ,KAAK5D,EAAS,MACV4D,EAAW,WAAaA,EAAW,KAAK,SAAWA,EAAW,UAAYxG,CAClF,CAEA,MACJ,CAEA,MAAMwH,EAAW,KAAK,cAAc3H,CAAI,EAEpCI,GAAS2C,EAAS,MAAO4D,EAAW,SAAWA,EAAW,KAAK,UAAYgB,EAAWhB,EAAW,KAAK,UAAYxG,EACjHwG,EAAW,WAAagB,EAAWhB,EAAW,UAAYxG,CACnE,CACJ,CAKO,MAAMyH,WAAsCvF,EAAe,CAI9D,YAAY7B,EAAoBK,EAAqB6G,EAA6B,CAC9E,MAAMlH,EAAYK,EAAa,GAAGP,EAAS,yBAAyBoH,GAAqB,EAH7F,KAAA,oBAAsB,EAIlB,KAAK,oBAAsBA,CAC/B,CAEA,MAAMzM,EAAoB8E,EAAkBC,EAAcgF,EAA2B7E,EAAeC,EAAiBC,EAAyB,CAC1I,MAAMsG,EAA6B1L,EAAS,gBAAgB,KAAK,mBAAmB,EAEpF,GAAI,CAAC0L,EAAW,OAAQ,OAExB,MAAMjG,EAAS,KAAK,OAEpB,GAAIV,EAAOU,EAAO,CAAC,EAAG,CAClB,OAAQN,EACJ,CAAA,KAAK2C,EAAS,MACV4D,EAAW,QAAUA,EAAW,KAAK,QAErC,OACJ,KAAK5D,EAAS,MACV4D,EAAW,UAAYA,EAAW,KAAK,QAAUA,EAAW,SAAWxG,CAC/E,CAEA,MACJ,CAEA,MAAM0H,EAAU,KAAK,cAAc7H,CAAI,EAEnCI,GAAS2C,EAAS,MAAO4D,EAAW,QAAUA,EAAW,KAAK,SAAWkB,EAAUlB,EAAW,KAAK,SAAWxG,EAC7GwG,EAAW,UAAYkB,EAAUlB,EAAW,SAAWxG,CAChE,CACJ,CAMa,MAAA2H,WAAkClH,EAAc,CAIzD,YAAYJ,EAAoBK,EAAqB6G,EAA6B,CAC9E,MAAMlH,EAAYK,EAAa,CAAC,GAAGP,EAAS,qBAAqBoH,GAAqB,CAAC,EAH3F,KAAsB,oBAAA,EAIlB,KAAK,oBAAsBA,CAC/B,CAEA,iBAAkB,CACd,MACJ,EAAA,CAEA,SAASrI,EAAeW,EAAc8G,EAAmBC,EAAcC,EAAc,CACjF,MAAMtG,EAAS,KAAK,OAEpBrB,IAAU,EACVqB,EAAOrB,CAAK,EAAIW,EAChBU,EAAOrB,EAAQ,CAAa,EAAIyH,EAChCpG,EAAOrB,EAAQ,CAAQ,EAAI0H,EAC3BrG,EAAOrB,EAAQ,CAAQ,EAAI2H,CAC/B,CAEA,MAAM/L,EAAoB8E,EAAkBC,EAAcgF,EAA2B7E,EAAeC,EAAiBC,EAAyB,CAC1I,MAAMsG,EAA6B1L,EAAS,gBAAgB,KAAK,mBAAmB,EAEpF,GAAI,CAAC0L,EAAW,OAAQ,OAExB,MAAMjG,EAAS,KAAK,OAEpB,GAAIV,EAAOU,EAAO,CAAC,EAAG,CAClB,OAAQN,EAAAA,CACJ,KAAK2C,EAAS,MACV4D,EAAW,UAAYA,EAAW,KAAK,UACvCA,EAAW,KAAOA,EAAW,KAAK,KAClCA,EAAW,KAAOA,EAAW,KAAK,KAElC,OACJ,KAAK5D,EAAS,MACV4D,EAAW,YAAcA,EAAW,KAAK,UAAYA,EAAW,WAAaxG,EAC7EwG,EAAW,OAASA,EAAW,KAAK,KAAOA,EAAW,MAAQxG,EAC9DwG,EAAW,OAASA,EAAW,KAAK,KAAOA,EAAW,MAAQxG,CACtE,CAEA,MACJ,CAEA,IAAIkH,EACA/L,EACAC,EACJ,MAAMU,EAAIsE,EAAS,OAAOG,EAAQV,EAAM,CAAc,EAChDwC,EAAY,KAAK,OAAOvG,GAAK,CAAC,EAEpC,OAAQuG,EACJ,CAAA,IACI,GAAA,MAAMC,EAAS/B,EAAOzE,CAAC,EAEvBoL,EAAS3G,EAAOzE,EAAI,CAAa,EACjCX,EAAIoF,EAAOzE,EAAI,CAAQ,EACvBV,EAAImF,EAAOzE,EAAI,CAAQ,EACvB,MAAMuD,GAAKQ,EAAOyC,IAAW/B,EAAOzE,EAAI,CAAc,EAAIwG,GAE1D4E,IAAW3G,EAAOzE,EAAI,EAAiB,CAAa,EAAIoL,GAAU7H,EAClElE,IAAMoF,EAAOzE,EAAI,EAAiB,CAAQ,EAAIX,GAAKkE,EACnDjE,IAAMmF,EAAOzE,EAAI,EAAiB,CAAQ,EAAIV,GAAKiE,EACnD,MACJ,IAAK,GACD6H,EAAS3G,EAAOzE,EAAI,CAAa,EACjCX,EAAIoF,EAAOzE,EAAI,CAAQ,EACvBV,EAAImF,EAAOzE,EAAI,CAAQ,EACvB,MACJ,QACIoL,EAAS,KAAK,eAAerH,EAAM/D,EAAG,EAAeuG,EAAY,CAAa,EAC9ElH,EAAI,KAAK,eAAe0E,EAAM/D,EAAG,EAAUuG,EAAY,GAAsB,CAAa,EAC1FjH,EAAI,KAAK,eAAeyE,EAAM/D,EAAG,EAAUuG,EAAY,GAAsB,EAAI,CAAa,CACtG,CAEA,GAAIpC,GAAS2C,EAAS,MAAO,CACzB,MAAMqE,EAAOT,EAAW,KAExBA,EAAW,UAAYS,EAAK,WAAaC,EAASD,EAAK,WAAajH,EACpEwG,EAAW,KAAOS,EAAK,MAAQ9L,EAAI8L,EAAK,MAAQjH,EAChDwG,EAAW,KAAOS,EAAK,MAAQ7L,EAAI6L,EAAK,MAAQjH,CACpD,MACIwG,EAAW,YAAcU,EAASV,EAAW,WAAaxG,EAC1DwG,EAAW,OAASrL,EAAIqL,EAAW,MAAQxG,EAC3CwG,EAAW,OAASpL,EAAIoL,EAAW,MAAQxG,CAEnD,CACJ,CAKO,MAAM4H,GAAN,cAA+BxH,CAAiC,CAQnE,YAAYC,EAAoBsD,EAAmBrH,EAA+B,CAC9E,MAAM+D,EAAY,CAAC,GAAGF,EAAS,YAAYwD,KAAarH,EAAW,SAAS,IAAI,CAAC,EACjF,KAAK,UAAYqH,EACjB,KAAK,WAAarH,CACtB,CAEA,iBAAkB,CACd,OAAOsL,GAAiB,OAC5B,CAEA,cAAe,CACX,OAAO,KAAK,SAChB,CAEA,eAAgB,CACZ,OAAO,KAAK,UAChB,CAKA,SAAS1I,EAAeW,EAAcgI,EAAoB9I,EAAe+I,EAAe,CACpF,MAAMvH,EAAS,KAAK,OAEpBrB,GAAS0I,GAAiB,QAC1BrH,EAAOrB,CAAK,EAAIW,EAChBU,EAAOrB,EAAQ0I,GAAiB,IAAI,EAAIC,EAAQ9I,GAAS,EACzDwB,EAAOrB,EAAQ0I,GAAiB,KAAK,EAAIE,CAC7C,CAEA,MAAMhN,EAAoB8E,EAAkBC,EAAcE,EAAsBC,EAAeC,EAAiBC,EAAyB,CACrI,MAAM1F,EAAOM,EAAS,MAAM,KAAK,SAAS,EAE1C,GAAI,CAACN,EAAK,KAAK,OAAQ,OACvB,MAAMsK,EAAiBtK,EAAK,WACtB8B,EAAa,KAAK,WAExB,GAAIwI,GAAkBxI,IACd,EAAEwI,aAA0BtI,KAAsBsI,EAAoC,oBAAsBxI,GAAY,OAGhI,MAAMiE,EAAS,KAAK,OAEpB,GAAIV,EAAOU,EAAO,CAAC,EAAG,EAEdN,GAAS2C,EAAS,OAAS3C,GAAS2C,EAAS,SAAOpI,EAAK,cAAgB,IAE7E,MACJ,CAEA,MAAMsB,EAAIsE,EAAS,OAAOG,EAAQV,EAAM+H,GAAiB,OAAO,EAC1DtF,EAAS/B,EAAOzE,CAAC,EACjBiM,EAAexH,EAAOzE,EAAI8L,GAAiB,IAAI,EAC/CE,EAAQvH,EAAOzE,EAAI8L,GAAiB,KAAK,EAE/C,GAAI,CAAC,KAAK,WAAW,SAAU,OAC/B,IAAI7I,EAAQgJ,GAAgB,EAC5B,MAAMpN,EAAQ,KAAK,WAAW,SAAS,QAAQ,OACzCkN,EAAOvI,GAAmByI,EAAe,EAAG,EAElD,GAAIF,GAAQzI,GAAa,KAErB,OADAL,IAAWc,EAAOyC,GAAUwF,EAAQ,KAAW,EACvCD,EACJ,CAAA,KAAKzI,GAAa,KACdL,EAAQ,KAAK,IAAIpE,EAAQ,EAAGoE,CAAK,EACjC,MACJ,KAAKK,GAAa,KACdL,GAASpE,EACT,MACJ,KAAKyE,GAAa,SAAU,CACxB,MAAMrD,GAAKpB,GAAS,GAAK,EAEzBoE,EAAQhD,GAAK,EAAI,EAAIgD,EAAQhD,EACzBgD,GAASpE,IAAOoE,EAAQhD,EAAIgD,GAChC,KACJ,CACA,KAAKK,GAAa,YACdL,EAAQ,KAAK,IAAIpE,EAAQ,EAAIoE,EAAO,CAAC,EACrC,MACJ,KAAKK,GAAa,YACdL,EAAQpE,EAAQ,EAAKoE,EAAQpE,EAC7B,MACJ,KAAKyE,GAAa,gBAAiB,CAC/B,MAAMrD,GAAKpB,GAAS,GAAK,EAEzBoE,EAAQhD,GAAK,EAAI,GAAKgD,EAAQpE,EAAQ,GAAKoB,EACvCgD,GAASpE,IAAOoE,EAAQhD,EAAIgD,EACpC,CACJ,CAEJvE,EAAK,cAAgBuE,CACzB,CACJ,EApGa,IAAAiJ,GAANJ,GAAMI,GACF,QAAU,EADRA,GAEF,KAAO,EAFLA,GAGF,MAAQ,EC/xEZ,MAAMC,GAAN,KAAoE,CA2BvE,YAAYhB,EAA0B,CAjBtC,KAAS,OAAA,IAAI,MAMb,KAAY,UAAA,EACZ,kBAAe,EAEf,KAAA,OAAS,IAAI,MACb,KAAA,UAAY,IAAI,MAChB,KAAA,MAAQ,IAAIiB,GAAW,IAAI,EAC3B,KAAc,YAAA,IAAIxI,GAClB,KAAoB,kBAAA,GAEpB,oBAAiB,IAAIyI,GAAiB,IAAM,IAAIC,EAAY,EAGxD,KAAK,KAAOnB,CAChB,CA3BA,OAAe,gBAA4B,CACvC,OAAOgB,GAAe,eAC1B,CA4BA,OAAOI,EAAe,CAClBA,GAAS,KAAK,UACd,MAAMC,EAAS,KAAK,OAEpB,QAASxM,EAAI,EAAGC,EAAIuM,EAAO,OAAQxM,EAAIC,EAAGD,IAAK,CAC3C,MAAMyM,EAAUD,EAAOxM,CAAC,EAExB,GAAI,CAACyM,EAAS,SAEdA,EAAQ,cAAgBA,EAAQ,kBAChCA,EAAQ,UAAYA,EAAQ,cAE5B,IAAIC,EAAeH,EAAQE,EAAQ,UAEnC,GAAIA,EAAQ,MAAQ,EAAG,CAEnB,GADAA,EAAQ,OAASC,EACbD,EAAQ,MAAQ,EAAG,SACvBC,EAAe,CAACD,EAAQ,MACxBA,EAAQ,MAAQ,CACpB,CAEA,IAAIE,EAAOF,EAAQ,KAEnB,GAAIE,EAAM,CAEN,MAAMC,EAAWH,EAAQ,UAAYE,EAAK,MAE1C,GAAIC,GAAY,EAAG,CAKf,IAJAD,EAAK,MAAQ,EACbA,EAAK,WAAaF,EAAQ,WAAa,EAAI,GAAKG,EAAWH,EAAQ,UAAYF,GAASI,EAAK,UAC7FF,EAAQ,WAAaC,EACrB,KAAK,WAAW1M,EAAG2M,EAAM,EAAI,EACtBA,EAAK,YACRA,EAAK,SAAWJ,EAChBI,EAAOA,EAAK,WAEhB,QACJ,CACJ,SAAWF,EAAQ,WAAaA,EAAQ,UAAY,CAACA,EAAQ,WAAY,CACrED,EAAOxM,CAAC,EAAI,KACZ,KAAK,MAAM,IAAIyM,CAAO,EACtB,KAAK,UAAUA,CAAO,EACtB,QACJ,CACA,GAAIA,EAAQ,YAAc,KAAK,iBAAiBA,EAASF,CAAK,EAAG,CAE7D,IAAIM,EAA0BJ,EAAQ,WAItC,IAFAA,EAAQ,WAAa,KACjBI,IAAMA,EAAK,SAAW,MACnBA,GACH,KAAK,MAAM,IAAIA,CAAI,EACnBA,EAAOA,EAAK,UAEpB,CAEAJ,EAAQ,WAAaC,CACzB,CAEA,KAAK,MAAM,OACf,CAGA,iBAAiBI,EAAgBP,EAAwB,CACrD,MAAMM,EAAOC,EAAG,WAEhB,GAAI,CAACD,EAAM,MAAO,GAElB,MAAME,EAAW,KAAK,iBAAiBF,EAAMN,CAAK,EAMlD,OAJAM,EAAK,cAAgBA,EAAK,kBAC1BA,EAAK,UAAYA,EAAK,cAGlBC,EAAG,QAAU,GAAKA,EAAG,SAAWA,EAAG,cAE/BD,EAAK,YAAc,GAAKC,EAAG,aAAe,KAC1CA,EAAG,WAAaD,EAAK,WACjBA,EAAK,aAAYA,EAAK,WAAW,SAAWC,GAChDA,EAAG,eAAiBD,EAAK,eACzB,KAAK,MAAM,IAAIA,CAAI,GAGhBE,IAGXF,EAAK,WAAaN,EAAQM,EAAK,UAC/BC,EAAG,SAAWP,EAEP,GACX,CAKA,MAAMvN,EAA6B,CAC/B,GAAI,CAACA,EAAU,MAAM,IAAI,MAAM,0BAA0B,EACrD,KAAK,mBAAmB,KAAK,mBAAmB,EAEpD,MAAMiF,EAAS,KAAK,OACduI,EAAS,KAAK,OACpB,IAAIQ,EAAU,GAEd,QAAShN,EAAI,EAAGC,EAAIuM,EAAO,OAAQxM,EAAIC,EAAGD,IAAK,CAC3C,MAAMyM,EAAUD,EAAOxM,CAAC,EAExB,GAAI,CAACyM,GAAWA,EAAQ,MAAQ,EAAG,SACnCO,EAAU,GACV,MAAM7I,EAAkBnE,GAAK,EAAI8G,EAAS,MAAQ2F,EAAQ,SAG1D,IAAIpC,EAAMoC,EAAQ,MAEdA,EAAQ,WAAYpC,GAAO,KAAK,gBAAgBoC,EAASzN,EAAUmF,CAAK,EACnEsI,EAAQ,WAAaA,EAAQ,UAAY,CAACA,EAAQ,OAAMpC,EAAM,GAGvE,MAAM4C,EAAgBR,EAAQ,cACxBS,EAAgBT,EAAQ,iBAAiB,EAC/C,IAAIU,EAAYD,EACZE,EAA8BnJ,EAE9BwI,EAAQ,UACRU,EAAYV,EAAQ,UAAU,SAAWU,EACzCC,EAAc,MAElB,MAAM1J,EAAY+I,EAAQ,UAAU,UAC9BY,EAAgB3J,EAAU,OAEhC,GAAK1D,GAAK,GAAKqK,GAAO,GAAMlG,GAAS2C,EAAS,IAC1C,QAASR,EAAK,EAAGA,EAAK+G,EAAe/G,IAAM,CAIvC7F,EAAM,sBAAsB4J,EAAKlG,CAAK,EACtC,MAAMmJ,EAAW5J,EAAU4C,CAAE,EAEzBgH,aAAoB1E,GAAoB,KAAK,wBAAwB0E,EAAUtO,EAAUmO,EAAWhJ,EAAO,EAAI,EAC9GmJ,EAAS,MAAMtO,EAAUiO,EAAeE,EAAWC,EAAa/C,EAAKlG,EAAOmD,GAAa,KAAK,CACvG,KACG,CACH,MAAMiG,EAAed,EAAQ,aAEvBe,EAAmBf,EAAQ,iBAC3BgB,EAAa,CAACD,GAAoBf,EAAQ,kBAAkB,QAAUY,GAAiB,EAEzFI,IAAYhB,EAAQ,kBAAkB,OAASY,GAAiB,GAEpE,QAAS/G,EAAK,EAAGA,EAAK+G,EAAe/G,IAAM,CACvC,MAAMgH,EAAW5J,EAAU4C,CAAE,EACvBoH,EAAgBH,EAAajH,CAAE,GAAKqH,GAAaxJ,EAAQ2C,EAAS,MAEpE,CAAC0G,GAAoBF,aAAoB1G,GACzC,KAAK,oBAAoB0G,EAAUtO,EAAUmO,EAAW9C,EAAKqD,EAAejB,EAAQ,kBAAmBnG,GAAM,EAAGmH,CAAU,EACnHH,aAAoB1E,GAC3B,KAAK,wBAAwB0E,EAAUtO,EAAUmO,EAAWhJ,EAAO,EAAI,GAGvE1D,EAAM,sBAAsB4J,EAAKlG,CAAK,EACtCmJ,EAAS,MAAMtO,EAAUiO,EAAeE,EAAWC,EAAa/C,EAAKqD,EAAepG,GAAa,KAAK,EAE9G,CACJ,CACA,KAAK,YAAYmF,EAASS,CAAa,EACvCjJ,EAAO,OAAS,EAChBwI,EAAQ,kBAAoBS,EAC5BT,EAAQ,cAAgBA,EAAQ,SACpC,CAKA,MAAMmB,EAAa,KAAK,aAAeC,GACjC5D,EAAQjL,EAAS,MAEvB,QAASgB,EAAI,EAAGC,EAAIjB,EAAS,MAAM,OAAQgB,EAAIC,EAAGD,IAAK,CACnD,MAAMtB,EAAOuL,EAAMjK,CAAC,EAEpB,GAAItB,EAAK,iBAAmBkP,EAAY,CACpC,MAAM/E,EAAiBnK,EAAK,KAAK,eAEjCA,EAAK,cAAemK,EAAwB7J,EAAS,cAAcN,EAAK,KAAK,MAAOmK,CAAc,EAA7D,IAA8D,CACvG,CACJ,CACA,OAAK,KAAA,cAAgB,EAErB,KAAK,MAAM,QAEJmE,CACX,CAEA,gBAAgBF,EAAgB9N,EAAoBmF,EAAiB,CACjE,MAAM0I,EAAOC,EAAG,WAEZD,EAAK,YAAY,KAAK,gBAAgBA,EAAM7N,EAAUmF,CAAK,EAE/D,IAAIkG,EAAM,EAENyC,EAAG,aAAe,GAElBzC,EAAM,EACFlG,GAAS2C,EAAS,QAAO3C,EAAQ2C,EAAS,SAE9CuD,EAAMyC,EAAG,QAAUA,EAAG,YAClBzC,EAAM,IAAGA,EAAM,GACflG,GAAS2C,EAAS,QAAO3C,EAAQ0I,EAAK,WAG9C,MAAMiB,EAAczD,EAAMwC,EAAK,oBACzB/C,EAAYO,EAAMwC,EAAK,mBACvBnJ,EAAYmJ,EAAK,UAAU,UAC3BQ,EAAgB3J,EAAU,OAC1BqK,EAAYlB,EAAK,MAAQC,EAAG,eAC5BkB,EAAWD,GAAa,EAAI1D,GAC5B4C,EAAgBJ,EAAK,cACrBK,EAAgBL,EAAK,iBAAA,EAC3B,IAAIM,EAAYD,EACZjJ,EAAS,KAKb,GAHI4I,EAAK,QAASM,EAAYN,EAAK,UAAU,SAAWM,EAC/C9C,EAAMwC,EAAK,iBAAgB5I,EAAS,KAAK,QAE9CE,GAAS2C,EAAS,IAClB,QAAS9G,EAAI,EAAGA,EAAIqN,EAAerN,IAAK0D,EAAU1D,CAAC,EAAE,MAAMhB,EAAUiO,EAAeE,EAAWlJ,EAAQ+J,EAAU7J,EAAOmD,GAAa,MAAM,MACxI,CACH,MAAMiG,EAAeV,EAAK,aACpBoB,EAAkBpB,EAAK,gBAEvBW,EAAmBX,EAAK,iBACxBY,EAAa,CAACD,GAAoBX,EAAK,kBAAkB,QAAUQ,GAAiB,EAEtFI,IAAYZ,EAAK,kBAAkB,OAASQ,GAAiB,GAEjER,EAAK,WAAa,EAClB,QAAS7M,EAAI,EAAGA,EAAIqN,EAAerN,IAAK,CACpC,MAAMsN,EAAW5J,EAAU1D,CAAC,EAC5B,IAAIoE,EAAYkD,GAAa,OACzBoG,EACAxJ,EAAQ,EAEZ,OAAQqJ,EAAavN,CAAC,EAClB,CAAA,KAAK2N,GACD,GAAI,CAAC7D,GAAawD,aAAoBpD,GAAmB,SACzDwD,EAAgBvJ,EAChBD,EAAQ8J,EACR,MACJ,KAAKE,GACDR,EAAgB5G,EAAS,MACzB5C,EAAQ8J,EACR,MACJ,KAAKG,GACDT,EAAgBvJ,EAChBD,EAAQ6J,EACR,MACJ,KAAKK,GACDV,EAAgB5G,EAAS,MACzB5C,EAAQ6J,EACR,MACJ,QACIL,EAAgB5G,EAAS,MACzB,MAAMuH,EAAUJ,EAAgBjO,CAAC,EAEjCkE,EAAQ6J,EAAY,KAAK,IAAI,EAAG,EAAIM,EAAQ,QAAUA,EAAQ,WAAW,EACzE,KACR,CACAxB,EAAK,YAAc3I,EAEf,CAACsJ,GAAoBF,aAAoB1G,GACzC,KAAK,oBAAoB0G,EAAUtO,EAAUmO,EAAWjJ,EAAOwJ,EAAeb,EAAK,kBAAmB7M,GAAK,EAAGyN,CAAU,EACnHH,aAAoB1E,GAAoB,KAAK,wBAAwB0E,EAAUtO,EAAUmO,EAAWO,EAAeI,CAAW,GAGnIrN,EAAM,sBAAsByD,EAAOC,CAAK,EACpC2F,GAAawD,aAAoBpD,IAAqBwD,GAAiB5G,EAAS,QAAO1C,EAAYkD,GAAa,OACpHgG,EAAS,MAAMtO,EAAUiO,EAAeE,EAAWlJ,EAAQC,EAAOwJ,EAAetJ,CAAS,EAElG,CACJ,CAEA,OAAI0I,EAAG,YAAc,GAAG,KAAK,YAAYD,EAAMK,CAAa,EAC5D,KAAK,OAAO,OAAS,EACrBL,EAAK,kBAAoBK,EACzBL,EAAK,cAAgBA,EAAK,UAEnBxC,CACX,CAEA,wBAAwBiD,EAA8BtO,EAAoB+E,EAAcI,EAAiB2J,EAAsB,CAC3H,MAAMpP,EAAOM,EAAS,MAAMsO,EAAS,SAAS,EAEzC5O,EAAK,KAAK,SAEXqF,EAAOuJ,EAAS,OAAO,CAAC,GAEpBnJ,GAAS2C,EAAS,OAAS3C,GAAS2C,EAAS,QAAO,KAAK,cAAc9H,EAAUN,EAAMA,EAAK,KAAK,eAAgBoP,CAAW,EAC7H,KAAK,cAAc9O,EAAUN,EAAM4O,EAAS,gBAAgBhJ,EAAS,QAAQgJ,EAAS,OAAQvJ,CAAI,CAAC,EAAG+J,CAAW,EAGpHpP,EAAK,iBAAmB,KAAK,eAAcA,EAAK,gBAAkB,KAAK,aAAemP,IAC9F,CAEA,cAAc7O,EAAoBN,EAAYmK,EAA+BiF,EAAsB,CAC/FpP,EAAK,cAAemK,EAAwB7J,EAAS,cAAcN,EAAK,KAAK,MAAOmK,CAAc,EAA7D,IAA8D,EAC/FiF,IAAapP,EAAK,gBAAkB,KAAK,aAAe4P,GAChE,CAEA,oBACIhB,EACAtO,EACA+E,EACAG,EACAC,EACAoK,EACAvO,EACAyN,EACF,CAGE,GAFIA,IAAYc,EAAkBvO,CAAC,EAAI,GAEnCkE,GAAS,EAAG,CACZoJ,EAAS,MAAMtO,EAAU,EAAG+E,EAAM,KAAM,EAAGI,EAAOmD,GAAa,KAAK,EAEpE,MACJ,CAEA,MAAMjG,EAAOrC,EAAS,MAAMsO,EAAS,SAAS,EAE9C,GAAI,CAACjM,EAAK,OAAQ,OAClB,MAAMoD,EAAS6I,EAAS,OACxB,IAAIkB,EAAK,EACLpG,EAAK,EAET,GAAIrE,EAAOU,EAAO,CAAC,EACf,OAAQN,GACJ,KAAK2C,EAAS,MACVzF,EAAK,SAAWA,EAAK,KAAK,SAC9B,QACI,OACJ,KAAKyF,EAAS,MACV0H,EAAKnN,EAAK,SACV+G,EAAK/G,EAAK,KAAK,QACvB,MAEAmN,EAAKrK,GAAS2C,EAAS,MAAQzF,EAAK,KAAK,SAAWA,EAAK,SACzD+G,EAAK/G,EAAK,KAAK,SAAWiM,EAAS,cAAcvJ,CAAI,EAIzD,IAAI0K,EAAQ,EACRC,EAAOtG,EAAKoG,EAGhB,GADAE,IAAS,OAAU,mBAAqBA,EAAO,IAAO,IAAM,IACxDA,GAAQ,EACRD,EAAQF,EAAkBvO,CAAC,MACxB,CACH,IAAI2O,EAAY,EACZC,EAAW,EAEXnB,GACAkB,EAAY,EACZC,EAAWF,IAEXC,EAAYJ,EAAkBvO,CAAC,EAC/B4O,EAAWL,EAAkBvO,EAAI,CAAC,GAEtC,MAAMyM,EAAUiC,EAAO,EACvB,IAAIG,EAAMF,GAAa,EAGnBnN,EAAU,OAAOoN,CAAQ,GAAKpN,EAAU,OAAOkN,CAAI,GAAK,KAAK,IAAIE,CAAQ,GAAK,KAE1E,KAAK,IAAID,CAAS,EAAI,MAAKA,GAAa,IAAMnN,EAAU,OAAOmN,CAAS,GAC5EE,EAAMpC,GAEVgC,EAAQC,EAAOC,EAAaA,EAAY,IACpCE,GAAOpC,IAASgC,GAAS,IAAMjN,EAAU,OAAOmN,CAAS,GAC7DJ,EAAkBvO,CAAC,EAAIyO,CAC3B,CACAF,EAAkBvO,EAAI,CAAC,EAAI0O,EAC3BrN,EAAK,SAAWmN,EAAKC,EAAQvK,CACjC,CAEA,YAAY4K,EAAmB5B,EAAuB,CAClD,MAAM6B,EAAiBD,EAAM,eACvBE,EAAeF,EAAM,aACrBnL,EAAWqL,EAAeD,EAC1BE,EAAmBH,EAAM,UAAYnL,EAGrCM,EAAS,KAAK,OACpB,IAAIjE,EAAI,EACR,MAAMC,EAAIgE,EAAO,OAEjB,KAAOjE,EAAIC,EAAGD,IAAK,CACf,MAAM0J,EAAQzF,EAAOjE,CAAC,EAEtB,GAAI0J,EAAM,KAAOuF,EAAkB,MAC/BvF,EAAM,KAAOsF,GACjB,KAAK,MAAM,MAAMF,EAAOpF,CAAK,CACjC,CAGA,IAAIwF,EAAW,GAOf,IALIJ,EAAM,KAAMI,EAAWvL,GAAY,GAAKsL,EAAmBH,EAAM,UAAYnL,EAC5EuL,EAAWhC,GAAiB8B,GAAgBF,EAAM,cAAgBE,EACnEE,GAAU,KAAK,MAAM,SAASJ,CAAK,EAGhC9O,EAAIC,EAAGD,IAAK,CACf,MAAM0J,EAAQzF,EAAOjE,CAAC,EAElB0J,EAAM,KAAOqF,GACjB,KAAK,MAAM,MAAMD,EAAOpF,CAAK,CACjC,CACJ,CAMA,aAAc,CACV,MAAMyF,EAAmB,KAAK,MAAM,cAEpC,KAAK,MAAM,cAAgB,GAC3B,QAASnP,EAAI,EAAGC,EAAI,KAAK,OAAO,OAAQD,EAAIC,EAAGD,IAAK,KAAK,WAAWA,CAAC,EACrE,KAAK,OAAO,OAAS,EACrB,KAAK,MAAM,cAAgBmP,EAC3B,KAAK,MAAM,MAAM,CACrB,CAMA,WAAWC,EAAoB,CAC3B,GAAIA,GAAc,KAAK,OAAO,OAAQ,OACtC,MAAM3C,EAAU,KAAK,OAAO2C,CAAU,EAEtC,GAAI,CAAC3C,EAAS,OAEd,KAAK,MAAM,IAAIA,CAAO,EAEtB,KAAK,UAAUA,CAAO,EAEtB,IAAIqC,EAAQrC,EAEZ,OAAa,CACT,MAAMI,EAAOiC,EAAM,WAEnB,GAAI,CAACjC,EAAM,MACX,KAAK,MAAM,IAAIA,CAAI,EACnBiC,EAAM,WAAa,KACnBA,EAAM,SAAW,KACjBA,EAAQjC,CACZ,CAEA,KAAK,OAAOJ,EAAQ,UAAU,EAAI,KAElC,KAAK,MAAM,OACf,CAEA,WAAWxJ,EAAewJ,EAAqB4C,EAAoB,CAC/D,MAAMxC,EAAO,KAAK,cAAc5J,CAAK,EAErC,KAAK,OAAOA,CAAK,EAAIwJ,EACrBA,EAAQ,SAAW,KAEfI,IACIwC,GAAW,KAAK,MAAM,UAAUxC,CAAI,EACxCJ,EAAQ,WAAaI,EACrBA,EAAK,SAAWJ,EAChBA,EAAQ,QAAU,EAGdI,EAAK,YAAcA,EAAK,YAAc,IAAGJ,EAAQ,gBAAkB,KAAK,IAAI,EAAGI,EAAK,QAAUA,EAAK,WAAW,GAElHA,EAAK,kBAAkB,OAAS,GAGpC,KAAK,MAAM,MAAMJ,CAAO,CAC5B,CAKA,aAAa2C,EAAoBE,EAAuBtL,EAAO,GAAO,CAClE,MAAMuL,EAAY,KAAK,KAAK,aAAa,cAAcD,CAAa,EAEpE,GAAI,CAACC,EAAW,MAAM,IAAI,MAAM,wBAAwBD,GAAe,EAEvE,OAAO,KAAK,iBAAiBF,EAAYG,EAAWvL,CAAI,CAC5D,CAQA,iBAAiBoL,EAAoBG,EAAsBvL,EAAO,GAAO,CACrE,GAAI,CAACuL,EAAW,MAAM,IAAI,MAAM,2BAA2B,EAC3D,IAAIF,EAAY,GACZ5C,EAAU,KAAK,cAAc2C,CAAU,EAEvC3C,IACIA,EAAQ,eAAiB,IAEzB,KAAK,OAAO2C,CAAU,EAAI3C,EAAQ,WAClC,KAAK,MAAM,UAAUA,CAAO,EAC5B,KAAK,MAAM,IAAIA,CAAO,EACtB,KAAK,UAAUA,CAAO,EACtBA,EAAUA,EAAQ,WAClB4C,EAAY,IACT,KAAK,UAAU5C,CAAO,GAEjC,MAAMqC,EAAQ,KAAK,WAAWM,EAAYG,EAAWvL,EAAMyI,CAAO,EAElE,YAAK,WAAW2C,EAAYN,EAAOO,CAAS,EAC5C,KAAK,MAAM,QAEJP,CACX,CAKA,aAAaM,EAAoBE,EAAuBtL,EAAO,GAAOgI,EAAQ,EAAG,CAC7E,MAAMuD,EAAY,KAAK,KAAK,aAAa,cAAcD,CAAa,EAEpE,GAAI,CAACC,EAAW,MAAM,IAAI,MAAM,wBAAwBD,GAAe,EAEvE,OAAO,KAAK,iBAAiBF,EAAYG,EAAWvL,EAAMgI,CAAK,CACnE,CAUA,iBAAiBoD,EAAoBG,EAAsBvL,EAAO,GAAOgI,EAAQ,EAAG,CAChF,GAAI,CAACuD,EAAW,MAAM,IAAI,MAAM,2BAA2B,EAE3D,IAAIC,EAAO,KAAK,cAAcJ,CAAU,EAExC,GAAII,EACA,KAAOA,EAAK,MAAMA,EAAOA,EAAK,KAGlC,MAAMV,EAAQ,KAAK,WAAWM,EAAYG,EAAWvL,EAAMwL,CAAI,EAE/D,OAAKA,GAIDA,EAAK,KAAOV,EACZA,EAAM,SAAWU,EACbxD,GAAS,IAAGA,GAASwD,EAAK,iBAAiB,EAAIV,EAAM,eALzD,KAAK,WAAWM,EAAYN,EAAO,EAAI,EACvC,KAAK,MAAM,SAOfA,EAAM,MAAQ9C,EAEP8C,CACX,CAgBA,kBAAkBM,EAAoBK,EAAc,EAAG,CACnD,MAAMX,EAAQ,KAAK,iBAAiBM,EAAYjD,GAAe,eAAe,EAAG,EAAK,EAEtF,OAAA2C,EAAM,YAAcW,EACpBX,EAAM,SAAWW,EAEVX,CACX,CAaA,kBAAkBM,EAAoBK,EAAc,EAAGzD,EAAQ,EAAG,CAC9D,MAAM8C,EAAQ,KAAK,iBAAiBM,EAAYjD,GAAe,eAAkB,EAAA,GAAOH,CAAK,EAE7F,OAAIA,GAAS,IAAG8C,EAAM,OAASA,EAAM,YAAcW,GACnDX,EAAM,YAAcW,EACpBX,EAAM,SAAWW,EAEVX,CACX,CAIA,mBAAmBW,EAAc,EAAG,CAChC,MAAMN,EAAmB,KAAK,MAAM,cAEpC,KAAK,MAAM,cAAgB,GAC3B,QAASnP,EAAI,EAAGC,EAAI,KAAK,OAAO,OAAQD,EAAIC,EAAGD,IAAK,CAChD,MAAMyM,EAAU,KAAK,OAAOzM,CAAC,EAEzByM,GAAS,KAAK,kBAAkBA,EAAQ,WAAYgD,CAAW,CACvE,CACA,KAAK,MAAM,cAAgBN,EAC3B,KAAK,MAAM,MAAA,CACf,CAEA,cAAclM,EAAe,CACzB,OAAIA,EAAQ,KAAK,OAAO,OAAe,KAAK,OAAOA,CAAK,GACxDxC,EAAM,oBAAoB,KAAK,OAAQwC,EAAQ,EAAG,IAAI,EACtD,KAAK,OAAO,OAASA,EAAQ,EAEtB,KACX,CAGA,WAAWmM,EAAoBG,EAAsBvL,EAAewL,EAAyB,CACzF,MAAMV,EAAQ,KAAK,eAAe,OAElC,EAAA,OAAAA,EAAM,MAAM,EACZA,EAAM,WAAaM,EACnBN,EAAM,UAAYS,EAClBT,EAAM,KAAO9K,EACb8K,EAAM,aAAe,GAErBA,EAAM,QAAU,GAChBA,EAAM,iBAAmB,GAEzBA,EAAM,eAAiB,EACvBA,EAAM,oBAAsB,EAC5BA,EAAM,mBAAqB,EAE3BA,EAAM,eAAiB,EACvBA,EAAM,aAAeS,EAAU,SAC/BT,EAAM,cAAgB,GACtBA,EAAM,kBAAoB,GAE1BA,EAAM,MAAQ,EACdA,EAAM,UAAY,EAClBA,EAAM,UAAY,GAClBA,EAAM,cAAgB,GACtBA,EAAM,SAAW,OAAO,UACxBA,EAAM,UAAY,EAElBA,EAAM,MAAQ,EACdA,EAAM,QAAU,EAChBA,EAAM,YAAeU,EAAW,KAAK,KAAK,OAAOA,EAAK,UAAWD,CAAS,EAA9C,EAC5BT,EAAM,eAAiB,EACvBA,EAAM,WAAa,EACnBA,EAAM,SAAWhI,EAAS,QAEnBgI,CACX,CAGA,UAAUA,EAAmB,CACzB,IAAInC,EAAOmC,EAAM,KAEjB,KAAOnC,GACH,KAAK,MAAM,QAAQA,CAAI,EACvBA,EAAOA,EAAK,KAEhBmC,EAAM,KAAO,IACjB,CAEA,oBAAqB,CACjB,KAAK,kBAAoB,GAEzB,KAAK,YAAY,QACjB,MAAMtC,EAAS,KAAK,OAEpB,QAASxM,EAAI,EAAGC,EAAIuM,EAAO,OAAQxM,EAAIC,EAAGD,IAAK,CAC3C,IAAI8O,EAAQtC,EAAOxM,CAAC,EAEpB,GAAK8O,EACL,CAAOA,KAAAA,EAAM,YAAYA,EAAQA,EAAM,WACvC,GACQ,CAACA,EAAM,UAAYA,EAAM,UAAYhI,EAAS,MAAK,KAAK,YAAYgI,CAAK,EAC7EA,EAAQA,EAAM,eACTA,EACb,CAAA,CACJ,CAEA,YAAYA,EAAmB,CAC3B,MAAMhC,EAAKgC,EAAM,SACXpL,EAAYoL,EAAM,UAAU,UAC5BY,EAAiBZ,EAAM,UAAU,UAAU,OAC3CvB,EAAeuB,EAAM,aAE3BvB,EAAa,OAASmC,EACtB,MAAMzB,EAAkBa,EAAM,gBAE9Bb,EAAgB,OAAS,EACzB,MAAM0B,EAAc,KAAK,YAEzB,GAAI7C,GAAMA,EAAG,aAAc,CACvB,QAAS9M,EAAI,EAAGA,EAAI0P,EAAgB1P,IAAKuN,EAAavN,CAAC,EAAI2P,EAAY,OAAOjM,EAAU1D,CAAC,EAAE,eAAgB,CAAA,EAAIoO,GAAaD,GAE5H,MACJ,CAGAyB,EAAO,QAAS5P,EAAI,EAAGA,EAAI0P,EAAgB1P,IAAK,CAC5C,MAAMsN,EAAW5J,EAAU1D,CAAC,EACtB6D,EAAMyJ,EAAS,eAErB,EAAA,GAAI,CAACqC,EAAY,OAAO9L,CAAG,EAAG0J,EAAavN,CAAC,EAAI2N,WAE5C,CAACb,GACDQ,aAAoB1E,IACpB0E,aAAoBpD,IACpBoD,aAAoB1D,IACpB,CAACkD,EAAG,UAAU,YAAYjJ,CAAG,EAE7B0J,EAAavN,CAAC,EAAIkO,OACf,CACH,QAASvB,EAAOG,EAAG,SAAUH,EAAMA,EAAOA,EAAK,SAC3C,GAAI,CAAAA,EAAK,UAAU,YAAY9I,CAAG,EAClC,CAAIiL,GAAAA,EAAM,YAAc,EAAG,CACvBvB,EAAavN,CAAC,EAAI6P,GAClB5B,EAAgBjO,CAAC,EAAI2M,EAErB,SAASiD,CACb,CACA,KAAA,CAEJrC,EAAavN,CAAC,EAAIoO,EACtB,CACJ,CACJ,CAGA,WAAWgB,EAAoB,CAC3B,OAAIA,GAAc,KAAK,OAAO,OAAe,KAEtC,KAAK,OAAOA,CAAU,CACjC,CAGA,YAAYU,EAAkC,CAC1C,GAAI,CAACA,EAAU,MAAM,IAAI,MAAM,0BAA0B,EACzD,KAAK,UAAU,KAAKA,CAAQ,CAChC,CAGA,eAAeA,EAAkC,CAC7C,MAAM7M,EAAQ,KAAK,UAAU,QAAQ6M,CAAQ,EAEzC7M,GAAS,GAAG,KAAK,UAAU,OAAOA,EAAO,CAAC,CAClD,CAGA,gBAAiB,CACb,KAAK,UAAU,OAAS,CAC5B,CAKA,4BAA6B,CACzB,KAAK,MAAM,MACf,CAAA,CAUA,mBAAmBmM,EAAoBE,EAAuBtL,EAAe,CACpEmI,GAAe,qBAChBA,GAAe,mBAAqB,GACpC,QAAQ,KAAK,kHAAkH,GAEnI,KAAK,aAAaiD,EAAYE,EAAetL,CAAI,CACrD,CAIA,mBAAmBoL,EAAoBE,EAAuBtL,EAAegI,EAAe,CACnFG,GAAe,qBAChBA,GAAe,mBAAqB,GACpC,QAAQ,KAAK,kHAAkH,GAEnI,KAAK,aAAaiD,EAAYE,EAAetL,EAAMgI,CAAK,CAC5D,CAIA,aAAasD,EAAgC,CAGzC,OAFkB,KAAK,KAAK,aAAa,cAAcA,CAAa,IAE/C,IACzB,CAEA,mBAAmBA,EAAgC,CAC/C,OAAKnD,GAAe,qBAChBA,GAAe,mBAAqB,GACpC,QAAQ,KAAK,kHAAkH,GAG5H,KAAK,aAAamD,CAAa,CAC1C,CACJ,EAx1BO,IAAMS,GAAN5D,GAAM4D,GACF,gBAAkB,IAAItM,GAAU,UAAW,GAAI,CAAC,EAD9CsM,GAozBM,mBAAqB,GApzB3BA,GA8zBM,mBAAqB,GA9zB3BA,GAw0BM,mBAAqB,GAuBjC,MAAMC,GAAN,KAAwC,CAAxC,cAEH,KAA8B,UAAA,KAE9B,cAA8B,KAG9B,KAAA,KAA0B,KAI1B,KAAgC,WAAA,KAIhC,cAA8B,KAM9B,KAAA,SAA0C,KAK1C,KAAa,WAAA,EAIb,UAAO,GAaP,KAAA,aAAe,GAEf,KAAU,QAAA,GAEV,sBAAmB,GAKnB,KAAA,eAAiB,EAKjB,KAAsB,oBAAA,EAKtB,wBAAqB,EAMrB,KAAA,eAAiB,EAIjB,KAAe,aAAA,EAMf,mBAAgB,EAEhB,KAAA,kBAAoB,EAQpB,KAAQ,MAAA,EAKR,eAAY,EAEZ,KAAA,UAAY,EACZ,KAAgB,cAAA,EAShB,cAAW,EAaX,KAAA,UAAY,EAOZ,KAAQ,MAAA,EAIR,aAAU,EAeV,KAAA,YAAc,EACd,KAAiB,eAAA,EACjB,gBAAa,EAQb,KAAA,SAAWlJ,EAAS,QACpB,KAAA,aAAe,IAAI,MACnB,KAAA,gBAAkB,IAAI,MACtB,KAAA,kBAAoB,IAAI,KAExB,CAAA,OAAQ,CACJ,KAAK,KAAO,KACZ,KAAK,SAAW,KAChB,KAAK,WAAa,KAClB,KAAK,SAAW,KAChB,KAAK,UAAY,KACjB,KAAK,SAAW,KAChB,KAAK,aAAa,OAAS,EAC3B,KAAK,gBAAgB,OAAS,EAC9B,KAAK,kBAAkB,OAAS,CACpC,CAKA,kBAAmB,CACf,GAAI,KAAK,KAAM,CACX,MAAMnD,EAAW,KAAK,aAAe,KAAK,eAE1C,OAAIA,GAAY,EAAU,KAAK,eAEvB,KAAK,UAAYA,EAAY,KAAK,cAC9C,CAEA,OAAO,KAAK,IAAI,KAAK,UAAY,KAAK,eAAgB,KAAK,YAAY,CAC3E,CAEA,iBAAiBsJ,EAAuB,CACpC,KAAK,cAAgBA,EACrB,KAAK,kBAAoBA,CAC7B,CAKA,YAAa,CACT,OAAO,KAAK,WAAa,KAAK,aAAe,KAAK,cACtD,CASA,yBAA0B,CACtB,KAAK,kBAAkB,OAAS,CACpC,CAEA,kBAAmB,CACf,MAAMtJ,EAAW,KAAK,aAAe,KAAK,eAE1C,GAAIA,GAAY,EAAG,CACf,GAAI,KAAK,KAAM,OAAOA,GAAY,GAAM,KAAK,UAAYA,EAAY,IACrE,GAAI,KAAK,UAAYA,EAAU,OAAOA,CAC1C,CAEA,OAAO,KAAK,SAChB,CAWA,IAAI,MAAO,CACP,OAAKqM,GAAW,qBACZA,GAAW,mBAAqB,GAChC,QAAQ,KAAK,6FAA6F,GAGvG,KAAK,SAChB,CAEA,IAAI,KAAKhL,EAAe,CACfgL,GAAW,qBACZA,GAAW,mBAAqB,GAChC,QAAQ,KAAK,6FAA6F,GAE9G,KAAK,UAAYhL,CACrB,CAEA,IAAI,SAAU,CACV,OAAKgL,GAAW,qBACZA,GAAW,mBAAqB,GAChC,QAAQ,KAAK,+FAA+F,GAGzG,KAAK,SAChB,CAEA,IAAI,QAAQhL,EAAe,CAClBgL,GAAW,qBACZA,GAAW,mBAAqB,GAChC,QAAQ,KAAK,+FAA+F,GAEhH,KAAK,UAAYhL,CACrB,CAEA,YAAa,CACT,OAAO,KAAK,MAAM,KAAK,UAAY,KAAK,QAAQ,CACpD,CACJ,MA1QasH,GAAN0D,GAAM1D,GAkOM,mBAA8B,GAlOpCA,GAmOM,mBAA8B,SA4CpCF,EAAW,CAKpB,YAAY6D,EAA2B,CAJvC,aAAsB,CAAA,EACtB,mBAAgB,GAIZ,KAAK,UAAYA,CACrB,CAEA,MAAMnB,EAAmB,CACrB,KAAK,QAAQ,KAAKoB,EAAU,KAAK,EACjC,KAAK,QAAQ,KAAKpB,CAAK,EACvB,KAAK,UAAU,kBAAoB,EACvC,CAEA,UAAUA,EAAmB,CACzB,KAAK,QAAQ,KAAKoB,EAAU,SAAS,EACrC,KAAK,QAAQ,KAAKpB,CAAK,CAC3B,CAEA,IAAIA,EAAmB,CACnB,KAAK,QAAQ,KAAKoB,EAAU,GAAG,EAC/B,KAAK,QAAQ,KAAKpB,CAAK,EACvB,KAAK,UAAU,kBAAoB,EACvC,CAEA,QAAQA,EAAmB,CACvB,KAAK,QAAQ,KAAKoB,EAAU,OAAO,EACnC,KAAK,QAAQ,KAAKpB,CAAK,CAC3B,CAEA,SAASA,EAAmB,CACxB,KAAK,QAAQ,KAAKoB,EAAU,QAAQ,EACpC,KAAK,QAAQ,KAAKpB,CAAK,CAC3B,CAEA,MAAMA,EAAmBpF,EAAc,CACnC,KAAK,QAAQ,KAAKwG,EAAU,KAAK,EACjC,KAAK,QAAQ,KAAKpB,CAAK,EACvB,KAAK,QAAQ,KAAKpF,CAAK,CAC3B,CAEA,OAAQ,CACJ,GAAI,KAAK,cAAe,OACxB,KAAK,cAAgB,GAErB,MAAMyG,EAAU,KAAK,QACfC,EAAY,KAAK,UAAU,UAEjC,QAASpQ,EAAI,EAAGA,EAAImQ,EAAQ,OAAQnQ,GAAK,EAAG,CACxC,MAAMqQ,EAAOF,EAAQnQ,CAAC,EAChB8O,EAAQqB,EAAQnQ,EAAI,CAAC,EAE3B,OAAQqQ,GACJ,KAAKH,EAAU,MACPpB,EAAM,UAAYA,EAAM,SAAS,OAAOA,EAAM,SAAS,MAAMA,CAAK,EACtE,QAASxI,EAAK,EAAGA,EAAK8J,EAAU,OAAQ9J,IAAM,CAC1C,MAAMwJ,EAAWM,EAAU9J,CAAE,EAEzBwJ,EAAS,OAAOA,EAAS,MAAMhB,CAAK,CAC5C,CACA,MACJ,KAAKoB,EAAU,UACPpB,EAAM,UAAYA,EAAM,SAAS,WAAWA,EAAM,SAAS,UAAUA,CAAK,EAC9E,QAASxI,EAAK,EAAGA,EAAK8J,EAAU,OAAQ9J,IAAM,CAC1C,MAAMwJ,EAAWM,EAAU9J,CAAE,EAEzBwJ,EAAS,WAAWA,EAAS,UAAUhB,CAAK,CACpD,CACA,MACJ,KAAKoB,EAAU,IACPpB,EAAM,UAAYA,EAAM,SAAS,KAAKA,EAAM,SAAS,IAAIA,CAAK,EAClE,QAASxI,EAAK,EAAGA,EAAK8J,EAAU,OAAQ9J,IAAM,CAC1C,MAAMwJ,EAAWM,EAAU9J,CAAE,EAEzBwJ,EAAS,KAAKA,EAAS,IAAIhB,CAAK,CACxC,CAEJ,KAAKoB,EAAU,QACPpB,EAAM,UAAYA,EAAM,SAAS,SAASA,EAAM,SAAS,QAAQA,CAAK,EAC1E,QAASxI,EAAK,EAAGA,EAAK8J,EAAU,OAAQ9J,IAAM,CAC1C,MAAMwJ,EAAWM,EAAU9J,CAAE,EAEzBwJ,EAAS,SAASA,EAAS,QAAQhB,CAAK,CAChD,CACA,KAAK,UAAU,eAAe,KAAKA,CAAK,EACxC,MACJ,KAAKoB,EAAU,SACPpB,EAAM,UAAYA,EAAM,SAAS,UAAUA,EAAM,SAAS,SAASA,CAAK,EAC5E,QAASxI,EAAK,EAAGA,EAAK8J,EAAU,OAAQ9J,IAAM,CAC1C,MAAMwJ,EAAWM,EAAU9J,CAAE,EAEzBwJ,EAAS,UAAUA,EAAS,SAAShB,CAAK,CAClD,CACA,MACJ,KAAKoB,EAAU,MACX,MAAMxG,EAAQyG,EAAQnQ,IAAM,CAAC,EAEzB8O,EAAM,UAAYA,EAAM,SAAS,OAAOA,EAAM,SAAS,MAAMA,EAAOpF,CAAK,EAC7E,QAASpD,EAAK,EAAGA,EAAK8J,EAAU,OAAQ9J,IAAM,CAC1C,MAAMwJ,EAAWM,EAAU9J,CAAE,EAEzBwJ,EAAS,OAAOA,EAAS,MAAMhB,EAAOpF,CAAK,CACnD,CACA,KACR,CACJ,CACA,KAAK,MAEL,EAAA,KAAK,cAAgB,EACzB,CAEA,OAAQ,CACJ,KAAK,QAAQ,OAAS,CAC1B,CACJ,CAKO,IAAKwG,GAAAA,IACRA,EAAAA,EAAA,iBACAA,EAAAI,EAAA,UAAA,CAAA,EAAA,YACAJ,IAAA,IACAA,CAAAA,EAAAA,MAAAA,EAAAA,EAAA,qBACAA,EAAAI,EAAA,SAAA,CAAA,EAAA,WACAJ,IAAA,MANQA,CAAAA,EAAAA,QAAAA,IAAAA,OAyCU,MAAAK,EAAwD,CAC1E,MAAMzB,EAAmB,EAEzB,UAAUA,EAAmB,EAE7B,IAAIA,EAAmB,CAAA,CAEvB,QAAQA,EAAmB,CAAA,CAE3B,SAASA,EAAmB,CAE5B,CAAA,MAAMA,EAAmBpF,EAAc,EAC3C,CAKA,MAAMiE,GAAa,EAKbO,GAAQ,EAMRC,GAAkB,EAMlBC,GAAa,EAabyB,GAAW,EAEXhC,GAAQ,EACRS,GAAU,ECv0CH,MAAAkC,EAA2E,CASpF,YAAYC,EAA4B,CACpC,GANJ,KAAwC,mBAAA,GAGxC,KAAA,WAAa,EAGL,CAACA,EAAc,MAAM,IAAI,MAAM,8BAA8B,EACjE,KAAK,aAAeA,CACxB,CAKA,OAAOC,EAAkBC,EAAgBhN,EAAkB,CACvD,MAAMkJ,EAAO,KAAK,aAAa,cAAc6D,CAAQ,EAErD,GAAI,CAAC7D,EAAM,MAAM,IAAI,MAAM,wBAAwB6D,GAAU,EAC7D,MAAM5D,EAAK,KAAK,aAAa,cAAc6D,CAAM,EAEjD,GAAI,CAAC7D,EAAI,MAAM,IAAI,MAAM,wBAAwB6D,GAAQ,EACzD,KAAK,WAAW9D,EAAMC,EAAInJ,CAAQ,CACtC,CAKA,WAAWkJ,EAAiBC,EAAenJ,EAAkB,CACzD,GAAI,CAACkJ,EAAM,MAAM,IAAI,MAAM,sBAAsB,EACjD,GAAI,CAACC,EAAI,MAAM,IAAI,MAAM,oBAAoB,EAC7C,MAAM8D,EAAM,GAAG/D,EAAK,QAAQC,EAAG,OAE/B,KAAK,mBAAmB8D,CAAG,EAAIjN,CACnC,CAIA,OAAOkJ,EAAiBC,EAAe,CACnC,MAAM8D,EAAM,GAAG/D,EAAK,QAAQC,EAAG,OACzB9H,EAAQ,KAAK,mBAAmB4L,CAAG,EAEzC,OAAO5L,IAAU,OAAY,KAAK,WAAaA,CACnD,CACJ,CC9CO,MAAM6L,EAAkD,CAG3D,YAAYC,EAAqB,CAC7B,KAAK,MAAQA,CACjB,CAEA,aAAatS,EAAc0E,EAAkB6N,EAAoB,CAC7D,MAAMC,EAAUD,EAAS,QAEzB,QAAS/Q,EAAI,EAAGC,EAAI+Q,EAAQ,OAAQhR,EAAIC,EAAGD,IAAK,CAC5C,MAAMiB,EAAO8P,EAAS,QAAQ7N,EAAUlD,CAAC,EACnC2B,EAAS,KAAK,MAAM,WAAWV,CAAI,EAEzC,GAAIU,GAAU,KAAM,MAAM,IAAI,MAAM,8BAA8BV,gBAAmBzC,IAAO,EAC5FwS,EAAQhR,CAAC,EAAI2B,EACbqP,EAAQhR,CAAC,EAAE,aAAegR,EAAQhR,CAAC,CACvC,CACJ,CAEA,oBAAoBiR,EAAYzS,EAAcyC,EAAc8P,EAAsC,CAC9F,MAAMvQ,EAAa,IAAIuC,EAAiBvE,EAAMyC,CAAI,EAElD,GAAI8P,GAAY,KACZ,KAAK,aAAavS,EAAMyC,EAAM8P,CAAQ,MACnC,CACH,MAAMpP,EAAS,KAAK,MAAM,WAAWV,CAAI,EAEzC,GAAI,CAACU,EAAQ,MAAM,IAAI,MAAM,8BAA8BV,yBAA4BzC,IAAO,EAC9FmD,EAAO,aAAeA,EACtBnB,EAAW,OAASmB,CACxB,CAEA,OAAOnB,CACX,CAEA,kBAAkByQ,EAAYzS,EAAcyC,EAAc8P,EAAoC,CAC1F,MAAMvQ,EAAa,IAAIQ,GAAexC,EAAMyC,CAAI,EAEhD,GAAI8P,GAAY,KACZ,KAAK,aAAavS,EAAMyC,EAAM8P,CAAQ,MACnC,CACH,MAAMpP,EAAS,KAAK,MAAM,WAAWV,CAAI,EAEzC,GAAI,CAACU,EAAQ,MAAM,IAAI,MAAM,8BAA8BV,uBAA0BzC,IAAO,EAC5FmD,EAAO,aAAeA,EACtBnB,EAAW,OAASmB,CACxB,CAEA,OAAOnB,CACX,CAEA,yBAAyByQ,EAAYzS,EAAqC,CACtE,OAAO,IAAImC,GAAsBnC,CAAI,CACzC,CAEA,kBAAkByS,EAAYzS,EAA8B,CACxD,OAAO,IAAI2C,GAAe3C,CAAI,CAClC,CAEA,mBAAmByS,EAAYzS,EAA+B,CAC1D,OAAO,IAAI4C,GAAgB5C,CAAI,CACnC,CAEA,sBAAsByS,EAAYzS,EAAkC,CAChE,OAAO,IAAIuC,GAAmBvC,CAAI,CACtC,CACJ,CC7DO,MAAM0S,EAAiC,CAsE1C,YAAY/F,EAAgBnM,EAAoBmS,EAAqB,CACjE,GArEJ,YAAS,IAAIC,GAiBb,KAAsB,OAAA,KAGtB,cAAW,IAAI,MAGf,KAAI,EAAA,EAGJ,OAAI,EAGJ,KAAA,SAAW,EAGX,KAAA,OAAS,EAGT,KAAS,OAAA,EAGT,KAAS,OAAA,EAGT,KAAS,OAAA,EAGT,KAAK,GAAA,EAGL,QAAK,EAGL,KAAA,UAAY,EAGZ,KAAA,QAAU,EAGV,KAAU,QAAA,EAGV,KAAU,QAAA,EAGV,aAAU,EAEV,KAAA,OAAS,GACT,KAAA,OAAS,GAID,CAACjG,EAAM,MAAM,IAAI,MAAM,sBAAsB,EACjD,GAAI,CAACnM,EAAU,MAAM,IAAI,MAAM,0BAA0B,EACzD,KAAK,KAAOmM,EACZ,KAAK,SAAWnM,EAChB,KAAK,OAASmS,EACd,KAAK,eACT,CAAA,CAzEA,IAAI,QAAiB,CACjB,OAAO,KAAK,OAAO,EACvB,CAEA,IAAI,QAAiB,CACjB,OAAO,KAAK,OAAO,EACvB,CAuEA,UAAW,CACP,OAAO,KAAK,MAChB,CAGA,QAAS,CACL,KAAK,yBAAyB,KAAK,GAAI,KAAK,GAAI,KAAK,UAAW,KAAK,QAAS,KAAK,QAAS,KAAK,QAAS,KAAK,OAAO,CAC1H,CAKA,sBAAuB,CACnB,KAAK,yBAAyB,KAAK,EAAG,KAAK,EAAG,KAAK,SAAU,KAAK,OAAQ,KAAK,OAAQ,KAAK,OAAQ,KAAK,MAAM,CACnH,CAOA,yBAAyB9R,EAAWC,EAAW+R,EAAkBhG,EAAgBC,EAAgBgG,EAAgB/F,EAAgB,CAC7H,KAAK,GAAKlM,EACV,KAAK,GAAKC,EACV,KAAK,UAAY+R,EACjB,KAAK,QAAUhG,EACf,KAAK,QAAUC,EACf,KAAK,QAAUgG,EACf,KAAK,QAAU/F,EAEf,MAAM4F,EAAS,KAAK,OACdI,EAAI,KAAK,OAETC,EAAK,KAAK,SAAS,OACnBC,EAAKC,GAAS,MAAQ,CAAC,KAAK,SAAS,OAAS,KAAK,SAAS,OAElE,GAAI,CAACP,EAAQ,CAET,MAAMnS,EAAW,KAAK,SAChB2S,EAAYN,EAAW,GAAK9F,EAElCgG,EAAE,EAAI/P,EAAU,OAAO6P,EAAWC,CAAM,EAAIjG,EAASmG,EACrDD,EAAE,EAAI/P,EAAU,OAAOmQ,CAAS,EAAIrG,EAASkG,EAC7CD,EAAE,EAAI/P,EAAU,OAAO6P,EAAWC,CAAM,EAAIjG,EAASoG,EACrDF,EAAE,EAAI/P,EAAU,OAAOmQ,CAAS,EAAIrG,EAASmG,EAC7CF,EAAE,GAAKlS,EAAImS,EAAKxS,EAAS,EACzBuS,EAAE,GAAKjS,EAAImS,EAAKzS,EAAS,EAEzB,MACJ,CAEA,IAAI4S,EAAKT,EAAO,OAAO,EACnBU,EAAKV,EAAO,OAAO,EACnBW,EAAKX,EAAO,OAAO,EACnBY,EAAKZ,EAAO,OAAO,EAKvB,OAHAI,EAAE,GAAKK,EAAKvS,EAAIwS,EAAKvS,EAAI6R,EAAO,OAAO,GACvCI,EAAE,GAAKO,EAAKzS,EAAI0S,EAAKzS,EAAI6R,EAAO,OAAO,GAE/B,KAAK,KAAK,cACd,CAAA,KAAKa,GAAc,OAAQ,CACvB,MAAML,EAAYN,EAAW,GAAK9F,EAC5B0G,EAAKzQ,EAAU,OAAO6P,EAAWC,CAAM,EAAIjG,EAC3C6G,EAAK1Q,EAAU,OAAOmQ,CAAS,EAAIrG,EACnC6G,EAAK3Q,EAAU,OAAO6P,EAAWC,CAAM,EAAIjG,EAC3C+G,EAAK5Q,EAAU,OAAOmQ,CAAS,EAAIrG,EAEzCiG,EAAE,EAAIK,EAAKK,EAAKJ,EAAKM,EACrBZ,EAAE,EAAIK,EAAKM,EAAKL,EAAKO,EACrBb,EAAE,EAAIO,EAAKG,EAAKF,EAAKI,EACrBZ,EAAE,EAAIO,EAAKI,EAAKH,EAAKK,EAErB,MACJ,CACA,KAAKJ,GAAc,gBAAiB,CAChC,MAAML,EAAYN,EAAW,GAAK9F,EAElCgG,EAAE,EAAI/P,EAAU,OAAO6P,EAAWC,CAAM,EAAIjG,EAC5CkG,EAAE,EAAI/P,EAAU,OAAOmQ,CAAS,EAAIrG,EACpCiG,EAAE,EAAI/P,EAAU,OAAO6P,EAAWC,CAAM,EAAIjG,EAC5CkG,EAAE,EAAI/P,EAAU,OAAOmQ,CAAS,EAAIrG,EACpC,KACJ,CACA,KAAK0G,GAAc,uBAAwB,CACvC,IAAIK,EAAIT,EAAKA,EAAKE,EAAKA,EACnBQ,EAAM,EAEND,EAAI,MACJA,EAAI,KAAK,IAAIT,EAAKG,EAAKF,EAAKC,CAAE,EAAIO,EAClCT,GAAMJ,EACNM,GAAML,EACNI,EAAKC,EAAKO,EACVN,EAAKH,EAAKS,EACVC,EAAM,KAAK,MAAMR,EAAIF,CAAE,EAAIpQ,EAAU,SAErCoQ,EAAK,EACLE,EAAK,EACLQ,EAAM,GAAK,KAAK,MAAMP,EAAIF,CAAE,EAAIrQ,EAAU,QAE9C,MAAM+Q,EAAKlB,EAAWC,EAASgB,EACzBE,EAAKnB,EAAW9F,EAAS+G,EAAM,GAC/BL,EAAKzQ,EAAU,OAAO+Q,CAAE,EAAIlH,EAC5B6G,EAAK1Q,EAAU,OAAOgR,CAAE,EAAIlH,EAC5B6G,EAAK3Q,EAAU,OAAO+Q,CAAE,EAAIlH,EAC5B+G,EAAK5Q,EAAU,OAAOgR,CAAE,EAAIlH,EAElCiG,EAAE,EAAIK,EAAKK,EAAKJ,EAAKM,EACrBZ,EAAE,EAAIK,EAAKM,EAAKL,EAAKO,EACrBb,EAAE,EAAIO,EAAKG,EAAKF,EAAKI,EACrBZ,EAAE,EAAIO,EAAKI,EAAKH,EAAKK,EACrB,KACJ,CACA,KAAKJ,GAAc,QACnB,KAAKA,GAAc,oBAAqB,CACpC,MAAMzQ,EAAMC,EAAU,OAAO6P,CAAQ,EAC/B5P,EAAMD,EAAU,OAAO6P,CAAQ,EACrC,IAAIoB,GAAMb,EAAKrQ,EAAMsQ,EAAKpQ,GAAO+P,EAC7BkB,GAAMZ,EAAKvQ,EAAMwQ,EAAKtQ,GAAOgQ,EAC7BY,EAAI,KAAK,KAAKI,EAAKA,EAAKC,EAAKA,CAAE,EAE/BL,EAAI,OAASA,EAAI,EAAIA,GACzBI,GAAMJ,EACNK,GAAML,EACNA,EAAI,KAAK,KAAKI,EAAKA,EAAKC,EAAKA,CAAE,EAC3B,KAAK,KAAK,eAAiBV,GAAc,SAAWJ,EAAKG,EAAKF,EAAKC,EAAK,IAAMN,EAAK,GAAKC,EAAK,KAAIY,EAAI,CAACA,GAC1G,MAAMtL,EAAI,KAAK,GAAK,EAAI,KAAK,MAAM2L,EAAID,CAAE,EACnCE,EAAK,KAAK,IAAI5L,CAAC,EAAIsL,EACnBO,EAAK,KAAK,IAAI7L,CAAC,EAAIsL,EACnBJ,EAAKzQ,EAAU,OAAO8P,CAAM,EAAIjG,EAChC6G,EAAK1Q,EAAU,OAAO,GAAK+J,CAAM,EAAID,EACrC6G,EAAK3Q,EAAU,OAAO8P,CAAM,EAAIjG,EAChC+G,EAAK5Q,EAAU,OAAO,GAAK+J,CAAM,EAAID,EAE3CiG,EAAE,EAAIkB,EAAKR,EAAKU,EAAKR,EACrBZ,EAAE,EAAIkB,EAAKP,EAAKS,EAAKP,EACrBb,EAAE,EAAImB,EAAKT,EAAKW,EAAKT,EACrBZ,EAAE,EAAImB,EAAKR,EAAKU,EAAKR,EACrB,KACJ,CACJ,CACAb,EAAE,GAAKC,EACPD,EAAE,GAAKC,EACPD,EAAE,GAAKE,EACPF,EAAE,GAAKE,CACX,CAGA,gBAAiB,CACb,MAAMtG,EAAO,KAAK,KAElB,KAAK,EAAIA,EAAK,EACd,KAAK,EAAIA,EAAK,EACd,KAAK,SAAWA,EAAK,SACrB,KAAK,OAASA,EAAK,OACnB,KAAK,OAASA,EAAK,OACnB,KAAK,OAASA,EAAK,OACnB,KAAK,OAASA,EAAK,MACvB,CAGA,mBAAoB,CAChB,OAAO,KAAK,MAAM,KAAK,OAAO,EAAG,KAAK,OAAO,CAAC,EAAI3J,EAAU,MAChE,CAGA,mBAAoB,CAChB,OAAO,KAAK,MAAM,KAAK,OAAO,EAAG,KAAK,OAAO,CAAC,EAAIA,EAAU,MAChE,CAGA,gBAAiB,CACb,MAAM+P,EAAI,KAAK,OAEf,OAAO,KAAK,KAAKA,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,CAAC,CAC1C,CAGA,gBAAiB,CACb,MAAMA,EAAI,KAAK,OAEf,OAAO,KAAK,KAAKA,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,CAAC,CAC1C,CAUA,wBAAyB,CACrB,MAAMJ,EAAS,KAAK,OACdI,EAAI,KAAK,OAEf,GAAI,CAACJ,EAAQ,CACT,KAAK,GAAKI,EAAE,GAAK,KAAK,SAAS,EAC/B,KAAK,GAAKA,EAAE,GAAK,KAAK,SAAS,EAC/B,KAAK,UAAY,KAAK,MAAMA,EAAE,EAAGA,EAAE,CAAC,EAAI/P,EAAU,OAClD,KAAK,QAAU,KAAK,KAAK+P,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,CAAC,EAC9C,KAAK,QAAU,KAAK,KAAKA,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,CAAC,EAC9C,KAAK,QAAU,EACf,KAAK,QAAU,KAAK,MAAMA,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAGA,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,CAAC,EAAI/P,EAAU,OAEpF,MACJ,CACA,MAAMqR,EAAK1B,EAAO,OACZ2B,EAAM,GAAKD,EAAG,EAAIA,EAAG,EAAIA,EAAG,EAAIA,EAAG,GACnC7M,EAAKuL,EAAE,GAAKsB,EAAG,GACf5M,EAAKsL,EAAE,GAAKsB,EAAG,GAErB,KAAK,GAAK7M,EAAK6M,EAAG,EAAIC,EAAM7M,EAAK4M,EAAG,EAAIC,EACxC,KAAK,GAAK7M,EAAK4M,EAAG,EAAIC,EAAM9M,EAAK6M,EAAG,EAAIC,EACxC,MAAMC,EAAKD,EAAMD,EAAG,EACdG,EAAKF,EAAMD,EAAG,EACdI,EAAKH,EAAMD,EAAG,EACdK,EAAKJ,EAAMD,EAAG,EACdM,EAAKJ,EAAKxB,EAAE,EAAI0B,EAAK1B,EAAE,EACvB6B,EAAKL,EAAKxB,EAAE,EAAI0B,EAAK1B,EAAE,EACvB8B,EAAKL,EAAKzB,EAAE,EAAI2B,EAAK3B,EAAE,EACvB+B,EAAKN,EAAKzB,EAAE,EAAI2B,EAAK3B,EAAE,EAI7B,GAFA,KAAK,QAAU,EACf,KAAK,QAAU,KAAK,KAAK4B,EAAKA,EAAKE,EAAKA,CAAE,EACtC,KAAK,QAAU,KAAQ,CACvB,MAAME,EAAMJ,EAAKG,EAAKF,EAAKC,EAE3B,KAAK,QAAUE,EAAM,KAAK,QAC1B,KAAK,QAAU,KAAK,MAAMJ,EAAKC,EAAKC,EAAKC,EAAIC,CAAG,EAAI/R,EAAU,OAC9D,KAAK,UAAY,KAAK,MAAM6R,EAAIF,CAAE,EAAI3R,EAAU,MACpD,MACI,KAAK,QAAU,EACf,KAAK,QAAU,KAAK,KAAK4R,EAAKA,EAAKE,EAAKA,CAAE,EAC1C,KAAK,QAAU,EACf,KAAK,UAAY,GAAK,KAAK,MAAMA,EAAIF,CAAE,EAAI5R,EAAU,MAE7D,CAGA,aAAagS,EAAgB,CACzB,MAAMjC,EAAI,KAAK,OACThS,EAAIgS,EAAE,EACN/R,EAAI+R,EAAE,EACN9R,EAAI8R,EAAE,EACN,EAAIA,EAAE,EACNkC,EAAS,GAAKlU,EAAI,EAAIC,EAAIC,GAC1BJ,EAAImU,EAAM,EAAIjC,EAAE,GAChBjS,EAAIkU,EAAM,EAAIjC,EAAE,GAEtB,OAAAiC,EAAM,EAAInU,EAAI,EAAIoU,EAASnU,EAAIE,EAAIiU,EACnCD,EAAM,EAAIlU,EAAIC,EAAIkU,EAASpU,EAAII,EAAIgU,EAE5BD,CACX,CAGA,aAAaE,EAAgB,CACzB,MAAMnC,EAAI,KAAK,OACTlS,EAAIqU,EAAM,EACVpU,EAAIoU,EAAM,EAEhB,OAAAA,EAAM,EAAIrU,EAAIkS,EAAE,EAAIjS,EAAIiS,EAAE,EAAIA,EAAE,GAChCmC,EAAM,EAAIrU,EAAIkS,EAAE,EAAIjS,EAAIiS,EAAE,EAAIA,EAAE,GAEzBmC,CACX,CAGA,qBAAqBC,EAAuB,CACxC,MAAMlS,EAAMD,EAAU,OAAOmS,CAAa,EACpCpS,EAAMC,EAAU,OAAOmS,CAAa,EACpCvU,EAAM,KAAK,OAEjB,OAAO,KAAK,MAAMA,EAAI,EAAIqC,EAAMrC,EAAI,EAAImC,EAAKnC,EAAI,EAAImC,EAAMnC,EAAI,EAAIqC,CAAG,EAAID,EAAU,MACxF,CAGA,qBAAqBoS,EAAuB,CACxCA,GAAiB,KAAK,SAAW,KAAK,OACtC,MAAMnS,EAAMD,EAAU,OAAOoS,CAAa,EACpCrS,EAAMC,EAAU,OAAOoS,CAAa,EACpCxU,EAAM,KAAK,OAEjB,OAAO,KAAK,MAAMmC,EAAMnC,EAAI,EAAIqC,EAAMrC,EAAI,EAAGmC,EAAMnC,EAAI,EAAIqC,EAAMrC,EAAI,CAAC,EAAIoC,EAAU,MACxF,CAMA,YAAYqS,EAAiB,CACzB,MAAMzU,EAAM,KAAK,OACXG,EAAIH,EAAI,EACRI,EAAIJ,EAAI,EACRK,EAAIL,EAAI,EACR,EAAIA,EAAI,EACRmC,EAAMC,EAAU,OAAOqS,CAAO,EAC9BpS,EAAMD,EAAU,OAAOqS,CAAO,EAEpCzU,EAAI,EAAImC,EAAMhC,EAAIkC,EAAMhC,EACxBL,EAAI,EAAImC,EAAM/B,EAAIiC,EAAM,EACxBrC,EAAI,EAAIqC,EAAMlC,EAAIgC,EAAM9B,EACxBL,EAAI,EAAIqC,EAAMjC,EAAI+B,EAAM,CAC5B,CACJ,CCzYO,MAAMuS,EAAS,CA8ClB,YAAY7Q,EAAezE,EAAc2S,EAAyB,CAC9D,GA7CJ,KAAQ,MAAA,EAMR,KAA0B,OAAA,KAG1B,KAAS,OAAA,EAGT,KAAI,EAAA,EAGJ,OAAI,EAGJ,KAAA,SAAW,EAGX,KAAA,OAAS,EAGT,KAAA,OAAS,EAGT,KAAA,OAAS,EAGT,KAAS,OAAA,EAGT,KAAgBa,cAAAA,GAAc,OAK9B,KAAA,aAAe,GAIf,KAAA,MAAQ,IAAInR,EAGJoC,EAAQ,EAAG,MAAM,IAAI,MAAM,qBAAqB,EACpD,GAAI,CAACzE,EAAM,MAAM,IAAI,MAAM,sBAAsB,EACjD,KAAK,MAAQyE,EACb,KAAK,KAAOzE,EACZ,KAAK,OAAS2S,CAClB,CACJ,CCvDO,MAAe4C,EAAe,CACjC,YAAmBvV,EAAqBwV,EAAsBC,EAAuB,CAAlE,KAAA,KAAAzV,EAAqB,KAAA,MAAAwV,EAAsB,KAAA,aAAAC,CAAwB,CAC1F,CCKO,MAAMC,EAAwB,CASjC,YAAYnQ,EAAcoH,EAAiB,CACvC,GARJ,KAAA,SAAW,EACX,KAAA,WAAa,EACb,KAAA,YAA6B,KAC7B,KAAA,KAAO,EACP,KAAS,OAAA,EACT,KAAU,QAAA,EAGF,CAACA,EAAM,MAAM,IAAI,MAAM,sBAAsB,EACjD,KAAK,KAAOpH,EACZ,KAAK,KAAOoH,CAChB,CACJ,CCjBa,MAAAgJ,EAAgC,CASzC,YAAY3V,EAAc,CAP1B,KAAW,SAAA,EACX,gBAAa,EACb,KAAA,YAA6B,KAC7B,KAA2B,UAAA,KAC3B,YAAS,EACT,KAAA,QAAU,EAGN,KAAK,KAAOA,CAChB,CACJ,CCPa,MAAA4V,EAAkC,CA2B3C,YAAYjJ,EAAwBnM,EAAoB,CACpD,GAjBJ,KAAgB,cAAA,EAGhB,KAAW,SAAA,GAIX,KAAU,QAAA,GAGV,KAAM,IAAA,EAGN,cAAW,EACX,KAAA,OAAS,GAGD,CAACmM,EAAM,MAAM,IAAI,MAAM,sBAAsB,EACjD,GAAI,CAACnM,EAAU,MAAM,IAAI,MAAM,0BAA0B,EACzD,KAAK,KAAOmM,EACZ,KAAK,IAAMA,EAAK,IAChB,KAAK,SAAWA,EAAK,SACrB,KAAK,cAAgBA,EAAK,cAC1B,KAAK,SAAWA,EAAK,SACrB,KAAK,QAAUA,EAAK,QAEpB,KAAK,MAAQ,IAAI,MACjB,QAASnL,EAAI,EAAGA,EAAImL,EAAK,MAAM,OAAQnL,IAAK,CACxC,MAAMqB,EAAOrC,EAAS,SAASmM,EAAK,MAAMnL,CAAC,EAAE,IAAI,EAEjD,GAAI,CAACqB,EAAM,MAAM,IAAI,MAAM,sBAAsB8J,EAAK,MAAMnL,CAAC,EAAE,MAAM,EACrE,KAAK,MAAM,KAAKqB,CAAI,CACxB,CACA,MAAMgT,EAASrV,EAAS,SAASmM,EAAK,OAAO,IAAI,EAEjD,GAAI,CAACkJ,EAAQ,MAAM,IAAI,MAAM,sBAAsBlJ,EAAK,OAAO,MAAM,EACrE,KAAK,OAASkJ,CAClB,CAEA,UAAW,CACP,OAAO,KAAK,MAChB,CAEA,QAAS,CACL,GAAI,KAAK,KAAO,EAAG,OACnB,MAAMA,EAAS,KAAK,OACdlV,EAAQ,KAAK,MAEnB,OAAQA,EAAM,OAAQ,CAClB,IAAK,GACD,KAAK,OAAOA,EAAM,CAAC,EAAGkV,EAAO,OAAQA,EAAO,OAAQ,KAAK,SAAU,KAAK,QAAS,KAAK,KAAK,QAAS,KAAK,GAAG,EAC5G,MACJ,IACI,GAAA,KAAK,OAAOlV,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAGkV,EAAO,OAAQA,EAAO,OAAQ,KAAK,cAAe,KAAK,QAAS,KAAK,KAAK,QAAS,KAAK,SAAU,KAAK,GAAG,EAC1I,KACR,CACJ,CAGA,OAAOhT,EAAYiT,EAAiBC,EAAiB/J,EAAmBC,EAAkB+J,EAAkBtQ,EAAe,CACvH,MAAMuQ,EAAIpT,EAAK,OAAO,OAEtB,GAAI,CAACoT,EAAG,MAAM,IAAI,MAAM,2BAA2B,EACnD,MAAM7C,EAAK6C,EAAE,EACb,IAAI5C,EAAK4C,EAAE,EACX,MAAM3C,EAAK2C,EAAE,EACb,IAAI1C,EAAK0C,EAAE,EACPC,EAAa,CAACrT,EAAK,QAAUA,EAAK,UAClCsT,EAAK,EACLC,EAAK,EAET,MAAMC,EAAQxT,EAAK,SAAS,OACtByT,EAAQpD,GAAS,MAAQ,CAACrQ,EAAK,SAAS,OAASA,EAAK,SAAS,OAErE,OAAQA,EAAK,KAAK,cACd,CAAA,KAAK2Q,GAAc,gBACf2C,GAAML,EAAUjT,EAAK,QAAUG,EAAU,OAAOqT,CAAK,EACrDD,GAAML,EAAUlT,EAAK,QAAUG,EAAU,OAAOsT,CAAK,EACrD,MACJ,KAAK9C,GAAc,uBACf,MAAMK,EAAI,KAAK,IAAIT,EAAKG,EAAKF,EAAKC,CAAE,GAAKF,EAAKA,EAAKE,EAAKA,GAClDiD,EAAKnD,EAAKiD,EACVG,EAAKlD,EAAKgD,EAEhBjD,EAAK,CAACmD,EAAK3C,EAAIwC,EACf9C,EAAKgD,EAAK1C,EAAIyC,EACdJ,GAAc,KAAK,MAAMM,EAAID,CAAE,EAAIvT,EAAU,OAEjD,QACI,MAAMnC,EAAIiV,EAAUG,EAAE,GAChBnV,EAAIiV,EAAUE,EAAE,GAChB/U,EAAIkS,EAAKG,EAAKF,EAAKC,EAEzB6C,GAAMtV,EAAI0S,EAAKzS,EAAIuS,GAAMnS,EAAI2B,EAAK,GAClCuT,GAAMtV,EAAIsS,EAAKvS,EAAIyS,GAAMpS,EAAI2B,EAAK,EAC1C,CACAqT,GAAc,KAAK,MAAME,EAAID,CAAE,EAAInT,EAAU,OACzCH,EAAK,QAAU,IAAGqT,GAAc,KAChCA,EAAa,IAAKA,GAAc,IAC3BA,EAAa,OAAMA,GAAc,KAC1C,IAAIlD,EAAKnQ,EAAK,QACVoQ,EAAKpQ,EAAK,QAEd,GAAImJ,GAAYC,EAAS,CACrB,OAAQpJ,EAAK,KAAK,cAAA,CACd,KAAK2Q,GAAc,QACnB,KAAKA,GAAc,oBACf2C,EAAKL,EAAUjT,EAAK,OACpBuT,EAAKL,EAAUlT,EAAK,MAC5B,CACA,MAAM7B,EAAI6B,EAAK,KAAK,OAASmQ,EACvByD,EAAK,KAAK,KAAKN,EAAKA,EAAKC,EAAKA,CAAE,EAEtC,GAAKpK,GAAYyK,EAAKzV,GAAOiL,GAAWwK,EAAKzV,GAAKA,EAAI,KAAS,CAC3D,MAAM6S,GAAK4C,EAAKzV,EAAI,GAAK0E,EAAQ,EAEjCsN,GAAMa,EACFmC,IAAS/C,GAAMY,EACvB,CACJ,CACAhR,EAAK,yBAAyBA,EAAK,GAAIA,EAAK,GAAIA,EAAK,UAAYqT,EAAaxQ,EAAOsN,EAAIC,EAAIpQ,EAAK,QAASA,EAAK,OAAO,CAC3H,CAIA,OAAO8P,EAAc+D,EAAaZ,EAAiBC,EAAiBY,EAAiB1K,EAAkB+J,EAAkBlK,EAAkBpG,EAAe,CACtJ,MAAMkR,EAAKjE,EAAO,GACZkE,EAAKlE,EAAO,GAClB,IAAImE,EAAMnE,EAAO,QACboE,EAAMpE,EAAO,QACbK,EAAK8D,EACL7D,EAAK8D,EACLC,EAAMN,EAAM,QAChB,MAAMO,EAAOtE,EAAO,OACpB,IAAIuE,EAAM,EACNC,EAAM,EACNC,EAAK,EAELN,EAAM,GACNA,EAAM,CAACA,EACPI,EAAM,IACNE,EAAK,KAELF,EAAM,EACNE,EAAK,GAELL,EAAM,IACNA,EAAM,CAACA,EACPK,EAAK,CAACA,GAENJ,EAAM,GACNA,EAAM,CAACA,EACPG,EAAM,KACHA,EAAM,EACb,MAAME,EAAKX,EAAM,GACjB,IAAIY,EAAK,EACLC,EAAM,EACNC,EAAM,EACNzW,EAAIkW,EAAK,EACTjW,EAAIiW,EAAK,EACThW,EAAIgW,EAAK,EACT/V,EAAI+V,EAAK,EACb,MAAMQ,EAAI,KAAK,IAAIX,EAAMC,CAAG,GAAK,KAE7B,CAACU,GAAKxL,GACNqL,EAAK,EACLC,EAAMxW,EAAIsW,EAAKJ,EAAK,GACpBO,EAAMvW,EAAIoW,EAAKJ,EAAK,KAEpBK,EAAKZ,EAAM,GACXa,EAAMxW,EAAIsW,EAAKrW,EAAIsW,EAAKL,EAAK,GAC7BO,EAAMvW,EAAIoW,EAAKnW,EAAIoW,EAAKL,EAAK,IAEjC,MAAMS,EAAK/E,EAAO,OAAO,OAEzB,GAAI,CAAC+E,EAAI,MAAM,IAAI,MAAM,sCAAsC,EAC/D3W,EAAI2W,EAAG,EACP1W,EAAI0W,EAAG,EACPzW,EAAIyW,EAAG,EACPxW,EAAIwW,EAAG,EACP,MAAMlD,EAAK,GAAKzT,EAAIG,EAAIF,EAAIC,GAC5B,IAAIJ,EAAI0W,EAAMG,EAAG,GACb5W,EAAI0W,EAAME,EAAG,GACjB,MAAMlQ,GAAM3G,EAAIK,EAAIJ,EAAIE,GAAKwT,EAAKoC,EAC5BnP,GAAM3G,EAAIC,EAAIF,EAAII,GAAKuT,EAAKqC,EAC5Bc,EAAK,KAAK,KAAKnQ,EAAKA,EAAKC,EAAKA,CAAE,EACtC,IAAImQ,EAAKlB,EAAM,KAAK,OAASM,EACzBa,EACAC,EAEJ,GAAIH,EAAK,KAAQ,CACb,KAAK,OAAOhF,EAAQmD,EAASC,EAAS,GAAO9J,EAAS,GAAOvG,CAAK,EAClEgR,EAAM,yBAAyBW,EAAIC,EAAI,EAAGZ,EAAM,QAASA,EAAM,QAASA,EAAM,QAASA,EAAM,OAAO,EAEpG,MACJ,CACA7V,EAAIiV,EAAU4B,EAAG,GACjB5W,EAAIiV,EAAU2B,EAAG,GACjB,IAAIvB,GAAMtV,EAAIK,EAAIJ,EAAIE,GAAKwT,EAAKoC,EAC5BR,IAAMtV,EAAIC,EAAIF,EAAII,GAAKuT,EAAKqC,EAC5BJ,GAAKN,EAAKA,EAAKC,GAAKA,GAExB,GAAItK,GAAY,EAAG,CACfA,GAAYgL,GAAOE,EAAM,GAAK,GAC9B,MAAMe,EAAK,KAAK,KAAKtB,EAAE,EACjBuB,GAAKD,EAAKJ,EAAKC,EAAKd,EAAMhL,EAEhC,GAAIkM,GAAK,EAAG,CACR,IAAI/B,GAAI,KAAK,IAAI,EAAG+B,IAAMlM,EAAW,EAAE,EAAI,EAE3CmK,IAAK+B,GAAKlM,GAAY,EAAImK,GAAIA,KAAM8B,EACpC5B,GAAMF,GAAIE,EACVC,IAAMH,GAAIG,GACVK,GAAKN,EAAKA,EAAKC,GAAKA,EACxB,CACJ,CAEAhF,EAAO,GAAIqG,EAAG,CACVG,GAAMd,EACN,IAAI/T,GAAO0T,GAAKkB,EAAKA,EAAKC,EAAKA,IAAO,EAAID,EAAKC,GAE3C7U,EAAM,IACNA,EAAM,GACN+U,EAAK,KAAK,GAAKnB,GACR5T,EAAM,GACbA,EAAM,EACN+U,EAAK,EACD7L,IACAlL,GAAK,KAAK,KAAK0V,EAAE,GAAKkB,EAAKC,GAAM,GAAKlS,EAAQ,EAC9CsN,GAAMjS,EACFiV,IAAS/C,GAAMlS,KAEpB+W,EAAK,KAAK,KAAK/U,CAAG,EAAI4T,EAC7B5V,EAAI4W,EAAKC,EAAK7U,EACd/B,EAAI4W,EAAK,KAAK,IAAIE,CAAE,EACpBD,EAAK,KAAK,MAAMzB,GAAKrV,EAAIoV,EAAKnV,EAAGmV,EAAKpV,EAAIqV,GAAKpV,CAAC,CACpD,KAAO,CACHD,EAAI+V,EAAMc,EACV5W,EAAI+V,EAAMa,EACV,MAAMK,EAAKlX,EAAIA,EACTmX,GAAKlX,EAAIA,EACTmX,GAAK,KAAK,MAAM/B,GAAID,CAAE,EAE5BlV,EAAIiX,GAAKP,EAAKA,EAAKM,EAAKxB,GAAKwB,EAAKC,GAClC,MAAME,GAAK,GAAKF,GAAKP,EACfU,GAAKH,GAAKD,EAGhB,GADA/W,EAAIkX,GAAKA,GAAK,EAAIC,GAAKpX,EACnBC,GAAK,EAAG,CACR,IAAIoX,GAAI,KAAK,KAAKpX,CAAC,EAEfkX,GAAK,IAAGE,GAAI,CAACA,IACjBA,GAAI,EAAEF,GAAKE,IAAK,GAChB,MAAMC,GAAKD,GAAID,GACTrI,GAAK/O,EAAIqX,GACT/P,GAAI,KAAK,IAAIgQ,EAAE,EAAI,KAAK,IAAIvI,EAAE,EAAIuI,GAAKvI,GAE7C,GAAIzH,GAAIA,IAAKkO,GAAI,CACb3V,EAAI,KAAK,KAAK2V,GAAKlO,GAAIA,EAAC,EAAIoO,EAC5BkB,EAAKM,GAAK,KAAK,MAAMrX,EAAGyH,EAAC,EACzBuP,EAAK,KAAK,MAAMhX,EAAIiW,GAAMxO,GAAIoP,GAAMb,CAAG,EAEvC,MAAM1F,CACV,CACJ,CACA,IAAIoH,GAAWxV,EAAU,GACrByV,GAAOd,EAAK5W,EACZ2X,GAAUD,GAAOA,GACjBE,GAAO,EACPC,GAAW,EACXC,GAAOlB,EAAK5W,EACZ+X,GAAUD,GAAOA,GACjBE,GAAO,EAEX9X,EAAK,CAACF,EAAI4W,GAAOM,EAAKC,IAClBjX,GAAK,IAAMA,GAAK,IAChBA,EAAI,KAAK,KAAKA,CAAC,EACfJ,EAAIE,EAAI,KAAK,IAAIE,CAAC,EAAI0W,EACtB7W,EAAIE,EAAI,KAAK,IAAIC,CAAC,EAClBC,EAAIL,EAAIA,EAAIC,EAAIA,EACZI,EAAIwX,KACJF,GAAWvX,EACXyX,GAAUxX,EACVuX,GAAO5X,EACP8X,GAAO7X,GAEPI,EAAI4X,KACJF,GAAW3X,EACX6X,GAAU5X,EACV2X,GAAOhY,EACPkY,GAAOjY,IAGX2V,KAAOiC,GAAUI,IAAW,IAC5BjB,EAAKM,GAAK,KAAK,MAAMQ,GAAOhC,EAAS8B,EAAI,EACzCX,EAAKU,GAAW7B,IAEhBkB,EAAKM,GAAK,KAAK,MAAMY,GAAOpC,EAASkC,EAAI,EACzCf,EAAKc,GAAWjC,EAExB,CACA,MAAMqC,GAAK,KAAK,MAAM1B,EAAID,CAAE,EAAID,EAChC,IAAIvE,GAAWF,EAAO,UAEtBkF,GAAMA,EAAKmB,IAAMhW,EAAU,OAASkU,EAAMrE,GACtCgF,EAAK,IAAKA,GAAM,IACXA,EAAK,OAEVA,GAAM,KACVlF,EAAO,yBAAyBiE,EAAIC,EAAIhE,GAAWgF,EAAKnS,EAAOsN,EAAIC,EAAI,EAAG,CAAC,EAC3EJ,GAAW6D,EAAM,UACjBoB,IAAOA,EAAKkB,IAAMhW,EAAU,OAAS0T,EAAM,SAAWU,EAAKD,EAAMtE,GAC7DiF,EAAK,IAAKA,GAAM,IACXA,EAAK,OAEVA,GAAM,KACVpB,EAAM,yBAAyBW,EAAIC,EAAIzE,GAAWiF,EAAKpS,EAAOgR,EAAM,QAASA,EAAM,QAASA,EAAM,QAASA,EAAM,OAAO,CAC5H,CACJ,CC7Ua,MAAAuC,WAAyB1D,EAAe,CAkCjD,YAAYvV,EAAc,CACtB,MAAMA,EAAM,EAAG,EAAK,EAjCxB,KAAA,MAAQ,IAAI,MAGZ,KAAQ,QAA2B,KAUnC,KAAA,cAAgB,EAGhB,KAAA,SAAW,GAIX,KAAA,QAAU,GAIV,KAAA,QAAU,GAGV,KAAM,IAAA,EAGN,KAAW,SAAA,CAIX,CA9BA,IAAW,OAAOkZ,EAAoB,CAClC,KAAK,QAAUA,CACnB,CACA,IAAW,QAAS,CAChB,GAAK,KAAK,QACL,OAAO,KAAK,QADE,MAAM,IAAI,MAAM,mBAAmB,CAE1D,CAyBJ,CCnCa,MAAAC,WAA2B5D,EAAe,CAoCnD,YAAYvV,EAAc,CACtB,MAAMA,EAAM,EAAG,EAAK,EAnCxB,KAAA,MAAQ,IAAI,MAGZ,KAAQ,QAA2B,KAUnC,KAAA,aAA6BoZ,GAAa,MAG1C,KAAA,YAA2BC,EAAY,MAGvC,gBAAyBC,GAAW,MAGpC,oBAAiB,EAGjB,KAAA,SAAW,EAGX,KAAU,QAAA,EAEV,KAAY,UAAA,EACZ,UAAO,EACP,KAAA,KAAO,CAIP,CAhCA,IAAW,OAAOC,EAAoB,CAClC,KAAK,QAAUA,CACnB,CACA,IAAW,QAAS,CAChB,GAAK,KAAK,QACL,OAAO,KAAK,QADE,MAAM,IAAI,MAAM,mBAAmB,CAE1D,CA2BJ,CAOY,IAAAF,GAAAA,IACRA,EAAAA,EAAA,mBACAA,EAAAtU,EAAA,MAAA,CAAA,EAAA,QACAsU,IAAA,QACAA,CAAAA,EAAAA,UAAAA,EAAAA,EAAA,+BAJQA,IAAAA,GAAA,CAAA,CAAA,EC3CL,MAAMG,GAAN,KAA0C,CAoC7C,YAAY7M,EAA0BnM,EAAoB,CACtD,GArBJ,KAAA,SAAW,EAGX,KAAA,QAAU,EAEV,KAAY,UAAA,EAEZ,KAAO,KAAA,EAEP,KAAO,KAAA,EAEP,KAAS,OAAA,IAAI,MACb,KAAA,UAAY,IAAI,MAChB,KAAQ,MAAA,IAAI,MACZ,KAAA,OAAS,IAAI,MACb,KAAU,QAAA,IAAI,MACd,KAAA,SAAW,IAAI,MAEf,KAAS,OAAA,GAGD,CAACmM,EAAM,MAAM,IAAI,MAAM,sBAAsB,EACjD,GAAI,CAACnM,EAAU,MAAM,IAAI,MAAM,0BAA0B,EACzD,KAAK,KAAOmM,EACZ,KAAK,MAAQ,IAAI,MACjB,QAASnL,EAAI,EAAGC,EAAIkL,EAAK,MAAM,OAAQnL,EAAIC,EAAGD,IAAK,CAC/C,MAAMqB,EAAOrC,EAAS,SAASmM,EAAK,MAAMnL,CAAC,EAAE,IAAI,EAEjD,GAAI,CAACqB,EAAM,MAAM,IAAI,MAAM,sBAAsB8J,EAAK,MAAMnL,CAAC,EAAE,OAAO,EACtE,KAAK,MAAM,KAAKqB,CAAI,CACxB,CACA,MAAMgT,EAASrV,EAAS,SAASmM,EAAK,OAAO,IAAI,EAEjD,GAAI,CAACkJ,EAAQ,MAAM,IAAI,MAAM,6BAA6BlJ,EAAK,OAAO,MAAM,EAC5E,KAAK,OAASkJ,EACd,KAAK,SAAWlJ,EAAK,SACrB,KAAK,QAAUA,EAAK,QACpB,KAAK,UAAYA,EAAK,UACtB,KAAK,KAAOA,EAAK,KACjB,KAAK,KAAOA,EAAK,IACrB,CAEA,UAAW,CACP,OAAO,KAAK,MAChB,CAEA,QAAS,CACL,MAAM3K,EAAa,KAAK,OAAO,cAAc,EAE7C,GAAI,EAAEA,aAAsBW,IAAiB,OAE7C,MAAM0J,EAAY,KAAK,UACjBC,EAAO,KAAK,KACZC,EAAO,KAAK,KAElB,GAAIF,GAAa,GAAKC,GAAQ,GAAKC,GAAQ,EAAG,OAE9C,MAAMI,EAAO,KAAK,KACZ8M,EAAW9M,EAAK,YAAc2M,GAAW,QACzCI,EAAQ/M,EAAK,YAAc2M,GAAW,WAEtC3Y,EAAQ,KAAK,MACbgZ,EAAYhZ,EAAM,OAClBiZ,EAAcH,EAAWE,EAAYA,EAAY,EACjDE,EAAS5X,EAAM,aAAa,KAAK,OAAQ2X,CAAW,EACpDE,EAAyBJ,EAAS,KAAK,QAAUzX,EAAM,aAAa,KAAK,QAAS0X,CAAS,EAAK,CAAA,EAChGvM,EAAU,KAAK,QAErB,OAAQT,EAAK,aACT,KAAK0M,EAAY,QACb,GAAIK,EACA,QAASlY,EAAI,EAAGC,EAAImY,EAAc,EAAGpY,EAAIC,EAAGD,IAAK,CAC7C,MAAMqB,EAAOlC,EAAMa,CAAC,EACduY,EAAclX,EAAK,KAAK,OAE9B,GAAIkX,EAAcP,GAAe,QAASM,EAAQtY,CAAC,EAAI,MAClD,CACD,MAAMX,EAAIkZ,EAAclX,EAAK,OAAO,EAC9B/B,EAAIiZ,EAAclX,EAAK,OAAO,EAEpCiX,EAAQtY,CAAC,EAAI,KAAK,KAAKX,EAAIA,EAAIC,EAAIA,CAAC,CACxC,CACJ,CAEJmB,EAAM,UAAU4X,EAAQ,EAAGD,EAAaxM,CAAO,EAC/C,MACJ,KAAKiM,EAAY,aACb,IAAIW,EAAM,EAEV,QAASxY,EAAI,EAAGC,EAAImY,EAAc,EAAGpY,EAAIC,GAAK,CAC1C,MAAMoB,EAAOlC,EAAMa,CAAC,EACduY,EAAclX,EAAK,KAAK,OAE9B,GAAIkX,EAAcP,GAAe,QACzBE,IAAOI,EAAQtY,CAAC,EAAI,GACxBqY,EAAO,EAAErY,CAAC,EAAI4L,MACX,CACH,MAAMvM,EAAIkZ,EAAclX,EAAK,OAAO,EAC9B/B,EAAIiZ,EAAclX,EAAK,OAAO,EAC9BoX,EAAS,KAAK,KAAKpZ,EAAIA,EAAIC,EAAIA,CAAC,EAElC4Y,IAAOI,EAAQtY,CAAC,EAAIyY,GACxBJ,EAAO,EAAErY,CAAC,EAAIyY,EACdD,GAAOC,CACX,CACJ,CACA,GAAID,EAAM,EAAG,CACTA,EAAOJ,EAAcI,EAAO5M,EAC5B,QAAS5L,EAAI,EAAGA,EAAIoY,EAAapY,IAAKqY,EAAOrY,CAAC,GAAKwY,CACvD,CACA,MACJ,QACI,MAAME,EAAgBvN,EAAK,aAAe0M,EAAY,OAEtD,QAAS7X,EAAI,EAAGC,EAAImY,EAAc,EAAGpY,EAAIC,GAAK,CAC1C,MAAMoB,EAAOlC,EAAMa,CAAC,EACduY,EAAclX,EAAK,KAAK,OAE9B,GAAIkX,EAAcP,GAAe,QACzBE,IAAOI,EAAQtY,CAAC,EAAI,GACxBqY,EAAO,EAAErY,CAAC,EAAI4L,MACX,CACH,MAAMvM,EAAIkZ,EAAclX,EAAK,OAAO,EAC9B/B,EAAIiZ,EAAclX,EAAK,OAAO,EAC9BoX,EAAS,KAAK,KAAKpZ,EAAIA,EAAIC,EAAIA,CAAC,EAElC4Y,IAAOI,EAAQtY,CAAC,EAAIyY,GACxBJ,EAAO,EAAErY,CAAC,GAAM0Y,EAAgBH,EAAc3M,EAAUA,GAAW6M,EAAUF,CACjF,CACJ,CACR,CAEA,MAAMI,EAAY,KAAK,sBAAsCnY,EAAY4X,EAAaH,CAAQ,EAC9F,IAAIW,EAAQD,EAAU,CAAC,EACnBE,EAAQF,EAAU,CAAC,EACnBG,EAAiB3N,EAAK,eACtB4N,EAAM,GAEV,GAAID,GAAkB,EAAGC,EAAM5N,EAAK,YAAc2M,GAAW,UACxD,CACDiB,EAAM,GACN,MAAMtE,EAAI,KAAK,OAAO,KAAK,OAE3BqE,GAAkBrE,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAI,EAAIjT,EAAU,OAAS,CAACA,EAAU,MAChF,CACA,QAASxB,EAAI,EAAGyU,EAAI,EAAGzU,EAAImY,EAAWnY,IAAKyU,GAAK,EAAG,CAC/C,MAAMpT,EAAOlC,EAAMa,CAAC,EACdZ,EAAMiC,EAAK,OAEjBjC,EAAI,KAAOwZ,EAAQxZ,EAAI,IAAM0L,EAC7B1L,EAAI,KAAOyZ,EAAQzZ,EAAI,IAAM2L,EAC7B,MAAM1L,EAAIsZ,EAAUlE,CAAC,EACfnV,EAAIqZ,EAAUlE,EAAI,CAAC,EACnBzO,EAAK3G,EAAIuZ,EACT3S,EAAK3G,EAAIuZ,EAEf,GAAIX,EAAO,CACP,MAAMO,EAASH,EAAQtY,CAAC,EAExB,GAAIyY,GAAU,EAAG,CACb,MAAMpG,GAAK,KAAK,KAAKrM,EAAKA,EAAKC,EAAKA,CAAE,EAAIwS,EAAS,GAAK5N,EAAY,EAEpEzL,EAAI,GAAKiT,EACTjT,EAAI,GAAKiT,CACb,CACJ,CAGA,GAFAuG,EAAQvZ,EACRwZ,EAAQvZ,EACJuL,EAAY,EAAG,CACf,MAAMtL,EAAIH,EAAI,EACRI,EAAIJ,EAAI,EACRK,EAAIL,EAAI,EACRM,EAAIN,EAAI,EACd,IAAI2H,EAAI,EACJxF,EAAM,EACNE,EAAM,EAMV,GAJIwW,EAAUlR,EAAI4R,EAAUlE,EAAI,CAAC,EACxB4D,EAAOrY,EAAI,CAAC,GAAK,EAAG+G,EAAI4R,EAAUlE,EAAI,CAAC,EAC3C1N,EAAI,KAAK,MAAMd,EAAID,CAAE,EAC1Be,GAAK,KAAK,MAAMtH,EAAGF,CAAC,EAChBwZ,EAAK,CACLxX,EAAM,KAAK,IAAIwF,CAAC,EAChBtF,EAAM,KAAK,IAAIsF,CAAC,EAChB,MAAM0R,EAASpX,EAAK,KAAK,OAEzBuX,IAAUH,GAAUlX,EAAMhC,EAAIkC,EAAMhC,GAAKuG,GAAM6E,EAC/CgO,IAAUJ,GAAUhX,EAAMlC,EAAIgC,EAAM9B,GAAKwG,GAAM4E,CACnD,MACI9D,GAAK+R,EAEL/R,EAAIvF,EAAU,GAAIuF,GAAKvF,EAAU,IAC5BuF,EAAI,CAACvF,EAAU,KAEpBuF,GAAKvF,EAAU,KACnBuF,GAAK8D,EACLtJ,EAAM,KAAK,IAAIwF,CAAC,EAChBtF,EAAM,KAAK,IAAIsF,CAAC,EAChB3H,EAAI,EAAImC,EAAMhC,EAAIkC,EAAMhC,EACxBL,EAAI,EAAImC,EAAM/B,EAAIiC,EAAM/B,EACxBN,EAAI,EAAIqC,EAAMlC,EAAIgC,EAAM9B,EACxBL,EAAI,EAAIqC,EAAMjC,EAAI+B,EAAM7B,CAC5B,CACA2B,EAAK,uBACT,CAAA,CACJ,CAEA,sBAAsBJ,EAAsBmX,EAAqBH,EAAmB,CAChF,MAAM5D,EAAS,KAAK,OACpB,IAAI3I,EAAW,KAAK,SACpB,MAAM2M,EAAS,KAAK,OACdW,EAAMvY,EAAM,aAAa,KAAK,UAAW2X,EAAc,EAAI,CAAC,EAClE,IAAI5E,EAAuB,KAAK,MAChC,MAAMyF,EAAShY,EAAK,OACpB,IAAIiY,EAAiBjY,EAAK,oBACtBkY,EAAaD,EAAiB,EAC9BE,EAAYpB,GAAe,KAE/B,GAAI,CAAC/W,EAAK,cAAe,CACrB,MAAMqX,EAAUrX,EAAK,QAErBkY,GAAcF,EAAS,EAAI,EAC3B,MAAMI,EAAaf,EAAQa,CAAU,EAEjC,KAAK,KAAK,cAAgBvB,GAAa,UAASlM,GAAY2N,GAEhE,IAAIC,EAEJ,OAAQ,KAAK,KAAK,YAAA,CACd,KAAKzB,EAAY,QACbyB,EAAaD,EACb,MACJ,KAAKxB,EAAY,aACbyB,EAAaD,EAAajB,EAC1B,MACJ,QACIkB,EAAa,CACrB,CACA9F,EAAQ/S,EAAM,aAAa,KAAK,MAAO,CAAC,EACxC,QAAST,EAAI,EAAGsQ,EAAI,EAAGiJ,EAAQ,EAAGvZ,EAAIoY,EAAapY,IAAKsQ,GAAK,EAAG,CAC5D,MAAMkJ,EAAQnB,EAAOrY,CAAC,EAAIsZ,EAE1B5N,GAAY8N,EACZ,IAAI/E,EAAI/I,EAER,GAAIuN,EACAxE,GAAK4E,EACD5E,EAAI,IAAGA,GAAK4E,GAChBE,EAAQ,UACD9E,EAAI,EAAG,CACV2E,GAAapB,GAAe,SAC5BoB,EAAYpB,GAAe,OAC3B/W,EAAK,qBAAqBoT,EAAQ,EAAG,EAAGb,EAAO,EAAG,CAAC,GAEvD,KAAK,kBAAkBiB,EAAGjB,EAAO,EAAGwF,EAAK1I,CAAC,EAC1C,QACJ,SAAWmE,EAAI4E,EAAY,CACnBD,GAAapB,GAAe,QAC5BoB,EAAYpB,GAAe,MAC3B/W,EAAK,qBAAqBoT,EAAQ6E,EAAiB,EAAG,EAAG1F,EAAO,EAAG,CAAC,GAExE,KAAK,iBAAiBiB,EAAI4E,EAAY7F,EAAO,EAAGwF,EAAK1I,CAAC,EACtD,QACJ,CAGA,MAASiJ,IAAS,CACd,MAAMd,GAASH,EAAQiB,CAAK,EAE5B,GAAI,EAAA9E,EAAIgE,IACR,CAAIc,GAAAA,GAAS,EAAG9E,GAAKgE,OAChB,CACD,MAAMjP,GAAO8O,EAAQiB,EAAQ,CAAC,EAE9B9E,GAAKA,EAAIjL,KAASiP,GAASjP,GAC/B,CACA,KAAA,CACJ,CACI+P,GAASH,IACTA,EAAYG,EACRN,GAAUM,GAASJ,GACnBlY,EAAK,qBAAqBoT,EAAQ6E,EAAiB,EAAG,EAAG1F,EAAO,EAAG,CAAC,EACpEvS,EAAK,qBAAqBoT,EAAQ,EAAG,EAAGb,EAAO,EAAG,CAAC,GAChDvS,EAAK,qBAAqBoT,EAAQkF,EAAQ,EAAI,EAAG,EAAG/F,EAAO,EAAG,CAAC,GAE1E,KAAK,iBAAiBiB,EAAGjB,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAGwF,EAAK1I,EAAG2H,GAAajY,EAAI,GAAKwZ,GAAS,CAAE,CACtJ,CAEA,OAAOR,CACX,CAGIC,GACAC,GAAkB,EAClB1F,EAAQ/S,EAAM,aAAa,KAAK,MAAOyY,CAAc,EACrDjY,EAAK,qBAAqBoT,EAAQ,EAAG6E,EAAiB,EAAG1F,EAAO,EAAG,CAAC,EACpEvS,EAAK,qBAAqBoT,EAAQ,EAAG,EAAGb,EAAO0F,EAAiB,EAAG,CAAC,EACpE1F,EAAM0F,EAAiB,CAAC,EAAI1F,EAAM,CAAC,EACnCA,EAAM0F,EAAiB,CAAC,EAAI1F,EAAM,CAAC,IAEnC2F,IACAD,GAAkB,EAClB1F,EAAQ/S,EAAM,aAAa,KAAK,MAAOyY,CAAc,EACrDjY,EAAK,qBAAqBoT,EAAQ,EAAG6E,EAAgB1F,EAAO,EAAG,CAAC,GAIpE,MAAM/N,EAAShF,EAAM,aAAa,KAAK,OAAQ0Y,CAAU,EACzD,IAAIE,EAAa,EACbI,EAAKjG,EAAM,CAAC,EACZkG,EAAKlG,EAAM,CAAC,EACZrO,EAAM,EACNC,EAAM,EACNC,EAAM,EACNC,EAAM,EACNqU,EAAK,EACLC,EAAK,EACLlU,EAAO,EACPC,EAAO,EACPkU,EAAQ,EACRC,EAAQ,EACRC,EAAO,EACPC,EAAO,EACPC,EAAM,EACNC,EAAM,EAEV,QAASla,EAAI,EAAGJ,EAAI,EAAGI,EAAImZ,EAAYnZ,IAAKJ,GAAK,EAC7CuF,EAAMqO,EAAM5T,CAAC,EACbwF,EAAMoO,EAAM5T,EAAI,CAAC,EACjByF,EAAMmO,EAAM5T,EAAI,CAAC,EACjB0F,EAAMkO,EAAM5T,EAAI,CAAC,EACjB+Z,EAAKnG,EAAM5T,EAAI,CAAC,EAChBga,EAAKpG,EAAM5T,EAAI,CAAC,EAChB8F,GAAQ+T,EAAKtU,EAAM,EAAIE,GAAO,MAC9BM,GAAQ+T,EAAKtU,EAAM,EAAIE,GAAO,MAC9BuU,IAAU1U,EAAME,GAAO,EAAIoU,EAAKE,GAAM,OACtCG,IAAU1U,EAAME,GAAO,EAAIoU,EAAKE,GAAM,OACtCG,EAAOrU,EAAO,EAAImU,EAClBG,EAAOrU,EAAO,EAAImU,EAClBG,GAAO9U,EAAMsU,GAAM,IAAO/T,EAAOmU,EAAQ,UACzCK,GAAO9U,EAAMsU,GAAM,IAAO/T,EAAOmU,EAAQ,UACzCT,GAAc,KAAK,KAAKY,EAAMA,EAAMC,EAAMA,CAAG,EAC7CD,GAAOF,EACPG,GAAOF,EACPD,GAAQF,EACRG,GAAQF,EACRT,GAAc,KAAK,KAAKY,EAAMA,EAAMC,EAAMA,CAAG,EAC7CD,GAAOF,EACPG,GAAOF,EACPX,GAAc,KAAK,KAAKY,EAAMA,EAAMC,EAAMA,CAAG,EAC7CD,GAAOF,EAAOF,EACdK,GAAOF,EAAOF,EACdT,GAAc,KAAK,KAAKY,EAAMA,EAAMC,EAAMA,CAAG,EAC7CzU,EAAOzF,CAAC,EAAIqZ,EACZI,EAAKE,EACLD,EAAKE,EAGL,KAAK,KAAK,cAAgBhC,GAAa,UAASlM,GAAY2N,GAEhE,IAAIC,EAEJ,OAAQ,KAAK,KAAK,YAAa,CAC3B,KAAKzB,EAAY,QACbyB,EAAaD,EACb,MACJ,KAAKxB,EAAY,aACbyB,EAAaD,EAAajB,EAC1B,MACJ,QACIkB,EAAa,CACrB,CAEA,MAAMa,EAAW,KAAK,SACtB,IAAIC,EAAc,EAElB,QAASpa,EAAI,EAAGsQ,EAAI,EAAGiJ,EAAQ,EAAGc,EAAU,EAAGra,EAAIoY,EAAapY,IAAKsQ,GAAK,EAAG,CACzE,MAAMkJ,EAAQnB,EAAOrY,CAAC,EAAIsZ,EAE1B5N,GAAY8N,EACZ,IAAI/E,EAAI/I,EAER,GAAIuN,EACAxE,GAAK4E,EACD5E,EAAI,IAAGA,GAAK4E,GAChBE,EAAQ,UACD9E,EAAI,EAAG,CACd,KAAK,kBAAkBA,EAAGjB,EAAO,EAAGwF,EAAK1I,CAAC,EAC1C,QACJ,SAAWmE,EAAI4E,EAAY,CACvB,KAAK,iBAAiB5E,EAAI4E,EAAY7F,EAAO0F,EAAiB,EAAGF,EAAK1I,CAAC,EACvE,QACJ,CAGA,MAASiJ,IAAS,CACd,MAAMd,EAAShT,EAAO8T,CAAK,EAE3B,GAAI,EAAA9E,EAAIgE,GACR,CAAIc,GAAAA,GAAS,EAAG9E,GAAKgE,MAChB,CACD,MAAMjP,EAAO/D,EAAO8T,EAAQ,CAAC,EAE7B9E,GAAKA,EAAIjL,IAASiP,EAASjP,EAC/B,CACA,KAAA,CACJ,CAGA,GAAI+P,GAASH,EAAW,CACpBA,EAAYG,EACZ,IAAIjT,EAAKiT,EAAQ,EAoBjB,IAlBAE,EAAKjG,EAAMlN,CAAE,EACboT,EAAKlG,EAAMlN,EAAK,CAAC,EACjBnB,EAAMqO,EAAMlN,EAAK,CAAC,EAClBlB,EAAMoO,EAAMlN,EAAK,CAAC,EAClBjB,EAAMmO,EAAMlN,EAAK,CAAC,EAClBhB,EAAMkO,EAAMlN,EAAK,CAAC,EAClBqT,EAAKnG,EAAMlN,EAAK,CAAC,EACjBsT,EAAKpG,EAAMlN,EAAK,CAAC,EACjBZ,GAAQ+T,EAAKtU,EAAM,EAAIE,GAAO,IAC9BM,GAAQ+T,EAAKtU,EAAM,EAAIE,GAAO,IAC9BuU,IAAU1U,EAAME,GAAO,EAAIoU,EAAKE,GAAM,KACtCG,IAAU1U,EAAME,GAAO,EAAIoU,EAAKE,GAAM,KACtCG,EAAOrU,EAAO,EAAImU,EAClBG,EAAOrU,EAAO,EAAImU,EAClBG,GAAO9U,EAAMsU,GAAM,GAAM/T,EAAOmU,EAAQ,UACxCK,GAAO9U,EAAMsU,GAAM,GAAM/T,EAAOmU,EAAQ,UACxCM,EAAc,KAAK,KAAKH,EAAMA,EAAMC,EAAMA,CAAG,EAC7CC,EAAS,CAAC,EAAIC,EACT9T,EAAK,EAAGA,EAAK,EAAGA,IACjB2T,GAAOF,EACPG,GAAOF,EACPD,GAAQF,EACRG,GAAQF,EACRM,GAAe,KAAK,KAAKH,EAAMA,EAAMC,EAAMA,CAAG,EAC9CC,EAAS7T,CAAE,EAAI8T,EAEnBH,GAAOF,EACPG,GAAOF,EACPI,GAAe,KAAK,KAAKH,EAAMA,EAAMC,EAAMA,CAAG,EAC9CC,EAAS,CAAC,EAAIC,EACdH,GAAOF,EAAOF,EACdK,GAAOF,EAAOF,EACdM,GAAe,KAAK,KAAKH,EAAMA,EAAMC,EAAMA,CAAG,EAC9CC,EAAS,CAAC,EAAIC,EACdC,EAAU,CACd,CAIA,IADA5F,GAAK2F,GACIC,IAAW,CAChB,MAAM5B,EAAS0B,EAASE,CAAO,EAE/B,GAAI,EAAA5F,EAAIgE,GACR,CAAI4B,GAAAA,GAAW,EAAG5F,GAAKgE,MAClB,CACD,MAAMjP,EAAO2Q,EAASE,EAAU,CAAC,EAEjC5F,EAAI4F,GAAW5F,EAAIjL,IAASiP,EAASjP,EACzC,CACA,KACJ,CAAA,CACA,KAAK,iBAAiBiL,EAAI,GAAKgF,EAAIC,EAAIvU,EAAKC,EAAKC,EAAKC,EAAKqU,EAAIC,EAAIZ,EAAK1I,EAAG2H,GAAajY,EAAI,GAAKwZ,GAAS,CAAE,CAChH,CAEA,OAAOR,CACX,CAEA,kBAAkBvE,EAAW6F,EAAqBta,EAAWgZ,EAAoB1I,EAAW,CACxF,MAAMmJ,EAAKa,EAAKta,CAAC,EACX0Z,EAAKY,EAAKta,EAAI,CAAC,EACfgG,EAAKsU,EAAKta,EAAI,CAAC,EAAIyZ,EACnBxT,EAAKqU,EAAKta,EAAI,CAAC,EAAI0Z,EACnB3S,EAAI,KAAK,MAAMd,EAAID,CAAE,EAE3BgT,EAAI1I,CAAC,EAAImJ,EAAKhF,EAAI,KAAK,IAAI1N,CAAC,EAC5BiS,EAAI1I,EAAI,CAAC,EAAIoJ,EAAKjF,EAAI,KAAK,IAAI1N,CAAC,EAChCiS,EAAI1I,EAAI,CAAC,EAAIvJ,CACjB,CAEA,iBAAiB0N,EAAW6F,EAAqBta,EAAWgZ,EAAoB1I,EAAW,CACvF,MAAMmJ,EAAKa,EAAKta,EAAI,CAAC,EACf0Z,EAAKY,EAAKta,EAAI,CAAC,EACfgG,EAAKyT,EAAKa,EAAKta,CAAC,EAChBiG,EAAKyT,EAAKY,EAAKta,EAAI,CAAC,EACpB+G,EAAI,KAAK,MAAMd,EAAID,CAAE,EAE3BgT,EAAI1I,CAAC,EAAImJ,EAAKhF,EAAI,KAAK,IAAI1N,CAAC,EAC5BiS,EAAI1I,EAAI,CAAC,EAAIoJ,EAAKjF,EAAI,KAAK,IAAI1N,CAAC,EAChCiS,EAAI1I,EAAI,CAAC,EAAIvJ,CACjB,CAEA,iBACI0N,EACAgF,EACAC,EACAvU,EACAC,EACAC,EACAC,EACAqU,EACAC,EACAZ,EACA1I,EACA2H,EACF,CACE,GAAIxD,GAAK,GAAK,MAAMA,CAAC,EAAG,CACpBuE,EAAI1I,CAAC,EAAImJ,EACTT,EAAI1I,EAAI,CAAC,EAAIoJ,EACbV,EAAI1I,EAAI,CAAC,EAAI,KAAK,MAAMlL,EAAMsU,EAAIvU,EAAMsU,CAAE,EAE1C,MACJ,CACA,MAAMc,EAAK9F,EAAIA,EACT+F,EAAMD,EAAK9F,EACXwB,EAAI,EAAIxB,EACRgG,EAAKxE,EAAIA,EACTyE,EAAMD,EAAKxE,EACX0E,EAAK1E,EAAIxB,EACTmG,EAAMD,EAAK,EACXE,EAAO5E,EAAI2E,EACXE,EAAOF,EAAMnG,EACbpV,EAAIoa,EAAKiB,EAAMvV,EAAM0V,EAAOxV,EAAMyV,EAAOnB,EAAKa,EAC9Clb,EAAIoa,EAAKgB,EAAMtV,EAAMyV,EAAOvV,EAAMwV,EAAOlB,EAAKY,EAEpDxB,EAAI1I,CAAC,EAAIjR,EACT2Z,EAAI1I,EAAI,CAAC,EAAIhR,EACT2Y,IACIxD,EAAI,KAAOuE,EAAI1I,EAAI,CAAC,EAAI,KAAK,MAAMlL,EAAMsU,EAAIvU,EAAMsU,CAAE,EACpDT,EAAI1I,EAAI,CAAC,EAAI,KAAK,MAAMhR,GAAKoa,EAAKe,EAAKrV,EAAMuV,EAAK,EAAIrV,EAAMiV,GAAKlb,GAAKoa,EAAKgB,EAAKtV,EAAMwV,EAAK,EAAItV,EAAMkV,EAAG,EAErH,CACJ,EAtiBO,IAAMQ,GAAN/C,GAAM+C,GACF,KAAO,GADLA,GAEF,OAAS,GAFPA,GAGF,MAAQ,GAHNA,GAIF,QAAU,KCLR,MAAAC,EAAsB,CA+B/B,YAAY7P,EAAgB9J,EAAY,CACpC,GAjBJ,eAA0B,KAE1B,KAAA,WAAgC,KAEhC,KAAA,gBAAkB,EAIlB,KAAA,cAAgB,GAMhB,KAAA,OAAS,IAAI,MAGL,CAAC8J,EAAM,MAAM,IAAI,MAAM,sBAAsB,EACjD,GAAI,CAAC9J,EAAM,MAAM,IAAI,MAAM,sBAAsB,EACjD,KAAK,KAAO8J,EACZ,KAAK,KAAO9J,EACZ,KAAK,MAAQ,IAAIR,EACjB,KAAK,UAAasK,EAAK,UAAmB,IAAItK,EAAX,KACnC,KAAK,eAAA,EAEL,KAAK,UAAY,KAAK,KAAK,SAC/B,CAGA,aAAwB,CACpB,OAAO,KAAK,KAAK,QACrB,CAGA,eAAmC,CAC/B,OAAO,KAAK,UAChB,CAKA,cAAcL,EAA+B,CACrC,KAAK,YAAcA,KAEnB,EAAEA,aAAsBE,KACxB,EAAE,KAAK,sBAAsBA,KACVF,EAAY,oBAAyC,KAAK,WAAY,sBAEzF,KAAK,OAAO,OAAS,GAEzB,KAAK,WAAaA,EAClB,KAAK,cAAgB,GACzB,CAGA,gBAAiB,CACb,KAAK,MAAM,aAAa,KAAK,KAAK,KAAK,EACnC,KAAK,WAAW,KAAK,UAAU,aAAa,KAAK,KAAK,SAAS,EAC9D,KAAK,KAAK,gBAEX,KAAK,WAAa,KAClB,KAAK,cAAc,KAAK,KAAK,SAAS,cAAc,KAAK,KAAK,MAAO,KAAK,KAAK,cAAc,CAAC,GAHnE,KAAK,WAAa,IAKrD,CACJ,CC/Ea,MAAAya,EAAyC,CAoBlD,YAAY9P,EAA+BnM,EAAoB,CAC3D,GAXJ,KAAA,UAAY,EACZ,KAAO,KAAA,EACP,KAAO,KAAA,EACP,KAAY,UAAA,EACZ,KAAY,UAAA,EACZ,eAAY,EAEZ,KAAA,KAAO,IAAIkc,GACX,KAAS,OAAA,GAGD,CAAC/P,EAAM,MAAM,IAAI,MAAM,sBAAsB,EACjD,GAAI,CAACnM,EAAU,MAAM,IAAI,MAAM,0BAA0B,EACzD,KAAK,KAAOmM,EACZ,KAAK,UAAYA,EAAK,UACtB,KAAK,KAAOA,EAAK,KACjB,KAAK,KAAOA,EAAK,KACjB,KAAK,UAAYA,EAAK,UACtB,KAAK,UAAYA,EAAK,UACtB,KAAK,UAAYA,EAAK,UACtB,KAAK,MAAQ,IAAI,MACjB,QAASnL,EAAI,EAAGA,EAAImL,EAAK,MAAM,OAAQnL,IAAK,CACxC,MAAMqB,EAAOrC,EAAS,SAASmM,EAAK,MAAMnL,CAAC,EAAE,IAAI,EAEjD,GAAI,CAACqB,EAAM,MAAM,IAAI,MAAM,sBAAsB8J,EAAK,MAAMnL,CAAC,EAAE,OAAO,EACtE,KAAK,MAAM,KAAKqB,CAAI,CACxB,CACA,MAAMgT,EAASrV,EAAS,SAASmM,EAAK,OAAO,IAAI,EAEjD,GAAI,CAACkJ,EAAQ,MAAM,IAAI,MAAM,6BAA6BlJ,EAAK,OAAO,OAAO,EAC7E,KAAK,OAASkJ,CAClB,CAEA,UAAW,CACP,OAAO,KAAK,MAChB,CAEA,QAAS,CACD,KAAK,WAAa,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,WAAa,GAAK,KAAK,WAAa,GAAK,KAAK,WAAa,IAE3H,KAAK,KAAK,MACN,KAAK,KAAK,SAAU,KAAK,mBACxB,EAAA,KAAK,mBAAmB,EACtB,KAAK,KAAK,SAAU,KAAK,mBAAA,EAC/B,KAAK,qBACd,CAEA,oBAAqB,CACjB,MAAMxJ,EAAY,KAAK,UACjBC,EAAO,KAAK,KACZC,EAAO,KAAK,KACZC,EAAY,KAAK,UACjBC,EAAY,KAAK,UACjBC,EAAY,KAAK,UACjBiQ,EAAYrQ,GAAQ,GAAKC,GAAQ,EAEjCsJ,EAAS,KAAK,OACd+G,EAAY/G,EAAO,OACnBsC,EAAKyE,EAAU,EACfC,EAAKD,EAAU,EACfE,EAAKF,EAAU,EACf7E,EAAK6E,EAAU,EACfG,EAAgB5E,EAAKJ,EAAK8E,EAAKC,EAAK,EAAI9Z,EAAU,OAAS,CAACA,EAAU,OACtEsX,EAAiB,KAAK,KAAK,eAAiByC,EAC5CC,EAAe,KAAK,KAAK,aAAeD,EAExCpc,EAAQ,KAAK,MAEnB,QAASa,EAAI,EAAGC,EAAId,EAAM,OAAQa,EAAIC,EAAGD,IAAK,CAC1C,MAAMqB,EAAOlC,EAAMa,CAAC,EACdZ,EAAMiC,EAAK,OAEjB,GAAIwJ,GAAa,EAAG,CAChB,MAAMtL,EAAIH,EAAI,EACRI,EAAIJ,EAAI,EACRK,EAAIL,EAAI,EACRM,EAAIN,EAAI,EACd,IAAI2H,EAAI,KAAK,MAAMuU,EAAI3E,CAAE,EAAI,KAAK,MAAMlX,EAAGF,CAAC,EAAIuZ,EAE5C/R,EAAIvF,EAAU,GAAIuF,GAAKvF,EAAU,IAC5BuF,EAAI,CAACvF,EAAU,KAEpBuF,GAAKvF,EAAU,KACnBuF,GAAK8D,EACL,MAAMtJ,EAAM,KAAK,IAAIwF,CAAC,EAChBtF,EAAM,KAAK,IAAIsF,CAAC,EAEtB3H,EAAI,EAAImC,EAAMhC,EAAIkC,EAAMhC,EACxBL,EAAI,EAAImC,EAAM/B,EAAIiC,EAAM/B,EACxBN,EAAI,EAAIqC,EAAMlC,EAAIgC,EAAM9B,EACxBL,EAAI,EAAIqC,EAAMjC,EAAI+B,EAAM7B,CAC5B,CAEA,GAAIyb,EAAW,CACX,MAAMb,EAAO,KAAK,KAElBjG,EAAO,aAAaiG,EAAK,IAAI,KAAK,KAAK,QAAS,KAAK,KAAK,OAAO,CAAC,EAClElb,EAAI,KAAOkb,EAAK,EAAIlb,EAAI,IAAM0L,EAC9B1L,EAAI,KAAOkb,EAAK,EAAIlb,EAAI,IAAM2L,CAClC,CAEA,GAAIC,GAAa,EAAG,CAChB,IAAIqH,EAAI,KAAK,KAAKjT,EAAI,EAAIA,EAAI,EAAIA,EAAI,EAAIA,EAAI,CAAC,EAE3CiT,GAAK,IAAGA,GAAKA,GAAK,KAAK,KAAKsE,EAAKA,EAAK2E,EAAKA,CAAE,EAAIjJ,EAAI,KAAK,KAAK,cAAgBrH,GAAaqH,GAChGjT,EAAI,GAAKiT,EACTjT,EAAI,GAAKiT,CACb,CACA,GAAIpH,GAAa,EAAG,CAChB,IAAIoH,EAAI,KAAK,KAAKjT,EAAI,EAAIA,EAAI,EAAIA,EAAI,EAAIA,EAAI,CAAC,EAE3CiT,GAAK,IAAGA,GAAKA,GAAK,KAAK,KAAKgJ,EAAKA,EAAK9E,EAAKA,CAAE,EAAIlE,EAAI,KAAK,KAAK,cAAgBpH,GAAaoH,GAChGjT,EAAI,GAAKiT,EACTjT,EAAI,GAAKiT,CACb,CAEA,GAAInH,EAAY,EAAG,CACf,MAAM1L,EAAIJ,EAAI,EACRM,EAAIN,EAAI,EACRiI,EAAK,KAAK,MAAM3H,EAAGF,CAAC,EAC1B,IAAIuH,EAAI,KAAK,MAAMwP,EAAI8E,CAAE,EAAI,KAAK,MAAMC,EAAI3E,CAAE,GAAKtP,EAAK,KAAK,MAAMjI,EAAI,EAAGA,EAAI,CAAC,GAE3E2H,EAAIvF,EAAU,GAAIuF,GAAKvF,EAAU,IAC5BuF,EAAI,CAACvF,EAAU,KAEpBuF,GAAKvF,EAAU,KACnBuF,EAAIM,GAAMN,EAAIyU,GAAgBtQ,EAC9B,MAAMmH,EAAI,KAAK,KAAK7S,EAAIA,EAAIE,EAAIA,CAAC,EAEjCN,EAAI,EAAI,KAAK,IAAI2H,CAAC,EAAIsL,EACtBjT,EAAI,EAAI,KAAK,IAAI2H,CAAC,EAAIsL,CAC1B,CAEAhR,EAAK,uBAAuB,CAChC,CACJ,CAEA,oBAAqB,CACjB,MAAMwJ,EAAY,KAAK,UACjBC,EAAO,KAAK,KACZC,EAAO,KAAK,KACZC,EAAY,KAAK,UACjBC,EAAY,KAAK,UACjBC,EAAY,KAAK,UACjBiQ,EAAYrQ,GAAQ,GAAKC,GAAQ,EAEjCsJ,EAAS,KAAK,OACd+G,EAAY/G,EAAO,OACnBsC,EAAKyE,EAAU,EACfC,EAAKD,EAAU,EACfE,EAAKF,EAAU,EACf7E,EAAK6E,EAAU,EACfG,EAAgB5E,EAAKJ,EAAK8E,EAAKC,EAAK,EAAI9Z,EAAU,OAAS,CAACA,EAAU,OACtEsX,EAAiB,KAAK,KAAK,eAAiByC,EAC5CC,EAAe,KAAK,KAAK,aAAeD,EAExCpc,EAAQ,KAAK,MAEnB,QAASa,EAAI,EAAGC,EAAId,EAAM,OAAQa,EAAIC,EAAGD,IAAK,CAC1C,MAAMqB,EAAOlC,EAAMa,CAAC,EACdZ,EAAMiC,EAAK,OAEjB,GAAIwJ,GAAa,EAAG,CAChB,MAAMtL,EAAIH,EAAI,EACRI,EAAIJ,EAAI,EACRK,EAAIL,EAAI,EACRM,EAAIN,EAAI,EACd,IAAI2H,EAAI,KAAK,MAAMuU,EAAI3E,CAAE,EAAImC,EAEzB/R,EAAIvF,EAAU,GAAIuF,GAAKvF,EAAU,IAC5BuF,EAAI,CAACvF,EAAU,KAEpBuF,GAAKvF,EAAU,KACnBuF,GAAK8D,EACL,MAAMtJ,EAAM,KAAK,IAAIwF,CAAC,EAChBtF,EAAM,KAAK,IAAIsF,CAAC,EAEtB3H,EAAI,EAAImC,EAAMhC,EAAIkC,EAAMhC,EACxBL,EAAI,EAAImC,EAAM/B,EAAIiC,EAAM/B,EACxBN,EAAI,EAAIqC,EAAMlC,EAAIgC,EAAM9B,EACxBL,EAAI,EAAIqC,EAAMjC,EAAI+B,EAAM7B,CAC5B,CAEA,GAAIyb,EAAW,CACX,MAAMb,EAAO,KAAK,KAElBjG,EAAO,aAAaiG,EAAK,IAAI,KAAK,KAAK,QAAS,KAAK,KAAK,OAAO,CAAC,EAClElb,EAAI,IAAMkb,EAAK,EAAIxP,EACnB1L,EAAI,IAAMkb,EAAK,EAAIvP,CACvB,CAEA,GAAIC,GAAa,EAAG,CAChB,MAAMqH,GAAK,KAAK,KAAKsE,EAAKA,EAAK2E,EAAKA,CAAE,EAAI,EAAI,KAAK,KAAK,cAAgBtQ,EAAY,EAEpF5L,EAAI,GAAKiT,EACTjT,EAAI,GAAKiT,CACb,CACA,GAAIpH,GAAa,EAAG,CAChB,MAAMoH,GAAK,KAAK,KAAKgJ,EAAKA,EAAK9E,EAAKA,CAAE,EAAI,EAAI,KAAK,KAAK,cAAgBtL,EAAY,EAEpF7L,EAAI,GAAKiT,EACTjT,EAAI,GAAKiT,CACb,CAEA,GAAInH,EAAY,EAAG,CACf,IAAInE,EAAI,KAAK,MAAMwP,EAAI8E,CAAE,EAAI,KAAK,MAAMC,EAAI3E,CAAE,EAE1C5P,EAAIvF,EAAU,GAAIuF,GAAKvF,EAAU,IAC5BuF,EAAI,CAACvF,EAAU,KAEpBuF,GAAKvF,EAAU,KACnB,MAAMhC,EAAIJ,EAAI,EACRM,EAAIN,EAAI,EAEd2H,EAAI,KAAK,MAAMrH,EAAGF,CAAC,GAAKuH,EAAIvF,EAAU,GAAK,EAAIga,GAAgBtQ,EAC/D,MAAMmH,EAAI,KAAK,KAAK7S,EAAIA,EAAIE,EAAIA,CAAC,EAEjCN,EAAI,EAAI,KAAK,IAAI2H,CAAC,EAAIsL,EACtBjT,EAAI,EAAI,KAAK,IAAI2H,CAAC,EAAIsL,CAC1B,CAEAhR,EAAK,uBAAuB,CAChC,CACJ,CAEA,oBAAqB,CACjB,MAAMwJ,EAAY,KAAK,UACjBC,EAAO,KAAK,KACZC,EAAO,KAAK,KACZC,EAAY,KAAK,UACjBC,EAAY,KAAK,UACjBC,EAAY,KAAK,UAEjBmJ,EAAS,KAAK,OAEdlV,EAAQ,KAAK,MAEnB,QAASa,EAAI,EAAGC,EAAId,EAAM,OAAQa,EAAIC,EAAGD,IAAK,CAC1C,MAAMqB,EAAOlC,EAAMa,CAAC,EAEpB,IAAIqR,EAAWhQ,EAAK,UAEpB,GAAIwJ,GAAa,EAAG,CAChB,IAAI9D,EAAIsN,EAAO,UAAYhD,EAAW,KAAK,KAAK,eAEhDtK,IAAM,OAAU,mBAAqBA,EAAI,IAAO,IAAM,IACtDsK,GAAYtK,EAAI8D,CACpB,CAEA,IAAIxL,EAAIgC,EAAK,GACT/B,EAAI+B,EAAK,GAEbhC,IAAMgV,EAAO,GAAKhV,EAAI,KAAK,KAAK,SAAWyL,EAC3CxL,IAAM+U,EAAO,GAAK/U,EAAI,KAAK,KAAK,SAAWyL,EAE3C,IAAIM,EAAShK,EAAK,QACdiK,EAASjK,EAAK,QAEd2J,GAAa,GAAKK,GAAU,IAAGA,GAAUA,GAAUgJ,EAAO,QAAUhJ,EAAS,KAAK,KAAK,cAAgBL,GAAaK,GACpHJ,GAAa,GAAKK,GAAU,IAAGA,GAAUA,GAAU+I,EAAO,QAAU/I,EAAS,KAAK,KAAK,cAAgBL,GAAaK,GAExH,IAAIC,EAASlK,EAAK,QAElB,GAAI6J,GAAa,EAAG,CAChB,IAAInE,EAAIsN,EAAO,QAAU9I,EAAS,KAAK,KAAK,aAE5CxE,IAAM,OAAU,mBAAqBA,EAAI,IAAO,IAAM,IACtDwE,GAAUxE,EAAImE,CAClB,CAEA7J,EAAK,yBAAyBhC,EAAGC,EAAG+R,EAAUhG,EAAQC,EAAQjK,EAAK,QAASkK,CAAM,CACtF,CACJ,CAEA,oBAAqB,CACjB,MAAMV,EAAY,KAAK,UACjBC,EAAO,KAAK,KACZC,EAAO,KAAK,KACZC,EAAY,KAAK,UACjBC,EAAY,KAAK,UACjBC,EAAY,KAAK,UAEjBmJ,EAAS,KAAK,OAEdlV,EAAQ,KAAK,MAEnB,QAASa,EAAI,EAAGC,EAAId,EAAM,OAAQa,EAAIC,EAAGD,IAAK,CAC1C,MAAMqB,EAAOlC,EAAMa,CAAC,EAEdqR,EAAWhQ,EAAK,WAAagT,EAAO,UAAY,KAAK,KAAK,gBAAkBxJ,EAC5ExL,EAAIgC,EAAK,IAAMgT,EAAO,GAAK,KAAK,KAAK,SAAWvJ,EAChDxL,EAAI+B,EAAK,IAAMgT,EAAO,GAAK,KAAK,KAAK,SAAWtJ,EAChDM,EAAShK,EAAK,UAAYgT,EAAO,QAAU,EAAI,KAAK,KAAK,cAAgBrJ,EAAY,GACrFM,EAASjK,EAAK,UAAYgT,EAAO,QAAU,EAAI,KAAK,KAAK,cAAgBpJ,EAAY,GACrFM,EAASlK,EAAK,SAAWgT,EAAO,QAAU,KAAK,KAAK,cAAgBnJ,EAE1E7J,EAAK,yBAAyBhC,EAAGC,EAAG+R,EAAUhG,EAAQC,EAAQjK,EAAK,QAASkK,CAAM,CACtF,CACJ,CACJ,CCjTO,MAAMkQ,GAAN,KAAoE,CA6CvE,YAAYtQ,EAAoB,CAC5B,GAvBJ,kBAAe,IAAI,MAGnB,KAAoB,KAAA,KAOpB,KAAS,OAAA,EAIT,KAAS,OAAA,EAGT,KAAI,EAAA,EAGJ,KAAI,EAAA,EAGI,CAACA,EAAM,MAAM,IAAI,MAAM,sBAAsB,EACjD,KAAK,KAAOA,EAEZ,KAAK,MAAQ,IAAI,MACjB,QAASnL,EAAI,EAAGA,EAAImL,EAAK,MAAM,OAAQnL,IAAK,CACxC,MAAM0X,EAAWvM,EAAK,MAAMnL,CAAC,EAC7B,IAAIqB,EAEJ,GAAI,CAACqW,EAAS,OAAQrW,EAAO,IAAI6P,GAAKwG,EAAU,KAAM,IAAI,MACrD,CACD,MAAMvG,EAAS,KAAK,MAAMuG,EAAS,OAAO,KAAK,EAE/CrW,EAAO,IAAI6P,GAAKwG,EAAU,KAAMvG,CAAM,EACtCA,EAAO,SAAS,KAAK9P,CAAI,CAC7B,CACA,KAAK,MAAM,KAAKA,CAAI,CACxB,CAEA,KAAK,MAAQ,IAAI,MACjB,KAAK,UAAY,IAAI,MACrB,QAASrB,EAAI,EAAGA,EAAImL,EAAK,MAAM,OAAQnL,IAAK,CACxC,MAAM+X,EAAW5M,EAAK,MAAMnL,CAAC,EACvBqB,EAAO,KAAK,MAAM0W,EAAS,SAAS,KAAK,EACzCrZ,EAAO,IAAIsc,GAAKjD,EAAU1W,CAAI,EAEpC,KAAK,MAAM,KAAK3C,CAAI,EACpB,KAAK,UAAU,KAAKA,CAAI,CAC5B,CAEA,KAAK,cAAgB,IAAI,MACzB,QAASsB,EAAI,EAAGA,EAAImL,EAAK,cAAc,OAAQnL,IAAK,CAChD,MAAM0b,EAAmBvQ,EAAK,cAAcnL,CAAC,EAE7C,KAAK,cAAc,KAAK,IAAIoU,GAAasH,EAAkB,IAAI,CAAC,CACpE,CAEA,KAAK,qBAAuB,IAAI,MAChC,QAAS1b,EAAI,EAAGA,EAAImL,EAAK,qBAAqB,OAAQnL,IAAK,CACvD,MAAM2b,EAA0BxQ,EAAK,qBAAqBnL,CAAC,EAE3D,KAAK,qBAAqB,KAAK,IAAIib,GAAoBU,EAAyB,IAAI,CAAC,CACzF,CAEA,KAAK,gBAAkB,IAAI,MAC3B,QAAS3b,EAAI,EAAGA,EAAImL,EAAK,gBAAgB,OAAQnL,IAAK,CAClD,MAAM4b,EAAqBzQ,EAAK,gBAAgBnL,CAAC,EAEjD,KAAK,gBAAgB,KAAK,IAAI+a,GAAea,EAAoB,IAAI,CAAC,CAC1E,CAEA,KAAK,MAAQ,IAAI/a,EAAM,EAAG,EAAG,EAAG,CAAC,EACjC,KAAK,YACT,CAAA,CAIA,aAAc,CACV,MAAMgb,EAAc,KAAK,aAEzBA,EAAY,OAAS,EAErB,MAAM1c,EAAQ,KAAK,MAEnB,QAASa,EAAI,EAAGC,EAAId,EAAM,OAAQa,EAAIC,EAAGD,IAAK,CAC1C,MAAMqB,EAAOlC,EAAMa,CAAC,EAEpBqB,EAAK,OAASA,EAAK,KAAK,aACxBA,EAAK,OAAS,CAACA,EAAK,MACxB,CAEA,GAAI,KAAK,KAAM,CACX,MAAMya,EAAY,KAAK,KAAK,MAE5B,QAAS9b,EAAI,EAAGC,EAAI,KAAK,KAAK,MAAM,OAAQD,EAAIC,EAAGD,IAAK,CACpD,IAAIqB,EAAoB,KAAK,MAAMya,EAAU9b,CAAC,EAAE,KAAK,EAErD,GACIqB,EAAK,OAAS,GACdA,EAAK,OAAS,GACdA,EAAOA,EAAK,aACPA,EACb,CACJ,CAGA,MAAM0a,EAAgB,KAAK,cACrBC,EAAuB,KAAK,qBAC5BC,EAAkB,KAAK,gBACvBC,EAAUH,EAAc,OACxBI,EAAiBH,EAAqB,OACtCI,EAAYH,EAAgB,OAC5BI,EAAkBH,EAAUC,EAAiBC,EAGnDxM,EAAO,QAAS5P,EAAI,EAAGA,EAAIqc,EAAiBrc,IAAK,CAC7C,QAASsG,EAAK,EAAGA,EAAK4V,EAAS5V,IAAM,CACjC,MAAMoE,EAAaqR,EAAczV,CAAE,EAEnC,GAAIoE,EAAW,KAAK,OAAS1K,EAAG,CAC5B,KAAK,iBAAiB0K,CAAU,EAEhC,SAASkF,CACb,CACJ,CACA,QAAStJ,EAAK,EAAGA,EAAK6V,EAAgB7V,IAAM,CACxC,MAAMoE,EAAasR,EAAqB1V,CAAE,EAE1C,GAAIoE,EAAW,KAAK,OAAS1K,EAAG,CAC5B,KAAK,wBAAwB0K,CAAU,EAEvC,SAASkF,CACb,CACJ,CACA,QAAStJ,EAAK,EAAGA,EAAK8V,EAAW9V,IAAM,CACnC,MAAMoE,EAAauR,EAAgB3V,CAAE,EAErC,GAAIoE,EAAW,KAAK,OAAS1K,EAAG,CAC5B,KAAK,mBAAmB0K,CAAU,EAElC,SAASkF,CACb,CACJ,CACJ,CAEA,QAAS5P,EAAI,EAAGC,EAAId,EAAM,OAAQa,EAAIC,EAAGD,IAAK,KAAK,SAASb,EAAMa,CAAC,CAAC,CACxE,CAEA,iBAAiB0K,EAA0B,CAEvC,GADAA,EAAW,OAASA,EAAW,OAAO,SAAA,IAAe,CAACA,EAAW,KAAK,cAAiB,KAAK,MAAQjK,EAAM,SAAS,KAAK,KAAK,YAAaiK,EAAW,KAAM,EAAI,GAC3J,CAACA,EAAW,OAAQ,OAExB,MAAM2J,EAAS3J,EAAW,OAE1B,KAAK,SAAS2J,CAAM,EAEpB,MAAMiI,EAAc5R,EAAW,MACzByG,EAASmL,EAAY,CAAC,EAI5B,GAFA,KAAK,SAASnL,CAAM,EAEhBmL,EAAY,QAAU,EACtB,KAAK,aAAa,KAAK5R,CAAU,EACjC,KAAK,UAAUyG,EAAO,QAAQ,MAC3B,CACH,MAAM+D,EAAQoH,EAAYA,EAAY,OAAS,CAAC,EAEhD,KAAK,SAASpH,CAAK,EAEnB,KAAK,aAAa,KAAKxK,CAAU,EAEjC,KAAK,UAAUyG,EAAO,QAAQ,EAC9B+D,EAAM,OAAS,EACnB,CACJ,CAEA,mBAAmBxK,EAA4B,CAE3C,GADAA,EAAW,OAASA,EAAW,OAAO,KAAK,SAAS,IAAM,CAACA,EAAW,KAAK,cAAiB,KAAK,MAAQjK,EAAM,SAAS,KAAK,KAAK,YAAaiK,EAAW,KAAM,EAAI,GAChK,CAACA,EAAW,OAAQ,OAExB,MAAMhM,EAAOgM,EAAW,OAClB7C,EAAYnJ,EAAK,KAAK,MACtB6d,EAAW7d,EAAK,KAElB,KAAK,MAAM,KAAK,6BAA6B,KAAK,KAAMmJ,EAAW0U,CAAQ,EAC3E,KAAK,KAAK,aAAe,KAAK,KAAK,aAAe,KAAK,MAAM,KAAK,6BAA6B,KAAK,KAAK,YAAa1U,EAAW0U,CAAQ,EAC7I,QAASvc,EAAI,EAAGC,EAAI,KAAK,KAAK,MAAM,OAAQD,EAAIC,EAAGD,IAAK,KAAK,6BAA6B,KAAK,KAAK,MAAMA,CAAC,EAAG6H,EAAW0U,CAAQ,EAEjI,MAAM/b,EAAa9B,EAAK,cAAc,EAElC8B,aAAsBW,IAAgB,KAAK,iCAAiCX,EAAY+b,CAAQ,EAEpG,MAAMD,EAAc5R,EAAW,MACzByN,EAAYmE,EAAY,OAE9B,QAAStc,EAAI,EAAGA,EAAImY,EAAWnY,IAAK,KAAK,SAASsc,EAAYtc,CAAC,CAAC,EAEhE,KAAK,aAAa,KAAK0K,CAAU,EAEjC,QAAS1K,EAAI,EAAGA,EAAImY,EAAWnY,IAAK,KAAK,UAAUsc,EAAYtc,CAAC,EAAE,QAAQ,EAC1E,QAASA,EAAI,EAAGA,EAAImY,EAAWnY,IAAKsc,EAAYtc,CAAC,EAAE,OAAS,EAChE,CAEA,wBAAwB0K,EAAiC,CAErD,GADAA,EAAW,OAASA,EAAW,OAAO,aAAe,CAACA,EAAW,KAAK,cAAiB,KAAK,MAAQjK,EAAM,SAAS,KAAK,KAAK,YAAaiK,EAAW,KAAM,EAAI,GAC3J,CAACA,EAAW,OAAQ,OAExB,KAAK,SAASA,EAAW,MAAM,EAE/B,MAAM4R,EAAc5R,EAAW,MACzByN,EAAYmE,EAAY,OAE9B,GAAI5R,EAAW,KAAK,MAChB,QAAS1K,EAAI,EAAGA,EAAImY,EAAWnY,IAAK,CAChC,MAAMkV,EAAQoH,EAAYtc,CAAC,EAE3B,KAAK,SAASkV,EAAM,MAAM,EAC1B,KAAK,SAASA,CAAK,CACvB,KAESlV,SAAAA,EAAI,EAAGA,EAAImY,EAAWnY,IAC3B,KAAK,SAASsc,EAAYtc,CAAC,CAAC,EAIpC,KAAK,aAAa,KAAK0K,CAAU,EAEjC,QAAS1K,EAAI,EAAGA,EAAImY,EAAWnY,IAAK,KAAK,UAAUsc,EAAYtc,CAAC,EAAE,QAAQ,EAC1E,QAASA,EAAI,EAAGA,EAAImY,EAAWnY,IAAKsc,EAAYtc,CAAC,EAAE,OAAS,EAChE,CAEA,6BAA6BiR,EAAYpJ,EAAmB0U,EAAgB,CACxE,MAAMzO,EAAcmD,EAAK,YAAYpJ,CAAS,EAE9C,GAAKiG,EACL,UAAW8C,KAAO9C,EACd,KAAK,iCAAiCA,EAAY8C,CAAG,EAAG2L,CAAQ,CAExE,CAEA,iCAAiC/b,EAAwB+b,EAAgB,CACrE,GAAI,EAAE/b,aAAsBW,IAAiB,OAC7C,MAAMqb,EAA6Bhc,EAAY,MAE/C,GAAI,CAACgc,EAAW,KAAK,SAASD,CAAQ,MACjC,CACD,MAAMpd,EAAQ,KAAK,MAEnB,QAASa,EAAI,EAAGC,EAAIuc,EAAU,OAAQxc,EAAIC,GAAK,CAC3C,IAAIwc,EAAKD,EAAUxc,GAAG,EAGtB,IADAyc,GAAMzc,EACCA,EAAIyc,GAAI,KAAK,SAAStd,EAAMqd,EAAUxc,GAAG,CAAC,CAAC,CACtD,CACJ,CACJ,CAEA,SAASqB,EAAY,CAEjB,GADI,CAACA,GACDA,EAAK,OAAQ,OACjB,MAAM8P,EAAS9P,EAAK,OAEhB8P,GAAQ,KAAK,SAASA,CAAM,EAChC9P,EAAK,OAAS,GACd,KAAK,aAAa,KAAKA,CAAI,CAC/B,CAEA,UAAUlC,EAAoB,CAC1B,QAASa,EAAI,EAAGC,EAAId,EAAM,OAAQa,EAAIC,EAAGD,IAAK,CAC1C,MAAMqB,EAAOlC,EAAMa,CAAC,EAEfqB,EAAK,SACNA,EAAK,QAAQ,KAAK,UAAUA,EAAK,QAAQ,EAC7CA,EAAK,OAAS,GAClB,CACJ,CAMA,sBAAuB,CACnB,MAAMlC,EAAQ,KAAK,MAEnB,QAASa,EAAI,EAAGC,EAAId,EAAM,OAAQa,EAAIC,EAAGD,IAAK,CAC1C,MAAMqB,EAAOlC,EAAMa,CAAC,EAEpBqB,EAAK,GAAKA,EAAK,EACfA,EAAK,GAAKA,EAAK,EACfA,EAAK,UAAYA,EAAK,SACtBA,EAAK,QAAUA,EAAK,OACpBA,EAAK,QAAUA,EAAK,OACpBA,EAAK,QAAUA,EAAK,OACpBA,EAAK,QAAUA,EAAK,MACxB,CAEA,MAAMwa,EAAc,KAAK,aAEzB,QAAS7b,EAAI,EAAGC,EAAI4b,EAAY,OAAQ7b,EAAIC,EAAGD,IAAK6b,EAAY7b,CAAC,EAAE,OACvE,CAAA,CAEA,yBAAyBmR,EAAc,CAEnC,MAAMuL,EAAW,KAAK,YAAA,EAChB9K,EAAKT,EAAO,OAAO,EACnBU,EAAKV,EAAO,OAAO,EACnBW,EAAKX,EAAO,OAAO,EACnBY,EAAKZ,EAAO,OAAO,EAEzBuL,EAAS,OAAO,GAAK9K,EAAK,KAAK,EAAIC,EAAK,KAAK,EAAIV,EAAO,OACxDuL,EAAS,OAAO,GAAK5K,EAAK,KAAK,EAAIC,EAAK,KAAK,EAAIZ,EAAO,OAExD,MAAMQ,EAAY+K,EAAS,SAAW,GAAKA,EAAS,OAC9CzK,EAAKzQ,EAAU,OAAOkb,EAAS,SAAWA,EAAS,MAAM,EAAIA,EAAS,OACtExK,EAAK1Q,EAAU,OAAOmQ,CAAS,EAAI+K,EAAS,OAC5CvK,EAAK3Q,EAAU,OAAOkb,EAAS,SAAWA,EAAS,MAAM,EAAIA,EAAS,OACtEtK,EAAK5Q,EAAU,OAAOmQ,CAAS,EAAI+K,EAAS,OAE5ClL,EAAK,KAAK,OACVC,EAAKC,GAAS,MAAQ,CAAC,KAAK,OAAS,KAAK,OAEhDgL,EAAS,OAAO,GAAK9K,EAAKK,EAAKJ,EAAKM,GAAMX,EAC1CkL,EAAS,OAAO,GAAK9K,EAAKM,EAAKL,EAAKO,GAAMZ,EAC1CkL,EAAS,OAAO,GAAK5K,EAAKG,EAAKF,EAAKI,GAAMV,EAC1CiL,EAAS,OAAO,GAAK5K,EAAKI,EAAKH,EAAKK,GAAMX,EAG1C,MAAMoK,EAAc,KAAK,aAEzB,QAAS7b,EAAI,EAAGC,EAAI4b,EAAY,OAAQ7b,EAAIC,EAAGD,IAAK,CAChD,MAAM2c,EAAYd,EAAY7b,CAAC,EAE3B2c,GAAaD,GAAUC,EAAU,OACzC,CAAA,CACJ,CAGA,gBAAiB,CACb,KAAK,oBAAoB,EACzB,KAAK,oBAAA,CACT,CAGA,qBAAsB,CAClB,MAAMxd,EAAQ,KAAK,MAEnB,QAASa,EAAI,EAAGC,EAAId,EAAM,OAAQa,EAAIC,EAAGD,IAAKb,EAAMa,CAAC,EAAE,eAAA,EAEvD,MAAM+b,EAAgB,KAAK,cAE3B,QAAS/b,EAAI,EAAGC,EAAI8b,EAAc,OAAQ/b,EAAIC,EAAGD,IAAK,CAClD,MAAM0K,EAAaqR,EAAc/b,CAAC,EAElC0K,EAAW,IAAMA,EAAW,KAAK,IACjCA,EAAW,SAAWA,EAAW,KAAK,SACtCA,EAAW,cAAgBA,EAAW,KAAK,cAC3CA,EAAW,SAAWA,EAAW,KAAK,SACtCA,EAAW,QAAUA,EAAW,KAAK,OACzC,CAEA,MAAMsR,EAAuB,KAAK,qBAElC,QAAShc,EAAI,EAAGC,EAAI+b,EAAqB,OAAQhc,EAAIC,EAAGD,IAAK,CACzD,MAAM0K,EAAasR,EAAqBhc,CAAC,EACnCmL,EAAOT,EAAW,KAExBA,EAAW,UAAYS,EAAK,UAC5BT,EAAW,KAAOS,EAAK,KACvBT,EAAW,KAAOS,EAAK,KACvBT,EAAW,UAAYS,EAAK,UAC5BT,EAAW,UAAYS,EAAK,UAC5BT,EAAW,UAAYS,EAAK,SAChC,CAEA,MAAM8Q,EAAkB,KAAK,gBAE7B,QAASjc,EAAI,EAAGC,EAAIgc,EAAgB,OAAQjc,EAAIC,EAAGD,IAAK,CACpD,MAAM0K,EAAauR,EAAgBjc,CAAC,EAC9BmL,EAAOT,EAAW,KAExBA,EAAW,SAAWS,EAAK,SAC3BT,EAAW,QAAUS,EAAK,QAC1BT,EAAW,UAAYS,EAAK,UAC5BT,EAAW,KAAOS,EAAK,KACvBT,EAAW,KAAOS,EAAK,IAC3B,CACJ,CAGA,qBAAsB,CAClB,MAAMlB,EAAQ,KAAK,MAEnBxJ,EAAM,UAAUwJ,EAAO,EAAG,KAAK,UAAW,EAAGA,EAAM,MAAM,EACzD,QAASjK,EAAI,EAAGC,EAAIgK,EAAM,OAAQjK,EAAIC,EAAGD,IAAKiK,EAAMjK,CAAC,EAAE,eAC3D,CAAA,CAGA,aAAc,CACV,OAAI,KAAK,MAAM,QAAU,EAAU,KAE5B,KAAK,MAAM,CAAC,CACvB,CAGA,SAAS4c,EAAkB,CACvB,GAAI,CAACA,EAAU,MAAM,IAAI,MAAM,0BAA0B,EACzD,MAAMzd,EAAQ,KAAK,MAEnB,QAASa,EAAI,EAAGC,EAAId,EAAM,OAAQa,EAAIC,EAAGD,IAAK,CAC1C,MAAMqB,EAAOlC,EAAMa,CAAC,EAEpB,GAAIqB,EAAK,KAAK,MAAQub,EAAU,OAAOvb,CAC3C,CAEA,OAAO,IACX,CAGA,cAAcub,EAAkB,CAC5B,GAAI,CAACA,EAAU,MAAM,IAAI,MAAM,0BAA0B,EACzD,MAAMzd,EAAQ,KAAK,MAEnB,QAASa,EAAI,EAAGC,EAAId,EAAM,OAAQa,EAAIC,EAAGD,IAAK,GAAIb,EAAMa,CAAC,EAAE,KAAK,MAAQ4c,EAAU,OAAO5c,EAEzF,MAAO,EACX,CAKA,SAAS6c,EAAkB,CACvB,GAAI,CAACA,EAAU,MAAM,IAAI,MAAM,0BAA0B,EACzD,MAAM5S,EAAQ,KAAK,MAEnB,QAASjK,EAAI,EAAGC,EAAIgK,EAAM,OAAQjK,EAAIC,EAAGD,IAAK,CAC1C,MAAMtB,EAAOuL,EAAMjK,CAAC,EAEpB,GAAItB,EAAK,KAAK,MAAQme,EAAU,OAAOne,CAC3C,CAEA,OAAO,IACX,CAGA,cAAcme,EAAkB,CAC5B,GAAI,CAACA,EAAU,MAAM,IAAI,MAAM,0BAA0B,EACzD,MAAM5S,EAAQ,KAAK,MAEnB,QAASjK,EAAI,EAAGC,EAAIgK,EAAM,OAAQjK,EAAIC,EAAGD,IAAK,GAAIiK,EAAMjK,CAAC,EAAE,KAAK,MAAQ6c,EAAU,OAAO7c,EAEzF,MAAO,EACX,CAKA,cAAc8c,EAAkB,CAC5B,MAAM7L,EAAO,KAAK,KAAK,SAAS6L,CAAQ,EAExC,GAAI,CAAC7L,EAAM,MAAM,IAAI,MAAM,mBAAmB6L,GAAU,EACxD,KAAK,QAAQ7L,CAAI,CACrB,CAYA,QAAQ8L,EAAe,CACnB,GAAIA,GAAW,KAAK,KACpB,CAAA,GAAIA,EACA,GAAI,KAAK,KAAMA,EAAQ,UAAU,KAAM,KAAK,IAAI,MAC3C,CACD,MAAM9S,EAAQ,KAAK,MAEnB,QAASjK,EAAI,EAAGC,EAAIgK,EAAM,OAAQjK,EAAIC,EAAGD,IAAK,CAC1C,MAAMtB,EAAOuL,EAAMjK,CAAC,EACdxB,EAAOE,EAAK,KAAK,eAEvB,GAAIF,EAAM,CACN,MAAMgC,EAAauc,EAAQ,cAAc/c,EAAGxB,CAAI,EAE5CgC,GAAY9B,EAAK,cAAc8B,CAAU,CACjD,CACJ,CACJ,CAEJ,KAAK,KAAOuc,EACZ,KAAK,YAAY,CAAA,CACrB,CAOA,oBAAoBF,EAAkBhU,EAA2C,CAC7E,MAAMnK,EAAO,KAAK,KAAK,SAASme,CAAQ,EAExC,GAAI,CAACne,EAAM,MAAM,IAAI,MAAM,6BAA6Bme,GAAU,EAElE,OAAO,KAAK,cAAcne,EAAK,MAAOmK,CAAc,CACxD,CAOA,cAAchB,EAAmBgB,EAA2C,CACxE,GAAI,CAACA,EAAgB,MAAM,IAAI,MAAM,gCAAgC,EACrE,GAAI,KAAK,KAAM,CACX,MAAMrI,EAAa,KAAK,KAAK,cAAcqH,EAAWgB,CAAc,EAEpE,GAAIrI,EAAY,OAAOA,CAC3B,CACA,OAAI,KAAK,KAAK,YAAoB,KAAK,KAAK,YAAY,cAAcqH,EAAWgB,CAAc,EAExF,IACX,CAKA,cAAcgU,EAAkBhU,EAAwB,CACpD,GAAI,CAACgU,EAAU,MAAM,IAAI,MAAM,0BAA0B,EACzD,MAAM5S,EAAQ,KAAK,MAEnB,QAASjK,EAAI,EAAGC,EAAIgK,EAAM,OAAQjK,EAAIC,EAAGD,IAAK,CAC1C,MAAMtB,EAAOuL,EAAMjK,CAAC,EAEpB,GAAItB,EAAK,KAAK,MAAQme,EAAU,CAC5B,IAAIrc,EAAgC,KAEpC,GAAIqI,IACArI,EAAa,KAAK,cAAcR,EAAG6I,CAAc,EAC7C,CAACrI,GAAY,MAAM,IAAI,MAAM,yBAAyBqI,gBAA6BgU,GAAU,EAErGne,EAAK,cAAc8B,CAAU,EAE7B,MACJ,CACJ,CACA,MAAM,IAAI,MAAM,mBAAmBqc,GAAU,CACjD,CAKA,iBAAiBG,EAAwB,CACrC,GAAI,CAACA,EAAgB,MAAM,IAAI,MAAM,gCAAgC,EACrE,MAAMjB,EAAgB,KAAK,cAE3B,QAAS/b,EAAI,EAAGC,EAAI8b,EAAc,OAAQ/b,EAAIC,EAAGD,IAAK,CAClD,MAAMid,EAAelB,EAAc/b,CAAC,EAEpC,GAAIid,EAAa,KAAK,MAAQD,EAAgB,OAAOC,CACzD,CAEA,OAAO,IACX,CAKA,wBAAwBD,EAAwB,CAC5C,GAAI,CAACA,EAAgB,MAAM,IAAI,MAAM,gCAAgC,EACrE,MAAMhB,EAAuB,KAAK,qBAElC,QAAShc,EAAI,EAAGC,EAAI+b,EAAqB,OAAQhc,EAAIC,EAAGD,IAAK,CACzD,MAAM0K,EAAasR,EAAqBhc,CAAC,EAEzC,GAAI0K,EAAW,KAAK,MAAQsS,EAAgB,OAAOtS,CACvD,CAEA,OAAO,IACX,CAKA,mBAAmBsS,EAAwB,CACvC,GAAI,CAACA,EAAgB,MAAM,IAAI,MAAM,gCAAgC,EACrE,MAAMf,EAAkB,KAAK,gBAE7B,QAASjc,EAAI,EAAGC,EAAIgc,EAAgB,OAAQjc,EAAIC,EAAGD,IAAK,CACpD,MAAM0K,EAAauR,EAAgBjc,CAAC,EAEpC,GAAI0K,EAAW,KAAK,MAAQsS,EAAgB,OAAOtS,CACvD,CAEA,OAAO,IACX,CAIA,eAAgB,CACZ,MAAM5L,EAAS,IAAIoc,GACbrW,EAAO,IAAIqW,GAEjB,OAAA,KAAK,UAAUpc,EAAQ+F,CAAI,EAEpB,CAAE,EAAG/F,EAAO,EAAG,EAAGA,EAAO,EAAG,MAAO+F,EAAK,EAAG,OAAQA,EAAK,CAAE,CACrE,CAMA,UAAU/F,EAAiB+F,EAAeyV,EAAsB,IAAI,MAAc,CAAC,EAAG,CAClF,GAAI,CAACxb,EAAQ,MAAM,IAAI,MAAM,wBAAwB,EACrD,GAAI,CAAC+F,EAAM,MAAM,IAAI,MAAM,sBAAsB,EACjD,MAAMiF,EAAY,KAAK,UACvB,IAAImN,EAAO,OAAO,kBACdE,EAAO,OAAO,kBACdE,EAAO,OAAO,kBACdE,EAAO,OAAO,kBAElB,QAASvX,EAAI,EAAGC,EAAI6J,EAAU,OAAQ9J,EAAIC,EAAGD,IAAK,CAC9C,MAAMtB,EAAOoL,EAAU9J,CAAC,EAExB,GAAI,CAACtB,EAAK,KAAK,OAAQ,SACvB,IAAIwa,EAAiB,EACjBha,EAAmC,KACvC,MAAMsB,EAAa9B,EAAK,cAAc,EAEtC,GAAI8B,aAAsBuC,EACtBmW,EAAiB,EACjBha,EAAWuB,EAAM,aAAa6Z,EAAMpB,EAAgB,CAAC,EAClC1Y,EAAY,qBAAqB9B,EAAMQ,EAAU,EAAG,CAAC,UACjEsB,aAAsBQ,GAAgB,CAC7C,MAAMkc,EAAuB1c,EAE7B0Y,EAAiBgE,EAAK,oBACtBhe,EAAWuB,EAAM,aAAa6Z,EAAMpB,EAAgB,CAAC,EACrDgE,EAAK,qBAAqBxe,EAAM,EAAGwa,EAAgBha,EAAU,EAAG,CAAC,CACrE,CACA,GAAIA,EACA,QAASoH,EAAK,EAAGmW,EAAKvd,EAAS,OAAQoH,EAAKmW,EAAInW,GAAM,EAAG,CACrD,MAAMjH,EAAIH,EAASoH,CAAE,EACfhH,EAAIJ,EAASoH,EAAK,CAAC,EAEzB2Q,EAAO,KAAK,IAAIA,EAAM5X,CAAC,EACvB8X,EAAO,KAAK,IAAIA,EAAM7X,CAAC,EACvB+X,EAAO,KAAK,IAAIA,EAAMhY,CAAC,EACvBkY,EAAO,KAAK,IAAIA,EAAMjY,CAAC,CAC3B,CAER,CACAR,EAAO,IAAImY,EAAME,CAAI,EACrBtS,EAAK,IAAIwS,EAAOJ,EAAMM,EAAOJ,CAAI,CACrC,CAEA,IAAI,OAAiB,CACjB,OAAO,KAAK,QAAU,EAC1B,CAEA,IAAI,MAAMnS,EAAgB,CACjByW,GAAS,qBACVA,GAAS,mBAAqB,GAC9B,QAAQ,KAAK,4FAA4F,GAE7G,KAAK,OAASzW,EAAQ,EAAM,EAChC,CAEA,IAAI,OAAiB,CACjB,OAAO,KAAK,QAAU,EAC1B,CAEA,IAAI,MAAMA,EAAgB,CACjByW,GAAS,qBACVA,GAAS,mBAAqB,GAC9B,QAAQ,KAAK,4FAA4F,GAE7G,KAAK,OAASzW,EAAQ,EAAM,EAChC,CAGJ,EApsBO,IAAMmY,GAAN1B,GAAM0B,GAmsBM,mBAAqB,GCnsB3B,MAAAC,EAAqJ,CAA3J,aAAA,CAEH,KAAsB,KAAA,KAGtB,WAAQ,IAAI,MAGZ,KAAQ,MAAA,IAAI,MACZ,KAAA,MAAQ,IAAI,MAMZ,KAAA,YAA2B,KAG3B,KAAA,OAAS,IAAI,MAGb,KAAa,WAAA,IAAI,MAGjB,KAAA,cAAgB,IAAI,MAGpB,KAAuB,qBAAA,IAAI,MAG3B,KAAkB,gBAAA,IAAI,MAGtB,KAAA,EAAI,EAGJ,KAAA,EAAI,EAGJ,KAAA,MAAQ,EAGR,KAAA,OAAS,EAGT,KAAA,QAAyB,KAGzB,KAAA,KAAsB,KAItB,KAAM,IAAA,EAGN,KAA4B,WAAA,KAG5B,KAA2B,UAAA,IAAA,CAK3B,SAASR,EAAkB,CACvB,GAAI,CAACA,EAAU,MAAM,IAAI,MAAM,0BAA0B,EACzD,MAAMzd,EAAQ,KAAK,MAEnB,QAASa,EAAI,EAAGC,EAAId,EAAM,OAAQa,EAAIC,EAAGD,IAAK,CAC1C,MAAMqB,EAAOlC,EAAMa,CAAC,EAEpB,GAAIqB,EAAK,MAAQub,EAAU,OAAOvb,CACtC,CAEA,OAAO,IACX,CAGA,cAAcub,EAAkB,CAC5B,GAAI,CAACA,EAAU,MAAM,IAAI,MAAM,0BAA0B,EACzD,MAAMzd,EAAQ,KAAK,MAEnB,QAASa,EAAI,EAAGC,EAAId,EAAM,OAAQa,EAAIC,EAAGD,IAAK,GAAIb,EAAMa,CAAC,EAAE,MAAQ4c,EAAU,OAAO5c,EAEpF,MAAO,EACX,CAKA,SAAS6c,EAAkB,CACvB,GAAI,CAACA,EAAU,MAAM,IAAI,MAAM,0BAA0B,EACzD,MAAM5S,EAAQ,KAAK,MAEnB,QAASjK,EAAI,EAAGC,EAAIgK,EAAM,OAAQjK,EAAIC,EAAGD,IAAK,CAC1C,MAAMtB,EAAOuL,EAAMjK,CAAC,EAEpB,GAAItB,EAAK,MAAQme,EAAU,OAAOne,CACtC,CAEA,OAAO,IACX,CAGA,cAAcme,EAAkB,CAC5B,GAAI,CAACA,EAAU,MAAM,IAAI,MAAM,0BAA0B,EACzD,MAAM5S,EAAQ,KAAK,MAEnB,QAASjK,EAAI,EAAGC,EAAIgK,EAAM,OAAQjK,EAAIC,EAAGD,IAAK,GAAIiK,EAAMjK,CAAC,EAAE,MAAQ6c,EAAU,OAAO7c,EAEpF,MAAO,EACX,CAKA,SAAS8c,EAAkB,CACvB,GAAI,CAACA,EAAU,MAAM,IAAI,MAAM,0BAA0B,EACzD,MAAMO,EAAQ,KAAK,MAEnB,QAASrd,EAAI,EAAGC,EAAIod,EAAM,OAAQrd,EAAIC,EAAGD,IAAK,CAC1C,MAAMiR,EAAOoM,EAAMrd,CAAC,EAEpB,GAAIiR,EAAK,MAAQ6L,EAAU,OAAO7L,CACtC,CAEA,OAAO,IACX,CAKA,UAAUqM,EAAuB,CAC7B,GAAI,CAACA,EAAe,MAAM,IAAI,MAAM,+BAA+B,EACnE,MAAMrZ,EAAS,KAAK,OAEpB,QAASjE,EAAI,EAAGC,EAAIgE,EAAO,OAAQjE,EAAIC,EAAGD,IAAK,CAC3C,MAAM0J,EAAQzF,EAAOjE,CAAC,EAEtB,GAAI0J,EAAM,MAAQ4T,EAAe,OAAO5T,CAC5C,CAEA,OAAO,IACX,CAKA,cAAc4F,EAAuB,CACjC,GAAI,CAACA,EAAe,MAAM,IAAI,MAAM,+BAA+B,EACnE,MAAMiO,EAAa,KAAK,WAExB,QAASvd,EAAI,EAAGC,EAAIsd,EAAW,OAAQvd,EAAIC,EAAGD,IAAK,CAC/C,MAAMuP,EAAYgO,EAAWvd,CAAC,EAE9B,GAAIuP,EAAU,MAAQD,EAAe,OAAOC,CAChD,CAEA,OAAO,IACX,CAKA,iBAAiByN,EAAwB,CACrC,GAAI,CAACA,EAAgB,MAAM,IAAI,MAAM,gCAAgC,EACrE,MAAMjB,EAAgB,KAAK,cAE3B,QAAS/b,EAAI,EAAGC,EAAI8b,EAAc,OAAQ/b,EAAIC,EAAGD,IAAK,CAClD,MAAM0K,EAAaqR,EAAc/b,CAAC,EAElC,GAAI0K,EAAW,MAAQsS,EAAgB,OAAOtS,CAClD,CAEA,OAAO,IACX,CAKA,wBAAwBsS,EAAwB,CAC5C,GAAI,CAACA,EAAgB,MAAM,IAAI,MAAM,gCAAgC,EACrE,MAAMhB,EAAuB,KAAK,qBAElC,QAAShc,EAAI,EAAGC,EAAI+b,EAAqB,OAAQhc,EAAIC,EAAGD,IAAK,CACzD,MAAM0K,EAAasR,EAAqBhc,CAAC,EAEzC,GAAI0K,EAAW,MAAQsS,EAAgB,OAAOtS,CAClD,CAEA,OAAO,IACX,CAKA,mBAAmBsS,EAAwB,CACvC,GAAI,CAACA,EAAgB,MAAM,IAAI,MAAM,gCAAgC,EACrE,MAAMf,EAAkB,KAAK,gBAE7B,QAASjc,EAAI,EAAGC,EAAIgc,EAAgB,OAAQjc,EAAIC,EAAGD,IAAK,CACpD,MAAM0K,EAAauR,EAAgBjc,CAAC,EAEpC,GAAI0K,EAAW,MAAQsS,EAAgB,OAAOtS,CAClD,CAEA,OAAO,IACX,CAEsC,wBAAwB8S,EAA4B,CACtF,GAAIA,GAAsB,KAAM,MAAM,IAAI,MAAM,oCAAoC,EACpF,MAAMvB,EAAkB,KAAK,gBAE7B,QAASjc,EAAI,EAAGC,EAAIgc,EAAgB,OAAQjc,EAAIC,EAAGD,IAAK,GAAIic,EAAgBjc,CAAC,EAAE,MAAQwd,EAAoB,OAAOxd,EAElH,MAAO,EACX,CACJ,CC/NO,MAAMyd,EAA8B,CAwBvC,YAAYxa,EAAezE,EAAckZ,EAAoB,CACzD,GAvBJ,KAAQ,MAAA,EAUR,KAAQ,MAAA,IAAI7W,EAAM,EAAG,EAAG,EAAG,CAAC,EAI5B,KAA0B,UAAA,KAG1B,KAAgC,eAAA,KAGhC,eAAyB6c,GAAY,OAG7Bza,EAAQ,EAAG,MAAM,IAAI,MAAM,qBAAqB,EACpD,GAAI,CAACzE,EAAM,MAAM,IAAI,MAAM,sBAAsB,EACjD,GAAI,CAACkZ,EAAU,MAAM,IAAI,MAAM,0BAA0B,EACzD,KAAK,MAAQzU,EACb,KAAK,KAAOzE,EACZ,KAAK,SAAWkZ,CACpB,CACJ,CCjCO,MAAMiG,WAAgC5J,EAAe,CA0CxD,YAAYvV,EAAc,CACtB,MAAMA,EAAM,EAAG,EAAK,EAzCxB,KAAQ,MAAA,IAAI,MAGZ,KAAQ,QAA2B,KASnC,KAAY,UAAA,EACZ,UAAO,EACP,KAAA,KAAO,EACP,KAAA,UAAY,EACZ,KAAY,UAAA,EACZ,KAAY,UAAA,EAGZ,oBAAiB,EAGjB,KAAA,QAAU,EAGV,KAAA,QAAU,EAGV,KAAA,aAAe,EAGf,KAAA,aAAe,EAGf,KAAe,aAAA,EAEf,KAAW,SAAA,GACX,WAAQ,EAIR,CAtCA,IAAW,OAAOkZ,EAAoB,CAClC,KAAK,QAAUA,CACnB,CACA,IAAW,QAAS,CAChB,GAAK,KAAK,QACL,OAAO,KAAK,QADE,MAAM,IAAI,MAAM,mBAAmB,CAE1D,CAiCJ,CC3CO,MAAMkG,EAAU,CACnB,YAAmB/V,EAA0BrJ,EAAqBgC,EAAwB,CAAvE,KAAA,UAAAqH,EAA0B,KAAArJ,KAAAA,EAAqB,KAAAgC,WAAAA,CAAyB,CAC/F,CAQa,MAAAqd,EAAsB,CAQ/B,YAAYrf,EAAc,CACtB,GALJ,KAAc,YAAA,IAAI,MAClB,KAAA,MAAQ,QACR,KAAA,YAAc,IAAI,MAGV,CAACA,EAAM,MAAM,IAAI,MAAM,sBAAsB,EACjD,KAAK,KAAOA,CAChB,CAGA,cAAcqJ,EAAmBrJ,EAAcgC,EAAwB,CACnE,GAAI,CAACA,EAAY,MAAM,IAAI,MAAM,4BAA4B,EAC7D,MAAMsN,EAAc,KAAK,YAErBjG,GAAaiG,EAAY,SAAQA,EAAY,OAASjG,EAAY,GACjEiG,EAAYjG,CAAS,IAAGiG,EAAYjG,CAAS,EAAI,CAAA,GACtDiG,EAAYjG,CAAS,EAAErJ,CAAI,EAAIgC,CACnC,CAGA,QAAQyQ,EAAY,CAChB,QAASjR,EAAI,EAAGA,EAAIiR,EAAK,MAAM,OAAQjR,IAAK,CACxC,MAAMqB,EAAO4P,EAAK,MAAMjR,CAAC,EACzB,IAAI8d,EAAY,GAEhB,QAASxX,EAAK,EAAGA,EAAK,KAAK,MAAM,OAAQA,IACrC,GAAI,KAAK,MAAMA,CAAE,GAAKjF,EAAM,CACxByc,EAAY,GACZ,KACJ,CAECA,GAAW,KAAK,MAAM,KAAKzc,CAAI,CACxC,CAEA,QAASrB,EAAI,EAAGA,EAAIiR,EAAK,YAAY,OAAQjR,IAAK,CAC9C,MAAM0K,EAAauG,EAAK,YAAYjR,CAAC,EACrC,IAAI8d,EAAY,GAEhB,QAASxX,EAAK,EAAGA,EAAK,KAAK,YAAY,OAAQA,IAC3C,GAAI,KAAK,YAAYA,CAAE,GAAKoE,EAAY,CACpCoT,EAAY,GACZ,KACJ,CAECA,GAAW,KAAK,YAAY,KAAKpT,CAAU,CACpD,CAEA,MAAMoD,EAAcmD,EAAK,eAAA,EAEzB,QAASjR,EAAI,EAAGA,EAAI8N,EAAY,OAAQ9N,IAAK,CACzC,MAAMQ,EAAasN,EAAY9N,CAAC,EAEhC,KAAK,cAAcQ,EAAW,UAAWA,EAAW,KAAMA,EAAW,UAAU,CACnF,CACJ,CAIA,SAASyQ,EAAY,CACjB,QAASjR,EAAI,EAAGA,EAAIiR,EAAK,MAAM,OAAQjR,IAAK,CACxC,MAAMqB,EAAO4P,EAAK,MAAMjR,CAAC,EACzB,IAAI8d,EAAY,GAEhB,QAASxX,EAAK,EAAGA,EAAK,KAAK,MAAM,OAAQA,IACrC,GAAI,KAAK,MAAMA,CAAE,GAAKjF,EAAM,CACxByc,EAAY,GACZ,KACJ,CAECA,GAAW,KAAK,MAAM,KAAKzc,CAAI,CACxC,CAEA,QAASrB,EAAI,EAAGA,EAAIiR,EAAK,YAAY,OAAQjR,IAAK,CAC9C,MAAM0K,EAAauG,EAAK,YAAYjR,CAAC,EACrC,IAAI8d,EAAY,GAEhB,QAASxX,EAAK,EAAGA,EAAK,KAAK,YAAY,OAAQA,IAC3C,GAAI,KAAK,YAAYA,CAAE,GAAKoE,EAAY,CACpCoT,EAAY,GACZ,KACJ,CAECA,GAAW,KAAK,YAAY,KAAKpT,CAAU,CACpD,CAEA,MAAMoD,EAAcmD,EAAK,eAAe,EAExC,QAASjR,EAAI,EAAGA,EAAI8N,EAAY,OAAQ9N,IAAK,CACzC,MAAMQ,EAAasN,EAAY9N,CAAC,EAE3BQ,EAAW,aACZA,EAAW,sBAAsBQ,IACjCR,EAAW,WAAaA,EAAW,WAAW,cAAc,EAC5D,KAAK,cAAcA,EAAW,UAAWA,EAAW,KAAMA,EAAW,UAAU,IAE/EA,EAAW,WAAaA,EAAW,WAAW,OAC9C,KAAK,cAAcA,EAAW,UAAWA,EAAW,KAAMA,EAAW,UAAU,GAEvF,CACJ,CAGA,cAAcqH,EAAmBrJ,EAAiC,CAC9D,MAAMuf,EAAa,KAAK,YAAYlW,CAAS,EAE7C,OAAOkW,EAAaA,EAAWvf,CAAI,EAAI,IAC3C,CAGA,iBAAiBqJ,EAAmBrJ,EAAc,CAC9C,MAAMuf,EAAa,KAAK,YAAYlW,CAAS,EAEzCkW,GAAY,OAAOA,EAAWvf,CAAI,CAC1C,CAGA,gBAAmC,CAC/B,MAAMwf,EAAU,IAAI,MAEpB,QAAShe,EAAI,EAAGA,EAAI,KAAK,YAAY,OAAQA,IAAK,CAC9C,MAAMie,EAAkB,KAAK,YAAYje,CAAC,EAE1C,GAAIie,EACA,UAAWzf,KAAQyf,EAAiB,CAChC,MAAMzd,EAAayd,EAAgBzf,CAAI,EAEnCgC,GAAYwd,EAAQ,KAAK,IAAIJ,GAAU5d,EAAGxB,EAAMgC,CAAU,CAAC,CACnE,CAER,CAEA,OAAOwd,CACX,CAGA,sBAAsBnW,EAAmBiG,EAA+B,CACpE,MAAMmQ,EAAkB,KAAK,YAAYpW,CAAS,EAElD,GAAIoW,EACA,UAAWzf,KAAQyf,EAAiB,CAChC,MAAMzd,EAAayd,EAAgBzf,CAAI,EAEnCgC,GAAYsN,EAAY,KAAK,IAAI8P,GAAU/V,EAAWrJ,EAAMgC,CAAU,CAAC,CAC/E,CAER,CAGA,OAAQ,CACJ,KAAK,YAAY,OAAS,EAC1B,KAAK,MAAM,OAAS,EACpB,KAAK,YAAY,OAAS,CAC9B,CAGA,UAAUxB,EAAoBkf,EAAe,CACzC,IAAIrW,EAAY,EAEhB,QAAS7H,EAAI,EAAGA,EAAIhB,EAAS,MAAM,OAAQgB,IAAK,CAC5C,MAAMtB,EAAOM,EAAS,MAAMgB,CAAC,EACvBgJ,EAAiBtK,EAAK,gBAE5B,GAAIsK,GAAkBnB,EAAYqW,EAAQ,YAAY,OAAQ,CAC1D,MAAMH,EAAaG,EAAQ,YAAYrW,CAAS,EAEhD,UAAW+I,KAAOmN,EAAY,CAC1B,MAAMI,EAA6BJ,EAAWnN,CAAG,EAEjD,GAAI5H,GAAkBmV,EAAgB,CAClC,MAAM3d,EAAa,KAAK,cAAcqH,EAAW+I,CAAG,EAEhDpQ,GAAY9B,EAAK,cAAc8B,CAAU,EAC7C,KACJ,CACJ,CACJ,CACAqH,GACJ,CACJ,CACJ,CCtJa,MAAAuW,EAAe,CAYxB,YAAYC,EAAoC,CAXhD,KAAA,MAAQ,GAMR,KAAA,MAAQ,EAGR,KAAQ,aAAe,IAAI,MAGvB,KAAK,iBAAmBA,CAC5B,CAEA,iBAAiBC,EAAkC,CAC/C,MAAMpG,EAAQ,KAAK,MAEbzH,EAAe,IAAI2M,GAEzB3M,EAAa,KAAO,GAEpB,MAAM8N,EAAQ,IAAIC,GAAYF,CAAM,EAE9BG,EAAUF,EAAM,UAAA,EAChBG,EAAWH,EAAM,UAAU,EAEjC9N,EAAa,KAAOiO,GAAY,GAAKD,GAAW,EAAI,KAAOC,EAAS,SAAS,EAAE,EAAID,EAAQ,SAAS,EAAE,EACtGhO,EAAa,QAAU8N,EAAM,WAAW,EACxC,MAAMI,EAAWlO,EAAa,QAAQ,OAAO,EAAG,CAAC,EAEjD,GAAIkO,IAAa,OAASA,IAAa,MAAO,CAC1C,MAAMC,EAAQ,sCAAsCnO,EAAa,mDAEjE,QAAQ,MAAMmO,CAAK,CACvB,CACA,KAAK,MAAQD,IAAa,MAC1BlO,EAAa,EAAI8N,EAAM,UAAU,EACjC9N,EAAa,EAAI8N,EAAM,UAAU,EACjC9N,EAAa,MAAQ8N,EAAM,UAAU,EACrC9N,EAAa,OAAS8N,EAAM,UAAU,EAEtC,MAAMM,EAAeN,EAAM,YAAA,EAEvBM,IACApO,EAAa,IAAM8N,EAAM,UAEzB9N,EAAAA,EAAa,WAAa8N,EAAM,WAChC9N,EAAAA,EAAa,UAAY8N,EAAM,WAAW,GAG9C,IAAIte,EAAI,EAGRA,EAAIse,EAAM,QAAQ,EAAI,EACtB,QAASve,EAAI,EAAGA,EAAIC,EAAGD,IAAK,CACxB,MAAM8e,EAAMP,EAAM,WAElB,EAAA,GAAI,CAACO,EAAK,MAAM,IAAI,MAAM,0CAA0C,EACpEP,EAAM,QAAQ,KAAKO,CAAG,CAC1B,CAGA7e,EAAIse,EAAM,QAAQ,EAAI,EACtB,QAASve,EAAI,EAAGA,EAAIC,EAAGD,IAAK,CACxB,MAAMxB,EAAO+f,EAAM,aAEnB,GAAI,CAAC/f,EAAM,MAAM,IAAI,MAAM,6BAA6B,EACxD,MAAM2S,EAASnR,GAAK,EAAI,KAAOyQ,EAAa,MAAM8N,EAAM,QAAQ,EAAI,CAAC,EAC/DpT,EAAO,IAAI2I,GAAS9T,EAAGxB,EAAM2S,CAAM,EAEzChG,EAAK,SAAWoT,EAAM,UAAA,EACtBpT,EAAK,EAAIoT,EAAM,UAAA,EAAcrG,EAC7B/M,EAAK,EAAIoT,EAAM,UAAU,EAAIrG,EAC7B/M,EAAK,OAASoT,EAAM,UAAA,EACpBpT,EAAK,OAASoT,EAAM,YACpBpT,EAAK,OAASoT,EAAM,UACpBpT,EAAAA,EAAK,OAASoT,EAAM,UAAU,EAC9BpT,EAAK,OAASoT,EAAM,UAAU,EAAIrG,EAClC/M,EAAK,cAAgBoT,EAAM,QAAQ,EAAI,EACvCpT,EAAK,aAAeoT,EAAM,YAAY,EAClCM,GAAche,EAAM,gBAAgBsK,EAAK,MAAOoT,EAAM,UAAA,CAAW,EACrE9N,EAAa,MAAM,KAAKtF,CAAI,CAChC,CAGAlL,EAAIse,EAAM,QAAQ,EAAI,EACtB,QAASve,EAAI,EAAGA,EAAIC,EAAGD,IAAK,CACxB,MAAM6c,EAAW0B,EAAM,WAAA,EAEvB,GAAI,CAAC1B,EAAU,MAAM,IAAI,MAAM,6BAA6B,EAC5D,MAAMnF,EAAWjH,EAAa,MAAM8N,EAAM,QAAQ,EAAI,CAAC,EACjDpT,EAAO,IAAIsS,GAASzd,EAAG6c,EAAUnF,CAAQ,EAE/C7W,EAAM,gBAAgBsK,EAAK,MAAOoT,EAAM,UAAW,CAAA,EAEnD,MAAMQ,EAAYR,EAAM,UAAU,EAE9BQ,GAAa,IAAIle,EAAM,cAAesK,EAAK,UAAY,IAAItK,EAAUke,CAAS,EAElF5T,EAAK,eAAiBoT,EAAM,cAC5BpT,EAAAA,EAAK,UAAYoT,EAAM,QAAQ,EAAI,EACnC9N,EAAa,MAAM,KAAKtF,CAAI,CAChC,CAGAlL,EAAIse,EAAM,QAAQ,EAAI,EACtB,QAASve,EAAI,EAAGyc,EAAIzc,EAAIC,EAAGD,IAAK,CAC5B,MAAMxB,EAAO+f,EAAM,WAAA,EAEnB,GAAI,CAAC/f,EAAM,MAAM,IAAI,MAAM,2CAA2C,EACtE,MAAM2M,EAAO,IAAIsM,GAAiBjZ,CAAI,EAEtC2M,EAAK,MAAQoT,EAAM,QAAQ,EAAI,EAC/BpT,EAAK,aAAeoT,EAAM,YAAY,EACtC9B,EAAK8B,EAAM,QAAQ,EAAI,EACvB,QAASjY,EAAK,EAAGA,EAAKmW,EAAInW,IAAM6E,EAAK,MAAM,KAAKsF,EAAa,MAAM8N,EAAM,QAAQ,EAAI,CAAC,CAAC,EACvFpT,EAAK,OAASsF,EAAa,MAAM8N,EAAM,QAAQ,EAAI,CAAC,EACpDpT,EAAK,IAAMoT,EAAM,UAAU,EAC3BpT,EAAK,SAAWoT,EAAM,UAAU,EAAIrG,EACpC/M,EAAK,cAAgBoT,EAAM,SAAA,EAC3BpT,EAAK,SAAWoT,EAAM,YAAY,EAClCpT,EAAK,QAAUoT,EAAM,YAAY,EACjCpT,EAAK,QAAUoT,EAAM,YAAY,EACjC9N,EAAa,cAAc,KAAKtF,CAAI,CACxC,CAGAlL,EAAIse,EAAM,QAAQ,EAAI,EACtB,QAASve,EAAI,EAAGyc,EAAIzc,EAAIC,EAAGD,IAAK,CAC5B,MAAMxB,EAAO+f,EAAM,WAAW,EAE9B,GAAI,CAAC/f,EAAM,MAAM,IAAI,MAAM,kDAAkD,EAC7E,MAAM2M,EAAO,IAAIwS,GAAwBnf,CAAI,EAE7C2M,EAAK,MAAQoT,EAAM,QAAQ,EAAI,EAC/BpT,EAAK,aAAeoT,EAAM,YAAY,EACtC9B,EAAK8B,EAAM,QAAQ,EAAI,EACvB,QAASjY,EAAK,EAAGA,EAAKmW,EAAInW,IAAM6E,EAAK,MAAM,KAAKsF,EAAa,MAAM8N,EAAM,QAAQ,EAAI,CAAC,CAAC,EACvFpT,EAAK,OAASsF,EAAa,MAAM8N,EAAM,QAAQ,EAAI,CAAC,EACpDpT,EAAK,MAAQoT,EAAM,cACnBpT,EAAK,SAAWoT,EAAM,cACtBpT,EAAK,eAAiBoT,EAAM,UAAA,EAC5BpT,EAAK,QAAUoT,EAAM,UAAcrG,EAAAA,EACnC/M,EAAK,QAAUoT,EAAM,UAAU,EAAIrG,EACnC/M,EAAK,aAAeoT,EAAM,UAAA,EAC1BpT,EAAK,aAAeoT,EAAM,UAC1BpT,EAAAA,EAAK,aAAeoT,EAAM,UAAU,EACpCpT,EAAK,UAAYoT,EAAM,UAAU,EACjCpT,EAAK,KAAOoT,EAAM,UAAU,EAC5BpT,EAAK,KAAOoT,EAAM,UAAU,EAC5BpT,EAAK,UAAYoT,EAAM,YACvBpT,EAAK,UAAYoT,EAAM,UAAA,EACvBpT,EAAK,UAAYoT,EAAM,YACvB9N,EAAa,qBAAqB,KAAKtF,CAAI,CAC/C,CAGAlL,EAAIse,EAAM,QAAQ,EAAI,EACtB,QAASve,EAAI,EAAGyc,EAAIzc,EAAIC,EAAGD,IAAK,CAC5B,MAAMxB,EAAO+f,EAAM,aAEnB,GAAI,CAAC/f,EAAM,MAAM,IAAI,MAAM,6CAA6C,EACxE,MAAM2M,EAAO,IAAIwM,GAAmBnZ,CAAI,EAExC2M,EAAK,MAAQoT,EAAM,QAAQ,EAAI,EAC/BpT,EAAK,aAAeoT,EAAM,YAAA,EAC1B9B,EAAK8B,EAAM,QAAQ,EAAI,EACvB,QAASjY,EAAK,EAAGA,EAAKmW,EAAInW,IAAM6E,EAAK,MAAM,KAAKsF,EAAa,MAAM8N,EAAM,QAAQ,EAAI,CAAC,CAAC,EACvFpT,EAAK,OAASsF,EAAa,MAAM8N,EAAM,QAAQ,EAAI,CAAC,EACpDpT,EAAK,aAAeoT,EAAM,QAAQ,EAAI,EACtCpT,EAAK,YAAcoT,EAAM,QAAQ,EAAI,EACrCpT,EAAK,WAAaoT,EAAM,QAAQ,EAAI,EACpCpT,EAAK,eAAiBoT,EAAM,UAAA,EAC5BpT,EAAK,SAAWoT,EAAM,YAClBpT,EAAK,cAAgByM,GAAa,QAAOzM,EAAK,UAAY+M,GAC9D/M,EAAK,QAAUoT,EAAM,UAAA,GACjBpT,EAAK,aAAe0M,EAAY,QAAU1M,EAAK,aAAe0M,EAAY,SAAO1M,EAAK,SAAW+M,GACrG/M,EAAK,UAAYoT,EAAM,UAAU,EACjCpT,EAAK,KAAOoT,EAAM,YAClBpT,EAAK,KAAOoT,EAAM,UAAA,EAClB9N,EAAa,gBAAgB,KAAKtF,CAAI,CAC1C,CAGA,MAAM6T,EAAc,KAAK,SAAST,EAAO9N,EAAc,GAAMoO,CAAY,EAErEG,IACAvO,EAAa,YAAcuO,EAC3BvO,EAAa,MAAM,KAAKuO,CAAW,GAIvC,CACI,IAAIhf,EAAIyQ,EAAa,MAAM,OAG3B,IADAhQ,EAAM,aAAagQ,EAAa,MAAQxQ,EAAID,EAAIue,EAAM,QAAQ,EAAI,CAAE,EAC7Dve,EAAIC,EAAGD,IAAK,CACf,MAAMiR,EAAO,KAAK,SAASsN,EAAO9N,EAAc,GAAOoO,CAAY,EAEnE,GAAI,CAAC5N,EAAM,MAAM,IAAI,MAAM,2CAA2C,EACtER,EAAa,MAAMzQ,CAAC,EAAIiR,CAC5B,CACJ,CAGAhR,EAAI,KAAK,aAAa,OACtB,QAASD,EAAI,EAAGA,EAAIC,EAAGD,IAAK,CACxB,MAAMif,EAAa,KAAK,aAAajf,CAAC,EAChCiR,EAAQgO,EAAW,KAAkCxO,EAAa,SAASwO,EAAW,IAAI,EAAhExO,EAAa,YAE7C,GAAI,CAACQ,EAAM,MAAM,IAAI,MAAM,iCAAiC,EAC5D,GAAI,CAACgO,EAAW,OAAQ,MAAM,IAAI,MAAM,qCAAqC,EAC7E,MAAM9N,EAASF,EAAK,cAAcgO,EAAW,UAAWA,EAAW,MAAM,EAEzE,GAAI,CAAC9N,EAAQ,MAAM,IAAI,MAAM,0BAA0B8N,EAAW,QAAQ,EAC1EA,EAAW,KAAK,mBAAqBA,EAAW,gBAAmB9N,EAA8B8N,EAAW,KAC5GA,EAAW,KAAK,cAAc9N,CAAwB,CAE1D,CACA,KAAK,aAAa,OAAS,EAG3BlR,EAAIse,EAAM,QAAQ,EAAI,EACtB,QAASve,EAAI,EAAGA,EAAIC,EAAGD,IAAK,CACxB,MAAMkf,EAAYX,EAAM,cAExB,EAAA,GAAI,CAACW,EAAW,MAAM,IAAI,MAC1B,MAAM/T,EAAO,IAAIgJ,GAAU+K,CAAS,EAEpC/T,EAAK,SAAWoT,EAAM,QAAQ,EAAK,EACnCpT,EAAK,WAAaoT,EAAM,UAAU,EAClCpT,EAAK,YAAcoT,EAAM,WAAW,EACpCpT,EAAK,UAAYoT,EAAM,WACnBpT,EAAAA,EAAK,YACLA,EAAK,OAASoT,EAAM,YACpBpT,EAAK,QAAUoT,EAAM,UAAA,GAEzB9N,EAAa,OAAO,KAAKtF,CAAI,CACjC,CAGAlL,EAAIse,EAAM,QAAQ,EAAI,EACtB,QAASve,EAAI,EAAGA,EAAIC,EAAGD,IAAK,CACxB,MAAMsP,EAAgBiP,EAAM,WAAW,EAEvC,GAAI,CAACjP,EAAe,MAAM,IAAI,MAAM,iCAAiC,EACrEmB,EAAa,WAAW,KAAK,KAAK,cAAc8N,EAAOjP,EAAemB,CAAY,CAAC,CACvF,CAEA,OAAOA,CACX,CAEQ,SAAS8N,EAAoB9N,EAA4BuO,EAAsBH,EAAoC,CACvH,IAAI5N,EAAO,KACPkO,EAAY,EAEhB,GAAIH,EAAa,CAEb,GADAG,EAAYZ,EAAM,QAAQ,EAAI,EAC1BY,GAAa,EAAG,OAAO,KAC3BlO,EAAO,IAAI4M,GAAK,SAAS,CAC7B,KAAO,CACH,MAAMf,EAAWyB,EAAM,cAAA,EAEvB,GAAI,CAACzB,EAAU,MAAM,IAAI,MAAM,6BAA6B,EAC5D7L,EAAO,IAAI4M,GAAKf,CAAQ,EACxB7L,EAAK,MAAM,OAASsN,EAAM,QAAQ,EAAI,EACtC,QAASve,EAAI,EAAGC,EAAIgR,EAAK,MAAM,OAAQjR,EAAIC,EAAGD,IAAKiR,EAAK,MAAMjR,CAAC,EAAIyQ,EAAa,MAAM8N,EAAM,QAAQ,EAAI,CAAC,EAEzG,QAASve,EAAI,EAAGC,EAAIse,EAAM,QAAQ,EAAI,EAAGve,EAAIC,EAAGD,IAAKiR,EAAK,YAAY,KAAKR,EAAa,cAAc8N,EAAM,QAAQ,EAAI,CAAC,CAAC,EAC1H,QAASve,EAAI,EAAGC,EAAIse,EAAM,QAAQ,EAAI,EAAGve,EAAIC,EAAGD,IAAKiR,EAAK,YAAY,KAAKR,EAAa,qBAAqB8N,EAAM,QAAQ,EAAI,CAAC,CAAC,EACjI,QAASve,EAAI,EAAGC,EAAIse,EAAM,QAAQ,EAAI,EAAGve,EAAIC,EAAGD,IAAKiR,EAAK,YAAY,KAAKR,EAAa,gBAAgB8N,EAAM,QAAQ,EAAI,CAAC,CAAC,EAE5HY,EAAYZ,EAAM,QAAQ,EAAI,CAClC,CAEA,QAASve,EAAI,EAAGA,EAAImf,EAAWnf,IAAK,CAChC,MAAM6H,EAAY0W,EAAM,QAAQ,EAAI,EAEpC,QAASjY,EAAK,EAAGmW,EAAK8B,EAAM,QAAQ,EAAI,EAAGjY,EAAKmW,EAAInW,IAAM,CACtD,MAAM9H,EAAO+f,EAAM,cAAc,EAEjC,GAAI,CAAC/f,EAAM,MAAM,IAAI,MAAM,kCAAkC,EAC7D,MAAMgC,EAAa,KAAK,eAAe+d,EAAO9N,EAAcQ,EAAMpJ,EAAWrJ,EAAMqgB,CAAY,EAE3Fre,GAAYyQ,EAAK,cAAcpJ,EAAWrJ,EAAMgC,CAAU,CAClE,CACJ,CAEA,OAAOyQ,CACX,CAEQ,eAAesN,EAAoB9N,EAA4BQ,EAAYpJ,EAAmBgB,EAAwBgW,EAA0C,CACpK,MAAM3G,EAAQ,KAAK,MAEnB,IAAI1Z,EAAO+f,EAAM,cAIjB,EAAA,OAFK/f,IAAMA,EAAOqK,GAEV0V,EAAM,SAAY,EAAA,CACtB,KAAK3d,GAAe,OAAQ,CACxB,IAAIK,EAAOsd,EAAM,cAAc,EAC/B,MAAMlN,EAAWkN,EAAM,YACjBlf,EAAIkf,EAAM,UACVjf,EAAAA,EAAIif,EAAM,UAAA,EACVlT,EAASkT,EAAM,UAAU,EACzBjT,EAASiT,EAAM,UAAU,EACzBa,EAAQb,EAAM,UAAA,EACdc,EAASd,EAAM,UAAU,EACzBxW,EAAQwW,EAAM,YACdxN,EAAW,KAAK,aAAawN,CAAK,EAEnCtd,IAAMA,EAAOzC,GAClB,MAAMmD,EAAS,KAAK,iBAAiB,oBAAoBsP,EAAMzS,EAAMyC,EAAM8P,CAAQ,EAEnF,OAAKpP,GACLA,EAAO,KAAOV,EACdU,EAAO,EAAItC,EAAI6Y,EACfvW,EAAO,EAAIrC,EAAI4Y,EACfvW,EAAO,OAAS0J,EAChB1J,EAAO,OAAS2J,EAChB3J,EAAO,SAAW0P,EAClB1P,EAAO,MAAQyd,EAAQlH,EACvBvW,EAAO,OAAS0d,EAASnH,EACzBrX,EAAM,gBAAgBc,EAAO,MAAOoG,CAAK,EACzCpG,EAAO,SAAWoP,EACdA,GAAY,MAAMpP,EAAO,aAAa,EAEnCA,GAba,IAcxB,CACA,KAAKf,GAAe,YAAa,CAC7B,MAAMqI,EAAcsV,EAAM,QAAQ,EAAI,EAChCrf,EAAW,KAAK,aAAaqf,EAAOtV,CAAW,EAC/ClB,EAAQ8W,EAAeN,EAAM,UAAU,EAAI,EAE3Ce,EAAM,KAAK,iBAAiB,yBAAyBrO,EAAMzS,CAAI,EAErE,OAAK8gB,GACLA,EAAI,oBAAsBrW,GAAe,EACzCqW,EAAI,SAAWpgB,EAAS,SACxBogB,EAAI,MAAQpgB,EAAS,MACjB2f,GAAche,EAAM,gBAAgBye,EAAI,MAAOvX,CAAK,EAEjDuX,GANU,IAOrB,CACA,KAAK1e,GAAe,KAAM,CACtB,IAAIK,EAAOsd,EAAM,gBACjB,MAAMxW,EAAQwW,EAAM,YACdtV,EAAcsV,EAAM,QAAQ,EAAI,EAChC5b,EAAM,KAAK,eAAe4b,EAAOtV,GAAe,EAAG,CAAC,EACpDsW,EAAY,KAAK,eAAehB,CAAK,EACrCrf,EAAW,KAAK,aAAaqf,EAAOtV,CAAW,EAC/CuW,EAAajB,EAAM,QAAQ,EAAI,EAC/BxN,EAAW,KAAK,aAAawN,CAAK,EACxC,IAAIkB,EAAkB,CAClBL,EAAAA,EAAQ,EACRC,EAAS,EAETR,IACAY,EAAQ,KAAK,eAAelB,CAAK,EACjCa,EAAQb,EAAM,YACdc,EAASd,EAAM,aAGdtd,IAAMA,EAAOzC,GAClB,MAAM0e,EAAO,KAAK,iBAAiB,kBAAkBjM,EAAMzS,EAAMyC,EAAM8P,CAAQ,EAE/E,OAAKmM,GACLA,EAAK,KAAOjc,EACZJ,EAAM,gBAAgBqc,EAAK,MAAOnV,CAAK,EACvCmV,EAAK,MAAQhe,EAAS,MACtBge,EAAK,SAAWhe,EAAS,SACzBge,EAAK,oBAAsBjU,GAAe,EAC1CiU,EAAK,UAAYqC,EACjBrC,EAAK,UAAY,IAAI,aAAava,CAAG,EAErCua,EAAK,WAAasC,GAAc,EAChCtC,EAAK,SAAWnM,EACZ8N,IACA3B,EAAK,MAAQuC,EACbvC,EAAK,MAAQkC,EAAQlH,EACrBgF,EAAK,OAASmC,EAASnH,GAGpBgF,GAjBW,IAkBtB,CACA,KAAKtc,GAAe,WAAY,CAC5B,IAAIK,EAAOsd,EAAM,gBACjB,MAAMxW,EAAQwW,EAAM,UACdzB,EAAAA,EAAWyB,EAAM,cAAA,EACjBpN,EAASoN,EAAM,cAAc,EAC7BmB,EAAmBnB,EAAM,YACzBxN,EAAAA,EAAW,KAAK,aAAawN,CAAK,EACxC,IAAIa,EAAQ,EACRC,EAAS,EAETR,IACAO,EAAQb,EAAM,UAAU,EACxBc,EAASd,EAAM,UAAA,GAGdtd,IAAMA,EAAOzC,GAClB,MAAM0e,EAAO,KAAK,iBAAiB,kBAAkBjM,EAAMzS,EAAMyC,EAAM8P,CAAQ,EAE/E,OAAKmM,GACLA,EAAK,KAAOjc,EACZJ,EAAM,gBAAgBqc,EAAK,MAAOnV,CAAK,EACvCmV,EAAK,SAAWnM,EACZ8N,IACA3B,EAAK,MAAQkC,EAAQlH,EACrBgF,EAAK,OAASmC,EAASnH,GAE3B,KAAK,aAAa,KAAK,IAAIyH,GAAWzC,EAAMJ,EAAUjV,EAAWsJ,EAAQuO,CAAgB,CAAC,EAEnFxC,GAVW,IAWtB,CACA,KAAKtc,GAAe,KAAM,CACtB,MAAMqY,EAASsF,EAAM,YACfqB,EAAAA,EAAgBrB,EAAM,YAAA,EACtBtV,EAAcsV,EAAM,QAAQ,EAAI,EAChCrf,EAAW,KAAK,aAAaqf,EAAOtV,CAAW,EAC/CqP,EAAU7X,EAAM,SAASwI,EAAc,EAAG,CAAC,EAEjD,QAASjJ,EAAI,EAAGC,EAAIqY,EAAQ,OAAQtY,EAAIC,EAAGD,IAAKsY,EAAQtY,CAAC,EAAIue,EAAM,YAAcrG,EACjF,MAAMnQ,EAAQ8W,EAAeN,EAAM,UAAc,EAAA,EAE3Ctd,EAAO,KAAK,iBAAiB,kBAAkBgQ,EAAMzS,CAAI,EAE/D,OAAKyC,GACLA,EAAK,OAASgY,EACdhY,EAAK,cAAgB2e,EACrB3e,EAAK,oBAAsBgI,GAAe,EAC1ChI,EAAK,SAAW/B,EAAS,SACzB+B,EAAK,MAAQ/B,EAAS,MACtB+B,EAAK,QAAUqX,EACXuG,GAAche,EAAM,gBAAgBI,EAAK,MAAO8G,CAAK,EAElD9G,GATW,IAUtB,CACA,KAAKL,GAAe,MAAO,CACvB,MAAMyQ,EAAWkN,EAAM,UACjBlf,EAAAA,EAAIkf,EAAM,UAAA,EACVjf,EAAIif,EAAM,UAAA,EACVxW,EAAQ8W,EAAeN,EAAM,YAAc,EAE3Cjd,EAAQ,KAAK,iBAAiB,mBAAmB2P,EAAMzS,CAAI,EAEjE,OAAK8C,GACLA,EAAM,EAAIjC,EAAI6Y,EACd5W,EAAM,EAAIhC,EAAI4Y,EACd5W,EAAM,SAAW+P,EACbwN,GAAche,EAAM,gBAAgBS,EAAM,MAAOyG,CAAK,EAEnDzG,GANY,IAOvB,CACA,KAAKV,GAAe,SAAU,CAC1B,MAAMif,EAAetB,EAAM,QAAQ,EAAI,EACjCtV,EAAcsV,EAAM,QAAQ,EAAI,EAChCrf,EAAW,KAAK,aAAaqf,EAAOtV,CAAW,EAC/ClB,EAAQ8W,EAAeN,EAAM,YAAc,EAE3CuB,EAAO,KAAK,iBAAiB,sBAAsB7O,EAAMzS,CAAI,EAEnE,OAAKshB,GACLA,EAAK,QAAUrP,EAAa,MAAMoP,CAAY,EAC9CC,EAAK,oBAAsB7W,GAAe,EAC1C6W,EAAK,SAAW5gB,EAAS,SACzB4gB,EAAK,MAAQ5gB,EAAS,MAClB2f,GAAche,EAAM,gBAAgBif,EAAK,MAAO/X,CAAK,EAElD+X,GAPW,IAQtB,CACJ,CAEA,OAAO,IACX,CAEQ,aAAavB,EAAoB,CACrC,GAAI,KAAK,OAAS,CAACA,EAAM,cAAe,OAAO,KAC/C,MAAMxN,EAAW,IAAI1N,GAASkb,EAAM,QAAQ,EAAI,CAAC,EAEjD,OAAAxN,EAAS,MAAQwN,EAAM,QAAQ,EAAI,EACnCxN,EAAS,OAASwN,EAAM,QAAQ,EAAI,EACpCxN,EAAS,WAAawN,EAAM,QAAQ,EAAI,EAEjCxN,CACX,CAEQ,uBAAuBwN,EAAoB,CAC/C,OAAI,KAAK,MAAcwB,GAEhBxB,EAAM,SAAA,CACjB,CAEQ,aAAaA,EAAoBtV,EAA+B,CACpE,MAAMiP,EAAQ,KAAK,MACbgB,EAAiBjQ,GAAe,EAChC/J,EAAW,IAAI8gB,GAErB,GAAI,CAACzB,EAAM,YACP,EAAA,OAAArf,EAAS,SAAW,KAAK,eAAeqf,EAAOrF,EAAgBhB,CAAK,EAE7DhZ,EAEX,MAAM+gB,EAAU,IAAI,MACdC,EAAa,IAAI,MAEvB,QAASlgB,EAAI,EAAGA,EAAIiJ,EAAajJ,IAAK,CAClC,MAAMmY,EAAYoG,EAAM,QAAQ,EAAI,EAEpC2B,EAAW,KAAK/H,CAAS,EACzB,QAAS7R,EAAK,EAAGA,EAAK6R,EAAW7R,IAC7B4Z,EAAW,KAAK3B,EAAM,QAAQ,EAAI,CAAC,EACnC0B,EAAQ,KAAK1B,EAAM,YAAcrG,CAAK,EACtC+H,EAAQ,KAAK1B,EAAM,UAAA,EAAcrG,CAAK,EACtC+H,EAAQ,KAAK1B,EAAM,UAAW,CAAA,CAEtC,CACA,OAAArf,EAAS,SAAWuB,EAAM,aAAawf,CAAO,EAC9C/gB,EAAS,MAAQghB,EAEVhhB,CACX,CAEQ,eAAeqf,EAAoBte,EAAWiY,EAAyB,CAC3E,MAAMiI,EAAQ,IAAI,MAAclgB,CAAC,EAEjC,GAAIiY,GAAS,EACT,QAASlY,EAAI,EAAGA,EAAIC,EAAGD,IAAKmgB,EAAMngB,CAAC,EAAIue,EAAM,UAAU,eAE9Cve,EAAI,EAAGA,EAAIC,EAAGD,IAAKmgB,EAAMngB,CAAC,EAAIue,EAAM,YAAcrG,EAG/D,OAAOiI,CACX,CAEQ,eAAe5B,EAA8B,CACjD,MAAMte,EAAIse,EAAM,QAAQ,EAAI,EACtB4B,EAAQ,IAAI,MAAclgB,CAAC,EAEjC,QAASD,EAAI,EAAGA,EAAIC,EAAGD,IAAKmgB,EAAMngB,CAAC,EAAIue,EAAM,UAAA,EAE7C,OAAO4B,CACX,CAEQ,cAAc5B,EAAoB/f,EAAciS,EAAuC,CAC3F8N,EAAM,QAAQ,EAAI,EAClB,MAAM7a,EAAY,IAAI,MAChBwU,EAAQ,KAAK,MAGnB,QAASlY,EAAI,EAAGC,EAAIse,EAAM,QAAQ,EAAI,EAAGve,EAAIC,EAAGD,IAAK,CACjD,MAAM6H,EAAY0W,EAAM,QAAQ,EAAI,EAEpC,QAASjY,EAAK,EAAGmW,EAAK8B,EAAM,QAAQ,EAAI,EAAGjY,EAAKmW,EAAInW,IAAM,CACtD,MAAM8Z,EAAe7B,EAAM,SAAA,EACrBha,EAAaga,EAAM,QAAQ,EAAI,EAC/B8B,EAAY9b,EAAa,EAE/B,OAAQ6b,EACJ,CAAA,KAAKE,GAAiB,CAClB,MAAMhT,EAAW,IAAI1E,GAAmBrE,EAAYsD,CAAS,EAE7D,QAASzE,EAAQ,EAAGA,EAAQmB,EAAYnB,IAASkK,EAAS,SAASlK,EAAOmb,EAAM,UAAU,EAAGA,EAAM,cAAe,CAAA,EAClH7a,EAAU,KAAK4J,CAAQ,EACvB,KACJ,CACA,KAAKiT,GAAW,CACZ,MAAM3b,EAAc2Z,EAAM,QAAQ,EAAI,EAChCjR,EAAW,IAAI1F,GAAarD,EAAYK,EAAaiD,CAAS,EAEpE,IAAI9D,EAAOwa,EAAM,UAAU,EACvBxX,EAAIwX,EAAM,mBAAqB,IAC/BzW,EAAIyW,EAAM,iBAAiB,EAAI,IAC/B/e,EAAI+e,EAAM,iBAAiB,EAAI,IAC/Bhf,EAAIgf,EAAM,iBAAiB,EAAI,IAEnC,QAASnb,EAAQ,EAAG2B,EAAS,EACzBuI,EAAS,SAASlK,EAAOW,EAAMgD,EAAGe,EAAGtI,EAAGD,CAAC,EACrC6D,GAASid,EAFiBjd,IAAS,CAIvC,MAAMmC,EAAQgZ,EAAM,UAAU,EACxBnW,EAAKmW,EAAM,iBAAiB,EAAI,IAChClW,EAAKkW,EAAM,iBAAiB,EAAI,IAChCjW,EAAKiW,EAAM,iBAAiB,EAAI,IAChCjI,EAAKiI,EAAM,iBAAiB,EAAI,IAEtC,OAAQA,EAAM,SAAA,EACV,CAAA,KAAKiC,GACDlT,EAAS,WAAWlK,CAAK,EACzB,MACJ,KAAKqd,GACDC,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAOwB,EAAGqB,EAAI,CAAC,EACpEsY,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAOuC,EAAGO,EAAI,CAAC,EACpEqY,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAO/F,EAAG8I,EAAI,CAAC,EACpEoY,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAOhG,EAAG+W,EAAI,CAAC,CAC5E,CACAvS,EAAOwB,EACPwB,EAAIqB,EACJN,EAAIO,EACJ7I,EAAI8I,EACJ/I,EAAI+W,CACR,CACA5S,EAAU,KAAK4J,CAAQ,EACvB,KACJ,CACA,KAAKqT,GAAU,CACX,MAAM/b,EAAc2Z,EAAM,QAAQ,EAAI,EAChCjR,EAAW,IAAIrF,GAAY1D,EAAYK,EAAaiD,CAAS,EAEnE,IAAI9D,EAAOwa,EAAM,UACbxX,EAAAA,EAAIwX,EAAM,iBAAA,EAAqB,IAC/BzW,EAAIyW,EAAM,mBAAqB,IAC/B/e,EAAI+e,EAAM,iBAAA,EAAqB,IAEnC,QAASnb,EAAQ,EAAG2B,EAAS,EACzBuI,EAAS,SAASlK,EAAOW,EAAMgD,EAAGe,EAAGtI,CAAC,EAClC4D,GAASid,EAFiBjd,IAAS,CAIvC,MAAMmC,EAAQgZ,EAAM,UAAA,EACdnW,EAAKmW,EAAM,mBAAqB,IAChClW,EAAKkW,EAAM,iBAAiB,EAAI,IAChCjW,EAAKiW,EAAM,iBAAiB,EAAI,IAEtC,OAAQA,EAAM,SAAA,EACV,CAAA,KAAKiC,GACDlT,EAAS,WAAWlK,CAAK,EACzB,MACJ,KAAKqd,GACDC,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAOwB,EAAGqB,EAAI,CAAC,EACpEsY,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAOuC,EAAGO,EAAI,CAAC,EACpEqY,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAO/F,EAAG8I,EAAI,CAAC,CAC5E,CACAvE,EAAOwB,EACPwB,EAAIqB,EACJN,EAAIO,EACJ7I,EAAI8I,CACR,CACA5E,EAAU,KAAK4J,CAAQ,EACvB,KACJ,CACA,KAAKsT,GAAY,CACb,MAAMhc,EAAc2Z,EAAM,QAAQ,EAAI,EAChCjR,EAAW,IAAInF,GAAc5D,EAAYK,EAAaiD,CAAS,EAErE,IAAI9D,EAAOwa,EAAM,UACbxX,EAAAA,EAAIwX,EAAM,iBAAiB,EAAI,IAC/BzW,EAAIyW,EAAM,iBAAqB,EAAA,IAC/B/e,EAAI+e,EAAM,iBAAA,EAAqB,IAC/Bhf,EAAIgf,EAAM,iBAAA,EAAqB,IAC/BnW,EAAKmW,EAAM,iBAAqB,EAAA,IAChClW,EAAKkW,EAAM,iBAAiB,EAAI,IAChCjW,EAAKiW,EAAM,iBAAiB,EAAI,IAEpC,QAASnb,EAAQ,EAAG2B,EAAS,EACzBuI,EAAS,SAASlK,EAAOW,EAAMgD,EAAGe,EAAGtI,EAAGD,EAAG6I,EAAIC,EAAIC,CAAE,EACjDlF,GAASid,EAFiBjd,IAAS,CAGvC,MAAMmC,EAAQgZ,EAAM,UAAU,EACxBsC,EAAKtC,EAAM,iBAAiB,EAAI,IAChCuC,EAAKvC,EAAM,iBAAiB,EAAI,IAChCwC,EAAKxC,EAAM,iBAAiB,EAAI,IAChCyC,EAAKzC,EAAM,iBAAiB,EAAI,IAChC0C,EAAM1C,EAAM,iBAAA,EAAqB,IACjC2C,EAAM3C,EAAM,iBAAA,EAAqB,IACjC4C,EAAM5C,EAAM,iBAAqB,EAAA,IAEvC,OAAQA,EAAM,SAAY,EAAA,CACtB,KAAKiC,GACDlT,EAAS,WAAWlK,CAAK,EACzB,MACJ,KAAKqd,GACDC,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAOwB,EAAG8Z,EAAI,CAAC,EACpEH,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAOuC,EAAGgZ,EAAI,CAAC,EACpEJ,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAO/F,EAAGuhB,EAAI,CAAC,EACpEL,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAOhG,EAAGyhB,EAAI,CAAC,EACpEN,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAO6C,EAAI6Y,EAAK,CAAC,EACtEP,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAO8C,EAAI6Y,EAAK,CAAC,EACtER,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAO+C,EAAI6Y,EAAK,CAAC,CAC9E,CACApd,EAAOwB,EACPwB,EAAI8Z,EACJ/Y,EAAIgZ,EACJthB,EAAIuhB,EACJxhB,EAAIyhB,EACJ5Y,EAAK6Y,EACL5Y,EAAK6Y,EACL5Y,EAAK6Y,CACT,CACAzd,EAAU,KAAK4J,CAAQ,EACvB,KACJ,CACA,KAAK8T,GAAW,CACZ,MAAMxc,EAAc2Z,EAAM,QAAQ,EAAI,EAChCjR,EAAW,IAAI3E,GAAapE,EAAYK,EAAaiD,CAAS,EAEpE,IAAI9D,EAAOwa,EAAM,UACbxX,EAAAA,EAAIwX,EAAM,iBAAA,EAAqB,IAC/BzW,EAAIyW,EAAM,mBAAqB,IAC/B/e,EAAI+e,EAAM,iBAAqB,EAAA,IAC/BnW,EAAKmW,EAAM,mBAAqB,IAChClW,EAAKkW,EAAM,iBAAqB,EAAA,IAChCjW,EAAKiW,EAAM,iBAAqB,EAAA,IAEpC,QAASnb,EAAQ,EAAG2B,EAAS,EACzBuI,EAAS,SAASlK,EAAOW,EAAMgD,EAAGe,EAAGtI,EAAG4I,EAAIC,EAAIC,CAAE,EAC9ClF,GAASid,EAFiBjd,IAAS,CAGvC,MAAMmC,EAAQgZ,EAAM,UAAU,EACxBsC,EAAKtC,EAAM,iBAAA,EAAqB,IAChCuC,EAAKvC,EAAM,iBAAA,EAAqB,IAChCwC,EAAKxC,EAAM,iBAAqB,EAAA,IAChC0C,EAAM1C,EAAM,iBAAiB,EAAI,IACjC2C,EAAM3C,EAAM,iBAAiB,EAAI,IACjC4C,EAAM5C,EAAM,iBAAiB,EAAI,IAEvC,OAAQA,EAAM,SAAS,EAAA,CACnB,KAAKiC,GACDlT,EAAS,WAAWlK,CAAK,EACzB,MACJ,KAAKqd,GACDC,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAOwB,EAAG8Z,EAAI,CAAC,EACpEH,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAOuC,EAAGgZ,EAAI,CAAC,EACpEJ,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAO/F,EAAGuhB,EAAI,CAAC,EACpEL,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAO6C,EAAI6Y,EAAK,CAAC,EACtEP,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAO8C,EAAI6Y,EAAK,CAAC,EACtER,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAO+C,EAAI6Y,EAAK,CAAC,CAC9E,CACApd,EAAOwB,EACPwB,EAAI8Z,EACJ/Y,EAAIgZ,EACJthB,EAAIuhB,EACJ3Y,EAAK6Y,EACL5Y,EAAK6Y,EACL5Y,EAAK6Y,CACT,CACAzd,EAAU,KAAK4J,CAAQ,EACvB,KACJ,CACA,KAAK+T,GAAY,CACb,MAAM/T,EAAW,IAAIpF,GAAc3D,EAAYga,EAAM,QAAQ,EAAI,EAAG1W,CAAS,EAC7E,IAAI9D,EAAOwa,EAAM,YACbhf,EAAIgf,EAAM,iBAAiB,EAAI,IAEnC,QAASnb,EAAQ,EAAG2B,EAAS,EACzBuI,EAAS,SAASlK,EAAOW,EAAMxE,CAAC,EAC5B6D,GAASid,EAFiBjd,IAAS,CAGvC,MAAMmC,EAAQgZ,EAAM,YACdjI,EAAKiI,EAAM,iBAAqB,EAAA,IAEtC,OAAQA,EAAM,WACV,CAAA,KAAKiC,GACDlT,EAAS,WAAWlK,CAAK,EACzB,MACJ,KAAKqd,GACDC,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAOhG,EAAG+W,EAAI,CAAC,CAC5E,CACAvS,EAAOwB,EACPhG,EAAI+W,CACR,CACA5S,EAAU,KAAK4J,CAAQ,CAC3B,CACJ,CACJ,CACJ,CAGA,QAAStN,EAAI,EAAGC,EAAIse,EAAM,QAAQ,EAAI,EAAGve,EAAIC,EAAGD,IAAK,CACjD,MAAM6G,EAAY0X,EAAM,QAAQ,EAAI,EAEpC,QAASjY,EAAK,EAAGmW,EAAK8B,EAAM,QAAQ,EAAI,EAAGjY,EAAKmW,EAAInW,IAAM,CACtD,MAAM+J,EAAOkO,EAAM,SAAA,EACbha,EAAaga,EAAM,QAAQ,EAAI,EAC/B3Z,EAAc2Z,EAAM,QAAQ,EAAI,EAEtC,OAAQlO,EACJ,CAAA,KAAKiR,GACD5d,EAAU,KAAK6d,GAAchD,EAAO,IAAI3X,GAAerC,EAAYK,EAAaiC,CAAS,EAAG,CAAC,CAAC,EAC9F,MACJ,KAAK2a,GACD9d,EAAU,KAAK+d,GAAclD,EAAO,IAAIvX,GAAkBzC,EAAYK,EAAaiC,CAAS,EAAGqR,CAAK,CAAC,EACrG,MACJ,KAAKwJ,GACDhe,EAAU,KAAK6d,GAAchD,EAAO,IAAItX,GAAmB1C,EAAYK,EAAaiC,CAAS,EAAGqR,CAAK,CAAC,EACtG,MACJ,KAAKyJ,GACDje,EAAU,KAAK6d,GAAchD,EAAO,IAAIrX,GAAmB3C,EAAYK,EAAaiC,CAAS,EAAGqR,CAAK,CAAC,EACtG,MACJ,KAAK0J,GACDle,EAAU,KAAK+d,GAAclD,EAAO,IAAIpX,GAAc5C,EAAYK,EAAaiC,CAAS,EAAG,CAAC,CAAC,EAC7F,MACJ,KAAKgb,GACDne,EAAU,KAAK6d,GAAchD,EAAO,IAAIhX,GAAehD,EAAYK,EAAaiC,CAAS,EAAG,CAAC,CAAC,EAC9F,MACJ,KAAKib,GACDpe,EAAU,KAAK6d,GAAchD,EAAO,IAAI/W,GAAejD,EAAYK,EAAaiC,CAAS,EAAG,CAAC,CAAC,EAC9F,MACJ,KAAKkb,GACDre,EAAU,KAAK+d,GAAclD,EAAO,IAAI9W,GAAclD,EAAYK,EAAaiC,CAAS,EAAG,CAAC,CAAC,EAC7F,MACJ,KAAKmb,GACDte,EAAU,KAAK6d,GAAchD,EAAO,IAAI7W,GAAenD,EAAYK,EAAaiC,CAAS,EAAG,CAAC,CAAC,EAC9F,MACJ,KAAKob,GACDve,EAAU,KAAK6d,GAAchD,EAAO,IAAI5W,GAAepD,EAAYK,EAAaiC,CAAS,EAAG,CAAC,CAAC,CACtG,CACJ,CACJ,CAGA,QAAS7G,EAAI,EAAGC,EAAIse,EAAM,QAAQ,EAAI,EAAGve,EAAIC,EAAGD,IAAK,CACjD,MAAMiD,EAAQsb,EAAM,QAAQ,EAAI,EAC1Bha,EAAaga,EAAM,QAAQ,EAAI,EAC/B8B,EAAY9b,EAAa,EACzB+I,EAAW,IAAInD,GAAqB5F,EAAYga,EAAM,QAAQ,EAAI,EAAGtb,CAAK,EAChF,IAAIc,EAAOwa,EAAM,UAAA,EACblU,EAAMkU,EAAM,YACZjU,EAAWiU,EAAM,UAAcrG,EAAAA,EAEnC,QAAS9U,EAAQ,EAAG2B,EAAS,EACzBuI,EAAS,SAASlK,EAAOW,EAAMsG,EAAKC,EAAUiU,EAAM,SAAS,EAAGA,EAAM,YAAY,EAAGA,EAAM,YAAa,CAAA,EACpGnb,GAASid,EAFiBjd,IAAS,CAGvC,MAAMmC,EAAQgZ,EAAM,YACd2D,EAAO3D,EAAM,UAAA,EACb4D,EAAY5D,EAAM,UAAU,EAAIrG,EAEtC,OAAQqG,EAAM,YACV,KAAKiC,GACDlT,EAAS,WAAWlK,CAAK,EACzB,MACJ,KAAKqd,GACDC,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAO8E,EAAK6X,EAAM,CAAC,EACxExB,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAO+E,EAAU6X,EAAWjK,CAAK,CAC9F,CACAnU,EAAOwB,EACP8E,EAAM6X,EACN5X,EAAW6X,CACf,CACAze,EAAU,KAAK4J,CAAQ,CAC3B,CAGA,QAAStN,EAAI,EAAGC,EAAIse,EAAM,QAAQ,EAAI,EAAGve,EAAIC,EAAGD,IAAK,CACjD,MAAMiD,EAAQsb,EAAM,QAAQ,EAAI,EAC1Bha,EAAaga,EAAM,QAAQ,EAAI,EAC/B8B,EAAY9b,EAAa,EACzB+I,EAAW,IAAI3C,GAA4BpG,EAAYga,EAAM,QAAQ,EAAI,EAAGtb,CAAK,EACvF,IAAIc,EAAOwa,EAAM,UAAU,EACvB1T,EAAY0T,EAAM,UAAU,EAC5BzT,EAAOyT,EAAM,YACbxT,EAAOwT,EAAM,YACbvT,EAAYuT,EAAM,UAAU,EAC5BtT,EAAYsT,EAAM,UAAA,EAClBrT,EAAYqT,EAAM,UAEtB,EAAA,QAASnb,EAAQ,EAAG2B,EAAS,EACzBuI,EAAS,SAASlK,EAAOW,EAAM8G,EAAWC,EAAMC,EAAMC,EAAWC,EAAWC,CAAS,EACjF9H,GAASid,EAFiBjd,IAAS,CAGvC,MAAMmC,EAAQgZ,EAAM,UAAU,EACxB6D,EAAa7D,EAAM,UACnB8D,EAAAA,EAAQ9D,EAAM,UAAU,EACxB+D,EAAQ/D,EAAM,UAAU,EACxBgE,EAAahE,EAAM,YACnBiE,EAAajE,EAAM,UAAA,EACnBkE,EAAalE,EAAM,UAAU,EAEnC,OAAQA,EAAM,SAAY,EAAA,CACtB,KAAKiC,GACDlT,EAAS,WAAWlK,CAAK,EACzB,MACJ,KAAKqd,GACDC,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAOsF,EAAWuX,EAAY,CAAC,EACpF1B,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAOuF,EAAMuX,EAAO,CAAC,EAC1E3B,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAOwF,EAAMuX,EAAO,CAAC,EAC1E5B,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAOyF,EAAWuX,EAAY,CAAC,EACpF7B,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAO0F,EAAWuX,EAAY,CAAC,EACpF9B,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAO2F,EAAWuX,EAAY,CAAC,CAC5F,CACA1e,EAAOwB,EACPsF,EAAYuX,EACZtX,EAAOuX,EACPtX,EAAOuX,EACPtX,EAAYuX,EACZtX,EAAYuX,EACZtX,EAAYuX,CAChB,CACA/e,EAAU,KAAK4J,CAAQ,CAC3B,CAGA,QAAStN,EAAI,EAAGC,EAAIse,EAAM,QAAQ,EAAI,EAAGve,EAAIC,EAAGD,IAAK,CACjD,MAAMiD,EAAQsb,EAAM,QAAQ,EAAI,EAC1BpT,EAAOsF,EAAa,gBAAgBxN,CAAK,EAE/C,QAASqD,EAAK,EAAGmW,EAAK8B,EAAM,QAAQ,EAAI,EAAGjY,EAAKmW,EAAInW,IAChD,OAAQiY,EAAM,SAAA,EACV,CAAA,KAAKmE,GACDhf,EAAU,KACN6d,GACIhD,EACA,IAAI/S,GAA+B+S,EAAM,QAAQ,EAAI,EAAGA,EAAM,QAAQ,EAAI,EAAGtb,CAAK,EAClFkI,EAAK,cAAgByM,GAAa,MAAQM,EAAQ,CACtD,CACJ,EACA,MACJ,KAAKyK,GACDjf,EAAU,KACN6d,GACIhD,EACA,IAAI5S,GAA8B4S,EAAM,QAAQ,EAAI,EAAGA,EAAM,QAAQ,EAAI,EAAGtb,CAAK,EACjFkI,EAAK,aAAe0M,EAAY,QAAU1M,EAAK,aAAe0M,EAAY,MAAQK,EAAQ,CAC9F,CACJ,EACA,MACJ,KAAK0K,GACD,MAAMtV,EAAW,IAAIzB,GAA0B0S,EAAM,QAAQ,EAAI,EAAGA,EAAM,QAAQ,EAAI,EAAGtb,CAAK,EAC9F,IAAIc,EAAOwa,EAAM,UAAA,EACb1T,EAAY0T,EAAM,UAAU,EAC5BzT,EAAOyT,EAAM,UAAU,EACvBxT,EAAOwT,EAAM,YAEjB,QAASnb,EAAQ,EAAG2B,EAAS,EAAGsb,EAAY/S,EAAS,gBAAkB,EACnEA,EAAS,SAASlK,EAAOW,EAAM8G,EAAWC,EAAMC,CAAI,EAChD3H,GAASid,EAF2Djd,IAAS,CAGjF,MAAMmC,EAAQgZ,EAAM,YACd6D,EAAa7D,EAAM,UACnB8D,EAAAA,EAAQ9D,EAAM,UAAA,EACd+D,EAAQ/D,EAAM,UAAU,EAE9B,OAAQA,EAAM,SAAY,EAAA,CACtB,KAAKiC,GACDlT,EAAS,WAAWlK,CAAK,EACzB,MACJ,KAAKqd,GACDC,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAOsF,EAAWuX,EAAY,CAAC,EACpF1B,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAOuF,EAAMuX,EAAO,CAAC,EAC1E3B,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAOwF,EAAMuX,EAAO,CAAC,CAClF,CACAve,EAAOwB,EACPsF,EAAYuX,EACZtX,EAAOuX,EACPtX,EAAOuX,CACX,CACA5e,EAAU,KAAK4J,CAAQ,CAC/B,CAER,CAGA,QAAStN,EAAI,EAAGC,EAAIse,EAAM,QAAQ,EAAI,EAAGve,EAAIC,EAAGD,IAAK,CACjD,MAAMiR,EAAOR,EAAa,MAAM8N,EAAM,QAAQ,EAAI,CAAC,EAEnD,QAASjY,EAAK,EAAGmW,EAAK8B,EAAM,QAAQ,EAAI,EAAGjY,EAAKmW,EAAInW,IAAM,CACtD,MAAMuB,EAAY0W,EAAM,QAAQ,EAAI,EAEpC,QAASsE,EAAM,EAAGC,EAAMvE,EAAM,QAAQ,EAAI,EAAGsE,EAAMC,EAAKD,IAAO,CAC3D,MAAMha,EAAiB0V,EAAM,cAE7B,EAAA,GAAI,CAAC1V,EAAgB,MAAM,IAAI,MAAM,kCAAkC,EACvE,MAAMrI,EAAayQ,EAAK,cAAcpJ,EAAWgB,CAAc,EACzDuX,EAAe,KAAK,uBAAuB7B,CAAK,EAChDha,EAAaga,EAAM,QAAQ,EAAI,EAC/B8B,EAAY9b,EAAa,EAE/B,OAAQ6b,EAAc,CAClB,KAAKL,GAAmB,CACpB,MAAM7W,EAAmB1I,EACnBuiB,EAAW7Z,EAAiB,MAC5BhK,EAAWgK,EAAiB,SAC5B8Z,EAAeD,EAAY7jB,EAAS,OAAS,EAAK,EAAIA,EAAS,OAE/D0F,EAAc2Z,EAAM,QAAQ,EAAI,EAChCjR,EAAW,IAAIxE,GAAevE,EAAYK,EAAaiD,EAAWqB,CAAgB,EAExF,IAAInF,EAAOwa,EAAM,UAAU,EAE3B,QAASnb,EAAQ,EAAG2B,EAAS,GAAK3B,IAAS,CACvC,IAAI9C,EACA2iB,EAAM1E,EAAM,QAAQ,EAAI,EAE5B,GAAI0E,GAAO,EAAG3iB,EAASyiB,EAAWtiB,EAAM,cAAcuiB,CAAY,EAAI9jB,MACjE,CACDoB,EAASG,EAAM,cAAcuiB,CAAY,EACzC,MAAMpkB,EAAQ2f,EAAM,QAAQ,EAAI,EAIhC,GAFA0E,GAAOrkB,EAEHsZ,GAAS,EACT,QAASvY,EAAIf,EAAOe,EAAIsjB,EAAKtjB,IAAKW,EAAOX,CAAC,EAAI4e,EAAM,gBAE3C5e,SAAAA,EAAIf,EAAOe,EAAIsjB,EAAKtjB,IAAKW,EAAOX,CAAC,EAAI4e,EAAM,UAAU,EAAIrG,EAEtE,GAAI,CAAC6K,EACD,QAASpjB,EAAI,EAAGujB,EAAK5iB,EAAO,OAAQX,EAAIujB,EAAIvjB,IAAKW,EAAOX,CAAC,GAAKT,EAASS,CAAC,CAGhF,CAGA,GADA2N,EAAS,SAASlK,EAAOW,EAAMzD,CAAM,EACjC8C,GAASid,EAAW,MACxB,MAAM9a,EAAQgZ,EAAM,UAAU,EAE9B,OAAQA,EAAM,SAAY,EAAA,CACtB,KAAKiC,GACDlT,EAAS,WAAWlK,CAAK,EACzB,MACJ,KAAKqd,GACDC,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAO,EAAG,EAAG,CAAC,CAC3E,CACAxB,EAAOwB,CACX,CACA7B,EAAU,KAAK4J,CAAQ,EACvB,KACJ,CACA,KAAK6V,GAAqB,CACtB,MAAM7V,EAAW,IAAIpB,GAAiB3H,EAAYsD,EAAWrH,CAA0C,EAEvG,QAAS4C,EAAQ,EAAGA,EAAQmB,EAAYnB,IAAS,CAC7C,MAAMW,EAAOwa,EAAM,YACbtS,EAAesS,EAAM,UAE3BjR,EAAAA,EAAS,SAASlK,EAAOW,EAAMP,GAAmByI,EAAe,EAAG,EAAGA,GAAgB,EAAGsS,EAAM,UAAA,CAAW,CAC/G,CACA7a,EAAU,KAAK4J,CAAQ,EACvB,KACJ,CACJ,CACJ,CACJ,CACJ,CAGA,MAAM8V,EAAiB7E,EAAM,QAAQ,EAAI,EAEzC,GAAI6E,EAAiB,EAAG,CACpB,MAAM9V,EAAW,IAAIpD,GAAkBkZ,CAAc,EAC/CjE,EAAY1O,EAAa,MAAM,OAErC,QAASzQ,EAAI,EAAGA,EAAIojB,EAAgBpjB,IAAK,CACrC,MAAM+D,EAAOwa,EAAM,UAAU,EACvB8E,EAAc9E,EAAM,QAAQ,EAAI,EAChCzU,EAAYrJ,EAAM,SAAS0e,EAAW,CAAC,EAE7C,QAAS7Y,EAAK6Y,EAAY,EAAG7Y,GAAM,EAAGA,IAAMwD,EAAUxD,CAAE,EAAI,GAC5D,MAAMgd,EAAY7iB,EAAM,SAAS0e,EAAYkE,EAAa,CAAC,EAC3D,IAAIE,EAAgB,EAChBC,EAAiB,EAErB,QAASld,EAAK,EAAGA,EAAK+c,EAAa/c,IAAM,CACrC,MAAMuB,EAAY0W,EAAM,QAAQ,EAAI,EAGpC,KAAOgF,GAAiB1b,GAAWyb,EAAUE,GAAgB,EAAID,IAEjEzZ,EAAUyZ,EAAgBhF,EAAM,QAAQ,EAAI,CAAC,EAAIgF,GACrD,CAEA,KAAOA,EAAgBpE,GAAWmE,EAAUE,GAAgB,EAAID,IAEhE,QAASjd,EAAK6Y,EAAY,EAAG7Y,GAAM,EAAGA,IAAUwD,EAAUxD,CAAE,GAAK,KAAIwD,EAAUxD,CAAE,EAAIgd,EAAU,EAAEE,CAAc,GAC/GlW,EAAS,SAAStN,EAAG+D,EAAM+F,CAAS,CACxC,CACApG,EAAU,KAAK4J,CAAQ,CAC3B,CAGA,MAAMmW,EAAalF,EAAM,QAAQ,EAAI,EAErC,GAAIkF,EAAa,EAAG,CAChB,MAAMnW,EAAW,IAAI1D,GAAc6Z,CAAU,EAE7C,QAASzjB,EAAI,EAAGA,EAAIyjB,EAAYzjB,IAAK,CACjC,MAAM+D,EAAOwa,EAAM,UAAA,EACbmF,EAAYjT,EAAa,OAAO8N,EAAM,QAAQ,EAAI,CAAC,EACnD7U,EAAQ,IAAIwK,GAAMnQ,EAAM2f,CAAS,EAEvCha,EAAM,SAAW6U,EAAM,QAAQ,EAAK,EACpC7U,EAAM,WAAa6U,EAAM,UAAA,EACzB7U,EAAM,YAAc6U,EAAM,cAAgBA,EAAM,WAAA,EAAemF,EAAU,YACrEha,EAAM,KAAK,YACXA,EAAM,OAAS6U,EAAM,UAAU,EAC/B7U,EAAM,QAAU6U,EAAM,UAAU,GAEpCjR,EAAS,SAAStN,EAAG0J,CAAK,CAC9B,CACAhG,EAAU,KAAK4J,CAAQ,CAC3B,CAEA,IAAI3J,EAAW,EAEf,QAAS3D,EAAI,EAAGC,EAAIyD,EAAU,OAAQ1D,EAAIC,EAAGD,IAAK2D,EAAW,KAAK,IAAIA,EAAUD,EAAU1D,CAAC,EAAE,YAAA,CAAa,EAE1G,OAAO,IAAIyD,GAAUjF,EAAMkF,EAAWC,CAAQ,CAClD,CACJ,CArkCaya,GAEF,gBAAkB,CAACV,GAAY,OAAQA,GAAY,IAAKA,GAAY,SAAUA,GAAY,MAAM,EAqkC3G,MAAMiC,EAAW,CAOb,YAAYzC,EAAsBjM,EAAqBpJ,EAAmBsJ,EAAuBwS,EAAwB,CACrH,KAAK,KAAOzG,EACZ,KAAK,KAAOjM,EACZ,KAAK,UAAYpJ,EACjB,KAAK,OAASsJ,EACd,KAAK,gBAAkBwS,CAC3B,CACJ,CAEA,MAAM3D,EAAS,CACX,YAAmB7gB,EAA8B,KAAaD,EAAgD,KAAM,CAAjG,KAAAC,MAAAA,EAA2C,KAAAD,SAAAA,CAAuD,CACzH,CAEA,SAASqiB,GAAchD,EAAoBjR,EAA0B4K,EAA+B,CAChG,IAAInU,EAAOwa,EAAM,UAAA,EACbvZ,EAAQuZ,EAAM,UAAU,EAAIrG,EAEhC,QAAS9U,EAAQ,EAAG2B,EAAS,EAAGsb,EAAY/S,EAAS,cAAc,EAAI,EACnEA,EAAS,SAASlK,EAAOW,EAAMiB,CAAK,EAChC5B,GAASid,EAF2Djd,IAAS,CAGjF,MAAMmC,EAAQgZ,EAAM,UAAU,EACxB/Y,EAAS+Y,EAAM,UAAA,EAAcrG,EAEnC,OAAQqG,EAAM,SAAS,EAAA,CACnB,KAAKiC,GACDlT,EAAS,WAAWlK,CAAK,EACzB,MACJ,KAAKqd,GACDC,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAOP,EAAOQ,EAAQ0S,CAAK,CACxF,CACAnU,EAAOwB,EACPP,EAAQQ,CACZ,CAEA,OAAO8H,CACX,CAEA,SAASmU,GAAclD,EAAoBjR,EAA0B4K,EAA+B,CAChG,IAAInU,EAAOwa,EAAM,UAAA,EACbrZ,EAASqZ,EAAM,UAAU,EAAIrG,EAC7B1S,EAAS+Y,EAAM,UAAU,EAAIrG,EAEjC,QAAS9U,EAAQ,EAAG2B,EAAS,EAAGsb,EAAY/S,EAAS,cAAA,EAAkB,EACnEA,EAAS,SAASlK,EAAOW,EAAMmB,EAAQM,CAAM,EACzCpC,GAASid,EAF2Djd,IAAS,CAGjF,MAAMmC,EAAQgZ,EAAM,YACdqF,EAAUrF,EAAM,YAAcrG,EAC9B2L,EAAUtF,EAAM,UAAA,EAAcrG,EAEpC,OAAQqG,EAAM,SAAA,EACV,CAAA,KAAKiC,GACDlT,EAAS,WAAWlK,CAAK,EACzB,MACJ,KAAKqd,GACDC,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAOL,EAAQ0e,EAAS1L,CAAK,EAClFwI,EAAUnC,EAAOjR,EAAUvI,IAAU3B,EAAO,EAAGW,EAAMwB,EAAOC,EAAQqe,EAAS3L,CAAK,CAC1F,CACAnU,EAAOwB,EACPL,EAAS0e,EACTpe,EAASqe,CACb,CAEA,OAAOvW,CACX,CAEA,SAASoT,EACLnC,EACAjR,EACAvI,EACA3B,EACA4B,EACAC,EACAM,EACAL,EACAM,EACA0S,EACF,CACE5K,EAAS,UAAUvI,EAAQ3B,EAAO4B,EAAOC,EAAOC,EAAQqZ,EAAM,UAAU,EAAGA,EAAM,YAAcrG,EAAOqG,EAAM,UAAU,EAAGA,EAAM,YAAcrG,EAAO3S,EAAOC,CAAM,CACrK,CAEA,MAAM8b,GAAc,EACdE,GAAiB,EACjBE,GAAkB,EAClBC,GAAkB,EAClBC,GAAa,EACbC,GAAc,EACdC,GAAc,EACdC,GAAa,EACbC,GAAc,EACdC,GAAc,EAEd3B,GAAkB,EAClBC,GAAY,EACZI,GAAW,EACXC,GAAa,EACbQ,GAAY,EACZC,GAAa,EAEbtB,GAAoB,EACpBoD,GAAsB,EAEtBT,GAAgB,EAChBC,GAAe,EACfC,GAAW,EAGXpC,GAAgB,EAChBC,GAAe,ECvuCR,MAAAqD,WAAuBC,EAA0C,CAAA,CC8CjE,MAAAC,EAAa,CAUtB,YAAY3F,EAAoC,CAHhD,WAAQ,EACR,KAAQ,aAAe,IAAI,MAGvB,KAAK,iBAAmBA,CAC5B,CAEA,iBAAiB4F,EAAkC,CAC/C,MAAM/L,EAAQ,KAAK,MACbzH,EAAe,IAAI2M,GACnB8G,EAAO,OAAOD,GAAS,SAAW,KAAK,MAAMA,CAAI,EAAIA,EAGrDE,EAAcD,EAAK,SAEzB,GAAIC,EAAa,CACb1T,EAAa,KAAO0T,EAAY,KAChC1T,EAAa,QAAU0T,EAAY,MACnC,MAAMxF,EAAWlO,EAAa,QAAQ,OAAO,EAAG,CAAC,EAEjD,GAAIkO,IAAa,OAASA,IAAa,MAAO,CAC1C,MAAMC,EAAQ,sCAAsCuF,EAAY,iDAEhE,QAAQ,MAAMvF,CAAK,CACvB,CACAnO,EAAa,EAAI0T,EAAY,EAC7B1T,EAAa,EAAI0T,EAAY,EAC7B1T,EAAa,MAAQ0T,EAAY,MACjC1T,EAAa,OAAS0T,EAAY,OAClC1T,EAAa,IAAM0T,EAAY,IAC/B1T,EAAa,WAAa0T,EAAY,MAC1C,CAGA,GAAID,EAAK,MACL,QAASlkB,EAAI,EAAGA,EAAIkkB,EAAK,MAAM,OAAQlkB,IAAK,CACxC,MAAMokB,EAAUF,EAAK,MAAMlkB,CAAC,EAE5B,IAAImR,EAAmB,KACvB,MAAMkT,EAAqBC,EAASF,EAAS,SAAU,IAAI,EAE3D,GAAIC,GAAc,OACdlT,EAASV,EAAa,SAAS4T,CAAU,EACrClT,GAAU,MAAM,MAAM,IAAI,MAAM,0BAA0BkT,GAAY,EAE9E,MAAMlZ,EAAO,IAAI2I,GAASrD,EAAa,MAAM,OAAQ2T,EAAQ,KAAMjT,CAAM,EAEzEhG,EAAK,OAASmZ,EAASF,EAAS,SAAU,CAAC,EAAIlM,EAC/C/M,EAAK,EAAImZ,EAASF,EAAS,IAAK,CAAC,EAAIlM,EACrC/M,EAAK,EAAImZ,EAASF,EAAS,IAAK,CAAC,EAAIlM,EACrC/M,EAAK,SAAWmZ,EAASF,EAAS,WAAY,CAAC,EAC/CjZ,EAAK,OAASmZ,EAASF,EAAS,SAAU,CAAC,EAC3CjZ,EAAK,OAASmZ,EAASF,EAAS,SAAU,CAAC,EAC3CjZ,EAAK,OAASmZ,EAASF,EAAS,SAAU,CAAC,EAC3CjZ,EAAK,OAASmZ,EAASF,EAAS,SAAU,CAAC,EAC3CjZ,EAAK,cAAgB1K,EAAM,UAAUuR,GAAesS,EAASF,EAAS,YAAa,QAAQ,CAAC,EAC5FjZ,EAAK,aAAemZ,EAASF,EAAS,OAAQ,EAAK,EAEnD,MAAMrc,EAAQuc,EAASF,EAAS,QAAS,IAAI,EAEzCrc,GAAOoD,EAAK,MAAM,cAAcpD,CAAK,EAEzC0I,EAAa,MAAM,KAAKtF,CAAI,CAChC,CAIJ,GAAI+Y,EAAK,MACL,QAASlkB,EAAI,EAAGA,EAAIkkB,EAAK,MAAM,OAAQlkB,IAAK,CACxC,MAAMukB,EAAUL,EAAK,MAAMlkB,CAAC,EACtB0X,EAAWjH,EAAa,SAAS8T,EAAQ,IAAI,EAEnD,GAAI,CAAC7M,EAAU,MAAM,IAAI,MAAM,sBAAsB6M,EAAQ,iBAAiBA,EAAQ,MAAM,EAC5F,MAAMpZ,EAAO,IAAIsS,GAAShN,EAAa,MAAM,OAAQ8T,EAAQ,KAAM7M,CAAQ,EAErE3P,EAAgBuc,EAASC,EAAS,QAAS,IAAI,EAEjDxc,GAAOoD,EAAK,MAAM,cAAcpD,CAAK,EAEzC,MAAMS,EAAe8b,EAASC,EAAS,OAAQ,IAAI,EAE/C/b,IAAM2C,EAAK,UAAYtK,EAAM,WAAW2H,CAAI,GAEhD2C,EAAK,eAAiBmZ,EAASC,EAAS,aAAc,IAAI,EAC1DpZ,EAAK,UAAY6Y,GAAa,oBAAoBM,EAASC,EAAS,QAAS,QAAQ,CAAC,EACtF9T,EAAa,MAAM,KAAKtF,CAAI,CAChC,CAIJ,GAAI+Y,EAAK,GACL,QAASlkB,EAAI,EAAGA,EAAIkkB,EAAK,GAAG,OAAQlkB,IAAK,CACrC,MAAMwkB,EAAgBN,EAAK,GAAGlkB,CAAC,EACzBmL,EAAO,IAAIsM,GAAiB+M,EAAc,IAAI,EAEpDrZ,EAAK,MAAQmZ,EAASE,EAAe,QAAS,CAAC,EAC/CrZ,EAAK,aAAemZ,EAASE,EAAe,OAAQ,EAAK,EAEzD,QAASle,EAAK,EAAGA,EAAKke,EAAc,MAAM,OAAQle,IAAM,CACpD,MAAMsW,EAAW4H,EAAc,MAAMle,CAAE,EACjCjF,EAAOoP,EAAa,SAASmM,CAAQ,EAE3C,GAAIvb,GAAQ,KAAM,MAAM,IAAI,MAAM,sBAAsBub,GAAU,EAClEzR,EAAK,MAAM,KAAK9J,CAAI,CACxB,CAEA8J,EAAK,OAASsF,EAAa,SAAS+T,EAAc,MAAM,EAExDrZ,EAAK,IAAMmZ,EAASE,EAAe,MAAO,CAAC,EAC3CrZ,EAAK,SAAWmZ,EAASE,EAAe,WAAY,CAAC,EAAItM,EACzD/M,EAAK,cAAgBmZ,EAASE,EAAe,eAAgB,EAAI,EAAI,EAAI,GACzErZ,EAAK,SAAWmZ,EAASE,EAAe,WAAY,EAAK,EACzDrZ,EAAK,QAAUmZ,EAASE,EAAe,UAAW,EAAK,EACvDrZ,EAAK,QAAUmZ,EAASE,EAAe,UAAW,EAAK,EAEvD/T,EAAa,cAAc,KAAKtF,CAAI,CACxC,CAIJ,GAAI+Y,EAAK,UACL,QAASlkB,EAAI,EAAGA,EAAIkkB,EAAK,UAAU,OAAQlkB,IAAK,CAC5C,MAAMwkB,EAAgBN,EAAK,UAAUlkB,CAAC,EAChCmL,EAAO,IAAIwS,GAAwB6G,EAAc,IAAI,EAE3DrZ,EAAK,MAAQmZ,EAASE,EAAe,QAAS,CAAC,EAC/CrZ,EAAK,aAAemZ,EAASE,EAAe,OAAQ,EAAK,EAEzD,QAASle,EAAK,EAAGA,EAAKke,EAAc,MAAM,OAAQle,IAAM,CACpD,MAAMsW,EAAW4H,EAAc,MAAMle,CAAE,EACjCjF,EAAOoP,EAAa,SAASmM,CAAQ,EAE3C,GAAI,CAACvb,EAAM,MAAM,IAAI,MAAM,sBAAsBub,8BAAqC4H,EAAc,OAAO,EAC3GrZ,EAAK,MAAM,KAAK9J,CAAI,CACxB,CAEA,MAAMojB,EAAqBD,EAAc,OACnCnQ,EAAS5D,EAAa,SAASgU,CAAU,EAE/C,GAAI,CAACpQ,EAAQ,MAAM,IAAI,MAAM,6BAA6BoQ,8BAAuCD,EAAc,OAAO,EACtHrZ,EAAK,OAASkJ,EAEdlJ,EAAK,MAAQmZ,EAASE,EAAe,QAAS,EAAK,EACnDrZ,EAAK,SAAWmZ,EAASE,EAAe,WAAY,EAAK,EACzDrZ,EAAK,eAAiBmZ,EAASE,EAAe,WAAY,CAAC,EAC3DrZ,EAAK,QAAUmZ,EAASE,EAAe,IAAK,CAAC,EAAItM,EACjD/M,EAAK,QAAUmZ,EAASE,EAAe,IAAK,CAAC,EAAItM,EACjD/M,EAAK,aAAemZ,EAASE,EAAe,SAAU,CAAC,EACvDrZ,EAAK,aAAemZ,EAASE,EAAe,SAAU,CAAC,EACvDrZ,EAAK,aAAemZ,EAASE,EAAe,SAAU,CAAC,EAEvDrZ,EAAK,UAAYmZ,EAASE,EAAe,YAAa,CAAC,EACvDrZ,EAAK,KAAOmZ,EAASE,EAAe,OAAQ,CAAC,EAC7CrZ,EAAK,KAAOmZ,EAASE,EAAe,OAAQrZ,EAAK,IAAI,EACrDA,EAAK,UAAYmZ,EAASE,EAAe,YAAa,CAAC,EACvDrZ,EAAK,UAAYmZ,EAASE,EAAe,YAAarZ,EAAK,SAAS,EACpEA,EAAK,UAAYmZ,EAASE,EAAe,YAAa,CAAC,EAEvD/T,EAAa,qBAAqB,KAAKtF,CAAI,CAC/C,CAIJ,GAAI+Y,EAAK,KACL,QAASlkB,EAAI,EAAGA,EAAIkkB,EAAK,KAAK,OAAQlkB,IAAK,CACvC,MAAMwkB,EAAgBN,EAAK,KAAKlkB,CAAC,EAC3BmL,EAAO,IAAIwM,GAAmB6M,EAAc,IAAI,EAEtDrZ,EAAK,MAAQmZ,EAASE,EAAe,QAAS,CAAC,EAC/CrZ,EAAK,aAAemZ,EAASE,EAAe,OAAQ,EAAK,EAEzD,QAASle,EAAK,EAAGA,EAAKke,EAAc,MAAM,OAAQle,IAAM,CACpD,MAAMsW,EAAW4H,EAAc,MAAMle,CAAE,EACjCjF,EAAOoP,EAAa,SAASmM,CAAQ,EAE3C,GAAI,CAACvb,EAAM,MAAM,IAAI,MAAM,sBAAsBub,yBAAgC4H,EAAc,OAAO,EACtGrZ,EAAK,MAAM,KAAK9J,CAAI,CACxB,CAEA,MAAMojB,EAAqBD,EAAc,OACnCnQ,EAAS5D,EAAa,SAASgU,CAAU,EAE/C,GAAI,CAACpQ,EAAQ,MAAM,IAAI,MAAM,6BAA6BoQ,yBAAkCD,EAAc,OAAO,EACjHrZ,EAAK,OAASkJ,EAEdlJ,EAAK,aAAe1K,EAAM,UAAUmX,GAAc0M,EAASE,EAAe,eAAgB,SAAS,CAAC,EACpGrZ,EAAK,YAAc1K,EAAM,UAAUoX,EAAayM,EAASE,EAAe,cAAe,QAAQ,CAAC,EAChGrZ,EAAK,WAAa1K,EAAM,UAAUqX,GAAYwM,EAASE,EAAe,aAAc,SAAS,CAAC,EAC9FrZ,EAAK,eAAiBmZ,EAASE,EAAe,WAAY,CAAC,EAC3DrZ,EAAK,SAAWmZ,EAASE,EAAe,WAAY,CAAC,EACjDrZ,EAAK,cAAgByM,GAAa,QAAOzM,EAAK,UAAY+M,GAC9D/M,EAAK,QAAUmZ,EAASE,EAAe,UAAW,CAAC,GAC/CrZ,EAAK,aAAe0M,EAAY,QAAU1M,EAAK,aAAe0M,EAAY,SAAO1M,EAAK,SAAW+M,GACrG/M,EAAK,UAAYmZ,EAASE,EAAe,YAAa,CAAC,EACvDrZ,EAAK,KAAOmZ,EAASE,EAAe,OAAQ,CAAC,EAC7CrZ,EAAK,KAAOmZ,EAASE,EAAe,OAAQrZ,EAAK,IAAI,EAErDsF,EAAa,gBAAgB,KAAKtF,CAAI,CAC1C,CAIJ,GAAI+Y,EAAK,MACL,QAASlkB,EAAI,EAAGA,EAAIkkB,EAAK,MAAM,OAAQlkB,IAAK,CACxC,MAAM0kB,EAAUR,EAAK,MAAMlkB,CAAC,EACtBiR,EAAO,IAAI4M,GAAK6G,EAAQ,IAAI,EAElC,GAAIA,EAAQ,MACR,QAASpe,EAAK,EAAGA,EAAKoe,EAAQ,MAAM,OAAQpe,IAAM,CAC9C,MAAMsW,EAAW8H,EAAQ,MAAMpe,CAAE,EAC3BjF,EAAOoP,EAAa,SAASmM,CAAQ,EAE3C,GAAI,CAACvb,EAAM,MAAM,IAAI,MAAM,sBAAsBub,cAAqB8H,EAAQ,OAAO,EACrFzT,EAAK,MAAM,KAAK5P,CAAI,CACxB,CAGJ,GAAIqjB,EAAQ,GACR,QAASpe,EAAK,EAAGA,EAAKoe,EAAQ,GAAG,OAAQpe,IAAM,CAC3C,MAAM0W,EAAiB0H,EAAQ,GAAGpe,CAAE,EAC9BoE,EAAa+F,EAAa,iBAAiBuM,CAAc,EAE/D,GAAI,CAACtS,EAAY,MAAM,IAAI,MAAM,+BAA+BsS,cAA2B0H,EAAQ,OAAO,EAC1GzT,EAAK,YAAY,KAAKvG,CAAU,CACpC,CAGJ,GAAIga,EAAQ,UACR,QAASpe,EAAK,EAAGA,EAAKoe,EAAQ,UAAU,OAAQpe,IAAM,CAClD,MAAM0W,EAAiB0H,EAAQ,UAAUpe,CAAE,EACrCoE,EAAa+F,EAAa,wBAAwBuM,CAAc,EAEtE,GAAI,CAACtS,EAAY,MAAM,IAAI,MAAM,sCAAsCsS,cAA2B0H,EAAQ,OAAO,EACjHzT,EAAK,YAAY,KAAKvG,CAAU,CACpC,CAGJ,GAAIga,EAAQ,KACR,QAASpe,EAAK,EAAGA,EAAKoe,EAAQ,KAAK,OAAQpe,IAAM,CAC7C,MAAM0W,EAAiB0H,EAAQ,KAAKpe,CAAE,EAChCoE,EAAa+F,EAAa,mBAAmBuM,CAAc,EAEjE,GAAI,CAACtS,EAAY,MAAM,IAAI,MAAM,iCAAiCsS,cAA2B0H,EAAQ,OAAO,EAC5GzT,EAAK,YAAY,KAAKvG,CAAU,CACpC,CAGJ,UAAWmS,KAAY6H,EAAQ,YAAa,CACxC,MAAMhmB,EAAO+R,EAAa,SAASoM,CAAQ,EAE3C,GAAI,CAACne,EAAM,MAAM,IAAI,MAAM,sBAAsBme,cAAqB6H,EAAQ,OAAO,EACrF,MAAMH,EAAUG,EAAQ,YAAY7H,CAAQ,EAE5C,UAAW8H,KAAaJ,EAAS,CAC7B,MAAM/jB,EAAa,KAAK,eAAe+jB,EAAQI,CAAS,EAAG1T,EAAMvS,EAAK,MAAOimB,EAAWlU,CAAY,EAEhGjQ,GAAYyQ,EAAK,cAAcvS,EAAK,MAAOimB,EAAWnkB,CAAU,CACxE,CACJ,CACAiQ,EAAa,MAAM,KAAKQ,CAAI,EACxBA,EAAK,MAAQ,YAAWR,EAAa,YAAcQ,EAC3D,CAIJ,QAASjR,EAAI,EAAGC,EAAI,KAAK,aAAa,OAAQD,EAAIC,EAAGD,IAAK,CACtD,MAAMif,EAAa,KAAK,aAAajf,CAAC,EAChCiR,EAAQgO,EAAW,KAAkCxO,EAAa,SAASwO,EAAW,IAAI,EAAhExO,EAAa,YAE7C,GAAI,CAACQ,EAAM,MAAM,IAAI,MAAM,mBAAmBgO,EAAW,MAAM,EAC/D,MAAM9N,EAASF,EAAK,cAAcgO,EAAW,UAAWA,EAAW,MAAM,EAEzE,GAAI,CAAC9N,EAAQ,MAAM,IAAI,MAAM,0BAA0B8N,EAAW,QAAQ,EAC1EA,EAAW,KAAK,mBAAqBA,EAAW,gBAAoC9N,EAA2B8N,EAAW,KAC1HA,EAAW,KAAK,cAA8B9N,CAAM,CAExD,CAIA,GAHA,KAAK,aAAa,OAAS,EAGvB+S,EAAK,OACL,UAAWhF,KAAagF,EAAK,OAAQ,CACjC,MAAMU,EAAWV,EAAK,OAAOhF,CAAS,EAChC/T,EAAO,IAAIgJ,GAAU+K,CAAS,EAEpC/T,EAAK,SAAWmZ,EAASM,EAAU,MAAO,CAAC,EAC3CzZ,EAAK,WAAamZ,EAASM,EAAU,QAAS,CAAC,EAC/CzZ,EAAK,YAAcmZ,EAASM,EAAU,SAAU,EAAE,EAClDzZ,EAAK,UAAYmZ,EAASM,EAAU,QAAS,IAAI,EAC7CzZ,EAAK,YACLA,EAAK,OAASmZ,EAASM,EAAU,SAAU,CAAC,EAC5CzZ,EAAK,QAAUmZ,EAASM,EAAU,UAAW,CAAC,GAElDnU,EAAa,OAAO,KAAKtF,CAAI,CACjC,CAIJ,GAAI+Y,EAAK,WACL,UAAW5U,KAAiB4U,EAAK,WAAY,CACzC,MAAMW,EAAeX,EAAK,WAAW5U,CAAa,EAElD,KAAK,cAAcuV,EAAcvV,EAAemB,CAAY,CAChE,CAGJ,OAAOA,CACX,CAEA,eAAeqU,EAAU7T,EAAYpJ,EAAmBrJ,EAAciS,EAA+C,CACjH,MAAMyH,EAAQ,KAAK,MAInB,OAFA1Z,EAAO8lB,EAASQ,EAAK,OAAQtmB,CAAI,EAEzB8lB,EAASQ,EAAK,OAAQ,QAAQ,GAClC,IAAK,SAAU,CACX,MAAM7jB,EAAOqjB,EAASQ,EAAK,OAAQtmB,CAAI,EACjCuS,EAAW,KAAK,aAAauT,EAASQ,EAAK,WAAY,IAAI,CAAC,EAC5DnjB,EAAS,KAAK,iBAAiB,oBAAoBsP,EAAMzS,EAAMyC,EAAM8P,CAAQ,EAEnF,GAAI,CAACpP,EAAQ,OAAO,KACpBA,EAAO,KAAOV,EACdU,EAAO,EAAI2iB,EAASQ,EAAK,IAAK,CAAC,EAAI5M,EACnCvW,EAAO,EAAI2iB,EAASQ,EAAK,IAAK,CAAC,EAAI5M,EACnCvW,EAAO,OAAS2iB,EAASQ,EAAK,SAAU,CAAC,EACzCnjB,EAAO,OAAS2iB,EAASQ,EAAK,SAAU,CAAC,EACzCnjB,EAAO,SAAW2iB,EAASQ,EAAK,WAAY,CAAC,EAC7CnjB,EAAO,MAAQmjB,EAAI,MAAQ5M,EAC3BvW,EAAO,OAASmjB,EAAI,OAAS5M,EAC7BvW,EAAO,SAAWoP,EAElB,MAAMhJ,EAAgBuc,EAASQ,EAAK,QAAS,IAAI,EAEjD,OAAI/c,GAAOpG,EAAO,MAAM,cAAcoG,CAAK,EAGpCpG,CACX,CACA,IAAK,cAAe,CAChB,MAAM2d,EAAM,KAAK,iBAAiB,yBAAyBrO,EAAMzS,CAAI,EAErE,GAAI,CAAC8gB,EAAK,OAAO,KACjB,KAAK,aAAawF,EAAKxF,EAAKwF,EAAI,aAAe,CAAC,EAChD,MAAM/c,EAAgBuc,EAASQ,EAAK,QAAS,IAAI,EAEjD,OAAI/c,GAAOuX,EAAI,MAAM,cAAcvX,CAAK,EAEjCuX,CACX,CACA,IAAK,OACL,IAAK,aAAc,CACf,MAAMre,EAAOqjB,EAASQ,EAAK,OAAQtmB,CAAI,EACjCuS,EAAW,KAAK,aAAauT,EAASQ,EAAK,WAAY,IAAI,CAAC,EAC5D5H,EAAO,KAAK,iBAAiB,kBAAkBjM,EAAMzS,EAAMyC,EAAM8P,CAAQ,EAE/E,GAAI,CAACmM,EAAM,OAAO,KAClBA,EAAK,KAAOjc,EAEZ,MAAM8G,EAAQuc,EAASQ,EAAK,QAAS,IAAI,EAErC/c,GAAOmV,EAAK,MAAM,cAAcnV,CAAK,EAEzCmV,EAAK,MAAQoH,EAASQ,EAAK,QAAS,CAAC,EAAI5M,EACzCgF,EAAK,OAASoH,EAASQ,EAAK,SAAU,CAAC,EAAI5M,EAC3CgF,EAAK,SAAWnM,EAEhB,MAAMI,EAAiBmT,EAASQ,EAAK,SAAU,IAAI,EAEnD,GAAI3T,EACA,OAAA,KAAK,aAAa,KAAK,IAAIwO,GAAWzC,EAAcoH,EAASQ,EAAK,OAAQ,IAAI,EAAGjd,EAAWsJ,EAAQmT,EAASQ,EAAK,YAAa,EAAI,CAAC,CAAC,EAE9H5H,EAGX,MAAMva,EAAqBmiB,EAAI,IAE/B,YAAK,aAAaA,EAAK5H,EAAMva,EAAI,MAAM,EACvCua,EAAK,UAAY4H,EAAI,UACrB5H,EAAK,UAAY,IAAI,aAAava,CAAG,EAGrCua,EAAK,MAAQoH,EAASQ,EAAK,QAAS,IAAI,EACxC5H,EAAK,WAAaoH,EAASQ,EAAK,OAAQ,CAAC,EAAI,EAEtC5H,CACX,CACA,IAAK,OAAQ,CACT,MAAMjc,EAAO,KAAK,iBAAiB,kBAAkBgQ,EAAMzS,CAAI,EAE/D,GAAI,CAACyC,EAAM,OAAO,KAClBA,EAAK,OAASqjB,EAASQ,EAAK,SAAU,EAAK,EAC3C7jB,EAAK,cAAgBqjB,EAASQ,EAAK,gBAAiB,EAAI,EAExD,MAAM7b,EAAc6b,EAAI,YAExB,KAAK,aAAaA,EAAK7jB,EAAMgI,GAAe,CAAC,EAE7C,MAAMqP,EAAyB7X,EAAM,SAASwI,EAAc,EAAG,CAAC,EAEhE,QAASjJ,EAAI,EAAGA,EAAI8kB,EAAI,QAAQ,OAAQ9kB,IAAKsY,EAAQtY,CAAC,EAAI8kB,EAAI,QAAQ9kB,CAAC,EAAIkY,EAC3EjX,EAAK,QAAUqX,EAEf,MAAMvQ,EAAgBuc,EAASQ,EAAK,QAAS,IAAI,EAEjD,OAAI/c,GAAO9G,EAAK,MAAM,cAAc8G,CAAK,EAElC9G,CACX,CACA,IAAK,QAAS,CACV,MAAMK,EAAQ,KAAK,iBAAiB,mBAAmB2P,EAAMzS,CAAI,EAEjE,GAAI,CAAC8C,EAAO,OAAO,KACnBA,EAAM,EAAIgjB,EAASQ,EAAK,IAAK,CAAC,EAAI5M,EAClC5W,EAAM,EAAIgjB,EAASQ,EAAK,IAAK,CAAC,EAAI5M,EAClC5W,EAAM,SAAWgjB,EAASQ,EAAK,WAAY,CAAC,EAE5C,MAAM/c,EAAQuc,EAASQ,EAAK,QAAS,IAAI,EAEzC,OAAI/c,GAAOzG,EAAM,MAAM,cAAcyG,CAAK,EAEnCzG,CACX,CACA,IAAK,WAAY,CACb,MAAMwe,EAAO,KAAK,iBAAiB,sBAAsB7O,EAAMzS,CAAI,EAEnE,GAAI,CAACshB,EAAM,OAAO,KAElB,MAAMmD,EAAMqB,EAASQ,EAAK,MAAO,IAAI,EAErC,GAAI7B,GAAO,KAAM,CACb,MAAMvkB,EAAO+R,EAAa,SAASwS,CAAG,EAEtC,GAAIvkB,GAAQ,KAAM,MAAM,IAAI,MAAM,gCAAgCukB,GAAK,EACvEnD,EAAK,QAAUphB,CACnB,CAEA,MAAMuK,EAAc6b,EAAI,YAExB,KAAK,aAAaA,EAAKhF,EAAM7W,GAAe,CAAC,EAE7C,MAAMlB,EAAgBuc,EAASQ,EAAK,QAAS,IAAI,EAEjD,OAAI/c,GAAO+X,EAAK,MAAM,cAAc/X,CAAK,EAElC+X,CACX,CACJ,CAEA,OAAO,IACX,CAEA,aAAagF,EAAU,CACnB,GAAIA,GAAO,KAAM,OAAO,KACxB,MAAM/T,EAAW,IAAI1N,GAASihB,EAASQ,EAAK,QAAS,CAAC,CAAC,EAEvD,OAAA/T,EAAS,MAAQuT,EAASQ,EAAK,QAAS,CAAC,EACzC/T,EAAS,OAASuT,EAASQ,EAAK,SAAU,CAAC,EAC3C/T,EAAS,WAAauT,EAASQ,EAAK,QAAS,CAAC,EAEvC/T,CACX,CAEA,aAAa+T,EAAUtkB,EAA8B0Y,EAAwB,CACzE,MAAMhB,EAAQ,KAAK,MAEnB1X,EAAW,oBAAsB0Y,EACjC,MAAMha,EAA0B4lB,EAAI,SAEpC,GAAI5L,GAAkBha,EAAS,OAAQ,CACnC,MAAM6lB,EAAiBtkB,EAAM,aAAavB,CAAQ,EAElD,GAAIgZ,GAAS,EACT,QAASlY,EAAI,EAAGC,EAAIf,EAAS,OAAQc,EAAIC,EAAGD,IAAK+kB,EAAe/kB,CAAC,GAAKkY,EAE1E1X,EAAW,SAAWukB,EAEtB,MACJ,CACA,MAAM9E,EAAU,IAAI,MACd9gB,EAAQ,IAAI,MAElB,QAASa,EAAI,EAAGC,EAAIf,EAAS,OAAQc,EAAIC,GAAK,CAC1C,MAAMkY,EAAYjZ,EAASc,GAAG,EAE9Bb,EAAM,KAAKgZ,CAAS,EACpB,QAASsE,EAAKzc,EAAImY,EAAY,EAAGnY,EAAIyc,EAAIzc,GAAK,EAC1Cb,EAAM,KAAKD,EAASc,CAAC,CAAC,EACtBigB,EAAQ,KAAK/gB,EAASc,EAAI,CAAC,EAAIkY,CAAK,EACpC+H,EAAQ,KAAK/gB,EAASc,EAAI,CAAC,EAAIkY,CAAK,EACpC+H,EAAQ,KAAK/gB,EAASc,EAAI,CAAC,CAAC,CAEpC,CACAQ,EAAW,MAAQrB,EACnBqB,EAAW,SAAWC,EAAM,aAAawf,CAAO,CACpD,CAEA,cAAc6E,EAAUtmB,EAAciS,EAA4B,CAC9D,MAAMyH,EAAQ,KAAK,MACbxU,EAAY,IAAI,MAGtB,GAAIohB,EAAI,MACJ,UAAWjI,KAAYiI,EAAI,MAAO,CAC9B,MAAMP,EAAUO,EAAI,MAAMjI,CAAQ,EAC5Bne,EAAO+R,EAAa,SAASoM,CAAQ,EAE3C,GAAI,CAACne,EAAM,MAAM,IAAI,MAAM,mBAAmBme,GAAU,EACxD,MAAMhV,EAAYnJ,EAAK,MAEvB,UAAWsmB,KAAgBT,EAAS,CAChC,MAAMU,EAAcV,EAAQS,CAAY,EAExC,GAAI,CAACC,EAAa,SAClB,MAAMxgB,EAASwgB,EAAY,OAE3B,GAAID,GAAgB,aAAc,CAC9B,MAAM1X,EAAW,IAAI1E,GAAmBnE,EAAQoD,CAAS,EAEzD,QAASzE,EAAQ,EAAGA,EAAQqB,EAAQrB,IAAS,CACzC,MAAM8hB,EAASD,EAAY7hB,CAAK,EAEhCkK,EAAS,SAASlK,EAAOkhB,EAASY,EAAQ,OAAQ,CAAC,EAAGZ,EAASY,EAAQ,OAAQ,IAAI,CAAC,CACxF,CACAxhB,EAAU,KAAK4J,CAAQ,CAC3B,SAAW0X,GAAgB,OAAQ,CAC/B,MAAM1X,EAAW,IAAI1F,GAAanD,EAAQA,GAAU,EAAGoD,CAAS,EAChE,IAAIqd,EAASD,EAAY,CAAC,EACtBlhB,EAAOugB,EAASY,EAAQ,OAAQ,CAAC,EACjCnd,EAAQlH,EAAM,WAAWqkB,EAAO,KAAK,EAEzC,QAAS9hB,EAAQ,EAAG2B,EAAS,GAAK3B,IAAS,CACvCkK,EAAS,SAASlK,EAAOW,EAAMgE,EAAM,EAAGA,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAC,EACjE,MAAMod,EAAUF,EAAY7hB,EAAQ,CAAC,EAErC,GAAI,CAAC+hB,EAAS,CACV7X,EAAS,OAAOvI,CAAM,EACtB,KACJ,CACA,MAAMQ,EAAQ+e,EAASa,EAAS,OAAQ,CAAC,EACnCC,EAAWvkB,EAAM,WAAWskB,EAAQ,KAAK,EACzC5L,EAAQ2L,EAAO,MAEjB3L,IACAxU,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOwC,EAAM,EAAGqd,EAAS,EAAG,CAAC,EACzFrgB,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOwC,EAAM,EAAGqd,EAAS,EAAG,CAAC,EACzFrgB,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOwC,EAAM,EAAGqd,EAAS,EAAG,CAAC,EACzFrgB,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOwC,EAAM,EAAGqd,EAAS,EAAG,CAAC,GAE7FrhB,EAAOwB,EACPwC,EAAQqd,EACRF,EAASC,CACb,CAEAzhB,EAAU,KAAK4J,CAAQ,CAC3B,SAAW0X,GAAgB,MAAO,CAC9B,MAAM1X,EAAW,IAAIrF,GAAYxD,EAAQA,EAAS,EAAGoD,CAAS,EAC9D,IAAIqd,EAASD,EAAY,CAAC,EACtBlhB,EAAOugB,EAASY,EAAQ,OAAQ,CAAC,EACjCnd,EAAQlH,EAAM,WAAWqkB,EAAO,KAAK,EAEzC,QAAS9hB,EAAQ,EAAG2B,EAAS,GAAK3B,IAAS,CACvCkK,EAAS,SAASlK,EAAOW,EAAMgE,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAC,EACxD,MAAMod,EAAUF,EAAY7hB,EAAQ,CAAC,EAErC,GAAI,CAAC+hB,EAAS,CACV7X,EAAS,OAAOvI,CAAM,EACtB,KACJ,CACA,MAAMQ,EAAQ+e,EAASa,EAAS,OAAQ,CAAC,EACnCC,EAAWvkB,EAAM,WAAWskB,EAAQ,KAAK,EACzC5L,EAAQ2L,EAAO,MAEjB3L,IACAxU,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOwC,EAAM,EAAGqd,EAAS,EAAG,CAAC,EACzFrgB,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOwC,EAAM,EAAGqd,EAAS,EAAG,CAAC,EACzFrgB,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOwC,EAAM,EAAGqd,EAAS,EAAG,CAAC,GAE7FrhB,EAAOwB,EACPwC,EAAQqd,EACRF,EAASC,CACb,CAEAzhB,EAAU,KAAK4J,CAAQ,CAC3B,SAAW0X,GAAgB,QACvBthB,EAAU,KAAK6d,GAAc0D,EAAa,IAAI/c,GAAczD,EAAQA,EAAQoD,CAAS,EAAG,EAAG,CAAC,CAAC,UACtFmd,GAAgB,QAAS,CAChC,MAAM1X,EAAW,IAAInF,GAAc1D,EAAQA,EAAS,EAAGoD,CAAS,EAEhE,IAAIqd,EAASD,EAAY,CAAC,EACtBlhB,EAAOugB,EAASY,EAAQ,OAAQ,CAAC,EACjCnd,EAAQlH,EAAM,WAAWqkB,EAAO,KAAK,EACrCI,EAASzkB,EAAM,WAAWqkB,EAAO,IAAI,EAEzC,QAAS9hB,EAAQ,EAAG2B,EAAS,GAAK3B,IAAS,CACvCkK,EAAS,SAASlK,EAAOW,EAAMgE,EAAM,EAAGA,EAAM,EAAGA,EAAM,EAAGA,EAAM,EAAGud,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAC,EAC/F,MAAMH,EAAUF,EAAY7hB,EAAQ,CAAC,EAErC,GAAI,CAAC+hB,EAAS,CACV7X,EAAS,OAAOvI,CAAM,EACtB,KACJ,CACA,MAAMQ,EAAQ+e,EAASa,EAAS,OAAQ,CAAC,EACnCC,EAAWvkB,EAAM,WAAWskB,EAAQ,KAAK,EACzCI,EAAY1kB,EAAM,WAAWskB,EAAQ,IAAI,EACzC5L,EAAQ2L,EAAO,MAEjB3L,IACAxU,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOwC,EAAM,EAAGqd,EAAS,EAAG,CAAC,EACzFrgB,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOwC,EAAM,EAAGqd,EAAS,EAAG,CAAC,EACzFrgB,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOwC,EAAM,EAAGqd,EAAS,EAAG,CAAC,EACzFrgB,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOwC,EAAM,EAAGqd,EAAS,EAAG,CAAC,EACzFrgB,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAO+f,EAAO,EAAGC,EAAU,EAAG,CAAC,EAC3FxgB,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAO+f,EAAO,EAAGC,EAAU,EAAG,CAAC,EAC3FxgB,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAO+f,EAAO,EAAGC,EAAU,EAAG,CAAC,GAE/FxhB,EAAOwB,EACPwC,EAAQqd,EACRE,EAASC,EACTL,EAASC,CACb,CAEAzhB,EAAU,KAAK4J,CAAQ,CAC3B,SAAW0X,GAAgB,OAAQ,CAC/B,MAAM1X,EAAW,IAAI3E,GAAalE,EAAQA,EAAS,EAAGoD,CAAS,EAE/D,IAAIqd,EAASD,EAAY,CAAC,EACtBlhB,EAAOugB,EAASY,EAAQ,OAAQ,CAAC,EACjCnd,EAAQlH,EAAM,WAAWqkB,EAAO,KAAK,EACrCI,EAASzkB,EAAM,WAAWqkB,EAAO,IAAI,EAEzC,QAAS9hB,EAAQ,EAAG2B,EAAS,GAAK3B,IAAS,CACvCkK,EAAS,SAASlK,EAAOW,EAAMgE,EAAM,EAAGA,EAAM,EAAGA,EAAM,EAAGud,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAC,EACtF,MAAMH,EAAUF,EAAY7hB,EAAQ,CAAC,EAErC,GAAI,CAAC+hB,EAAS,CACV7X,EAAS,OAAOvI,CAAM,EACtB,KACJ,CACA,MAAMQ,EAAQ+e,EAASa,EAAS,OAAQ,CAAC,EACnCC,EAAWvkB,EAAM,WAAWskB,EAAQ,KAAK,EACzCI,EAAY1kB,EAAM,WAAWskB,EAAQ,IAAI,EACzC5L,EAAQ2L,EAAO,MAEjB3L,IACAxU,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOwC,EAAM,EAAGqd,EAAS,EAAG,CAAC,EACzFrgB,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOwC,EAAM,EAAGqd,EAAS,EAAG,CAAC,EACzFrgB,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOwC,EAAM,EAAGqd,EAAS,EAAG,CAAC,EACzFrgB,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAO+f,EAAO,EAAGC,EAAU,EAAG,CAAC,EAC3FxgB,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAO+f,EAAO,EAAGC,EAAU,EAAG,CAAC,EAC3FxgB,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAO+f,EAAO,EAAGC,EAAU,EAAG,CAAC,GAE/FxhB,EAAOwB,EACPwC,EAAQqd,EACRE,EAASC,EACTL,EAASC,CACb,CAEAzhB,EAAU,KAAK4J,CAAQ,CAC3B,CACJ,CACJ,CAIJ,GAAIwX,EAAI,MACJ,UAAWlI,KAAYkI,EAAI,MAAO,CAC9B,MAAMV,EAAUU,EAAI,MAAMlI,CAAQ,EAC5Bvb,EAAOoP,EAAa,SAASmM,CAAQ,EAE3C,GAAI,CAACvb,EAAM,MAAM,IAAI,MAAM,mBAAmBub,GAAU,EACxD,MAAM/V,EAAYxF,EAAK,MAEvB,UAAW2jB,KAAgBZ,EAAS,CAChC,MAAMa,EAAcb,EAAQY,CAAY,EAClCvgB,EAASwgB,EAAY,OAE3B,GAAIxgB,GAAU,GAEd,GAAIugB,IAAiB,SACjBthB,EAAU,KAAK6d,GAAc0D,EAAa,IAAIre,GAAenC,EAAQA,EAAQoC,CAAS,EAAG,EAAG,CAAC,CAAC,UACvFme,IAAiB,YAAa,CACrC,MAAM1X,EAAW,IAAItG,GAAkBvC,EAAQA,GAAU,EAAGoC,CAAS,EAErEnD,EAAU,KAAK+d,GAAcwD,EAAa3X,EAAU,IAAK,IAAK,EAAG4K,CAAK,CAAC,CAC3E,SAAW8M,IAAiB,aAAc,CACtC,MAAM1X,EAAW,IAAIrG,GAAmBxC,EAAQA,EAAQoC,CAAS,EAEjEnD,EAAU,KAAK6d,GAAc0D,EAAa3X,EAAU,EAAG4K,CAAK,CAAC,CACjE,SAAW8M,IAAiB,aAAc,CACtC,MAAM1X,EAAW,IAAIpG,GAAmBzC,EAAQA,EAAQoC,CAAS,EAEjEnD,EAAU,KAAK6d,GAAc0D,EAAa3X,EAAU,EAAG4K,CAAK,CAAC,CACjE,SAAW8M,IAAiB,QAAS,CACjC,MAAM1X,EAAW,IAAInG,GAAc1C,EAAQA,GAAU,EAAGoC,CAAS,EAEjEnD,EAAU,KAAK+d,GAAcwD,EAAa3X,EAAU,IAAK,IAAK,EAAG,CAAC,CAAC,CACvE,SAAW0X,IAAiB,SAAU,CAClC,MAAM1X,EAAW,IAAI/F,GAAe9C,EAAQA,EAAQoC,CAAS,EAE7DnD,EAAU,KAAK6d,GAAc0D,EAAa3X,EAAU,EAAG,CAAC,CAAC,CAC7D,SAAW0X,IAAiB,SAAU,CAClC,MAAM1X,EAAW,IAAI9F,GAAe/C,EAAQA,EAAQoC,CAAS,EAE7DnD,EAAU,KAAK6d,GAAc0D,EAAa3X,EAAU,EAAG,CAAC,CAAC,CAC7D,SAAW0X,IAAiB,QAAS,CACjC,MAAM1X,EAAW,IAAI7F,GAAchD,EAAQA,GAAU,EAAGoC,CAAS,EAEjEnD,EAAU,KAAK+d,GAAcwD,EAAa3X,EAAU,IAAK,IAAK,EAAG,CAAC,CAAC,CACvE,SAAW0X,IAAiB,SAAU,CAClC,MAAM1X,EAAW,IAAI5F,GAAejD,EAAQA,EAAQoC,CAAS,EAE7DnD,EAAU,KAAK6d,GAAc0D,EAAa3X,EAAU,EAAG,CAAC,CAAC,CAC7D,SAAW0X,IAAiB,SAAU,CAClC,MAAM1X,EAAW,IAAI3F,GAAelD,EAAQA,EAAQoC,CAAS,EAE7DnD,EAAU,KAAK6d,GAAc0D,EAAa3X,EAAU,EAAG,CAAC,CAAC,CAC7D,EACJ,CACJ,CAIJ,GAAIwX,EAAI,GACJ,UAAW9H,KAAkB8H,EAAI,GAAI,CACjC,MAAMN,EAAgBM,EAAI,GAAG9H,CAAc,EAC3C,IAAIkI,EAASV,EAAc,CAAC,EAE5B,GAAI,CAACU,EAAQ,SAEb,MAAMxa,EAAa+F,EAAa,iBAAiBuM,CAAc,EAE/D,GAAI,CAACtS,EAAY,MAAM,IAAI,MAAM,4BAA4BsS,GAAgB,EAC7E,MAAMwI,EAAkB/U,EAAa,cAAc,QAAQ/F,CAAU,EAC/D4C,EAAW,IAAInD,GAAqBqa,EAAc,OAAQA,EAAc,QAAU,EAAGgB,CAAe,EAE1G,IAAIzhB,EAAOugB,EAASY,EAAQ,OAAQ,CAAC,EACjC7a,EAAMia,EAASY,EAAQ,MAAO,CAAC,EAC/B5a,EAAWga,EAASY,EAAQ,WAAY,CAAC,EAAIhN,EAEjD,QAAS9U,EAAQ,EAAG2B,EAAS,GAAK3B,IAAS,CACvCkK,EAAS,SACLlK,EACAW,EACAsG,EACAC,EACAga,EAASY,EAAQ,eAAgB,EAAI,EAAI,EAAI,GAC7CZ,EAASY,EAAQ,WAAY,EAAK,EAClCZ,EAASY,EAAQ,UAAW,EAAK,CACrC,EACA,MAAMC,EAAUX,EAAcphB,EAAQ,CAAC,EAEvC,GAAI,CAAC+hB,EAAS,CACV7X,EAAS,OAAOvI,CAAM,EACtB,KACJ,CAEA,MAAMQ,EAAQ+e,EAASa,EAAS,OAAQ,CAAC,EACnCjD,EAAOoC,EAASa,EAAS,MAAO,CAAC,EACjChD,EAAYmC,EAASa,EAAS,WAAY,CAAC,EAAIjN,EAC/CqB,EAAQ2L,EAAO,MAEjB3L,IACAxU,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAO8E,EAAK6X,EAAM,CAAC,EAC/End,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAO+E,EAAU6X,EAAWjK,CAAK,GAGjGnU,EAAOwB,EACP8E,EAAM6X,EACN5X,EAAW6X,EACX+C,EAASC,CACb,CACAzhB,EAAU,KAAK4J,CAAQ,CAC3B,CAIJ,GAAIwX,EAAI,UACJ,UAAW9H,KAAkB8H,EAAI,UAAW,CACxC,MAAMG,EAAcH,EAAI,UAAU9H,CAAc,EAChD,IAAIkI,EAASD,EAAY,CAAC,EAE1B,GAAI,CAACC,EAAQ,SAEb,MAAMxa,EAAa+F,EAAa,wBAAwBuM,CAAc,EAEtE,GAAI,CAACtS,EAAY,MAAM,IAAI,MAAM,mCAAmCsS,GAAgB,EACpF,MAAMwI,EAAkB/U,EAAa,qBAAqB,QAAQ/F,CAAU,EACtE4C,EAAW,IAAI3C,GAA4Bsa,EAAY,OAAQA,EAAY,OAAS,EAAGO,CAAe,EAE5G,IAAIzhB,EAAOugB,EAASY,EAAQ,OAAQ,CAAC,EACjCra,EAAYyZ,EAASY,EAAQ,YAAa,CAAC,EAC3Cpa,EAAOwZ,EAASY,EAAQ,OAAQ,CAAC,EACjCna,EAAOuZ,EAASY,EAAQ,OAAQpa,CAAI,EACpCE,EAAYsZ,EAASY,EAAQ,YAAa,CAAC,EAC3Cja,EAAYqZ,EAASY,EAAQ,YAAala,CAAS,EACvD,MAAME,EAAYoZ,EAASY,EAAQ,YAAa,CAAC,EAEjD,QAAS9hB,EAAQ,EAAG2B,EAAS,GAAK3B,IAAS,CACvCkK,EAAS,SAASlK,EAAOW,EAAM8G,EAAWC,EAAMC,EAAMC,EAAWC,EAAWC,CAAS,EACrF,MAAMia,EAAUF,EAAY7hB,EAAQ,CAAC,EAErC,GAAI,CAAC+hB,EAAS,CACV7X,EAAS,OAAOvI,CAAM,EACtB,KACJ,CAEA,MAAMQ,EAAQ+e,EAASa,EAAS,OAAQ,CAAC,EACnC/C,EAAakC,EAASa,EAAS,YAAa,CAAC,EAC7C9C,EAAQiC,EAASa,EAAS,OAAQ,CAAC,EACnC7C,EAAQgC,EAASa,EAAS,OAAQ9C,CAAK,EACvCE,EAAa+B,EAASa,EAAS,YAAa,CAAC,EAC7C3C,EAAa8B,EAASa,EAAS,YAAa5C,CAAU,EACtDE,EAAa6B,EAASa,EAAS,YAAa,CAAC,EAC7C5L,EAAQ2L,EAAO,MAEjB3L,IACAxU,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOsF,EAAWuX,EAAY,CAAC,EAC3Frd,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOuF,EAAMuX,EAAO,CAAC,EACjFtd,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOwF,EAAMuX,EAAO,CAAC,EACjFvd,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOyF,EAAWuX,EAAY,CAAC,EAC3Fxd,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAO0F,EAAWuX,EAAY,CAAC,EAC3Fzd,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAO2F,EAAWuX,EAAY,CAAC,GAG/F1e,EAAOwB,EACPsF,EAAYuX,EACZtX,EAAOuX,EACPtX,EAAOuX,EACPtX,EAAYuX,EACZtX,EAAYuX,EACZxX,EAAYuX,EACZ2C,EAASC,CACb,CACAzhB,EAAU,KAAK4J,CAAQ,CAC3B,CAIJ,GAAIwX,EAAI,KACJ,UAAW9H,KAAkB8H,EAAI,KAAM,CACnC,MAAMN,EAAgBM,EAAI,KAAK9H,CAAc,EACvCtS,EAAa+F,EAAa,mBAAmBuM,CAAc,EAEjE,GAAI,CAACtS,EAAY,MAAM,IAAI,MAAM,8BAA8BsS,GAAgB,EAC/E,MAAMwI,EAAkB/U,EAAa,gBAAgB,QAAQ/F,CAAU,EAEvE,UAAWsa,KAAgBR,EAAe,CACtC,MAAMS,EAAcT,EAAcQ,CAAY,EAC9C,IAAIE,EAASD,EAAY,CAAC,EAE1B,GAAI,CAACC,EAAQ,SAEb,MAAMzgB,EAASwgB,EAAY,OAE3B,GAAID,IAAiB,WAAY,CAC7B,MAAM1X,EAAW,IAAI9B,GAA+B/G,EAAQA,EAAQ+gB,CAAe,EAEnF9hB,EAAU,KAAK6d,GAAc0D,EAAa3X,EAAU,EAAG5C,EAAW,cAAgBkN,GAAa,MAAQM,EAAQ,CAAC,CAAC,CACrH,SAAW8M,IAAiB,UAAW,CACnC,MAAM1X,EAAW,IAAI3B,GAA8BlH,EAAQA,EAAQ+gB,CAAe,EAElF9hB,EAAU,KACN6d,GAAc0D,EAAa3X,EAAU,EAAG5C,EAAW,aAAemN,EAAY,QAAUnN,EAAW,aAAemN,EAAY,MAAQK,EAAQ,CAAC,CACnJ,CACJ,SAAW8M,IAAiB,MAAO,CAC/B,MAAM1X,EAAW,IAAIzB,GAA0BpH,EAAQA,EAAS,EAAG+gB,CAAe,EAClF,IAAIzhB,EAAOugB,EAASY,EAAQ,OAAQ,CAAC,EACjCra,EAAYyZ,EAASY,EAAQ,YAAa,CAAC,EAC3Cpa,EAAOwZ,EAASY,EAAQ,OAAQ,CAAC,EACjCna,EAAOuZ,EAASY,EAAQ,OAAQpa,CAAI,EAExC,QAAS1H,EAAQ,EAAG2B,EAAS,GAAK3B,IAAS,CACvCkK,EAAS,SAASlK,EAAOW,EAAM8G,EAAWC,EAAMC,CAAI,EACpD,MAAMoa,EAAUF,EAAY7hB,EAAQ,CAAC,EAErC,GAAI,CAAC+hB,EAAS,CACV7X,EAAS,OAAOvI,CAAM,EACtB,KACJ,CACA,MAAMQ,EAAQ+e,EAASa,EAAS,OAAQ,CAAC,EACnC/C,EAAakC,EAASa,EAAS,YAAa,CAAC,EAC7C9C,EAAQiC,EAASa,EAAS,OAAQ,CAAC,EACnC7C,EAAQgC,EAASa,EAAS,OAAQ9C,CAAK,EACvC9I,EAAQ2L,EAAO,MAEjB3L,IACAxU,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOsF,EAAWuX,EAAY,CAAC,EAC3Frd,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOuF,EAAMuX,EAAO,CAAC,EACjFtd,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOwF,EAAMuX,EAAO,CAAC,GAErFve,EAAOwB,EACPsF,EAAYuX,EACZtX,EAAOuX,EACPtX,EAAOuX,EACP4C,EAASC,CACb,CACAzhB,EAAU,KAAK4J,CAAQ,CAC3B,CACJ,CACJ,CAIJ,GAAIwX,EAAI,OAAQ,CACZA,EAAI,YAAc,CAClB,EAAA,UAAWW,KAAcX,EAAI,OAAQ,CACjC,MAAMY,EAAYZ,EAAI,OAAOW,CAAU,EACjCE,EAAUb,EAAI,YAAYW,CAAU,EAAI,GAE9C,UAAW5I,KAAY6I,EAAW,CAC9B,MAAMnB,EAAUmB,EAAU7I,CAAQ,EAC5B+I,EAAWD,EAAO9I,CAAQ,EAAI,GAEpC,UAAWgJ,KAAgBtB,EACvBqB,EAAQC,CAAY,EAAI,CACpB,OAAQtB,EAAQsB,CAAY,CAChC,CAER,CACJ,CACJ,CAGA,GAAIf,EAAI,YACJ,UAAWgB,KAAmBhB,EAAI,YAAa,CAC3C,MAAMiB,EAAiBjB,EAAI,YAAYgB,CAAe,EAChD7U,EAAOR,EAAa,SAASqV,CAAe,EAElD,GAAI7U,GAAQ,KAAM,CACd,GAAIS,GAAS,0BACT,MAAM,IAAI,MAAM,mBAAmBoU,GAAiB,EAEpD,QAER,CACA,UAAWE,KAAeD,EAAgB,CACtC,MAAMxB,EAAUwB,EAAeC,CAAW,EACpCtnB,EAAO+R,EAAa,SAASuV,CAAW,EAE9C,GAAI,CAACtnB,EAAM,MAAM,IAAI,MAAM,mBAAmBsnB,GAAa,EAC3D,MAAMne,EAAYnJ,EAAK,MAEvB,UAAWunB,KAAqB1B,EAAS,CACrC,MAAM2B,EAAgB3B,EAAQ0B,CAAiB,EACzCzlB,EAA+ByQ,EAAK,cAAcpJ,EAAWoe,CAAiB,EAEpF,UAAWE,KAAmBD,EAAe,CACzC,MAAMjB,EAAciB,EAAcC,CAAe,EACjD,IAAIjB,EAASD,EAAY,CAAC,EAE1B,GAAKC,GAEL,GAAIiB,GAAmB,SAAU,CAC7B,MAAMpD,EAAWviB,EAAW,MACtBtB,EAAWsB,EAAW,SACtBwiB,EAAeD,EAAY7jB,EAAS,OAAS,EAAK,EAAIA,EAAS,OAE/DoO,EAAW,IAAIxE,GAAemc,EAAY,OAAQA,EAAY,OAAQpd,EAAWrH,CAAU,EACjG,IAAIuD,EAAOugB,EAASY,EAAQ,OAAQ,CAAC,EAErC,QAAS9hB,EAAQ,EAAG2B,EAAS,GAAK3B,IAAS,CACvC,IAAI9C,EACJ,MAAM8lB,EAA+B9B,EAASY,EAAQ,WAAY,IAAI,EAEtE,GAAI,CAACkB,EAAe9lB,EAASyiB,EAAWtiB,EAAM,cAAcuiB,CAAY,EAAI9jB,MACvE,CACDoB,EAASG,EAAM,cAAcuiB,CAAY,EACzC,MAAMpkB,EAAgB0lB,EAASY,EAAQ,SAAU,CAAC,EAGlD,GADAzkB,EAAM,UAAU2lB,EAAe,EAAG9lB,EAAQ1B,EAAOwnB,EAAc,MAAM,EACjElO,GAAS,EACT,QAASlY,EAAIpB,EAAOqB,EAAID,EAAIomB,EAAc,OAAQpmB,EAAIC,EAAGD,IAAKM,EAAON,CAAC,GAAKkY,EAE/E,GAAI,CAAC6K,EACD,QAAS/iB,EAAI,EAAGA,EAAIgjB,EAAchjB,IAAKM,EAAON,CAAC,GAAKd,EAASc,CAAC,CAEtE,CAEAsN,EAAS,SAASlK,EAAOW,EAAMzD,CAAM,EACrC,MAAM6kB,EAAUF,EAAY7hB,EAAQ,CAAC,EAErC,GAAI,CAAC+hB,EAAS,CACV7X,EAAS,OAAOvI,CAAM,EACtB,KACJ,CACA,MAAMQ,EAAQ+e,EAASa,EAAS,OAAQ,CAAC,EACnC5L,EAAQ2L,EAAO,MAEjB3L,IAAOxU,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAO,EAAG,EAAG,CAAC,GACrFxB,EAAOwB,EACP2f,EAASC,CACb,CACAzhB,EAAU,KAAK4J,CAAQ,CAC3B,SAAW6Y,GAAmB,WAAY,CACtC,MAAM7Y,EAAW,IAAIpB,GAAiB+Y,EAAY,OAAQpd,EAAWrH,CAA0C,EAC/G,IAAI6lB,EAAY,EAEhB,QAASjjB,EAAQ,EAAGA,EAAQ6hB,EAAY,OAAQ7hB,IAAS,CACrD,MAAM4I,EAAQsY,EAASY,EAAQ,QAASmB,CAAS,EAC3CtiB,EAAOugB,EAASY,EAAQ,OAAQ,CAAC,EACjCnZ,EAAOzI,GAAaghB,EAASY,EAAQ,OAAQ,MAAM,CAAC,EACpDjiB,EAAQqhB,EAASY,EAAQ,QAAS,CAAC,EAEzC5X,EAAS,SAASlK,EAAOW,EAAMgI,EAAM9I,EAAO+I,CAAK,EACjDqa,EAAYra,EACZkZ,EAASD,EAAY7hB,EAAQ,CAAC,CAClC,CACAM,EAAU,KAAK4J,CAAQ,CAC3B,EACJ,CACJ,CACJ,CACJ,CAIJ,GAAIwX,EAAI,UAAW,CACf,MAAMxX,EAAW,IAAIpD,GAAkB4a,EAAI,UAAU,MAAM,EACrD3F,EAAY1O,EAAa,MAAM,OACrC,IAAIrN,EAAQ,EAEZ,QAASpD,EAAI,EAAGA,EAAI8kB,EAAI,UAAU,OAAQ9kB,IAAKoD,IAAS,CACpD,MAAMkjB,EAAexB,EAAI,UAAU9kB,CAAC,EACpC,IAAI8J,EAAkC,KACtC,MAAMyc,EAAUjC,EAASgC,EAAc,UAAW,IAAI,EAEtD,GAAIC,EAAS,CACTzc,EAAYrJ,EAAM,SAAiB0e,EAAW,EAAE,EAChD,MAAMmE,EAAY7iB,EAAM,SAAiB0e,EAAYoH,EAAQ,OAAQ,CAAC,EACtE,IAAIhD,EAAgB,EAChBC,EAAiB,EAErB,QAASld,EAAK,EAAGA,EAAKigB,EAAQ,OAAQjgB,IAAM,CACxC,MAAMkgB,EAAYD,EAAQjgB,CAAE,EACtB5H,EAAO+R,EAAa,SAAS+V,EAAU,IAAI,EAEjD,GAAI,CAAC9nB,EAAM,MAAM,IAAI,MAAM,mBAAmBA,GAAM,EACpD,MAAMmJ,EAAYnJ,EAAK,MAGvB,KAAO6kB,GAAiB1b,GAAWyb,EAAUE,GAAgB,EAAID,IAEjEzZ,EAAUyZ,EAAgBiD,EAAU,MAAM,EAAIjD,GAClD,CAEA,KAAOA,EAAgBpE,GAAWmE,EAAUE,GAAgB,EAAID,IAEhE,QAASjd,EAAK6Y,EAAY,EAAG7Y,GAAM,EAAGA,IAAUwD,EAAUxD,CAAE,GAAK,KAAIwD,EAAUxD,CAAE,EAAIgd,EAAU,EAAEE,CAAc,EACnH,CACAlW,EAAS,SAASlK,EAAOkhB,EAASgC,EAAc,OAAQ,CAAC,EAAGxc,CAAS,CACzE,CACApG,EAAU,KAAK4J,CAAQ,CAC3B,CAGA,GAAIwX,EAAI,OAAQ,CACZ,MAAMxX,EAAW,IAAI1D,GAAckb,EAAI,OAAO,MAAM,EACpD,IAAI1hB,EAAQ,EAEZ,QAASpD,EAAI,EAAGA,EAAI8kB,EAAI,OAAO,OAAQ9kB,IAAKoD,IAAS,CACjD,MAAMwhB,EAAWE,EAAI,OAAO9kB,CAAC,EACvB0jB,EAAYjT,EAAa,UAAUmU,EAAS,IAAI,EAEtD,GAAI,CAAClB,EAAW,MAAM,IAAI,MAAM,oBAAoBkB,EAAS,MAAM,EACnE,MAAMlb,EAAQ,IAAIwK,GAAMzT,EAAM,kBAAkB6jB,EAASM,EAAU,OAAQ,CAAC,CAAC,EAAGlB,CAAS,EAEzFha,EAAM,SAAW4a,EAASM,EAAU,MAAOlB,EAAU,QAAQ,EAC7Dha,EAAM,WAAa4a,EAASM,EAAU,QAASlB,EAAU,UAAU,EACnEha,EAAM,YAAc4a,EAASM,EAAU,SAAUlB,EAAU,WAAW,EAClEha,EAAM,KAAK,YACXA,EAAM,OAAS4a,EAASM,EAAU,SAAU,CAAC,EAC7Clb,EAAM,QAAU4a,EAASM,EAAU,UAAW,CAAC,GAEnDtX,EAAS,SAASlK,EAAOsG,CAAK,CAClC,CACAhG,EAAU,KAAK4J,CAAQ,CAC3B,CAEA,IAAI3J,EAAW,EAEf,QAAS3D,EAAI,EAAGC,EAAIyD,EAAU,OAAQ1D,EAAIC,EAAGD,IAAK2D,EAAW,KAAK,IAAIA,EAAUD,EAAU1D,CAAC,EAAE,aAAa,EAC1G,GAAI,MAAM2D,CAAQ,EACd,MAAM,IAAI,MAAM,gDAAgD,EAGpE8M,EAAa,WAAW,KAAK,IAAIhN,GAAUjF,EAAMkF,EAAWC,CAAQ,CAAC,CACzE,CACA,OAAO,oBAAoBmb,EAAa,CAEpC,GADAA,EAAMA,EAAI,cACNA,GAAO,SAAU,OAAOpB,GAAY,OACxC,GAAIoB,GAAO,WAAY,OAAOpB,GAAY,IAC1C,GAAIoB,GAAO,WAAY,OAAOpB,GAAY,SAC1C,GAAIoB,GAAO,SAAU,OAAOpB,GAAY,OACxC,MAAM,IAAI,MAAM,uBAAuBoB,GAAK,CAChD,CACJ,CAEA,MAAMa,EAAW,CAOb,YAAYzC,EAAsBjM,EAAcpJ,EAAmBsJ,EAAgBwS,EAAwB,CACvG,KAAK,KAAOzG,EACZ,KAAK,KAAOjM,EACZ,KAAK,UAAYpJ,EACjB,KAAK,OAASsJ,EACd,KAAK,gBAAkBwS,CAC3B,CACJ,CAEA,SAASpC,GAAckF,EAAanZ,EAA0BoZ,EAAsBxO,EAAe,CAC/F,IAAIgN,EAASuB,EAAK,CAAC,EACf1iB,EAAOugB,EAASY,EAAQ,OAAQ,CAAC,EACjClgB,EAAQsf,EAASY,EAAQ,QAASwB,CAAY,EAAIxO,EAClDnT,EAAS,EAEb,QAAS3B,EAAQ,GAAKA,IAAS,CAC3BkK,EAAS,SAASlK,EAAOW,EAAMiB,CAAK,EACpC,MAAMmgB,EAAUsB,EAAKrjB,EAAQ,CAAC,EAE9B,GAAI,CAAC+hB,EACD,OAAA7X,EAAS,OAAOvI,CAAM,EAEfuI,EAEX,MAAM/H,EAAQ+e,EAASa,EAAS,OAAQ,CAAC,EACnC3f,EAAS8e,EAASa,EAAS,QAASuB,CAAY,EAAIxO,EAEtDgN,EAAO,QAAOngB,EAASsgB,EAAUH,EAAO,MAAO5X,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOP,EAAOQ,EAAQ0S,CAAK,GAChHnU,EAAOwB,EACPP,EAAQQ,EACR0f,EAASC,CACb,CACJ,CAEA,SAAS1D,GAAcgF,EAAanZ,EAA0BqZ,EAAeC,EAAeF,EAAsBxO,EAAe,CAC7H,IAAIgN,EAASuB,EAAK,CAAC,EACf1iB,EAAOugB,EAASY,EAAQ,OAAQ,CAAC,EACjChgB,EAASof,EAASY,EAAQyB,EAAOD,CAAY,EAAIxO,EACjD1S,EAAS8e,EAASY,EAAQ0B,EAAOF,CAAY,EAAIxO,EACjDnT,EAAS,EAEb,QAAS3B,EAAQ,GAAKA,IAAS,CAC3BkK,EAAS,SAASlK,EAAOW,EAAMmB,EAAQM,CAAM,EAC7C,MAAM2f,EAAUsB,EAAKrjB,EAAQ,CAAC,EAE9B,GAAI,CAAC+hB,EACD,OAAA7X,EAAS,OAAOvI,CAAM,EAEfuI,EAEX,MAAM/H,EAAQ+e,EAASa,EAAS,OAAQ,CAAC,EACnCvB,EAAUU,EAASa,EAASwB,EAAOD,CAAY,EAAIxO,EACnD2L,EAAUS,EAASa,EAASyB,EAAOF,CAAY,EAAIxO,EACnDqB,EAAQ2L,EAAO,MAEjB3L,IACAxU,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOL,EAAQ0e,EAAS1L,CAAK,EACzFnT,EAASsgB,EAAU9L,EAAOjM,EAAUvI,EAAQ3B,EAAO,EAAGW,EAAMwB,EAAOC,EAAQqe,EAAS3L,CAAK,GAE7FnU,EAAOwB,EACPL,EAAS0e,EACTpe,EAASqe,EACTqB,EAASC,CACb,CACJ,CAEA,SAASE,EAAU9L,EAAYjM,EAAyBvI,EAAgB3B,EAAe4B,EAAeC,EAAeM,EAAeL,EAAgBM,EAAgB0S,EAAe,CAC/K,GAAIqB,GAAS,UACT,OAAAjM,EAAS,WAAWlK,CAAK,EAElB2B,EAEX,MAAM/E,EAAIgF,GAAS,EACbG,EAAMoU,EAAMvZ,CAAC,EACboF,EAAMmU,EAAMvZ,EAAI,CAAC,EAAIkY,EACrB7S,EAAMkU,EAAMvZ,EAAI,CAAC,EACjBsF,EAAMiU,EAAMvZ,EAAI,CAAC,EAAIkY,EAE3B,OAAA5K,EAAS,UAAUvI,EAAQ3B,EAAO4B,EAAOC,EAAOC,EAAQC,EAAKC,EAAKC,EAAKC,EAAKC,EAAOC,CAAM,EAElFT,EAAS,CACpB,CAEA,SAASuf,EAASQ,EAAU+B,EAAkBH,EAAmB,CAC7D,OAAO5B,EAAI+B,CAAQ,IAAM,OAAY/B,EAAI+B,CAAQ,EAAIH,CACzD,CCxtCO,MAAMI,WAAcC,EAAsE,CAC7F,eAAeC,EAAyB,CACpC,KAAK,SAAW,IAAI7J,GAAS6J,CAAS,EACtC,KAAK,SAAS,uBACd,KAAK,UAAY,IAAIxW,GAAmBwW,CAAS,EACjD,KAAK,MAAQ,IAAIjX,GAAe,KAAK,SAAS,CAClD,CACJ"}