@applemusic-like-lyrics/core 0.1.0 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"amll-core.js","sources":["../src/bg-render/base.ts","../src/bg-render/pixi-renderer.ts","../src/bg-render/shaders/base.vert.glsl?raw","../src/bg-render/shaders/base.frag.glsl?raw","../src/bg-render/shaders/blend.frag.glsl?raw","../src/bg-render/shaders/eplor.frag.glsl?raw","../src/bg-render/shaders/noise.frag.glsl?raw","../src/assets/noise 5.png?inline","../src/bg-render/eplor-renderer.ts","../src/bg-render/index.ts","../src/utils/eq-set.ts","../src/utils/derivative.ts","../src/utils/spring.ts","../src/lyric-player/bottom-line.ts","../src/lyric-player/interlude-dots.ts","../src/utils/matrix.ts","../../../node_modules/bezier-easing/src/index.js","../src/lyric-player/lyric-line.ts","../src/lyric-player/index.ts"],"sourcesContent":["import { Disposable, HasElement } from \"../interfaces\";\n\nexport abstract class AbstractBaseRenderer implements Disposable, HasElement {\n\t/**\n\t * 修改背景的流动速度,数字越大越快,默认为 2\n\t * @param speed 背景的流动速度,默认为 2\n\t */\n\tabstract setFlowSpeed(speed: number): void;\n\t/**\n\t * 修改背景的渲染比例,默认是 0.5\n\t *\n\t * 一般情况下这个程度既没有明显瑕疵也不会特别吃性能\n\t * @param scale 背景的渲染比例\n\t */\n\tabstract setRenderScale(scale: number): void;\n\t/**\n\t * 是否启用静态模式,即图片在更换后就会保持静止状态并禁用更新,以节省性能\n\t * @param enable 是否启用静态模式\n\t */\n\tabstract setStaticMode(enable: boolean): void;\n\t/**\n\t * 修改背景动画帧率,默认是 30 FPS\n\t *\n\t * 如果设置成 0 则会停止动画\n\t * @param fps 目标帧率,默认 30 FPS\n\t */\n\tabstract setFPS(fps: number): void;\n\t/**\n\t * 暂停背景动画,画面即便是更新了图片也不会发生变化\n\t */\n\tabstract pause(): void;\n\t/**\n\t * 恢复播放背景动画\n\t */\n\tabstract resume(): void;\n\t/**\n\t * 设置背景专辑图片,图片材质加载并设置完成后会返回\n\t * @param albumUrl 图片的目标链接\n\t */\n\tabstract setAlbumImage(albumUrl: string): Promise<void>;\n\t/**\n\t * 设置低频的音量大小,范围在 80hz-120hz 之间为宜,取值范围在 [0.0-1.0] 之间\n\t *\n\t * 部分渲染器会根据音量大小调整背景效果(例如根据鼓点跳动)\n\t *\n\t * 如果无法获取到类似的数据,请传入 1.0 作为默认值,或不做任何处理(默认值即 1.0)\n\t * @param volume 低频的音量大小,范围在 50hz-120hz 之间为宜,取值范围在 [0.0-1.0] 之间\n\t */\n\tabstract setLowFreqVolume(volume: number): void;\n\t/**\n\t * 设置背景是否根据“是否有歌词”这个特征调整自身效果,例如有歌词时会变得更加活跃\n\t *\n\t * 部分渲染器会根据这个特征调整自身效果\n\t *\n\t * 如果不确定是否需要赋值或无法知晓是否包含歌词,请传入 true 或不做任何处理(默认值为 true)\n\t *\n\t * @param hasLyric 是否有歌词,如不确定是否需要赋值,请传入 true 或不做任何处理(默认值为 true)\n\t */\n\tabstract setHasLyric(hasLyric: boolean): void;\n\tabstract dispose(): void;\n\tabstract getElement(): HTMLElement;\n}\n\nexport abstract class BaseRenderer extends AbstractBaseRenderer {\n\tprivate observer: ResizeObserver;\n\tprotected flowSpeed = 2;\n\tprotected currerntRenderScale = 0.75;\n\tconstructor(protected canvas: HTMLCanvasElement) {\n\t\tsuper();\n\t\tthis.observer = new ResizeObserver(() => {\n\t\t\tconst width = Math.max(\n\t\t\t\t1,\n\t\t\t\tcanvas.clientWidth * window.devicePixelRatio * this.currerntRenderScale,\n\t\t\t);\n\t\t\tconst height = Math.max(\n\t\t\t\t1,\n\t\t\t\tcanvas.clientHeight *\n\t\t\t\t\twindow.devicePixelRatio *\n\t\t\t\t\tthis.currerntRenderScale,\n\t\t\t);\n\t\t\tthis.onResize(width, height);\n\t\t});\n\t\tthis.observer.observe(canvas);\n\t}\n\tsetRenderScale(scale: number) {\n\t\tthis.currerntRenderScale = scale;\n\t\tthis.onResize(\n\t\t\tthis.canvas.clientWidth *\n\t\t\t\twindow.devicePixelRatio *\n\t\t\t\tthis.currerntRenderScale,\n\t\t\tthis.canvas.clientHeight *\n\t\t\t\twindow.devicePixelRatio *\n\t\t\t\tthis.currerntRenderScale,\n\t\t);\n\t}\n\t/**\n\t * 当画板元素大小发生变化时此函数会被调用\n\t * 可以在此处重设和渲染器相关的尺寸设置\n\t * 考虑到初始化的时候元素不一定在文档中或出于某些特殊样式状态,尺寸长宽有可能会为 0,请注意进行特判处理\n\t * @param width 画板元素实际的物理像素宽度,有可能为 0\n\t * @param height 画板元素实际的物理像素高度,有可能为 0\n\t */\n\tprotected onResize(width: number, height: number): void {\n\t\tthis.canvas.width = width;\n\t\tthis.canvas.height = height;\n\t}\n\t/**\n\t * 修改背景的流动速度,数字越大越快,默认为 2\n\t * @param speed 背景的流动速度,默认为 2\n\t */\n\tsetFlowSpeed(speed: number) {\n\t\tthis.flowSpeed = speed;\n\t}\n\t/**\n\t * 是否启用静态模式,即图片在更换后就会保持静止状态并禁用更新,以节省性能\n\t * @param enable 是否启用静态模式\n\t */\n\tabstract setStaticMode(enable: boolean): void;\n\t/**\n\t * 修改背景动画帧率,默认是 30 FPS\n\t *\n\t * 如果设置成 0 则会停止动画\n\t * @param fps 目标帧率,默认 30 FPS\n\t */\n\tabstract setFPS(fps: number): void;\n\t/**\n\t * 暂停背景动画,画面即便是更新了图片也不会发生变化\n\t */\n\tabstract pause(): void;\n\t/**\n\t * 恢复播放背景动画\n\t */\n\tabstract resume(): void;\n\t/**\n\t * 设置背景专辑图片,图片材质加载并设置完成后会返回\n\t * @param albumUrl 图片的目标链接\n\t */\n\tabstract setAlbumImage(albumUrl: string): Promise<void>;\n\tdispose(): void {\n\t\tthis.observer.disconnect();\n\t\tthis.canvas.remove();\n\t}\n}\n","import { Container } from \"@pixi/display\";\nimport { Application } from \"@pixi/app\";\nimport { BlurFilter } from \"@pixi/filter-blur\";\nimport { ColorMatrixFilter } from \"@pixi/filter-color-matrix\";\nimport { Texture } from \"@pixi/core\";\nimport { Sprite } from \"@pixi/sprite\";\nimport { BulgePinchFilter } from \"@pixi/filter-bulge-pinch\";\nimport { BaseRenderer } from \"./base\";\n\nclass TimedContainer extends Container {\n\tpublic time = 0;\n}\n\nexport class PixiRenderer extends BaseRenderer {\n\tprivate app: Application;\n\tprivate curContainer?: TimedContainer;\n\tprivate staticMode = false;\n\tprivate lastContainer: Set<TimedContainer> = new Set();\n\tprivate onTick = (delta: number): void => {\n\t\tfor (const lastContainer of this.lastContainer) {\n\t\t\tlastContainer.alpha = Math.max(0, lastContainer.alpha - delta / 60);\n\t\t\tif (lastContainer.alpha <= 0) {\n\t\t\t\tthis.app.stage.removeChild(lastContainer);\n\t\t\t\tthis.lastContainer.delete(lastContainer);\n\t\t\t\tlastContainer.destroy(true);\n\t\t\t}\n\t\t}\n\n\t\tif (this.curContainer) {\n\t\t\tthis.curContainer.alpha = Math.min(\n\t\t\t\t1,\n\t\t\t\tthis.curContainer.alpha + delta / 60,\n\t\t\t);\n\t\t\tconst [s1, s2, s3, s4] = this.curContainer.children as Sprite[];\n\t\t\tconst maxSize = Math.max(this.app.screen.width, this.app.screen.height);\n\t\t\ts1.position.set(this.app.screen.width / 2, this.app.screen.height / 2);\n\t\t\ts2.position.set(\n\t\t\t\tthis.app.screen.width / 2.5,\n\t\t\t\tthis.app.screen.height / 2.5,\n\t\t\t);\n\t\t\ts3.position.set(this.app.screen.width / 2, this.app.screen.height / 2);\n\t\t\ts4.position.set(this.app.screen.width / 2, this.app.screen.height / 2);\n\t\t\ts1.width = maxSize * Math.sqrt(2);\n\t\t\ts1.height = s1.width;\n\t\t\ts2.width = maxSize * 0.8;\n\t\t\ts2.height = s2.width;\n\t\t\ts3.width = maxSize * 0.5;\n\t\t\ts3.height = s3.width;\n\t\t\ts4.width = maxSize * 0.25;\n\t\t\ts4.height = s4.width;\n\n\t\t\tthis.curContainer.time += delta * this.flowSpeed;\n\n\t\t\ts1.rotation += (delta / 1000) * this.flowSpeed;\n\t\t\ts2.rotation -= (delta / 500) * this.flowSpeed;\n\t\t\ts3.rotation += (delta / 1000) * this.flowSpeed;\n\t\t\ts4.rotation -= (delta / 750) * this.flowSpeed;\n\n\t\t\ts3.x =\n\t\t\t\tthis.app.screen.width / 2 +\n\t\t\t\t(this.app.screen.width / 4) *\n\t\t\t\t\tMath.cos((this.curContainer.time / 1000) * 0.75);\n\t\t\ts3.y =\n\t\t\t\tthis.app.screen.height / 2 +\n\t\t\t\t(this.app.screen.width / 4) *\n\t\t\t\t\tMath.cos((this.curContainer.time / 1000) * 0.75);\n\n\t\t\ts4.x =\n\t\t\t\tthis.app.screen.width / 2 +\n\t\t\t\t(this.app.screen.width / 4) * 0.1 +\n\t\t\t\tMath.cos(this.curContainer.time * 0.006 * 0.75);\n\t\t\ts4.y =\n\t\t\t\tthis.app.screen.height / 2 +\n\t\t\t\t(this.app.screen.width / 4) * 0.1 +\n\t\t\t\tMath.cos(this.curContainer.time * 0.006 * 0.75);\n\n\t\t\tif (\n\t\t\t\tthis.curContainer.alpha >= 1 &&\n\t\t\t\tthis.lastContainer.size === 0 &&\n\t\t\t\tthis.staticMode\n\t\t\t) {\n\t\t\t\tthis.app.ticker.stop();\n\t\t\t}\n\t\t}\n\t};\n\tconstructor(protected canvas: HTMLCanvasElement) {\n\t\tsuper(canvas);\n\t\tthis.app = new Application({\n\t\t\tview: canvas,\n\t\t\tresizeTo: this.canvas,\n\t\t\tpowerPreference: \"low-power\",\n\t\t\tbackgroundAlpha: 1,\n\t\t});\n\t\tthis.rebuildFilters();\n\t\tthis.app.ticker.maxFPS = 30;\n\t\tthis.app.ticker.add(this.onTick);\n\t\tthis.app.ticker.start();\n\t}\n\n\tprotected override onResize(width: number, height: number): void {\n\t\tsuper.onResize(width, height);\n\t\tthis.app.resize();\n\t\tthis.rebuildFilters();\n\t}\n\n\toverride setRenderScale(scale: number) {\n\t\tsuper.setRenderScale(scale);\n\t\tthis.rebuildFilters();\n\t}\n\tprivate rebuildFilters() {\n\t\tconst minBorder = Math.min(this.canvas.width, this.canvas.height);\n\t\tconst maxBorder = Math.max(this.canvas.width, this.canvas.height);\n\t\tconst c0 = new ColorMatrixFilter();\n\t\tc0.saturate(1.2, false);\n\t\tconst c1 = new ColorMatrixFilter();\n\t\tc1.brightness(0.6, false);\n\t\tconst c2 = new ColorMatrixFilter();\n\t\tc2.contrast(0.3, true);\n\t\tthis.app.stage.filters?.forEach((filter) => {\n\t\t\tfilter.destroy();\n\t\t});\n\t\tthis.app.stage.filters = [];\n\t\tthis.app.stage.filters.push(new BlurFilter(5, 1));\n\t\tthis.app.stage.filters.push(new BlurFilter(10, 1));\n\t\tthis.app.stage.filters.push(new BlurFilter(20, 2));\n\t\tthis.app.stage.filters.push(new BlurFilter(40, 2));\n\t\tthis.app.stage.filters.push(new BlurFilter(80, 2));\n\t\tif (minBorder > 768) this.app.stage.filters.push(new BlurFilter(160, 4));\n\t\tif (minBorder > 768 * 2)\n\t\t\tthis.app.stage.filters.push(new BlurFilter(320, 4));\n\n\t\tthis.app.stage.filters.push(c0, c1, c2);\n\t\tthis.app.stage.filters.push(new BlurFilter(5, 1));\n\t\tif (Math.random() > 0.5) {\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.25, 1],\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.75, 0],\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.75, 1],\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.25, 0],\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\toverride setStaticMode(enable = false) {\n\t\tthis.staticMode = enable;\n\t\tthis.app.ticker.start();\n\t}\n\n\toverride setFPS(fps: number) {\n\t\tthis.app.ticker.maxFPS = fps;\n\t}\n\n\toverride pause() {\n\t\tthis.app.ticker.stop();\n\t\tthis.app.render();\n\t}\n\n\toverride resume() {\n\t\tthis.app.ticker.start();\n\t}\n\n\toverride setLowFreqVolume(_volume: number): void {\n\t\t// NOOP\n\t}\n\n\toverride setHasLyric(_hasLyric: boolean): void {\n\t\t// NOOP\n\t}\n\n\toverride async setAlbumImage(albumUrl: string) {\n\t\tif (albumUrl.trim().length === 0) return;\n\t\tconst img = new Image();\n\t\timg.src = albumUrl;\n\t\timg.crossOrigin = \"anonymous\";\n\t\tlet remainRetryTimes = 5;\n\t\tlet tex;\n\t\twhile (!tex?.baseTexture?.resource?.valid && remainRetryTimes > 0) {\n\t\t\ttry {\n\t\t\t\tawait img.decode();\n\t\t\t\ttex = Texture.from(img, {\n\t\t\t\t\tresourceOptions: {\n\t\t\t\t\t\tautoLoad: false,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tawait tex.baseTexture.resource.load();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`failed on loading album image, retrying (${remainRetryTimes})`,\n\t\t\t\t\talbumUrl,\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t\ttex = undefined;\n\t\t\t\tremainRetryTimes--;\n\t\t\t}\n\t\t}\n\t\tif (!tex) return;\n\t\tconst container = new TimedContainer();\n\t\tconst s1 = new Sprite(tex);\n\t\tconst s2 = new Sprite(tex);\n\t\tconst s3 = new Sprite(tex);\n\t\tconst s4 = new Sprite(tex);\n\t\ts1.anchor.set(0.5, 0.5);\n\t\ts2.anchor.set(0.5, 0.5);\n\t\ts3.anchor.set(0.5, 0.5);\n\t\ts4.anchor.set(0.5, 0.5);\n\t\ts1.rotation = Math.random() * Math.PI * 2;\n\t\ts2.rotation = Math.random() * Math.PI * 2;\n\t\ts3.rotation = Math.random() * Math.PI * 2;\n\t\ts4.rotation = Math.random() * Math.PI * 2;\n\t\tcontainer.addChild(s1, s2, s3, s4);\n\t\tif (this.curContainer) this.lastContainer.add(this.curContainer);\n\t\tthis.curContainer = container;\n\t\tthis.app.stage.addChild(container);\n\t\tthis.curContainer.alpha = 0;\n\t\tthis.app.ticker.start();\n\t}\n\n\toverride dispose() {\n\t\tsuper.dispose();\n\t\tthis.app.ticker.remove(this.onTick);\n\t\tthis.app.destroy(true);\n\t}\n\n\toverride getElement(): HTMLElement {\n\t\treturn this.canvas;\n\t}\n}\n","export default \"#version 300 es\\nprecision highp float;\\n\\nin vec2 v_coord;\\nout vec2 f_v_coord;\\n\\nvoid main() {\\n gl_Position = vec4(v_coord, 0.0f, 1.0f);\\n f_v_coord = (vec2(v_coord.x, v_coord.y) + vec2(1.0f, 1.0f)) / 2.0f;\\n}\\n\"","export default \"#version 300 es\\nprecision highp float;\\n\\nuniform sampler2D src;\\nin vec2 f_v_coord;\\nout vec4 fragColor;\\n\\nvoid main() {\\n vec2 coord = f_v_coord;\\n fragColor = texture(src, coord);\\n}\\n\"","export default \"#version 300 es\\nprecision highp float;\\n\\nuniform sampler2D src;\\nuniform float lerp;\\nuniform float scale;\\nin vec2 f_v_coord;\\nout vec4 fragColor;\\n\\nvoid main() {\\n vec2 tex_coord = f_v_coord;\\n if(scale < 1.0f) {\\n tex_coord /= scale;\\n }\\n vec4 srcColor = texture(src, tex_coord);\\n fragColor = mix(vec4(srcColor.xyz, 0.0f), srcColor, lerp);\\n}\\n\"","export default \"#version 300 es\\nprecision highp float;uniform float IIIlllllllIIIllIl,lIIIlllllIllIl,IIIlllIlIIllll;uniform sampler2D IlllIIlIlllIll;uniform vec2 IIlIlIIlIlIllI,IllIlllIlIIlllI;out vec4 lIIlIIIIIlIlIlllIIIIlIIl;float lIlIIllllIllIll(float IIIlIIlIIIlllIII){IIIlIIlIIIlllIII-=0.;return sin(IIIlIIlIIIlllIII);}float lIlIlllllIllIll(float IIIlIIlIIIlllIII){IIIlIIlIIIlllIII+=acos(0.);return sin(IIIlIIlIIIlllIII);}mat2 lIIllIIlIIIllIl(float IIIlIIlIIIlllIII){return mat2(lIlIlllllIllIll(IIIlIIlIIIlllIII),-lIlIIllllIllIll(IIIlIIlIIIlllIII),lIlIIllllIllIll(IIIlIIlIIIlllIII),lIlIlllllIllIll(IIIlIIlIIIlllIII));}mat2 lIIllIIlIIIlllI(float IIIlIIlIIIlllIII){return mat2(lIlIIllllIllIll(IIIlIIlIIIlllIII),-lIlIlllllIllIll(IIIlIIlIIIlllIII),lIlIlllllIllIll(IIIlIIlIIIlllIII),lIlIIllllIllIll(IIIlIIlIIIlllIII));}float IllllIIlIllII(float llIIllIllIIIllI){return fract(lIlIIllllIllIll(llIIllIllIIIllI)*43758.5453);}float llIlIIllllIII(vec2 IIIlIIlIIIlllIII){vec2 IIllIlIIlllI=floor(IIIlIIlIIIlllIII),lIlIllIIIIIlIl=fract(IIIlIIlIIIlllIII);lIlIllIIIIIlIl=lIlIllIIIIIlIl*lIlIllIIIIIlIl*(3.-2.*lIlIllIIIIIlIl);float lIlIlIlIlIlIIl=IIllIlIIlllI.x+IIllIlIIlllI.y*57.;return mix(mix(IllllIIlIllII(lIlIlIlIlIlIIl),IllllIIlIllII(lIlIlIlIlIlIIl+1.),lIlIllIIIIIlIl.x),mix(IllllIIlIllII(lIlIlIlIlIlIIl+57.),IllllIIlIllII(lIlIlIlIlIlIIl+58.),lIlIllIIIIIlIl.x),lIlIllIIIIIlIl.y);}vec2 lllIIIIIIllIlIIIlI(vec2 IlllIIlIIIIlIIII,float lIIIIlllIIIIllIlIlI,vec2 IlIlIIIIlIlllIlIII){float lIIlIllIIIlIl=llIlIIllllIII(IlllIIlIIIIlIIII*vec2(1)*3.5+.1)*4.2831*mix(.2,1.,IIIlllllllIIIllIl);IlllIIlIIIIlIIII+=vec2(-1,.5);lIIlIllIIIlIl-=lIIIIlllIIIIllIlIlI;return vec2(lIlIlllllIllIll(lIIlIllIIIlIl),lIlIIllllIllIll(lIIlIllIIIlIl));}const mat3 lIIllIIIlllIl=mat3(1.,.02,.002,.02,1.,.008,.002,.02,1.),lIIIlllIIIIll=mat3(1.022,-.02,-.002,-.02,1.028,-.008,-.002,-.02,1.022);void main(){vec2 lIIIlIIllIlIIlI=lIlIIllllIllIll(lIIIlllllIllIl*.2)*.01+.5+gl_FragCoord.xy/IIlIlIIlIlIllI.xy,lIIllIIlIIIllI=lIIIlIIllIlIIlI*.77f+IllIlllIlIIlllI;lIIllIIlIIIllI.x*=IIlIlIIlIlIllI.x/IIlIlIIlIlIllI.y;float lIIlIIlIIlIIIlII=gl_FragCoord.x/max(IIlIlIIlIlIllI.x,IIlIlIIlIlIllI.y),lIIIlIllIllIlIIl=0.f;vec3 lIIIlIlIIIlIlIIl=vec3(0);vec2 lIlIIlIlIIIllIll=lIIllIIlIIIllI;for(int IllIlIIlIIlllllIIIl=0;IllIlIIlIIlllllIIIl<8;IllIlIIlIIlllllIIIl++){bool lIlIlIIllIllIIll=IllIlIIlIIlllllIIIl%2==0;vec2 lIlllIlllIlllII=lllIIIIIIllIlIIIlI(lIIllIIlIIIllI,lIIlIIlIIlIIIlII,lIIIlIIllIlIIlI),lIllIIlIIlIIIll=lIlllIlllIlllII;float lIIlIlIIlIIlIllI=float(IllIlIIlIIlllllIIIl)/8.f;vec3 llIIlIIIIlIIlIII=texture(IlllIIlIlllIll,-lIIIlllllIllIl*.01+.8*lIIllIIlIIIllI*lIIllIIlIIIllIl(-lIIIlllllIllIl*.2)+vec2(IIIlllIlIIllll*.3*(float(lIlIlIIllIllIIll)*2.-1.)*lIIllIIlIIIlllI(lIIIlllllIllIl*.2+1.5))).xyz;lIIIlIlIIIlIlIIl+=llIIlIIIIlIIlIII;lIIIlIllIllIlIIl+=4.f*lIIlIlIIlIIlIllI*(1.f-lIIlIlIIlIIlIllI);lIIllIIlIIIllI+=.01f*lIllIIlIIlIIIll*(lIlIIllllIllIll(lIIIlllllIllIl)*4.8+.8);lIlIIlIlIIIllIll+=.05f*lIllIIlIIlIIIll;}lIIIlIlIIIlIlIIl/=lIIIlIllIllIlIIl;lIIIlIlIIIlIlIIl*=1.6f;lIIIlIlIIIlIlIIl=1.f-exp(-lIIIlIlIIIlIlIIl);lIIIlIlIIIlIlIIl=pow(lIIIlIlIIIlIlIIl,vec3(2.2));lIIIlIlIIIlIlIIl*=.8f;lIIlIIIIIlIlIlllIIIIlIIl=vec4(lIIIlIlIIIlIlIIl,1);}\"","export default \"#version 300 es\\nprecision highp float;\\n\\nuniform sampler2D src;\\nin vec2 f_v_coord;\\nout vec4 fragColor;\\n\\n/* Gradient noise from Jorge Jimenez's presentation: */\\n/* http://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare */\\nfloat gradientNoise(in vec2 uv) {\\n return fract(52.9829189f * fract(dot(uv, vec2(0.06711056f, 0.00583715f))));\\n}\\n\\nvoid main() {\\n vec2 tex_coord = f_v_coord;\\n float dither = (1.0f / 255.0f) * gradientNoise(gl_FragCoord.xy) - (0.5f / 255.0f);\\n vec4 color = texture(src, tex_coord);\\n color += dither;\\n fragColor = color;\\n}\\n\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAYUklEQVR4nH3bV89VVRcF4IX7qNgVe8WKvaIiNsCuYCKCSEg0JCYm/gTjzf4R3njhlRdeWKKi2AvYEBV7b1ixY2+ofPuZcbwxXzie5OQ9Z5+11pxzjDHnKnu/k0477bSN+++/fzvyyCPbdttt17766qu2YcOG9ttvv7U33nijffHFF23atGntgAMOaN98803bc88926RJk9pnn31W10855ZT2888/1/vrr79ur732Wjv00EPbgQce2NavX99eeOGF+nvmmWfWuD4fc8wx1ffDDz9sTz31VPv000/bRx99VL/vsssu7eCDDy57hxxySPv222/L1saNG9vatWsbX19++eXyhb9//PFH23HHHdsHH3zQLrrooorjxRdfrPbG+/jjj9u6devaX3/91aZMmdImT57cdt1114lYu5133rnfeuut28yZM9t+++3XVq9e3T7//PMa9Ljjjqu/m222WTn73HPPtR122KF99913bcsttyyQnnzyybbbbrvVm4MMAe37778vUATIkaOPPrqCe+KJJ9qPP/7Ydt9993bvvfe2lStXtvfee69ttdVW7bzzzmvbbLNN++STT9rUqVPL7jvvvNP+/PPP8o1NNn7//fcakx3XL7300moPyC222KL8ev/99ws8Y2s3xFmAIpD9H374of36669txBEIvf3224UmR1w74YQTyhlgHHTQQeU845Bfs2ZN23fffcsQRn/55Zf6jQJOP/30GvjLL78sMPbee+8y6rM2gvPea6+9yg7Htt1223bSSSe1nXbaqWwC+K677iq2qMU1yqKK0WhUAWGREruuq3GBw8dVq1ZV4Pvss08744wzSgns/fTTT+UzoigIAL53gyM95P7+++9Cj1OQz+ACwb7PHAGA3133phKyY/TVV1+t3zHEAUa8t99++1IDJwAsKFIWkFQQOFaeffbZ9u6775aTgBXskKIVhDEBSxFJCaznOoCpNdJHGlvGNRa5s8N3PiLg5JNPbt1goNfIYKeeemo74ogjKmC5yxlIY/D5559v999/f8nxrLPOqsCBwknIkxcmpISXYFesWFGqIlNKck3bGTNmFNDyltPaUBXnsMWGfKZCeQto/QQqmOnTpxegvvNVH4G7Jg4AG4P8qVM6jCN5JDc5QYZyHHrynFGd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\"","import { Disposable } from \"../interfaces\";\nimport { BaseRenderer } from \"./base\";\nimport vertShader from \"./shaders/base.vert.glsl?raw\";\nimport fragShader from \"./shaders/base.frag.glsl?raw\";\nimport blendShader from \"./shaders/blend.frag.glsl?raw\";\nimport eplorShader from \"./shaders/eplor.frag.glsl?raw\";\nimport noiseShader from \"./shaders/noise.frag.glsl?raw\";\nimport noiseImage from \"../assets/noise 5.png?inline\";\n\nconst NOISE_IMAGE_DATA = (() => {\n\tconst img = document.createElement(\"img\");\n\timg.src = noiseImage;\n\treturn img;\n})();\n\nfunction blurImage(imageData: ImageData, radius: number, quality: number) {\n\tconst pixels = imageData.data;\n\tconst width = imageData.width;\n\tconst height = imageData.height;\n\n\tlet rsum: number;\n\tlet gsum: number;\n\tlet bsum: number;\n\tlet asum: number;\n\tlet x: number;\n\tlet y: number;\n\tlet i: number;\n\tlet p: number;\n\tlet p1: number;\n\tlet p2: number;\n\tlet yp: number;\n\tlet yi: number;\n\tlet yw: number;\n\tconst wm = width - 1;\n\tconst hm = height - 1;\n\tconst rad1x = radius + 1;\n\tconst divx = radius + rad1x;\n\tconst rad1y = radius + 1;\n\tconst divy = radius + rad1y;\n\tconst div2 = 1 / (divx * divy);\n\n\tconst r: number[] = [];\n\tconst g: number[] = [];\n\tconst b: number[] = [];\n\tconst a: number[] = [];\n\n\tconst vmin: number[] = [];\n\tconst vmax: number[] = [];\n\n\twhile (quality-- > 0) {\n\t\tyw = yi = 0;\n\n\t\tfor (y = 0; y < height; y++) {\n\t\t\trsum = pixels[yw] * rad1x;\n\t\t\tgsum = pixels[yw + 1] * rad1x;\n\t\t\tbsum = pixels[yw + 2] * rad1x;\n\t\t\tasum = pixels[yw + 3] * rad1x;\n\n\t\t\tfor (i = 1; i <= radius; i++) {\n\t\t\t\tp = yw + ((i > wm ? wm : i) << 2);\n\t\t\t\trsum += pixels[p++];\n\t\t\t\tgsum += pixels[p++];\n\t\t\t\tbsum += pixels[p++];\n\t\t\t\tasum += pixels[p];\n\t\t\t}\n\n\t\t\tfor (x = 0; x < width; x++) {\n\t\t\t\tr[yi] = rsum;\n\t\t\t\tg[yi] = gsum;\n\t\t\t\tb[yi] = bsum;\n\t\t\t\ta[yi] = asum;\n\n\t\t\t\tif (y === 0) {\n\t\t\t\t\tvmin[x] = Math.min(x + rad1x, wm) << 2;\n\t\t\t\t\tvmax[x] = Math.max(x - radius, 0) << 2;\n\t\t\t\t}\n\n\t\t\t\tp1 = yw + vmin[x];\n\t\t\t\tp2 = yw + vmax[x];\n\n\t\t\t\trsum += pixels[p1++] - pixels[p2++];\n\t\t\t\tgsum += pixels[p1++] - pixels[p2++];\n\t\t\t\tbsum += pixels[p1++] - pixels[p2++];\n\t\t\t\tasum += pixels[p1] - pixels[p2];\n\n\t\t\t\tyi++;\n\t\t\t}\n\t\t\tyw += width << 2;\n\t\t}\n\n\t\tfor (x = 0; x < width; x++) {\n\t\t\typ = x;\n\t\t\trsum = r[yp] * rad1y;\n\t\t\tgsum = g[yp] * rad1y;\n\t\t\tbsum = b[yp] * rad1y;\n\t\t\tasum = a[yp] * rad1y;\n\n\t\t\tfor (i = 1; i <= radius; i++) {\n\t\t\t\typ += i > hm ? 0 : width;\n\t\t\t\trsum += r[yp];\n\t\t\t\tgsum += g[yp];\n\t\t\t\tbsum += b[yp];\n\t\t\t\tasum += a[yp];\n\t\t\t}\n\n\t\t\tyi = x << 2;\n\t\t\tfor (y = 0; y < height; y++) {\n\t\t\t\tpixels[yi] = (rsum * div2 + 0.5) | 0;\n\t\t\t\tpixels[yi + 1] = (gsum * div2 + 0.5) | 0;\n\t\t\t\tpixels[yi + 2] = (bsum * div2 + 0.5) | 0;\n\t\t\t\tpixels[yi + 3] = (asum * div2 + 0.5) | 0;\n\n\t\t\t\tif (x === 0) {\n\t\t\t\t\tvmin[y] = Math.min(y + rad1y, hm) * width;\n\t\t\t\t\tvmax[y] = Math.max(y - radius, 0) * width;\n\t\t\t\t}\n\n\t\t\t\tp1 = x + vmin[y];\n\t\t\t\tp2 = x + vmax[y];\n\n\t\t\t\trsum += r[p1] - r[p2];\n\t\t\t\tgsum += g[p1] - g[p2];\n\t\t\t\tbsum += b[p1] - b[p2];\n\t\t\t\tasum += a[p1] - a[p2];\n\n\t\t\t\tyi += width << 2;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction saturateImage(imageData: ImageData, saturation: number) {\n\tconst pixels = imageData.data;\n\n\tfor (let i = 0; i < pixels.length; i += 4) {\n\t\tconst r = pixels[i];\n\t\tconst g = pixels[i + 1];\n\t\tconst b = pixels[i + 2];\n\t\tconst a = pixels[i + 3];\n\t\tconst gray = r * 0.3 + g * 0.59 + b * 0.11;\n\t\tpixels[i] = gray * (1 - saturation) + r * saturation;\n\t\tpixels[i + 1] = gray * (1 - saturation) + g * saturation;\n\t\tpixels[i + 2] = gray * (1 - saturation) + b * saturation;\n\t\tpixels[i + 3] = a;\n\t}\n}\n\nfunction brightnessImage(imageData: ImageData, brightness: number) {\n\tconst pixels = imageData.data;\n\n\tfor (let i = 0; i < pixels.length; i += 4) {\n\t\tconst r = pixels[i];\n\t\tconst g = pixels[i + 1];\n\t\tconst b = pixels[i + 2];\n\t\tconst a = pixels[i + 3];\n\t\tpixels[i] = r * brightness;\n\t\tpixels[i + 1] = g * brightness;\n\t\tpixels[i + 2] = b * brightness;\n\t\tpixels[i + 3] = a;\n\t}\n}\n\nfunction contrastImage(imageData: ImageData, contrast: number) {\n\tconst pixels = imageData.data;\n\n\tfor (let i = 0; i < pixels.length; i += 4) {\n\t\tconst r = pixels[i];\n\t\tconst g = pixels[i + 1];\n\t\tconst b = pixels[i + 2];\n\t\tconst a = pixels[i + 3];\n\t\tpixels[i] = (r - 128) * contrast + 128;\n\t\tpixels[i + 1] = (g - 128) * contrast + 128;\n\t\tpixels[i + 2] = (b - 128) * contrast + 128;\n\t\tpixels[i + 3] = a;\n\t}\n}\n\nclass GLProgram implements Disposable {\n\tprivate gl: WebGL2RenderingContext;\n\tprogram: WebGLProgram;\n\tprivate vertexShader: WebGLShader;\n\tprivate fragmentShader: WebGLShader;\n\tprivate coordPos: number;\n\tconstructor(\n\t\tgl: WebGL2RenderingContext,\n\t\tvertexShaderSource: string,\n\t\tfragmentShaderSource: string,\n\t\tprivate readonly label = \"unknown\",\n\t) {\n\t\tthis.gl = gl;\n\t\tthis.vertexShader = this.createShader(gl.VERTEX_SHADER, vertexShaderSource);\n\t\tthis.fragmentShader = this.createShader(\n\t\t\tgl.FRAGMENT_SHADER,\n\t\t\tfragmentShaderSource,\n\t\t);\n\t\tthis.program = this.createProgram();\n\n\t\tconst coordPos = gl.getAttribLocation(this.program, \"v_coord\");\n\t\tif (coordPos === -1)\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to get attribute location v_coord for \"${this.label}\"`,\n\t\t\t);\n\t\tthis.coordPos = coordPos;\n\t}\n\tprivate createShader(type: number, source: string) {\n\t\tconst gl = this.gl;\n\t\tconst shader = gl.createShader(type);\n\t\tif (!shader) throw new Error(\"Failed to create shader\");\n\t\tgl.shaderSource(shader, source);\n\t\tgl.compileShader(shader);\n\t\tif (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to compile shader for type ${type} \"${\n\t\t\t\t\tthis.label\n\t\t\t\t}\": ${gl.getShaderInfoLog(shader)}`,\n\t\t\t);\n\t\t}\n\t\treturn shader;\n\t}\n\tprivate createProgram() {\n\t\tconst gl = this.gl;\n\t\tconst program = gl.createProgram();\n\t\tif (!program) throw new Error(\"Failed to create program\");\n\t\tgl.attachShader(program, this.vertexShader);\n\t\tgl.attachShader(program, this.fragmentShader);\n\t\tgl.linkProgram(program);\n\t\tgl.validateProgram(program);\n\t\tif (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n\t\t\tconst errLog = gl.getProgramInfoLog(program);\n\t\t\tgl.deleteProgram(program);\n\t\t\tthrow new Error(`Failed to link program \"${this.label}\": ${errLog}`);\n\t\t}\n\t\treturn program;\n\t}\n\tuse() {\n\t\tconst gl = this.gl;\n\t\tgl.useProgram(this.program);\n\t\tgl.vertexAttribPointer(this.coordPos, 2, gl.FLOAT, false, 0, 0);\n\t\tgl.enableVertexAttribArray(this.coordPos);\n\t}\n\tprivate notFoundUniforms: Set<string> = new Set();\n\tprivate warnUniformNotFound(name: string) {\n\t\tif (this.notFoundUniforms.has(name)) return;\n\t\tthis.notFoundUniforms.add(name);\n\t\tconsole.warn(\n\t\t\t`Failed to get uniform location for program \"${this.label}\": ${name}`,\n\t\t);\n\t}\n\tsetUniform1f(name: string, value: number) {\n\t\tconst gl = this.gl;\n\t\tconst location = gl.getUniformLocation(this.program, name);\n\t\tif (!location) this.warnUniformNotFound(name);\n\t\telse gl.uniform1f(location, value);\n\t}\n\tsetUniform2f(name: string, value1: number, value2: number) {\n\t\tconst gl = this.gl;\n\t\tconst location = gl.getUniformLocation(this.program, name);\n\t\tif (!location) this.warnUniformNotFound(name);\n\t\telse gl.uniform2f(location, value1, value2);\n\t}\n\tsetUniform1i(name: string, value: number) {\n\t\tconst gl = this.gl;\n\t\tconst location = gl.getUniformLocation(this.program, name);\n\t\tif (!location) this.warnUniformNotFound(name);\n\t\telse gl.uniform1i(location, value);\n\t}\n\tdispose() {\n\t\tconst gl = this.gl;\n\t\tgl.deleteShader(this.vertexShader);\n\t\tgl.deleteShader(this.fragmentShader);\n\t\tgl.deleteProgram(this.program);\n\t}\n}\n\nclass Framebuffer implements Disposable {\n\tprivate fb: WebGLFramebuffer;\n\tprivate tex: WebGLTexture;\n\tprivate _size: [number, number];\n\tget size() {\n\t\treturn this._size;\n\t}\n\tconstructor(\n\t\tprivate gl: WebGL2RenderingContext,\n\t\twidth: number,\n\t\theight: number,\n\t) {\n\t\tthis._size = [width, height];\n\t\tconst fb = gl.createFramebuffer();\n\t\tif (!fb) throw new Error(\"Can't create framebuffer\");\n\t\tconst tex = gl.createTexture();\n\t\tif (!tex) throw new Error(\"Failed to create texture\");\n\t\tthis.fb = fb;\n\t\tthis.tex = tex;\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, fb);\n\t\tgl.bindTexture(gl.TEXTURE_2D, tex);\n\t\tgl.framebufferTexture2D(\n\t\t\tgl.FRAMEBUFFER,\n\t\t\tgl.COLOR_ATTACHMENT0,\n\t\t\tgl.TEXTURE_2D,\n\t\t\ttex,\n\t\t\t0,\n\t\t);\n\t\tthis.resize(width, height);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n\t}\n\tresize(width: number, height: number) {\n\t\tconst gl = this.gl;\n\t\tthis.bind();\n\t\tgl.bindTexture(gl.TEXTURE_2D, this.tex);\n\t\tif (gl.getExtension(\"EXT_color_buffer_float\")) {\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA32F,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.FLOAT,\n\t\t\t\tnull,\n\t\t\t);\n\t\t} else {\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.UNSIGNED_BYTE,\n\t\t\t\tnull,\n\t\t\t);\n\t\t}\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n\t}\n\tbind() {\n\t\tconst gl = this.gl;\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, this.fb);\n\t}\n\tactive(texture: number = this.gl.TEXTURE0) {\n\t\tthis.gl.activeTexture(texture);\n\t\tthis.gl.bindTexture(this.gl.TEXTURE_2D, this.tex);\n\t}\n\tdispose(): void {\n\t\tthis.gl.deleteFramebuffer(this.fb);\n\t\tthis.gl.deleteTexture(this.tex);\n\t}\n}\n\nclass GLBuffer implements Disposable {\n\tprivate gl: WebGL2RenderingContext;\n\tprivate buffer: WebGLBuffer;\n\tprivate type: number;\n\tprivate data: ArrayBufferView;\n\tprivate usage: number;\n\tprivate length: number;\n\tconstructor(\n\t\tgl: WebGL2RenderingContext,\n\t\ttype: number,\n\t\tdata: ArrayBufferView,\n\t\tusage: number,\n\t) {\n\t\tthis.gl = gl;\n\t\tthis.type = type;\n\t\tthis.data = data;\n\t\tthis.usage = usage;\n\t\tconst buffer = gl.createBuffer();\n\t\tif (!buffer) throw new Error(\"Failed to create buffer\");\n\t\tthis.buffer = buffer;\n\t\tthis.length = data.byteLength;\n\t\tgl.bindBuffer(type, this.buffer);\n\t\tgl.bufferData(type, data, usage);\n\t}\n\tbind() {\n\t\tconst gl = this.gl;\n\t\tgl.bindBuffer(this.type, this.buffer);\n\t}\n\t// update(data: ArrayBufferView) {\n\t// const gl = this.gl;\n\t// gl.bindBuffer(this.type, this.buffer);\n\t// gl.bufferSubData(this.type, 0, data);\n\t// this.data = data;\n\t// }\n\tdispose() {\n\t\tconst gl = this.gl;\n\t\tgl.deleteBuffer(this.buffer);\n\t}\n}\n\nclass AlbumTexture implements Disposable {\n\tprivate albumTexture: WebGLTexture;\n\talpha = 0;\n\n\tconstructor(\n\t\tprivate gl: WebGL2RenderingContext,\n\t\tprivate mainProgram: GLProgram,\n\t\tprivate vertexBuffer: GLBuffer,\n\t\tprivate indexBuffer: GLBuffer,\n\t\talbumImageData: ImageData,\n\t) {\n\t\tconst albumTexture = gl.createTexture();\n\t\tif (!albumTexture) throw new Error(\"Failed to create texture\");\n\t\tthis.albumTexture = albumTexture;\n\t\tgl.bindTexture(gl.TEXTURE_2D, albumTexture);\n\t\tgl.texImage2D(\n\t\t\tgl.TEXTURE_2D,\n\t\t\t0,\n\t\t\tgl.RGBA,\n\t\t\tgl.RGBA,\n\t\t\tgl.UNSIGNED_BYTE,\n\t\t\talbumImageData,\n\t\t);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n\t}\n\n\tdraw(sampler: string) {\n\t\tconst gl = this.gl;\n\t\tthis.mainProgram.use();\n\t\tgl.activeTexture(gl.TEXTURE0);\n\t\tgl.bindTexture(gl.TEXTURE_2D, this.albumTexture);\n\t\tthis.mainProgram.setUniform1i(sampler, 0);\n\t\tgl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n\t}\n\n\tdispose(): void {\n\t\tthis.gl.deleteTexture(this.albumTexture);\n\t}\n}\n\nclass NoiseTexture implements Disposable {\n\tprivate tex: WebGLTexture;\n\talpha = 0;\n\n\tconstructor(private gl: WebGL2RenderingContext) {\n\t\tconst tex = gl.createTexture();\n\t\tif (!tex) throw new Error(\"Failed to create texture\");\n\t\tthis.tex = tex;\n\t\tNOISE_IMAGE_DATA.decode().then(() => {\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, tex);\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.UNSIGNED_BYTE,\n\t\t\t\tNOISE_IMAGE_DATA,\n\t\t\t);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n\t\t});\n\t}\n\n\tactive(texture: number = this.gl.TEXTURE1) {\n\t\tthis.gl.activeTexture(texture);\n\t\tthis.gl.bindTexture(this.gl.TEXTURE_2D, this.tex);\n\t}\n\n\tdispose(): void {\n\t\tthis.gl.deleteTexture(this.tex);\n\t}\n}\n\nexport class EplorRenderer extends BaseRenderer {\n\tprivate hasLyric = true;\n\tprivate hasLyricValue = 1;\n\tprivate maxFPS = 30;\n\tprivate lastTickTime = 0;\n\tprivate lastFrameTime = 0;\n\tprivate _lowFreqVolume = 1;\n\tprivate paused = false;\n\tprivate staticMode = false;\n\tprivate gl: WebGL2RenderingContext = this.setupGL();\n\tprivate reduceImageSizeCanvas = new OffscreenCanvas(128, 128);\n\tprivate tickHandle = 0;\n\tprivate sprites: AlbumTexture[] = [];\n\tprivate ampTransition = 0;\n\tprivate playTime = 0;\n\tprivate frameTime = 0;\n\tprivate IllIlllIlIIlllI: number[] = [-0.1, 0.0];\n\tprivate onTick(tickTime: number) {\n\t\tthis.tickHandle = 0;\n\t\tif (this.paused) return;\n\n\t\tconst delta = tickTime - this.lastTickTime;\n\t\tconst frameDelta = tickTime - this.lastFrameTime;\n\t\tthis.lastFrameTime = tickTime;\n\t\tif (delta < 1000 / this.maxFPS) {\n\t\t\tthis.requestTick();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.hasLyric) this.playTime += frameDelta * this.flowSpeed * 0.2;\n\t\tthis.frameTime += frameDelta;\n\n\t\tif (!(this.onRedraw(this.playTime, frameDelta) && this.staticMode)) {\n\t\t\tthis.requestTick();\n\t\t}\n\n\t\tthis.lastTickTime = tickTime;\n\n\t\tthis.ampTransition;\n\t}\n\n\tprivate mainProgram: GLProgram = new GLProgram(\n\t\tthis.gl,\n\t\tvertShader,\n\t\teplorShader,\n\t\t\"main\",\n\t);\n\tprivate blendProgram: GLProgram = new GLProgram(\n\t\tthis.gl,\n\t\tvertShader,\n\t\tblendShader,\n\t\t\"blend\",\n\t);\n\tprivate copyProgram: GLProgram = new GLProgram(\n\t\tthis.gl,\n\t\tvertShader,\n\t\tfragShader,\n\t\t\"copy\",\n\t);\n\tprivate noiseProgram: GLProgram = new GLProgram(\n\t\tthis.gl,\n\t\tvertShader,\n\t\tnoiseShader,\n\t\t\"noise\",\n\t);\n\n\tprivate static readonly rawVertexBuffer = new Float32Array([\n\t\t-1, -1, 1, -1, -1, 1, 1, 1,\n\t]);\n\n\tprivate static readonly rawIndexBuffer = new Uint16Array([0, 1, 2, 1, 2, 3]);\n\n\tprivate vertexBuffer = new GLBuffer(\n\t\tthis.gl,\n\t\tthis.gl.ARRAY_BUFFER,\n\t\tEplorRenderer.rawVertexBuffer,\n\t\tthis.gl.STATIC_DRAW,\n\t);\n\n\tprivate indexBuffer = new GLBuffer(\n\t\tthis.gl,\n\t\tthis.gl.ELEMENT_ARRAY_BUFFER,\n\t\tEplorRenderer.rawIndexBuffer,\n\t\tthis.gl.STATIC_DRAW,\n\t);\n\n\tprivate noiseTexture = new NoiseTexture(this.gl);\n\n\tprivate fb: [Framebuffer, Framebuffer];\n\tprivate historyFrameBuffer: Framebuffer[] = [];\n\n\tconstructor(protected canvas: HTMLCanvasElement) {\n\t\tsuper(canvas);\n\t\tconst gl = this.gl;\n\t\tgl.enable(this.gl.BLEND);\n\t\tgl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n\t\tthis.requestTick();\n\t\tconst bounds = canvas.getBoundingClientRect();\n\t\tconst width =\n\t\t\tbounds.width * window.devicePixelRatio * this.currerntRenderScale;\n\t\tconst height =\n\t\t\tbounds.height * window.devicePixelRatio * this.currerntRenderScale;\n\t\tthis.fb = [\n\t\t\tnew Framebuffer(this.gl, width, height),\n\t\t\tnew Framebuffer(this.gl, width, height),\n\t\t];\n\t\tfor (const fb of this.fb) {\n\t\t\tfb.bind();\n\t\t\tgl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n\t\t}\n\t\tthis.historyFrameBuffer = new Array(2)\n\t\t\t.fill(0)\n\t\t\t.map(() => new Framebuffer(this.gl, width, height));\n\t\tthis.onResize(width, height);\n\t}\n\tprivate _currentSize = [0, 0];\n\tprivate _targetSize = [0, 0];\n\tprivate renderSize = [0, 0];\n\tprivate pixelSize = [0, 0];\n\n\tprotected override onResize(width: number, height: number): void {\n\t\t// super.onResize(width, height);\n\t\tthis._targetSize = [\n\t\t\tMath.max(1, Math.round(width)),\n\t\t\tMath.max(1, Math.round(height)),\n\t\t];\n\t\tif (this.staticMode) this.requestTick();\n\t}\n\n\tprivate checkResize() {\n\t\tif (\n\t\t\tthis._currentSize[0] === this._targetSize[0] &&\n\t\t\tthis._currentSize[1] === this._targetSize[1]\n\t\t)\n\t\t\treturn;\n\t\tthis._currentSize = [...this._targetSize];\n\t\tconst [width, height] = this._targetSize;\n\t\tconst realWidth = Math.round(\n\t\t\tMath.max(width / this.currerntRenderScale, width),\n\t\t);\n\t\tconst realHeight = Math.round(\n\t\t\tMath.max(height / this.currerntRenderScale, height),\n\t\t);\n\t\tthis.renderSize = [width, height];\n\t\tthis.canvas.width = realWidth;\n\t\tthis.canvas.height = realHeight;\n\t\tthis.pixelSize = [realWidth, realHeight];\n\t\tthis.gl.viewport(0, 0, realWidth, realHeight);\n\t\tfor (const fb of this.fb) {\n\t\t\tfb.resize(width, height);\n\t\t}\n\t\tfor (const fb of this.historyFrameBuffer) {\n\t\t\tfb.resize(realWidth, realHeight);\n\t\t}\n\t}\n\n\tprivate requestTick() {\n\t\tif (!this.tickHandle)\n\t\t\tthis.tickHandle = requestAnimationFrame((t) => this.onTick(t));\n\t}\n\n\tprivate drawScreen() {\n\t\tthis.gl.drawArrays(this.gl.TRIANGLE_STRIP, 0, 4);\n\t}\n\n\tprivate bindDefaultFrameBuffer() {\n\t\tthis.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null);\n\t}\n\n\tprivate onRedraw(tickTime: number, delta: number) {\n\t\tthis.checkResize();\n\t\tthis.hasLyricValue =\n\t\t\t(this.hasLyricValue * 19 + (this.hasLyric ? 1 : 0)) / 20;\n\t\tconst gl = this.gl;\n\t\tthis.vertexBuffer.bind();\n\t\tthis.indexBuffer.bind();\n\n\t\tthis.mainProgram.use();\n\t\tthis.noiseTexture.active();\n\t\tthis.mainProgram.setUniform1i(\"noisetex\", 1);\n\t\tthis.mainProgram.setUniform2f(\n\t\t\t\"IIlIlIIlIlIllI\",\n\t\t\tthis.renderSize[0],\n\t\t\tthis.renderSize[1],\n\t\t);\n\t\tthis.mainProgram.setUniform1f(\n\t\t\t\"lIIIlllllIllIl\",\n\t\t\tthis.hasLyric ? tickTime / 1000 : 0,\n\t\t);\n\t\tthis.mainProgram.setUniform1f(\"IIIlllllllIIIllIl\", this.hasLyricValue);\n\t\tthis.mainProgram.setUniform1f(\n\t\t\t\"IIIlllIlIIllll\",\n\t\t\tthis.hasLyric ? this._lowFreqVolume : 0.0,\n\t\t);\n\t\tthis.mainProgram.setUniform2f(\n\t\t\t\"IllIlllIlIIlllI\",\n\t\t\tthis.IllIlllIlIIlllI[0],\n\t\t\tthis.IllIlllIlIIlllI[1],\n\t\t);\n\t\tconst [fba, fbb] = this.fb;\n\t\tfbb.bind();\n\t\tgl.clearColor(0, 0, 0, 0);\n\t\tgl.clear(this.gl.COLOR_BUFFER_BIT);\n\n\t\tfor (const sprite of this.sprites) {\n\t\t\tfba.bind();\n\t\t\tgl.clearColor(0, 0, 0, 0);\n\t\t\tgl.clear(this.gl.COLOR_BUFFER_BIT);\n\n\t\t\tthis.mainProgram.use();\n\t\t\tsprite.draw(\"IlllIIlIlllIll\");\n\n\t\t\tfbb.bind();\n\n\t\t\tthis.blendProgram.use();\n\t\t\tfba.active();\n\t\t\tthis.blendProgram.setUniform1i(\"src\", 0);\n\t\t\tthis.blendProgram.setUniform1f(\"lerp\", sprite.alpha);\n\t\t\tthis.blendProgram.setUniform1f(\"scale\", this.currerntRenderScale);\n\t\t\tthis.drawScreen();\n\n\t\t\tsprite.alpha = Math.min(1, sprite.alpha + delta / 200);\n\t\t}\n\n\t\t// 增加噪点以缓解色带现象\n\t\tthis.noiseProgram.use();\n\t\tthis.noiseProgram.setUniform1i(\"src\", 0);\n\t\t// this.noiseProgram.setUniform2f(\n\t\t// \t\"renderSize\",\n\t\t// \tthis.renderSize[0],\n\t\t// \tthis.renderSize[1],\n\t\t// );\n\t\t// this.noiseProgram.setUniform1f(\"frameTime\", this.frameTime);\n\t\tfba.bind();\n\t\tfbb.active();\n\t\tthis.bindDefaultFrameBuffer();\n\t\tthis.drawScreen();\n\n\t\tif (this.sprites.length > 1) {\n\t\t\tconst coveredIndex = this.sprites[this.sprites.length - 1];\n\t\t\tif (coveredIndex.alpha >= 1) {\n\t\t\t\tfor (const deleted of this.sprites.splice(0, this.sprites.length - 1)) {\n\t\t\t\t\tdeleted.dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst isOnlyOneSprite =\n\t\t\tthis.sprites.length === 1 && this.sprites[0].alpha >= 1;\n\t\tconst isTweeningValues = this.hasLyric\n\t\t\t? this.hasLyricValue > 0.00001\n\t\t\t: this.hasLyricValue < 0.99999;\n\t\treturn isOnlyOneSprite || !isTweeningValues;\n\t}\n\n\tprivate copyFrameBuffer(src: Framebuffer, dst: Framebuffer | null = null) {\n\t\tif (src === dst) return;\n\t\tsrc.active(this.gl.TEXTURE0);\n\t\tthis.copyProgram.use();\n\t\tif (dst) {\n\t\t\tdst.bind();\n\t\t} else {\n\t\t\tthis.bindDefaultFrameBuffer();\n\t\t}\n\t\tthis.copyProgram.setUniform1i(\"src\", 0);\n\t\t// this.copyProgram.setUniform1f(\"scale\", scale);\n\t\tthis.drawScreen();\n\t}\n\n\tprivate setupGL() {\n\t\tconst gl = this.canvas.getContext(\"webgl2\", {\n\t\t\talpha: true,\n\t\t\tdepth: false,\n\t\t\tpowerPreference: \"low-power\",\n\t\t});\n\t\tif (!gl) throw new Error(\"WebGL2 not supported\");\n\t\tthis.gl = gl;\n\t\tgl.enable(gl.BLEND);\n\t\tgl.disable(gl.DEPTH_TEST);\n\t\tgl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\t\tif (!gl.getExtension(\"EXT_color_buffer_float\"))\n\t\t\tconsole.warn(\"EXT_color_buffer_float not supported\");\n\t\tif (!gl.getExtension(\"EXT_float_blend\"))\n\t\t\tconsole.warn(\"EXT_float_blend not supported\");\n\t\tif (!gl.getExtension(\"OES_texture_float_linear\"))\n\t\t\tconsole.warn(\"OES_texture_float_linear not supported\");\n\n\t\treturn gl;\n\t}\n\n\toverride setLowFreqVolume(volume: number): void {\n\t\tthis._lowFreqVolume = volume;\n\t}\n\n\toverride setStaticMode(enable: boolean): void {\n\t\tthis.staticMode = enable;\n\t\tthis.lastFrameTime = performance.now();\n\t\tthis.requestTick();\n\t}\n\toverride setFPS(fps: number): void {\n\t\tthis.maxFPS = fps;\n\t}\n\toverride pause(): void {\n\t\tif (this.tickHandle) {\n\t\t\tcancelAnimationFrame(this.tickHandle);\n\t\t\tthis.tickHandle = 0;\n\t\t}\n\t\tthis.paused = true;\n\t}\n\toverride resume(): void {\n\t\tthis.paused = false;\n\t\tthis.requestTick();\n\t}\n\tprivate loadImage(imageUrl: string): Promise<HTMLImageElement> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst img = document.createElement(\"img\");\n\t\t\timg.onload = () => resolve(img);\n\t\t\timg.onerror = reject;\n\t\t\timg.src = imageUrl;\n\t\t\timg.crossOrigin = \"anonymous\";\n\t\t});\n\t}\n\toverride async setAlbumImage(albumUrl: string): Promise<void> {\n\t\tif (albumUrl.trim().length === 0) return;\n\t\tlet remainRetryTimes = 5;\n\t\tlet img: HTMLImageElement | null = null;\n\t\twhile (!img && remainRetryTimes > 0) {\n\t\t\ttry {\n\t\t\t\timg = await this.loadImage(albumUrl);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`failed on loading album image, retrying (${remainRetryTimes})`,\n\t\t\t\t\talbumUrl,\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t\tremainRetryTimes--;\n\t\t\t}\n\t\t}\n\t\tif (!img) return;\n\t\t// resize image\n\t\tconst c = this.reduceImageSizeCanvas;\n\t\tconst ctx = c.getContext(\"2d\");\n\t\tif (!ctx) throw new Error(\"Failed to create canvas context\");\n\t\tctx.clearRect(0, 0, c.width, c.height);\n\t\t// const baseFilter = \"saturate(3) contrast(0.8) saturate(8) brightness(0.4)\";\n\t\tconst blurRadius = 10;\n\t\t// Safari 不支持 filter\n\t\t// ctx.filter = baseFilter;\n\t\tconst imgw = img.naturalWidth;\n\t\tconst imgh = img.naturalHeight;\n\t\tctx.drawImage(img, 0, 0, imgw, imgh, 0, 0, c.width, c.height);\n\t\t// ctx.fillStyle = \"white\";\n\t\t// ctx.fillRect(0, 0, c.width, c.height);\n\t\tconst imageData = ctx.getImageData(0, 0, c.width, c.height);\n\t\tcontrastImage(imageData, 0.8);\n\t\tsaturateImage(imageData, 1.5);\n\t\t//\t\tcontrastImage(imageData, 0.8);\n\t\t//\t\tbrightnessImage(imageData, 0.9);\n\t\tblurImage(imageData, blurRadius, 4);\n\t\tconst sprite = new AlbumTexture(\n\t\t\tthis.gl,\n\t\t\tthis.mainProgram,\n\t\t\tthis.vertexBuffer,\n\t\t\tthis.indexBuffer,\n\t\t\timageData,\n\t\t);\n\t\tthis.sprites.push(sprite);\n\t\tthis.playTime = Math.random() * 100000;\n\t\tthis.lastFrameTime = performance.now();\n\t\tconsole.info(Math.random() * 10000);\n\t\tconst r = Number.parseInt((Math.random() * 10000).toFixed(0)) % 3;\n\t\tif (r === 0) {\n\t\t\tthis.IllIlllIlIIlllI = [-1.3, -0.9];\n\t\t\t// this.IllIlllIlIIlllI = [-1.1, -.9];\n\t\t} else if (r === 1) {\n\t\t\t// this.IllIlllIlIIlllI = [-0.3, -0.2];\n\t\t\tthis.IllIlllIlIIlllI = [-1.1, -0.9];\n\t\t} else {\n\t\t\tthis.IllIlllIlIIlllI = [-1.3, -0.9];\n\t\t}\n\t\tthis.requestTick();\n\t}\n\n\toverride setHasLyric(hasLyric: boolean): void {\n\t\tthis.hasLyric = hasLyric;\n\t\tthis.requestTick();\n\t}\n\n\toverride getElement(): HTMLElement {\n\t\treturn this.canvas;\n\t}\n\toverride dispose(): void {\n\t\tsuper.dispose();\n\t\tthis.vertexBuffer.dispose();\n\t\tthis.indexBuffer.dispose();\n\t\tthis.noiseTexture.dispose();\n\t\tfor (const s of this.sprites) {\n\t\t\ts.dispose();\n\t\t}\n\t\tthis.copyProgram.dispose();\n\t\tthis.blendProgram.dispose();\n\t\tthis.mainProgram.dispose();\n\t\tfor (const fb of this.fb) {\n\t\t\tfb.dispose();\n\t\t}\n\t\tfor (const fb of this.historyFrameBuffer) {\n\t\t\tfb.dispose();\n\t\t}\n\t\tif (this.tickHandle) {\n\t\t\tcancelAnimationFrame(this.tickHandle);\n\t\t\tthis.tickHandle = 0;\n\t\t}\n\t}\n}\n","/**\n * @fileoverview\n * 一个播放歌词的组件\n * @author SteveXMH\n */\n\nexport { AbstractBaseRenderer, BaseRenderer } from \"./base\";\nimport { AbstractBaseRenderer, BaseRenderer } from \"./base\";\nexport { PixiRenderer } from \"./pixi-renderer\";\nexport { EplorRenderer } from \"./eplor-renderer\";\n\nexport class BackgroundRender<Renderer extends BaseRenderer>\n\timplements AbstractBaseRenderer\n{\n\tprivate element: HTMLCanvasElement;\n\tprivate renderer: Renderer;\n\tconstructor(renderer: Renderer, canvas: HTMLCanvasElement) {\n\t\tthis.renderer = renderer;\n\n\t\tthis.element = canvas;\n\t\tcanvas.style.pointerEvents = \"none\";\n\t\tcanvas.style.zIndex = \"-1\";\n\t\tcanvas.style.contain = \"strict\";\n\t}\n\n\tstatic new<Renderer extends BaseRenderer>(type: {\n\t\tnew (canvas: HTMLCanvasElement): Renderer;\n\t}): BackgroundRender<Renderer> {\n\t\tconst canvas = document.createElement(\"canvas\");\n\t\treturn new BackgroundRender(new type(canvas), canvas);\n\t}\n\n\tsetRenderScale(scale: number): void {\n\t\tthis.renderer.setRenderScale(scale);\n\t}\n\n\tsetFlowSpeed(speed: number): void {\n\t\tthis.renderer.setFlowSpeed(speed);\n\t}\n\tsetStaticMode(enable: boolean): void {\n\t\tthis.renderer.setStaticMode(enable);\n\t}\n\tsetFPS(fps: number): void {\n\t\tthis.renderer.setFPS(fps);\n\t}\n\tpause(): void {\n\t\tthis.renderer.pause();\n\t}\n\tresume(): void {\n\t\tthis.renderer.resume();\n\t}\n\tsetLowFreqVolume(volume: number): void {\n\t\tthis.renderer.setLowFreqVolume(volume);\n\t}\n\tsetHasLyric(hasLyric: boolean): void {\n\t\tthis.renderer.setHasLyric(hasLyric);\n\t}\n\tsetAlbumImage(albumUrl: string): Promise<void> {\n\t\treturn this.renderer.setAlbumImage(albumUrl);\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tdispose() {\n\t\tthis.renderer.dispose();\n\t\tthis.element.remove();\n\t}\n}\n","export const eqSet: <T>(xs: Set<T>, ys: Set<T>) => boolean = (\n\txs,\n\tys,\n): boolean => xs.size === ys.size && [...xs].every((x) => ys.has(x));\n","export function derivative(f: (x: number) => number) {\n\tconst h = 0.001;\n\treturn (x: number) => (f(x + h) - f(x - h)) / (2 * h);\n}\n\nexport function getVelocity(f: (t: number) => number): (t: number) => number {\n\treturn derivative(f);\n}\n","import { getVelocity } from \"./derivative\";\n\n/** MIT License github.com/pushkine/ */\nexport interface SpringParams {\n\tmass: number; // = 1.0\n\tdamping: number; // = 10.0\n\tstiffness: number; // = 100.0\n\tsoft: boolean; // = false\n}\n\ntype seconds = number;\n\nexport class Spring {\n\tprivate currentPosition = 0;\n\tprivate targetPosition = 0;\n\tprivate currentTime = 0;\n\tprivate params: Partial<SpringParams> = {};\n\tprivate currentSolver: (t: seconds) => number;\n\tprivate getV: (t: seconds) => number;\n\tprivate getV2: (t: seconds) => number;\n\tprivate queueParams:\n\t\t| (Partial<SpringParams> & {\n\t\t\t\ttime: number;\n\t\t })\n\t\t| undefined;\n\tprivate queuePosition:\n\t\t| {\n\t\t\t\ttime: number;\n\t\t\t\tposition: number;\n\t\t }\n\t\t| undefined;\n\tconstructor(currentPosition = 0) {\n\t\tthis.targetPosition = currentPosition;\n\t\tthis.currentPosition = this.targetPosition;\n\t\tthis.currentSolver = () => this.targetPosition;\n\t\tthis.getV = () => 0;\n\t\tthis.getV2 = () => 0;\n\t}\n\tprivate resetSolver() {\n\t\tconst curV = this.getV(this.currentTime);\n\t\tthis.currentTime = 0;\n\t\tthis.currentSolver = solveSpring(\n\t\t\tthis.currentPosition,\n\t\t\tcurV,\n\t\t\tthis.targetPosition,\n\t\t\t0,\n\t\t\tthis.params,\n\t\t);\n\t\tthis.getV = getVelocity(this.currentSolver);\n\t\tthis.getV2 = getVelocity(this.getV);\n\t}\n\tarrived() {\n\t\treturn (\n\t\t\tMath.abs(this.targetPosition - this.currentPosition) < 0.01 &&\n\t\t\tthis.getV(this.currentTime) < 0.01 &&\n\t\t\tthis.getV2(this.currentTime) < 0.01 &&\n\t\t\tthis.queueParams === undefined &&\n\t\t\tthis.queuePosition === undefined\n\t\t);\n\t}\n\tsetPosition(targetPosition: number) {\n\t\tthis.targetPosition = targetPosition;\n\t\tthis.currentPosition = targetPosition;\n\t\tthis.currentSolver = () => this.targetPosition;\n\t\tthis.getV = () => 0;\n\t\tthis.getV2 = () => 0;\n\t}\n\tupdate(delta = 0) {\n\t\tthis.currentTime += delta;\n\t\tthis.currentPosition = this.currentSolver(this.currentTime);\n\t\tif (this.queueParams) {\n\t\t\tthis.queueParams.time -= delta;\n\t\t\tif (this.queueParams.time <= 0) {\n\t\t\t\tthis.updateParams({\n\t\t\t\t\t...this.queueParams,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (this.queuePosition) {\n\t\t\tthis.queuePosition.time -= delta;\n\t\t\tif (this.queuePosition.time <= 0) {\n\t\t\t\tthis.setTargetPosition(this.queuePosition.position);\n\t\t\t}\n\t\t}\n\t\tif (this.arrived()) {\n\t\t\tthis.setPosition(this.targetPosition);\n\t\t}\n\t}\n\tupdateParams(params: Partial<SpringParams>, delay = 0) {\n\t\tif (delay > 0) {\n\t\t\tthis.queueParams = {\n\t\t\t\t...(this.queuePosition ?? {}),\n\t\t\t\t...params,\n\t\t\t\ttime: delay,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.queuePosition = undefined;\n\t\t\tthis.params = {\n\t\t\t\t...this.params,\n\t\t\t\t...params,\n\t\t\t};\n\t\t\tthis.resetSolver();\n\t\t}\n\t}\n\tsetTargetPosition(targetPosition: number, delay = 0) {\n\t\tif (delay > 0) {\n\t\t\tthis.queuePosition = {\n\t\t\t\t...(this.queuePosition ?? {}),\n\t\t\t\tposition: targetPosition,\n\t\t\t\ttime: delay,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.queuePosition = undefined;\n\t\t\tthis.targetPosition = targetPosition;\n\t\t\tthis.resetSolver();\n\t\t}\n\t}\n\tgetCurrentPosition() {\n\t\treturn this.currentPosition;\n\t}\n}\n\nfunction solveSpring(\n\tfrom: number,\n\tvelocity: number,\n\tto: number,\n\tdelay: seconds = 0,\n\tparams?: Partial<SpringParams>,\n): (t: seconds) => number {\n\tconst soft = params?.soft ?? false;\n\tconst stiffness = params?.stiffness ?? 100;\n\tconst damping = params?.damping ?? 10;\n\tconst mass = params?.mass ?? 1;\n\tconst delta = to - from;\n\tif (soft || 1.0 <= damping / (2.0 * Math.sqrt(stiffness * mass))) {\n\t\tconst angular_frequency = -Math.sqrt(stiffness / mass);\n\t\tconst leftover = -angular_frequency * delta - velocity;\n\t\treturn (t: seconds) => {\n\t\t\tt -= delay;\n\t\t\tif (t < 0) return from;\n\t\t\treturn to - (delta + t * leftover) * Math.E ** (t * angular_frequency);\n\t\t};\n\t}\n\tconst damping_frequency = Math.sqrt(4.0 * mass * stiffness - damping ** 2.0);\n\tconst leftover =\n\t\t(damping * delta - 2.0 * mass * velocity) / damping_frequency;\n\tconst dfm = (0.5 * damping_frequency) / mass;\n\tconst dm = -(0.5 * damping) / mass;\n\treturn (t: seconds) => {\n\t\tt -= delay;\n\t\tif (t < 0) return from;\n\t\treturn (\n\t\t\tto -\n\t\t\t(Math.cos(t * dfm) * delta + Math.sin(t * dfm) * leftover) *\n\t\t\t\tMath.E ** (t * dm)\n\t\t);\n\t};\n}\n","import { LyricPlayer } from \".\";\nimport { Disposable, HasElement } from \"../interfaces\";\nimport { Spring } from \"../utils/spring\";\n\nexport class BottomLineEl implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate left = 0;\n\tprivate top = 0;\n\tprivate delay = 0;\n\t// 由 LyricPlayer 来设置\n\tlineSize: number[] = [0, 0];\n\treadonly lineTransforms = {\n\t\tposX: new Spring(0),\n\t\tposY: new Spring(0),\n\t};\n\tconstructor(private lyricPlayer: LyricPlayer) {\n\t\tthis.element.setAttribute(\n\t\t\t\"class\",\n\t\t\tthis.lyricPlayer.style.classes.lyricLine,\n\t\t);\n\t\tthis.rebuildStyle();\n\t}\n\tmeasureSize(): [number, number] {\n\t\tconst size: [number, number] = [\n\t\t\tthis.element.clientWidth,\n\t\t\tthis.element.clientHeight,\n\t\t];\n\t\treturn size;\n\t}\n\tprivate lastStyle = \"\";\n\tshow() {\n\t\tthis.rebuildStyle();\n\t}\n\thide() {\n\t\tthis.rebuildStyle();\n\t}\n\trebuildStyle() {\n\t\tlet style = `transform:translate(${this.lineTransforms.posX\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(2)}px,${this.lineTransforms.posY\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(2)}px);`;\n\t\tif (!this.lyricPlayer.getEnableSpring() && this.isInSight) {\n\t\t\tstyle += `transition-delay:${this.delay}ms;`;\n\t\t}\n\t\tif (style !== this.lastStyle) {\n\t\t\tthis.lastStyle = style;\n\t\t\tthis.element.setAttribute(\"style\", style);\n\t\t}\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tsetTransform(\n\t\tleft: number = this.left,\n\t\ttop: number = this.top,\n\t\tforce = false,\n\t\tdelay = 0,\n\t) {\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.delay = (delay * 1000) | 0;\n\t\tif (force || !this.lyricPlayer.getEnableSpring()) {\n\t\t\tif (force)\n\t\t\t\tthis.element.classList.add(\n\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t);\n\t\t\tthis.lineTransforms.posX.setPosition(left);\n\t\t\tthis.lineTransforms.posY.setPosition(top);\n\t\t\tif (!this.lyricPlayer.getEnableSpring()) this.show();\n\t\t\telse this.rebuildStyle();\n\t\t\tif (force)\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tthis.element.classList.remove(\n\t\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t} else {\n\t\t\tthis.lineTransforms.posX.setTargetPosition(left, delay);\n\t\t\tthis.lineTransforms.posY.setTargetPosition(top, delay);\n\t\t}\n\t}\n\tupdate(delta = 0) {\n\t\tif (!this.lyricPlayer.getEnableSpring()) return;\n\t\tthis.lineTransforms.posX.update(delta);\n\t\tthis.lineTransforms.posY.update(delta);\n\t\tif (this.isInSight) {\n\t\t\tthis.show();\n\t\t} else {\n\t\t\tthis.hide();\n\t\t}\n\t}\n\tget isInSight() {\n\t\tconst l = this.lineTransforms.posX.getCurrentPosition();\n\t\tconst t = this.lineTransforms.posY.getCurrentPosition();\n\t\tconst r = l + this.lineSize[0];\n\t\tconst b = t + this.lineSize[1];\n\t\tconst pr = this.lyricPlayer.size[0];\n\t\tconst pb = this.lyricPlayer.size[1];\n\t\treturn !(l > pr || t > pb || r < 0 || b < 0);\n\t}\n\tdispose(): void {\n\t\tthis.element.remove();\n\t}\n}\n","import { LyricPlayer } from \".\";\nimport type { Disposable, HasElement } from \"../interfaces\";\n\nfunction easeInOutBack(x: number): number {\n\tconst c1 = 1.70158;\n\tconst c2 = c1 * 1.525;\n\n\treturn x < 0.5\n\t\t? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n\t\t: (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n}\n\nconst clamp = (min: number, cur: number, max: number) =>\n\tMath.max(min, Math.min(cur, max));\n\nexport class InterludeDots implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate dot0: HTMLElement = document.createElement(\"span\");\n\tprivate dot1: HTMLElement = document.createElement(\"span\");\n\tprivate dot2: HTMLElement = document.createElement(\"span\");\n\tprivate left = 0;\n\tprivate top = 0;\n\tprivate scale = 1;\n\tprivate playing = true;\n\tprivate lastStyle = \"\";\n\tprivate currentInterlude?: [number, number];\n\tprivate currentTime = 0;\n\tprivate interludeTime = 0;\n\tprivate targetBreatheDuration = 1500;\n\tconstructor(private readonly lyricPlayer: LyricPlayer) {\n\t\tthis.element.className = this.lyricPlayer.style.classes.interludeDots;\n\t\tthis.element.appendChild(this.dot0);\n\t\tthis.element.appendChild(this.dot1);\n\t\tthis.element.appendChild(this.dot2);\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tsetTransform(left: number = this.left, top: number = this.top) {\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.update();\n\t}\n\tsetInterlude(interlude?: [number, number]) {\n\t\tthis.currentInterlude = interlude;\n\t\tthis.currentTime = interlude?.[0] ?? 0;\n\t}\n\tpause() {\n\t\tthis.playing = false;\n\t}\n\tresume() {\n\t\tthis.playing = true;\n\t}\n\tupdate(delta = 0) {\n\t\tif (!this.playing) return;\n\t\tthis.currentTime += delta;\n\t\tlet curStyle = \"\";\n\n\t\tcurStyle += `transform:translate(${this.left.toFixed(\n\t\t\t2,\n\t\t)}px, ${this.top.toFixed(2)}px)`;\n\n\t\t// 计算缩放大小\n\n\t\tif (this.currentInterlude) {\n\t\t\tconst interludeDuration =\n\t\t\t\tthis.currentInterlude[1] - this.currentInterlude[0];\n\t\t\tconst currentDuration = this.currentTime - this.currentInterlude[0];\n\t\t\tif (currentDuration <= interludeDuration) {\n\t\t\t\tconst breatheDuration =\n\t\t\t\t\tinterludeDuration /\n\t\t\t\t\tMath.ceil(interludeDuration / this.targetBreatheDuration);\n\t\t\t\tlet scale = 1;\n\t\t\t\tlet globalOpacity = 1;\n\n\t\t\t\tscale *=\n\t\t\t\t\tMath.sin(1.5 * Math.PI - (currentDuration / breatheDuration) * 2) /\n\t\t\t\t\t\t20 +\n\t\t\t\t\t1;\n\n\t\t\t\tif (currentDuration < 1000) {\n\t\t\t\t\tscale *= 1 - ((1000 - currentDuration) / 1000) ** 2;\n\t\t\t\t}\n\n\t\t\t\tif (currentDuration < 500) {\n\t\t\t\t\tglobalOpacity = 0;\n\t\t\t\t} else if (currentDuration < 1000) {\n\t\t\t\t\tglobalOpacity *= (currentDuration - 500) / 500;\n\t\t\t\t}\n\n\t\t\t\tif (interludeDuration - currentDuration < 750) {\n\t\t\t\t\tscale *=\n\t\t\t\t\t\t1 -\n\t\t\t\t\t\teaseInOutBack(\n\t\t\t\t\t\t\t(750 - (interludeDuration - currentDuration)) / 750 / 2,\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (interludeDuration - currentDuration < 375) {\n\t\t\t\t\tglobalOpacity *= clamp(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t(interludeDuration - currentDuration) / 375,\n\t\t\t\t\t\t1,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst dotsDuration = Math.max(0, interludeDuration - 750);\n\n\t\t\t\tscale = Math.max(0, scale) * 0.7;\n\n\t\t\t\tcurStyle += ` scale(${scale})`;\n\n\t\t\t\tconst dot0Opacity = clamp(\n\t\t\t\t\t0.25,\n\t\t\t\t\t((currentDuration * 3) / dotsDuration) * 0.75,\n\t\t\t\t\t1,\n\t\t\t\t);\n\t\t\t\tconst dot1Opacity = clamp(\n\t\t\t\t\t0.25,\n\t\t\t\t\t(((currentDuration - dotsDuration / 3) * 3) / dotsDuration) * 0.75,\n\t\t\t\t\t1,\n\t\t\t\t);\n\t\t\t\tconst dot2Opacity = clamp(\n\t\t\t\t\t0.25,\n\t\t\t\t\t(((currentDuration - (dotsDuration / 3) * 2) * 3) / dotsDuration) *\n\t\t\t\t\t\t0.75,\n\t\t\t\t\t1,\n\t\t\t\t);\n\n\t\t\t\tthis.dot0.style.opacity = `${clamp(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(0, globalOpacity * dot0Opacity),\n\t\t\t\t\t1,\n\t\t\t\t)}`;\n\t\t\t\tthis.dot1.style.opacity = `${clamp(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(0, globalOpacity * dot1Opacity),\n\t\t\t\t\t1,\n\t\t\t\t)}`;\n\t\t\t\tthis.dot2.style.opacity = `${clamp(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(0, globalOpacity * dot2Opacity),\n\t\t\t\t\t1,\n\t\t\t\t)}`;\n\t\t\t} else {\n\t\t\t\tcurStyle += \" scale(0)\";\n\t\t\t\tthis.dot0.style.opacity = \"0\";\n\t\t\t\tthis.dot1.style.opacity = \"0\";\n\t\t\t\tthis.dot2.style.opacity = \"0\";\n\t\t\t}\n\t\t} else {\n\t\t\tcurStyle += \" scale(0)\";\n\t\t\tthis.dot0.style.opacity = \"0\";\n\t\t\tthis.dot1.style.opacity = \"0\";\n\t\t\tthis.dot2.style.opacity = \"0\";\n\t\t}\n\n\t\tcurStyle += \";\";\n\n\t\tif (this.lastStyle !== curStyle) {\n\t\t\tthis.element.setAttribute(\"style\", curStyle);\n\t\t\tthis.lastStyle = curStyle;\n\t\t}\n\t}\n\tdispose() {\n\t\tthis.element.remove();\n\t}\n}\n","// biome-ignore format: matrix\nexport type Matrix4 = [\n\tnumber, number, number, number,\n\tnumber, number, number, number,\n\tnumber, number, number, number,\n\tnumber, number, number, number,\n];\n\nexport function createMatrix4(): Matrix4 {\n\t// biome-ignore format: matrix\n\treturn [\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 1\n ];\n}\n\nexport function scaleMatrix4(\n\tm: Matrix4,\n\tscale = 1,\n\torigin = { x: 0, y: 0 },\n): Matrix4 {\n\tconst [ox, oy] = [origin.x, origin.y];\n\t// biome-ignore format: matrix\n\treturn [\n m[0] * scale , m[1] * scale , m[2] * scale , m[3],\n m[4] * scale , m[5] * scale , m[6] * scale , m[7],\n m[8] * scale , m[9] * scale , m[10] * scale, m[11],\n m[12] - ox * scale + ox, m[13] - oy * scale + oy, m[14] , m[15]\n ];\n}\n\nexport function translateMatrix4(m: Matrix4, x = 0, y = 0, z = 0): Matrix4 {\n\t// biome-ignore format: matrix\n\treturn [\n m[0] , m[1] , m[2] , m[3] ,\n m[4] , m[5] , m[6] , m[7] ,\n m[8] , m[9] , m[10] , m[11],\n m[12] + x, m[13] + y, m[14] + z, m[15]\n ];\n}\n\nexport function matrix4ToCSS(m: Matrix4, fractionDigits = 4): string {\n\tconst format = (n: number, i: number) => n.toFixed(fractionDigits);\n\treturn `matrix3d(${m.map(format).join(\", \")})`;\n}\n","/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\n */\n\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\nvar NEWTON_ITERATIONS = 4;\nvar NEWTON_MIN_SLOPE = 0.001;\nvar SUBDIVISION_PRECISION = 0.0000001;\nvar SUBDIVISION_MAX_ITERATIONS = 10;\n\nvar kSplineTableSize = 11;\nvar kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\nvar float32ArraySupported = typeof Float32Array === 'function';\n\nfunction A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }\nfunction B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }\nfunction C (aA1) { return 3.0 * aA1; }\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }\n\nfunction binarySubdivide (aX, aA, aB, mX1, mX2) {\n var currentX, currentT, i = 0;\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) {\n aB = currentT;\n } else {\n aA = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n return currentT;\n}\n\nfunction newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {\n for (var i = 0; i < NEWTON_ITERATIONS; ++i) {\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n if (currentSlope === 0.0) {\n return aGuessT;\n }\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n}\n\nfunction LinearEasing (x) {\n return x;\n}\n\nmodule.exports = function bezier (mX1, mY1, mX2, mY2) {\n if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range');\n }\n\n if (mX1 === mY1 && mX2 === mY2) {\n return LinearEasing;\n }\n\n // Precompute samples table\n var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n for (var i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n }\n\n function getTForX (aX) {\n var intervalStart = 0.0;\n var currentSample = 1;\n var lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n --currentSample;\n\n // Interpolate to provide an initial guess for t\n var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n var guessForT = intervalStart + dist * kSampleStepSize;\n\n var initialSlope = getSlope(guessForT, mX1, mX2);\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n } else if (initialSlope === 0.0) {\n return guessForT;\n } else {\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n }\n }\n\n return function BezierEasing (x) {\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n if (x === 0) {\n return 0;\n }\n if (x === 1) {\n return 1;\n }\n return calcBezier(getTForX(x), mY1, mY2);\n };\n};\n","import { LyricPlayer } from \".\";\nimport { Disposable, HasElement, LyricLine, LyricWord } from \"../interfaces\";\nimport { createMatrix4, matrix4ToCSS, scaleMatrix4 } from \"../utils/matrix\";\nimport { Spring } from \"../utils/spring\";\nimport bezier from \"bezier-easing\";\nimport { WebAnimationSpring } from \"../utils/wa-spring\";\n\nconst CJKEXP = /^[\\p{Unified_Ideograph}\\u0800-\\u9FFC]+$/u;\n\nenum EmphasizeAnimationMethod {\n\tFloatAndGlow = \"float-and-glow\",\n\tFloatOnly = \"float-only\",\n}\n\ninterface RealWord extends LyricWord {\n\tmainElement: HTMLSpanElement;\n\tsubElements: HTMLSpanElement[];\n\telementAnimations: Animation[];\n\tmaskAnimations: Animation[];\n\twidth: number;\n\theight: number;\n\tpadding: number;\n\tshouldEmphasize: boolean;\n}\n\nconst ANIMATION_FRAME_QUANTITY = 32;\n\nconst norNum = (min: number, max: number) => (x: number) =>\n\tMath.min(1, Math.max(0, (x - min) / (max - min)));\nconst EMP_EASING_MID = 0.4;\nconst beginNum = norNum(0, EMP_EASING_MID);\nconst endNum = norNum(EMP_EASING_MID, 1);\n\nconst makeEmpEasing = (mid: number) => {\n\tconst bezIn = bezier(0.3, 0, 0.25, 1);\n\tconst bezOut = bezier(0.5, 0, 0.3, 1);\n\treturn (x: number) => (x < mid ? bezIn(beginNum(x)) : 1 - bezOut(endNum(x)));\n};\nconst defaultEmpEasing = makeEmpEasing(EMP_EASING_MID);\n\n// function generateFadeGradient(\n// \twidth: number,\n// \tpadding = 0,\n// \tbright = \"rgba(0,0,0,0.85)\",\n// \tdark = \"rgba(0,0,0,0.25)\",\n// ): [string, number] {\n// \tconst totalAspect = 2 + width + padding;\n// \tconst widthInTotal = width / totalAspect;\n// \tconst leftPos = (1 - widthInTotal) / 2;\n// \treturn [\n// \t\t`linear-gradient(to right,${bright} ${leftPos * 100}%,${dark} ${\n// \t\t\tleftPos * 100\n// \t\t}%,${bright} ${(leftPos + widthInTotal) * 100}%,${dark} ${\n// \t\t\t(leftPos + widthInTotal) * 100\n// \t\t}%)`,\n// \t\ttotalAspect,\n// \t];\n// }\n\nfunction generateFadeGradient(\n\twidth: number,\n\tpadding = 0,\n\tbright = \"rgba(0,0,0,0.85)\",\n\tdark = \"rgba(0,0,0,0.25)\",\n): [string, number] {\n\tconst totalAspect = 2 + width + padding;\n\tconst widthInTotal = width / totalAspect;\n\tconst leftPos = (1 - widthInTotal) / 2;\n\treturn [\n\t\t`linear-gradient(to right,${bright} ${leftPos * 100}%,${dark} ${\n\t\t\t(leftPos + widthInTotal) * 100\n\t\t}%)`,\n\t\ttotalAspect,\n\t];\n}\n\n// 将输入的单词重新分组,之间没有空格的单词将会组合成一个单词数组\n// 例如输入:[\"Life\", \" \", \"is\", \" a\", \" su\", \"gar so\", \"sweet\"]\n// 应该返回:[\"Life\", \" \", \"is\", \" a\", [\" su\", \"gar\"], \"so\", \"sweet\"]\nfunction chunkAndSplitLyricWords(\n\twords: LyricWord[],\n): (LyricWord | LyricWord[])[] {\n\tconst resplitedWords: LyricWord[] = [];\n\n\tfor (const w of words) {\n\t\tconst realLength = w.word.replace(/\\s/g, \"\").length;\n\t\tconst splited = w.word.split(\" \").filter((v) => v.trim().length > 0);\n\t\tif (splited.length > 1) {\n\t\t\tif (w.word.startsWith(\" \")) {\n\t\t\t\tresplitedWords.push({\n\t\t\t\t\tword: \" \",\n\t\t\t\t\tstartTime: 0,\n\t\t\t\t\tendTime: 0,\n\t\t\t\t});\n\t\t\t}\n\t\t\tlet charPos = 0;\n\t\t\tfor (const s of splited) {\n\t\t\t\tconst word: LyricWord = {\n\t\t\t\t\tword: s,\n\t\t\t\t\tstartTime:\n\t\t\t\t\t\tw.startTime + (charPos / realLength) * (w.endTime - w.startTime),\n\t\t\t\t\tendTime:\n\t\t\t\t\t\tw.startTime +\n\t\t\t\t\t\t((charPos + s.length) / realLength) * (w.endTime - w.startTime),\n\t\t\t\t};\n\t\t\t\tresplitedWords.push(word);\n\t\t\t\tresplitedWords.push({\n\t\t\t\t\tword: \" \",\n\t\t\t\t\tstartTime: 0,\n\t\t\t\t\tendTime: 0,\n\t\t\t\t});\n\t\t\t\tcharPos += s.length;\n\t\t\t}\n\t\t\tif (!w.word.endsWith(\" \")) {\n\t\t\t\tresplitedWords.pop();\n\t\t\t}\n\t\t} else {\n\t\t\tresplitedWords.push(w);\n\t\t}\n\t}\n\n\tlet wordChunk: string[] = [];\n\tlet wChunk: LyricWord[] = [];\n\tconst result: (LyricWord | LyricWord[])[] = [];\n\n\tfor (const w of resplitedWords) {\n\t\tconst word = w.word;\n\t\twordChunk.push(word);\n\t\twChunk.push(w);\n\t\tif (word.length > 0 && word.trim().length === 0) {\n\t\t\twordChunk.pop();\n\t\t\twChunk.pop();\n\t\t\tif (wChunk.length === 1) {\n\t\t\t\tresult.push(wChunk[0]);\n\t\t\t} else if (wChunk.length > 1) {\n\t\t\t\tresult.push(wChunk);\n\t\t\t}\n\t\t\tresult.push(w);\n\t\t\twordChunk = [];\n\t\t\twChunk = [];\n\t\t} else if (\n\t\t\t!/^\\s*[^\\s]*\\s*$/.test(wordChunk.join(\"\")) ||\n\t\t\tCJKEXP.test(word)\n\t\t) {\n\t\t\twordChunk.pop();\n\t\t\twChunk.pop();\n\t\t\tif (wChunk.length === 1) {\n\t\t\t\tresult.push(wChunk[0]);\n\t\t\t} else if (wChunk.length > 1) {\n\t\t\t\tresult.push(wChunk);\n\t\t\t}\n\t\t\twordChunk = [word];\n\t\t\twChunk = [w];\n\t\t}\n\t}\n\n\tif (wChunk.length === 1) {\n\t\tresult.push(wChunk[0]);\n\t} else {\n\t\tresult.push(wChunk);\n\t}\n\n\treturn result;\n}\n\n// 果子在对辉光效果的解释是一种强调(emphasized)效果\n// 条件是一个单词时长大于等于 1s 且长度小于等于 7\nexport function shouldEmphasize(word: LyricWord): boolean {\n\treturn (\n\t\tword.endTime - word.startTime >= 1000 &&\n\t\tword.word.trim().length <= 7 &&\n\t\tword.word.trim().length >= 1\n\t);\n}\n\nexport class RawLyricLineMouseEvent extends MouseEvent {\n\tconstructor(\n\t\tpublic readonly line: LyricLineEl,\n\t\tevent: MouseEvent,\n\t) {\n\t\tsuper(event.type, event);\n\t}\n}\n\ntype MouseEventMap = {\n\t[evt in keyof HTMLElementEventMap]: HTMLElementEventMap[evt] extends MouseEvent\n\t\t? evt\n\t\t: never;\n};\ntype MouseEventTypes = MouseEventMap[keyof MouseEventMap];\ntype MouseEventListener = (\n\tthis: LyricLineEl,\n\tev: RawLyricLineMouseEvent,\n) => void;\n\nexport class LyricLineEl extends EventTarget implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate left = 0;\n\tprivate top = 0;\n\tprivate scale = 1;\n\tprivate blur = 0;\n\tprivate delay = 0;\n\tprivate splittedWords: RealWord[] = [];\n\t// 由 LyricPlayer 来设置\n\tlineSize: number[] = [0, 0];\n\treadonly lineTransforms = {\n\t\tposX: new Spring(0),\n\t\tposY: new Spring(0),\n\t\tscale: new Spring(1),\n\t};\n\t// readonly lineWebAnimationTransforms = {\n\t// \tposX: new WebAnimationSpring(this.element, \"transform\", (v) => `translateX(${v.toFixed(1)}px)`),\n\t// \tposY: new WebAnimationSpring(this.element, \"transform\", (v) => `translateY(${v.toFixed(1)}px)`),\n\t// \tscale: new WebAnimationSpring(this.element, \"transform\", (v) => `scale(${v.toFixed(4)})`, 1),\n\t// };\n\n\tconstructor(\n\t\tprivate lyricPlayer: LyricPlayer,\n\t\tprivate lyricLine: LyricLine = {\n\t\t\twords: [],\n\t\t\ttranslatedLyric: \"\",\n\t\t\tromanLyric: \"\",\n\t\t\tstartTime: 0,\n\t\t\tendTime: 0,\n\t\t\tisBG: false,\n\t\t\tisDuet: false,\n\t\t},\n\t) {\n\t\tsuper();\n\t\tthis._prevParentEl = lyricPlayer.getElement();\n\t\tthis.element.setAttribute(\n\t\t\t\"class\",\n\t\t\tthis.lyricPlayer.style.classes.lyricLine,\n\t\t);\n\t\tif (this.lyricLine.isBG) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine);\n\t\t}\n\t\tif (this.lyricLine.isDuet) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine);\n\t\t}\n\t\tthis.element.appendChild(document.createElement(\"div\")); // 歌词行\n\t\tthis.element.appendChild(document.createElement(\"div\")); // 翻译行\n\t\tthis.element.appendChild(document.createElement(\"div\")); // 音译行\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tconst trans = this.element.children[1] as HTMLDivElement;\n\t\tconst roman = this.element.children[2] as HTMLDivElement;\n\t\tmain.setAttribute(\"class\", this.lyricPlayer.style.classes.lyricMainLine);\n\t\ttrans.setAttribute(\"class\", this.lyricPlayer.style.classes.lyricSubLine);\n\t\troman.setAttribute(\"class\", this.lyricPlayer.style.classes.lyricSubLine);\n\t\tthis.rebuildElement();\n\t\tthis.rebuildStyle();\n\t}\n\tprivate listenersMap = new Map<string, Set<MouseEventListener>>();\n\tprivate readonly onMouseEvent = (e: MouseEvent) => {\n\t\tconst wrapped = new RawLyricLineMouseEvent(this, e);\n\t\tfor (const listener of this.listenersMap.get(e.type) ?? []) {\n\t\t\tlistener.call(this, wrapped);\n\t\t}\n\t\tif (!this.dispatchEvent(wrapped) || wrapped.defaultPrevented) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn false;\n\t\t}\n\t};\n\n\taddMouseEventListener(\n\t\ttype: MouseEventTypes,\n\t\tcallback: MouseEventListener | null,\n\t\toptions?: boolean | AddEventListenerOptions | undefined,\n\t): void {\n\t\tif (callback) {\n\t\t\tconst listeners = this.listenersMap.get(type) ?? new Set();\n\t\t\tif (listeners.size === 0)\n\t\t\t\tthis.element.addEventListener(type, this.onMouseEvent, options);\n\t\t\tlisteners.add(callback);\n\t\t\tthis.listenersMap.set(type, listeners);\n\t\t}\n\t}\n\n\tremoveMouseEventListener(\n\t\ttype: MouseEventTypes,\n\t\tcallback: MouseEventListener | null,\n\t\toptions?: boolean | EventListenerOptions | undefined,\n\t): void {\n\t\tif (callback) {\n\t\t\tconst listeners = this.listenersMap.get(type);\n\t\t\tif (listeners) {\n\t\t\t\tlisteners.delete(callback);\n\t\t\t\tif (listeners.size === 0)\n\t\t\t\t\tthis.element.removeEventListener(type, this.onMouseEvent, options);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate isEnabled = false;\n\tenable(maskAnimationTime = this.lyricLine.startTime) {\n\t\tthis.isEnabled = true;\n\t\tthis.element.classList.add(\"active\");\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.elementAnimations) {\n\t\t\t\ta.currentTime = 0;\n\t\t\t\ta.playbackRate = 1;\n\t\t\t\ta.play();\n\t\t\t}\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.currentTime = Math.min(\n\t\t\t\t\tthis.totalDuration,\n\t\t\t\t\tMath.max(0, maskAnimationTime - this.lyricLine.startTime),\n\t\t\t\t);\n\t\t\t\ta.playbackRate = 1;\n\t\t\t\ta.play();\n\t\t\t}\n\t\t}\n\t\tmain.classList.add(\"active\");\n\t}\n\tdisable(maskAnimationTime = 0) {\n\t\tthis.isEnabled = false;\n\t\tthis.element.classList.remove(\"active\");\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.elementAnimations) {\n\t\t\t\tif (a.id === \"float-word\") {\n\t\t\t\t\ta.playbackRate = -1;\n\t\t\t\t\ta.play();\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.currentTime = Math.min(\n\t\t\t\t\tthis.totalDuration,\n\t\t\t\t\tMath.max(0, maskAnimationTime - this.lyricLine.startTime),\n\t\t\t\t);\n\t\t\t\ta.pause();\n\t\t\t}\n\t\t}\n\t\tmain.classList.remove(\"active\");\n\t}\n\tresume() {\n\t\tif (!this.isEnabled) return;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.play();\n\t\t\t}\n\t\t}\n\t}\n\tpause() {\n\t\tif (!this.isEnabled) return;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.pause();\n\t\t\t}\n\t\t}\n\t}\n\tsetMaskAnimationState(maskAnimationTime = 0) {\n\t\tconst t = maskAnimationTime - this.lyricLine.startTime;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.currentTime = Math.min(this.totalDuration, Math.max(0, t));\n\t\t\t\ta.playbackRate = 1;\n\t\t\t\tif (t >= 0 && t < this.totalDuration) a.play();\n\t\t\t\telse a.pause();\n\t\t\t}\n\t\t}\n\t}\n\tmeasureSize(): [number, number] {\n\t\tif (this._hide) {\n\t\t\tif (this._prevParentEl) {\n\t\t\t\tthis._prevParentEl.appendChild(this.element);\n\t\t\t}\n\t\t\tthis.element.style.display = \"\";\n\t\t\tthis.element.style.visibility = \"hidden\";\n\t\t}\n\t\tconst size: [number, number] = [\n\t\t\tthis.element.clientWidth,\n\t\t\tthis.element.clientHeight,\n\t\t];\n\t\tif (this._hide) {\n\t\t\tif (this._prevParentEl) {\n\t\t\t\tthis.element.remove();\n\t\t\t}\n\t\t\tthis.element.style.display = \"none\";\n\t\t\tthis.element.style.visibility = \"\";\n\t\t}\n\t\treturn size;\n\t}\n\tsetLine(line: LyricLine) {\n\t\tthis.lyricLine = line;\n\t\tif (this.lyricLine.isBG) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine);\n\t\t} else {\n\t\t\tthis.element.classList.remove(this.lyricPlayer.style.classes.lyricBgLine);\n\t\t}\n\t\tif (this.lyricLine.isDuet) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine);\n\t\t} else {\n\t\t\tthis.element.classList.remove(\n\t\t\t\tthis.lyricPlayer.style.classes.lyricDuetLine,\n\t\t\t);\n\t\t}\n\t\tthis.rebuildElement();\n\t\tthis.rebuildStyle();\n\t}\n\tgetLine() {\n\t\treturn this.lyricLine;\n\t}\n\tprivate _hide = true;\n\tprivate _prevParentEl: HTMLElement | null = null;\n\tprivate lastStyle = \"\";\n\tshow() {\n\t\tthis._hide = false;\n\t\tif (this._prevParentEl) {\n\t\t\tthis._prevParentEl.appendChild(this.element);\n\t\t\tthis._prevParentEl = null;\n\t\t}\n\t\tthis.rebuildStyle();\n\t}\n\thide() {\n\t\tthis._hide = true;\n\t\tif (this.element.parentElement) {\n\t\t\tthis._prevParentEl = this.element.parentElement;\n\t\t\tthis.element.remove();\n\t\t}\n\t\tthis.rebuildStyle();\n\t}\n\trebuildStyle() {\n\t\tif (this._hide) {\n\t\t\tif (this.lastStyle !== \"display:none;transform:translate(0,-10000px);\") {\n\t\t\t\tthis.lastStyle = \"display:none;transform:translate(0,-10000px);\";\n\t\t\t\tthis.element.setAttribute(\n\t\t\t\t\t\"style\",\n\t\t\t\t\t\"display:none;transform:translate(0,-10000px);\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tlet style = \"\";\n\t\t// if (this.lyricPlayer.getEnableSpring()) {\n\t\tstyle += `transform:translate(${this.lineTransforms.posX\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(1)}px,${this.lineTransforms.posY\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(1)}px) scale(${this.lineTransforms.scale\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(4)});`;\n\t\tif (!this.lyricPlayer.getEnableSpring() && this.isInSight) {\n\t\t\tstyle += `transition-delay:${this.delay}ms;`;\n\t\t}\n\t\tstyle += `filter:blur(${Math.min(32, this.blur)}px);`;\n\t\tif (style !== this.lastStyle) {\n\t\t\tthis.lastStyle = style;\n\t\t\tthis.element.setAttribute(\"style\", style);\n\t\t}\n\t}\n\trebuildElement() {\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tconst trans = this.element.children[1] as HTMLDivElement;\n\t\tconst roman = this.element.children[2] as HTMLDivElement;\n\t\t// 如果是非动态歌词,那么就不需要分词了\n\t\tif (this.lyricPlayer._getIsNonDynamic()) {\n\t\t\tmain.innerText = this.lyricLine.words.map((w) => w.word).join(\"\");\n\t\t\ttrans.innerText = this.lyricLine.translatedLyric;\n\t\t\troman.innerText = this.lyricLine.romanLyric;\n\t\t\treturn;\n\t\t}\n\t\tconst chunkedWords = chunkAndSplitLyricWords(this.lyricLine.words);\n\t\tmain.innerHTML = \"\";\n\t\tthis.splittedWords = [];\n\t\tfor (const chunk of chunkedWords) {\n\t\t\tif (Array.isArray(chunk)) {\n\t\t\t\t// 多个没有空格的单词组合成的一个单词数组\n\t\t\t\tif (chunk.length === 0) continue;\n\t\t\t\tconst merged = chunk.reduce(\n\t\t\t\t\t(a, b) => {\n\t\t\t\t\t\ta.endTime = Math.max(a.endTime, b.endTime);\n\t\t\t\t\t\ta.startTime = Math.min(a.startTime, b.startTime);\n\t\t\t\t\t\ta.word += b.word;\n\t\t\t\t\t\treturn a;\n\t\t\t\t\t},\n\t\t\t\t\t{ word: \"\", startTime: Infinity, endTime: -Infinity },\n\t\t\t\t);\n\t\t\t\tconst emp = chunk\n\t\t\t\t\t.map((word) => shouldEmphasize(word))\n\t\t\t\t\t.reduce((a, b) => a || b, shouldEmphasize(merged));\n\t\t\t\tconst wrapperWordEl = document.createElement(\"span\");\n\t\t\t\twrapperWordEl.classList.add(\"emphasize-wrapper\");\n\t\t\t\tconst characterElements: HTMLElement[] = [];\n\t\t\t\tfor (const word of chunk) {\n\t\t\t\t\tconst mainWordEl = document.createElement(\"span\");\n\t\t\t\t\t// const mainWordFloatAnimation = this.initFloatAnimation(\n\t\t\t\t\t// \tmerged,\n\t\t\t\t\t// \tmainWordEl,\n\t\t\t\t\t// );\n\t\t\t\t\tif (emp) {\n\t\t\t\t\t\tmainWordEl.classList.add(\"emphasize\");\n\t\t\t\t\t\tconst charEls: HTMLSpanElement[] = [];\n\t\t\t\t\t\tfor (const char of word.word.trim().split(\"\")) {\n\t\t\t\t\t\t\tconst charEl = document.createElement(\"span\");\n\t\t\t\t\t\t\tcharEl.innerText = char;\n\t\t\t\t\t\t\tcharEls.push(charEl);\n\t\t\t\t\t\t\tcharacterElements.push(charEl);\n\t\t\t\t\t\t\tmainWordEl.appendChild(charEl);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst realWord: RealWord = {\n\t\t\t\t\t\t\t...word,\n\t\t\t\t\t\t\tmainElement: mainWordEl,\n\t\t\t\t\t\t\tsubElements: charEls,\n\t\t\t\t\t\t\telementAnimations: [this.initFloatAnimation(merged, mainWordEl)],\n\t\t\t\t\t\t\tmaskAnimations: [],\n\t\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tshouldEmphasize: emp,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tthis.splittedWords.push(realWord);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmainWordEl.innerText = word.word;\n\t\t\t\t\t\tthis.splittedWords.push({\n\t\t\t\t\t\t\t...word,\n\t\t\t\t\t\t\tmainElement: mainWordEl,\n\t\t\t\t\t\t\tsubElements: [],\n\t\t\t\t\t\t\telementAnimations: [this.initFloatAnimation(word, mainWordEl)],\n\t\t\t\t\t\t\tmaskAnimations: [],\n\t\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tshouldEmphasize: emp,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\twrapperWordEl.appendChild(mainWordEl);\n\t\t\t\t}\n\t\t\t\tif (emp) {\n\t\t\t\t\tthis.splittedWords[\n\t\t\t\t\t\tthis.splittedWords.length - 1\n\t\t\t\t\t].elementAnimations.push(\n\t\t\t\t\t\t...this.initEmphasizeAnimation(\n\t\t\t\t\t\t\tcharacterElements,\n\t\t\t\t\t\t\tmerged.endTime - merged.startTime,\n\t\t\t\t\t\t\tmerged.startTime - this.lyricLine.startTime,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (merged.word.trimStart() !== merged.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t\tmain.appendChild(wrapperWordEl);\n\t\t\t\tif (merged.word.trimEnd() !== merged.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t} else if (chunk.word.trim().length === 0) {\n\t\t\t\t// 纯空格\n\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t} else {\n\t\t\t\t// 单个单词\n\t\t\t\tconst emp = shouldEmphasize(chunk);\n\t\t\t\tconst mainWordEl = document.createElement(\"span\");\n\t\t\t\tconst realWord: RealWord = {\n\t\t\t\t\t...chunk,\n\t\t\t\t\tmainElement: mainWordEl,\n\t\t\t\t\tsubElements: [],\n\t\t\t\t\telementAnimations: [this.initFloatAnimation(chunk, mainWordEl)],\n\t\t\t\t\tmaskAnimations: [],\n\t\t\t\t\twidth: 0,\n\t\t\t\t\theight: 0,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tshouldEmphasize: emp,\n\t\t\t\t};\n\t\t\t\tif (emp) {\n\t\t\t\t\tmainWordEl.classList.add(\"emphasize\");\n\t\t\t\t\tconst charEls: HTMLSpanElement[] = [];\n\t\t\t\t\tfor (const char of chunk.word.trim().split(\"\")) {\n\t\t\t\t\t\tconst charEl = document.createElement(\"span\");\n\t\t\t\t\t\tcharEl.innerText = char;\n\t\t\t\t\t\tcharEls.push(charEl);\n\t\t\t\t\t\tmainWordEl.appendChild(charEl);\n\t\t\t\t\t}\n\t\t\t\t\trealWord.subElements = charEls;\n\t\t\t\t\tconst duration = Math.abs(realWord.endTime - realWord.startTime);\n\t\t\t\t\trealWord.elementAnimations.push(\n\t\t\t\t\t\t...this.initEmphasizeAnimation(\n\t\t\t\t\t\t\tcharEls,\n\t\t\t\t\t\t\tduration,\n\t\t\t\t\t\t\trealWord.startTime - this.lyricLine.startTime,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\t// realWord.elementAnimations = this.initEmphasizeAnimation(realWord);\n\t\t\t\t} else {\n\t\t\t\t\tmainWordEl.innerText = chunk.word.trim();\n\t\t\t\t}\n\t\t\t\tif (chunk.word.trimStart() !== chunk.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t\tmain.appendChild(mainWordEl);\n\t\t\t\tif (chunk.word.trimEnd() !== chunk.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t\tthis.splittedWords.push(realWord);\n\t\t\t}\n\t\t}\n\t\ttrans.innerText = this.lyricLine.translatedLyric;\n\t\troman.innerText = this.lyricLine.romanLyric;\n\t}\n\tprivate initFloatAnimation(word: LyricWord, wordEl: HTMLSpanElement) {\n\t\tconst delay = word.startTime - this.lyricLine.startTime;\n\t\tconst duration = Math.max(1000, word.endTime - word.startTime);\n\t\tlet up = 0.05;\n\t\tif (this.lyricLine.isBG) {\n\t\t\tup *= 2;\n\t\t}\n\t\tif (shouldEmphasize(word) && duration < 1200) {\n\t\t\tup = 0;\n\t\t}\n\t\tconst a = wordEl.animate(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttransform: \"translateY(0px)\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttransform: `translateY(${-up}em)`,\n\t\t\t\t},\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration: isFinite(duration) ? duration : 0,\n\t\t\t\tdelay: isFinite(delay) ? delay : 0,\n\t\t\t\tid: \"float-word\",\n\t\t\t\tcomposite: \"add\",\n\t\t\t\tfill: \"both\",\n\t\t\t\teasing: \"ease-out\",\n\t\t\t},\n\t\t);\n\t\ta.pause();\n\t\treturn a;\n\t}\n\t// 按照原 Apple Music 参考,强调效果只应用缩放、轻微左右位移和辉光效果,原主要的悬浮位移效果不变\n\t// 为了避免产生锯齿抖动感,使用 matrix3d 来实现缩放和位移\n\tprivate initEmphasizeAnimation(\n\t\tcharacterElements: HTMLElement[],\n\t\tduration: number,\n\t\tdelay: number,\n\t): Animation[] {\n\t\tconst de = Math.max(0, delay);\n\t\tconst du = Math.max(1000, duration);\n\n\t\tlet method = EmphasizeAnimationMethod.FloatAndGlow;\n\n\t\tif (du < 1200) {\n\t\t\tmethod = EmphasizeAnimationMethod.FloatOnly;\n\t\t}\n\n\t\tlet result: Animation[] = [];\n\n\t\tswitch (method) {\n\t\t\tcase EmphasizeAnimationMethod.FloatAndGlow: {\n\t\t\t\tlet amount = 0;\n\t\t\t\tlet blur = 0;\n\t\t\t\tif (du >= 1200 && du < 2000) {\n\t\t\t\t\tamount = 0.7;\n\t\t\t\t\tblur = 0.5;\n\t\t\t\t} else if (du >= 2000 && du < 3000) {\n\t\t\t\t\tamount = 0.8;\n\t\t\t\t\tblur = 0.6;\n\t\t\t\t} else if (du >= 3000 && du < 4000) {\n\t\t\t\t\tamount = 1.0;\n\t\t\t\t\tblur = 0.8;\n\t\t\t\t} else if (du >= 4000) {\n\t\t\t\t\tamount = 1.0;\n\t\t\t\t\tblur = 0.8;\n\t\t\t\t}\n\t\t\t\tconst animateDu = Number.isFinite(du) ? Math.max(du * 1.2, 2000) : 0;\n\t\t\t\tconst empEasing = makeEmpEasing(EMP_EASING_MID);\n\t\t\t\tresult = characterElements.flatMap((el, i, arr) => {\n\t\t\t\t\tconst wordDe = de + (du / 3 / arr.length) * i;\n\t\t\t\t\tconst result: Animation[] = [];\n\n\t\t\t\t\tconst frames: Keyframe[] = new Array(ANIMATION_FRAME_QUANTITY)\n\t\t\t\t\t\t.fill(0)\n\t\t\t\t\t\t.map((_, i) => {\n\t\t\t\t\t\t\tconst x = (i + 1) / ANIMATION_FRAME_QUANTITY;\n\t\t\t\t\t\t\tconst y = empEasing(x);\n\t\t\t\t\t\t\tconst transX = Math.sin(x * Math.PI * 2);\n\t\t\t\t\t\t\tconst glowLevel =\n\t\t\t\t\t\t\t\tMath.max(0, x < EMP_EASING_MID ? y / 2 : y - 0.5) * blur;\n\t\t\t\t\t\t\t// const floatLevel =\n\t\t\t\t\t\t\t// \tMath.max(0, x < EMP_EASING_MID ? y : y - 0.5);\n\n\t\t\t\t\t\t\tconst mat = scaleMatrix4(createMatrix4(), 1 + y * 0.1 * amount);\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\toffset: x,\n\t\t\t\t\t\t\t\ttransform: `${matrix4ToCSS(mat, 4)} translate(${\n\t\t\t\t\t\t\t\t\ttransX * 0.005 * amount\n\t\t\t\t\t\t\t\t}em,${-y * 0.05}em)`,\n\t\t\t\t\t\t\t\ttextShadow: `rgba(255, 255, 255, ${glowLevel}) 0 0 10px`,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\tconst ani = el.animate(frames, {\n\t\t\t\t\t\tduration: animateDu,\n\t\t\t\t\t\tdelay: Number.isFinite(wordDe) ? wordDe : 0,\n\t\t\t\t\t\tid: `emphasize-word-float-and-glow-${el.innerText}-${i}`,\n\t\t\t\t\t\titerations: 1,\n\t\t\t\t\t\tcomposite: \"replace\",\n\t\t\t\t\t\teasing: \"linear\",\n\t\t\t\t\t\tfill: \"both\",\n\t\t\t\t\t});\n\t\t\t\t\tani.onfinish = () => {\n\t\t\t\t\t\tani.pause();\n\t\t\t\t\t};\n\t\t\t\t\tani.pause();\n\t\t\t\t\tresult.push(ani);\n\n\t\t\t\t\treturn result;\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase EmphasizeAnimationMethod.FloatOnly: {\n\t\t\t\tresult = characterElements.flatMap((el, i, arr) => {\n\t\t\t\t\tconst wordDe = de + (du / 1.5 / arr.length) * i;\n\t\t\t\t\tconst result: Animation[] = [];\n\n\t\t\t\t\tconst frames: Keyframe[] = new Array(ANIMATION_FRAME_QUANTITY)\n\t\t\t\t\t\t.fill(0)\n\t\t\t\t\t\t.map((_, i) => {\n\t\t\t\t\t\t\tconst x = (i + 1) / ANIMATION_FRAME_QUANTITY;\n\t\t\t\t\t\t\tconst y = x < EMP_EASING_MID ? defaultEmpEasing(x) : 1;\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\toffset: x,\n\t\t\t\t\t\t\t\ttransform: `translateY(${-y * 0.05}em)`,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\tconst ani = el.animate(frames, {\n\t\t\t\t\t\tduration: Number.isFinite(du) ? du * 2 : 0,\n\t\t\t\t\t\tdelay: Number.isFinite(wordDe) ? wordDe : 0,\n\t\t\t\t\t\tid: `emphasize-word-float-only-${el.innerText}-${i}`,\n\t\t\t\t\t\titerations: 1,\n\t\t\t\t\t\tcomposite: \"replace\",\n\t\t\t\t\t\teasing: \"linear\",\n\t\t\t\t\t\tfill: \"both\",\n\t\t\t\t\t});\n\t\t\t\t\tani.onfinish = () => {\n\t\t\t\t\t\tani.pause();\n\t\t\t\t\t};\n\t\t\t\t\tani.pause();\n\t\t\t\t\tresult.push(ani);\n\n\t\t\t\t\treturn result;\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\tprivate get totalDuration() {\n\t\treturn this.lyricLine.endTime - this.lyricLine.startTime;\n\t}\n\tupdateMaskImage() {\n\t\tif (this._hide) {\n\t\t\tif (this._prevParentEl) {\n\t\t\t\tthis._prevParentEl.appendChild(this.element);\n\t\t\t}\n\t\t\tthis.element.style.display = \"\";\n\t\t\tthis.element.style.visibility = \"hidden\";\n\t\t}\n\t\tfor (const word of this.splittedWords) {\n\t\t\tconst el = word.mainElement;\n\t\t\tif (el) {\n\t\t\t\tword.padding = parseFloat(getComputedStyle(el).paddingLeft);\n\t\t\t\tword.width = el.clientWidth - word.padding * 2;\n\t\t\t\tword.height = el.clientHeight - word.padding * 2;\n\t\t\t} else {\n\t\t\t\tword.width = 0;\n\t\t\t\tword.height = 0;\n\t\t\t\tword.padding = 0;\n\t\t\t}\n\t\t}\n\t\tif (this.lyricPlayer.supportMaskImage) {\n\t\t\tthis.generateWebAnimationBasedMaskImage();\n\t\t} else {\n\t\t\tthis.generateCalcBasedMaskImage();\n\t\t}\n\t\tif (this._hide) {\n\t\t\tif (this._prevParentEl) {\n\t\t\t\tthis.element.remove();\n\t\t\t}\n\t\t\tthis.element.style.display = \"none\";\n\t\t\tthis.element.style.visibility = \"\";\n\t\t}\n\t}\n\tprivate generateCalcBasedMaskImage() {\n\t\tfor (const word of this.splittedWords) {\n\t\t\tconst wordEl = word.mainElement;\n\t\t\tif (wordEl) {\n\t\t\t\tword.width = wordEl.clientWidth;\n\t\t\t\tword.height = wordEl.clientHeight;\n\t\t\t\tconst fadeWidth = word.height / 2;\n\t\t\t\tconst [maskImage, totalAspect] = generateFadeGradient(\n\t\t\t\t\tfadeWidth / word.width,\n\t\t\t\t);\n\t\t\t\tconst totalAspectStr = `${totalAspect * 100}% 100%`;\n\t\t\t\tif (this.lyricPlayer.supportMaskImage) {\n\t\t\t\t\twordEl.style.maskImage = maskImage;\n\t\t\t\t\twordEl.style.maskRepeat = \"no-repeat\";\n\t\t\t\t\twordEl.style.maskOrigin = \"left\";\n\t\t\t\t\twordEl.style.maskSize = totalAspectStr;\n\t\t\t\t} else {\n\t\t\t\t\twordEl.style.webkitMaskImage = maskImage;\n\t\t\t\t\twordEl.style.webkitMaskRepeat = \"no-repeat\";\n\t\t\t\t\twordEl.style.webkitMaskOrigin = \"left\";\n\t\t\t\t\twordEl.style.webkitMaskSize = totalAspectStr;\n\t\t\t\t}\n\t\t\t\tconst w = word.width + fadeWidth;\n\t\t\t\tconst maskPos = `clamp(${-w}px,calc(${-w}px + (var(--amll-player-time) - ${\n\t\t\t\t\tword.startTime\n\t\t\t\t})*${\n\t\t\t\t\tw / Math.abs(word.endTime - word.startTime)\n\t\t\t\t}px),0px) 0px, left top`;\n\t\t\t\t// const maskPos = `clamp(0px,${w}px,${w}px) 0px, left top`;\n\t\t\t\twordEl.style.maskPosition = maskPos;\n\t\t\t\twordEl.style.webkitMaskPosition = maskPos;\n\t\t\t}\n\t\t}\n\t}\n\tprivate generateWebAnimationBasedMaskImage() {\n\t\tconst totalDuration = this.totalDuration;\n\t\tthis.splittedWords.forEach((word, i) => {\n\t\t\tconst wordEl = word.mainElement;\n\t\t\tif (wordEl) {\n\t\t\t\t// TODO: 可选配置渐变宽度\n\t\t\t\t// Apple Music for iPad 上是 `word.height / 2`\n\t\t\t\t// Apple Music for Android 上是 `word.height`\n\t\t\t\tconst fadeWidth = word.height / 2;\n\t\t\t\tconst [maskImage, totalAspect] = generateFadeGradient(\n\t\t\t\t\tfadeWidth / (word.width + word.padding * 2),\n\t\t\t\t);\n\t\t\t\tconst totalAspectStr = `${totalAspect * 100}% 100%`;\n\t\t\t\tif (this.lyricPlayer.supportMaskImage) {\n\t\t\t\t\twordEl.style.maskImage = maskImage;\n\t\t\t\t\twordEl.style.maskRepeat = \"no-repeat\";\n\t\t\t\t\twordEl.style.maskOrigin = \"left\";\n\t\t\t\t\twordEl.style.maskSize = totalAspectStr;\n\t\t\t\t} else {\n\t\t\t\t\twordEl.style.webkitMaskImage = maskImage;\n\t\t\t\t\twordEl.style.webkitMaskRepeat = \"no-repeat\";\n\t\t\t\t\twordEl.style.webkitMaskOrigin = \"left\";\n\t\t\t\t\twordEl.style.webkitMaskSize = totalAspectStr;\n\t\t\t\t}\n\t\t\t\t// 为了尽可能将渐变动画在相连的每个单词间近似衔接起来\n\t\t\t\t// 要综合每个单词的效果时间和间隙生成动画帧数组\n\t\t\t\tconst widthBeforeSelf =\n\t\t\t\t\tthis.splittedWords.slice(0, i).reduce((a, b) => a + b.width, 0) +\n\t\t\t\t\t(this.splittedWords[0] ? fadeWidth : 0);\n\t\t\t\tconst minOffset = -(word.width + word.padding * 2 + fadeWidth);\n\t\t\t\tconst clampOffset = (x: number) => Math.max(minOffset, Math.min(0, x));\n\t\t\t\tlet curPos = -widthBeforeSelf - word.width - word.padding - fadeWidth;\n\t\t\t\tlet timeOffset = 0;\n\t\t\t\tconst frames: Keyframe[] = [];\n\t\t\t\tlet lastPos = curPos;\n\t\t\t\tlet lastTime = 0;\n\t\t\t\tconst pushFrame = () => {\n\t\t\t\t\tconst moveOffset = curPos - lastPos;\n\t\t\t\t\tconst time = Math.max(0, Math.min(1, timeOffset));\n\t\t\t\t\tconst duration = time - lastTime;\n\t\t\t\t\tconst d = Math.abs(duration / moveOffset);\n\t\t\t\t\t// 因为有可能会和之前的动画有边界\n\t\t\t\t\tif (curPos > minOffset && lastPos < minOffset) {\n\t\t\t\t\t\tconst staticTime = Math.abs(lastPos - minOffset) * d;\n\t\t\t\t\t\tconst value = `${clampOffset(lastPos)}px 0`;\n\t\t\t\t\t\tconst frame: Keyframe = {\n\t\t\t\t\t\t\toffset: lastTime + staticTime,\n\t\t\t\t\t\t\tmaskPosition: value,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tframes.push(frame);\n\t\t\t\t\t}\n\t\t\t\t\tif (curPos > 0 && lastPos < 0) {\n\t\t\t\t\t\tconst staticTime = Math.abs(lastPos) * d;\n\t\t\t\t\t\tconst value = `${clampOffset(curPos)}px 0`;\n\t\t\t\t\t\tconst frame: Keyframe = {\n\t\t\t\t\t\t\toffset: lastTime + staticTime,\n\t\t\t\t\t\t\tmaskPosition: value,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tframes.push(frame);\n\t\t\t\t\t}\n\t\t\t\t\tconst value = `${clampOffset(curPos)}px 0`;\n\t\t\t\t\tconst frame: Keyframe = {\n\t\t\t\t\t\toffset: time,\n\t\t\t\t\t\tmaskPosition: value,\n\t\t\t\t\t};\n\t\t\t\t\tframes.push(frame);\n\t\t\t\t\tlastPos = curPos;\n\t\t\t\t\tlastTime = time;\n\t\t\t\t};\n\t\t\t\tpushFrame();\n\t\t\t\tlet lastTimeStamp = 0;\n\t\t\t\tthis.splittedWords.forEach((otherWord, j) => {\n\t\t\t\t\t// 停顿\n\t\t\t\t\t{\n\t\t\t\t\t\tconst curTimeStamp = otherWord.startTime - this.lyricLine.startTime;\n\t\t\t\t\t\tconst staticDuration = curTimeStamp - lastTimeStamp;\n\t\t\t\t\t\ttimeOffset += staticDuration / totalDuration;\n\t\t\t\t\t\tif (staticDuration > 0) pushFrame();\n\t\t\t\t\t\tlastTimeStamp = curTimeStamp;\n\t\t\t\t\t}\n\t\t\t\t\t// 移动\n\t\t\t\t\t{\n\t\t\t\t\t\tconst fadeDuration = otherWord.endTime - otherWord.startTime;\n\t\t\t\t\t\ttimeOffset += fadeDuration / totalDuration;\n\t\t\t\t\t\tcurPos += otherWord.width;\n\t\t\t\t\t\tif (j === 0) {\n\t\t\t\t\t\t\tcurPos += fadeWidth * 1.5;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (j === this.splittedWords.length - 1) {\n\t\t\t\t\t\t\tcurPos += fadeWidth * 0.5;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (fadeDuration > 0) pushFrame();\n\t\t\t\t\t\tlastTimeStamp += fadeDuration;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\t\ta.cancel();\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst ani = wordEl.animate(frames, {\n\t\t\t\t\t\tduration: totalDuration || 1,\n\t\t\t\t\t\tid: `fade-word-${word.word}-${i}`,\n\t\t\t\t\t\teasing: \"linear\",\n\t\t\t\t\t\tfill: \"both\",\n\t\t\t\t\t});\n\t\t\t\t\tani.pause();\n\t\t\t\t\tword.maskAnimations = [ani];\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.warn(\"应用渐变动画发生错误\", frames, totalDuration, err);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tsetTransform(\n\t\tleft: number = this.left,\n\t\ttop: number = this.top,\n\t\tscale: number = this.scale,\n\t\topacity = 1,\n\t\tblur = 0,\n\t\tforce = false,\n\t\tdelay = 0,\n\t) {\n\t\tconst roundedBlur = Math.round(blur);\n\t\tconst beforeInSight = this.isInSight;\n\t\tconst enableSpring = this.lyricPlayer.getEnableSpring();\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.scale = scale;\n\t\tthis.delay = (delay * 1000) | 0;\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tconst trans = this.element.children[1] as HTMLDivElement;\n\t\tconst roman = this.element.children[2] as HTMLDivElement;\n\t\tmain.style.opacity = `${opacity}`;\n\t\ttrans.style.opacity = `${opacity / 2}`;\n\t\troman.style.opacity = `${opacity / 2}`;\n\t\tif (force || !enableSpring) {\n\t\t\tthis.blur = Math.min(32, roundedBlur);\n\t\t\tif (force)\n\t\t\t\tthis.element.classList.add(\n\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t);\n\t\t\t// this.lineWebAnimationTransforms.posX.setTargetPosition(left);\n\t\t\t// this.lineWebAnimationTransforms.posY.setTargetPosition(top);\n\t\t\t// this.lineWebAnimationTransforms.scale.setTargetPosition(scale);\n\t\t\tthis.lineTransforms.posX.setPosition(left);\n\t\t\tthis.lineTransforms.posY.setPosition(top);\n\t\t\tthis.lineTransforms.scale.setPosition(scale);\n\t\t\tif (!enableSpring) {\n\t\t\t\tconst afterInSight = this.isInSight;\n\t\t\t\tif (beforeInSight || afterInSight) {\n\t\t\t\t\tthis.show();\n\t\t\t\t} else {\n\t\t\t\t\tthis.hide();\n\t\t\t\t}\n\t\t\t} else this.rebuildStyle();\n\t\t\tif (force)\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tthis.element.classList.remove(\n\t\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t} else {\n\t\t\t// this.lineWebAnimationTransforms.posX.stop();\n\t\t\t// this.lineWebAnimationTransforms.posY.stop();\n\t\t\t// this.lineWebAnimationTransforms.scale.stop();\n\t\t\tthis.lineTransforms.posX.setTargetPosition(left, delay);\n\t\t\tthis.lineTransforms.posY.setTargetPosition(top, delay);\n\t\t\tthis.lineTransforms.scale.setTargetPosition(scale);\n\t\t\tif (this.blur !== Math.min(32, roundedBlur)) {\n\t\t\t\tthis.blur = Math.min(32, roundedBlur);\n\t\t\t\tthis.element.style.filter = `blur(${Math.min(32, roundedBlur)}px)`;\n\t\t\t}\n\t\t}\n\t}\n\tupdate(delta = 0) {\n\t\tif (!this.lyricPlayer.getEnableSpring()) return;\n\t\tthis.lineTransforms.posX.update(delta);\n\t\tthis.lineTransforms.posY.update(delta);\n\t\tthis.lineTransforms.scale.update(delta);\n\t\tif (this.isInSight) {\n\t\t\tthis.show();\n\t\t} else {\n\t\t\tthis.hide();\n\t\t}\n\t}\n\n\t_getDebugTargetPos(): string {\n\t\treturn `[位移: ${this.left}, ${this.top}; 缩放: ${this.scale}; 延时: ${this.delay}]`;\n\t}\n\n\tget isInSight() {\n\t\tconst l = this.lineTransforms.posX.getCurrentPosition();\n\t\tconst t = this.lineTransforms.posY.getCurrentPosition();\n\t\tconst r = l + this.lineSize[0];\n\t\tconst b = t + this.lineSize[1];\n\t\tconst pr = this.lyricPlayer.size[0];\n\t\tconst pb = this.lyricPlayer.size[1];\n\t\treturn !(l > pr || r < 0 || t > pb || b < 0);\n\t}\n\tdispose(): void {\n\t\tthis.element.remove();\n\t}\n}\n","/**\n * @fileoverview\n * 一个播放歌词的组件\n * @author SteveXMH\n */\n\nimport type { Disposable, HasElement, LyricLine } from \"../interfaces\";\nimport { eqSet } from \"../utils/eq-set\";\nimport { SpringParams } from \"../utils/spring\";\nimport { BottomLineEl } from \"./bottom-line\";\nimport { InterludeDots } from \"./interlude-dots\";\nimport {\n\tLyricLineEl,\n\tRawLyricLineMouseEvent,\n\tshouldEmphasize,\n} from \"./lyric-line\";\nimport { create } from \"jss\";\nimport preset from \"jss-preset-default\";\n\nconst jss = create(preset());\n\n/**\n * 歌词行鼠标相关事件,可以获取到歌词行的索引和歌词行元素\n */\nexport class LyricLineMouseEvent extends MouseEvent {\n\tconstructor(\n\t\t/**\n\t\t * 歌词行索引\n\t\t */\n\t\tpublic readonly lineIndex: number,\n\t\t/**\n\t\t * 歌词行元素\n\t\t */\n\t\tpublic readonly line: LyricLineEl,\n\t\tevent: MouseEvent,\n\t) {\n\t\tsuper(`line-${event.type}`, event);\n\t}\n}\n\nexport interface LyricLineMouseEventListener {\n\t(evt: LyricLineMouseEvent): void;\n}\n\n/**\n * 歌词播放组件,本框架的核心组件\n *\n * 尽可能贴切 Apple Music for iPad 的歌词效果设计,且做了力所能及的优化措施\n */\nexport class LyricPlayer extends EventTarget implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate currentTime = 0;\n\tprivate lyricLines: LyricLine[] = [];\n\tprivate processedLines: LyricLine[] = [];\n\tprivate lyricLinesEl: LyricLineEl[] = [];\n\tprivate lyricLinesSize: WeakMap<LyricLineEl, [number, number]> =\n\t\tnew WeakMap();\n\tprivate lyricLinesIndexes: WeakMap<LyricLineEl, number> = new WeakMap();\n\tprivate hotLines: Set<number> = new Set();\n\tprivate bufferedLines: Set<number> = new Set();\n\tprivate scrollToIndex = 0;\n\tprivate allowScroll = true;\n\tprivate scrolledHandler = 0;\n\tprivate isScrolled = false;\n\tprivate invokedByScrollEvent = false;\n\tprivate scrollOffset = 0;\n\tprivate hidePassedLines = false;\n\tprivate resizeObserver: ResizeObserver = new ResizeObserver((e) => {\n\t\tconst rect = e[0].contentRect;\n\t\tthis.size[0] = rect.width;\n\t\tthis.size[1] = rect.height;\n\t\tconst styles = getComputedStyle(e[0].target);\n\t\tconst innerWidth =\n\t\t\tthis.element.clientWidth -\n\t\t\tparseFloat(styles.paddingLeft) -\n\t\t\tparseFloat(styles.paddingRight);\n\t\tconst innerHeight =\n\t\t\tthis.element.clientHeight -\n\t\t\tparseFloat(styles.paddingTop) -\n\t\t\tparseFloat(styles.paddingBottom);\n\t\tthis.innerSize[0] = innerWidth;\n\t\tthis.innerSize[1] = innerHeight;\n\t\tthis.rebuildStyle();\n\t\tthis.calcLayout(true, true);\n\t\tthis.lyricLinesEl.forEach((el) => el.updateMaskImage());\n\t});\n\tprivate posXSpringParams: Partial<SpringParams> = {\n\t\tmass: 1,\n\t\tdamping: 10,\n\t\tstiffness: 100,\n\t};\n\tprivate posYSpringParams: Partial<SpringParams> = {\n\t\tmass: 1,\n\t\tdamping: 16.5,\n\t\tstiffness: 100,\n\t};\n\tprivate scaleSpringParams: Partial<SpringParams> = {\n\t\tmass: 1,\n\t\tdamping: 20,\n\t\tstiffness: 100,\n\t};\n\tprivate emUnit = Math.max(Math.min(innerHeight * 0.05, innerWidth * 0.1), 12);\n\tprivate padding = this.emUnit;\n\tprivate enableBlur = true;\n\tprivate enableScale = true;\n\tprivate interludeDots: InterludeDots;\n\tprivate interludeDotsSize: [number, number] = [0, 0];\n\tprivate bottomLine: BottomLineEl;\n\treadonly supportPlusLighter = CSS.supports(\"mix-blend-mode\", \"plus-lighter\");\n\treadonly supportMaskImage = CSS.supports(\"mask-image\", \"none\");\n\tprivate disableSpring = false;\n\tprivate alignAnchor: \"top\" | \"bottom\" | \"center\" = \"center\";\n\tprivate alignPosition = 0.5;\n\tprivate isNonDynamic = false;\n\tprivate scrollBoundary = [0, 0];\n\treadonly size: [number, number] = [0, 0];\n\treadonly innerSize: [number, number] = [0, 0];\n\tprivate readonly onLineClickedHandler = (e: RawLyricLineMouseEvent) => {\n\t\tconst evt = new LyricLineMouseEvent(\n\t\t\tthis.lyricLinesIndexes.get(e.line) ?? -1,\n\t\t\te.line,\n\t\t\te,\n\t\t);\n\t\tif (!this.dispatchEvent(evt)) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\t};\n\t_getIsNonDynamic() {\n\t\treturn this.isNonDynamic;\n\t}\n\t/**\n\t * 设置是否使用物理弹簧算法实现歌词动画效果,默认启用\n\t *\n\t * 如果启用,则会通过弹簧算法实时处理歌词位置,但是需要性能足够强劲的电脑方可流畅运行\n\t *\n\t * 如果不启用,则会回退到基于 `transition` 的过渡效果,对低性能的机器比较友好,但是效果会比较单一\n\t */\n\tsetEnableSpring(enable = true) {\n\t\tthis.disableSpring = !enable;\n\t\tif (enable) {\n\t\t\tthis.element.classList.remove(this.style.classes.disableSpring);\n\t\t} else {\n\t\t\tthis.element.classList.add(this.style.classes.disableSpring);\n\t\t}\n\t\tthis.calcLayout(true);\n\t}\n\t/**\n\t * 获取当前是否启用了物理弹簧\n\t * @returns 是否启用物理弹簧\n\t */\n\tgetEnableSpring() {\n\t\treturn !this.disableSpring;\n\t}\n\t/**\n\t * 是否启用歌词行缩放效果,默认启用\n\t *\n\t * 如果启用,非选中的歌词行会轻微缩小以凸显当前播放歌词行效果\n\t *\n\t * 此效果对性能影响微乎其微,推荐启用\n\t * @param enable 是否启用歌词行缩放效果\n\t */\n\tsetEnableScale(enable = true) {\n\t\tthis.enableScale = enable;\n\t\tthis.calcLayout();\n\t}\n\t/**\n\t * 获取当前是否启用了歌词行缩放效果\n\t * @returns 是否启用歌词行缩放效果\n\t */\n\tgetEnableScale() {\n\t\treturn this.enableScale;\n\t}\n\tpublic readonly style = jss.createStyleSheet({\n\t\tlyricPlayer: {\n\t\t\tuserSelect: \"none\",\n\t\t\tfontSize: \"var(--amll-lyric-player-font-size,max(min(6vh, 8vw), 12px))\",\n\t\t\tpadding: \"1em\",\n\t\t\tmargin: \"-1em\",\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\toverflow: \"hidden\",\n\t\t\tboxSizing: \"content-box\",\n\t\t\tmaxWidth: \"100%\",\n\t\t\tmaxHeight: \"100%\",\n\t\t\tzIndex: 1,\n\t\t\tcolor: \"var(--amll-lyric-view-color,white)\",\n\t\t\tmixBlendMode: \"plus-lighter\",\n\t\t\tcontain: \"strict\",\n\t\t\t\"&:hover\": {\n\t\t\t\t\"& $lyricLine\": {\n\t\t\t\t\tfilter: \"unset !important\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tlyricLine: {\n\t\t\tposition: \"absolute\",\n\t\t\tbackfaceVisibility: \"hidden\",\n\t\t\ttransformOrigin: \"left\",\n\t\t\twidth: \"var(--amll-lyric-player-width,100%)\",\n\t\t\theight: \"fit-content\",\n\t\t\tpadding: \"2vh 1.05em\",\n\t\t\tmargin: \"0 -1em\",\n\t\t\tcontain: \"content\",\n\t\t\twillChange: \"filter,transform,opacity\",\n\t\t\ttransition: \"filter 0.25s, background-color 0.25s, box-shadow 0.25s\",\n\t\t\tboxSizing: \"content-box\",\n\t\t\tborderRadius: \"8px\",\n\t\t\t\"&:has(>*):hover\": {\n\t\t\t\tbackgroundColor: \"var(--amll-lyric-view-hover-bg-color,#fff1)\",\n\t\t\t\tboxShadow: \"0 0 0 8px var(--amll-lyric-view-hover-bg-color,#fff1)\",\n\t\t\t},\n\t\t\t\"&:has(>*):active\": {\n\t\t\t\tboxShadow: \"0 0 0 4px var(--amll-lyric-view-hover-bg-color,#fff1)\",\n\t\t\t},\n\t\t},\n\t\t\"@media (max-width: 1024px)\": {\n\t\t\tlyricLine: {\n\t\t\t\tpadding: \"1vh 1em\",\n\t\t\t},\n\t\t},\n\t\tlyricDuetLine: {\n\t\t\ttextAlign: \"right\",\n\t\t\ttransformOrigin: \"right\",\n\t\t},\n\t\tlyricBgLine: {\n\t\t\topacity: 0,\n\t\t\tfontSize: \"max(50%, 10px)\",\n\t\t\ttransition: \"opacity 0.25s\",\n\t\t\t\"&.active\": {\n\t\t\t\ttransition: \"opacity 0.25s 0.25s\",\n\t\t\t\topacity: 0.4,\n\t\t\t},\n\t\t},\n\t\tlyricMainLine: {\n\t\t\ttransition: \"opacity 0.3s 0.25s\",\n\t\t\twillChange: \"opacity\",\n\t\t\tmargin: \"-1em\",\n\t\t\tpadding: \"1em\",\n\t\t\t\"& span\": {\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t},\n\t\t\t\"& > span, span.emphasize-wrapper\": {\n\t\t\t\twhiteSpace: \"pre-wrap\",\n\t\t\t\twillChange: \"transform,display,mask-image\",\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\t\"&.emphasize, span.emphasize\": {\n\t\t\t\t\tpadding: \"1em\",\n\t\t\t\t\tmargin: \"-1em\",\n\t\t\t\t\t\"& > span\": {\n\t\t\t\t\t\tpadding: \"1em\",\n\t\t\t\t\t\tmargin: \"-1em\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tlyricSubLine: {\n\t\t\tfontSize: \"max(0.5em, 10px)\",\n\t\t\ttransition: \"opacity 0.3s 0.25s\",\n\t\t\topacity: 0.3,\n\t\t},\n\t\tdisableSpring: {\n\t\t\t\"& > *\": {\n\t\t\t\ttransition:\n\t\t\t\t\t\"filter 0.25s, transform 0.5s, background-color 0.25s, box-shadow 0.25s\",\n\t\t\t},\n\t\t},\n\t\tinterludeDots: {\n\t\t\theight: \"clamp(0.5em,1vh,3em)\",\n\t\t\ttransformOrigin: \"center\",\n\t\t\twidth: \"fit-content\",\n\t\t\tpadding: \"2.5% 0\",\n\t\t\tposition: \"absolute\",\n\t\t\tdisplay: \"flex\",\n\t\t\tgap: \"0.25em\",\n\t\t\tleft: \"1em\",\n\t\t\t\"& > *\": {\n\t\t\t\theight: \"clamp(0.5em,1vh,3em)\",\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\tborderRadius: \"50%\",\n\t\t\t\taspectRatio: \"1 / 1\",\n\t\t\t\tbackgroundColor: \"var(--amll-lyric-view-color,white)\",\n\t\t\t\tmarginRight: \"4px\",\n\t\t\t},\n\t\t\t\"&.duet\": {\n\t\t\t\tright: \"1em\",\n\t\t\t\ttransformOrigin: \"center\",\n\t\t\t},\n\t\t},\n\t\t\"@supports (mix-blend-mode: plus-lighter)\": {\n\t\t\tlyricSubLine: {\n\t\t\t\topacity: 0.3,\n\t\t\t},\n\t\t},\n\t\ttmpDisableTransition: {\n\t\t\ttransition: \"none !important\",\n\t\t},\n\t});\n\tprivate _baseFontSize = parseFloat(getComputedStyle(this.element).fontSize);\n\tpublic get baseFontSize() {\n\t\treturn this._baseFontSize;\n\t}\n\tprivate isPageVisible = true;\n\tprivate onPageShow = () => {\n\t\tthis.isPageVisible = true;\n\t\tthis.setCurrentTime(this.currentTime, true);\n\t};\n\tprivate onPageHide = () => {\n\t\tthis.isPageVisible = false;\n\t};\n\tconstructor() {\n\t\tsuper();\n\t\tthis.interludeDots = new InterludeDots(this);\n\t\tthis.bottomLine = new BottomLineEl(this);\n\t\tthis.element.setAttribute(\"class\", this.style.classes.lyricPlayer);\n\t\tif (this.disableSpring) {\n\t\t\tthis.element.classList.add(this.style.classes.disableSpring);\n\t\t}\n\t\tthis.rebuildStyle();\n\t\tthis.resizeObserver.observe(this.element);\n\t\tthis.element.appendChild(this.interludeDots.getElement());\n\t\tthis.element.appendChild(this.bottomLine.getElement());\n\t\tthis.style.attach();\n\t\tthis.interludeDots.setTransform(0, 200);\n\t\twindow.addEventListener(\"pageshow\", this.onPageShow);\n\t\twindow.addEventListener(\"pagehide\", this.onPageHide);\n\t\tlet startScrollY = 0;\n\t\tlet direction: \"up\" | \"down\" | \"none\" = \"none\";\n\t\tlet startTouchPosY = 0;\n\t\tlet startScrollTime = 0;\n\t\tlet scrollSpeed = 0;\n\t\tlet scrollId = Symbol(\"amll-scroll\");\n\t\tlet lastMoveY = 0;\n\t\tlet lastDragTime = 0;\n\t\tthis.element.addEventListener(\"touchstart\", (evt) => {\n\t\t\tif (this.beginScrollHandler()) {\n\t\t\t\tevt.preventDefault();\n\t\t\t\tstartScrollY = this.scrollOffset;\n\t\t\t\tstartTouchPosY = evt.touches[0].screenY;\n\t\t\t\tlastMoveY = startTouchPosY;\n\t\t\t\tstartScrollTime = Date.now();\n\t\t\t\tscrollSpeed = 0;\n\t\t\t}\n\t\t});\n\t\tthis.element.addEventListener(\"touchmove\", (evt) => {\n\t\t\tif (this.beginScrollHandler()) {\n\t\t\t\tevt.preventDefault();\n\t\t\t\tconst touchScreenY = evt.touches[0].screenY;\n\t\t\t\tconst delta = touchScreenY - startTouchPosY;\n\t\t\t\tconst lastDelta = touchScreenY - lastMoveY;\n\t\t\t\tconst targetDirection =\n\t\t\t\t\tlastDelta > 0 ? \"down\" : lastDelta < 0 ? \"up\" : \"none\";\n\t\t\t\tif (direction !== targetDirection) {\n\t\t\t\t\tdirection = targetDirection;\n\t\t\t\t\tstartScrollY = this.scrollOffset;\n\t\t\t\t\tstartTouchPosY = touchScreenY;\n\t\t\t\t\tstartScrollTime = Date.now();\n\t\t\t\t} else {\n\t\t\t\t\tthis.scrollOffset = startScrollY - delta;\n\t\t\t\t}\n\t\t\t\tlastMoveY = touchScreenY;\n\t\t\t\tlastDragTime = Date.now();\n\t\t\t\tthis.limitScrollOffset();\n\t\t\t\tthis.calcLayout(true);\n\t\t\t}\n\t\t});\n\t\tthis.element.addEventListener(\"touchend\", (evt) => {\n\t\t\tif (this.beginScrollHandler()) {\n\t\t\t\tevt.preventDefault();\n\t\t\t\tstartTouchPosY = 0;\n\t\t\t\tconst curTime = Date.now();\n\t\t\t\tif (curTime - lastDragTime > 100) return this.endScrollHandler();\n\t\t\t\tconst scrollDuration = curTime - startScrollTime;\n\t\t\t\tscrollSpeed =\n\t\t\t\t\t((this.scrollOffset - startScrollY) / scrollDuration) * 1000;\n\t\t\t\tlet lt = 0;\n\t\t\t\tconst curScrollId = Symbol(\"amll-scroll\");\n\t\t\t\tscrollId = curScrollId;\n\t\t\t\tconst onScrollFrame = (dt: number) => {\n\t\t\t\t\tlt ||= dt;\n\t\t\t\t\tif (scrollId === curScrollId && this.beginScrollHandler()) {\n\t\t\t\t\t\tthis.scrollOffset += (scrollSpeed * (dt - lt)) / 1000;\n\t\t\t\t\t\tscrollSpeed *= 0.99;\n\t\t\t\t\t\tthis.limitScrollOffset();\n\t\t\t\t\t\tthis.calcLayout(true);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tMath.abs(scrollSpeed) > 1 &&\n\t\t\t\t\t\t\t!this.scrollBoundary.includes(this.scrollOffset)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\trequestAnimationFrame(onScrollFrame);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.endScrollHandler();\n\t\t\t\t\t\tlt = dt;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\trequestAnimationFrame(onScrollFrame);\n\t\t\t\tthis.endScrollHandler();\n\t\t\t}\n\t\t});\n\t\tthis.element.addEventListener(\"wheel\", (evt) => {\n\t\t\tif (this.beginScrollHandler()) {\n\t\t\t\tif (evt.deltaMode === evt.DOM_DELTA_PIXEL) {\n\t\t\t\t\tthis.scrollOffset += evt.deltaY;\n\t\t\t\t\tthis.limitScrollOffset();\n\t\t\t\t\tthis.calcLayout(true);\n\t\t\t\t} else {\n\t\t\t\t\tthis.scrollOffset += evt.deltaY * 50;\n\t\t\t\t\tthis.limitScrollOffset();\n\t\t\t\t\tthis.calcLayout(false);\n\t\t\t\t}\n\t\t\t\tthis.endScrollHandler();\n\t\t\t}\n\t\t});\n\t}\n\tprivate beginScrollHandler() {\n\t\tconst allowed = this.allowScroll;\n\t\tif (allowed) {\n\t\t\tthis.isScrolled = true;\n\t\t\tthis.invokedByScrollEvent = true;\n\t\t\tclearTimeout(this.scrolledHandler);\n\t\t\tthis.scrolledHandler = setTimeout(() => {\n\t\t\t\tthis.isScrolled = false;\n\t\t\t\tthis.scrollOffset = 0;\n\t\t\t}, 5000);\n\t\t}\n\t\treturn allowed;\n\t}\n\tprivate endScrollHandler() {\n\t\tthis.invokedByScrollEvent = false;\n\t}\n\tprivate limitScrollOffset() {\n\t\tthis.scrollOffset = Math.max(\n\t\t\tMath.min(this.scrollBoundary[1], this.scrollOffset),\n\t\t\tthis.scrollBoundary[0],\n\t\t);\n\t}\n\t/**\n\t * 获取当前播放时间里是否处于间奏区间\n\t * 如果是则会返回单位为毫秒的始末时间\n\t * 否则返回 undefined\n\t *\n\t * 这个只允许内部调用\n\t * @returns [开始时间,结束时间,大概处于的歌词行ID,下一句是否为对唱歌词] 或 undefined 如果不处于间奏区间\n\t */\n\tgetCurrentInterlude(): [number, number, number, boolean] | undefined {\n\t\tif (this.bufferedLines.size > 0) return undefined;\n\t\tconst currentTime = this.currentTime + 20;\n\t\tconst i = this.scrollToIndex;\n\t\tif (i === 0) {\n\t\t\tif (this.processedLines[0]?.startTime) {\n\t\t\t\tif (this.processedLines[0].startTime > currentTime) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\tcurrentTime,\n\t\t\t\t\t\tMath.max(currentTime, this.processedLines[0].startTime - 250),\n\t\t\t\t\t\t-2,\n\t\t\t\t\t\tthis.processedLines[0].isDuet,\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (\n\t\t\tthis.processedLines[i]?.endTime &&\n\t\t\tthis.processedLines[i + 1]?.startTime\n\t\t) {\n\t\t\tif (\n\t\t\t\tthis.processedLines[i + 1].startTime > currentTime &&\n\t\t\t\tthis.processedLines[i].endTime < currentTime\n\t\t\t) {\n\t\t\t\treturn [\n\t\t\t\t\tMath.max(this.processedLines[i].endTime, currentTime),\n\t\t\t\t\tthis.processedLines[i + 1].startTime,\n\t\t\t\t\ti,\n\t\t\t\t\tthis.processedLines[i + 1].isDuet,\n\t\t\t\t];\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\t/**\n\t * 重建样式\n\t *\n\t * 这个只允许内部调用\n\t */\n\trebuildStyle() {\n\t\tthis._baseFontSize = parseFloat(getComputedStyle(this.element).fontSize);\n\t\tlet style = \"\";\n\t\tstyle += \"--amll-lyric-player-width:\";\n\t\tstyle += this.innerSize[0] - this.padding * 2;\n\t\tstyle += \"px;\";\n\t\tstyle += \"--amll-lyric-player-height:\";\n\t\tstyle += this.innerSize[1] - this.padding * 2;\n\t\tstyle += \"px;\";\n\t\t// style += \"--amll-player-time:\";\n\t\t// style += this.currentTime;\n\t\t// style += \";\";\n\t\tthis.element.setAttribute(\"style\", style);\n\t}\n\t/**\n\t * 设置是否隐藏已经播放过的歌词行,默认不隐藏\n\t * @param hide 是否隐藏已经播放过的歌词行,默认不隐藏\n\t */\n\tsetHidePassedLines(hide: boolean) {\n\t\tthis.hidePassedLines = hide;\n\t\tthis.calcLayout();\n\t}\n\t/**\n\t * 设置是否启用歌词行的模糊效果\n\t * @param enable 是否启用\n\t */\n\tsetEnableBlur(enable: boolean) {\n\t\tif (this.enableBlur === enable) return;\n\t\tthis.enableBlur = enable;\n\t\tthis.calcLayout();\n\t}\n\t/**\n\t * 设置当前播放歌词,要注意传入后这个数组内的信息不得修改,否则会发生错误\n\t * @param lines 歌词数组\n\t */\n\tsetLyricLines(lines: LyricLine[]) {\n\t\tfor (const line of lines) {\n\t\t\tfor (const word of line.words) {\n\t\t\t\tword.word = word.word.replace(/\\s+/g, \" \");\n\t\t\t}\n\t\t}\n\t\tthis.lyricLines = lines;\n\t\tconst timeOffset = 750;\n\t\tthis.processedLines = lines\n\t\t\t.filter(\n\t\t\t\t(line) =>\n\t\t\t\t\tline.words.reduce((pv, cv) => pv + cv.word.trim().length, 0) > 0,\n\t\t\t)\n\t\t\t.map((line, i, lines) => {\n\t\t\t\tif (line.isBG)\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...line,\n\t\t\t\t\t};\n\n\t\t\t\tif (i === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...line,\n\t\t\t\t\t\tstartTime: Math.max(line.startTime - timeOffset, 0),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst lastLine = lines[i - 1];\n\t\t\t\tconst pastLine = lines[i - 2];\n\t\t\t\tif (lastLine?.isBG && pastLine) {\n\t\t\t\t\tif (pastLine.endTime < line.startTime) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\tMath.max(pastLine.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else if (lastLine?.endTime) {\n\t\t\t\t\tif (lastLine.endTime < line.startTime) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\tMath.max(lastLine?.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...line,\n\t\t\t\t};\n\t\t\t});\n\t\tthis.isNonDynamic = true;\n\t\tfor (const line of this.processedLines) {\n\t\t\tif (line.words.length > 1) {\n\t\t\t\tthis.isNonDynamic = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.processedLines.forEach((line, i, lines) => {\n\t\t\tconst nextLine = lines[i + 1];\n\t\t\tconst lastWord = line.words[line.words.length - 1];\n\t\t\tif (lastWord && shouldEmphasize(lastWord)) {\n\t\t\t\tif (nextLine) {\n\t\t\t\t\tif (nextLine.startTime > line.endTime) {\n\t\t\t\t\t\tline.endTime = Math.min(line.endTime + 1500, nextLine.startTime);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tline.endTime = line.endTime + 1500;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tthis.processedLines.forEach((line, i, lines) => {\n\t\t\tif (line.isBG) return;\n\t\t\tconst nextLine = lines[i + 1];\n\t\t\tif (nextLine?.isBG) {\n\t\t\t\tnextLine.startTime = Math.min(nextLine.startTime, line.startTime);\n\t\t\t}\n\t\t});\n\t\tthis.lyricLinesEl.forEach((line) => {\n\t\t\tline.removeMouseEventListener(\"click\", this.onLineClickedHandler);\n\t\t\tline.removeMouseEventListener(\"contextmenu\", this.onLineClickedHandler);\n\t\t\tline.dispose();\n\t\t});\n\t\t// const prevLinesEl = this.lyricLinesEl;\n\t\tthis.lyricLinesEl = this.processedLines.map((line) => {\n\t\t\t// if (this.lyricLinesEl[i]) {\n\t\t\t// \tthis.lyricLinesEl[i].setLine(line);\n\t\t\t// \treturn this.lyricLinesEl[i];\n\t\t\t// } else {\n\t\t\tconst lineEl = new LyricLineEl(this, line);\n\t\t\tlineEl.addMouseEventListener(\"click\", this.onLineClickedHandler);\n\t\t\tlineEl.addMouseEventListener(\"contextmenu\", this.onLineClickedHandler);\n\t\t\treturn lineEl;\n\t\t\t// }\n\t\t});\n\t\t// while (prevLinesEl.length > this.processedLines.length) {\n\t\t// \tconst rest = prevLinesEl.pop();\n\t\t// \trest?.removeEventListener(\"click\", this.onLineClickedHandler);\n\t\t// \trest?.removeEventListener(\"contextmenu\", this.onLineClickedHandler);\n\t\t// \trest?.dispose();\n\t\t// }\n\t\tthis.lyricLinesEl.forEach((el, i) => {\n\t\t\tthis.element.appendChild(el.getElement());\n\t\t\tthis.lyricLinesIndexes.set(el, i);\n\t\t\tel.updateMaskImage();\n\t\t});\n\t\tthis.interludeDots.setInterlude(undefined);\n\t\tthis.hotLines.clear();\n\t\tthis.bufferedLines.clear();\n\t\tthis.setLinePosXSpringParams({});\n\t\tthis.setLinePosYSpringParams({});\n\t\tthis.setLineScaleSpringParams({});\n\t\tthis.setCurrentTime(0, true);\n\t\tthis.calcLayout(true, true);\n\t}\n\t/**\n\t * 重置用户滚动状态\n\t *\n\t * 请在用户完成滚动点击跳转歌词时调用本事件再调用 `calcLayout` 以正确滚动到目标位置\n\t */\n\tresetScroll() {\n\t\tthis.isScrolled = false;\n\t\tthis.scrollOffset = 0;\n\t\tthis.invokedByScrollEvent = false;\n\t\tclearTimeout(this.scrolledHandler);\n\t\tthis.scrolledHandler = 0;\n\t}\n\t/**\n\t * 重新布局定位歌词行的位置,调用完成后再逐帧调用 `update`\n\t * 函数即可让歌词通过动画移动到目标位置。\n\t *\n\t * 函数有一个 `force` 参数,用于指定是否强制修改布局,也就是不经过动画直接调整元素位置和大小。\n\t *\n\t * 此函数还有一个 `reflow` 参数,用于指定是否需要重新计算布局\n\t *\n\t * 因为计算布局必定会导致浏览器重排布局,所以会大幅度影响流畅度和性能,故请只在以下情况下将其​设置为 true:\n\t *\n\t * 1. 歌词页面大小发生改变时(这个组件会自行处理)\n\t * 2. 加载了新的歌词时(不论前后歌词是否完全一样)\n\t * 3. 用户自行跳转了歌曲播放位置(不论距离远近)\n\t *\n\t * @param force 是否不经过动画直接修改布局定位\n\t * @param reflow 是否进行重新布局(重新计算每行歌词大小)\n\t */\n\tcalcLayout(force = false, reflow = false) {\n\t\tif (reflow) {\n\t\t\tthis.emUnit = parseFloat(getComputedStyle(this.element).fontSize);\n\t\t\tthis.lyricLinesEl.forEach((el) => {\n\t\t\t\tconst size: [number, number] = el.measureSize();\n\t\t\t\tthis.lyricLinesSize.set(el, size);\n\t\t\t\tel.lineSize = size;\n\t\t\t});\n\t\t\tthis.interludeDotsSize[0] = this.interludeDots.getElement().clientWidth;\n\t\t\tthis.interludeDotsSize[1] = this.interludeDots.getElement().clientHeight;\n\n\t\t\tthis.bottomLine.lineSize = this.bottomLine.measureSize();\n\t\t}\n\t\tconst interlude = this.getCurrentInterlude();\n\t\tlet curPos = -this.scrollOffset;\n\t\tlet targetAlignIndex = this.scrollToIndex;\n\t\tlet interludeDuration = 0;\n\t\tif (interlude) {\n\t\t\tinterludeDuration = interlude[1] - interlude[0];\n\t\t\tif (interludeDuration >= 5000) {\n\t\t\t\tconst nextLine = this.lyricLinesEl[interlude[2] + 1];\n\t\t\t\tif (nextLine) {\n\t\t\t\t\ttargetAlignIndex = interlude[2] + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.interludeDots.setInterlude(undefined);\n\t\t}\n\t\tconst SCALE_ASPECT = this.enableScale ? 0.95 : 1;\n\t\tconst scrollOffset = this.lyricLinesEl\n\t\t\t.slice(0, targetAlignIndex)\n\t\t\t.reduce(\n\t\t\t\t(acc, el) =>\n\t\t\t\t\tacc + (el.getLine().isBG ? 0 : this.lyricLinesSize.get(el)?.[1] ?? 0),\n\t\t\t\t0,\n\t\t\t);\n\t\tthis.scrollBoundary[0] = -scrollOffset;\n\t\tcurPos -= scrollOffset;\n\t\tcurPos += this.size[1] * this.alignPosition;\n\t\tconst curLine = this.lyricLinesEl[targetAlignIndex];\n\t\tif (curLine) {\n\t\t\tconst lineHeight = this.lyricLinesSize.get(curLine)?.[1] ?? 0;\n\t\t\tswitch (this.alignAnchor) {\n\t\t\t\tcase \"bottom\":\n\t\t\t\t\tcurPos -= lineHeight;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"center\":\n\t\t\t\t\tcurPos -= lineHeight / 2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"top\":\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tconst latestIndex = Math.max(...this.bufferedLines);\n\t\tlet delay = 0;\n\t\tlet baseDelay = 0.05;\n\t\tlet setDots = false;\n\t\t// console.groupCollapsed(\"calcLayout\");\n\t\tthis.lyricLinesEl.forEach((el, i) => {\n\t\t\tconst hasBuffered = this.bufferedLines.has(i);\n\t\t\tconst isActive =\n\t\t\t\thasBuffered || (i >= this.scrollToIndex && i < latestIndex);\n\t\t\tconst line = el.getLine();\n\t\t\tlet left = 0;\n\t\t\tif (line.isDuet) {\n\t\t\t\tleft = this.size[0] - (this.lyricLinesSize.get(el)?.[0] ?? 0);\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!setDots &&\n\t\t\t\tinterludeDuration >= 5000 &&\n\t\t\t\t((i === this.scrollToIndex && interlude?.[2] === -2) ||\n\t\t\t\t\ti === this.scrollToIndex + 1)\n\t\t\t) {\n\t\t\t\tsetDots = true;\n\t\t\t\tthis.interludeDots.setTransform(this.padding - 20, curPos + 10);\n\t\t\t\tif (interlude) {\n\t\t\t\t\tthis.interludeDots.setInterlude([interlude[0], interlude[1]]);\n\t\t\t\t}\n\t\t\t\tcurPos += this.interludeDotsSize[1] + 40;\n\t\t\t}\n\t\t\tlet targetOpacity = 1;\n\t\t\tif (!isActive && i <= (interlude ? interlude[2] : this.scrollToIndex)) {\n\t\t\t\tif (this.hidePassedLines) {\n\t\t\t\t\ttargetOpacity = 0;\n\t\t\t\t} else if (this.isNonDynamic) {\n\t\t\t\t\ttargetOpacity = 0.25;\n\t\t\t\t} else {\n\t\t\t\t\ttargetOpacity = 0.15;\n\t\t\t\t}\n\t\t\t} else if (hasBuffered) {\n\t\t\t\tif (this.isNonDynamic) {\n\t\t\t\t\ttargetOpacity = 0.85;\n\t\t\t\t} else {\n\t\t\t\t\ttargetOpacity = 1;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this.isNonDynamic) {\n\t\t\t\t\ttargetOpacity = 0.25;\n\t\t\t\t} else {\n\t\t\t\t\ttargetOpacity = 0.5;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.invokedByScrollEvent) {\n\t\t\t\tif (this.isNonDynamic) {\n\t\t\t\t\ttargetOpacity = 0.85;\n\t\t\t\t} else {\n\t\t\t\t\ttargetOpacity = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet blurLevel = 0;\n\t\t\tif (this.enableBlur) {\n\t\t\t\tif (isActive) {\n\t\t\t\t\tblurLevel = 0;\n\t\t\t\t} else {\n\t\t\t\t\tblurLevel = 1;\n\t\t\t\t\tif (i < this.scrollToIndex) {\n\t\t\t\t\t\tblurLevel += Math.abs(this.scrollToIndex - i) / 2;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tblurLevel += Math.abs(\n\t\t\t\t\t\t\ti - Math.max(this.scrollToIndex, latestIndex),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.invokedByScrollEvent) {\n\t\t\t\tblurLevel = 0;\n\t\t\t}\n\t\t\tel.setTransform(\n\t\t\t\tthis.padding,\n\t\t\t\tcurPos,\n\t\t\t\tisActive ? 1 : SCALE_ASPECT,\n\t\t\t\ttargetOpacity,\n\t\t\t\tblurLevel * 1.5,\n\t\t\t\tforce,\n\t\t\t\tdelay,\n\t\t\t);\n\t\t\t// console.log(i, el._getDebugTargetPos());\n\t\t\tif (line.isBG && isActive) {\n\t\t\t\tcurPos += this.lyricLinesSize.get(el)?.[1] ?? 0;\n\t\t\t} else if (!line.isBG) {\n\t\t\t\tcurPos += this.lyricLinesSize.get(el)?.[1] ?? 0;\n\t\t\t}\n\t\t\tif (curPos >= 0) {\n\t\t\t\tdelay += baseDelay;\n\t\t\t\tbaseDelay /= 1.2;\n\t\t\t}\n\t\t});\n\t\tthis.scrollBoundary[1] = curPos + this.scrollOffset - this.size[1] / 2;\n\t\t// console.groupEnd();\n\t\tthis.bottomLine.setTransform(this.padding, curPos, force, delay);\n\t}\n\t/**\n\t * 获取当前歌词的播放位置\n\t *\n\t * 一般和最后调用 `setCurrentTime` 给予的参数一样\n\t * @returns 当前播放位置\n\t */\n\tgetCurrentTime() {\n\t\treturn this.currentTime;\n\t}\n\t/**\n\t * 获取当前歌词数组\n\t *\n\t * 一般和最后调用 `setLyricLines` 给予的参数一样\n\t * @returns 当前歌词数组\n\t */\n\tgetLyricLines() {\n\t\treturn this.lyricLines;\n\t}\n\tgetElement(): HTMLElement {\n\t\treturn this.element;\n\t}\n\t/**\n\t * 获取一个特殊的底栏元素,默认是空白的,可以往内部添加任意元素\n\t *\n\t * 这个元素始终在歌词的底部,可以用于显示歌曲创作者等信息\n\t *\n\t * 但是请勿删除该元素,只能在内部存放元素\n\t *\n\t * @returns 一个元素,可以往内部添加任意元素\n\t */\n\tgetBottomLineElement(): HTMLElement {\n\t\treturn this.bottomLine.getElement();\n\t}\n\t/**\n\t * 设置目标歌词行的对齐方式,默认为 `center`\n\t *\n\t * - 设置成 `top` 的话将会向目标歌词行的顶部对齐\n\t * - 设置成 `bottom` 的话将会向目标歌词行的底部对齐\n\t * - 设置成 `center` 的话将会向目标歌词行的垂直中心对齐\n\t * @param alignAnchor 歌词行对齐方式,详情见函数说明\n\t */\n\tsetAlignAnchor(alignAnchor: \"top\" | \"bottom\" | \"center\") {\n\t\tthis.alignAnchor = alignAnchor;\n\t}\n\t/**\n\t * 设置默认的歌词行对齐位置,相对于整个歌词播放组件的大小位置,默认为 `0.5`\n\t * @param alignPosition 一个 `[0.0-1.0]` 之间的任意数字,代表组件高度由上到下的比例位置\n\t */\n\tsetAlignPosition(alignPosition: number) {\n\t\tthis.alignPosition = alignPosition;\n\t}\n\t/**\n\t * 设置当前播放进度,单位为毫秒且**必须是整数**,此时将会更新内部的歌词进度信息\n\t * 内部会根据调用间隔和播放进度自动决定如何滚动和显示歌词,所以这个的调用频率越快越准确越好\n\t *\n\t * 调用完成后,可以每帧调用 `update` 函数来执行歌词动画效果\n\t * @param time 当前播放进度,单位为毫秒\n\t */\n\tsetCurrentTime(time: number, isSeek = false) {\n\t\t// 我在这里定义了歌词的选择状态:\n\t\t// 普通行:当前不处于时间范围内的歌词行\n\t\t// 热行:当前绝对处于播放时间内的歌词行,且一般会被立刻加入到缓冲行中\n\t\t// 缓冲行:一般处于播放时间后的歌词行,会因为当前播放状态的缘故推迟解除状态\n\n\t\t// 然后我们需要让歌词行为如下:\n\t\t// 如果当前仍有缓冲行的情况下加入新热行,则不会解除当前缓冲行,且也不会修改当前滚动位置\n\t\t// 如果当前所有缓冲行都将被删除且没有新热行加入,则删除所有缓冲行,且也不会修改当前滚动位置\n\t\t// 如果当前所有缓冲行都将被删除且有新热行加入,则删除所有缓冲行并加入新热行作为缓冲行,然后修改当前滚动位置\n\t\tthis.currentTime = time;\n\t\tif (!this.isPageVisible) return;\n\t\tif (!this._getIsNonDynamic() && !this.supportMaskImage)\n\t\t\tthis.element.style.setProperty(\"--amll-player-time\", `${time}`);\n\t\tif (this.isScrolled) return;\n\t\tconst removedHotIds = new Set<number>();\n\t\tconst removedIds = new Set<number>();\n\t\tconst addedIds = new Set<number>();\n\n\t\tif (isSeek) {\n\t\t\tfor (const line of this.lyricLinesEl) {\n\t\t\t\tline.setMaskAnimationState(time);\n\t\t\t}\n\t\t}\n\n\t\t// 先检索当前已经超出时间范围的缓冲行,列入待删除集内\n\t\tthis.hotLines.forEach((lastHotId) => {\n\t\t\tconst line = this.processedLines[lastHotId];\n\t\t\tif (line) {\n\t\t\t\tif (line.isBG) return;\n\t\t\t\tconst nextLine = this.processedLines[lastHotId + 1];\n\t\t\t\tif (nextLine?.isBG) {\n\t\t\t\t\tconst nextMainLine = this.processedLines[lastHotId + 2];\n\t\t\t\t\tconst startTime = Math.min(line.startTime, nextLine?.startTime);\n\t\t\t\t\tconst endTime = Math.min(\n\t\t\t\t\t\tMath.max(line.endTime, nextMainLine?.startTime ?? Number.MAX_VALUE),\n\t\t\t\t\t\tMath.max(line.endTime, nextLine?.endTime),\n\t\t\t\t\t);\n\t\t\t\t\tif (startTime > time || endTime <= time) {\n\t\t\t\t\t\tthis.hotLines.delete(lastHotId);\n\t\t\t\t\t\tremovedHotIds.add(lastHotId);\n\t\t\t\t\t\tthis.hotLines.delete(lastHotId + 1);\n\t\t\t\t\t\tremovedHotIds.add(lastHotId + 1);\n\t\t\t\t\t\tif (isSeek) {\n\t\t\t\t\t\t\tthis.lyricLinesEl[lastHotId].disable(time);\n\t\t\t\t\t\t\tthis.lyricLinesEl[lastHotId + 1].disable(time);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (line.startTime > time || line.endTime <= time) {\n\t\t\t\t\tthis.hotLines.delete(lastHotId);\n\t\t\t\t\tremovedHotIds.add(lastHotId);\n\t\t\t\t\tif (isSeek) this.lyricLinesEl[lastHotId].disable(time);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.hotLines.delete(lastHotId);\n\t\t\t\tremovedHotIds.add(lastHotId);\n\t\t\t\tif (isSeek) this.lyricLinesEl[lastHotId].disable(time);\n\t\t\t}\n\t\t});\n\t\tthis.processedLines.forEach((line, id, arr) => {\n\t\t\tif (!line.isBG && line.startTime <= time && line.endTime > time) {\n\t\t\t\tif (!this.hotLines.has(id)) {\n\t\t\t\t\tthis.hotLines.add(id);\n\t\t\t\t\taddedIds.add(id);\n\t\t\t\t\tif (isSeek) this.lyricLinesEl[id].enable(time);\n\t\t\t\t\tif (arr[id + 1]?.isBG) {\n\t\t\t\t\t\tthis.hotLines.add(id + 1);\n\t\t\t\t\t\taddedIds.add(id + 1);\n\t\t\t\t\t\tif (isSeek) this.lyricLinesEl[id + 1].enable(time);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tthis.bufferedLines.forEach((v) => {\n\t\t\tif (!this.hotLines.has(v)) {\n\t\t\t\tremovedIds.add(v);\n\t\t\t\tif (isSeek) this.lyricLinesEl[v].disable(time);\n\t\t\t}\n\t\t});\n\t\tif (isSeek) {\n\t\t\tif (this.bufferedLines.size > 0) {\n\t\t\t\tthis.scrollToIndex = Math.min(...this.bufferedLines);\n\t\t\t} else {\n\t\t\t\tthis.scrollToIndex = this.processedLines.findIndex(\n\t\t\t\t\t(line) => line.startTime >= time,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.bufferedLines.clear();\n\t\t\tthis.hotLines.forEach((v) => this.bufferedLines.add(v));\n\t\t\tthis.calcLayout(true);\n\t\t} else if (removedIds.size > 0 || addedIds.size > 0) {\n\t\t\t// function debugLog() {\n\t\t\t// \tconsole.groupCollapsed(\"setCurrentTime\", time);\n\t\t\t// \tconsole.log(\"removedIds\", removedIds);\n\t\t\t// \tconsole.log(\"addedIds\", addedIds);\n\t\t\t// \tconsole.groupEnd();\n\t\t\t// }\n\t\t\tif (removedIds.size === 0 && addedIds.size > 0) {\n\t\t\t\t// debugLog();\n\t\t\t\taddedIds.forEach((v) => {\n\t\t\t\t\tthis.bufferedLines.add(v);\n\t\t\t\t\tthis.lyricLinesEl[v].enable(time);\n\t\t\t\t});\n\t\t\t\tthis.scrollToIndex = Math.min(...this.bufferedLines);\n\t\t\t\tthis.calcLayout();\n\t\t\t} else if (addedIds.size === 0 && removedIds.size > 0) {\n\t\t\t\tif (eqSet(removedIds, this.bufferedLines)) {\n\t\t\t\t\t// debugLog();\n\t\t\t\t\tthis.bufferedLines.forEach((v) => {\n\t\t\t\t\t\tif (!this.hotLines.has(v)) {\n\t\t\t\t\t\t\tthis.bufferedLines.delete(v);\n\t\t\t\t\t\t\tthis.lyricLinesEl[v].disable(time);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tthis.calcLayout();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// debugLog();\n\t\t\t\taddedIds.forEach((v) => {\n\t\t\t\t\tthis.bufferedLines.add(v);\n\t\t\t\t\tthis.lyricLinesEl[v].enable(time);\n\t\t\t\t});\n\t\t\t\tremovedIds.forEach((v) => {\n\t\t\t\t\tthis.bufferedLines.delete(v);\n\t\t\t\t\tthis.lyricLinesEl[v].disable(time);\n\t\t\t\t});\n\t\t\t\tif (this.bufferedLines.size > 0)\n\t\t\t\t\tthis.scrollToIndex = Math.min(...this.bufferedLines);\n\t\t\t\tthis.calcLayout();\n\t\t\t}\n\t\t}\n\t}\n\t/**\n\t * 暂停部分效果演出,目前会暂停播放间奏点的动画\n\t */\n\tpause() {\n\t\tthis.interludeDots.pause();\n\t\tfor (const line of this.lyricLinesEl) {\n\t\t\tline.pause();\n\t\t}\n\t}\n\t/**\n\t * 恢复部分效果演出,目前会恢复播放间奏点的动画\n\t */\n\tresume() {\n\t\tthis.interludeDots.resume();\n\t\tfor (const line of this.lyricLinesEl) {\n\t\t\tline.resume();\n\t\t}\n\t}\n\t/**\n\t * 更新动画,这个函数应该被逐帧调用或者在以下情况下调用一次:\n\t *\n\t * 1. 刚刚调用完设置歌词函数的时候\n\t * @param delta 距离上一次被调用到现在的时长,单位为毫秒(可为浮点数)\n\t */\n\tupdate(delta = 0) {\n\t\tif (!this.isPageVisible) return;\n\t\tconst deltaS = delta / 1000;\n\t\tthis.interludeDots.update(delta);\n\t\tthis.bottomLine.update(deltaS);\n\t\tthis.lyricLinesEl.forEach((line) => line.update(deltaS));\n\t}\n\t/**\n\t * 设置所有歌词行在横坐标上的弹簧属性,包括重量、弹力和阻力。\n\t *\n\t * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样\n\t */\n\tsetLinePosXSpringParams(params: Partial<SpringParams>) {\n\t\tthis.posXSpringParams = {\n\t\t\t...this.posXSpringParams,\n\t\t\t...params,\n\t\t};\n\t\tthis.bottomLine.lineTransforms.posX.updateParams(this.posXSpringParams);\n\t\tthis.lyricLinesEl.forEach((line) =>\n\t\t\tline.lineTransforms.posX.updateParams(this.posXSpringParams),\n\t\t);\n\t}\n\t/**\n\t * 设置所有歌词行在​纵坐标上的弹簧属性,包括重量、弹力和阻力。\n\t *\n\t * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样\n\t */\n\tsetLinePosYSpringParams(params: Partial<SpringParams>) {\n\t\tthis.posYSpringParams = {\n\t\t\t...this.posYSpringParams,\n\t\t\t...params,\n\t\t};\n\t\tthis.bottomLine.lineTransforms.posY.updateParams(this.posYSpringParams);\n\t\tthis.lyricLinesEl.forEach((line) =>\n\t\t\tline.lineTransforms.posY.updateParams(this.posYSpringParams),\n\t\t);\n\t}\n\t/**\n\t * 设置所有歌词行在​缩放大小上的弹簧属性,包括重量、弹力和阻力。\n\t *\n\t * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样\n\t */\n\tsetLineScaleSpringParams(params: Partial<SpringParams>) {\n\t\tthis.scaleSpringParams = {\n\t\t\t...this.scaleSpringParams,\n\t\t\t...params,\n\t\t};\n\t\tthis.lyricLinesEl.forEach((line) =>\n\t\t\tline.lineTransforms.scale.updateParams(this.scaleSpringParams),\n\t\t);\n\t}\n\tdispose(): void {\n\t\tthis.element.remove();\n\t\tthis.resizeObserver.disconnect();\n\t\tthis.style.detach();\n\t\tthis.lyricLinesEl.forEach((el) => el.dispose());\n\t\twindow.removeEventListener(\"pageshow\", this.onPageShow);\n\t\tthis.bottomLine.dispose();\n\t\tthis.interludeDots.dispose();\n\t}\n}\n"],"names":["AbstractBaseRenderer","BaseRenderer","canvas","__publicField","width","height","scale","speed","TimedContainer","Container","PixiRenderer","delta","lastContainer","s1","s2","s3","s4","maxSize","Application","minBorder","maxBorder","c0","ColorMatrixFilter","c1","c2","_a","filter","BlurFilter","BulgePinchFilter","enable","fps","_volume","_hasLyric","albumUrl","img","remainRetryTimes","tex","_b","Texture","error","container","Sprite","vertShader","fragShader","blendShader","eplorShader","noiseShader","noiseImage","NOISE_IMAGE_DATA","blurImage","imageData","radius","quality","pixels","rsum","gsum","bsum","asum","x","y","i","p","p1","p2","yp","yi","yw","wm","hm","rad1x","divx","rad1y","divy","div2","r","g","b","a","vmin","vmax","saturateImage","saturation","gray","contrastImage","contrast","GLProgram","gl","vertexShaderSource","fragmentShaderSource","label","coordPos","type","source","shader","program","errLog","name","value","location","value1","value2","Framebuffer","fb","texture","GLBuffer","data","usage","buffer","AlbumTexture","mainProgram","vertexBuffer","indexBuffer","albumImageData","albumTexture","sampler","NoiseTexture","_EplorRenderer","bounds","tickTime","frameDelta","realWidth","realHeight","t","fba","fbb","sprite","deleted","isOnlyOneSprite","isTweeningValues","src","dst","volume","imageUrl","resolve","reject","c","ctx","blurRadius","imgw","imgh","hasLyric","s","EplorRenderer","BackgroundRender","renderer","eqSet","xs","ys","derivative","f","getVelocity","Spring","currentPosition","curV","solveSpring","targetPosition","params","delay","from","velocity","to","soft","stiffness","damping","mass","angular_frequency","leftover","damping_frequency","dfm","dm","BottomLineEl","lyricPlayer","style","left","top","force","l","pr","pb","easeInOutBack","clamp","min","cur","max","InterludeDots","interlude","curStyle","interludeDuration","currentDuration","breatheDuration","globalOpacity","dotsDuration","dot0Opacity","dot1Opacity","dot2Opacity","createMatrix4","scaleMatrix4","m","origin","ox","oy","matrix4ToCSS","fractionDigits","format","n","NEWTON_ITERATIONS","NEWTON_MIN_SLOPE","SUBDIVISION_PRECISION","SUBDIVISION_MAX_ITERATIONS","kSplineTableSize","kSampleStepSize","float32ArraySupported","A","aA1","aA2","B","C","calcBezier","aT","getSlope","binarySubdivide","aX","aA","aB","mX1","mX2","currentX","currentT","newtonRaphsonIterate","aGuessT","currentSlope","LinearEasing","mY1","mY2","sampleValues","getTForX","intervalStart","currentSample","lastSample","dist","guessForT","initialSlope","CJKEXP","ANIMATION_FRAME_QUANTITY","norNum","EMP_EASING_MID","beginNum","endNum","makeEmpEasing","mid","bezIn","bezier","bezOut","defaultEmpEasing","generateFadeGradient","padding","bright","dark","totalAspect","widthInTotal","leftPos","chunkAndSplitLyricWords","words","resplitedWords","w","realLength","splited","v","charPos","word","wordChunk","wChunk","result","shouldEmphasize","RawLyricLineMouseEvent","line","event","LyricLineEl","lyricLine","wrapped","listener","main","trans","roman","callback","options","listeners","maskAnimationTime","size","chunkedWords","chunk","merged","emp","wrapperWordEl","characterElements","mainWordEl","charEls","char","charEl","realWord","duration","wordEl","up","de","du","method","amount","blur","animateDu","empEasing","el","arr","wordDe","frames","_","transX","glowLevel","mat","ani","fadeWidth","maskImage","totalAspectStr","maskPos","totalDuration","widthBeforeSelf","minOffset","clampOffset","curPos","timeOffset","lastPos","lastTime","pushFrame","moveOffset","time","d","staticTime","frame","lastTimeStamp","otherWord","j","curTimeStamp","staticDuration","fadeDuration","err","opacity","roundedBlur","beforeInSight","enableSpring","afterInSight","jss","create","preset","LyricLineMouseEvent","lineIndex","LyricPlayer","rect","styles","innerWidth","innerHeight","evt","startScrollY","direction","startTouchPosY","startScrollTime","scrollSpeed","scrollId","lastMoveY","lastDragTime","touchScreenY","lastDelta","targetDirection","curTime","scrollDuration","lt","curScrollId","onScrollFrame","dt","allowed","currentTime","_c","hide","lines","pv","cv","lastLine","pastLine","nextLine","lastWord","lineEl","reflow","targetAlignIndex","SCALE_ASPECT","scrollOffset","acc","curLine","lineHeight","latestIndex","baseDelay","setDots","hasBuffered","isActive","targetOpacity","blurLevel","alignAnchor","alignPosition","isSeek","removedHotIds","removedIds","addedIds","lastHotId","nextMainLine","startTime","endTime","id","deltaS"],"mappings":"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","x_google_ignoreList":[16]}
1
+ {"version":3,"file":"amll-core.js","sources":["../src/bg-render/base.ts","../src/utils/resource.ts","../src/bg-render/pixi-renderer.ts","../src/bg-render/shaders/base.vert.glsl?raw","../src/bg-render/shaders/base.frag.glsl?raw","../src/bg-render/shaders/blend.frag.glsl?raw","../src/bg-render/shaders/eplor.frag.glsl?raw","../src/bg-render/shaders/noise.frag.glsl?raw","../src/assets/noise 5.png?inline","../src/bg-render/eplor-renderer.ts","../src/bg-render/index.ts","../src/utils/eq-set.ts","../src/utils/derivative.ts","../src/utils/spring.ts","../src/lyric-player/bottom-line.ts","../src/lyric-player/interlude-dots.ts","../src/utils/matrix.ts","../../../node_modules/bezier-easing/src/index.js","../src/lyric-player/lyric-line.ts","../src/lyric-player/index.ts"],"sourcesContent":["import { Disposable, HasElement } from \"../interfaces\";\n\nexport abstract class AbstractBaseRenderer implements Disposable, HasElement {\n\t/**\n\t * 修改背景的流动速度,数字越大越快,默认为 2\n\t * @param speed 背景的流动速度,默认为 2\n\t */\n\tabstract setFlowSpeed(speed: number): void;\n\t/**\n\t * 修改背景的渲染比例,默认是 0.5\n\t *\n\t * 一般情况下这个程度既没有明显瑕疵也不会特别吃性能\n\t * @param scale 背景的渲染比例\n\t */\n\tabstract setRenderScale(scale: number): void;\n\t/**\n\t * 是否启用静态模式,即图片在更换后就会保持静止状态并禁用更新,以节省性能\n\t * @param enable 是否启用静态模式\n\t */\n\tabstract setStaticMode(enable: boolean): void;\n\t/**\n\t * 修改背景动画帧率,默认是 30 FPS\n\t *\n\t * 如果设置成 0 则会停止动画\n\t * @param fps 目标帧率,默认 30 FPS\n\t */\n\tabstract setFPS(fps: number): void;\n\t/**\n\t * 暂停背景动画,画面即便是更新了图片也不会发生变化\n\t */\n\tabstract pause(): void;\n\t/**\n\t * 恢复播放背景动画\n\t */\n\tabstract resume(): void;\n\t/**\n\t * 设置背景专辑资源,纹理加载并设置完成后会返回\n\t * @param albumSource 专辑的资源链接,可以是图片或视频链接,抑或是任意 img/video 元素,如果提供字符串链接且为视频则需要指定第二个参数\n\t */\n\tabstract setAlbum(\n\t\talbumSource: string | HTMLImageElement | HTMLVideoElement,\n\t\tisVideo?: boolean,\n\t): Promise<void>;\n\t/**\n\t * 设置低频的音量大小,范围在 80hz-120hz 之间为宜,取值范围在 [0.0-1.0] 之间\n\t *\n\t * 部分渲染器会根据音量大小调整背景效果(例如根据鼓点跳动)\n\t *\n\t * 如果无法获取到类似的数据,请传入 1.0 作为默认值,或不做任何处理(默认值即 1.0)\n\t * @param volume 低频的音量大小,范围在 50hz-120hz 之间为宜,取值范围在 [0.0-1.0] 之间\n\t */\n\tabstract setLowFreqVolume(volume: number): void;\n\t/**\n\t * 设置背景是否根据“是否有歌词”这个特征调整自身效果,例如有歌词时会变得更加活跃\n\t *\n\t * 部分渲染器会根据这个特征调整自身效果\n\t *\n\t * 如果不确定是否需要赋值或无法知晓是否包含歌词,请传入 true 或不做任何处理(默认值为 true)\n\t *\n\t * @param hasLyric 是否有歌词,如不确定是否需要赋值,请传入 true 或不做任何处理(默认值为 true)\n\t */\n\tabstract setHasLyric(hasLyric: boolean): void;\n\tabstract dispose(): void;\n\tabstract getElement(): HTMLElement;\n}\n\nexport abstract class BaseRenderer extends AbstractBaseRenderer {\n\tprivate observer: ResizeObserver;\n\tprotected flowSpeed = 2;\n\tprotected currerntRenderScale = 0.75;\n\tconstructor(protected canvas: HTMLCanvasElement) {\n\t\tsuper();\n\t\tthis.observer = new ResizeObserver(() => {\n\t\t\tconst width = Math.max(\n\t\t\t\t1,\n\t\t\t\tcanvas.clientWidth * window.devicePixelRatio * this.currerntRenderScale,\n\t\t\t);\n\t\t\tconst height = Math.max(\n\t\t\t\t1,\n\t\t\t\tcanvas.clientHeight *\n\t\t\t\t\twindow.devicePixelRatio *\n\t\t\t\t\tthis.currerntRenderScale,\n\t\t\t);\n\t\t\tthis.onResize(width, height);\n\t\t});\n\t\tthis.observer.observe(canvas);\n\t}\n\tsetRenderScale(scale: number) {\n\t\tthis.currerntRenderScale = scale;\n\t\tthis.onResize(\n\t\t\tthis.canvas.clientWidth *\n\t\t\t\twindow.devicePixelRatio *\n\t\t\t\tthis.currerntRenderScale,\n\t\t\tthis.canvas.clientHeight *\n\t\t\t\twindow.devicePixelRatio *\n\t\t\t\tthis.currerntRenderScale,\n\t\t);\n\t}\n\t/**\n\t * 当画板元素大小发生变化时此函数会被调用\n\t * 可以在此处重设和渲染器相关的尺寸设置\n\t * 考虑到初始化的时候元素不一定在文档中或出于某些特殊样式状态,尺寸长宽有可能会为 0,请注意进行特判处理\n\t * @param width 画板元素实际的物理像素宽度,有可能为 0\n\t * @param height 画板元素实际的物理像素高度,有可能为 0\n\t */\n\tprotected onResize(width: number, height: number): void {\n\t\tthis.canvas.width = width;\n\t\tthis.canvas.height = height;\n\t}\n\t/**\n\t * 修改背景的流动速度,数字越大越快,默认为 2\n\t * @param speed 背景的流动速度,默认为 2\n\t */\n\tsetFlowSpeed(speed: number) {\n\t\tthis.flowSpeed = speed;\n\t}\n\t/**\n\t * 是否启用静态模式,即图片在更换后就会保持静止状态并禁用更新,以节省性能\n\t * @param enable 是否启用静态模式\n\t */\n\tabstract setStaticMode(enable: boolean): void;\n\t/**\n\t * 修改背景动画帧率,默认是 30 FPS\n\t *\n\t * 如果设置成 0 则会停止动画\n\t * @param fps 目标帧率,默认 30 FPS\n\t */\n\tabstract setFPS(fps: number): void;\n\t/**\n\t * 暂停背景动画,画面即便是更新了图片也不会发生变化\n\t */\n\tabstract pause(): void;\n\t/**\n\t * 恢复播放背景动画\n\t */\n\tabstract resume(): void;\n\t/**\n\t * 设置背景专辑资源,纹理加载并设置完成后会返回\n\t * @param albumSource 专辑的资源链接,可以是图片或视频链接,抑或是任意 img/video 元素,如果提供字符串链接且为视频则需要指定第二个参数\n\t */\n\tabstract setAlbum(\n\t\talbumSource: string | HTMLImageElement | HTMLVideoElement,\n\t\tisVideo?: boolean,\n\t): Promise<void>;\n\tdispose(): void {\n\t\tthis.observer.disconnect();\n\t\tthis.canvas.remove();\n\t}\n}\n","export function loadImage(imageUrl: string): Promise<HTMLImageElement> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst img = document.createElement(\"img\");\n\t\timg.onload = () => resolve(img);\n\t\timg.onerror = reject;\n\t\timg.src = imageUrl;\n\t\timg.crossOrigin = \"anonymous\";\n\t\timg\n\t\t\t.decode()\n\t\t\t.then(() => resolve(img))\n\t\t\t.catch(reject);\n\t});\n}\n\nexport function loadVideo(videoUrl: string): Promise<HTMLVideoElement> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst video = document.createElement(\"video\");\n\t\tlet playing = false;\n\t\tlet timeupdate = false;\n\t\tlet rejected = false;\n\t\tvideo.addEventListener(\n\t\t\t\"playing\",\n\t\t\t() => {\n\t\t\t\tplaying = true;\n\t\t\t\tcheckReady();\n\t\t\t},\n\t\t\ttrue,\n\t\t);\n\t\tvideo.addEventListener(\n\t\t\t\"timeupdate\",\n\t\t\t() => {\n\t\t\t\ttimeupdate = true;\n\t\t\t\tcheckReady();\n\t\t\t},\n\t\t\ttrue,\n\t\t);\n\t\tvideo.addEventListener(\n\t\t\t\"error\",\n\t\t\t(err) => {\n\t\t\t\trejected = true;\n\t\t\t\treject(err);\n\t\t\t},\n\t\t\ttrue,\n\t\t);\n\t\tfunction checkReady() {\n\t\t\tif (playing && timeupdate && !rejected) {\n\t\t\t\tresolve(video);\n\t\t\t}\n\t\t}\n\t\tvideo.src = videoUrl;\n\t\tvideo.playsInline = true;\n\t\tvideo.crossOrigin = \"anonymous\";\n\t\tvideo.autoplay = true;\n\t\tvideo.loop = true;\n\t\tvideo.muted = true;\n\t\tvideo.play();\n\t});\n}\n\nexport function loadResourceFromUrl(\n\turl: string,\n\tisVideo = false,\n): Promise<HTMLImageElement | HTMLVideoElement> {\n\treturn isVideo ? loadVideo(url) : loadImage(url);\n}\n\nexport function loadResourceFromElement(\n\telement: HTMLImageElement | HTMLVideoElement,\n): Promise<HTMLImageElement | HTMLVideoElement> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (\n\t\t\telement instanceof HTMLImageElement\n\t\t\t\t? element.complete\n\t\t\t\t: element.readyState >= 3\n\t\t) {\n\t\t\tresolve(element);\n\t\t} else {\n\t\t\telement.onload = () => resolve(element);\n\t\t\telement.onerror = reject;\n\t\t}\n\t});\n}\n","import { Container } from \"@pixi/display\";\nimport { Application } from \"@pixi/app\";\nimport { BlurFilter } from \"@pixi/filter-blur\";\nimport { ColorMatrixFilter } from \"@pixi/filter-color-matrix\";\nimport { Texture } from \"@pixi/core\";\nimport { Sprite } from \"@pixi/sprite\";\nimport { BulgePinchFilter } from \"@pixi/filter-bulge-pinch\";\nimport { BaseRenderer } from \"./base\";\nimport {\n\tloadResourceFromElement,\n\tloadResourceFromUrl,\n} from \"../utils/resource\";\n\nclass TimedContainer extends Container {\n\tpublic time = 0;\n}\n\nexport class PixiRenderer extends BaseRenderer {\n\tprivate app: Application;\n\tprivate curContainer?: TimedContainer;\n\tprivate staticMode = false;\n\tprivate lastContainer: Set<TimedContainer> = new Set();\n\tprivate onTick = (delta: number): void => {\n\t\tfor (const lastContainer of this.lastContainer) {\n\t\t\tlastContainer.alpha = Math.max(0, lastContainer.alpha - delta / 60);\n\t\t\tif (lastContainer.alpha <= 0) {\n\t\t\t\tthis.app.stage.removeChild(lastContainer);\n\t\t\t\tthis.lastContainer.delete(lastContainer);\n\t\t\t\tlastContainer.destroy(true);\n\t\t\t}\n\t\t}\n\n\t\tif (this.curContainer) {\n\t\t\tthis.curContainer.alpha = Math.min(\n\t\t\t\t1,\n\t\t\t\tthis.curContainer.alpha + delta / 60,\n\t\t\t);\n\t\t\tconst [s1, s2, s3, s4] = this.curContainer.children as Sprite[];\n\t\t\tconst maxSize = Math.max(this.app.screen.width, this.app.screen.height);\n\t\t\ts1.position.set(this.app.screen.width / 2, this.app.screen.height / 2);\n\t\t\ts2.position.set(\n\t\t\t\tthis.app.screen.width / 2.5,\n\t\t\t\tthis.app.screen.height / 2.5,\n\t\t\t);\n\t\t\ts3.position.set(this.app.screen.width / 2, this.app.screen.height / 2);\n\t\t\ts4.position.set(this.app.screen.width / 2, this.app.screen.height / 2);\n\t\t\ts1.width = maxSize * Math.sqrt(2);\n\t\t\ts1.height = s1.width;\n\t\t\ts2.width = maxSize * 0.8;\n\t\t\ts2.height = s2.width;\n\t\t\ts3.width = maxSize * 0.5;\n\t\t\ts3.height = s3.width;\n\t\t\ts4.width = maxSize * 0.25;\n\t\t\ts4.height = s4.width;\n\n\t\t\tthis.curContainer.time += delta * this.flowSpeed;\n\n\t\t\ts1.rotation += (delta / 1000) * this.flowSpeed;\n\t\t\ts2.rotation -= (delta / 500) * this.flowSpeed;\n\t\t\ts3.rotation += (delta / 1000) * this.flowSpeed;\n\t\t\ts4.rotation -= (delta / 750) * this.flowSpeed;\n\n\t\t\ts3.x =\n\t\t\t\tthis.app.screen.width / 2 +\n\t\t\t\t(this.app.screen.width / 4) *\n\t\t\t\t\tMath.cos((this.curContainer.time / 1000) * 0.75);\n\t\t\ts3.y =\n\t\t\t\tthis.app.screen.height / 2 +\n\t\t\t\t(this.app.screen.width / 4) *\n\t\t\t\t\tMath.cos((this.curContainer.time / 1000) * 0.75);\n\n\t\t\ts4.x =\n\t\t\t\tthis.app.screen.width / 2 +\n\t\t\t\t(this.app.screen.width / 4) * 0.1 +\n\t\t\t\tMath.cos(this.curContainer.time * 0.006 * 0.75);\n\t\t\ts4.y =\n\t\t\t\tthis.app.screen.height / 2 +\n\t\t\t\t(this.app.screen.width / 4) * 0.1 +\n\t\t\t\tMath.cos(this.curContainer.time * 0.006 * 0.75);\n\n\t\t\tif (\n\t\t\t\tthis.curContainer.alpha >= 1 &&\n\t\t\t\tthis.lastContainer.size === 0 &&\n\t\t\t\tthis.staticMode\n\t\t\t) {\n\t\t\t\tthis.app.ticker.stop();\n\t\t\t}\n\t\t}\n\t};\n\tconstructor(protected canvas: HTMLCanvasElement) {\n\t\tsuper(canvas);\n\t\tthis.app = new Application({\n\t\t\tview: canvas,\n\t\t\tresizeTo: this.canvas,\n\t\t\tpowerPreference: \"low-power\",\n\t\t\tbackgroundAlpha: 1,\n\t\t});\n\t\tthis.rebuildFilters();\n\t\tthis.app.ticker.maxFPS = 30;\n\t\tthis.app.ticker.add(this.onTick);\n\t\tthis.app.ticker.start();\n\t}\n\n\tprotected override onResize(width: number, height: number): void {\n\t\tsuper.onResize(width, height);\n\t\tthis.app.resize();\n\t\tthis.rebuildFilters();\n\t}\n\n\toverride setRenderScale(scale: number) {\n\t\tsuper.setRenderScale(scale);\n\t\tthis.rebuildFilters();\n\t}\n\tprivate rebuildFilters() {\n\t\tconst minBorder = Math.min(this.canvas.width, this.canvas.height);\n\t\tconst maxBorder = Math.max(this.canvas.width, this.canvas.height);\n\t\tconst c0 = new ColorMatrixFilter();\n\t\tc0.saturate(1.2, false);\n\t\tconst c1 = new ColorMatrixFilter();\n\t\tc1.brightness(0.6, false);\n\t\tconst c2 = new ColorMatrixFilter();\n\t\tc2.contrast(0.3, true);\n\t\tthis.app.stage.filters?.forEach((filter) => {\n\t\t\tfilter.destroy();\n\t\t});\n\t\tthis.app.stage.filters = [];\n\t\tthis.app.stage.filters.push(new BlurFilter(5, 1));\n\t\tthis.app.stage.filters.push(new BlurFilter(10, 1));\n\t\tthis.app.stage.filters.push(new BlurFilter(20, 2));\n\t\tthis.app.stage.filters.push(new BlurFilter(40, 2));\n\t\tthis.app.stage.filters.push(new BlurFilter(80, 2));\n\t\tif (minBorder > 768) this.app.stage.filters.push(new BlurFilter(160, 4));\n\t\tif (minBorder > 768 * 2)\n\t\t\tthis.app.stage.filters.push(new BlurFilter(320, 4));\n\n\t\tthis.app.stage.filters.push(c0, c1, c2);\n\t\tthis.app.stage.filters.push(new BlurFilter(5, 1));\n\t\tif (Math.random() > 0.5) {\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.25, 1],\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.75, 0],\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.75, 1],\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.25, 0],\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\toverride setStaticMode(enable = false) {\n\t\tthis.staticMode = enable;\n\t\tthis.app.ticker.start();\n\t}\n\n\toverride setFPS(fps: number) {\n\t\tthis.app.ticker.maxFPS = fps;\n\t}\n\n\toverride pause() {\n\t\tthis.app.ticker.stop();\n\t\tthis.app.render();\n\t}\n\n\toverride resume() {\n\t\tthis.app.ticker.start();\n\t}\n\n\toverride setLowFreqVolume(_volume: number): void {\n\t\t// NOOP\n\t}\n\n\toverride setHasLyric(_hasLyric: boolean): void {\n\t\t// NOOP\n\t}\n\n\toverride async setAlbum(\n\t\talbumSource: string | HTMLImageElement | HTMLVideoElement,\n\t\tisVideo?: boolean,\n\t): Promise<void> {\n\t\tif (typeof albumSource === \"string\" && albumSource.trim().length === 0)\n\t\t\treturn;\n\t\tlet res: HTMLImageElement | HTMLVideoElement | null = null;\n\t\tlet remainRetryTimes = 5;\n\t\tlet tex: Texture | null = null;\n\t\twhile (!tex?.baseTexture?.resource?.valid && remainRetryTimes > 0) {\n\t\t\ttry {\n\t\t\t\tif (typeof albumSource === \"string\") {\n\t\t\t\t\tres = await loadResourceFromUrl(albumSource, isVideo);\n\t\t\t\t} else {\n\t\t\t\t\tres = await loadResourceFromElement(albumSource);\n\t\t\t\t}\n\t\t\t\ttex = Texture.from(res, {\n\t\t\t\t\tresourceOptions: {\n\t\t\t\t\t\tautoLoad: false,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tawait tex.baseTexture.resource.load();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`failed on loading album image, retrying (${remainRetryTimes})`,\n\t\t\t\t\talbumSource,\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t\ttex = null;\n\t\t\t\tremainRetryTimes--;\n\t\t\t}\n\t\t}\n\t\tif (!tex) return;\n\t\tconst container = new TimedContainer();\n\t\tconst s1 = new Sprite(tex);\n\t\tconst s2 = new Sprite(tex);\n\t\tconst s3 = new Sprite(tex);\n\t\tconst s4 = new Sprite(tex);\n\t\ts1.anchor.set(0.5, 0.5);\n\t\ts2.anchor.set(0.5, 0.5);\n\t\ts3.anchor.set(0.5, 0.5);\n\t\ts4.anchor.set(0.5, 0.5);\n\t\ts1.rotation = Math.random() * Math.PI * 2;\n\t\ts2.rotation = Math.random() * Math.PI * 2;\n\t\ts3.rotation = Math.random() * Math.PI * 2;\n\t\ts4.rotation = Math.random() * Math.PI * 2;\n\t\tcontainer.addChild(s1, s2, s3, s4);\n\t\tif (this.curContainer) this.lastContainer.add(this.curContainer);\n\t\tthis.curContainer = container;\n\t\tthis.app.stage.addChild(container);\n\t\tthis.curContainer.alpha = 0;\n\t\tthis.app.ticker.start();\n\t}\n\n\toverride dispose() {\n\t\tsuper.dispose();\n\t\tthis.app.ticker.remove(this.onTick);\n\t\tthis.app.destroy(true);\n\t}\n\n\toverride getElement(): HTMLElement {\n\t\treturn this.canvas;\n\t}\n}\n","export default \"#version 300 es\\nprecision highp float;\\n\\nin vec2 v_coord;\\nout vec2 f_v_coord;\\n\\nvoid main() {\\n gl_Position = vec4(v_coord, 0.0f, 1.0f);\\n f_v_coord = (vec2(v_coord.x, v_coord.y) + vec2(1.0f, 1.0f)) / 2.0f;\\n}\\n\"","export default \"#version 300 es\\nprecision highp float;\\n\\nuniform sampler2D src;\\nin vec2 f_v_coord;\\nout vec4 fragColor;\\n\\nvoid main() {\\n vec2 coord = f_v_coord;\\n fragColor = texture(src, coord);\\n}\\n\"","export default \"#version 300 es\\nprecision highp float;\\n\\nuniform sampler2D src;\\nuniform float lerp;\\nuniform float scale;\\nin vec2 f_v_coord;\\nout vec4 fragColor;\\n\\nvoid main() {\\n vec2 tex_coord = f_v_coord;\\n if(scale < 1.0f) {\\n tex_coord /= scale;\\n }\\n vec4 srcColor = texture(src, tex_coord);\\n fragColor = mix(vec4(srcColor.xyz, 0.0f), srcColor, lerp);\\n}\\n\"","export default \"#version 300 es\\nprecision highp float;uniform float IIIlllllllIIIllIl,lIIIlllllIllIl,IIIlllIlIIllll;uniform sampler2D IlllIIlIlllIll;uniform vec2 IIlIlIIlIlIllI,IllIlllIlIIlllI;out vec4 lIIlIIIIIlIlIlllIIIIlIIl;float lIlIIllllIllIll(float IIIlIIlIIIlllIII){IIIlIIlIIIlllIII-=0.;return sin(IIIlIIlIIIlllIII);}float lIlIlllllIllIll(float IIIlIIlIIIlllIII){IIIlIIlIIIlllIII+=acos(0.);return sin(IIIlIIlIIIlllIII);}mat2 lIIllIIlIIIllIl(float IIIlIIlIIIlllIII){return mat2(lIlIlllllIllIll(IIIlIIlIIIlllIII),-lIlIIllllIllIll(IIIlIIlIIIlllIII),lIlIIllllIllIll(IIIlIIlIIIlllIII),lIlIlllllIllIll(IIIlIIlIIIlllIII));}mat2 lIIllIIlIIIlllI(float IIIlIIlIIIlllIII){return mat2(lIlIIllllIllIll(IIIlIIlIIIlllIII),-lIlIlllllIllIll(IIIlIIlIIIlllIII),lIlIlllllIllIll(IIIlIIlIIIlllIII),lIlIIllllIllIll(IIIlIIlIIIlllIII));}float IllllIIlIllII(float llIIllIllIIIllI){return fract(lIlIIllllIllIll(llIIllIllIIIllI)*43758.5453);}float llIlIIllllIII(vec2 IIIlIIlIIIlllIII){vec2 IIllIlIIlllI=floor(IIIlIIlIIIlllIII),lIlIllIIIIIlIl=fract(IIIlIIlIIIlllIII);lIlIllIIIIIlIl=lIlIllIIIIIlIl*lIlIllIIIIIlIl*(3.-2.*lIlIllIIIIIlIl);float lIlIlIlIlIlIIl=IIllIlIIlllI.x+IIllIlIIlllI.y*57.;return mix(mix(IllllIIlIllII(lIlIlIlIlIlIIl),IllllIIlIllII(lIlIlIlIlIlIIl+1.),lIlIllIIIIIlIl.x),mix(IllllIIlIllII(lIlIlIlIlIlIIl+57.),IllllIIlIllII(lIlIlIlIlIlIIl+58.),lIlIllIIIIIlIl.x),lIlIllIIIIIlIl.y);}vec2 lllIIIIIIllIlIIIlI(vec2 IlllIIlIIIIlIIII,float lIIIIlllIIIIllIlIlI,vec2 IlIlIIIIlIlllIlIII){float lIIlIllIIIlIl=llIlIIllllIII(IlllIIlIIIIlIIII*vec2(1)*3.5+.1)*4.2831*mix(.2,1.,IIIlllllllIIIllIl);IlllIIlIIIIlIIII+=vec2(-1,.5);lIIlIllIIIlIl-=lIIIIlllIIIIllIlIlI;return vec2(lIlIlllllIllIll(lIIlIllIIIlIl),lIlIIllllIllIll(lIIlIllIIIlIl));}const mat3 lIIllIIIlllIl=mat3(1.,.02,.002,.02,1.,.008,.002,.02,1.),lIIIlllIIIIll=mat3(1.022,-.02,-.002,-.02,1.028,-.008,-.002,-.02,1.022);void main(){vec2 lIIIlIIllIlIIlI=lIlIIllllIllIll(lIIIlllllIllIl*.2)*.01+.5+gl_FragCoord.xy/IIlIlIIlIlIllI.xy,lIIllIIlIIIllI=lIIIlIIllIlIIlI*.77f+IllIlllIlIIlllI;lIIllIIlIIIllI.x*=IIlIlIIlIlIllI.x/IIlIlIIlIlIllI.y;float lIIlIIlIIlIIIlII=gl_FragCoord.x/max(IIlIlIIlIlIllI.x,IIlIlIIlIlIllI.y),lIIIlIllIllIlIIl=0.f;vec3 lIIIlIlIIIlIlIIl=vec3(0);vec2 lIlIIlIlIIIllIll=lIIllIIlIIIllI;for(int IllIlIIlIIlllllIIIl=0;IllIlIIlIIlllllIIIl<8;IllIlIIlIIlllllIIIl++){bool lIlIlIIllIllIIll=IllIlIIlIIlllllIIIl%2==0;vec2 lIlllIlllIlllII=lllIIIIIIllIlIIIlI(lIIllIIlIIIllI,lIIlIIlIIlIIIlII,lIIIlIIllIlIIlI),lIllIIlIIlIIIll=lIlllIlllIlllII;float lIIlIlIIlIIlIllI=float(IllIlIIlIIlllllIIIl)/8.f;vec3 llIIlIIIIlIIlIII=texture(IlllIIlIlllIll,-lIIIlllllIllIl*.01+.8*lIIllIIlIIIllI*lIIllIIlIIIllIl(-lIIIlllllIllIl*.2)+vec2(IIIlllIlIIllll*.3*(float(lIlIlIIllIllIIll)*2.-1.)*lIIllIIlIIIlllI(lIIIlllllIllIl*.2+1.5))).xyz;lIIIlIlIIIlIlIIl+=llIIlIIIIlIIlIII;lIIIlIllIllIlIIl+=4.f*lIIlIlIIlIIlIllI*(1.f-lIIlIlIIlIIlIllI);lIIllIIlIIIllI+=.01f*lIllIIlIIlIIIll*(lIlIIllllIllIll(lIIIlllllIllIl)*4.8+.8);lIlIIlIlIIIllIll+=.05f*lIllIIlIIlIIIll;}lIIIlIlIIIlIlIIl/=lIIIlIllIllIlIIl;lIIIlIlIIIlIlIIl*=1.6f;lIIIlIlIIIlIlIIl=1.f-exp(-lIIIlIlIIIlIlIIl);lIIIlIlIIIlIlIIl=pow(lIIIlIlIIIlIlIIl,vec3(2.2));lIIIlIlIIIlIlIIl*=.8f;lIIlIIIIIlIlIlllIIIIlIIl=vec4(lIIIlIlIIIlIlIIl,1);}\"","export default \"#version 300 es\\nprecision highp float;\\n\\nuniform sampler2D src;\\nin vec2 f_v_coord;\\nout vec4 fragColor;\\n\\n/* Gradient noise from Jorge Jimenez's presentation: */\\n/* http://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare */\\nfloat gradientNoise(in vec2 uv) {\\n return fract(52.9829189f * fract(dot(uv, vec2(0.06711056f, 0.00583715f))));\\n}\\n\\nvoid main() {\\n vec2 tex_coord = f_v_coord;\\n float dither = (1.0f / 255.0f) * gradientNoise(gl_FragCoord.xy) - (0.5f / 255.0f);\\n vec4 color = texture(src, tex_coord);\\n color += dither;\\n fragColor = color;\\n}\\n\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAYUklEQVR4nH3bV89VVRcF4IX7qNgVe8WKvaIiNsCuYCKCSEg0JCYm/gTjzf4R3njhlRdeWKKi2AvYEBV7b1ixY2+ofPuZcbwxXzie5OQ9Z5+11pxzjDHnKnu/k0477bSN+++/fzvyyCPbdttt17766qu2YcOG9ttvv7U33nijffHFF23atGntgAMOaN98803bc88926RJk9pnn31W10855ZT2888/1/vrr79ur732Wjv00EPbgQce2NavX99eeOGF+nvmmWfWuD4fc8wx1ffDDz9sTz31VPv000/bRx99VL/vsssu7eCDDy57hxxySPv222/L1saNG9vatWsbX19++eXyhb9//PFH23HHHdsHH3zQLrrooorjxRdfrPbG+/jjj9u6devaX3/91aZMmdImT57cdt1114lYu5133rnfeuut28yZM9t+++3XVq9e3T7//PMa9Ljjjqu/m222WTn73HPPtR122KF99913bcsttyyQnnzyybbbbrvVm4MMAe37778vUATIkaOPPrqCe+KJJ9qPP/7Ydt9993bvvfe2lStXtvfee69ttdVW7bzzzmvbbLNN++STT9rUqVPL7jvvvNP+/PPP8o1NNn7//fcakx3XL7300moPyC222KL8ev/99ws8Y2s3xFmAIpD9H374of36669txBEIvf3224UmR1w74YQTyhlgHHTQQeU845Bfs2ZN23fffcsQRn/55Zf6jQJOP/30GvjLL78sMPbee+8y6rM2gvPea6+9yg7Htt1223bSSSe1nXbaqWwC+K677iq2qMU1yqKK0WhUAWGREruuq3GBw8dVq1ZV4Pvss08744wzSgns/fTTT+UzoigIAL53gyM95P7+++9Cj1OQz+ACwb7PHAGA3133phKyY/TVV1+t3zHEAUa8t99++1IDJwAsKFIWkFQQOFaeffbZ9u6775aTgBXskKIVhDEBSxFJCaznOoCpNdJHGlvGNRa5s8N3PiLg5JNPbt1goNfIYKeeemo74ogjKmC5yxlIY/D5559v999/f8nxrLPOqsCBwknIkxcmpISXYFesWFGqIlNKck3bGTNmFNDyltPaUBXnsMWGfKZCeQto/QQqmOnTpxegvvNVH4G7Jg4AG4P8qVM6jCN5JDc5QYZyHHrynFGd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\"","import { Disposable } from \"../interfaces\";\nimport { BaseRenderer } from \"./base\";\nimport vertShader from \"./shaders/base.vert.glsl?raw\";\nimport fragShader from \"./shaders/base.frag.glsl?raw\";\nimport blendShader from \"./shaders/blend.frag.glsl?raw\";\nimport eplorShader from \"./shaders/eplor.frag.glsl?raw\";\nimport noiseShader from \"./shaders/noise.frag.glsl?raw\";\nimport noiseImage from \"../assets/noise 5.png?inline\";\nimport {\n\tloadResourceFromElement,\n\tloadResourceFromUrl,\n} from \"../utils/resource\";\n\nconst NOISE_IMAGE_DATA = (() => {\n\tconst img = document.createElement(\"img\");\n\timg.src = noiseImage;\n\treturn img;\n})();\n\nfunction blurImage(imageData: ImageData, radius: number, quality: number) {\n\tconst pixels = imageData.data;\n\tconst width = imageData.width;\n\tconst height = imageData.height;\n\n\tlet rsum: number;\n\tlet gsum: number;\n\tlet bsum: number;\n\tlet asum: number;\n\tlet x: number;\n\tlet y: number;\n\tlet i: number;\n\tlet p: number;\n\tlet p1: number;\n\tlet p2: number;\n\tlet yp: number;\n\tlet yi: number;\n\tlet yw: number;\n\tconst wm = width - 1;\n\tconst hm = height - 1;\n\tconst rad1x = radius + 1;\n\tconst divx = radius + rad1x;\n\tconst rad1y = radius + 1;\n\tconst divy = radius + rad1y;\n\tconst div2 = 1 / (divx * divy);\n\n\tconst r: number[] = [];\n\tconst g: number[] = [];\n\tconst b: number[] = [];\n\tconst a: number[] = [];\n\n\tconst vmin: number[] = [];\n\tconst vmax: number[] = [];\n\n\twhile (quality-- > 0) {\n\t\tyw = yi = 0;\n\n\t\tfor (y = 0; y < height; y++) {\n\t\t\trsum = pixels[yw] * rad1x;\n\t\t\tgsum = pixels[yw + 1] * rad1x;\n\t\t\tbsum = pixels[yw + 2] * rad1x;\n\t\t\tasum = pixels[yw + 3] * rad1x;\n\n\t\t\tfor (i = 1; i <= radius; i++) {\n\t\t\t\tp = yw + ((i > wm ? wm : i) << 2);\n\t\t\t\trsum += pixels[p++];\n\t\t\t\tgsum += pixels[p++];\n\t\t\t\tbsum += pixels[p++];\n\t\t\t\tasum += pixels[p];\n\t\t\t}\n\n\t\t\tfor (x = 0; x < width; x++) {\n\t\t\t\tr[yi] = rsum;\n\t\t\t\tg[yi] = gsum;\n\t\t\t\tb[yi] = bsum;\n\t\t\t\ta[yi] = asum;\n\n\t\t\t\tif (y === 0) {\n\t\t\t\t\tvmin[x] = Math.min(x + rad1x, wm) << 2;\n\t\t\t\t\tvmax[x] = Math.max(x - radius, 0) << 2;\n\t\t\t\t}\n\n\t\t\t\tp1 = yw + vmin[x];\n\t\t\t\tp2 = yw + vmax[x];\n\n\t\t\t\trsum += pixels[p1++] - pixels[p2++];\n\t\t\t\tgsum += pixels[p1++] - pixels[p2++];\n\t\t\t\tbsum += pixels[p1++] - pixels[p2++];\n\t\t\t\tasum += pixels[p1] - pixels[p2];\n\n\t\t\t\tyi++;\n\t\t\t}\n\t\t\tyw += width << 2;\n\t\t}\n\n\t\tfor (x = 0; x < width; x++) {\n\t\t\typ = x;\n\t\t\trsum = r[yp] * rad1y;\n\t\t\tgsum = g[yp] * rad1y;\n\t\t\tbsum = b[yp] * rad1y;\n\t\t\tasum = a[yp] * rad1y;\n\n\t\t\tfor (i = 1; i <= radius; i++) {\n\t\t\t\typ += i > hm ? 0 : width;\n\t\t\t\trsum += r[yp];\n\t\t\t\tgsum += g[yp];\n\t\t\t\tbsum += b[yp];\n\t\t\t\tasum += a[yp];\n\t\t\t}\n\n\t\t\tyi = x << 2;\n\t\t\tfor (y = 0; y < height; y++) {\n\t\t\t\tpixels[yi] = (rsum * div2 + 0.5) | 0;\n\t\t\t\tpixels[yi + 1] = (gsum * div2 + 0.5) | 0;\n\t\t\t\tpixels[yi + 2] = (bsum * div2 + 0.5) | 0;\n\t\t\t\tpixels[yi + 3] = (asum * div2 + 0.5) | 0;\n\n\t\t\t\tif (x === 0) {\n\t\t\t\t\tvmin[y] = Math.min(y + rad1y, hm) * width;\n\t\t\t\t\tvmax[y] = Math.max(y - radius, 0) * width;\n\t\t\t\t}\n\n\t\t\t\tp1 = x + vmin[y];\n\t\t\t\tp2 = x + vmax[y];\n\n\t\t\t\trsum += r[p1] - r[p2];\n\t\t\t\tgsum += g[p1] - g[p2];\n\t\t\t\tbsum += b[p1] - b[p2];\n\t\t\t\tasum += a[p1] - a[p2];\n\n\t\t\t\tyi += width << 2;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction saturateImage(imageData: ImageData, saturation: number) {\n\tconst pixels = imageData.data;\n\n\tfor (let i = 0; i < pixels.length; i += 4) {\n\t\tconst r = pixels[i];\n\t\tconst g = pixels[i + 1];\n\t\tconst b = pixels[i + 2];\n\t\tconst a = pixels[i + 3];\n\t\tconst gray = r * 0.3 + g * 0.59 + b * 0.11;\n\t\tpixels[i] = gray * (1 - saturation) + r * saturation;\n\t\tpixels[i + 1] = gray * (1 - saturation) + g * saturation;\n\t\tpixels[i + 2] = gray * (1 - saturation) + b * saturation;\n\t\tpixels[i + 3] = a;\n\t}\n}\n\nfunction brightnessImage(imageData: ImageData, brightness: number) {\n\tconst pixels = imageData.data;\n\n\tfor (let i = 0; i < pixels.length; i += 4) {\n\t\tconst r = pixels[i];\n\t\tconst g = pixels[i + 1];\n\t\tconst b = pixels[i + 2];\n\t\tconst a = pixels[i + 3];\n\t\tpixels[i] = r * brightness;\n\t\tpixels[i + 1] = g * brightness;\n\t\tpixels[i + 2] = b * brightness;\n\t\tpixels[i + 3] = a;\n\t}\n}\n\nfunction contrastImage(imageData: ImageData, contrast: number) {\n\tconst pixels = imageData.data;\n\n\tfor (let i = 0; i < pixels.length; i += 4) {\n\t\tconst r = pixels[i];\n\t\tconst g = pixels[i + 1];\n\t\tconst b = pixels[i + 2];\n\t\tconst a = pixels[i + 3];\n\t\tpixels[i] = (r - 128) * contrast + 128;\n\t\tpixels[i + 1] = (g - 128) * contrast + 128;\n\t\tpixels[i + 2] = (b - 128) * contrast + 128;\n\t\tpixels[i + 3] = a;\n\t}\n}\n\nclass GLProgram implements Disposable {\n\tprivate gl: WebGL2RenderingContext;\n\tprogram: WebGLProgram;\n\tprivate vertexShader: WebGLShader;\n\tprivate fragmentShader: WebGLShader;\n\tprivate coordPos: number;\n\tconstructor(\n\t\tgl: WebGL2RenderingContext,\n\t\tvertexShaderSource: string,\n\t\tfragmentShaderSource: string,\n\t\tprivate readonly label = \"unknown\",\n\t) {\n\t\tthis.gl = gl;\n\t\tthis.vertexShader = this.createShader(gl.VERTEX_SHADER, vertexShaderSource);\n\t\tthis.fragmentShader = this.createShader(\n\t\t\tgl.FRAGMENT_SHADER,\n\t\t\tfragmentShaderSource,\n\t\t);\n\t\tthis.program = this.createProgram();\n\n\t\tconst coordPos = gl.getAttribLocation(this.program, \"v_coord\");\n\t\tif (coordPos === -1)\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to get attribute location v_coord for \"${this.label}\"`,\n\t\t\t);\n\t\tthis.coordPos = coordPos;\n\t}\n\tprivate createShader(type: number, source: string) {\n\t\tconst gl = this.gl;\n\t\tconst shader = gl.createShader(type);\n\t\tif (!shader) throw new Error(\"Failed to create shader\");\n\t\tgl.shaderSource(shader, source);\n\t\tgl.compileShader(shader);\n\t\tif (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to compile shader for type ${type} \"${\n\t\t\t\t\tthis.label\n\t\t\t\t}\": ${gl.getShaderInfoLog(shader)}`,\n\t\t\t);\n\t\t}\n\t\treturn shader;\n\t}\n\tprivate createProgram() {\n\t\tconst gl = this.gl;\n\t\tconst program = gl.createProgram();\n\t\tif (!program) throw new Error(\"Failed to create program\");\n\t\tgl.attachShader(program, this.vertexShader);\n\t\tgl.attachShader(program, this.fragmentShader);\n\t\tgl.linkProgram(program);\n\t\tgl.validateProgram(program);\n\t\tif (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n\t\t\tconst errLog = gl.getProgramInfoLog(program);\n\t\t\tgl.deleteProgram(program);\n\t\t\tthrow new Error(`Failed to link program \"${this.label}\": ${errLog}`);\n\t\t}\n\t\treturn program;\n\t}\n\tuse() {\n\t\tconst gl = this.gl;\n\t\tgl.useProgram(this.program);\n\t\tgl.vertexAttribPointer(this.coordPos, 2, gl.FLOAT, false, 0, 0);\n\t\tgl.enableVertexAttribArray(this.coordPos);\n\t}\n\tprivate notFoundUniforms: Set<string> = new Set();\n\tprivate warnUniformNotFound(name: string) {\n\t\tif (this.notFoundUniforms.has(name)) return;\n\t\tthis.notFoundUniforms.add(name);\n\t\tconsole.warn(\n\t\t\t`Failed to get uniform location for program \"${this.label}\": ${name}`,\n\t\t);\n\t}\n\tsetUniform1f(name: string, value: number) {\n\t\tconst gl = this.gl;\n\t\tconst location = gl.getUniformLocation(this.program, name);\n\t\tif (!location) this.warnUniformNotFound(name);\n\t\telse gl.uniform1f(location, value);\n\t}\n\tsetUniform2f(name: string, value1: number, value2: number) {\n\t\tconst gl = this.gl;\n\t\tconst location = gl.getUniformLocation(this.program, name);\n\t\tif (!location) this.warnUniformNotFound(name);\n\t\telse gl.uniform2f(location, value1, value2);\n\t}\n\tsetUniform1i(name: string, value: number) {\n\t\tconst gl = this.gl;\n\t\tconst location = gl.getUniformLocation(this.program, name);\n\t\tif (!location) this.warnUniformNotFound(name);\n\t\telse gl.uniform1i(location, value);\n\t}\n\tdispose() {\n\t\tconst gl = this.gl;\n\t\tgl.deleteShader(this.vertexShader);\n\t\tgl.deleteShader(this.fragmentShader);\n\t\tgl.deleteProgram(this.program);\n\t}\n}\n\nclass Framebuffer implements Disposable {\n\tprivate fb: WebGLFramebuffer;\n\tprivate tex: WebGLTexture;\n\tprivate _size: [number, number];\n\tget size() {\n\t\treturn this._size;\n\t}\n\tconstructor(\n\t\tprivate gl: WebGL2RenderingContext,\n\t\twidth: number,\n\t\theight: number,\n\t) {\n\t\tthis._size = [width, height];\n\t\tconst fb = gl.createFramebuffer();\n\t\tif (!fb) throw new Error(\"Can't create framebuffer\");\n\t\tconst tex = gl.createTexture();\n\t\tif (!tex) throw new Error(\"Failed to create texture\");\n\t\tthis.fb = fb;\n\t\tthis.tex = tex;\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, fb);\n\t\tgl.bindTexture(gl.TEXTURE_2D, tex);\n\t\tgl.framebufferTexture2D(\n\t\t\tgl.FRAMEBUFFER,\n\t\t\tgl.COLOR_ATTACHMENT0,\n\t\t\tgl.TEXTURE_2D,\n\t\t\ttex,\n\t\t\t0,\n\t\t);\n\t\tthis.resize(width, height);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n\t}\n\tresize(width: number, height: number) {\n\t\tconst gl = this.gl;\n\t\tthis.bind();\n\t\tgl.bindTexture(gl.TEXTURE_2D, this.tex);\n\t\tif (gl.getExtension(\"EXT_color_buffer_float\")) {\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA32F,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.FLOAT,\n\t\t\t\tnull,\n\t\t\t);\n\t\t} else {\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.UNSIGNED_BYTE,\n\t\t\t\tnull,\n\t\t\t);\n\t\t}\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n\t}\n\tbind() {\n\t\tconst gl = this.gl;\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, this.fb);\n\t}\n\tactive(texture: number = this.gl.TEXTURE0) {\n\t\tthis.gl.activeTexture(texture);\n\t\tthis.gl.bindTexture(this.gl.TEXTURE_2D, this.tex);\n\t}\n\tdispose(): void {\n\t\tthis.gl.deleteFramebuffer(this.fb);\n\t\tthis.gl.deleteTexture(this.tex);\n\t}\n}\n\nclass GLBuffer implements Disposable {\n\tprivate gl: WebGL2RenderingContext;\n\tprivate buffer: WebGLBuffer;\n\tprivate type: number;\n\tprivate data: ArrayBufferView;\n\tprivate usage: number;\n\tprivate length: number;\n\tconstructor(\n\t\tgl: WebGL2RenderingContext,\n\t\ttype: number,\n\t\tdata: ArrayBufferView,\n\t\tusage: number,\n\t) {\n\t\tthis.gl = gl;\n\t\tthis.type = type;\n\t\tthis.data = data;\n\t\tthis.usage = usage;\n\t\tconst buffer = gl.createBuffer();\n\t\tif (!buffer) throw new Error(\"Failed to create buffer\");\n\t\tthis.buffer = buffer;\n\t\tthis.length = data.byteLength;\n\t\tgl.bindBuffer(type, this.buffer);\n\t\tgl.bufferData(type, data, usage);\n\t}\n\tbind() {\n\t\tconst gl = this.gl;\n\t\tgl.bindBuffer(this.type, this.buffer);\n\t}\n\t// update(data: ArrayBufferView) {\n\t// const gl = this.gl;\n\t// gl.bindBuffer(this.type, this.buffer);\n\t// gl.bufferSubData(this.type, 0, data);\n\t// this.data = data;\n\t// }\n\tdispose() {\n\t\tconst gl = this.gl;\n\t\tgl.deleteBuffer(this.buffer);\n\t}\n}\n\nclass AlbumTexture implements Disposable {\n\tprivate albumTexture: WebGLTexture;\n\talpha = 0;\n\n\tconstructor(\n\t\tprivate gl: WebGL2RenderingContext,\n\t\tprivate mainProgram: GLProgram,\n\t\tprivate vertexBuffer: GLBuffer,\n\t\tprivate indexBuffer: GLBuffer,\n\t\talbumImageData: ImageData,\n\t) {\n\t\tconst albumTexture = gl.createTexture();\n\t\tif (!albumTexture) throw new Error(\"Failed to create texture\");\n\t\tthis.albumTexture = albumTexture;\n\t\tgl.bindTexture(gl.TEXTURE_2D, albumTexture);\n\t\tgl.texImage2D(\n\t\t\tgl.TEXTURE_2D,\n\t\t\t0,\n\t\t\tgl.RGBA,\n\t\t\tgl.RGBA,\n\t\t\tgl.UNSIGNED_BYTE,\n\t\t\talbumImageData,\n\t\t);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n\t}\n\n\tdraw(sampler: string) {\n\t\tconst gl = this.gl;\n\t\tthis.mainProgram.use();\n\t\tgl.activeTexture(gl.TEXTURE0);\n\t\tgl.bindTexture(gl.TEXTURE_2D, this.albumTexture);\n\t\tthis.mainProgram.setUniform1i(sampler, 0);\n\t\tgl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n\t}\n\n\tdispose(): void {\n\t\tthis.gl.deleteTexture(this.albumTexture);\n\t}\n}\n\nclass NoiseTexture implements Disposable {\n\tprivate tex: WebGLTexture;\n\talpha = 0;\n\n\tconstructor(private gl: WebGL2RenderingContext) {\n\t\tconst tex = gl.createTexture();\n\t\tif (!tex) throw new Error(\"Failed to create texture\");\n\t\tthis.tex = tex;\n\t\tNOISE_IMAGE_DATA.decode().then(() => {\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, tex);\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.UNSIGNED_BYTE,\n\t\t\t\tNOISE_IMAGE_DATA,\n\t\t\t);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n\t\t});\n\t}\n\n\tactive(texture: number = this.gl.TEXTURE1) {\n\t\tthis.gl.activeTexture(texture);\n\t\tthis.gl.bindTexture(this.gl.TEXTURE_2D, this.tex);\n\t}\n\n\tdispose(): void {\n\t\tthis.gl.deleteTexture(this.tex);\n\t}\n}\n\nexport class EplorRenderer extends BaseRenderer {\n\tprivate hasLyric = true;\n\tprivate hasLyricValue = 1;\n\tprivate maxFPS = 30;\n\tprivate lastTickTime = 0;\n\tprivate lastFrameTime = 0;\n\tprivate _lowFreqVolume = 1;\n\tprivate paused = false;\n\tprivate staticMode = false;\n\tprivate gl: WebGL2RenderingContext = this.setupGL();\n\tprivate reduceImageSizeCanvas = new OffscreenCanvas(128, 128);\n\tprivate tickHandle = 0;\n\tprivate sprites: AlbumTexture[] = [];\n\tprivate ampTransition = 0;\n\tprivate playTime = 0;\n\tprivate frameTime = 0;\n\tprivate IllIlllIlIIlllI: number[] = [-0.1, 0.0];\n\tprivate onTick(tickTime: number) {\n\t\tthis.tickHandle = 0;\n\t\tif (this.paused) return;\n\n\t\tconst delta = tickTime - this.lastTickTime;\n\t\tconst frameDelta = tickTime - this.lastFrameTime;\n\t\tthis.lastFrameTime = tickTime;\n\t\tif (delta < 1000 / this.maxFPS) {\n\t\t\tthis.requestTick();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.hasLyric) this.playTime += frameDelta * this.flowSpeed * 0.2;\n\t\tthis.frameTime += frameDelta;\n\n\t\tif (!(this.onRedraw(this.playTime, frameDelta) && this.staticMode)) {\n\t\t\tthis.requestTick();\n\t\t}\n\n\t\tthis.lastTickTime = tickTime;\n\n\t\tthis.ampTransition;\n\t}\n\n\tprivate mainProgram: GLProgram = new GLProgram(\n\t\tthis.gl,\n\t\tvertShader,\n\t\teplorShader,\n\t\t\"main\",\n\t);\n\tprivate blendProgram: GLProgram = new GLProgram(\n\t\tthis.gl,\n\t\tvertShader,\n\t\tblendShader,\n\t\t\"blend\",\n\t);\n\tprivate copyProgram: GLProgram = new GLProgram(\n\t\tthis.gl,\n\t\tvertShader,\n\t\tfragShader,\n\t\t\"copy\",\n\t);\n\tprivate noiseProgram: GLProgram = new GLProgram(\n\t\tthis.gl,\n\t\tvertShader,\n\t\tnoiseShader,\n\t\t\"noise\",\n\t);\n\n\tprivate static readonly rawVertexBuffer = new Float32Array([\n\t\t-1, -1, 1, -1, -1, 1, 1, 1,\n\t]);\n\n\tprivate static readonly rawIndexBuffer = new Uint16Array([0, 1, 2, 1, 2, 3]);\n\n\tprivate vertexBuffer = new GLBuffer(\n\t\tthis.gl,\n\t\tthis.gl.ARRAY_BUFFER,\n\t\tEplorRenderer.rawVertexBuffer,\n\t\tthis.gl.STATIC_DRAW,\n\t);\n\n\tprivate indexBuffer = new GLBuffer(\n\t\tthis.gl,\n\t\tthis.gl.ELEMENT_ARRAY_BUFFER,\n\t\tEplorRenderer.rawIndexBuffer,\n\t\tthis.gl.STATIC_DRAW,\n\t);\n\n\tprivate noiseTexture = new NoiseTexture(this.gl);\n\n\tprivate fb: [Framebuffer, Framebuffer];\n\tprivate historyFrameBuffer: Framebuffer[] = [];\n\n\tconstructor(protected canvas: HTMLCanvasElement) {\n\t\tsuper(canvas);\n\t\tconst gl = this.gl;\n\t\tgl.enable(this.gl.BLEND);\n\t\tgl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n\t\tthis.requestTick();\n\t\tconst bounds = canvas.getBoundingClientRect();\n\t\tconst width =\n\t\t\tbounds.width * window.devicePixelRatio * this.currerntRenderScale;\n\t\tconst height =\n\t\t\tbounds.height * window.devicePixelRatio * this.currerntRenderScale;\n\t\tthis.fb = [\n\t\t\tnew Framebuffer(this.gl, width, height),\n\t\t\tnew Framebuffer(this.gl, width, height),\n\t\t];\n\t\tfor (const fb of this.fb) {\n\t\t\tfb.bind();\n\t\t\tgl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n\t\t}\n\t\tthis.historyFrameBuffer = new Array(2)\n\t\t\t.fill(0)\n\t\t\t.map(() => new Framebuffer(this.gl, width, height));\n\t\tthis.onResize(width, height);\n\t}\n\tprivate _currentSize = [0, 0];\n\tprivate _targetSize = [0, 0];\n\tprivate renderSize = [0, 0];\n\tprivate pixelSize = [0, 0];\n\n\tprotected override onResize(width: number, height: number): void {\n\t\t// super.onResize(width, height);\n\t\tthis._targetSize = [\n\t\t\tMath.max(1, Math.round(width)),\n\t\t\tMath.max(1, Math.round(height)),\n\t\t];\n\t\tif (this.staticMode) this.requestTick();\n\t}\n\n\tprivate checkResize() {\n\t\tif (\n\t\t\tthis._currentSize[0] === this._targetSize[0] &&\n\t\t\tthis._currentSize[1] === this._targetSize[1]\n\t\t)\n\t\t\treturn;\n\t\tthis._currentSize = [...this._targetSize];\n\t\tconst [width, height] = this._targetSize;\n\t\tconst realWidth = Math.round(\n\t\t\tMath.max(width / this.currerntRenderScale, width),\n\t\t);\n\t\tconst realHeight = Math.round(\n\t\t\tMath.max(height / this.currerntRenderScale, height),\n\t\t);\n\t\tthis.renderSize = [width, height];\n\t\tthis.canvas.width = realWidth;\n\t\tthis.canvas.height = realHeight;\n\t\tthis.pixelSize = [realWidth, realHeight];\n\t\tthis.gl.viewport(0, 0, realWidth, realHeight);\n\t\tfor (const fb of this.fb) {\n\t\t\tfb.resize(width, height);\n\t\t}\n\t\tfor (const fb of this.historyFrameBuffer) {\n\t\t\tfb.resize(realWidth, realHeight);\n\t\t}\n\t}\n\n\tprivate requestTick() {\n\t\tif (!this.tickHandle)\n\t\t\tthis.tickHandle = requestAnimationFrame((t) => this.onTick(t));\n\t}\n\n\tprivate drawScreen() {\n\t\tthis.gl.drawArrays(this.gl.TRIANGLE_STRIP, 0, 4);\n\t}\n\n\tprivate bindDefaultFrameBuffer() {\n\t\tthis.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null);\n\t}\n\n\tprivate onRedraw(tickTime: number, delta: number) {\n\t\tthis.checkResize();\n\t\tthis.hasLyricValue =\n\t\t\t(this.hasLyricValue * 19 + (this.hasLyric ? 1 : 0)) / 20;\n\t\tconst gl = this.gl;\n\t\tthis.vertexBuffer.bind();\n\t\tthis.indexBuffer.bind();\n\n\t\tthis.mainProgram.use();\n\t\tthis.noiseTexture.active();\n\t\tthis.mainProgram.setUniform1i(\"noisetex\", 1);\n\t\tthis.mainProgram.setUniform2f(\n\t\t\t\"IIlIlIIlIlIllI\",\n\t\t\tthis.renderSize[0],\n\t\t\tthis.renderSize[1],\n\t\t);\n\t\tthis.mainProgram.setUniform1f(\n\t\t\t\"lIIIlllllIllIl\",\n\t\t\tthis.hasLyric ? tickTime / 1000 : 0,\n\t\t);\n\t\tthis.mainProgram.setUniform1f(\"IIIlllllllIIIllIl\", this.hasLyricValue);\n\t\tthis.mainProgram.setUniform1f(\n\t\t\t\"IIIlllIlIIllll\",\n\t\t\tthis.hasLyric ? this._lowFreqVolume : 0.0,\n\t\t);\n\t\tthis.mainProgram.setUniform2f(\n\t\t\t\"IllIlllIlIIlllI\",\n\t\t\tthis.IllIlllIlIIlllI[0],\n\t\t\tthis.IllIlllIlIIlllI[1],\n\t\t);\n\t\tconst [fba, fbb] = this.fb;\n\t\tfbb.bind();\n\t\tgl.clearColor(0, 0, 0, 0);\n\t\tgl.clear(this.gl.COLOR_BUFFER_BIT);\n\n\t\tfor (const sprite of this.sprites) {\n\t\t\tfba.bind();\n\t\t\tgl.clearColor(0, 0, 0, 0);\n\t\t\tgl.clear(this.gl.COLOR_BUFFER_BIT);\n\n\t\t\tthis.mainProgram.use();\n\t\t\tsprite.draw(\"IlllIIlIlllIll\");\n\n\t\t\tfbb.bind();\n\n\t\t\tthis.blendProgram.use();\n\t\t\tfba.active();\n\t\t\tthis.blendProgram.setUniform1i(\"src\", 0);\n\t\t\tthis.blendProgram.setUniform1f(\"lerp\", sprite.alpha);\n\t\t\tthis.blendProgram.setUniform1f(\"scale\", this.currerntRenderScale);\n\t\t\tthis.drawScreen();\n\n\t\t\tsprite.alpha = Math.min(1, sprite.alpha + delta / 200);\n\t\t}\n\n\t\t// 增加噪点以缓解色带现象\n\t\tthis.noiseProgram.use();\n\t\tthis.noiseProgram.setUniform1i(\"src\", 0);\n\t\t// this.noiseProgram.setUniform2f(\n\t\t// \t\"renderSize\",\n\t\t// \tthis.renderSize[0],\n\t\t// \tthis.renderSize[1],\n\t\t// );\n\t\t// this.noiseProgram.setUniform1f(\"frameTime\", this.frameTime);\n\t\tfba.bind();\n\t\tfbb.active();\n\t\tthis.bindDefaultFrameBuffer();\n\t\tthis.drawScreen();\n\n\t\tif (this.sprites.length > 1) {\n\t\t\tconst coveredIndex = this.sprites[this.sprites.length - 1];\n\t\t\tif (coveredIndex.alpha >= 1) {\n\t\t\t\tfor (const deleted of this.sprites.splice(0, this.sprites.length - 1)) {\n\t\t\t\t\tdeleted.dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst isOnlyOneSprite =\n\t\t\tthis.sprites.length === 1 && this.sprites[0].alpha >= 1;\n\t\tconst isTweeningValues = this.hasLyric\n\t\t\t? this.hasLyricValue > 0.00001\n\t\t\t: this.hasLyricValue < 0.99999;\n\t\treturn isOnlyOneSprite || !isTweeningValues;\n\t}\n\n\tprivate copyFrameBuffer(src: Framebuffer, dst: Framebuffer | null = null) {\n\t\tif (src === dst) return;\n\t\tsrc.active(this.gl.TEXTURE0);\n\t\tthis.copyProgram.use();\n\t\tif (dst) {\n\t\t\tdst.bind();\n\t\t} else {\n\t\t\tthis.bindDefaultFrameBuffer();\n\t\t}\n\t\tthis.copyProgram.setUniform1i(\"src\", 0);\n\t\t// this.copyProgram.setUniform1f(\"scale\", scale);\n\t\tthis.drawScreen();\n\t}\n\n\tprivate setupGL() {\n\t\tconst gl = this.canvas.getContext(\"webgl2\", {\n\t\t\talpha: true,\n\t\t\tdepth: false,\n\t\t\tpowerPreference: \"low-power\",\n\t\t});\n\t\tif (!gl) throw new Error(\"WebGL2 not supported\");\n\t\tthis.gl = gl;\n\t\tgl.enable(gl.BLEND);\n\t\tgl.disable(gl.DEPTH_TEST);\n\t\tgl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\t\tif (!gl.getExtension(\"EXT_color_buffer_float\"))\n\t\t\tconsole.warn(\"EXT_color_buffer_float not supported\");\n\t\tif (!gl.getExtension(\"EXT_float_blend\"))\n\t\t\tconsole.warn(\"EXT_float_blend not supported\");\n\t\tif (!gl.getExtension(\"OES_texture_float_linear\"))\n\t\t\tconsole.warn(\"OES_texture_float_linear not supported\");\n\n\t\treturn gl;\n\t}\n\n\toverride setLowFreqVolume(volume: number): void {\n\t\tthis._lowFreqVolume = volume;\n\t}\n\n\toverride setStaticMode(enable: boolean): void {\n\t\tthis.staticMode = enable;\n\t\tthis.lastFrameTime = performance.now();\n\t\tthis.requestTick();\n\t}\n\toverride setFPS(fps: number): void {\n\t\tthis.maxFPS = fps;\n\t}\n\toverride pause(): void {\n\t\tif (this.tickHandle) {\n\t\t\tcancelAnimationFrame(this.tickHandle);\n\t\t\tthis.tickHandle = 0;\n\t\t}\n\t\tthis.paused = true;\n\t}\n\toverride resume(): void {\n\t\tthis.paused = false;\n\t\tthis.requestTick();\n\t}\n\toverride async setAlbum(\n\t\talbumSource: string | HTMLImageElement | HTMLVideoElement,\n\t\tisVideo = false,\n\t): Promise<void> {\n\t\tif (typeof albumSource === \"string\" && albumSource.trim().length === 0)\n\t\t\tthrow new Error(\"Empty album url\");\n\t\tlet res: HTMLImageElement | HTMLVideoElement | null = null;\n\t\tlet remainRetryTimes = 5;\n\t\tconsole.log(\"setAlbum\", albumSource);\n\t\twhile (!res && remainRetryTimes > 0) {\n\t\t\ttry {\n\t\t\t\tif (typeof albumSource === \"string\") {\n\t\t\t\t\tres = await loadResourceFromUrl(albumSource, isVideo);\n\t\t\t\t} else {\n\t\t\t\t\tres = await loadResourceFromElement(albumSource);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`failed on loading album resource, retrying (${remainRetryTimes})`,\n\t\t\t\t\t{\n\t\t\t\t\t\talbumSource,\n\t\t\t\t\t\terror,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tremainRetryTimes--;\n\t\t\t}\n\t\t}\n\t\tconsole.log(\"loaded album resource\", res);\n\t\tif (!res) return;\n\t\t// resize image\n\t\tconst c = this.reduceImageSizeCanvas;\n\t\tconst ctx = c.getContext(\"2d\");\n\t\tif (!ctx) throw new Error(\"Failed to create canvas context\");\n\t\tctx.clearRect(0, 0, c.width, c.height);\n\t\t// const baseFilter = \"saturate(3) contrast(0.8) saturate(8) brightness(0.4)\";\n\t\tconst blurRadius = 10;\n\t\t// Safari 不支持 filter\n\t\t// ctx.filter = baseFilter;\n\t\tconst imgw =\n\t\t\tres instanceof HTMLVideoElement ? res.videoWidth : res.naturalWidth;\n\t\tconst imgh =\n\t\t\tres instanceof HTMLVideoElement ? res.videoHeight : res.naturalHeight;\n\t\tif (imgw * imgh === 0) throw new Error(\"Invalid image size\");\n\t\tctx.drawImage(res, 0, 0, imgw, imgh, 0, 0, c.width, c.height);\n\t\t// ctx.fillStyle = \"white\";\n\t\t// ctx.fillRect(0, 0, c.width, c.height);\n\t\tconst imageData = ctx.getImageData(0, 0, c.width, c.height);\n\t\tcontrastImage(imageData, 0.8);\n\t\tsaturateImage(imageData, 1.5);\n\t\t//\t\tcontrastImage(imageData, 0.8);\n\t\t//\t\tbrightnessImage(imageData, 0.9);\n\t\tblurImage(imageData, blurRadius, 4);\n\t\tconst sprite = new AlbumTexture(\n\t\t\tthis.gl,\n\t\t\tthis.mainProgram,\n\t\t\tthis.vertexBuffer,\n\t\t\tthis.indexBuffer,\n\t\t\timageData,\n\t\t);\n\t\tthis.sprites.push(sprite);\n\t\tthis.playTime = Math.random() * 100000;\n\t\tthis.lastFrameTime = performance.now();\n\t\tconsole.info(Math.random() * 10000);\n\t\tconst r = Number.parseInt((Math.random() * 10000).toFixed(0)) % 3;\n\t\tif (r === 0) {\n\t\t\tthis.IllIlllIlIIlllI = [-1.3, -0.9];\n\t\t\t// this.IllIlllIlIIlllI = [-1.1, -.9];\n\t\t} else if (r === 1) {\n\t\t\t// this.IllIlllIlIIlllI = [-0.3, -0.2];\n\t\t\tthis.IllIlllIlIIlllI = [-1.1, -0.9];\n\t\t} else {\n\t\t\tthis.IllIlllIlIIlllI = [-1.3, -0.9];\n\t\t}\n\t\tthis.requestTick();\n\t}\n\n\toverride setHasLyric(hasLyric: boolean): void {\n\t\tthis.hasLyric = hasLyric;\n\t\tthis.requestTick();\n\t}\n\n\toverride getElement(): HTMLElement {\n\t\treturn this.canvas;\n\t}\n\toverride dispose(): void {\n\t\tsuper.dispose();\n\t\tthis.vertexBuffer.dispose();\n\t\tthis.indexBuffer.dispose();\n\t\tthis.noiseTexture.dispose();\n\t\tfor (const s of this.sprites) {\n\t\t\ts.dispose();\n\t\t}\n\t\tthis.copyProgram.dispose();\n\t\tthis.blendProgram.dispose();\n\t\tthis.mainProgram.dispose();\n\t\tfor (const fb of this.fb) {\n\t\t\tfb.dispose();\n\t\t}\n\t\tfor (const fb of this.historyFrameBuffer) {\n\t\t\tfb.dispose();\n\t\t}\n\t\tif (this.tickHandle) {\n\t\t\tcancelAnimationFrame(this.tickHandle);\n\t\t\tthis.tickHandle = 0;\n\t\t}\n\t}\n}\n","/**\n * @fileoverview\n * 一个播放歌词的组件\n * @author SteveXMH\n */\n\nexport { AbstractBaseRenderer, BaseRenderer } from \"./base\";\nimport { AbstractBaseRenderer, BaseRenderer } from \"./base\";\nexport { PixiRenderer } from \"./pixi-renderer\";\nexport { EplorRenderer } from \"./eplor-renderer\";\n\nexport class BackgroundRender<Renderer extends BaseRenderer>\n\timplements AbstractBaseRenderer\n{\n\tprivate element: HTMLCanvasElement;\n\tprivate renderer: Renderer;\n\tconstructor(renderer: Renderer, canvas: HTMLCanvasElement) {\n\t\tthis.renderer = renderer;\n\n\t\tthis.element = canvas;\n\t\tcanvas.style.pointerEvents = \"none\";\n\t\tcanvas.style.zIndex = \"-1\";\n\t\tcanvas.style.contain = \"strict\";\n\t}\n\n\tstatic new<Renderer extends BaseRenderer>(type: {\n\t\tnew (canvas: HTMLCanvasElement): Renderer;\n\t}): BackgroundRender<Renderer> {\n\t\tconst canvas = document.createElement(\"canvas\");\n\t\treturn new BackgroundRender(new type(canvas), canvas);\n\t}\n\n\tsetRenderScale(scale: number): void {\n\t\tthis.renderer.setRenderScale(scale);\n\t}\n\n\tsetFlowSpeed(speed: number): void {\n\t\tthis.renderer.setFlowSpeed(speed);\n\t}\n\tsetStaticMode(enable: boolean): void {\n\t\tthis.renderer.setStaticMode(enable);\n\t}\n\tsetFPS(fps: number): void {\n\t\tthis.renderer.setFPS(fps);\n\t}\n\tpause(): void {\n\t\tthis.renderer.pause();\n\t}\n\tresume(): void {\n\t\tthis.renderer.resume();\n\t}\n\tsetLowFreqVolume(volume: number): void {\n\t\tthis.renderer.setLowFreqVolume(volume);\n\t}\n\tsetHasLyric(hasLyric: boolean): void {\n\t\tthis.renderer.setHasLyric(hasLyric);\n\t}\n\tsetAlbum(\n\t\talbumSource: string | HTMLImageElement | HTMLVideoElement,\n\t\tisVideo?: boolean,\n\t): Promise<void> {\n\t\treturn this.renderer.setAlbum(albumSource, isVideo);\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tdispose() {\n\t\tthis.renderer.dispose();\n\t\tthis.element.remove();\n\t}\n}\n","export const eqSet: <T>(xs: Set<T>, ys: Set<T>) => boolean = (\n\txs,\n\tys,\n): boolean => xs.size === ys.size && [...xs].every((x) => ys.has(x));\n","export function derivative(f: (x: number) => number) {\n\tconst h = 0.001;\n\treturn (x: number) => (f(x + h) - f(x - h)) / (2 * h);\n}\n\nexport function getVelocity(f: (t: number) => number): (t: number) => number {\n\treturn derivative(f);\n}\n","import { getVelocity } from \"./derivative\";\n\n/** MIT License github.com/pushkine/ */\nexport interface SpringParams {\n\tmass: number; // = 1.0\n\tdamping: number; // = 10.0\n\tstiffness: number; // = 100.0\n\tsoft: boolean; // = false\n}\n\ntype seconds = number;\n\nexport class Spring {\n\tprivate currentPosition = 0;\n\tprivate targetPosition = 0;\n\tprivate currentTime = 0;\n\tprivate params: Partial<SpringParams> = {};\n\tprivate currentSolver: (t: seconds) => number;\n\tprivate getV: (t: seconds) => number;\n\tprivate getV2: (t: seconds) => number;\n\tprivate queueParams:\n\t\t| (Partial<SpringParams> & {\n\t\t\t\ttime: number;\n\t\t })\n\t\t| undefined;\n\tprivate queuePosition:\n\t\t| {\n\t\t\t\ttime: number;\n\t\t\t\tposition: number;\n\t\t }\n\t\t| undefined;\n\tconstructor(currentPosition = 0) {\n\t\tthis.targetPosition = currentPosition;\n\t\tthis.currentPosition = this.targetPosition;\n\t\tthis.currentSolver = () => this.targetPosition;\n\t\tthis.getV = () => 0;\n\t\tthis.getV2 = () => 0;\n\t}\n\tprivate resetSolver() {\n\t\tconst curV = this.getV(this.currentTime);\n\t\tthis.currentTime = 0;\n\t\tthis.currentSolver = solveSpring(\n\t\t\tthis.currentPosition,\n\t\t\tcurV,\n\t\t\tthis.targetPosition,\n\t\t\t0,\n\t\t\tthis.params,\n\t\t);\n\t\tthis.getV = getVelocity(this.currentSolver);\n\t\tthis.getV2 = getVelocity(this.getV);\n\t}\n\tarrived() {\n\t\treturn (\n\t\t\tMath.abs(this.targetPosition - this.currentPosition) < 0.01 &&\n\t\t\tthis.getV(this.currentTime) < 0.01 &&\n\t\t\tthis.getV2(this.currentTime) < 0.01 &&\n\t\t\tthis.queueParams === undefined &&\n\t\t\tthis.queuePosition === undefined\n\t\t);\n\t}\n\tsetPosition(targetPosition: number) {\n\t\tthis.targetPosition = targetPosition;\n\t\tthis.currentPosition = targetPosition;\n\t\tthis.currentSolver = () => this.targetPosition;\n\t\tthis.getV = () => 0;\n\t\tthis.getV2 = () => 0;\n\t}\n\tupdate(delta = 0) {\n\t\tthis.currentTime += delta;\n\t\tthis.currentPosition = this.currentSolver(this.currentTime);\n\t\tif (this.queueParams) {\n\t\t\tthis.queueParams.time -= delta;\n\t\t\tif (this.queueParams.time <= 0) {\n\t\t\t\tthis.updateParams({\n\t\t\t\t\t...this.queueParams,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (this.queuePosition) {\n\t\t\tthis.queuePosition.time -= delta;\n\t\t\tif (this.queuePosition.time <= 0) {\n\t\t\t\tthis.setTargetPosition(this.queuePosition.position);\n\t\t\t}\n\t\t}\n\t\tif (this.arrived()) {\n\t\t\tthis.setPosition(this.targetPosition);\n\t\t}\n\t}\n\tupdateParams(params: Partial<SpringParams>, delay = 0) {\n\t\tif (delay > 0) {\n\t\t\tthis.queueParams = {\n\t\t\t\t...(this.queuePosition ?? {}),\n\t\t\t\t...params,\n\t\t\t\ttime: delay,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.queuePosition = undefined;\n\t\t\tthis.params = {\n\t\t\t\t...this.params,\n\t\t\t\t...params,\n\t\t\t};\n\t\t\tthis.resetSolver();\n\t\t}\n\t}\n\tsetTargetPosition(targetPosition: number, delay = 0) {\n\t\tif (delay > 0) {\n\t\t\tthis.queuePosition = {\n\t\t\t\t...(this.queuePosition ?? {}),\n\t\t\t\tposition: targetPosition,\n\t\t\t\ttime: delay,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.queuePosition = undefined;\n\t\t\tthis.targetPosition = targetPosition;\n\t\t\tthis.resetSolver();\n\t\t}\n\t}\n\tgetCurrentPosition() {\n\t\treturn this.currentPosition;\n\t}\n}\n\nfunction solveSpring(\n\tfrom: number,\n\tvelocity: number,\n\tto: number,\n\tdelay: seconds = 0,\n\tparams?: Partial<SpringParams>,\n): (t: seconds) => number {\n\tconst soft = params?.soft ?? false;\n\tconst stiffness = params?.stiffness ?? 100;\n\tconst damping = params?.damping ?? 10;\n\tconst mass = params?.mass ?? 1;\n\tconst delta = to - from;\n\tif (soft || 1.0 <= damping / (2.0 * Math.sqrt(stiffness * mass))) {\n\t\tconst angular_frequency = -Math.sqrt(stiffness / mass);\n\t\tconst leftover = -angular_frequency * delta - velocity;\n\t\treturn (t: seconds) => {\n\t\t\tt -= delay;\n\t\t\tif (t < 0) return from;\n\t\t\treturn to - (delta + t * leftover) * Math.E ** (t * angular_frequency);\n\t\t};\n\t}\n\tconst damping_frequency = Math.sqrt(4.0 * mass * stiffness - damping ** 2.0);\n\tconst leftover =\n\t\t(damping * delta - 2.0 * mass * velocity) / damping_frequency;\n\tconst dfm = (0.5 * damping_frequency) / mass;\n\tconst dm = -(0.5 * damping) / mass;\n\treturn (t: seconds) => {\n\t\tt -= delay;\n\t\tif (t < 0) return from;\n\t\treturn (\n\t\t\tto -\n\t\t\t(Math.cos(t * dfm) * delta + Math.sin(t * dfm) * leftover) *\n\t\t\t\tMath.E ** (t * dm)\n\t\t);\n\t};\n}\n","import { LyricPlayer } from \".\";\nimport { Disposable, HasElement } from \"../interfaces\";\nimport { Spring } from \"../utils/spring\";\n\nexport class BottomLineEl implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate left = 0;\n\tprivate top = 0;\n\tprivate delay = 0;\n\t// 由 LyricPlayer 来设置\n\tlineSize: number[] = [0, 0];\n\treadonly lineTransforms = {\n\t\tposX: new Spring(0),\n\t\tposY: new Spring(0),\n\t};\n\tconstructor(private lyricPlayer: LyricPlayer) {\n\t\tthis.element.setAttribute(\n\t\t\t\"class\",\n\t\t\tthis.lyricPlayer.style.classes.lyricLine,\n\t\t);\n\t\tthis.rebuildStyle();\n\t}\n\tmeasureSize(): [number, number] {\n\t\tconst size: [number, number] = [\n\t\t\tthis.element.clientWidth,\n\t\t\tthis.element.clientHeight,\n\t\t];\n\t\treturn size;\n\t}\n\tprivate lastStyle = \"\";\n\tshow() {\n\t\tthis.rebuildStyle();\n\t}\n\thide() {\n\t\tthis.rebuildStyle();\n\t}\n\trebuildStyle() {\n\t\tlet style = `transform:translate(${this.lineTransforms.posX\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(2)}px,${this.lineTransforms.posY\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(2)}px);`;\n\t\tif (!this.lyricPlayer.getEnableSpring() && this.isInSight) {\n\t\t\tstyle += `transition-delay:${this.delay}ms;`;\n\t\t}\n\t\tif (style !== this.lastStyle) {\n\t\t\tthis.lastStyle = style;\n\t\t\tthis.element.setAttribute(\"style\", style);\n\t\t}\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tsetTransform(\n\t\tleft: number = this.left,\n\t\ttop: number = this.top,\n\t\tforce = false,\n\t\tdelay = 0,\n\t) {\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.delay = (delay * 1000) | 0;\n\t\tif (force || !this.lyricPlayer.getEnableSpring()) {\n\t\t\tif (force)\n\t\t\t\tthis.element.classList.add(\n\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t);\n\t\t\tthis.lineTransforms.posX.setPosition(left);\n\t\t\tthis.lineTransforms.posY.setPosition(top);\n\t\t\tif (!this.lyricPlayer.getEnableSpring()) this.show();\n\t\t\telse this.rebuildStyle();\n\t\t\tif (force)\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tthis.element.classList.remove(\n\t\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t} else {\n\t\t\tthis.lineTransforms.posX.setTargetPosition(left, delay);\n\t\t\tthis.lineTransforms.posY.setTargetPosition(top, delay);\n\t\t}\n\t}\n\tupdate(delta = 0) {\n\t\tif (!this.lyricPlayer.getEnableSpring()) return;\n\t\tthis.lineTransforms.posX.update(delta);\n\t\tthis.lineTransforms.posY.update(delta);\n\t\tif (this.isInSight) {\n\t\t\tthis.show();\n\t\t} else {\n\t\t\tthis.hide();\n\t\t}\n\t}\n\tget isInSight() {\n\t\tconst l = this.lineTransforms.posX.getCurrentPosition();\n\t\tconst t = this.lineTransforms.posY.getCurrentPosition();\n\t\tconst r = l + this.lineSize[0];\n\t\tconst b = t + this.lineSize[1];\n\t\tconst pr = this.lyricPlayer.size[0];\n\t\tconst pb = this.lyricPlayer.size[1];\n\t\treturn !(l > pr || t > pb || r < 0 || b < 0);\n\t}\n\tdispose(): void {\n\t\tthis.element.remove();\n\t}\n}\n","import { LyricPlayer } from \".\";\nimport type { Disposable, HasElement } from \"../interfaces\";\n\nfunction easeInOutBack(x: number): number {\n\tconst c1 = 1.70158;\n\tconst c2 = c1 * 1.525;\n\n\treturn x < 0.5\n\t\t? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n\t\t: (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n}\n\nconst clamp = (min: number, cur: number, max: number) =>\n\tMath.max(min, Math.min(cur, max));\n\nexport class InterludeDots implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate dot0: HTMLElement = document.createElement(\"span\");\n\tprivate dot1: HTMLElement = document.createElement(\"span\");\n\tprivate dot2: HTMLElement = document.createElement(\"span\");\n\tprivate left = 0;\n\tprivate top = 0;\n\tprivate scale = 1;\n\tprivate playing = true;\n\tprivate lastStyle = \"\";\n\tprivate currentInterlude?: [number, number];\n\tprivate currentTime = 0;\n\tprivate interludeTime = 0;\n\tprivate targetBreatheDuration = 1500;\n\tconstructor(private readonly lyricPlayer: LyricPlayer) {\n\t\tthis.element.className = this.lyricPlayer.style.classes.interludeDots;\n\t\tthis.element.appendChild(this.dot0);\n\t\tthis.element.appendChild(this.dot1);\n\t\tthis.element.appendChild(this.dot2);\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tsetTransform(left: number = this.left, top: number = this.top) {\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.update();\n\t}\n\tsetInterlude(interlude?: [number, number]) {\n\t\tthis.currentInterlude = interlude;\n\t\tthis.currentTime = interlude?.[0] ?? 0;\n\t}\n\tpause() {\n\t\tthis.playing = false;\n\t}\n\tresume() {\n\t\tthis.playing = true;\n\t}\n\tupdate(delta = 0) {\n\t\tif (!this.playing) return;\n\t\tthis.currentTime += delta;\n\t\tlet curStyle = \"\";\n\n\t\tcurStyle += `transform:translate(${this.left.toFixed(\n\t\t\t2,\n\t\t)}px, ${this.top.toFixed(2)}px)`;\n\n\t\t// 计算缩放大小\n\n\t\tif (this.currentInterlude) {\n\t\t\tconst interludeDuration =\n\t\t\t\tthis.currentInterlude[1] - this.currentInterlude[0];\n\t\t\tconst currentDuration = this.currentTime - this.currentInterlude[0];\n\t\t\tif (currentDuration <= interludeDuration) {\n\t\t\t\tconst breatheDuration =\n\t\t\t\t\tinterludeDuration /\n\t\t\t\t\tMath.ceil(interludeDuration / this.targetBreatheDuration);\n\t\t\t\tlet scale = 1;\n\t\t\t\tlet globalOpacity = 1;\n\n\t\t\t\tscale *=\n\t\t\t\t\tMath.sin(1.5 * Math.PI - (currentDuration / breatheDuration) * 2) /\n\t\t\t\t\t\t20 +\n\t\t\t\t\t1;\n\n\t\t\t\tif (currentDuration < 1000) {\n\t\t\t\t\tscale *= 1 - ((1000 - currentDuration) / 1000) ** 2;\n\t\t\t\t}\n\n\t\t\t\tif (currentDuration < 500) {\n\t\t\t\t\tglobalOpacity = 0;\n\t\t\t\t} else if (currentDuration < 1000) {\n\t\t\t\t\tglobalOpacity *= (currentDuration - 500) / 500;\n\t\t\t\t}\n\n\t\t\t\tif (interludeDuration - currentDuration < 750) {\n\t\t\t\t\tscale *=\n\t\t\t\t\t\t1 -\n\t\t\t\t\t\teaseInOutBack(\n\t\t\t\t\t\t\t(750 - (interludeDuration - currentDuration)) / 750 / 2,\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (interludeDuration - currentDuration < 375) {\n\t\t\t\t\tglobalOpacity *= clamp(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t(interludeDuration - currentDuration) / 375,\n\t\t\t\t\t\t1,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst dotsDuration = Math.max(0, interludeDuration - 750);\n\n\t\t\t\tscale = Math.max(0, scale) * 0.7;\n\n\t\t\t\tcurStyle += ` scale(${scale})`;\n\n\t\t\t\tconst dot0Opacity = clamp(\n\t\t\t\t\t0.25,\n\t\t\t\t\t((currentDuration * 3) / dotsDuration) * 0.75,\n\t\t\t\t\t1,\n\t\t\t\t);\n\t\t\t\tconst dot1Opacity = clamp(\n\t\t\t\t\t0.25,\n\t\t\t\t\t(((currentDuration - dotsDuration / 3) * 3) / dotsDuration) * 0.75,\n\t\t\t\t\t1,\n\t\t\t\t);\n\t\t\t\tconst dot2Opacity = clamp(\n\t\t\t\t\t0.25,\n\t\t\t\t\t(((currentDuration - (dotsDuration / 3) * 2) * 3) / dotsDuration) *\n\t\t\t\t\t\t0.75,\n\t\t\t\t\t1,\n\t\t\t\t);\n\n\t\t\t\tthis.dot0.style.opacity = `${clamp(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(0, globalOpacity * dot0Opacity),\n\t\t\t\t\t1,\n\t\t\t\t)}`;\n\t\t\t\tthis.dot1.style.opacity = `${clamp(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(0, globalOpacity * dot1Opacity),\n\t\t\t\t\t1,\n\t\t\t\t)}`;\n\t\t\t\tthis.dot2.style.opacity = `${clamp(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(0, globalOpacity * dot2Opacity),\n\t\t\t\t\t1,\n\t\t\t\t)}`;\n\t\t\t} else {\n\t\t\t\tcurStyle += \" scale(0)\";\n\t\t\t\tthis.dot0.style.opacity = \"0\";\n\t\t\t\tthis.dot1.style.opacity = \"0\";\n\t\t\t\tthis.dot2.style.opacity = \"0\";\n\t\t\t}\n\t\t} else {\n\t\t\tcurStyle += \" scale(0)\";\n\t\t\tthis.dot0.style.opacity = \"0\";\n\t\t\tthis.dot1.style.opacity = \"0\";\n\t\t\tthis.dot2.style.opacity = \"0\";\n\t\t}\n\n\t\tcurStyle += \";\";\n\n\t\tif (this.lastStyle !== curStyle) {\n\t\t\tthis.element.setAttribute(\"style\", curStyle);\n\t\t\tthis.lastStyle = curStyle;\n\t\t}\n\t}\n\tdispose() {\n\t\tthis.element.remove();\n\t}\n}\n","// biome-ignore format: matrix\nexport type Matrix4 = [\n\tnumber, number, number, number,\n\tnumber, number, number, number,\n\tnumber, number, number, number,\n\tnumber, number, number, number,\n];\n\nexport function createMatrix4(): Matrix4 {\n\t// biome-ignore format: matrix\n\treturn [\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 1\n ];\n}\n\nexport function scaleMatrix4(\n\tm: Matrix4,\n\tscale = 1,\n\torigin = { x: 0, y: 0 },\n): Matrix4 {\n\tconst [ox, oy] = [origin.x, origin.y];\n\t// biome-ignore format: matrix\n\treturn [\n m[0] * scale , m[1] * scale , m[2] * scale , m[3],\n m[4] * scale , m[5] * scale , m[6] * scale , m[7],\n m[8] * scale , m[9] * scale , m[10] * scale, m[11],\n m[12] - ox * scale + ox, m[13] - oy * scale + oy, m[14] , m[15]\n ];\n}\n\nexport function translateMatrix4(m: Matrix4, x = 0, y = 0, z = 0): Matrix4 {\n\t// biome-ignore format: matrix\n\treturn [\n m[0] , m[1] , m[2] , m[3] ,\n m[4] , m[5] , m[6] , m[7] ,\n m[8] , m[9] , m[10] , m[11],\n m[12] + x, m[13] + y, m[14] + z, m[15]\n ];\n}\n\nexport function matrix4ToCSS(m: Matrix4, fractionDigits = 4): string {\n\tconst format = (n: number, i: number) => n.toFixed(fractionDigits);\n\treturn `matrix3d(${m.map(format).join(\", \")})`;\n}\n","/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\n */\n\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\nvar NEWTON_ITERATIONS = 4;\nvar NEWTON_MIN_SLOPE = 0.001;\nvar SUBDIVISION_PRECISION = 0.0000001;\nvar SUBDIVISION_MAX_ITERATIONS = 10;\n\nvar kSplineTableSize = 11;\nvar kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\nvar float32ArraySupported = typeof Float32Array === 'function';\n\nfunction A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }\nfunction B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }\nfunction C (aA1) { return 3.0 * aA1; }\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }\n\nfunction binarySubdivide (aX, aA, aB, mX1, mX2) {\n var currentX, currentT, i = 0;\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) {\n aB = currentT;\n } else {\n aA = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n return currentT;\n}\n\nfunction newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {\n for (var i = 0; i < NEWTON_ITERATIONS; ++i) {\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n if (currentSlope === 0.0) {\n return aGuessT;\n }\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n}\n\nfunction LinearEasing (x) {\n return x;\n}\n\nmodule.exports = function bezier (mX1, mY1, mX2, mY2) {\n if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range');\n }\n\n if (mX1 === mY1 && mX2 === mY2) {\n return LinearEasing;\n }\n\n // Precompute samples table\n var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n for (var i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n }\n\n function getTForX (aX) {\n var intervalStart = 0.0;\n var currentSample = 1;\n var lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n --currentSample;\n\n // Interpolate to provide an initial guess for t\n var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n var guessForT = intervalStart + dist * kSampleStepSize;\n\n var initialSlope = getSlope(guessForT, mX1, mX2);\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n } else if (initialSlope === 0.0) {\n return guessForT;\n } else {\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n }\n }\n\n return function BezierEasing (x) {\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n if (x === 0) {\n return 0;\n }\n if (x === 1) {\n return 1;\n }\n return calcBezier(getTForX(x), mY1, mY2);\n };\n};\n","import { LyricPlayer } from \".\";\nimport { Disposable, HasElement, LyricLine, LyricWord } from \"../interfaces\";\nimport { createMatrix4, matrix4ToCSS, scaleMatrix4 } from \"../utils/matrix\";\nimport { Spring } from \"../utils/spring\";\nimport bezier from \"bezier-easing\";\nimport { WebAnimationSpring } from \"../utils/wa-spring\";\n\nconst CJKEXP = /^[\\p{Unified_Ideograph}\\u0800-\\u9FFC]+$/u;\n\nenum EmphasizeAnimationMethod {\n\tFloatAndGlow = \"float-and-glow\",\n\tFloatOnly = \"float-only\",\n}\n\ninterface RealWord extends LyricWord {\n\tmainElement: HTMLSpanElement;\n\tsubElements: HTMLSpanElement[];\n\telementAnimations: Animation[];\n\tmaskAnimations: Animation[];\n\twidth: number;\n\theight: number;\n\tpadding: number;\n\tshouldEmphasize: boolean;\n}\n\nconst ANIMATION_FRAME_QUANTITY = 32;\n\nconst norNum = (min: number, max: number) => (x: number) =>\n\tMath.min(1, Math.max(0, (x - min) / (max - min)));\nconst EMP_EASING_MID = 0.4;\nconst beginNum = norNum(0, EMP_EASING_MID);\nconst endNum = norNum(EMP_EASING_MID, 1);\n\nconst makeEmpEasing = (mid: number) => {\n\tconst bezIn = bezier(0.3, 0, 0.25, 1);\n\tconst bezOut = bezier(0.5, 0, 0.3, 1);\n\treturn (x: number) => (x < mid ? bezIn(beginNum(x)) : 1 - bezOut(endNum(x)));\n};\nconst defaultEmpEasing = makeEmpEasing(EMP_EASING_MID);\n\n// function generateFadeGradient(\n// \twidth: number,\n// \tpadding = 0,\n// \tbright = \"rgba(0,0,0,0.85)\",\n// \tdark = \"rgba(0,0,0,0.25)\",\n// ): [string, number] {\n// \tconst totalAspect = 2 + width + padding;\n// \tconst widthInTotal = width / totalAspect;\n// \tconst leftPos = (1 - widthInTotal) / 2;\n// \treturn [\n// \t\t`linear-gradient(to right,${bright} ${leftPos * 100}%,${dark} ${\n// \t\t\tleftPos * 100\n// \t\t}%,${bright} ${(leftPos + widthInTotal) * 100}%,${dark} ${\n// \t\t\t(leftPos + widthInTotal) * 100\n// \t\t}%)`,\n// \t\ttotalAspect,\n// \t];\n// }\n\nfunction generateFadeGradient(\n\twidth: number,\n\tpadding = 0,\n\tbright = \"rgba(0,0,0,0.85)\",\n\tdark = \"rgba(0,0,0,0.25)\",\n): [string, number] {\n\tconst totalAspect = 2 + width + padding;\n\tconst widthInTotal = width / totalAspect;\n\tconst leftPos = (1 - widthInTotal) / 2;\n\treturn [\n\t\t`linear-gradient(to right,${bright} ${leftPos * 100}%,${dark} ${\n\t\t\t(leftPos + widthInTotal) * 100\n\t\t}%)`,\n\t\ttotalAspect,\n\t];\n}\n\n// 将输入的单词重新分组,之间没有空格的单词将会组合成一个单词数组\n// 例如输入:[\"Life\", \" \", \"is\", \" a\", \" su\", \"gar so\", \"sweet\"]\n// 应该返回:[\"Life\", \" \", \"is\", \" a\", [\" su\", \"gar\"], \"so\", \"sweet\"]\nfunction chunkAndSplitLyricWords(\n\twords: LyricWord[],\n): (LyricWord | LyricWord[])[] {\n\tconst resplitedWords: LyricWord[] = [];\n\n\tfor (const w of words) {\n\t\tconst realLength = w.word.replace(/\\s/g, \"\").length;\n\t\tconst splited = w.word.split(\" \").filter((v) => v.trim().length > 0);\n\t\tif (splited.length > 1) {\n\t\t\tif (w.word.startsWith(\" \")) {\n\t\t\t\tresplitedWords.push({\n\t\t\t\t\tword: \" \",\n\t\t\t\t\tstartTime: 0,\n\t\t\t\t\tendTime: 0,\n\t\t\t\t});\n\t\t\t}\n\t\t\tlet charPos = 0;\n\t\t\tfor (const s of splited) {\n\t\t\t\tconst word: LyricWord = {\n\t\t\t\t\tword: s,\n\t\t\t\t\tstartTime:\n\t\t\t\t\t\tw.startTime + (charPos / realLength) * (w.endTime - w.startTime),\n\t\t\t\t\tendTime:\n\t\t\t\t\t\tw.startTime +\n\t\t\t\t\t\t((charPos + s.length) / realLength) * (w.endTime - w.startTime),\n\t\t\t\t};\n\t\t\t\tresplitedWords.push(word);\n\t\t\t\tresplitedWords.push({\n\t\t\t\t\tword: \" \",\n\t\t\t\t\tstartTime: 0,\n\t\t\t\t\tendTime: 0,\n\t\t\t\t});\n\t\t\t\tcharPos += s.length;\n\t\t\t}\n\t\t\tif (!w.word.endsWith(\" \")) {\n\t\t\t\tresplitedWords.pop();\n\t\t\t}\n\t\t} else {\n\t\t\tresplitedWords.push(w);\n\t\t}\n\t}\n\n\tlet wordChunk: string[] = [];\n\tlet wChunk: LyricWord[] = [];\n\tconst result: (LyricWord | LyricWord[])[] = [];\n\n\tfor (const w of resplitedWords) {\n\t\tconst word = w.word;\n\t\twordChunk.push(word);\n\t\twChunk.push(w);\n\t\tif (word.length > 0 && word.trim().length === 0) {\n\t\t\twordChunk.pop();\n\t\t\twChunk.pop();\n\t\t\tif (wChunk.length === 1) {\n\t\t\t\tresult.push(wChunk[0]);\n\t\t\t} else if (wChunk.length > 1) {\n\t\t\t\tresult.push(wChunk);\n\t\t\t}\n\t\t\tresult.push(w);\n\t\t\twordChunk = [];\n\t\t\twChunk = [];\n\t\t} else if (\n\t\t\t!/^\\s*[^\\s]*\\s*$/.test(wordChunk.join(\"\")) ||\n\t\t\tCJKEXP.test(word)\n\t\t) {\n\t\t\twordChunk.pop();\n\t\t\twChunk.pop();\n\t\t\tif (wChunk.length === 1) {\n\t\t\t\tresult.push(wChunk[0]);\n\t\t\t} else if (wChunk.length > 1) {\n\t\t\t\tresult.push(wChunk);\n\t\t\t}\n\t\t\twordChunk = [word];\n\t\t\twChunk = [w];\n\t\t}\n\t}\n\n\tif (wChunk.length === 1) {\n\t\tresult.push(wChunk[0]);\n\t} else {\n\t\tresult.push(wChunk);\n\t}\n\n\treturn result;\n}\n\n// 果子在对辉光效果的解释是一种强调(emphasized)效果\n// 条件是一个单词时长大于等于 1s 且长度小于等于 7\nexport function shouldEmphasize(word: LyricWord): boolean {\n\treturn (\n\t\tword.endTime - word.startTime >= 1000 &&\n\t\tword.word.trim().length <= 7 &&\n\t\tword.word.trim().length >= 1\n\t);\n}\n\nexport class RawLyricLineMouseEvent extends MouseEvent {\n\tconstructor(\n\t\tpublic readonly line: LyricLineEl,\n\t\tevent: MouseEvent,\n\t) {\n\t\tsuper(event.type, event);\n\t}\n}\n\ntype MouseEventMap = {\n\t[evt in keyof HTMLElementEventMap]: HTMLElementEventMap[evt] extends MouseEvent\n\t\t? evt\n\t\t: never;\n};\ntype MouseEventTypes = MouseEventMap[keyof MouseEventMap];\ntype MouseEventListener = (\n\tthis: LyricLineEl,\n\tev: RawLyricLineMouseEvent,\n) => void;\n\nexport class LyricLineEl extends EventTarget implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate left = 0;\n\tprivate top = 0;\n\tprivate scale = 1;\n\tprivate blur = 0;\n\tprivate delay = 0;\n\tprivate splittedWords: RealWord[] = [];\n\t// 由 LyricPlayer 来设置\n\tlineSize: number[] = [0, 0];\n\treadonly lineTransforms = {\n\t\tposX: new Spring(0),\n\t\tposY: new Spring(0),\n\t\tscale: new Spring(1),\n\t};\n\t// readonly lineWebAnimationTransforms = {\n\t// \tposX: new WebAnimationSpring(this.element, \"transform\", (v) => `translateX(${v.toFixed(1)}px)`),\n\t// \tposY: new WebAnimationSpring(this.element, \"transform\", (v) => `translateY(${v.toFixed(1)}px)`),\n\t// \tscale: new WebAnimationSpring(this.element, \"transform\", (v) => `scale(${v.toFixed(4)})`, 1),\n\t// };\n\n\tconstructor(\n\t\tprivate lyricPlayer: LyricPlayer,\n\t\tprivate lyricLine: LyricLine = {\n\t\t\twords: [],\n\t\t\ttranslatedLyric: \"\",\n\t\t\tromanLyric: \"\",\n\t\t\tstartTime: 0,\n\t\t\tendTime: 0,\n\t\t\tisBG: false,\n\t\t\tisDuet: false,\n\t\t},\n\t) {\n\t\tsuper();\n\t\tthis._prevParentEl = lyricPlayer.getElement();\n\t\tthis.element.setAttribute(\n\t\t\t\"class\",\n\t\t\tthis.lyricPlayer.style.classes.lyricLine,\n\t\t);\n\t\tif (this.lyricLine.isBG) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine);\n\t\t}\n\t\tif (this.lyricLine.isDuet) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine);\n\t\t}\n\t\tthis.element.appendChild(document.createElement(\"div\")); // 歌词行\n\t\tthis.element.appendChild(document.createElement(\"div\")); // 翻译行\n\t\tthis.element.appendChild(document.createElement(\"div\")); // 音译行\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tconst trans = this.element.children[1] as HTMLDivElement;\n\t\tconst roman = this.element.children[2] as HTMLDivElement;\n\t\tmain.setAttribute(\"class\", this.lyricPlayer.style.classes.lyricMainLine);\n\t\ttrans.setAttribute(\"class\", this.lyricPlayer.style.classes.lyricSubLine);\n\t\troman.setAttribute(\"class\", this.lyricPlayer.style.classes.lyricSubLine);\n\t\tthis.rebuildElement();\n\t\tthis.rebuildStyle();\n\t}\n\tprivate listenersMap = new Map<string, Set<MouseEventListener>>();\n\tprivate readonly onMouseEvent = (e: MouseEvent) => {\n\t\tconst wrapped = new RawLyricLineMouseEvent(this, e);\n\t\tfor (const listener of this.listenersMap.get(e.type) ?? []) {\n\t\t\tlistener.call(this, wrapped);\n\t\t}\n\t\tif (!this.dispatchEvent(wrapped) || wrapped.defaultPrevented) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn false;\n\t\t}\n\t};\n\n\taddMouseEventListener(\n\t\ttype: MouseEventTypes,\n\t\tcallback: MouseEventListener | null,\n\t\toptions?: boolean | AddEventListenerOptions | undefined,\n\t): void {\n\t\tif (callback) {\n\t\t\tconst listeners = this.listenersMap.get(type) ?? new Set();\n\t\t\tif (listeners.size === 0)\n\t\t\t\tthis.element.addEventListener(type, this.onMouseEvent, options);\n\t\t\tlisteners.add(callback);\n\t\t\tthis.listenersMap.set(type, listeners);\n\t\t}\n\t}\n\n\tremoveMouseEventListener(\n\t\ttype: MouseEventTypes,\n\t\tcallback: MouseEventListener | null,\n\t\toptions?: boolean | EventListenerOptions | undefined,\n\t): void {\n\t\tif (callback) {\n\t\t\tconst listeners = this.listenersMap.get(type);\n\t\t\tif (listeners) {\n\t\t\t\tlisteners.delete(callback);\n\t\t\t\tif (listeners.size === 0)\n\t\t\t\t\tthis.element.removeEventListener(type, this.onMouseEvent, options);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate isEnabled = false;\n\tenable(maskAnimationTime = this.lyricLine.startTime) {\n\t\tthis.isEnabled = true;\n\t\tthis.element.classList.add(\"active\");\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.elementAnimations) {\n\t\t\t\ta.currentTime = 0;\n\t\t\t\ta.playbackRate = 1;\n\t\t\t\ta.play();\n\t\t\t}\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.currentTime = Math.min(\n\t\t\t\t\tthis.totalDuration,\n\t\t\t\t\tMath.max(0, maskAnimationTime - this.lyricLine.startTime),\n\t\t\t\t);\n\t\t\t\ta.playbackRate = 1;\n\t\t\t\ta.play();\n\t\t\t}\n\t\t}\n\t\tmain.classList.add(\"active\");\n\t}\n\tdisable(maskAnimationTime = 0) {\n\t\tthis.isEnabled = false;\n\t\tthis.element.classList.remove(\"active\");\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.elementAnimations) {\n\t\t\t\tif (a.id === \"float-word\") {\n\t\t\t\t\ta.playbackRate = -1;\n\t\t\t\t\ta.play();\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.currentTime = Math.min(\n\t\t\t\t\tthis.totalDuration,\n\t\t\t\t\tMath.max(0, maskAnimationTime - this.lyricLine.startTime),\n\t\t\t\t);\n\t\t\t\ta.pause();\n\t\t\t}\n\t\t}\n\t\tmain.classList.remove(\"active\");\n\t}\n\tresume() {\n\t\tif (!this.isEnabled) return;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.play();\n\t\t\t}\n\t\t}\n\t}\n\tpause() {\n\t\tif (!this.isEnabled) return;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.pause();\n\t\t\t}\n\t\t}\n\t}\n\tsetMaskAnimationState(maskAnimationTime = 0) {\n\t\tconst t = maskAnimationTime - this.lyricLine.startTime;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.currentTime = Math.min(this.totalDuration, Math.max(0, t));\n\t\t\t\ta.playbackRate = 1;\n\t\t\t\tif (t >= 0 && t < this.totalDuration) a.play();\n\t\t\t\telse a.pause();\n\t\t\t}\n\t\t}\n\t}\n\tmeasureSize(): [number, number] {\n\t\tif (this._hide) {\n\t\t\tif (this._prevParentEl) {\n\t\t\t\tthis._prevParentEl.appendChild(this.element);\n\t\t\t}\n\t\t\tthis.element.style.display = \"\";\n\t\t\tthis.element.style.visibility = \"hidden\";\n\t\t}\n\t\tconst size: [number, number] = [\n\t\t\tthis.element.clientWidth,\n\t\t\tthis.element.clientHeight,\n\t\t];\n\t\tif (this._hide) {\n\t\t\tif (this._prevParentEl) {\n\t\t\t\tthis.element.remove();\n\t\t\t}\n\t\t\tthis.element.style.display = \"none\";\n\t\t\tthis.element.style.visibility = \"\";\n\t\t}\n\t\treturn size;\n\t}\n\tsetLine(line: LyricLine) {\n\t\tthis.lyricLine = line;\n\t\tif (this.lyricLine.isBG) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine);\n\t\t} else {\n\t\t\tthis.element.classList.remove(this.lyricPlayer.style.classes.lyricBgLine);\n\t\t}\n\t\tif (this.lyricLine.isDuet) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine);\n\t\t} else {\n\t\t\tthis.element.classList.remove(\n\t\t\t\tthis.lyricPlayer.style.classes.lyricDuetLine,\n\t\t\t);\n\t\t}\n\t\tthis.rebuildElement();\n\t\tthis.rebuildStyle();\n\t}\n\tgetLine() {\n\t\treturn this.lyricLine;\n\t}\n\tprivate _hide = true;\n\tprivate _prevParentEl: HTMLElement | null = null;\n\tprivate lastStyle = \"\";\n\tshow() {\n\t\tthis._hide = false;\n\t\tif (this._prevParentEl) {\n\t\t\tthis._prevParentEl.appendChild(this.element);\n\t\t\tthis._prevParentEl = null;\n\t\t}\n\t\tthis.rebuildStyle();\n\t}\n\thide() {\n\t\tthis._hide = true;\n\t\tif (this.element.parentElement) {\n\t\t\tthis._prevParentEl = this.element.parentElement;\n\t\t\tthis.element.remove();\n\t\t}\n\t\tthis.rebuildStyle();\n\t}\n\trebuildStyle() {\n\t\tif (this._hide) {\n\t\t\tif (this.lastStyle !== \"display:none;transform:translate(0,-10000px);\") {\n\t\t\t\tthis.lastStyle = \"display:none;transform:translate(0,-10000px);\";\n\t\t\t\tthis.element.setAttribute(\n\t\t\t\t\t\"style\",\n\t\t\t\t\t\"display:none;transform:translate(0,-10000px);\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tlet style = \"\";\n\t\t// if (this.lyricPlayer.getEnableSpring()) {\n\t\tstyle += `transform:translate(${this.lineTransforms.posX\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(1)}px,${this.lineTransforms.posY\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(1)}px) scale(${this.lineTransforms.scale\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(4)});`;\n\t\tif (!this.lyricPlayer.getEnableSpring() && this.isInSight) {\n\t\t\tstyle += `transition-delay:${this.delay}ms;`;\n\t\t}\n\t\tstyle += `filter:blur(${Math.min(32, this.blur)}px);`;\n\t\tif (style !== this.lastStyle) {\n\t\t\tthis.lastStyle = style;\n\t\t\tthis.element.setAttribute(\"style\", style);\n\t\t}\n\t}\n\trebuildElement() {\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tconst trans = this.element.children[1] as HTMLDivElement;\n\t\tconst roman = this.element.children[2] as HTMLDivElement;\n\t\t// 如果是非动态歌词,那么就不需要分词了\n\t\tif (this.lyricPlayer._getIsNonDynamic()) {\n\t\t\tmain.innerText = this.lyricLine.words.map((w) => w.word).join(\"\");\n\t\t\ttrans.innerText = this.lyricLine.translatedLyric;\n\t\t\troman.innerText = this.lyricLine.romanLyric;\n\t\t\treturn;\n\t\t}\n\t\tconst chunkedWords = chunkAndSplitLyricWords(this.lyricLine.words);\n\t\tmain.innerHTML = \"\";\n\t\tthis.splittedWords = [];\n\t\tfor (const chunk of chunkedWords) {\n\t\t\tif (Array.isArray(chunk)) {\n\t\t\t\t// 多个没有空格的单词组合成的一个单词数组\n\t\t\t\tif (chunk.length === 0) continue;\n\t\t\t\tconst merged = chunk.reduce(\n\t\t\t\t\t(a, b) => {\n\t\t\t\t\t\ta.endTime = Math.max(a.endTime, b.endTime);\n\t\t\t\t\t\ta.startTime = Math.min(a.startTime, b.startTime);\n\t\t\t\t\t\ta.word += b.word;\n\t\t\t\t\t\treturn a;\n\t\t\t\t\t},\n\t\t\t\t\t{ word: \"\", startTime: Infinity, endTime: -Infinity },\n\t\t\t\t);\n\t\t\t\tconst emp = chunk\n\t\t\t\t\t.map((word) => shouldEmphasize(word))\n\t\t\t\t\t.reduce((a, b) => a || b, shouldEmphasize(merged));\n\t\t\t\tconst wrapperWordEl = document.createElement(\"span\");\n\t\t\t\twrapperWordEl.classList.add(\"emphasize-wrapper\");\n\t\t\t\tconst characterElements: HTMLElement[] = [];\n\t\t\t\tfor (const word of chunk) {\n\t\t\t\t\tconst mainWordEl = document.createElement(\"span\");\n\t\t\t\t\t// const mainWordFloatAnimation = this.initFloatAnimation(\n\t\t\t\t\t// \tmerged,\n\t\t\t\t\t// \tmainWordEl,\n\t\t\t\t\t// );\n\t\t\t\t\tif (emp) {\n\t\t\t\t\t\tmainWordEl.classList.add(\"emphasize\");\n\t\t\t\t\t\tconst charEls: HTMLSpanElement[] = [];\n\t\t\t\t\t\tfor (const char of word.word.trim().split(\"\")) {\n\t\t\t\t\t\t\tconst charEl = document.createElement(\"span\");\n\t\t\t\t\t\t\tcharEl.innerText = char;\n\t\t\t\t\t\t\tcharEls.push(charEl);\n\t\t\t\t\t\t\tcharacterElements.push(charEl);\n\t\t\t\t\t\t\tmainWordEl.appendChild(charEl);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst realWord: RealWord = {\n\t\t\t\t\t\t\t...word,\n\t\t\t\t\t\t\tmainElement: mainWordEl,\n\t\t\t\t\t\t\tsubElements: charEls,\n\t\t\t\t\t\t\telementAnimations: [this.initFloatAnimation(merged, mainWordEl)],\n\t\t\t\t\t\t\tmaskAnimations: [],\n\t\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tshouldEmphasize: emp,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tthis.splittedWords.push(realWord);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmainWordEl.innerText = word.word;\n\t\t\t\t\t\tthis.splittedWords.push({\n\t\t\t\t\t\t\t...word,\n\t\t\t\t\t\t\tmainElement: mainWordEl,\n\t\t\t\t\t\t\tsubElements: [],\n\t\t\t\t\t\t\telementAnimations: [this.initFloatAnimation(word, mainWordEl)],\n\t\t\t\t\t\t\tmaskAnimations: [],\n\t\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tshouldEmphasize: emp,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\twrapperWordEl.appendChild(mainWordEl);\n\t\t\t\t}\n\t\t\t\tif (emp) {\n\t\t\t\t\tthis.splittedWords[\n\t\t\t\t\t\tthis.splittedWords.length - 1\n\t\t\t\t\t].elementAnimations.push(\n\t\t\t\t\t\t...this.initEmphasizeAnimation(\n\t\t\t\t\t\t\tcharacterElements,\n\t\t\t\t\t\t\tmerged.endTime - merged.startTime,\n\t\t\t\t\t\t\tmerged.startTime - this.lyricLine.startTime,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (merged.word.trimStart() !== merged.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t\tmain.appendChild(wrapperWordEl);\n\t\t\t\tif (merged.word.trimEnd() !== merged.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t} else if (chunk.word.trim().length === 0) {\n\t\t\t\t// 纯空格\n\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t} else {\n\t\t\t\t// 单个单词\n\t\t\t\tconst emp = shouldEmphasize(chunk);\n\t\t\t\tconst mainWordEl = document.createElement(\"span\");\n\t\t\t\tconst realWord: RealWord = {\n\t\t\t\t\t...chunk,\n\t\t\t\t\tmainElement: mainWordEl,\n\t\t\t\t\tsubElements: [],\n\t\t\t\t\telementAnimations: [this.initFloatAnimation(chunk, mainWordEl)],\n\t\t\t\t\tmaskAnimations: [],\n\t\t\t\t\twidth: 0,\n\t\t\t\t\theight: 0,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tshouldEmphasize: emp,\n\t\t\t\t};\n\t\t\t\tif (emp) {\n\t\t\t\t\tmainWordEl.classList.add(\"emphasize\");\n\t\t\t\t\tconst charEls: HTMLSpanElement[] = [];\n\t\t\t\t\tfor (const char of chunk.word.trim().split(\"\")) {\n\t\t\t\t\t\tconst charEl = document.createElement(\"span\");\n\t\t\t\t\t\tcharEl.innerText = char;\n\t\t\t\t\t\tcharEls.push(charEl);\n\t\t\t\t\t\tmainWordEl.appendChild(charEl);\n\t\t\t\t\t}\n\t\t\t\t\trealWord.subElements = charEls;\n\t\t\t\t\tconst duration = Math.abs(realWord.endTime - realWord.startTime);\n\t\t\t\t\trealWord.elementAnimations.push(\n\t\t\t\t\t\t...this.initEmphasizeAnimation(\n\t\t\t\t\t\t\tcharEls,\n\t\t\t\t\t\t\tduration,\n\t\t\t\t\t\t\trealWord.startTime - this.lyricLine.startTime,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\t// realWord.elementAnimations = this.initEmphasizeAnimation(realWord);\n\t\t\t\t} else {\n\t\t\t\t\tmainWordEl.innerText = chunk.word.trim();\n\t\t\t\t}\n\t\t\t\tif (chunk.word.trimStart() !== chunk.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t\tmain.appendChild(mainWordEl);\n\t\t\t\tif (chunk.word.trimEnd() !== chunk.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t\tthis.splittedWords.push(realWord);\n\t\t\t}\n\t\t}\n\t\ttrans.innerText = this.lyricLine.translatedLyric;\n\t\troman.innerText = this.lyricLine.romanLyric;\n\t}\n\tprivate initFloatAnimation(word: LyricWord, wordEl: HTMLSpanElement) {\n\t\tconst delay = word.startTime - this.lyricLine.startTime;\n\t\tconst duration = Math.max(1000, word.endTime - word.startTime);\n\t\tlet up = 0.05;\n\t\tif (this.lyricLine.isBG) {\n\t\t\tup *= 2;\n\t\t}\n\t\tif (shouldEmphasize(word) && duration < 1200) {\n\t\t\tup = 0;\n\t\t}\n\t\tconst a = wordEl.animate(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttransform: \"translateY(0px)\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttransform: `translateY(${-up}em)`,\n\t\t\t\t},\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration: isFinite(duration) ? duration : 0,\n\t\t\t\tdelay: isFinite(delay) ? delay : 0,\n\t\t\t\tid: \"float-word\",\n\t\t\t\tcomposite: \"add\",\n\t\t\t\tfill: \"both\",\n\t\t\t\teasing: \"ease-out\",\n\t\t\t},\n\t\t);\n\t\ta.pause();\n\t\treturn a;\n\t}\n\t// 按照原 Apple Music 参考,强调效果只应用缩放、轻微左右位移和辉光效果,原主要的悬浮位移效果不变\n\t// 为了避免产生锯齿抖动感,使用 matrix3d 来实现缩放和位移\n\tprivate initEmphasizeAnimation(\n\t\tcharacterElements: HTMLElement[],\n\t\tduration: number,\n\t\tdelay: number,\n\t): Animation[] {\n\t\tconst de = Math.max(0, delay);\n\t\tconst du = Math.max(1000, duration);\n\n\t\tlet method = EmphasizeAnimationMethod.FloatAndGlow;\n\n\t\tif (du < 1200) {\n\t\t\tmethod = EmphasizeAnimationMethod.FloatOnly;\n\t\t}\n\n\t\tlet result: Animation[] = [];\n\n\t\tswitch (method) {\n\t\t\tcase EmphasizeAnimationMethod.FloatAndGlow: {\n\t\t\t\tlet amount = 0;\n\t\t\t\tlet blur = 0;\n\t\t\t\tif (du >= 1200 && du < 2000) {\n\t\t\t\t\tamount = 0.7;\n\t\t\t\t\tblur = 0.5;\n\t\t\t\t} else if (du >= 2000 && du < 3000) {\n\t\t\t\t\tamount = 0.8;\n\t\t\t\t\tblur = 0.6;\n\t\t\t\t} else if (du >= 3000 && du < 4000) {\n\t\t\t\t\tamount = 1.0;\n\t\t\t\t\tblur = 0.8;\n\t\t\t\t} else if (du >= 4000) {\n\t\t\t\t\tamount = 1.0;\n\t\t\t\t\tblur = 0.8;\n\t\t\t\t}\n\t\t\t\tconst animateDu = Number.isFinite(du) ? Math.max(du * 1.2, 2000) : 0;\n\t\t\t\tconst empEasing = makeEmpEasing(EMP_EASING_MID);\n\t\t\t\tresult = characterElements.flatMap((el, i, arr) => {\n\t\t\t\t\tconst wordDe = de + (du / 3 / arr.length) * i;\n\t\t\t\t\tconst result: Animation[] = [];\n\n\t\t\t\t\tconst frames: Keyframe[] = new Array(ANIMATION_FRAME_QUANTITY)\n\t\t\t\t\t\t.fill(0)\n\t\t\t\t\t\t.map((_, i) => {\n\t\t\t\t\t\t\tconst x = (i + 1) / ANIMATION_FRAME_QUANTITY;\n\t\t\t\t\t\t\tconst y = empEasing(x);\n\t\t\t\t\t\t\tconst transX = Math.sin(x * Math.PI * 2);\n\t\t\t\t\t\t\tconst glowLevel =\n\t\t\t\t\t\t\t\tMath.max(0, x < EMP_EASING_MID ? y / 2 : y - 0.5) * blur;\n\t\t\t\t\t\t\t// const floatLevel =\n\t\t\t\t\t\t\t// \tMath.max(0, x < EMP_EASING_MID ? y : y - 0.5);\n\n\t\t\t\t\t\t\tconst mat = scaleMatrix4(createMatrix4(), 1 + y * 0.1 * amount);\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\toffset: x,\n\t\t\t\t\t\t\t\ttransform: `${matrix4ToCSS(mat, 4)} translate(${\n\t\t\t\t\t\t\t\t\ttransX * 0.005 * amount\n\t\t\t\t\t\t\t\t}em,${-y * 0.05}em)`,\n\t\t\t\t\t\t\t\ttextShadow: `rgba(255, 255, 255, ${glowLevel}) 0 0 10px`,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\tconst ani = el.animate(frames, {\n\t\t\t\t\t\tduration: animateDu,\n\t\t\t\t\t\tdelay: Number.isFinite(wordDe) ? wordDe : 0,\n\t\t\t\t\t\tid: `emphasize-word-float-and-glow-${el.innerText}-${i}`,\n\t\t\t\t\t\titerations: 1,\n\t\t\t\t\t\tcomposite: \"replace\",\n\t\t\t\t\t\teasing: \"linear\",\n\t\t\t\t\t\tfill: \"both\",\n\t\t\t\t\t});\n\t\t\t\t\tani.onfinish = () => {\n\t\t\t\t\t\tani.pause();\n\t\t\t\t\t};\n\t\t\t\t\tani.pause();\n\t\t\t\t\tresult.push(ani);\n\n\t\t\t\t\treturn result;\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase EmphasizeAnimationMethod.FloatOnly: {\n\t\t\t\tresult = characterElements.flatMap((el, i, arr) => {\n\t\t\t\t\tconst wordDe = de + (du / 1.5 / arr.length) * i;\n\t\t\t\t\tconst result: Animation[] = [];\n\n\t\t\t\t\tconst frames: Keyframe[] = new Array(ANIMATION_FRAME_QUANTITY)\n\t\t\t\t\t\t.fill(0)\n\t\t\t\t\t\t.map((_, i) => {\n\t\t\t\t\t\t\tconst x = (i + 1) / ANIMATION_FRAME_QUANTITY;\n\t\t\t\t\t\t\tconst y = x < EMP_EASING_MID ? defaultEmpEasing(x) : 1;\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\toffset: x,\n\t\t\t\t\t\t\t\ttransform: `translateY(${-y * 0.05}em)`,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\tconst ani = el.animate(frames, {\n\t\t\t\t\t\tduration: Number.isFinite(du) ? du * 2 : 0,\n\t\t\t\t\t\tdelay: Number.isFinite(wordDe) ? wordDe : 0,\n\t\t\t\t\t\tid: `emphasize-word-float-only-${el.innerText}-${i}`,\n\t\t\t\t\t\titerations: 1,\n\t\t\t\t\t\tcomposite: \"replace\",\n\t\t\t\t\t\teasing: \"linear\",\n\t\t\t\t\t\tfill: \"both\",\n\t\t\t\t\t});\n\t\t\t\t\tani.onfinish = () => {\n\t\t\t\t\t\tani.pause();\n\t\t\t\t\t};\n\t\t\t\t\tani.pause();\n\t\t\t\t\tresult.push(ani);\n\n\t\t\t\t\treturn result;\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\tprivate get totalDuration() {\n\t\treturn this.lyricLine.endTime - this.lyricLine.startTime;\n\t}\n\tupdateMaskImage() {\n\t\tif (this._hide) {\n\t\t\tif (this._prevParentEl) {\n\t\t\t\tthis._prevParentEl.appendChild(this.element);\n\t\t\t}\n\t\t\tthis.element.style.display = \"\";\n\t\t\tthis.element.style.visibility = \"hidden\";\n\t\t}\n\t\tfor (const word of this.splittedWords) {\n\t\t\tconst el = word.mainElement;\n\t\t\tif (el) {\n\t\t\t\tword.padding = parseFloat(getComputedStyle(el).paddingLeft);\n\t\t\t\tword.width = el.clientWidth - word.padding * 2;\n\t\t\t\tword.height = el.clientHeight - word.padding * 2;\n\t\t\t} else {\n\t\t\t\tword.width = 0;\n\t\t\t\tword.height = 0;\n\t\t\t\tword.padding = 0;\n\t\t\t}\n\t\t}\n\t\tif (this.lyricPlayer.supportMaskImage) {\n\t\t\tthis.generateWebAnimationBasedMaskImage();\n\t\t} else {\n\t\t\tthis.generateCalcBasedMaskImage();\n\t\t}\n\t\tif (this._hide) {\n\t\t\tif (this._prevParentEl) {\n\t\t\t\tthis.element.remove();\n\t\t\t}\n\t\t\tthis.element.style.display = \"none\";\n\t\t\tthis.element.style.visibility = \"\";\n\t\t}\n\t}\n\tprivate generateCalcBasedMaskImage() {\n\t\tfor (const word of this.splittedWords) {\n\t\t\tconst wordEl = word.mainElement;\n\t\t\tif (wordEl) {\n\t\t\t\tword.width = wordEl.clientWidth;\n\t\t\t\tword.height = wordEl.clientHeight;\n\t\t\t\tconst fadeWidth = word.height / 2;\n\t\t\t\tconst [maskImage, totalAspect] = generateFadeGradient(\n\t\t\t\t\tfadeWidth / word.width,\n\t\t\t\t);\n\t\t\t\tconst totalAspectStr = `${totalAspect * 100}% 100%`;\n\t\t\t\tif (this.lyricPlayer.supportMaskImage) {\n\t\t\t\t\twordEl.style.maskImage = maskImage;\n\t\t\t\t\twordEl.style.maskRepeat = \"no-repeat\";\n\t\t\t\t\twordEl.style.maskOrigin = \"left\";\n\t\t\t\t\twordEl.style.maskSize = totalAspectStr;\n\t\t\t\t} else {\n\t\t\t\t\twordEl.style.webkitMaskImage = maskImage;\n\t\t\t\t\twordEl.style.webkitMaskRepeat = \"no-repeat\";\n\t\t\t\t\twordEl.style.webkitMaskOrigin = \"left\";\n\t\t\t\t\twordEl.style.webkitMaskSize = totalAspectStr;\n\t\t\t\t}\n\t\t\t\tconst w = word.width + fadeWidth;\n\t\t\t\tconst maskPos = `clamp(${-w}px,calc(${-w}px + (var(--amll-player-time) - ${\n\t\t\t\t\tword.startTime\n\t\t\t\t})*${\n\t\t\t\t\tw / Math.abs(word.endTime - word.startTime)\n\t\t\t\t}px),0px) 0px, left top`;\n\t\t\t\t// const maskPos = `clamp(0px,${w}px,${w}px) 0px, left top`;\n\t\t\t\twordEl.style.maskPosition = maskPos;\n\t\t\t\twordEl.style.webkitMaskPosition = maskPos;\n\t\t\t}\n\t\t}\n\t}\n\tprivate generateWebAnimationBasedMaskImage() {\n\t\tconst totalDuration = this.totalDuration;\n\t\tthis.splittedWords.forEach((word, i) => {\n\t\t\tconst wordEl = word.mainElement;\n\t\t\tif (wordEl) {\n\t\t\t\t// TODO: 可选配置渐变宽度\n\t\t\t\t// Apple Music for iPad 上是 `word.height / 2`\n\t\t\t\t// Apple Music for Android 上是 `word.height`\n\t\t\t\tconst fadeWidth = word.height / 2;\n\t\t\t\tconst [maskImage, totalAspect] = generateFadeGradient(\n\t\t\t\t\tfadeWidth / (word.width + word.padding * 2),\n\t\t\t\t);\n\t\t\t\tconst totalAspectStr = `${totalAspect * 100}% 100%`;\n\t\t\t\tif (this.lyricPlayer.supportMaskImage) {\n\t\t\t\t\twordEl.style.maskImage = maskImage;\n\t\t\t\t\twordEl.style.maskRepeat = \"no-repeat\";\n\t\t\t\t\twordEl.style.maskOrigin = \"left\";\n\t\t\t\t\twordEl.style.maskSize = totalAspectStr;\n\t\t\t\t} else {\n\t\t\t\t\twordEl.style.webkitMaskImage = maskImage;\n\t\t\t\t\twordEl.style.webkitMaskRepeat = \"no-repeat\";\n\t\t\t\t\twordEl.style.webkitMaskOrigin = \"left\";\n\t\t\t\t\twordEl.style.webkitMaskSize = totalAspectStr;\n\t\t\t\t}\n\t\t\t\t// 为了尽可能将渐变动画在相连的每个单词间近似衔接起来\n\t\t\t\t// 要综合每个单词的效果时间和间隙生成动画帧数组\n\t\t\t\tconst widthBeforeSelf =\n\t\t\t\t\tthis.splittedWords.slice(0, i).reduce((a, b) => a + b.width, 0) +\n\t\t\t\t\t(this.splittedWords[0] ? fadeWidth : 0);\n\t\t\t\tconst minOffset = -(word.width + word.padding * 2 + fadeWidth);\n\t\t\t\tconst clampOffset = (x: number) => Math.max(minOffset, Math.min(0, x));\n\t\t\t\tlet curPos = -widthBeforeSelf - word.width - word.padding - fadeWidth;\n\t\t\t\tlet timeOffset = 0;\n\t\t\t\tconst frames: Keyframe[] = [];\n\t\t\t\tlet lastPos = curPos;\n\t\t\t\tlet lastTime = 0;\n\t\t\t\tconst pushFrame = () => {\n\t\t\t\t\tconst moveOffset = curPos - lastPos;\n\t\t\t\t\tconst time = Math.max(0, Math.min(1, timeOffset));\n\t\t\t\t\tconst duration = time - lastTime;\n\t\t\t\t\tconst d = Math.abs(duration / moveOffset);\n\t\t\t\t\t// 因为有可能会和之前的动画有边界\n\t\t\t\t\tif (curPos > minOffset && lastPos < minOffset) {\n\t\t\t\t\t\tconst staticTime = Math.abs(lastPos - minOffset) * d;\n\t\t\t\t\t\tconst value = `${clampOffset(lastPos)}px 0`;\n\t\t\t\t\t\tconst frame: Keyframe = {\n\t\t\t\t\t\t\toffset: lastTime + staticTime,\n\t\t\t\t\t\t\tmaskPosition: value,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tframes.push(frame);\n\t\t\t\t\t}\n\t\t\t\t\tif (curPos > 0 && lastPos < 0) {\n\t\t\t\t\t\tconst staticTime = Math.abs(lastPos) * d;\n\t\t\t\t\t\tconst value = `${clampOffset(curPos)}px 0`;\n\t\t\t\t\t\tconst frame: Keyframe = {\n\t\t\t\t\t\t\toffset: lastTime + staticTime,\n\t\t\t\t\t\t\tmaskPosition: value,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tframes.push(frame);\n\t\t\t\t\t}\n\t\t\t\t\tconst value = `${clampOffset(curPos)}px 0`;\n\t\t\t\t\tconst frame: Keyframe = {\n\t\t\t\t\t\toffset: time,\n\t\t\t\t\t\tmaskPosition: value,\n\t\t\t\t\t};\n\t\t\t\t\tframes.push(frame);\n\t\t\t\t\tlastPos = curPos;\n\t\t\t\t\tlastTime = time;\n\t\t\t\t};\n\t\t\t\tpushFrame();\n\t\t\t\tlet lastTimeStamp = 0;\n\t\t\t\tthis.splittedWords.forEach((otherWord, j) => {\n\t\t\t\t\t// 停顿\n\t\t\t\t\t{\n\t\t\t\t\t\tconst curTimeStamp = otherWord.startTime - this.lyricLine.startTime;\n\t\t\t\t\t\tconst staticDuration = curTimeStamp - lastTimeStamp;\n\t\t\t\t\t\ttimeOffset += staticDuration / totalDuration;\n\t\t\t\t\t\tif (staticDuration > 0) pushFrame();\n\t\t\t\t\t\tlastTimeStamp = curTimeStamp;\n\t\t\t\t\t}\n\t\t\t\t\t// 移动\n\t\t\t\t\t{\n\t\t\t\t\t\tconst fadeDuration = otherWord.endTime - otherWord.startTime;\n\t\t\t\t\t\ttimeOffset += fadeDuration / totalDuration;\n\t\t\t\t\t\tcurPos += otherWord.width;\n\t\t\t\t\t\tif (j === 0) {\n\t\t\t\t\t\t\tcurPos += fadeWidth * 1.5;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (j === this.splittedWords.length - 1) {\n\t\t\t\t\t\t\tcurPos += fadeWidth * 0.5;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (fadeDuration > 0) pushFrame();\n\t\t\t\t\t\tlastTimeStamp += fadeDuration;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\t\ta.cancel();\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst ani = wordEl.animate(frames, {\n\t\t\t\t\t\tduration: totalDuration || 1,\n\t\t\t\t\t\tid: `fade-word-${word.word}-${i}`,\n\t\t\t\t\t\teasing: \"linear\",\n\t\t\t\t\t\tfill: \"both\",\n\t\t\t\t\t});\n\t\t\t\t\tani.pause();\n\t\t\t\t\tword.maskAnimations = [ani];\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.warn(\"应用渐变动画发生错误\", frames, totalDuration, err);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tsetTransform(\n\t\tleft: number = this.left,\n\t\ttop: number = this.top,\n\t\tscale: number = this.scale,\n\t\topacity = 1,\n\t\tblur = 0,\n\t\tforce = false,\n\t\tdelay = 0,\n\t) {\n\t\tconst roundedBlur = Math.round(blur);\n\t\tconst beforeInSight = this.isInSight;\n\t\tconst enableSpring = this.lyricPlayer.getEnableSpring();\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.scale = scale;\n\t\tthis.delay = (delay * 1000) | 0;\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tconst trans = this.element.children[1] as HTMLDivElement;\n\t\tconst roman = this.element.children[2] as HTMLDivElement;\n\t\tmain.style.opacity = `${opacity}`;\n\t\ttrans.style.opacity = `${opacity / 2}`;\n\t\troman.style.opacity = `${opacity / 2}`;\n\t\tif (force || !enableSpring) {\n\t\t\tthis.blur = Math.min(32, roundedBlur);\n\t\t\tif (force)\n\t\t\t\tthis.element.classList.add(\n\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t);\n\t\t\t// this.lineWebAnimationTransforms.posX.setTargetPosition(left);\n\t\t\t// this.lineWebAnimationTransforms.posY.setTargetPosition(top);\n\t\t\t// this.lineWebAnimationTransforms.scale.setTargetPosition(scale);\n\t\t\tthis.lineTransforms.posX.setPosition(left);\n\t\t\tthis.lineTransforms.posY.setPosition(top);\n\t\t\tthis.lineTransforms.scale.setPosition(scale);\n\t\t\tif (!enableSpring) {\n\t\t\t\tconst afterInSight = this.isInSight;\n\t\t\t\tif (beforeInSight || afterInSight) {\n\t\t\t\t\tthis.show();\n\t\t\t\t} else {\n\t\t\t\t\tthis.hide();\n\t\t\t\t}\n\t\t\t} else this.rebuildStyle();\n\t\t\tif (force)\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tthis.element.classList.remove(\n\t\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t} else {\n\t\t\t// this.lineWebAnimationTransforms.posX.stop();\n\t\t\t// this.lineWebAnimationTransforms.posY.stop();\n\t\t\t// this.lineWebAnimationTransforms.scale.stop();\n\t\t\tthis.lineTransforms.posX.setTargetPosition(left, delay);\n\t\t\tthis.lineTransforms.posY.setTargetPosition(top, delay);\n\t\t\tthis.lineTransforms.scale.setTargetPosition(scale);\n\t\t\tif (this.blur !== Math.min(32, roundedBlur)) {\n\t\t\t\tthis.blur = Math.min(32, roundedBlur);\n\t\t\t\tthis.element.style.filter = `blur(${Math.min(32, roundedBlur)}px)`;\n\t\t\t}\n\t\t}\n\t}\n\tupdate(delta = 0) {\n\t\tif (!this.lyricPlayer.getEnableSpring()) return;\n\t\tthis.lineTransforms.posX.update(delta);\n\t\tthis.lineTransforms.posY.update(delta);\n\t\tthis.lineTransforms.scale.update(delta);\n\t\tif (this.isInSight) {\n\t\t\tthis.show();\n\t\t} else {\n\t\t\tthis.hide();\n\t\t}\n\t}\n\n\t_getDebugTargetPos(): string {\n\t\treturn `[位移: ${this.left}, ${this.top}; 缩放: ${this.scale}; 延时: ${this.delay}]`;\n\t}\n\n\tget isInSight() {\n\t\tconst l = this.lineTransforms.posX.getCurrentPosition();\n\t\tconst t = this.lineTransforms.posY.getCurrentPosition();\n\t\tconst r = l + this.lineSize[0];\n\t\tconst b = t + this.lineSize[1];\n\t\tconst pr = this.lyricPlayer.size[0];\n\t\tconst pb = this.lyricPlayer.size[1];\n\t\treturn !(l > pr || r < 0 || t > pb || b < 0);\n\t}\n\tdispose(): void {\n\t\tthis.element.remove();\n\t}\n}\n","/**\n * @fileoverview\n * 一个播放歌词的组件\n * @author SteveXMH\n */\n\nimport type { Disposable, HasElement, LyricLine } from \"../interfaces\";\nimport { eqSet } from \"../utils/eq-set\";\nimport { SpringParams } from \"../utils/spring\";\nimport { BottomLineEl } from \"./bottom-line\";\nimport { InterludeDots } from \"./interlude-dots\";\nimport {\n\tLyricLineEl,\n\tRawLyricLineMouseEvent,\n\tshouldEmphasize,\n} from \"./lyric-line\";\nimport { create } from \"jss\";\nimport preset from \"jss-preset-default\";\n\nconst jss = create(preset());\n\n/**\n * 歌词行鼠标相关事件,可以获取到歌词行的索引和歌词行元素\n */\nexport class LyricLineMouseEvent extends MouseEvent {\n\tconstructor(\n\t\t/**\n\t\t * 歌词行索引\n\t\t */\n\t\tpublic readonly lineIndex: number,\n\t\t/**\n\t\t * 歌词行元素\n\t\t */\n\t\tpublic readonly line: LyricLineEl,\n\t\tevent: MouseEvent,\n\t) {\n\t\tsuper(`line-${event.type}`, event);\n\t}\n}\n\nexport interface LyricLineMouseEventListener {\n\t(evt: LyricLineMouseEvent): void;\n}\n\n/**\n * 歌词播放组件,本框架的核心组件\n *\n * 尽可能贴切 Apple Music for iPad 的歌词效果设计,且做了力所能及的优化措施\n */\nexport class LyricPlayer extends EventTarget implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate currentTime = 0;\n\tprivate lyricLines: LyricLine[] = [];\n\tprivate processedLines: LyricLine[] = [];\n\tprivate lyricLinesEl: LyricLineEl[] = [];\n\tprivate lyricLinesSize: WeakMap<LyricLineEl, [number, number]> =\n\t\tnew WeakMap();\n\tprivate lyricLinesIndexes: WeakMap<LyricLineEl, number> = new WeakMap();\n\tprivate hotLines: Set<number> = new Set();\n\tprivate bufferedLines: Set<number> = new Set();\n\tprivate scrollToIndex = 0;\n\tprivate allowScroll = true;\n\tprivate scrolledHandler = 0;\n\tprivate isScrolled = false;\n\tprivate invokedByScrollEvent = false;\n\tprivate scrollOffset = 0;\n\tprivate hidePassedLines = false;\n\tprivate resizeObserver: ResizeObserver = new ResizeObserver((e) => {\n\t\tconst rect = e[0].contentRect;\n\t\tthis.size[0] = rect.width;\n\t\tthis.size[1] = rect.height;\n\t\tconst styles = getComputedStyle(e[0].target);\n\t\tconst innerWidth =\n\t\t\tthis.element.clientWidth -\n\t\t\tparseFloat(styles.paddingLeft) -\n\t\t\tparseFloat(styles.paddingRight);\n\t\tconst innerHeight =\n\t\t\tthis.element.clientHeight -\n\t\t\tparseFloat(styles.paddingTop) -\n\t\t\tparseFloat(styles.paddingBottom);\n\t\tthis.innerSize[0] = innerWidth;\n\t\tthis.innerSize[1] = innerHeight;\n\t\tthis.rebuildStyle();\n\t\tthis.calcLayout(true, true);\n\t\tthis.lyricLinesEl.forEach((el) => el.updateMaskImage());\n\t});\n\tprivate posXSpringParams: Partial<SpringParams> = {\n\t\tmass: 1,\n\t\tdamping: 10,\n\t\tstiffness: 100,\n\t};\n\tprivate posYSpringParams: Partial<SpringParams> = {\n\t\tmass: 1,\n\t\tdamping: 16.5,\n\t\tstiffness: 100,\n\t};\n\tprivate scaleSpringParams: Partial<SpringParams> = {\n\t\tmass: 1,\n\t\tdamping: 20,\n\t\tstiffness: 100,\n\t};\n\tprivate emUnit = Math.max(Math.min(innerHeight * 0.05, innerWidth * 0.1), 12);\n\tprivate padding = this.emUnit;\n\tprivate enableBlur = true;\n\tprivate enableScale = true;\n\tprivate interludeDots: InterludeDots;\n\tprivate interludeDotsSize: [number, number] = [0, 0];\n\tprivate bottomLine: BottomLineEl;\n\treadonly supportPlusLighter = CSS.supports(\"mix-blend-mode\", \"plus-lighter\");\n\treadonly supportMaskImage = CSS.supports(\"mask-image\", \"none\");\n\tprivate disableSpring = false;\n\tprivate alignAnchor: \"top\" | \"bottom\" | \"center\" = \"center\";\n\tprivate alignPosition = 0.5;\n\tprivate isNonDynamic = false;\n\tprivate scrollBoundary = [0, 0];\n\treadonly size: [number, number] = [0, 0];\n\treadonly innerSize: [number, number] = [0, 0];\n\tprivate readonly onLineClickedHandler = (e: RawLyricLineMouseEvent) => {\n\t\tconst evt = new LyricLineMouseEvent(\n\t\t\tthis.lyricLinesIndexes.get(e.line) ?? -1,\n\t\t\te.line,\n\t\t\te,\n\t\t);\n\t\tif (!this.dispatchEvent(evt)) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\t};\n\t_getIsNonDynamic() {\n\t\treturn this.isNonDynamic;\n\t}\n\t/**\n\t * 设置是否使用物理弹簧算法实现歌词动画效果,默认启用\n\t *\n\t * 如果启用,则会通过弹簧算法实时处理歌词位置,但是需要性能足够强劲的电脑方可流畅运行\n\t *\n\t * 如果不启用,则会回退到基于 `transition` 的过渡效果,对低性能的机器比较友好,但是效果会比较单一\n\t */\n\tsetEnableSpring(enable = true) {\n\t\tthis.disableSpring = !enable;\n\t\tif (enable) {\n\t\t\tthis.element.classList.remove(this.style.classes.disableSpring);\n\t\t} else {\n\t\t\tthis.element.classList.add(this.style.classes.disableSpring);\n\t\t}\n\t\tthis.calcLayout(true);\n\t}\n\t/**\n\t * 获取当前是否启用了物理弹簧\n\t * @returns 是否启用物理弹簧\n\t */\n\tgetEnableSpring() {\n\t\treturn !this.disableSpring;\n\t}\n\t/**\n\t * 是否启用歌词行缩放效果,默认启用\n\t *\n\t * 如果启用,非选中的歌词行会轻微缩小以凸显当前播放歌词行效果\n\t *\n\t * 此效果对性能影响微乎其微,推荐启用\n\t * @param enable 是否启用歌词行缩放效果\n\t */\n\tsetEnableScale(enable = true) {\n\t\tthis.enableScale = enable;\n\t\tthis.calcLayout();\n\t}\n\t/**\n\t * 获取当前是否启用了歌词行缩放效果\n\t * @returns 是否启用歌词行缩放效果\n\t */\n\tgetEnableScale() {\n\t\treturn this.enableScale;\n\t}\n\tpublic readonly style = jss.createStyleSheet({\n\t\tlyricPlayer: {\n\t\t\tuserSelect: \"none\",\n\t\t\tfontSize: \"var(--amll-lyric-player-font-size,max(min(6vh, 8vw), 12px))\",\n\t\t\tpadding: \"1em\",\n\t\t\tmargin: \"-1em\",\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\toverflow: \"hidden\",\n\t\t\tboxSizing: \"content-box\",\n\t\t\tmaxWidth: \"100%\",\n\t\t\tmaxHeight: \"100%\",\n\t\t\tzIndex: 1,\n\t\t\tcolor: \"var(--amll-lyric-view-color,white)\",\n\t\t\tmixBlendMode: \"plus-lighter\",\n\t\t\tcontain: \"strict\",\n\t\t\t\"&:hover\": {\n\t\t\t\t\"& $lyricLine\": {\n\t\t\t\t\tfilter: \"unset !important\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tlyricLine: {\n\t\t\tposition: \"absolute\",\n\t\t\tbackfaceVisibility: \"hidden\",\n\t\t\ttransformOrigin: \"left\",\n\t\t\twidth: \"var(--amll-lyric-player-width,100%)\",\n\t\t\theight: \"fit-content\",\n\t\t\tpadding: \"2vh 1.05em\",\n\t\t\tmargin: \"0 -1em\",\n\t\t\tcontain: \"content\",\n\t\t\twillChange: \"filter,transform,opacity\",\n\t\t\ttransition: \"filter 0.25s, background-color 0.25s, box-shadow 0.25s\",\n\t\t\tboxSizing: \"content-box\",\n\t\t\tborderRadius: \"8px\",\n\t\t\t\"&:has(>*):hover\": {\n\t\t\t\tbackgroundColor: \"var(--amll-lyric-view-hover-bg-color,#fff1)\",\n\t\t\t\tboxShadow: \"0 0 0 8px var(--amll-lyric-view-hover-bg-color,#fff1)\",\n\t\t\t},\n\t\t\t\"&:has(>*):active\": {\n\t\t\t\tboxShadow: \"0 0 0 4px var(--amll-lyric-view-hover-bg-color,#fff1)\",\n\t\t\t},\n\t\t},\n\t\t\"@media (max-width: 1024px)\": {\n\t\t\tlyricLine: {\n\t\t\t\tpadding: \"1vh 1em\",\n\t\t\t},\n\t\t},\n\t\tlyricDuetLine: {\n\t\t\ttextAlign: \"right\",\n\t\t\ttransformOrigin: \"right\",\n\t\t},\n\t\tlyricBgLine: {\n\t\t\topacity: 0,\n\t\t\tfontSize: \"max(50%, 10px)\",\n\t\t\ttransition: \"opacity 0.25s\",\n\t\t\t\"&.active\": {\n\t\t\t\ttransition: \"opacity 0.25s 0.25s\",\n\t\t\t\topacity: 0.4,\n\t\t\t},\n\t\t},\n\t\tlyricMainLine: {\n\t\t\ttransition: \"opacity 0.3s 0.25s\",\n\t\t\twillChange: \"opacity\",\n\t\t\tmargin: \"-1em\",\n\t\t\tpadding: \"1em\",\n\t\t\t\"& span\": {\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t},\n\t\t\t\"& > span, span.emphasize-wrapper\": {\n\t\t\t\twhiteSpace: \"pre-wrap\",\n\t\t\t\twillChange: \"transform,display,mask-image\",\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\t\"&.emphasize, span.emphasize\": {\n\t\t\t\t\tpadding: \"1em\",\n\t\t\t\t\tmargin: \"-1em\",\n\t\t\t\t\t\"& > span\": {\n\t\t\t\t\t\tpadding: \"1em\",\n\t\t\t\t\t\tmargin: \"-1em\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tlyricSubLine: {\n\t\t\tfontSize: \"max(0.5em, 10px)\",\n\t\t\ttransition: \"opacity 0.3s 0.25s\",\n\t\t\topacity: 0.3,\n\t\t},\n\t\tdisableSpring: {\n\t\t\t\"& > *\": {\n\t\t\t\ttransition:\n\t\t\t\t\t\"filter 0.25s, transform 0.5s, background-color 0.25s, box-shadow 0.25s\",\n\t\t\t},\n\t\t},\n\t\tinterludeDots: {\n\t\t\theight: \"clamp(0.5em,1vh,3em)\",\n\t\t\ttransformOrigin: \"center\",\n\t\t\twidth: \"fit-content\",\n\t\t\tpadding: \"2.5% 0\",\n\t\t\tposition: \"absolute\",\n\t\t\tdisplay: \"flex\",\n\t\t\tgap: \"0.25em\",\n\t\t\tleft: \"1em\",\n\t\t\t\"& > *\": {\n\t\t\t\theight: \"clamp(0.5em,1vh,3em)\",\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\tborderRadius: \"50%\",\n\t\t\t\taspectRatio: \"1 / 1\",\n\t\t\t\tbackgroundColor: \"var(--amll-lyric-view-color,white)\",\n\t\t\t\tmarginRight: \"4px\",\n\t\t\t},\n\t\t\t\"&.duet\": {\n\t\t\t\tright: \"1em\",\n\t\t\t\ttransformOrigin: \"center\",\n\t\t\t},\n\t\t},\n\t\t\"@supports (mix-blend-mode: plus-lighter)\": {\n\t\t\tlyricSubLine: {\n\t\t\t\topacity: 0.3,\n\t\t\t},\n\t\t},\n\t\ttmpDisableTransition: {\n\t\t\ttransition: \"none !important\",\n\t\t},\n\t});\n\tprivate _baseFontSize = parseFloat(getComputedStyle(this.element).fontSize);\n\tpublic get baseFontSize() {\n\t\treturn this._baseFontSize;\n\t}\n\tprivate isPageVisible = true;\n\tprivate onPageShow = () => {\n\t\tthis.isPageVisible = true;\n\t\tthis.setCurrentTime(this.currentTime, true);\n\t};\n\tprivate onPageHide = () => {\n\t\tthis.isPageVisible = false;\n\t};\n\tconstructor() {\n\t\tsuper();\n\t\tthis.interludeDots = new InterludeDots(this);\n\t\tthis.bottomLine = new BottomLineEl(this);\n\t\tthis.element.setAttribute(\"class\", this.style.classes.lyricPlayer);\n\t\tif (this.disableSpring) {\n\t\t\tthis.element.classList.add(this.style.classes.disableSpring);\n\t\t}\n\t\tthis.rebuildStyle();\n\t\tthis.resizeObserver.observe(this.element);\n\t\tthis.element.appendChild(this.interludeDots.getElement());\n\t\tthis.element.appendChild(this.bottomLine.getElement());\n\t\tthis.style.attach();\n\t\tthis.interludeDots.setTransform(0, 200);\n\t\twindow.addEventListener(\"pageshow\", this.onPageShow);\n\t\twindow.addEventListener(\"pagehide\", this.onPageHide);\n\t\tlet startScrollY = 0;\n\t\tlet direction: \"up\" | \"down\" | \"none\" = \"none\";\n\t\tlet startTouchPosY = 0;\n\t\tlet startScrollTime = 0;\n\t\tlet scrollSpeed = 0;\n\t\tlet scrollId = Symbol(\"amll-scroll\");\n\t\tlet lastMoveY = 0;\n\t\tlet lastDragTime = 0;\n\t\tthis.element.addEventListener(\"touchstart\", (evt) => {\n\t\t\tif (this.beginScrollHandler()) {\n\t\t\t\tevt.preventDefault();\n\t\t\t\tstartScrollY = this.scrollOffset;\n\t\t\t\tstartTouchPosY = evt.touches[0].screenY;\n\t\t\t\tlastMoveY = startTouchPosY;\n\t\t\t\tstartScrollTime = Date.now();\n\t\t\t\tscrollSpeed = 0;\n\t\t\t}\n\t\t});\n\t\tthis.element.addEventListener(\"touchmove\", (evt) => {\n\t\t\tif (this.beginScrollHandler()) {\n\t\t\t\tevt.preventDefault();\n\t\t\t\tconst touchScreenY = evt.touches[0].screenY;\n\t\t\t\tconst delta = touchScreenY - startTouchPosY;\n\t\t\t\tconst lastDelta = touchScreenY - lastMoveY;\n\t\t\t\tconst targetDirection =\n\t\t\t\t\tlastDelta > 0 ? \"down\" : lastDelta < 0 ? \"up\" : \"none\";\n\t\t\t\tif (direction !== targetDirection) {\n\t\t\t\t\tdirection = targetDirection;\n\t\t\t\t\tstartScrollY = this.scrollOffset;\n\t\t\t\t\tstartTouchPosY = touchScreenY;\n\t\t\t\t\tstartScrollTime = Date.now();\n\t\t\t\t} else {\n\t\t\t\t\tthis.scrollOffset = startScrollY - delta;\n\t\t\t\t}\n\t\t\t\tlastMoveY = touchScreenY;\n\t\t\t\tlastDragTime = Date.now();\n\t\t\t\tthis.limitScrollOffset();\n\t\t\t\tthis.calcLayout(true);\n\t\t\t}\n\t\t});\n\t\tthis.element.addEventListener(\"touchend\", (evt) => {\n\t\t\tif (this.beginScrollHandler()) {\n\t\t\t\tevt.preventDefault();\n\t\t\t\tstartTouchPosY = 0;\n\t\t\t\tconst curTime = Date.now();\n\t\t\t\tif (curTime - lastDragTime > 100) return this.endScrollHandler();\n\t\t\t\tconst scrollDuration = curTime - startScrollTime;\n\t\t\t\tscrollSpeed =\n\t\t\t\t\t((this.scrollOffset - startScrollY) / scrollDuration) * 1000;\n\t\t\t\tlet lt = 0;\n\t\t\t\tconst curScrollId = Symbol(\"amll-scroll\");\n\t\t\t\tscrollId = curScrollId;\n\t\t\t\tconst onScrollFrame = (dt: number) => {\n\t\t\t\t\tlt ||= dt;\n\t\t\t\t\tif (scrollId === curScrollId && this.beginScrollHandler()) {\n\t\t\t\t\t\tthis.scrollOffset += (scrollSpeed * (dt - lt)) / 1000;\n\t\t\t\t\t\tscrollSpeed *= 0.99;\n\t\t\t\t\t\tthis.limitScrollOffset();\n\t\t\t\t\t\tthis.calcLayout(true);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tMath.abs(scrollSpeed) > 1 &&\n\t\t\t\t\t\t\t!this.scrollBoundary.includes(this.scrollOffset)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\trequestAnimationFrame(onScrollFrame);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.endScrollHandler();\n\t\t\t\t\t\tlt = dt;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\trequestAnimationFrame(onScrollFrame);\n\t\t\t\tthis.endScrollHandler();\n\t\t\t}\n\t\t});\n\t\tthis.element.addEventListener(\"wheel\", (evt) => {\n\t\t\tif (this.beginScrollHandler()) {\n\t\t\t\tif (evt.deltaMode === evt.DOM_DELTA_PIXEL) {\n\t\t\t\t\tthis.scrollOffset += evt.deltaY;\n\t\t\t\t\tthis.limitScrollOffset();\n\t\t\t\t\tthis.calcLayout(true);\n\t\t\t\t} else {\n\t\t\t\t\tthis.scrollOffset += evt.deltaY * 50;\n\t\t\t\t\tthis.limitScrollOffset();\n\t\t\t\t\tthis.calcLayout(false);\n\t\t\t\t}\n\t\t\t\tthis.endScrollHandler();\n\t\t\t}\n\t\t});\n\t}\n\tprivate beginScrollHandler() {\n\t\tconst allowed = this.allowScroll;\n\t\tif (allowed) {\n\t\t\tthis.isScrolled = true;\n\t\t\tthis.invokedByScrollEvent = true;\n\t\t\tclearTimeout(this.scrolledHandler);\n\t\t\tthis.scrolledHandler = setTimeout(() => {\n\t\t\t\tthis.isScrolled = false;\n\t\t\t\tthis.scrollOffset = 0;\n\t\t\t}, 5000);\n\t\t}\n\t\treturn allowed;\n\t}\n\tprivate endScrollHandler() {\n\t\tthis.invokedByScrollEvent = false;\n\t}\n\tprivate limitScrollOffset() {\n\t\tthis.scrollOffset = Math.max(\n\t\t\tMath.min(this.scrollBoundary[1], this.scrollOffset),\n\t\t\tthis.scrollBoundary[0],\n\t\t);\n\t}\n\t/**\n\t * 获取当前播放时间里是否处于间奏区间\n\t * 如果是则会返回单位为毫秒的始末时间\n\t * 否则返回 undefined\n\t *\n\t * 这个只允许内部调用\n\t * @returns [开始时间,结束时间,大概处于的歌词行ID,下一句是否为对唱歌词] 或 undefined 如果不处于间奏区间\n\t */\n\tgetCurrentInterlude(): [number, number, number, boolean] | undefined {\n\t\tif (this.bufferedLines.size > 0) return undefined;\n\t\tconst currentTime = this.currentTime + 20;\n\t\tconst i = this.scrollToIndex;\n\t\tif (i === 0) {\n\t\t\tif (this.processedLines[0]?.startTime) {\n\t\t\t\tif (this.processedLines[0].startTime > currentTime) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\tcurrentTime,\n\t\t\t\t\t\tMath.max(currentTime, this.processedLines[0].startTime - 250),\n\t\t\t\t\t\t-2,\n\t\t\t\t\t\tthis.processedLines[0].isDuet,\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (\n\t\t\tthis.processedLines[i]?.endTime &&\n\t\t\tthis.processedLines[i + 1]?.startTime\n\t\t) {\n\t\t\tif (\n\t\t\t\tthis.processedLines[i + 1].startTime > currentTime &&\n\t\t\t\tthis.processedLines[i].endTime < currentTime\n\t\t\t) {\n\t\t\t\treturn [\n\t\t\t\t\tMath.max(this.processedLines[i].endTime, currentTime),\n\t\t\t\t\tthis.processedLines[i + 1].startTime,\n\t\t\t\t\ti,\n\t\t\t\t\tthis.processedLines[i + 1].isDuet,\n\t\t\t\t];\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\t/**\n\t * 重建样式\n\t *\n\t * 这个只允许内部调用\n\t */\n\trebuildStyle() {\n\t\tthis._baseFontSize = parseFloat(getComputedStyle(this.element).fontSize);\n\t\tlet style = \"\";\n\t\tstyle += \"--amll-lyric-player-width:\";\n\t\tstyle += this.innerSize[0] - this.padding * 2;\n\t\tstyle += \"px;\";\n\t\tstyle += \"--amll-lyric-player-height:\";\n\t\tstyle += this.innerSize[1] - this.padding * 2;\n\t\tstyle += \"px;\";\n\t\t// style += \"--amll-player-time:\";\n\t\t// style += this.currentTime;\n\t\t// style += \";\";\n\t\tthis.element.setAttribute(\"style\", style);\n\t}\n\t/**\n\t * 设置是否隐藏已经播放过的歌词行,默认不隐藏\n\t * @param hide 是否隐藏已经播放过的歌词行,默认不隐藏\n\t */\n\tsetHidePassedLines(hide: boolean) {\n\t\tthis.hidePassedLines = hide;\n\t\tthis.calcLayout();\n\t}\n\t/**\n\t * 设置是否启用歌词行的模糊效果\n\t * @param enable 是否启用\n\t */\n\tsetEnableBlur(enable: boolean) {\n\t\tif (this.enableBlur === enable) return;\n\t\tthis.enableBlur = enable;\n\t\tthis.calcLayout();\n\t}\n\t/**\n\t * 设置当前播放歌词,要注意传入后这个数组内的信息不得修改,否则会发生错误\n\t * @param lines 歌词数组\n\t */\n\tsetLyricLines(lines: LyricLine[]) {\n\t\tfor (const line of lines) {\n\t\t\tfor (const word of line.words) {\n\t\t\t\tword.word = word.word.replace(/\\s+/g, \" \");\n\t\t\t}\n\t\t}\n\t\tthis.lyricLines = lines;\n\t\tconst timeOffset = 750;\n\t\tthis.processedLines = lines\n\t\t\t.filter(\n\t\t\t\t(line) =>\n\t\t\t\t\tline.words.reduce((pv, cv) => pv + cv.word.trim().length, 0) > 0,\n\t\t\t)\n\t\t\t.map((line, i, lines) => {\n\t\t\t\tif (line.isBG)\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...line,\n\t\t\t\t\t};\n\n\t\t\t\tif (i === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...line,\n\t\t\t\t\t\tstartTime: Math.max(line.startTime - timeOffset, 0),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst lastLine = lines[i - 1];\n\t\t\t\tconst pastLine = lines[i - 2];\n\t\t\t\tif (lastLine?.isBG && pastLine) {\n\t\t\t\t\tif (pastLine.endTime < line.startTime) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\tMath.max(pastLine.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else if (lastLine?.endTime) {\n\t\t\t\t\tif (lastLine.endTime < line.startTime) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\tMath.max(lastLine?.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...line,\n\t\t\t\t};\n\t\t\t});\n\t\tthis.isNonDynamic = true;\n\t\tfor (const line of this.processedLines) {\n\t\t\tif (line.words.length > 1) {\n\t\t\t\tthis.isNonDynamic = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.processedLines.forEach((line, i, lines) => {\n\t\t\tconst nextLine = lines[i + 1];\n\t\t\tconst lastWord = line.words[line.words.length - 1];\n\t\t\tif (lastWord && shouldEmphasize(lastWord)) {\n\t\t\t\tif (nextLine) {\n\t\t\t\t\tif (nextLine.startTime > line.endTime) {\n\t\t\t\t\t\tline.endTime = Math.min(line.endTime + 1500, nextLine.startTime);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tline.endTime = line.endTime + 1500;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tthis.processedLines.forEach((line, i, lines) => {\n\t\t\tif (line.isBG) return;\n\t\t\tconst nextLine = lines[i + 1];\n\t\t\tif (nextLine?.isBG) {\n\t\t\t\tnextLine.startTime = Math.min(nextLine.startTime, line.startTime);\n\t\t\t}\n\t\t});\n\t\tthis.lyricLinesEl.forEach((line) => {\n\t\t\tline.removeMouseEventListener(\"click\", this.onLineClickedHandler);\n\t\t\tline.removeMouseEventListener(\"contextmenu\", this.onLineClickedHandler);\n\t\t\tline.dispose();\n\t\t});\n\t\t// const prevLinesEl = this.lyricLinesEl;\n\t\tthis.lyricLinesEl = this.processedLines.map((line) => {\n\t\t\t// if (this.lyricLinesEl[i]) {\n\t\t\t// \tthis.lyricLinesEl[i].setLine(line);\n\t\t\t// \treturn this.lyricLinesEl[i];\n\t\t\t// } else {\n\t\t\tconst lineEl = new LyricLineEl(this, line);\n\t\t\tlineEl.addMouseEventListener(\"click\", this.onLineClickedHandler);\n\t\t\tlineEl.addMouseEventListener(\"contextmenu\", this.onLineClickedHandler);\n\t\t\treturn lineEl;\n\t\t\t// }\n\t\t});\n\t\t// while (prevLinesEl.length > this.processedLines.length) {\n\t\t// \tconst rest = prevLinesEl.pop();\n\t\t// \trest?.removeEventListener(\"click\", this.onLineClickedHandler);\n\t\t// \trest?.removeEventListener(\"contextmenu\", this.onLineClickedHandler);\n\t\t// \trest?.dispose();\n\t\t// }\n\t\tthis.lyricLinesEl.forEach((el, i) => {\n\t\t\tthis.element.appendChild(el.getElement());\n\t\t\tthis.lyricLinesIndexes.set(el, i);\n\t\t\tel.updateMaskImage();\n\t\t});\n\t\tthis.interludeDots.setInterlude(undefined);\n\t\tthis.hotLines.clear();\n\t\tthis.bufferedLines.clear();\n\t\tthis.setLinePosXSpringParams({});\n\t\tthis.setLinePosYSpringParams({});\n\t\tthis.setLineScaleSpringParams({});\n\t\tthis.setCurrentTime(0, true);\n\t\tthis.calcLayout(true, true);\n\t}\n\t/**\n\t * 重置用户滚动状态\n\t *\n\t * 请在用户完成滚动点击跳转歌词时调用本事件再调用 `calcLayout` 以正确滚动到目标位置\n\t */\n\tresetScroll() {\n\t\tthis.isScrolled = false;\n\t\tthis.scrollOffset = 0;\n\t\tthis.invokedByScrollEvent = false;\n\t\tclearTimeout(this.scrolledHandler);\n\t\tthis.scrolledHandler = 0;\n\t}\n\t/**\n\t * 重新布局定位歌词行的位置,调用完成后再逐帧调用 `update`\n\t * 函数即可让歌词通过动画移动到目标位置。\n\t *\n\t * 函数有一个 `force` 参数,用于指定是否强制修改布局,也就是不经过动画直接调整元素位置和大小。\n\t *\n\t * 此函数还有一个 `reflow` 参数,用于指定是否需要重新计算布局\n\t *\n\t * 因为计算布局必定会导致浏览器重排布局,所以会大幅度影响流畅度和性能,故请只在以下情况下将其​设置为 true:\n\t *\n\t * 1. 歌词页面大小发生改变时(这个组件会自行处理)\n\t * 2. 加载了新的歌词时(不论前后歌词是否完全一样)\n\t * 3. 用户自行跳转了歌曲播放位置(不论距离远近)\n\t *\n\t * @param force 是否不经过动画直接修改布局定位\n\t * @param reflow 是否进行重新布局(重新计算每行歌词大小)\n\t */\n\tcalcLayout(force = false, reflow = false) {\n\t\tif (reflow) {\n\t\t\tthis.emUnit = parseFloat(getComputedStyle(this.element).fontSize);\n\t\t\tthis.lyricLinesEl.forEach((el) => {\n\t\t\t\tconst size: [number, number] = el.measureSize();\n\t\t\t\tthis.lyricLinesSize.set(el, size);\n\t\t\t\tel.lineSize = size;\n\t\t\t});\n\t\t\tthis.interludeDotsSize[0] = this.interludeDots.getElement().clientWidth;\n\t\t\tthis.interludeDotsSize[1] = this.interludeDots.getElement().clientHeight;\n\n\t\t\tthis.bottomLine.lineSize = this.bottomLine.measureSize();\n\t\t}\n\t\tconst interlude = this.getCurrentInterlude();\n\t\tlet curPos = -this.scrollOffset;\n\t\tlet targetAlignIndex = this.scrollToIndex;\n\t\tlet interludeDuration = 0;\n\t\tif (interlude) {\n\t\t\tinterludeDuration = interlude[1] - interlude[0];\n\t\t\tif (interludeDuration >= 5000) {\n\t\t\t\tconst nextLine = this.lyricLinesEl[interlude[2] + 1];\n\t\t\t\tif (nextLine) {\n\t\t\t\t\ttargetAlignIndex = interlude[2] + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.interludeDots.setInterlude(undefined);\n\t\t}\n\t\tconst SCALE_ASPECT = this.enableScale ? 0.95 : 1;\n\t\tconst scrollOffset = this.lyricLinesEl\n\t\t\t.slice(0, targetAlignIndex)\n\t\t\t.reduce(\n\t\t\t\t(acc, el) =>\n\t\t\t\t\tacc + (el.getLine().isBG ? 0 : this.lyricLinesSize.get(el)?.[1] ?? 0),\n\t\t\t\t0,\n\t\t\t);\n\t\tthis.scrollBoundary[0] = -scrollOffset;\n\t\tcurPos -= scrollOffset;\n\t\tcurPos += this.size[1] * this.alignPosition;\n\t\tconst curLine = this.lyricLinesEl[targetAlignIndex];\n\t\tif (curLine) {\n\t\t\tconst lineHeight = this.lyricLinesSize.get(curLine)?.[1] ?? 0;\n\t\t\tswitch (this.alignAnchor) {\n\t\t\t\tcase \"bottom\":\n\t\t\t\t\tcurPos -= lineHeight;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"center\":\n\t\t\t\t\tcurPos -= lineHeight / 2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"top\":\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tconst latestIndex = Math.max(...this.bufferedLines);\n\t\tlet delay = 0;\n\t\tlet baseDelay = 0.05;\n\t\tlet setDots = false;\n\t\t// console.groupCollapsed(\"calcLayout\");\n\t\tthis.lyricLinesEl.forEach((el, i) => {\n\t\t\tconst hasBuffered = this.bufferedLines.has(i);\n\t\t\tconst isActive =\n\t\t\t\thasBuffered || (i >= this.scrollToIndex && i < latestIndex);\n\t\t\tconst line = el.getLine();\n\t\t\tlet left = 0;\n\t\t\tif (line.isDuet) {\n\t\t\t\tleft = this.size[0] - (this.lyricLinesSize.get(el)?.[0] ?? 0);\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!setDots &&\n\t\t\t\tinterludeDuration >= 5000 &&\n\t\t\t\t((i === this.scrollToIndex && interlude?.[2] === -2) ||\n\t\t\t\t\ti === this.scrollToIndex + 1)\n\t\t\t) {\n\t\t\t\tsetDots = true;\n\t\t\t\tthis.interludeDots.setTransform(this.padding - 20, curPos + 10);\n\t\t\t\tif (interlude) {\n\t\t\t\t\tthis.interludeDots.setInterlude([interlude[0], interlude[1]]);\n\t\t\t\t}\n\t\t\t\tcurPos += this.interludeDotsSize[1] + 40;\n\t\t\t}\n\t\t\tlet targetOpacity = 1;\n\t\t\tif (!isActive && i <= (interlude ? interlude[2] : this.scrollToIndex)) {\n\t\t\t\tif (this.hidePassedLines) {\n\t\t\t\t\ttargetOpacity = 0;\n\t\t\t\t} else if (this.isNonDynamic) {\n\t\t\t\t\ttargetOpacity = 0.25;\n\t\t\t\t} else {\n\t\t\t\t\ttargetOpacity = 0.15;\n\t\t\t\t}\n\t\t\t} else if (hasBuffered) {\n\t\t\t\tif (this.isNonDynamic) {\n\t\t\t\t\ttargetOpacity = 0.85;\n\t\t\t\t} else {\n\t\t\t\t\ttargetOpacity = 1;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this.isNonDynamic) {\n\t\t\t\t\ttargetOpacity = 0.25;\n\t\t\t\t} else {\n\t\t\t\t\ttargetOpacity = 0.5;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.invokedByScrollEvent) {\n\t\t\t\tif (this.isNonDynamic) {\n\t\t\t\t\ttargetOpacity = 0.85;\n\t\t\t\t} else {\n\t\t\t\t\ttargetOpacity = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet blurLevel = 0;\n\t\t\tif (this.enableBlur) {\n\t\t\t\tif (isActive) {\n\t\t\t\t\tblurLevel = 0;\n\t\t\t\t} else {\n\t\t\t\t\tblurLevel = 1;\n\t\t\t\t\tif (i < this.scrollToIndex) {\n\t\t\t\t\t\tblurLevel += Math.abs(this.scrollToIndex - i) / 2;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tblurLevel += Math.abs(\n\t\t\t\t\t\t\ti - Math.max(this.scrollToIndex, latestIndex),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.invokedByScrollEvent) {\n\t\t\t\tblurLevel = 0;\n\t\t\t}\n\t\t\tel.setTransform(\n\t\t\t\tthis.padding,\n\t\t\t\tcurPos,\n\t\t\t\tisActive ? 1 : SCALE_ASPECT,\n\t\t\t\ttargetOpacity,\n\t\t\t\tblurLevel * 1.5,\n\t\t\t\tforce,\n\t\t\t\tdelay,\n\t\t\t);\n\t\t\t// console.log(i, el._getDebugTargetPos());\n\t\t\tif (line.isBG && isActive) {\n\t\t\t\tcurPos += this.lyricLinesSize.get(el)?.[1] ?? 0;\n\t\t\t} else if (!line.isBG) {\n\t\t\t\tcurPos += this.lyricLinesSize.get(el)?.[1] ?? 0;\n\t\t\t}\n\t\t\tif (curPos >= 0) {\n\t\t\t\tdelay += baseDelay;\n\t\t\t\tbaseDelay /= 1.2;\n\t\t\t}\n\t\t});\n\t\tthis.scrollBoundary[1] = curPos + this.scrollOffset - this.size[1] / 2;\n\t\t// console.groupEnd();\n\t\tthis.bottomLine.setTransform(this.padding, curPos, force, delay);\n\t}\n\t/**\n\t * 获取当前歌词的播放位置\n\t *\n\t * 一般和最后调用 `setCurrentTime` 给予的参数一样\n\t * @returns 当前播放位置\n\t */\n\tgetCurrentTime() {\n\t\treturn this.currentTime;\n\t}\n\t/**\n\t * 获取当前歌词数组\n\t *\n\t * 一般和最后调用 `setLyricLines` 给予的参数一样\n\t * @returns 当前歌词数组\n\t */\n\tgetLyricLines() {\n\t\treturn this.lyricLines;\n\t}\n\tgetElement(): HTMLElement {\n\t\treturn this.element;\n\t}\n\t/**\n\t * 获取一个特殊的底栏元素,默认是空白的,可以往内部添加任意元素\n\t *\n\t * 这个元素始终在歌词的底部,可以用于显示歌曲创作者等信息\n\t *\n\t * 但是请勿删除该元素,只能在内部存放元素\n\t *\n\t * @returns 一个元素,可以往内部添加任意元素\n\t */\n\tgetBottomLineElement(): HTMLElement {\n\t\treturn this.bottomLine.getElement();\n\t}\n\t/**\n\t * 设置目标歌词行的对齐方式,默认为 `center`\n\t *\n\t * - 设置成 `top` 的话将会向目标歌词行的顶部对齐\n\t * - 设置成 `bottom` 的话将会向目标歌词行的底部对齐\n\t * - 设置成 `center` 的话将会向目标歌词行的垂直中心对齐\n\t * @param alignAnchor 歌词行对齐方式,详情见函数说明\n\t */\n\tsetAlignAnchor(alignAnchor: \"top\" | \"bottom\" | \"center\") {\n\t\tthis.alignAnchor = alignAnchor;\n\t}\n\t/**\n\t * 设置默认的歌词行对齐位置,相对于整个歌词播放组件的大小位置,默认为 `0.5`\n\t * @param alignPosition 一个 `[0.0-1.0]` 之间的任意数字,代表组件高度由上到下的比例位置\n\t */\n\tsetAlignPosition(alignPosition: number) {\n\t\tthis.alignPosition = alignPosition;\n\t}\n\t/**\n\t * 设置当前播放进度,单位为毫秒且**必须是整数**,此时将会更新内部的歌词进度信息\n\t * 内部会根据调用间隔和播放进度自动决定如何滚动和显示歌词,所以这个的调用频率越快越准确越好\n\t *\n\t * 调用完成后,可以每帧调用 `update` 函数来执行歌词动画效果\n\t * @param time 当前播放进度,单位为毫秒\n\t */\n\tsetCurrentTime(time: number, isSeek = false) {\n\t\t// 我在这里定义了歌词的选择状态:\n\t\t// 普通行:当前不处于时间范围内的歌词行\n\t\t// 热行:当前绝对处于播放时间内的歌词行,且一般会被立刻加入到缓冲行中\n\t\t// 缓冲行:一般处于播放时间后的歌词行,会因为当前播放状态的缘故推迟解除状态\n\n\t\t// 然后我们需要让歌词行为如下:\n\t\t// 如果当前仍有缓冲行的情况下加入新热行,则不会解除当前缓冲行,且也不会修改当前滚动位置\n\t\t// 如果当前所有缓冲行都将被删除且没有新热行加入,则删除所有缓冲行,且也不会修改当前滚动位置\n\t\t// 如果当前所有缓冲行都将被删除且有新热行加入,则删除所有缓冲行并加入新热行作为缓冲行,然后修改当前滚动位置\n\t\tthis.currentTime = time;\n\t\tif (!this.isPageVisible) return;\n\t\tif (!this._getIsNonDynamic() && !this.supportMaskImage)\n\t\t\tthis.element.style.setProperty(\"--amll-player-time\", `${time}`);\n\t\tif (this.isScrolled) return;\n\t\tconst removedHotIds = new Set<number>();\n\t\tconst removedIds = new Set<number>();\n\t\tconst addedIds = new Set<number>();\n\n\t\tif (isSeek) {\n\t\t\tfor (const line of this.lyricLinesEl) {\n\t\t\t\tline.setMaskAnimationState(time);\n\t\t\t}\n\t\t}\n\n\t\t// 先检索当前已经超出时间范围的缓冲行,列入待删除集内\n\t\tthis.hotLines.forEach((lastHotId) => {\n\t\t\tconst line = this.processedLines[lastHotId];\n\t\t\tif (line) {\n\t\t\t\tif (line.isBG) return;\n\t\t\t\tconst nextLine = this.processedLines[lastHotId + 1];\n\t\t\t\tif (nextLine?.isBG) {\n\t\t\t\t\tconst nextMainLine = this.processedLines[lastHotId + 2];\n\t\t\t\t\tconst startTime = Math.min(line.startTime, nextLine?.startTime);\n\t\t\t\t\tconst endTime = Math.min(\n\t\t\t\t\t\tMath.max(line.endTime, nextMainLine?.startTime ?? Number.MAX_VALUE),\n\t\t\t\t\t\tMath.max(line.endTime, nextLine?.endTime),\n\t\t\t\t\t);\n\t\t\t\t\tif (startTime > time || endTime <= time) {\n\t\t\t\t\t\tthis.hotLines.delete(lastHotId);\n\t\t\t\t\t\tremovedHotIds.add(lastHotId);\n\t\t\t\t\t\tthis.hotLines.delete(lastHotId + 1);\n\t\t\t\t\t\tremovedHotIds.add(lastHotId + 1);\n\t\t\t\t\t\tif (isSeek) {\n\t\t\t\t\t\t\tthis.lyricLinesEl[lastHotId].disable(time);\n\t\t\t\t\t\t\tthis.lyricLinesEl[lastHotId + 1].disable(time);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (line.startTime > time || line.endTime <= time) {\n\t\t\t\t\tthis.hotLines.delete(lastHotId);\n\t\t\t\t\tremovedHotIds.add(lastHotId);\n\t\t\t\t\tif (isSeek) this.lyricLinesEl[lastHotId].disable(time);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.hotLines.delete(lastHotId);\n\t\t\t\tremovedHotIds.add(lastHotId);\n\t\t\t\tif (isSeek) this.lyricLinesEl[lastHotId].disable(time);\n\t\t\t}\n\t\t});\n\t\tthis.processedLines.forEach((line, id, arr) => {\n\t\t\tif (!line.isBG && line.startTime <= time && line.endTime > time) {\n\t\t\t\tif (!this.hotLines.has(id)) {\n\t\t\t\t\tthis.hotLines.add(id);\n\t\t\t\t\taddedIds.add(id);\n\t\t\t\t\tif (isSeek) this.lyricLinesEl[id].enable(time);\n\t\t\t\t\tif (arr[id + 1]?.isBG) {\n\t\t\t\t\t\tthis.hotLines.add(id + 1);\n\t\t\t\t\t\taddedIds.add(id + 1);\n\t\t\t\t\t\tif (isSeek) this.lyricLinesEl[id + 1].enable(time);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tthis.bufferedLines.forEach((v) => {\n\t\t\tif (!this.hotLines.has(v)) {\n\t\t\t\tremovedIds.add(v);\n\t\t\t\tif (isSeek) this.lyricLinesEl[v].disable(time);\n\t\t\t}\n\t\t});\n\t\tif (isSeek) {\n\t\t\tif (this.bufferedLines.size > 0) {\n\t\t\t\tthis.scrollToIndex = Math.min(...this.bufferedLines);\n\t\t\t} else {\n\t\t\t\tthis.scrollToIndex = this.processedLines.findIndex(\n\t\t\t\t\t(line) => line.startTime >= time,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.bufferedLines.clear();\n\t\t\tthis.hotLines.forEach((v) => this.bufferedLines.add(v));\n\t\t\tthis.calcLayout(true);\n\t\t} else if (removedIds.size > 0 || addedIds.size > 0) {\n\t\t\t// function debugLog() {\n\t\t\t// \tconsole.groupCollapsed(\"setCurrentTime\", time);\n\t\t\t// \tconsole.log(\"removedIds\", removedIds);\n\t\t\t// \tconsole.log(\"addedIds\", addedIds);\n\t\t\t// \tconsole.groupEnd();\n\t\t\t// }\n\t\t\tif (removedIds.size === 0 && addedIds.size > 0) {\n\t\t\t\t// debugLog();\n\t\t\t\taddedIds.forEach((v) => {\n\t\t\t\t\tthis.bufferedLines.add(v);\n\t\t\t\t\tthis.lyricLinesEl[v].enable(time);\n\t\t\t\t});\n\t\t\t\tthis.scrollToIndex = Math.min(...this.bufferedLines);\n\t\t\t\tthis.calcLayout();\n\t\t\t} else if (addedIds.size === 0 && removedIds.size > 0) {\n\t\t\t\tif (eqSet(removedIds, this.bufferedLines)) {\n\t\t\t\t\t// debugLog();\n\t\t\t\t\tthis.bufferedLines.forEach((v) => {\n\t\t\t\t\t\tif (!this.hotLines.has(v)) {\n\t\t\t\t\t\t\tthis.bufferedLines.delete(v);\n\t\t\t\t\t\t\tthis.lyricLinesEl[v].disable(time);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tthis.calcLayout();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// debugLog();\n\t\t\t\taddedIds.forEach((v) => {\n\t\t\t\t\tthis.bufferedLines.add(v);\n\t\t\t\t\tthis.lyricLinesEl[v].enable(time);\n\t\t\t\t});\n\t\t\t\tremovedIds.forEach((v) => {\n\t\t\t\t\tthis.bufferedLines.delete(v);\n\t\t\t\t\tthis.lyricLinesEl[v].disable(time);\n\t\t\t\t});\n\t\t\t\tif (this.bufferedLines.size > 0)\n\t\t\t\t\tthis.scrollToIndex = Math.min(...this.bufferedLines);\n\t\t\t\tthis.calcLayout();\n\t\t\t}\n\t\t}\n\t}\n\t/**\n\t * 暂停部分效果演出,目前会暂停播放间奏点的动画\n\t */\n\tpause() {\n\t\tthis.interludeDots.pause();\n\t\tfor (const line of this.lyricLinesEl) {\n\t\t\tline.pause();\n\t\t}\n\t}\n\t/**\n\t * 恢复部分效果演出,目前会恢复播放间奏点的动画\n\t */\n\tresume() {\n\t\tthis.interludeDots.resume();\n\t\tfor (const line of this.lyricLinesEl) {\n\t\t\tline.resume();\n\t\t}\n\t}\n\t/**\n\t * 更新动画,这个函数应该被逐帧调用或者在以下情况下调用一次:\n\t *\n\t * 1. 刚刚调用完设置歌词函数的时候\n\t * @param delta 距离上一次被调用到现在的时长,单位为毫秒(可为浮点数)\n\t */\n\tupdate(delta = 0) {\n\t\tif (!this.isPageVisible) return;\n\t\tconst deltaS = delta / 1000;\n\t\tthis.interludeDots.update(delta);\n\t\tthis.bottomLine.update(deltaS);\n\t\tthis.lyricLinesEl.forEach((line) => line.update(deltaS));\n\t}\n\t/**\n\t * 设置所有歌词行在横坐标上的弹簧属性,包括重量、弹力和阻力。\n\t *\n\t * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样\n\t */\n\tsetLinePosXSpringParams(params: Partial<SpringParams>) {\n\t\tthis.posXSpringParams = {\n\t\t\t...this.posXSpringParams,\n\t\t\t...params,\n\t\t};\n\t\tthis.bottomLine.lineTransforms.posX.updateParams(this.posXSpringParams);\n\t\tthis.lyricLinesEl.forEach((line) =>\n\t\t\tline.lineTransforms.posX.updateParams(this.posXSpringParams),\n\t\t);\n\t}\n\t/**\n\t * 设置所有歌词行在​纵坐标上的弹簧属性,包括重量、弹力和阻力。\n\t *\n\t * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样\n\t */\n\tsetLinePosYSpringParams(params: Partial<SpringParams>) {\n\t\tthis.posYSpringParams = {\n\t\t\t...this.posYSpringParams,\n\t\t\t...params,\n\t\t};\n\t\tthis.bottomLine.lineTransforms.posY.updateParams(this.posYSpringParams);\n\t\tthis.lyricLinesEl.forEach((line) =>\n\t\t\tline.lineTransforms.posY.updateParams(this.posYSpringParams),\n\t\t);\n\t}\n\t/**\n\t * 设置所有歌词行在​缩放大小上的弹簧属性,包括重量、弹力和阻力。\n\t *\n\t * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样\n\t */\n\tsetLineScaleSpringParams(params: Partial<SpringParams>) {\n\t\tthis.scaleSpringParams = {\n\t\t\t...this.scaleSpringParams,\n\t\t\t...params,\n\t\t};\n\t\tthis.lyricLinesEl.forEach((line) =>\n\t\t\tline.lineTransforms.scale.updateParams(this.scaleSpringParams),\n\t\t);\n\t}\n\tdispose(): void {\n\t\tthis.element.remove();\n\t\tthis.resizeObserver.disconnect();\n\t\tthis.style.detach();\n\t\tthis.lyricLinesEl.forEach((el) => el.dispose());\n\t\twindow.removeEventListener(\"pageshow\", this.onPageShow);\n\t\tthis.bottomLine.dispose();\n\t\tthis.interludeDots.dispose();\n\t}\n}\n"],"names":["AbstractBaseRenderer","BaseRenderer","canvas","__publicField","width","height","scale","speed","loadImage","imageUrl","resolve","reject","img","loadVideo","videoUrl","video","playing","timeupdate","rejected","checkReady","err","loadResourceFromUrl","url","isVideo","loadResourceFromElement","element","TimedContainer","Container","PixiRenderer","delta","lastContainer","s1","s2","s3","s4","maxSize","Application","minBorder","maxBorder","c0","ColorMatrixFilter","c1","c2","_a","filter","BlurFilter","BulgePinchFilter","enable","fps","_volume","_hasLyric","albumSource","res","remainRetryTimes","tex","_b","Texture","error","container","Sprite","vertShader","fragShader","blendShader","eplorShader","noiseShader","noiseImage","NOISE_IMAGE_DATA","blurImage","imageData","radius","quality","pixels","rsum","gsum","bsum","asum","x","y","i","p","p1","p2","yp","yi","yw","wm","hm","rad1x","divx","rad1y","divy","div2","r","g","b","a","vmin","vmax","saturateImage","saturation","gray","contrastImage","contrast","GLProgram","gl","vertexShaderSource","fragmentShaderSource","label","coordPos","type","source","shader","program","errLog","name","value","location","value1","value2","Framebuffer","fb","texture","GLBuffer","data","usage","buffer","AlbumTexture","mainProgram","vertexBuffer","indexBuffer","albumImageData","albumTexture","sampler","NoiseTexture","_EplorRenderer","bounds","tickTime","frameDelta","realWidth","realHeight","t","fba","fbb","sprite","deleted","isOnlyOneSprite","isTweeningValues","src","dst","volume","c","ctx","blurRadius","imgw","imgh","hasLyric","s","EplorRenderer","BackgroundRender","renderer","eqSet","xs","ys","derivative","f","getVelocity","Spring","currentPosition","curV","solveSpring","targetPosition","params","delay","from","velocity","to","soft","stiffness","damping","mass","angular_frequency","leftover","damping_frequency","dfm","dm","BottomLineEl","lyricPlayer","style","left","top","force","l","pr","pb","easeInOutBack","clamp","min","cur","max","InterludeDots","interlude","curStyle","interludeDuration","currentDuration","breatheDuration","globalOpacity","dotsDuration","dot0Opacity","dot1Opacity","dot2Opacity","createMatrix4","scaleMatrix4","m","origin","ox","oy","matrix4ToCSS","fractionDigits","format","n","NEWTON_ITERATIONS","NEWTON_MIN_SLOPE","SUBDIVISION_PRECISION","SUBDIVISION_MAX_ITERATIONS","kSplineTableSize","kSampleStepSize","float32ArraySupported","A","aA1","aA2","B","C","calcBezier","aT","getSlope","binarySubdivide","aX","aA","aB","mX1","mX2","currentX","currentT","newtonRaphsonIterate","aGuessT","currentSlope","LinearEasing","mY1","mY2","sampleValues","getTForX","intervalStart","currentSample","lastSample","dist","guessForT","initialSlope","CJKEXP","ANIMATION_FRAME_QUANTITY","norNum","EMP_EASING_MID","beginNum","endNum","makeEmpEasing","mid","bezIn","bezier","bezOut","defaultEmpEasing","generateFadeGradient","padding","bright","dark","totalAspect","widthInTotal","leftPos","chunkAndSplitLyricWords","words","resplitedWords","w","realLength","splited","v","charPos","word","wordChunk","wChunk","result","shouldEmphasize","RawLyricLineMouseEvent","line","event","LyricLineEl","lyricLine","wrapped","listener","main","trans","roman","callback","options","listeners","maskAnimationTime","size","chunkedWords","chunk","merged","emp","wrapperWordEl","characterElements","mainWordEl","charEls","char","charEl","realWord","duration","wordEl","up","de","du","method","amount","blur","animateDu","empEasing","el","arr","wordDe","frames","_","transX","glowLevel","mat","ani","fadeWidth","maskImage","totalAspectStr","maskPos","totalDuration","widthBeforeSelf","minOffset","clampOffset","curPos","timeOffset","lastPos","lastTime","pushFrame","moveOffset","time","d","staticTime","frame","lastTimeStamp","otherWord","j","curTimeStamp","staticDuration","fadeDuration","opacity","roundedBlur","beforeInSight","enableSpring","afterInSight","jss","create","preset","LyricLineMouseEvent","lineIndex","LyricPlayer","rect","styles","innerWidth","innerHeight","evt","startScrollY","direction","startTouchPosY","startScrollTime","scrollSpeed","scrollId","lastMoveY","lastDragTime","touchScreenY","lastDelta","targetDirection","curTime","scrollDuration","lt","curScrollId","onScrollFrame","dt","allowed","currentTime","_c","hide","lines","pv","cv","lastLine","pastLine","nextLine","lastWord","lineEl","reflow","targetAlignIndex","SCALE_ASPECT","scrollOffset","acc","curLine","lineHeight","latestIndex","baseDelay","setDots","hasBuffered","isActive","targetOpacity","blurLevel","alignAnchor","alignPosition","isSeek","removedHotIds","removedIds","addedIds","lastHotId","nextMainLine","startTime","endTime","id","deltaS"],"mappings":";;;;;;;;;;;;AAEO,MAAeA,GAAuD;AA8D7E;AAEO,MAAeC,WAAqBD,GAAqB;AAAA,EAI/D,YAAsBE,GAA2B;AAC1C;AAJC,IAAAC,EAAA;AACE,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,6BAAsB;AACV,SAAA,SAAAD,GAEhB,KAAA,WAAW,IAAI,eAAe,MAAM;AACxC,YAAME,IAAQ,KAAK;AAAA,QAClB;AAAA,QACAF,EAAO,cAAc,OAAO,mBAAmB,KAAK;AAAA,MAAA,GAE/CG,IAAS,KAAK;AAAA,QACnB;AAAA,QACAH,EAAO,eACN,OAAO,mBACP,KAAK;AAAA,MAAA;AAEF,WAAA,SAASE,GAAOC,CAAM;AAAA,IAAA,CAC3B,GACI,KAAA,SAAS,QAAQH,CAAM;AAAA,EAC7B;AAAA,EACA,eAAeI,GAAe;AAC7B,SAAK,sBAAsBA,GACtB,KAAA;AAAA,MACJ,KAAK,OAAO,cACX,OAAO,mBACP,KAAK;AAAA,MACN,KAAK,OAAO,eACX,OAAO,mBACP,KAAK;AAAA,IAAA;AAAA,EAER;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQU,SAASF,GAAeC,GAAsB;AACvD,SAAK,OAAO,QAAQD,GACpB,KAAK,OAAO,SAASC;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,aAAaE,GAAe;AAC3B,SAAK,YAAYA;AAAA,EAClB;AAAA,EA6BA,UAAgB;AACf,SAAK,SAAS,cACd,KAAK,OAAO;EACb;AACD;ACpJO,SAASC,GAAUC,GAA6C;AACtE,SAAO,IAAI,QAAQ,CAACC,GAASC,MAAW;AACjC,UAAAC,IAAM,SAAS,cAAc,KAAK;AACpC,IAAAA,EAAA,SAAS,MAAMF,EAAQE,CAAG,GAC9BA,EAAI,UAAUD,GACdC,EAAI,MAAMH,GACVG,EAAI,cAAc,aAEhBA,EAAA,SACA,KAAK,MAAMF,EAAQE,CAAG,CAAC,EACvB,MAAMD,CAAM;AAAA,EAAA,CACd;AACF;AAEO,SAASE,GAAUC,GAA6C;AACtE,SAAO,IAAI,QAAQ,CAACJ,GAASC,MAAW;AACjC,UAAAI,IAAQ,SAAS,cAAc,OAAO;AAC5C,QAAIC,IAAU,IACVC,IAAa,IACbC,IAAW;AACT,IAAAH,EAAA;AAAA,MACL;AAAA,MACA,MAAM;AACK,QAAAC,IAAA,IACCG;MACZ;AAAA,MACA;AAAA,IAAA,GAEKJ,EAAA;AAAA,MACL;AAAA,MACA,MAAM;AACQ,QAAAE,IAAA,IACFE;MACZ;AAAA,MACA;AAAA,IAAA,GAEKJ,EAAA;AAAA,MACL;AAAA,MACA,CAACK,MAAQ;AACG,QAAAF,IAAA,IACXP,EAAOS,CAAG;AAAA,MACX;AAAA,MACA;AAAA,IAAA;AAED,aAASD,IAAa;AACjB,MAAAH,KAAWC,KAAc,CAACC,KAC7BR,EAAQK,CAAK;AAAA,IAEf;AACA,IAAAA,EAAM,MAAMD,GACZC,EAAM,cAAc,IACpBA,EAAM,cAAc,aACpBA,EAAM,WAAW,IACjBA,EAAM,OAAO,IACbA,EAAM,QAAQ,IACdA,EAAM,KAAK;AAAA,EAAA,CACX;AACF;AAEgB,SAAAM,GACfC,GACAC,IAAU,IACqC;AAC/C,SAAOA,IAAUV,GAAUS,CAAG,IAAId,GAAUc,CAAG;AAChD;AAEO,SAASE,GACfC,GAC+C;AAC/C,SAAO,IAAI,QAAQ,CAACf,GAASC,MAAW;AACvC,KACCc,aAAmB,mBAChBA,EAAQ,WACRA,EAAQ,cAAc,KAEzBf,EAAQe,CAAO,KAEPA,EAAA,SAAS,MAAMf,EAAQe,CAAO,GACtCA,EAAQ,UAAUd;AAAA,EACnB,CACA;AACF;ACpEA,MAAMe,WAAuBC,GAAU;AAAA,EAAvC;AAAA;AACQ,IAAAxB,EAAA,cAAO;AAAA;AACf;AAEO,MAAMyB,WAAqB3B,GAAa;AAAA,EAwE9C,YAAsBC,GAA2B;AAChD,UAAMA,CAAM;AAxEL,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,2CAAyC;AACzC,IAAAA,EAAA,gBAAS,CAAC0B,MAAwB;AAC9B,iBAAAC,KAAiB,KAAK;AAChC,QAAAA,EAAc,QAAQ,KAAK,IAAI,GAAGA,EAAc,QAAQD,IAAQ,EAAE,GAC9DC,EAAc,SAAS,MACrB,KAAA,IAAI,MAAM,YAAYA,CAAa,GACnC,KAAA,cAAc,OAAOA,CAAa,GACvCA,EAAc,QAAQ,EAAI;AAI5B,UAAI,KAAK,cAAc;AACjB,aAAA,aAAa,QAAQ,KAAK;AAAA,UAC9B;AAAA,UACA,KAAK,aAAa,QAAQD,IAAQ;AAAA,QAAA;AAEnC,cAAM,CAACE,GAAIC,GAAIC,GAAIC,CAAE,IAAI,KAAK,aAAa,UACrCC,IAAU,KAAK,IAAI,KAAK,IAAI,OAAO,OAAO,KAAK,IAAI,OAAO,MAAM;AACnE,QAAAJ,EAAA,SAAS,IAAI,KAAK,IAAI,OAAO,QAAQ,GAAG,KAAK,IAAI,OAAO,SAAS,CAAC,GACrEC,EAAG,SAAS;AAAA,UACX,KAAK,IAAI,OAAO,QAAQ;AAAA,UACxB,KAAK,IAAI,OAAO,SAAS;AAAA,QAAA,GAEvBC,EAAA,SAAS,IAAI,KAAK,IAAI,OAAO,QAAQ,GAAG,KAAK,IAAI,OAAO,SAAS,CAAC,GAClEC,EAAA,SAAS,IAAI,KAAK,IAAI,OAAO,QAAQ,GAAG,KAAK,IAAI,OAAO,SAAS,CAAC,GACrEH,EAAG,QAAQI,IAAU,KAAK,KAAK,CAAC,GAChCJ,EAAG,SAASA,EAAG,OACfC,EAAG,QAAQG,IAAU,KACrBH,EAAG,SAASA,EAAG,OACfC,EAAG,QAAQE,IAAU,KACrBF,EAAG,SAASA,EAAG,OACfC,EAAG,QAAQC,IAAU,MACrBD,EAAG,SAASA,EAAG,OAEV,KAAA,aAAa,QAAQL,IAAQ,KAAK,WAEpCE,EAAA,YAAaF,IAAQ,MAAQ,KAAK,WAClCG,EAAA,YAAaH,IAAQ,MAAO,KAAK,WACjCI,EAAA,YAAaJ,IAAQ,MAAQ,KAAK,WAClCK,EAAA,YAAaL,IAAQ,MAAO,KAAK,WAEpCI,EAAG,IACF,KAAK,IAAI,OAAO,QAAQ,IACvB,KAAK,IAAI,OAAO,QAAQ,IACxB,KAAK,IAAK,KAAK,aAAa,OAAO,MAAQ,IAAI,GACjDA,EAAG,IACF,KAAK,IAAI,OAAO,SAAS,IACxB,KAAK,IAAI,OAAO,QAAQ,IACxB,KAAK,IAAK,KAAK,aAAa,OAAO,MAAQ,IAAI,GAEjDC,EAAG,IACF,KAAK,IAAI,OAAO,QAAQ,IACvB,KAAK,IAAI,OAAO,QAAQ,IAAK,MAC9B,KAAK,IAAI,KAAK,aAAa,OAAO,OAAQ,IAAI,GAC/CA,EAAG,IACF,KAAK,IAAI,OAAO,SAAS,IACxB,KAAK,IAAI,OAAO,QAAQ,IAAK,MAC9B,KAAK,IAAI,KAAK,aAAa,OAAO,OAAQ,IAAI,GAG9C,KAAK,aAAa,SAAS,KAC3B,KAAK,cAAc,SAAS,KAC5B,KAAK,cAEA,KAAA,IAAI,OAAO;MAElB;AAAA,IAAA;AAEqB,SAAA,SAAAhC,GAEhB,KAAA,MAAM,IAAIkC,GAAY;AAAA,MAC1B,MAAMlC;AAAA,MACN,UAAU,KAAK;AAAA,MACf,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IAAA,CACjB,GACD,KAAK,eAAe,GACf,KAAA,IAAI,OAAO,SAAS,IACzB,KAAK,IAAI,OAAO,IAAI,KAAK,MAAM,GAC1B,KAAA,IAAI,OAAO;EACjB;AAAA,EAEmB,SAASE,GAAeC,GAAsB;AAC1D,UAAA,SAASD,GAAOC,CAAM,GAC5B,KAAK,IAAI,UACT,KAAK,eAAe;AAAA,EACrB;AAAA,EAES,eAAeC,GAAe;AACtC,UAAM,eAAeA,CAAK,GAC1B,KAAK,eAAe;AAAA,EACrB;AAAA,EACQ,iBAAiB;;AAClB,UAAA+B,IAAY,KAAK,IAAI,KAAK,OAAO,OAAO,KAAK,OAAO,MAAM,GAC1DC,IAAY,KAAK,IAAI,KAAK,OAAO,OAAO,KAAK,OAAO,MAAM,GAC1DC,IAAK,IAAIC;AACZ,IAAAD,EAAA,SAAS,KAAK,EAAK;AAChB,UAAAE,IAAK,IAAID;AACZ,IAAAC,EAAA,WAAW,KAAK,EAAK;AAClB,UAAAC,IAAK,IAAIF;AACZ,IAAAE,EAAA,SAAS,KAAK,EAAI,IACrBC,IAAA,KAAK,IAAI,MAAM,YAAf,QAAAA,EAAwB,QAAQ,CAACC,MAAW;AAC3C,MAAAA,EAAO,QAAQ;AAAA,IAAA,IAEX,KAAA,IAAI,MAAM,UAAU,CAAA,GACpB,KAAA,IAAI,MAAM,QAAQ,KAAK,IAAIC,EAAW,GAAG,CAAC,CAAC,GAC3C,KAAA,IAAI,MAAM,QAAQ,KAAK,IAAIA,EAAW,IAAI,CAAC,CAAC,GAC5C,KAAA,IAAI,MAAM,QAAQ,KAAK,IAAIA,EAAW,IAAI,CAAC,CAAC,GAC5C,KAAA,IAAI,MAAM,QAAQ,KAAK,IAAIA,EAAW,IAAI,CAAC,CAAC,GAC5C,KAAA,IAAI,MAAM,QAAQ,KAAK,IAAIA,EAAW,IAAI,CAAC,CAAC,GAC7CR,IAAY,OAAU,KAAA,IAAI,MAAM,QAAQ,KAAK,IAAIQ,EAAW,KAAK,CAAC,CAAC,GACnER,IAAY,MAAM,KAChB,KAAA,IAAI,MAAM,QAAQ,KAAK,IAAIQ,EAAW,KAAK,CAAC,CAAC,GAEnD,KAAK,IAAI,MAAM,QAAQ,KAAKN,GAAIE,GAAIC,CAAE,GACjC,KAAA,IAAI,MAAM,QAAQ,KAAK,IAAIG,EAAW,GAAG,CAAC,CAAC,GAC5C,KAAK,OAAO,IAAI,OACd,KAAA,IAAI,MAAM,QAAQ;AAAA,MACtB,IAAIC,EAAiB;AAAA,QACpB,SAASR,IAAYD,KAAa;AAAA,QAClC,UAAU;AAAA,QACV,QAAQ,CAAC,MAAM,CAAC;AAAA,MAAA,CAChB;AAAA,IAAA,GAEG,KAAA,IAAI,MAAM,QAAQ;AAAA,MACtB,IAAIS,EAAiB;AAAA,QACpB,SAASR,IAAYD,KAAa;AAAA,QAClC,UAAU;AAAA,QACV,QAAQ,CAAC,MAAM,CAAC;AAAA,MAAA,CAChB;AAAA,IAAA,MAGG,KAAA,IAAI,MAAM,QAAQ;AAAA,MACtB,IAAIS,EAAiB;AAAA,QACpB,SAASR,IAAYD,KAAa;AAAA,QAClC,UAAU;AAAA,QACV,QAAQ,CAAC,MAAM,CAAC;AAAA,MAAA,CAChB;AAAA,IAAA,GAEG,KAAA,IAAI,MAAM,QAAQ;AAAA,MACtB,IAAIS,EAAiB;AAAA,QACpB,SAASR,IAAYD,KAAa;AAAA,QAClC,UAAU;AAAA,QACV,QAAQ,CAAC,MAAM,CAAC;AAAA,MAAA,CAChB;AAAA,IAAA;AAAA,EAGJ;AAAA,EAES,cAAcU,IAAS,IAAO;AACtC,SAAK,aAAaA,GACb,KAAA,IAAI,OAAO;EACjB;AAAA,EAES,OAAOC,GAAa;AACvB,SAAA,IAAI,OAAO,SAASA;AAAA,EAC1B;AAAA,EAES,QAAQ;AACX,SAAA,IAAI,OAAO,QAChB,KAAK,IAAI;EACV;AAAA,EAES,SAAS;AACZ,SAAA,IAAI,OAAO;EACjB;AAAA,EAES,iBAAiBC,GAAuB;AAAA,EAEjD;AAAA,EAES,YAAYC,GAA0B;AAAA,EAE/C;AAAA,EAEA,MAAe,SACdC,GACA5B,GACgB;;AAChB,QAAI,OAAO4B,KAAgB,YAAYA,EAAY,KAAA,EAAO,WAAW;AACpE;AACD,QAAIC,IAAkD,MAClDC,IAAmB,GACnBC,IAAsB;AAC1B,WAAO,GAACC,KAAAZ,IAAAW,KAAA,gBAAAA,EAAK,gBAAL,gBAAAX,EAAkB,aAAlB,QAAAY,EAA4B,UAASF,IAAmB;AAC3D,UAAA;AACC,QAAA,OAAOF,KAAgB,WACpBC,IAAA,MAAM/B,GAAoB8B,GAAa5B,CAAO,IAE9C6B,IAAA,MAAM5B,GAAwB2B,CAAW,GAE1CG,IAAAE,GAAQ,KAAKJ,GAAK;AAAA,UACvB,iBAAiB;AAAA,YAChB,UAAU;AAAA,UACX;AAAA,QAAA,CACA,GACK,MAAAE,EAAI,YAAY,SAAS,KAAK;AAAA,eAC5BG,GAAO;AACP,gBAAA;AAAA,UACP,4CAA4CJ,CAAgB;AAAA,UAC5DF;AAAA,UACAM;AAAA,QAAA,GAEKH,IAAA,MACND;AAAA,MACD;AAED,QAAI,CAACC;AAAK;AACJ,UAAAI,IAAY,IAAIhC,MAChBK,IAAK,IAAI4B,EAAOL,CAAG,GACnBtB,IAAK,IAAI2B,EAAOL,CAAG,GACnBrB,IAAK,IAAI0B,EAAOL,CAAG,GACnBpB,IAAK,IAAIyB,EAAOL,CAAG;AACtB,IAAAvB,EAAA,OAAO,IAAI,KAAK,GAAG,GACnBC,EAAA,OAAO,IAAI,KAAK,GAAG,GACnBC,EAAA,OAAO,IAAI,KAAK,GAAG,GACnBC,EAAA,OAAO,IAAI,KAAK,GAAG,GACtBH,EAAG,WAAW,KAAK,OAAO,IAAI,KAAK,KAAK,GACxCC,EAAG,WAAW,KAAK,OAAO,IAAI,KAAK,KAAK,GACxCC,EAAG,WAAW,KAAK,OAAO,IAAI,KAAK,KAAK,GACxCC,EAAG,WAAW,KAAK,OAAO,IAAI,KAAK,KAAK,GACxCwB,EAAU,SAAS3B,GAAIC,GAAIC,GAAIC,CAAE,GAC7B,KAAK,gBAAmB,KAAA,cAAc,IAAI,KAAK,YAAY,GAC/D,KAAK,eAAewB,GACf,KAAA,IAAI,MAAM,SAASA,CAAS,GACjC,KAAK,aAAa,QAAQ,GACrB,KAAA,IAAI,OAAO;EACjB;AAAA,EAES,UAAU;AAClB,UAAM,QAAQ,GACd,KAAK,IAAI,OAAO,OAAO,KAAK,MAAM,GAC7B,KAAA,IAAI,QAAQ,EAAI;AAAA,EACtB;AAAA,EAES,aAA0B;AAClC,WAAO,KAAK;AAAA,EACb;AACD;ACnQA,MAAeE,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GCAAC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GCAAC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GCAAC,KAAA;AAAA,olGCAAC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GCAAC,KAAA,stQCaTC,KAAoB,MAAM;AACzB,QAAAtD,IAAM,SAAS,cAAc,KAAK;AACxC,SAAAA,EAAI,MAAMqD,IACHrD;AACR;AAEA,SAASuD,GAAUC,GAAsBC,GAAgBC,GAAiB;AACzE,QAAMC,IAASH,EAAU,MACnBhE,IAAQgE,EAAU,OAClB/D,IAAS+D,EAAU;AAErB,MAAAI,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC;AACJ,QAAMC,IAAKjF,IAAQ,GACbkF,IAAKjF,IAAS,GACdkF,IAAQlB,IAAS,GACjBmB,IAAOnB,IAASkB,GAChBE,IAAQpB,IAAS,GACjBqB,IAAOrB,IAASoB,GAChBE,IAAO,KAAKH,IAAOE,IAEnBE,IAAc,CAAA,GACdC,IAAc,CAAA,GACdC,IAAc,CAAA,GACdC,IAAc,CAAA,GAEdC,IAAiB,CAAA,GACjBC,IAAiB,CAAA;AAEvB,SAAO3B,MAAY,KAAG;AAGrB,SAFAc,IAAKD,IAAK,GAELN,IAAI,GAAGA,IAAIxE,GAAQwE,KAAK;AAM5B,WALOL,IAAAD,EAAOa,CAAE,IAAIG,GACbd,IAAAF,EAAOa,IAAK,CAAC,IAAIG,GACjBb,IAAAH,EAAOa,IAAK,CAAC,IAAIG,GACjBZ,IAAAJ,EAAOa,IAAK,CAAC,IAAIG,GAEnBT,IAAI,GAAGA,KAAKT,GAAQS;AACxB,QAAAC,IAAIK,MAAON,IAAIO,IAAKA,IAAKP,MAAM,IAC/BN,KAAQD,EAAOQ,GAAG,GAClBN,KAAQF,EAAOQ,GAAG,GAClBL,KAAQH,EAAOQ,GAAG,GAClBJ,KAAQJ,EAAOQ,CAAC;AAGjB,WAAKH,IAAI,GAAGA,IAAIxE,GAAOwE;AACtB,QAAAgB,EAAET,CAAE,IAAIX,GACRqB,EAAEV,CAAE,IAAIV,GACRqB,EAAEX,CAAE,IAAIT,GACRqB,EAAEZ,CAAE,IAAIR,GAEJE,MAAM,MACTmB,EAAKpB,CAAC,IAAI,KAAK,IAAIA,IAAIW,GAAOF,CAAE,KAAK,GACrCY,EAAKrB,CAAC,IAAI,KAAK,IAAIA,IAAIP,GAAQ,CAAC,KAAK,IAGjCW,IAAAI,IAAKY,EAAKpB,CAAC,GACXK,IAAAG,IAAKa,EAAKrB,CAAC,GAEhBJ,KAAQD,EAAOS,GAAI,IAAIT,EAAOU,GAAI,GAClCR,KAAQF,EAAOS,GAAI,IAAIT,EAAOU,GAAI,GAClCP,KAAQH,EAAOS,GAAI,IAAIT,EAAOU,GAAI,GAClCN,KAAQJ,EAAOS,CAAE,IAAIT,EAAOU,CAAE,GAE9BE;AAED,MAAAC,KAAMhF,KAAS;AAAA,IAChB;AAEA,SAAKwE,IAAI,GAAGA,IAAIxE,GAAOwE,KAAK;AAO3B,WANKM,IAAAN,GACEJ,IAAAoB,EAAEV,CAAE,IAAIO,GACRhB,IAAAoB,EAAEX,CAAE,IAAIO,GACRf,IAAAoB,EAAEZ,CAAE,IAAIO,GACRd,IAAAoB,EAAEb,CAAE,IAAIO,GAEVX,IAAI,GAAGA,KAAKT,GAAQS;AAClB,QAAAI,KAAAJ,IAAIQ,IAAK,IAAIlF,GACnBoE,KAAQoB,EAAEV,CAAE,GACZT,KAAQoB,EAAEX,CAAE,GACZR,KAAQoB,EAAEZ,CAAE,GACZP,KAAQoB,EAAEb,CAAE;AAIb,WADAC,IAAKP,KAAK,GACLC,IAAI,GAAGA,IAAIxE,GAAQwE;AACvB,QAAAN,EAAOY,CAAE,IAAKX,IAAOmB,IAAO,MAAO,GACnCpB,EAAOY,IAAK,CAAC,IAAKV,IAAOkB,IAAO,MAAO,GACvCpB,EAAOY,IAAK,CAAC,IAAKT,IAAOiB,IAAO,MAAO,GACvCpB,EAAOY,IAAK,CAAC,IAAKR,IAAOgB,IAAO,MAAO,GAEnCf,MAAM,MACToB,EAAKnB,CAAC,IAAI,KAAK,IAAIA,IAAIY,GAAOH,CAAE,IAAIlF,GACpC6F,EAAKpB,CAAC,IAAI,KAAK,IAAIA,IAAIR,GAAQ,CAAC,IAAIjE,IAGhC4E,IAAAJ,IAAIoB,EAAKnB,CAAC,GACVI,IAAAL,IAAIqB,EAAKpB,CAAC,GAEfL,KAAQoB,EAAEZ,CAAE,IAAIY,EAAEX,CAAE,GACpBR,KAAQoB,EAAEb,CAAE,IAAIa,EAAEZ,CAAE,GACpBP,KAAQoB,EAAEd,CAAE,IAAIc,EAAEb,CAAE,GACpBN,KAAQoB,EAAEf,CAAE,IAAIe,EAAEd,CAAE,GAEpBE,KAAM/E,KAAS;AAAA,IAEjB;AAAA,EACD;AACD;AAEA,SAAS8F,GAAc9B,GAAsB+B,GAAoB;AAChE,QAAM5B,IAASH,EAAU;AAEzB,WAASU,IAAI,GAAGA,IAAIP,EAAO,QAAQO,KAAK,GAAG;AACpC,UAAAc,IAAIrB,EAAOO,CAAC,GACZe,IAAItB,EAAOO,IAAI,CAAC,GAChBgB,IAAIvB,EAAOO,IAAI,CAAC,GAChBiB,IAAIxB,EAAOO,IAAI,CAAC,GAChBsB,IAAOR,IAAI,MAAMC,IAAI,OAAOC,IAAI;AACtC,IAAAvB,EAAOO,CAAC,IAAIsB,KAAQ,IAAID,KAAcP,IAAIO,GAC1C5B,EAAOO,IAAI,CAAC,IAAIsB,KAAQ,IAAID,KAAcN,IAAIM,GAC9C5B,EAAOO,IAAI,CAAC,IAAIsB,KAAQ,IAAID,KAAcL,IAAIK,GACvC5B,EAAAO,IAAI,CAAC,IAAIiB;AAAA,EACjB;AACD;AAiBA,SAASM,GAAcjC,GAAsBkC,GAAkB;AAC9D,QAAM/B,IAASH,EAAU;AAEzB,WAASU,IAAI,GAAGA,IAAIP,EAAO,QAAQO,KAAK,GAAG;AACpC,UAAAc,IAAIrB,EAAOO,CAAC,GACZe,IAAItB,EAAOO,IAAI,CAAC,GAChBgB,IAAIvB,EAAOO,IAAI,CAAC,GAChBiB,IAAIxB,EAAOO,IAAI,CAAC;AACtB,IAAAP,EAAOO,CAAC,KAAKc,IAAI,OAAOU,IAAW,KACnC/B,EAAOO,IAAI,CAAC,KAAKe,IAAI,OAAOS,IAAW,KACvC/B,EAAOO,IAAI,CAAC,KAAKgB,IAAI,OAAOQ,IAAW,KAChC/B,EAAAO,IAAI,CAAC,IAAIiB;AAAA,EACjB;AACD;AAEA,MAAMQ,EAAgC;AAAA,EAMrC,YACCC,GACAC,GACAC,GACiBC,IAAQ,WACxB;AAVM,IAAAxG,EAAA;AACR,IAAAA,EAAA;AACQ,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AA0DA,IAAAA,EAAA,8CAAoC;AArD1B,SAAA,QAAAwG,GAEjB,KAAK,KAAKH,GACV,KAAK,eAAe,KAAK,aAAaA,EAAG,eAAeC,CAAkB,GAC1E,KAAK,iBAAiB,KAAK;AAAA,MAC1BD,EAAG;AAAA,MACHE;AAAA,IAAA,GAEI,KAAA,UAAU,KAAK;AAEpB,UAAME,IAAWJ,EAAG,kBAAkB,KAAK,SAAS,SAAS;AAC7D,QAAII,MAAa;AAChB,YAAM,IAAI;AAAA,QACT,iDAAiD,KAAK,KAAK;AAAA,MAAA;AAE7D,SAAK,WAAWA;AAAA,EACjB;AAAA,EACQ,aAAaC,GAAcC,GAAgB;AAClD,UAAMN,IAAK,KAAK,IACVO,IAASP,EAAG,aAAaK,CAAI;AACnC,QAAI,CAACE;AAAc,YAAA,IAAI,MAAM,yBAAyB;AAGtD,QAFGP,EAAA,aAAaO,GAAQD,CAAM,GAC9BN,EAAG,cAAcO,CAAM,GACnB,CAACP,EAAG,mBAAmBO,GAAQP,EAAG,cAAc;AACnD,YAAM,IAAI;AAAA,QACT,qCAAqCK,CAAI,KACxC,KAAK,KACN,MAAML,EAAG,iBAAiBO,CAAM,CAAC;AAAA,MAAA;AAG5B,WAAAA;AAAA,EACR;AAAA,EACQ,gBAAgB;AACvB,UAAMP,IAAK,KAAK,IACVQ,IAAUR,EAAG;AACnB,QAAI,CAACQ;AAAe,YAAA,IAAI,MAAM,0BAA0B;AAKxD,QAJGR,EAAA,aAAaQ,GAAS,KAAK,YAAY,GACvCR,EAAA,aAAaQ,GAAS,KAAK,cAAc,GAC5CR,EAAG,YAAYQ,CAAO,GACtBR,EAAG,gBAAgBQ,CAAO,GACtB,CAACR,EAAG,oBAAoBQ,GAASR,EAAG,WAAW,GAAG;AAC/C,YAAAS,IAAST,EAAG,kBAAkBQ,CAAO;AAC3C,YAAAR,EAAG,cAAcQ,CAAO,GAClB,IAAI,MAAM,2BAA2B,KAAK,KAAK,MAAMC,CAAM,EAAE;AAAA,IACpE;AACO,WAAAD;AAAA,EACR;AAAA,EACA,MAAM;AACL,UAAMR,IAAK,KAAK;AACb,IAAAA,EAAA,WAAW,KAAK,OAAO,GACvBA,EAAA,oBAAoB,KAAK,UAAU,GAAGA,EAAG,OAAO,IAAO,GAAG,CAAC,GAC3DA,EAAA,wBAAwB,KAAK,QAAQ;AAAA,EACzC;AAAA,EAEQ,oBAAoBU,GAAc;AACrC,IAAA,KAAK,iBAAiB,IAAIA,CAAI,MAC7B,KAAA,iBAAiB,IAAIA,CAAI,GACtB,QAAA;AAAA,MACP,+CAA+C,KAAK,KAAK,MAAMA,CAAI;AAAA,IAAA;AAAA,EAErE;AAAA,EACA,aAAaA,GAAcC,GAAe;AACzC,UAAMX,IAAK,KAAK,IACVY,IAAWZ,EAAG,mBAAmB,KAAK,SAASU,CAAI;AACzD,IAAKE,IACGZ,EAAA,UAAUY,GAAUD,CAAK,IADlB,KAAK,oBAAoBD,CAAI;AAAA,EAE7C;AAAA,EACA,aAAaA,GAAcG,GAAgBC,GAAgB;AAC1D,UAAMd,IAAK,KAAK,IACVY,IAAWZ,EAAG,mBAAmB,KAAK,SAASU,CAAI;AACzD,IAAKE,IACGZ,EAAA,UAAUY,GAAUC,GAAQC,CAAM,IAD3B,KAAK,oBAAoBJ,CAAI;AAAA,EAE7C;AAAA,EACA,aAAaA,GAAcC,GAAe;AACzC,UAAMX,IAAK,KAAK,IACVY,IAAWZ,EAAG,mBAAmB,KAAK,SAASU,CAAI;AACzD,IAAKE,IACGZ,EAAA,UAAUY,GAAUD,CAAK,IADlB,KAAK,oBAAoBD,CAAI;AAAA,EAE7C;AAAA,EACA,UAAU;AACT,UAAMV,IAAK,KAAK;AACb,IAAAA,EAAA,aAAa,KAAK,YAAY,GAC9BA,EAAA,aAAa,KAAK,cAAc,GAChCA,EAAA,cAAc,KAAK,OAAO;AAAA,EAC9B;AACD;AAEA,MAAMe,EAAkC;AAAA,EAOvC,YACSf,GACRpG,GACAC,GACC;AAVM,IAAAF,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAKC,SAAA,KAAAqG,GAIH,KAAA,QAAQ,CAACpG,GAAOC,CAAM;AACrB,UAAAmH,IAAKhB,EAAG;AACd,QAAI,CAACgB;AAAU,YAAA,IAAI,MAAM,0BAA0B;AAC7C,UAAAlE,IAAMkD,EAAG;AACf,QAAI,CAAClD;AAAW,YAAA,IAAI,MAAM,0BAA0B;AACpD,SAAK,KAAKkE,GACV,KAAK,MAAMlE,GACRkD,EAAA,gBAAgBA,EAAG,aAAagB,CAAE,GAClChB,EAAA,YAAYA,EAAG,YAAYlD,CAAG,GAC9BkD,EAAA;AAAA,MACFA,EAAG;AAAA,MACHA,EAAG;AAAA,MACHA,EAAG;AAAA,MACHlD;AAAA,MACA;AAAA,IAAA,GAEI,KAAA,OAAOlD,GAAOC,CAAM,GACzBmG,EAAG,cAAcA,EAAG,YAAYA,EAAG,oBAAoBA,EAAG,MAAM,GAChEA,EAAG,cAAcA,EAAG,YAAYA,EAAG,gBAAgBA,EAAG,eAAe,GACrEA,EAAG,cAAcA,EAAG,YAAYA,EAAG,gBAAgBA,EAAG,eAAe;AAAA,EACtE;AAAA,EA5BA,IAAI,OAAO;AACV,WAAO,KAAK;AAAA,EACb;AAAA,EA2BA,OAAOpG,GAAeC,GAAgB;AACrC,UAAMmG,IAAK,KAAK;AAChB,SAAK,KAAK,GACVA,EAAG,YAAYA,EAAG,YAAY,KAAK,GAAG,GAClCA,EAAG,aAAa,wBAAwB,IACxCA,EAAA;AAAA,MACFA,EAAG;AAAA,MACH;AAAA,MACAA,EAAG;AAAA,MACHpG;AAAA,MACAC;AAAA,MACA;AAAA,MACAmG,EAAG;AAAA,MACHA,EAAG;AAAA,MACH;AAAA,IAAA,IAGEA,EAAA;AAAA,MACFA,EAAG;AAAA,MACH;AAAA,MACAA,EAAG;AAAA,MACHpG;AAAA,MACAC;AAAA,MACA;AAAA,MACAmG,EAAG;AAAA,MACHA,EAAG;AAAA,MACH;AAAA,IAAA,GAGFA,EAAG,cAAcA,EAAG,YAAYA,EAAG,oBAAoBA,EAAG,MAAM,GAChEA,EAAG,cAAcA,EAAG,YAAYA,EAAG,oBAAoBA,EAAG,MAAM,GAChEA,EAAG,cAAcA,EAAG,YAAYA,EAAG,gBAAgBA,EAAG,eAAe,GACrEA,EAAG,cAAcA,EAAG,YAAYA,EAAG,gBAAgBA,EAAG,eAAe;AAAA,EACtE;AAAA,EACA,OAAO;AACN,UAAMA,IAAK,KAAK;AAChB,IAAAA,EAAG,gBAAgBA,EAAG,aAAa,KAAK,EAAE;AAAA,EAC3C;AAAA,EACA,OAAOiB,IAAkB,KAAK,GAAG,UAAU;AACrC,SAAA,GAAG,cAAcA,CAAO,GAC7B,KAAK,GAAG,YAAY,KAAK,GAAG,YAAY,KAAK,GAAG;AAAA,EACjD;AAAA,EACA,UAAgB;AACV,SAAA,GAAG,kBAAkB,KAAK,EAAE,GAC5B,KAAA,GAAG,cAAc,KAAK,GAAG;AAAA,EAC/B;AACD;AAEA,MAAMC,EAA+B;AAAA,EAOpC,YACClB,GACAK,GACAc,GACAC,GACC;AAXM,IAAAzH,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAOP,SAAK,KAAKqG,GACV,KAAK,OAAOK,GACZ,KAAK,OAAOc,GACZ,KAAK,QAAQC;AACP,UAAAC,IAASrB,EAAG;AAClB,QAAI,CAACqB;AAAc,YAAA,IAAI,MAAM,yBAAyB;AACtD,SAAK,SAASA,GACd,KAAK,SAASF,EAAK,YAChBnB,EAAA,WAAWK,GAAM,KAAK,MAAM,GAC5BL,EAAA,WAAWK,GAAMc,GAAMC,CAAK;AAAA,EAChC;AAAA,EACA,OAAO;AAEN,IADW,KAAK,GACb,WAAW,KAAK,MAAM,KAAK,MAAM;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU;AAEN,IADQ,KAAK,GACb,aAAa,KAAK,MAAM;AAAA,EAC5B;AACD;AAEA,MAAME,GAAmC;AAAA,EAIxC,YACStB,GACAuB,GACAC,GACAC,GACRC,GACC;AATM,IAAA/H,EAAA;AACR,IAAAA,EAAA,eAAQ;AAGC,SAAA,KAAAqG,GACA,KAAA,cAAAuB,GACA,KAAA,eAAAC,GACA,KAAA,cAAAC;AAGF,UAAAE,IAAe3B,EAAG;AACxB,QAAI,CAAC2B;AAAoB,YAAA,IAAI,MAAM,0BAA0B;AAC7D,SAAK,eAAeA,GACjB3B,EAAA,YAAYA,EAAG,YAAY2B,CAAY,GACvC3B,EAAA;AAAA,MACFA,EAAG;AAAA,MACH;AAAA,MACAA,EAAG;AAAA,MACHA,EAAG;AAAA,MACHA,EAAG;AAAA,MACH0B;AAAA,IAAA,GAED1B,EAAG,cAAcA,EAAG,YAAYA,EAAG,oBAAoBA,EAAG,MAAM,GAChEA,EAAG,cAAcA,EAAG,YAAYA,EAAG,oBAAoBA,EAAG,MAAM,GAChEA,EAAG,cAAcA,EAAG,YAAYA,EAAG,gBAAgBA,EAAG,eAAe,GACrEA,EAAG,cAAcA,EAAG,YAAYA,EAAG,gBAAgBA,EAAG,eAAe;AAAA,EACtE;AAAA,EAEA,KAAK4B,GAAiB;AACrB,UAAM5B,IAAK,KAAK;AAChB,SAAK,YAAY,OACdA,EAAA,cAAcA,EAAG,QAAQ,GAC5BA,EAAG,YAAYA,EAAG,YAAY,KAAK,YAAY,GAC1C,KAAA,YAAY,aAAa4B,GAAS,CAAC,GACxC5B,EAAG,WAAWA,EAAG,gBAAgB,GAAG,CAAC;AAAA,EACtC;AAAA,EAEA,UAAgB;AACV,SAAA,GAAG,cAAc,KAAK,YAAY;AAAA,EACxC;AACD;AAEA,MAAM6B,GAAmC;AAAA,EAIxC,YAAoB7B,GAA4B;AAHxC,IAAArG,EAAA;AACR,IAAAA,EAAA,eAAQ;AAEY,SAAA,KAAAqG;AACb,UAAAlD,IAAMkD,EAAG;AACf,QAAI,CAAClD;AAAW,YAAA,IAAI,MAAM,0BAA0B;AACpD,SAAK,MAAMA,GACMY,EAAA,SAAS,KAAK,MAAM;AACjC,MAAAsC,EAAA,YAAYA,EAAG,YAAYlD,CAAG,GAC9BkD,EAAA;AAAA,QACFA,EAAG;AAAA,QACH;AAAA,QACAA,EAAG;AAAA,QACHA,EAAG;AAAA,QACHA,EAAG;AAAA,QACHtC;AAAA,MAAA,GAEDsC,EAAG,cAAcA,EAAG,YAAYA,EAAG,oBAAoBA,EAAG,OAAO,GACjEA,EAAG,cAAcA,EAAG,YAAYA,EAAG,oBAAoBA,EAAG,OAAO,GACjEA,EAAG,cAAcA,EAAG,YAAYA,EAAG,gBAAgBA,EAAG,MAAM,GAC5DA,EAAG,cAAcA,EAAG,YAAYA,EAAG,gBAAgBA,EAAG,MAAM;AAAA,IAAA,CAC5D;AAAA,EACF;AAAA,EAEA,OAAOiB,IAAkB,KAAK,GAAG,UAAU;AACrC,SAAA,GAAG,cAAcA,CAAO,GAC7B,KAAK,GAAG,YAAY,KAAK,GAAG,YAAY,KAAK,GAAG;AAAA,EACjD;AAAA,EAEA,UAAgB;AACV,SAAA,GAAG,cAAc,KAAK,GAAG;AAAA,EAC/B;AACD;AAEO,MAAMa,IAAN,MAAMA,UAAsBrI,GAAa;AAAA,EA2F/C,YAAsBC,GAA2B;AAChD,UAAMA,CAAM;AA3FL,IAAAC,EAAA,kBAAW;AACX,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,gBAAS;AACT,IAAAA,EAAA,sBAAe;AACf,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,wBAAiB;AACjB,IAAAA,EAAA,gBAAS;AACT,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,YAA6B,KAAK;AAClC,IAAAA,EAAA,+BAAwB,IAAI,gBAAgB,KAAK,GAAG;AACpD,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,iBAA0B,CAAA;AAC1B,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,kBAAW;AACX,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,yBAA4B,CAAC,MAAM,CAAG;AAyBtC,IAAAA,EAAA,qBAAyB,IAAIoG;AAAA,MACpC,KAAK;AAAA,MACL3C;AAAA,MACAG;AAAA,MACA;AAAA,IAAA;AAEO,IAAA5D,EAAA,sBAA0B,IAAIoG;AAAA,MACrC,KAAK;AAAA,MACL3C;AAAA,MACAE;AAAA,MACA;AAAA,IAAA;AAEO,IAAA3D,EAAA,qBAAyB,IAAIoG;AAAA,MACpC,KAAK;AAAA,MACL3C;AAAA,MACAC;AAAA,MACA;AAAA,IAAA;AAEO,IAAA1D,EAAA,sBAA0B,IAAIoG;AAAA,MACrC,KAAK;AAAA,MACL3C;AAAA,MACAI;AAAA,MACA;AAAA,IAAA;AASO,IAAA7D,EAAA,sBAAe,IAAIuH;AAAA,MAC1B,KAAK;AAAA,MACL,KAAK,GAAG;AAAA,MACRY,EAAc;AAAA,MACd,KAAK,GAAG;AAAA,IAAA;AAGD,IAAAnI,EAAA,qBAAc,IAAIuH;AAAA,MACzB,KAAK;AAAA,MACL,KAAK,GAAG;AAAA,MACRY,EAAc;AAAA,MACd,KAAK,GAAG;AAAA,IAAA;AAGD,IAAAnI,EAAA,sBAAe,IAAIkI,GAAa,KAAK,EAAE;AAEvC,IAAAlI,EAAA;AACA,IAAAA,EAAA,4BAAoC,CAAA;AA0BpC,IAAAA,EAAA,sBAAe,CAAC,GAAG,CAAC;AACpB,IAAAA,EAAA,qBAAc,CAAC,GAAG,CAAC;AACnB,IAAAA,EAAA,oBAAa,CAAC,GAAG,CAAC;AAClB,IAAAA,EAAA,mBAAY,CAAC,GAAG,CAAC;AA3BH,SAAA,SAAAD;AAErB,UAAMsG,IAAK,KAAK;AACb,IAAAA,EAAA,OAAO,KAAK,GAAG,KAAK,GACvBA,EAAG,UAAU,KAAK,GAAG,WAAW,KAAK,GAAG,mBAAmB,GAC3D,KAAK,YAAY;AACX,UAAA+B,IAASrI,EAAO,yBAChBE,IACLmI,EAAO,QAAQ,OAAO,mBAAmB,KAAK,qBACzClI,IACLkI,EAAO,SAAS,OAAO,mBAAmB,KAAK;AAChD,SAAK,KAAK;AAAA,MACT,IAAIhB,EAAY,KAAK,IAAInH,GAAOC,CAAM;AAAA,MACtC,IAAIkH,EAAY,KAAK,IAAInH,GAAOC,CAAM;AAAA,IAAA;AAE5B,eAAAmH,KAAM,KAAK;AACrB,MAAAA,EAAG,KAAK,GACRhB,EAAG,UAAU,KAAK,GAAG,WAAW,KAAK,GAAG,mBAAmB;AAE5D,SAAK,qBAAqB,IAAI,MAAM,CAAC,EACnC,KAAK,CAAC,EACN,IAAI,MAAM,IAAIe,EAAY,KAAK,IAAInH,GAAOC,CAAM,CAAC,GAC9C,KAAA,SAASD,GAAOC,CAAM;AAAA,EAC5B;AAAA,EAjGQ,OAAOmI,GAAkB;AAEhC,QADA,KAAK,aAAa,GACd,KAAK;AAAQ;AAEX,UAAA3G,IAAQ2G,IAAW,KAAK,cACxBC,IAAaD,IAAW,KAAK;AAE/B,QADJ,KAAK,gBAAgBA,GACjB3G,IAAQ,MAAO,KAAK,QAAQ;AAC/B,WAAK,YAAY;AACjB;AAAA,IACD;AAEA,IAAI,KAAK,aAAe,KAAA,YAAY4G,IAAa,KAAK,YAAY,MAClE,KAAK,aAAaA,GAEZ,KAAK,SAAS,KAAK,UAAUA,CAAU,KAAK,KAAK,cACtD,KAAK,YAAY,GAGlB,KAAK,eAAeD,GAEf,KAAA;AAAA,EACN;AAAA,EAiFmB,SAASpI,GAAeC,GAAsB;AAEhE,SAAK,cAAc;AAAA,MAClB,KAAK,IAAI,GAAG,KAAK,MAAMD,CAAK,CAAC;AAAA,MAC7B,KAAK,IAAI,GAAG,KAAK,MAAMC,CAAM,CAAC;AAAA,IAAA,GAE3B,KAAK,cAAY,KAAK,YAAY;AAAA,EACvC;AAAA,EAEQ,cAAc;AACrB,QACC,KAAK,aAAa,CAAC,MAAM,KAAK,YAAY,CAAC,KAC3C,KAAK,aAAa,CAAC,MAAM,KAAK,YAAY,CAAC;AAE3C;AACD,SAAK,eAAe,CAAC,GAAG,KAAK,WAAW;AACxC,UAAM,CAACD,GAAOC,CAAM,IAAI,KAAK,aACvBqI,IAAY,KAAK;AAAA,MACtB,KAAK,IAAItI,IAAQ,KAAK,qBAAqBA,CAAK;AAAA,IAAA,GAE3CuI,IAAa,KAAK;AAAA,MACvB,KAAK,IAAItI,IAAS,KAAK,qBAAqBA,CAAM;AAAA,IAAA;AAE9C,SAAA,aAAa,CAACD,GAAOC,CAAM,GAChC,KAAK,OAAO,QAAQqI,GACpB,KAAK,OAAO,SAASC,GAChB,KAAA,YAAY,CAACD,GAAWC,CAAU,GACvC,KAAK,GAAG,SAAS,GAAG,GAAGD,GAAWC,CAAU;AACjC,eAAAnB,KAAM,KAAK;AAClB,MAAAA,EAAA,OAAOpH,GAAOC,CAAM;AAEb,eAAAmH,KAAM,KAAK;AAClB,MAAAA,EAAA,OAAOkB,GAAWC,CAAU;AAAA,EAEjC;AAAA,EAEQ,cAAc;AACrB,IAAK,KAAK,eACT,KAAK,aAAa,sBAAsB,CAACC,MAAM,KAAK,OAAOA,CAAC,CAAC;AAAA,EAC/D;AAAA,EAEQ,aAAa;AACpB,SAAK,GAAG,WAAW,KAAK,GAAG,gBAAgB,GAAG,CAAC;AAAA,EAChD;AAAA,EAEQ,yBAAyB;AAChC,SAAK,GAAG,gBAAgB,KAAK,GAAG,aAAa,IAAI;AAAA,EAClD;AAAA,EAEQ,SAASJ,GAAkB3G,GAAe;AACjD,SAAK,YAAY,GACjB,KAAK,iBACH,KAAK,gBAAgB,MAAM,KAAK,WAAW,IAAI,MAAM;AACvD,UAAM2E,IAAK,KAAK;AAChB,SAAK,aAAa,QAClB,KAAK,YAAY,QAEjB,KAAK,YAAY,OACjB,KAAK,aAAa,UACb,KAAA,YAAY,aAAa,YAAY,CAAC,GAC3C,KAAK,YAAY;AAAA,MAChB;AAAA,MACA,KAAK,WAAW,CAAC;AAAA,MACjB,KAAK,WAAW,CAAC;AAAA,IAAA,GAElB,KAAK,YAAY;AAAA,MAChB;AAAA,MACA,KAAK,WAAWgC,IAAW,MAAO;AAAA,IAAA,GAEnC,KAAK,YAAY,aAAa,qBAAqB,KAAK,aAAa,GACrE,KAAK,YAAY;AAAA,MAChB;AAAA,MACA,KAAK,WAAW,KAAK,iBAAiB;AAAA,IAAA,GAEvC,KAAK,YAAY;AAAA,MAChB;AAAA,MACA,KAAK,gBAAgB,CAAC;AAAA,MACtB,KAAK,gBAAgB,CAAC;AAAA,IAAA;AAEvB,UAAM,CAACK,GAAKC,CAAG,IAAI,KAAK;AACxB,IAAAA,EAAI,KAAK,GACTtC,EAAG,WAAW,GAAG,GAAG,GAAG,CAAC,GACrBA,EAAA,MAAM,KAAK,GAAG,gBAAgB;AAEtB,eAAAuC,KAAU,KAAK;AACzB,MAAAF,EAAI,KAAK,GACTrC,EAAG,WAAW,GAAG,GAAG,GAAG,CAAC,GACrBA,EAAA,MAAM,KAAK,GAAG,gBAAgB,GAEjC,KAAK,YAAY,OACjBuC,EAAO,KAAK,gBAAgB,GAE5BD,EAAI,KAAK,GAET,KAAK,aAAa,OAClBD,EAAI,OAAO,GACN,KAAA,aAAa,aAAa,OAAO,CAAC,GACvC,KAAK,aAAa,aAAa,QAAQE,EAAO,KAAK,GACnD,KAAK,aAAa,aAAa,SAAS,KAAK,mBAAmB,GAChE,KAAK,WAAW,GAEhBA,EAAO,QAAQ,KAAK,IAAI,GAAGA,EAAO,QAAQlH,IAAQ,GAAG;AAiBlD,QAbJ,KAAK,aAAa,OACb,KAAA,aAAa,aAAa,OAAO,CAAC,GAOvCgH,EAAI,KAAK,GACTC,EAAI,OAAO,GACX,KAAK,uBAAuB,GAC5B,KAAK,WAAW,GAEZ,KAAK,QAAQ,SAAS,KACJ,KAAK,QAAQ,KAAK,QAAQ,SAAS,CAAC,EACxC,SAAS;AACd,iBAAAE,KAAW,KAAK,QAAQ,OAAO,GAAG,KAAK,QAAQ,SAAS,CAAC;AACnE,QAAAA,EAAQ,QAAQ;AAIb,UAAAC,IACL,KAAK,QAAQ,WAAW,KAAK,KAAK,QAAQ,CAAC,EAAE,SAAS,GACjDC,IAAmB,KAAK,WAC3B,KAAK,gBAAgB,OACrB,KAAK,gBAAgB;AACxB,WAAOD,KAAmB,CAACC;AAAA,EAC5B;AAAA,EAEQ,gBAAgBC,GAAkBC,IAA0B,MAAM;AACzE,IAAID,MAAQC,MACRD,EAAA,OAAO,KAAK,GAAG,QAAQ,GAC3B,KAAK,YAAY,OACbC,IACHA,EAAI,KAAK,IAET,KAAK,uBAAuB,GAExB,KAAA,YAAY,aAAa,OAAO,CAAC,GAEtC,KAAK,WAAW;AAAA,EACjB;AAAA,EAEQ,UAAU;AACjB,UAAM5C,IAAK,KAAK,OAAO,WAAW,UAAU;AAAA,MAC3C,OAAO;AAAA,MACP,OAAO;AAAA,MACP,iBAAiB;AAAA,IAAA,CACjB;AACD,QAAI,CAACA;AAAU,YAAA,IAAI,MAAM,sBAAsB;AAC/C,gBAAK,KAAKA,GACPA,EAAA,OAAOA,EAAG,KAAK,GACfA,EAAA,QAAQA,EAAG,UAAU,GACxBA,EAAG,UAAUA,EAAG,WAAWA,EAAG,mBAAmB,GAC5CA,EAAG,aAAa,wBAAwB,KAC5C,QAAQ,KAAK,sCAAsC,GAC/CA,EAAG,aAAa,iBAAiB,KACrC,QAAQ,KAAK,+BAA+B,GACxCA,EAAG,aAAa,0BAA0B,KAC9C,QAAQ,KAAK,wCAAwC,GAE/CA;AAAA,EACR;AAAA,EAES,iBAAiB6C,GAAsB;AAC/C,SAAK,iBAAiBA;AAAA,EACvB;AAAA,EAES,cAActG,GAAuB;AAC7C,SAAK,aAAaA,GACb,KAAA,gBAAgB,YAAY,OACjC,KAAK,YAAY;AAAA,EAClB;AAAA,EACS,OAAOC,GAAmB;AAClC,SAAK,SAASA;AAAA,EACf;AAAA,EACS,QAAc;AACtB,IAAI,KAAK,eACR,qBAAqB,KAAK,UAAU,GACpC,KAAK,aAAa,IAEnB,KAAK,SAAS;AAAA,EACf;AAAA,EACS,SAAe;AACvB,SAAK,SAAS,IACd,KAAK,YAAY;AAAA,EAClB;AAAA,EACA,MAAe,SACdG,GACA5B,IAAU,IACM;AAChB,QAAI,OAAO4B,KAAgB,YAAYA,EAAY,KAAA,EAAO,WAAW;AAC9D,YAAA,IAAI,MAAM,iBAAiB;AAClC,QAAIC,IAAkD,MAClDC,IAAmB;AAEhB,SADC,QAAA,IAAI,YAAYF,CAAW,GAC5B,CAACC,KAAOC,IAAmB;AAC7B,UAAA;AACC,QAAA,OAAOF,KAAgB,WACpBC,IAAA,MAAM/B,GAAoB8B,GAAa5B,CAAO,IAE9C6B,IAAA,MAAM5B,GAAwB2B,CAAW;AAAA,eAExCM,GAAO;AACP,gBAAA;AAAA,UACP,+CAA+CJ,CAAgB;AAAA,UAC/D;AAAA,YACC,aAAAF;AAAA,YACA,OAAAM;AAAA,UACD;AAAA,QAAA,GAEDJ;AAAA,MACD;AAGD,QADQ,QAAA,IAAI,yBAAyBD,CAAG,GACpC,CAACA;AAAK;AAEV,UAAMkG,IAAI,KAAK,uBACTC,IAAMD,EAAE,WAAW,IAAI;AAC7B,QAAI,CAACC;AAAW,YAAA,IAAI,MAAM,iCAAiC;AAC3D,IAAAA,EAAI,UAAU,GAAG,GAAGD,EAAE,OAAOA,EAAE,MAAM;AAErC,UAAME,IAAa,IAGbC,IACLrG,aAAe,mBAAmBA,EAAI,aAAaA,EAAI,cAClDsG,IACLtG,aAAe,mBAAmBA,EAAI,cAAcA,EAAI;AACzD,QAAIqG,IAAOC,MAAS;AAAS,YAAA,IAAI,MAAM,oBAAoB;AACvD,IAAAH,EAAA,UAAUnG,GAAK,GAAG,GAAGqG,GAAMC,GAAM,GAAG,GAAGJ,EAAE,OAAOA,EAAE,MAAM;AAGtD,UAAAlF,IAAYmF,EAAI,aAAa,GAAG,GAAGD,EAAE,OAAOA,EAAE,MAAM;AAC1D,IAAAjD,GAAcjC,GAAW,GAAG,GAC5B8B,GAAc9B,GAAW,GAAG,GAGlBD,GAAAC,GAAWoF,GAAY,CAAC;AAClC,UAAMT,IAAS,IAAIjB;AAAA,MAClB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL1D;AAAA,IAAA;AAEI,SAAA,QAAQ,KAAK2E,CAAM,GACnB,KAAA,WAAW,KAAK,OAAA,IAAW,KAC3B,KAAA,gBAAgB,YAAY,OACjC,QAAQ,KAAK,KAAK,OAAO,IAAI,GAAK;AAC5B,UAAAnD,IAAI,OAAO,UAAU,KAAK,WAAW,KAAO,QAAQ,CAAC,CAAC,IAAI;AAChE,IAAIA,MAAM,IACJ,KAAA,kBAAkB,CAAC,MAAM,IAAI,IAExBA,MAAM,IAEX,KAAA,kBAAkB,CAAC,MAAM,IAAI,IAE7B,KAAA,kBAAkB,CAAC,MAAM,IAAI,GAEnC,KAAK,YAAY;AAAA,EAClB;AAAA,EAES,YAAY+D,GAAyB;AAC7C,SAAK,WAAWA,GAChB,KAAK,YAAY;AAAA,EAClB;AAAA,EAES,aAA0B;AAClC,WAAO,KAAK;AAAA,EACb;AAAA,EACS,UAAgB;AACxB,UAAM,QAAQ,GACd,KAAK,aAAa,WAClB,KAAK,YAAY,WACjB,KAAK,aAAa;AACP,eAAAC,KAAK,KAAK;AACpB,MAAAA,EAAE,QAAQ;AAEX,SAAK,YAAY,WACjB,KAAK,aAAa,WAClB,KAAK,YAAY;AACN,eAAApC,KAAM,KAAK;AACrB,MAAAA,EAAG,QAAQ;AAED,eAAAA,KAAM,KAAK;AACrB,MAAAA,EAAG,QAAQ;AAEZ,IAAI,KAAK,eACR,qBAAqB,KAAK,UAAU,GACpC,KAAK,aAAa;AAAA,EAEpB;AACD;AAhWCrH,EAlEYmI,GAkEY,mBAAkB,IAAI,aAAa;AAAA,EAC1D;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAG;AAAA,CACzB,IAEDnI,EAtEYmI,GAsEY,kBAAiB,IAAI,YAAY,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;AAtErE,IAAMuB,IAANvB;ACldA,MAAMwB,GAEb;AAAA,EAGC,YAAYC,GAAoB7J,GAA2B;AAFnD,IAAAC,EAAA;AACA,IAAAA,EAAA;AAEP,SAAK,WAAW4J,GAEhB,KAAK,UAAU7J,GACfA,EAAO,MAAM,gBAAgB,QAC7BA,EAAO,MAAM,SAAS,MACtBA,EAAO,MAAM,UAAU;AAAA,EACxB;AAAA,EAEA,OAAO,IAAmC2G,GAEX;AACxB,UAAA3G,IAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,IAAI4J,GAAiB,IAAIjD,EAAK3G,CAAM,GAAGA,CAAM;AAAA,EACrD;AAAA,EAEA,eAAeI,GAAqB;AAC9B,SAAA,SAAS,eAAeA,CAAK;AAAA,EACnC;AAAA,EAEA,aAAaC,GAAqB;AAC5B,SAAA,SAAS,aAAaA,CAAK;AAAA,EACjC;AAAA,EACA,cAAcwC,GAAuB;AAC/B,SAAA,SAAS,cAAcA,CAAM;AAAA,EACnC;AAAA,EACA,OAAOC,GAAmB;AACpB,SAAA,SAAS,OAAOA,CAAG;AAAA,EACzB;AAAA,EACA,QAAc;AACb,SAAK,SAAS;EACf;AAAA,EACA,SAAe;AACd,SAAK,SAAS;EACf;AAAA,EACA,iBAAiBqG,GAAsB;AACjC,SAAA,SAAS,iBAAiBA,CAAM;AAAA,EACtC;AAAA,EACA,YAAYM,GAAyB;AAC/B,SAAA,SAAS,YAAYA,CAAQ;AAAA,EACnC;AAAA,EACA,SACCxG,GACA5B,GACgB;AAChB,WAAO,KAAK,SAAS,SAAS4B,GAAa5B,CAAO;AAAA,EACnD;AAAA,EACA,aAAa;AACZ,WAAO,KAAK;AAAA,EACb;AAAA,EACA,UAAU;AACT,SAAK,SAAS,WACd,KAAK,QAAQ;EACd;AACD;ACtEO,MAAMyI,KAAgD,CAC5DC,GACAC,MACaD,EAAG,SAASC,EAAG,QAAQ,CAAC,GAAGD,CAAE,EAAE,MAAM,CAACrF,MAAMsF,EAAG,IAAItF,CAAC,CAAC;ACH5D,SAASuF,GAAWC,GAA0B;AAE7C,SAAA,CAACxF,OAAewF,EAAExF,IAAI,IAAC,IAAIwF,EAAExF,IAAI,IAAC,MAAM,IAAI;AACpD;AAEO,SAASyF,EAAYD,GAAiD;AAC5E,SAAOD,GAAWC,CAAC;AACpB;ACKO,MAAME,EAAO;AAAA,EAmBnB,YAAYC,IAAkB,GAAG;AAlBzB,IAAApK,EAAA,yBAAkB;AAClB,IAAAA,EAAA,wBAAiB;AACjB,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,gBAAgC,CAAA;AAChC,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAKA,IAAAA,EAAA;AAOP,SAAK,iBAAiBoK,GACtB,KAAK,kBAAkB,KAAK,gBACvB,KAAA,gBAAgB,MAAM,KAAK,gBAChC,KAAK,OAAO,MAAM,GAClB,KAAK,QAAQ,MAAM;AAAA,EACpB;AAAA,EACQ,cAAc;AACrB,UAAMC,IAAO,KAAK,KAAK,KAAK,WAAW;AACvC,SAAK,cAAc,GACnB,KAAK,gBAAgBC;AAAA,MACpB,KAAK;AAAA,MACLD;AAAA,MACA,KAAK;AAAA,MACL;AAAA,MACA,KAAK;AAAA,IAAA,GAED,KAAA,OAAOH,EAAY,KAAK,aAAa,GACrC,KAAA,QAAQA,EAAY,KAAK,IAAI;AAAA,EACnC;AAAA,EACA,UAAU;AAER,WAAA,KAAK,IAAI,KAAK,iBAAiB,KAAK,eAAe,IAAI,QACvD,KAAK,KAAK,KAAK,WAAW,IAAI,QAC9B,KAAK,MAAM,KAAK,WAAW,IAAI,QAC/B,KAAK,gBAAgB,UACrB,KAAK,kBAAkB;AAAA,EAEzB;AAAA,EACA,YAAYK,GAAwB;AACnC,SAAK,iBAAiBA,GACtB,KAAK,kBAAkBA,GAClB,KAAA,gBAAgB,MAAM,KAAK,gBAChC,KAAK,OAAO,MAAM,GAClB,KAAK,QAAQ,MAAM;AAAA,EACpB;AAAA,EACA,OAAO7I,IAAQ,GAAG;AACjB,SAAK,eAAeA,GACpB,KAAK,kBAAkB,KAAK,cAAc,KAAK,WAAW,GACtD,KAAK,gBACR,KAAK,YAAY,QAAQA,GACrB,KAAK,YAAY,QAAQ,KAC5B,KAAK,aAAa;AAAA,MACjB,GAAG,KAAK;AAAA,IAAA,CACR,IAGC,KAAK,kBACR,KAAK,cAAc,QAAQA,GACvB,KAAK,cAAc,QAAQ,KACzB,KAAA,kBAAkB,KAAK,cAAc,QAAQ,IAGhD,KAAK,aACH,KAAA,YAAY,KAAK,cAAc;AAAA,EAEtC;AAAA,EACA,aAAa8I,GAA+BC,IAAQ,GAAG;AACtD,IAAIA,IAAQ,IACX,KAAK,cAAc;AAAA,MAClB,GAAI,KAAK,iBAAiB,CAAC;AAAA,MAC3B,GAAGD;AAAA,MACH,MAAMC;AAAA,IAAA,KAGP,KAAK,gBAAgB,QACrB,KAAK,SAAS;AAAA,MACb,GAAG,KAAK;AAAA,MACR,GAAGD;AAAA,IAAA,GAEJ,KAAK,YAAY;AAAA,EAEnB;AAAA,EACA,kBAAkBD,GAAwBE,IAAQ,GAAG;AACpD,IAAIA,IAAQ,IACX,KAAK,gBAAgB;AAAA,MACpB,GAAI,KAAK,iBAAiB,CAAC;AAAA,MAC3B,UAAUF;AAAA,MACV,MAAME;AAAA,IAAA,KAGP,KAAK,gBAAgB,QACrB,KAAK,iBAAiBF,GACtB,KAAK,YAAY;AAAA,EAEnB;AAAA,EACA,qBAAqB;AACpB,WAAO,KAAK;AAAA,EACb;AACD;AAEA,SAASD,GACRI,GACAC,GACAC,GACAH,IAAiB,GACjBD,GACyB;AACnB,QAAAK,KAAOL,KAAA,gBAAAA,EAAQ,SAAQ,IACvBM,KAAYN,KAAA,gBAAAA,EAAQ,cAAa,KACjCO,KAAUP,KAAA,gBAAAA,EAAQ,YAAW,IAC7BQ,KAAOR,KAAA,gBAAAA,EAAQ,SAAQ,GACvB9I,IAAQkJ,IAAKF;AACf,MAAAG,KAAQ,KAAOE,KAAW,IAAM,KAAK,KAAKD,IAAYE,CAAI,IAAI;AACjE,UAAMC,IAAoB,CAAC,KAAK,KAAKH,IAAYE,CAAI,GAC/CE,IAAW,CAACD,IAAoBvJ,IAAQiJ;AAC9C,WAAO,CAAClC,OACFA,KAAAgC,GACDhC,IAAI,IAAUiC,IACXE,KAAMlJ,IAAQ+G,IAAIyC,KAAY,KAAK,MAAMzC,IAAIwC;AAAA,EAEtD;AACA,QAAME,IAAoB,KAAK,KAAK,IAAMH,IAAOF,IAAYC,KAAW,CAAG,GACrEG,KACJH,IAAUrJ,IAAQ,IAAMsJ,IAAOL,KAAYQ,GACvCC,IAAO,MAAMD,IAAqBH,GAClCK,IAAK,EAAE,MAAMN,KAAWC;AAC9B,SAAO,CAACvC,OACFA,KAAAgC,GACDhC,IAAI,IAAUiC,IAEjBE,KACC,KAAK,IAAInC,IAAI2C,CAAG,IAAI1J,IAAQ,KAAK,IAAI+G,IAAI2C,CAAG,IAAIF,KAChD,KAAK,MAAMzC,IAAI4C;AAGnB;ACzJO,MAAMC,GAA+C;AAAA,EAW3D,YAAoBC,GAA0B;AAVtC,IAAAvL,EAAA,iBAAuB,SAAS,cAAc,KAAK;AACnD,IAAAA,EAAA,cAAO;AACP,IAAAA,EAAA,aAAM;AACN,IAAAA,EAAA,eAAQ;AAEhB;AAAA,IAAAA,EAAA,kBAAqB,CAAC,GAAG,CAAC;AACjB,IAAAA,EAAA,wBAAiB;AAAA,MACzB,MAAM,IAAImK,EAAO,CAAC;AAAA,MAClB,MAAM,IAAIA,EAAO,CAAC;AAAA,IAAA;AAgBX,IAAAnK,EAAA,mBAAY;AAdA,SAAA,cAAAuL,GACnB,KAAK,QAAQ;AAAA,MACZ;AAAA,MACA,KAAK,YAAY,MAAM,QAAQ;AAAA,IAAA,GAEhC,KAAK,aAAa;AAAA,EACnB;AAAA,EACA,cAAgC;AAKxB,WAJwB;AAAA,MAC9B,KAAK,QAAQ;AAAA,MACb,KAAK,QAAQ;AAAA,IAAA;AAAA,EAGf;AAAA,EAEA,OAAO;AACN,SAAK,aAAa;AAAA,EACnB;AAAA,EACA,OAAO;AACN,SAAK,aAAa;AAAA,EACnB;AAAA,EACA,eAAe;AACd,QAAIC,IAAQ,uBAAuB,KAAK,eAAe,KACrD,qBACA,QAAQ,CAAC,CAAC,MAAM,KAAK,eAAe,KACpC,mBACA,EAAA,QAAQ,CAAC,CAAC;AACZ,IAAI,CAAC,KAAK,YAAY,gBAAgB,KAAK,KAAK,cACtCA,KAAA,oBAAoB,KAAK,KAAK,QAEpCA,MAAU,KAAK,cAClB,KAAK,YAAYA,GACZ,KAAA,QAAQ,aAAa,SAASA,CAAK;AAAA,EAE1C;AAAA,EACA,aAAa;AACZ,WAAO,KAAK;AAAA,EACb;AAAA,EACA,aACCC,IAAe,KAAK,MACpBC,IAAc,KAAK,KACnBC,IAAQ,IACRlB,IAAQ,GACP;AACD,SAAK,OAAOgB,GACZ,KAAK,MAAMC,GACN,KAAA,QAASjB,IAAQ,MAAQ,GAC1BkB,KAAS,CAAC,KAAK,YAAY,qBAC1BA,KACH,KAAK,QAAQ,UAAU;AAAA,MACtB,KAAK,YAAY,MAAM,QAAQ;AAAA,IAAA,GAE5B,KAAA,eAAe,KAAK,YAAYF,CAAI,GACpC,KAAA,eAAe,KAAK,YAAYC,CAAG,GACnC,KAAK,YAAY,gBAAgB,IACjC,KAAK,aAAa,IADkB,KAAK,KAAK,GAE/CC,KACH,sBAAsB,MAAM;AAC3B,WAAK,QAAQ,UAAU;AAAA,QACtB,KAAK,YAAY,MAAM,QAAQ;AAAA,MAAA;AAAA,IAChC,CACA,MAEF,KAAK,eAAe,KAAK,kBAAkBF,GAAMhB,CAAK,GACtD,KAAK,eAAe,KAAK,kBAAkBiB,GAAKjB,CAAK;AAAA,EAEvD;AAAA,EACA,OAAO/I,IAAQ,GAAG;AACb,IAAC,KAAK,YAAY,gBAAgB,MACjC,KAAA,eAAe,KAAK,OAAOA,CAAK,GAChC,KAAA,eAAe,KAAK,OAAOA,CAAK,GACjC,KAAK,YACR,KAAK,KAAK,IAEV,KAAK,KAAK;AAAA,EAEZ;AAAA,EACA,IAAI,YAAY;AACf,UAAMkK,IAAI,KAAK,eAAe,KAAK,mBAAmB,GAChDnD,IAAI,KAAK,eAAe,KAAK,mBAAmB,GAChDhD,IAAImG,IAAI,KAAK,SAAS,CAAC,GACvBjG,IAAI8C,IAAI,KAAK,SAAS,CAAC,GACvBoD,IAAK,KAAK,YAAY,KAAK,CAAC,GAC5BC,IAAK,KAAK,YAAY,KAAK,CAAC;AAClC,WAAO,EAAEF,IAAIC,KAAMpD,IAAIqD,KAAMrG,IAAI,KAAKE,IAAI;AAAA,EAC3C;AAAA,EACA,UAAgB;AACf,SAAK,QAAQ;EACd;AACD;ACrGA,SAASoG,GAActH,GAAmB;AAEzC,QAAMlC,IAAK;AAEJ,SAAAkC,IAAI,MACP,KAAK,IAAI,IAAIA,GAAG,CAAC,MAAMlC,IAAK,KAAK,IAAIkC,IAAIlC,KAAO,KAChD,KAAK,IAAI,IAAIkC,IAAI,GAAG,CAAC,MAAMlC,IAAK,MAAMkC,IAAI,IAAI,KAAKlC,KAAM,KAAK;AACnE;AAEA,MAAMyJ,IAAQ,CAACC,GAAaC,GAAaC,MACxC,KAAK,IAAIF,GAAK,KAAK,IAAIC,GAAKC,CAAG,CAAC;AAE1B,MAAMC,GAAgD;AAAA,EAc5D,YAA6Bb,GAA0B;AAb/C,IAAAvL,EAAA,iBAAuB,SAAS,cAAc,KAAK;AACnD,IAAAA,EAAA,cAAoB,SAAS,cAAc,MAAM;AACjD,IAAAA,EAAA,cAAoB,SAAS,cAAc,MAAM;AACjD,IAAAA,EAAA,cAAoB,SAAS,cAAc,MAAM;AACjD,IAAAA,EAAA,cAAO;AACP,IAAAA,EAAA,aAAM;AACN,IAAAA,EAAA,eAAQ;AACR,IAAAA,EAAA,iBAAU;AACV,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA;AACA,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,+BAAwB;AACH,SAAA,cAAAuL,GAC5B,KAAK,QAAQ,YAAY,KAAK,YAAY,MAAM,QAAQ,eACnD,KAAA,QAAQ,YAAY,KAAK,IAAI,GAC7B,KAAA,QAAQ,YAAY,KAAK,IAAI,GAC7B,KAAA,QAAQ,YAAY,KAAK,IAAI;AAAA,EACnC;AAAA,EACA,aAAa;AACZ,WAAO,KAAK;AAAA,EACb;AAAA,EACA,aAAaE,IAAe,KAAK,MAAMC,IAAc,KAAK,KAAK;AAC9D,SAAK,OAAOD,GACZ,KAAK,MAAMC,GACX,KAAK,OAAO;AAAA,EACb;AAAA,EACA,aAAaW,GAA8B;AAC1C,SAAK,mBAAmBA,GACnB,KAAA,eAAcA,KAAA,gBAAAA,EAAY,OAAM;AAAA,EACtC;AAAA,EACA,QAAQ;AACP,SAAK,UAAU;AAAA,EAChB;AAAA,EACA,SAAS;AACR,SAAK,UAAU;AAAA,EAChB;AAAA,EACA,OAAO3K,IAAQ,GAAG;AACjB,QAAI,CAAC,KAAK;AAAS;AACnB,SAAK,eAAeA;AACpB,QAAI4K,IAAW;AAQf,QANYA,KAAA,uBAAuB,KAAK,KAAK;AAAA,MAC5C;AAAA,IAAA,CACA,OAAO,KAAK,IAAI,QAAQ,CAAC,CAAC,OAIvB,KAAK,kBAAkB;AAC1B,YAAMC,IACL,KAAK,iBAAiB,CAAC,IAAI,KAAK,iBAAiB,CAAC,GAC7CC,IAAkB,KAAK,cAAc,KAAK,iBAAiB,CAAC;AAClE,UAAIA,KAAmBD,GAAmB;AACzC,cAAME,IACLF,IACA,KAAK,KAAKA,IAAoB,KAAK,qBAAqB;AACzD,YAAIpM,IAAQ,GACRuM,IAAgB;AAGnB,QAAAvM,KAAA,KAAK,IAAI,MAAM,KAAK,KAAMqM,IAAkBC,IAAmB,CAAC,IAC/D,KACD,GAEGD,IAAkB,QACZrM,KAAA,MAAM,MAAOqM,KAAmB,QAAS,IAG/CA,IAAkB,MACLE,IAAA,IACNF,IAAkB,QAC5BE,MAAkBF,IAAkB,OAAO,MAGxCD,IAAoBC,IAAkB,QACzCrM,KACC,IACA4L;AAAA,WACE,OAAOQ,IAAoBC,MAAoB,MAAM;AAAA,QAAA,IAGrDD,IAAoBC,IAAkB,QACxBE,KAAAV;AAAA,UAChB;AAAA,WACCO,IAAoBC,KAAmB;AAAA,UACxC;AAAA,QAAA;AAIF,cAAMG,IAAe,KAAK,IAAI,GAAGJ,IAAoB,GAAG;AAExD,QAAApM,IAAQ,KAAK,IAAI,GAAGA,CAAK,IAAI,KAE7BmM,KAAY,UAAUnM,CAAK;AAE3B,cAAMyM,IAAcZ;AAAA,UACnB;AAAA,UACEQ,IAAkB,IAAKG,IAAgB;AAAA,UACzC;AAAA,QAAA,GAEKE,IAAcb;AAAA,UACnB;AAAA,WACGQ,IAAkBG,IAAe,KAAK,IAAKA,IAAgB;AAAA,UAC9D;AAAA,QAAA,GAEKG,IAAcd;AAAA,UACnB;AAAA,WACGQ,IAAmBG,IAAe,IAAK,KAAK,IAAKA,IACnD;AAAA,UACD;AAAA,QAAA;AAGI,aAAA,KAAK,MAAM,UAAU,GAAGX;AAAA,UAC5B;AAAA,UACA,KAAK,IAAI,GAAGU,IAAgBE,CAAW;AAAA,UACvC;AAAA,QACA,CAAA,IACI,KAAA,KAAK,MAAM,UAAU,GAAGZ;AAAA,UAC5B;AAAA,UACA,KAAK,IAAI,GAAGU,IAAgBG,CAAW;AAAA,UACvC;AAAA,QACA,CAAA,IACI,KAAA,KAAK,MAAM,UAAU,GAAGb;AAAA,UAC5B;AAAA,UACA,KAAK,IAAI,GAAGU,IAAgBI,CAAW;AAAA,UACvC;AAAA,QACA,CAAA;AAAA,MAAA;AAEW,QAAAR,KAAA,aACP,KAAA,KAAK,MAAM,UAAU,KACrB,KAAA,KAAK,MAAM,UAAU,KACrB,KAAA,KAAK,MAAM,UAAU;AAAA,IAC3B;AAEY,MAAAA,KAAA,aACP,KAAA,KAAK,MAAM,UAAU,KACrB,KAAA,KAAK,MAAM,UAAU,KACrB,KAAA,KAAK,MAAM,UAAU;AAGf,IAAAA,KAAA,KAER,KAAK,cAAcA,MACjB,KAAA,QAAQ,aAAa,SAASA,CAAQ,GAC3C,KAAK,YAAYA;AAAA,EAEnB;AAAA,EACA,UAAU;AACT,SAAK,QAAQ;EACd;AACD;AC9JO,SAASS,KAAyB;AAEjC,SAAA;AAAA,IACA;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IACT;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IACT;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IACT;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,EAAA;AAEjB;AAEgB,SAAAC,GACfC,GACA9M,IAAQ,GACR+M,IAAS,EAAE,GAAG,GAAG,GAAG,KACV;AACJ,QAAA,CAACC,GAAIC,CAAE,IAAI,CAACF,EAAO,GAAGA,EAAO,CAAC;AAE7B,SAAA;AAAA,IACAD,EAAE,CAAC,IAAI9M;AAAA,IAAkB8M,EAAE,CAAC,IAAI9M;AAAA,IAAkB8M,EAAE,CAAC,IAAI9M;AAAA,IAAQ8M,EAAE,CAAC;AAAA,IACpEA,EAAE,CAAC,IAAI9M;AAAA,IAAkB8M,EAAE,CAAC,IAAI9M;AAAA,IAAkB8M,EAAE,CAAC,IAAI9M;AAAA,IAAQ8M,EAAE,CAAC;AAAA,IACpEA,EAAE,CAAC,IAAI9M;AAAA,IAAkB8M,EAAE,CAAC,IAAI9M;AAAA,IAAkB8M,EAAE,EAAE,IAAI9M;AAAA,IAAO8M,EAAE,EAAE;AAAA,IACrEA,EAAE,EAAE,IAAIE,IAAKhN,IAAQgN;AAAA,IAAIF,EAAE,EAAE,IAAIG,IAAKjN,IAAQiN;AAAA,IAAIH,EAAE,EAAE;AAAA,IAAWA,EAAE,EAAE;AAAA,EAAA;AAE7E;AAYgB,SAAAI,GAAaJ,GAAYK,IAAiB,GAAW;AACpE,QAAMC,IAAS,CAACC,GAAW7I,MAAc6I,EAAE,QAAQF,CAAc;AACjE,SAAO,YAAYL,EAAE,IAAIM,CAAM,EAAE,KAAK,IAAI,CAAC;AAC5C;;;;ACvCA,IAAIE,KAAoB,GACpBC,KAAmB,MACnBC,KAAwB,MACxBC,KAA6B,IAE7BC,IAAmB,IACnBC,IAAkB,KAAOD,IAAmB,IAE5CE,KAAwB,OAAO,gBAAiB;AAEpD,SAASC,GAAGC,GAAKC,GAAK;AAAE,SAAO,IAAM,IAAMA,IAAM,IAAMD;AAAM;AAC7D,SAASE,GAAGF,GAAKC,GAAK;AAAE,SAAO,IAAMA,IAAM,IAAMD;AAAM;AACvD,SAASG,GAAGH,GAAU;AAAE,SAAO,IAAMA;AAAM;AAG3C,SAASI,EAAYC,GAAIL,GAAKC,GAAK;AAAE,WAASF,GAAEC,GAAKC,CAAG,IAAII,IAAKH,GAAEF,GAAKC,CAAG,KAAKI,IAAKF,GAAEH,CAAG,KAAKK;AAAK;AAGpG,SAASC,GAAUD,GAAIL,GAAKC,GAAK;AAAE,SAAO,IAAMF,GAAEC,GAAKC,CAAG,IAAII,IAAKA,IAAK,IAAMH,GAAEF,GAAKC,CAAG,IAAII,IAAKF,GAAEH,CAAG;AAAI;AAE1G,SAASO,GAAiBC,GAAIC,GAAIC,GAAIC,GAAKC,GAAK;AAC9C,MAAIC,GAAUC,GAAUpK,IAAI;AAC5B;AACE,IAAAoK,IAAWL,KAAMC,IAAKD,KAAM,GAC5BI,IAAWT,EAAWU,GAAUH,GAAKC,CAAG,IAAIJ,GACxCK,IAAW,IACbH,IAAKI,IAELL,IAAKK;AAAA,SAEA,KAAK,IAAID,CAAQ,IAAInB,MAAyB,EAAEhJ,IAAIiJ;AAC7D,SAAOmB;AACT;AAEA,SAASC,GAAsBP,GAAIQ,GAASL,GAAKC,GAAK;AACrD,WAASlK,IAAI,GAAGA,IAAI8I,IAAmB,EAAE9I,GAAG;AAC1C,QAAIuK,IAAeX,GAASU,GAASL,GAAKC,CAAG;AAC7C,QAAIK,MAAiB;AACnB,aAAOD;AAET,QAAIH,IAAWT,EAAWY,GAASL,GAAKC,CAAG,IAAIJ;AAC/C,IAAAQ,KAAWH,IAAWI;AAAA,EACvB;AACD,SAAOD;AACR;AAEA,SAASE,GAAc1K,GAAG;AACxB,SAAOA;AACT;IAEAuE,KAAiB,SAAiB4F,GAAKQ,GAAKP,GAAKQ,GAAK;AACpD,MAAI,EAAE,KAAKT,KAAOA,KAAO,KAAK,KAAKC,KAAOA,KAAO;AAC/C,UAAM,IAAI,MAAM,yCAAyC;AAG3D,MAAID,MAAQQ,KAAOP,MAAQQ;AACzB,WAAOF;AAKT,WADIG,IAAevB,KAAwB,IAAI,aAAaF,CAAgB,IAAI,IAAI,MAAMA,CAAgB,GACjGlJ,IAAI,GAAGA,IAAIkJ,GAAkB,EAAElJ;AACtC,IAAA2K,EAAa3K,CAAC,IAAI0J,EAAW1J,IAAImJ,GAAiBc,GAAKC,CAAG;AAG5D,WAASU,EAAUd,GAAI;AAKrB,aAJIe,IAAgB,GAChBC,IAAgB,GAChBC,IAAa7B,IAAmB,GAE7B4B,MAAkBC,KAAcJ,EAAaG,CAAa,KAAKhB,GAAI,EAAEgB;AAC1E,MAAAD,KAAiB1B;AAEnB,MAAE2B;AAGF,QAAIE,KAAQlB,IAAKa,EAAaG,CAAa,MAAMH,EAAaG,IAAgB,CAAC,IAAIH,EAAaG,CAAa,IACzGG,IAAYJ,IAAgBG,IAAO7B,GAEnC+B,IAAetB,GAASqB,GAAWhB,GAAKC,CAAG;AAC/C,WAAIgB,KAAgBnC,KACXsB,GAAqBP,GAAImB,GAAWhB,GAAKC,CAAG,IAC1CgB,MAAiB,IACnBD,IAEApB,GAAgBC,GAAIe,GAAeA,IAAgB1B,GAAiBc,GAAKC,CAAG;AAAA,EAEtF;AAED,SAAO,SAAuBpK,GAAG;AAE/B,WAAIA,MAAM,IACD,IAELA,MAAM,IACD,IAEF4J,EAAWkB,EAAS9K,CAAC,GAAG2K,GAAKC,CAAG;AAAA,EAC3C;AACA;kCCnGMS,KAAS,4CAkBTC,IAA2B,IAE3BC,KAAS,CAAC/D,GAAaE,MAAgB,CAAC1H,MAC7C,KAAK,IAAI,GAAG,KAAK,IAAI,IAAIA,IAAIwH,MAAQE,IAAMF,EAAI,CAAC,GAC3CgE,IAAiB,KACjBC,KAAWF,GAAO,GAAGC,CAAc,GACnCE,KAASH,GAAOC,GAAgB,CAAC,GAEjCG,KAAgB,CAACC,MAAgB;AACtC,QAAMC,IAAQC,EAAO,KAAK,GAAG,MAAM,CAAC,GAC9BC,IAASD,EAAO,KAAK,GAAG,KAAK,CAAC;AACpC,SAAO,CAAC9L,MAAeA,IAAI4L,IAAMC,EAAMJ,GAASzL,CAAC,CAAC,IAAI,IAAI+L,EAAOL,GAAO1L,CAAC,CAAC;AAC3E,GACMgM,KAAmBL,GAAcH,CAAc;AAqBrD,SAASS,GACRzQ,GACA0Q,IAAU,GACVC,IAAS,oBACTC,IAAO,oBACY;AACb,QAAAC,IAAc,IAAI7Q,IAAQ0Q,GAC1BI,IAAe9Q,IAAQ6Q,GACvBE,KAAW,IAAID,KAAgB;AAC9B,SAAA;AAAA,IACN,4BAA4BH,CAAM,IAAII,IAAU,GAAG,KAAKH,CAAI,KAC1DG,IAAUD,KAAgB,GAC5B;AAAA,IACAD;AAAA,EAAA;AAEF;AAKA,SAASG,GACRC,GAC8B;AAC9B,QAAMC,IAA8B,CAAA;AAEpC,aAAWC,KAAKF,GAAO;AACtB,UAAMG,IAAaD,EAAE,KAAK,QAAQ,OAAO,EAAE,EAAE,QACvCE,IAAUF,EAAE,KAAK,MAAM,GAAG,EAAE,OAAO,CAACG,MAAMA,EAAE,KAAK,EAAE,SAAS,CAAC;AAC/D,QAAAD,EAAQ,SAAS,GAAG;AACvB,MAAIF,EAAE,KAAK,WAAW,GAAG,KACxBD,EAAe,KAAK;AAAA,QACnB,MAAM;AAAA,QACN,WAAW;AAAA,QACX,SAAS;AAAA,MAAA,CACT;AAEF,UAAIK,IAAU;AACd,iBAAW/H,KAAK6H,GAAS;AACxB,cAAMG,IAAkB;AAAA,UACvB,MAAMhI;AAAA,UACN,WACC2H,EAAE,YAAaI,IAAUH,KAAeD,EAAE,UAAUA,EAAE;AAAA,UACvD,SACCA,EAAE,aACAI,IAAU/H,EAAE,UAAU4H,KAAeD,EAAE,UAAUA,EAAE;AAAA,QAAA;AAEvD,QAAAD,EAAe,KAAKM,CAAI,GACxBN,EAAe,KAAK;AAAA,UACnB,MAAM;AAAA,UACN,WAAW;AAAA,UACX,SAAS;AAAA,QAAA,CACT,GACDK,KAAW/H,EAAE;AAAA,MACd;AACA,MAAK2H,EAAE,KAAK,SAAS,GAAG,KACvBD,EAAe,IAAI;AAAA,IACpB;AAEA,MAAAA,EAAe,KAAKC,CAAC;AAAA,EAEvB;AAEA,MAAIM,IAAsB,CAAA,GACtBC,IAAsB,CAAA;AAC1B,QAAMC,IAAsC,CAAA;AAE5C,aAAWR,KAAKD,GAAgB;AAC/B,UAAMM,IAAOL,EAAE;AACf,IAAAM,EAAU,KAAKD,CAAI,GACnBE,EAAO,KAAKP,CAAC,GACTK,EAAK,SAAS,KAAKA,EAAK,KAAK,EAAE,WAAW,KAC7CC,EAAU,IAAI,GACdC,EAAO,IAAI,GACPA,EAAO,WAAW,IACdC,EAAA,KAAKD,EAAO,CAAC,CAAC,IACXA,EAAO,SAAS,KAC1BC,EAAO,KAAKD,CAAM,GAEnBC,EAAO,KAAKR,CAAC,GACbM,IAAY,CAAA,GACZC,IAAS,CAAA,MAET,CAAC,iBAAiB,KAAKD,EAAU,KAAK,EAAE,CAAC,KACzC5B,GAAO,KAAK2B,CAAI,OAEhBC,EAAU,IAAI,GACdC,EAAO,IAAI,GACPA,EAAO,WAAW,IACdC,EAAA,KAAKD,EAAO,CAAC,CAAC,IACXA,EAAO,SAAS,KAC1BC,EAAO,KAAKD,CAAM,GAEnBD,IAAY,CAACD,CAAI,GACjBE,IAAS,CAACP,CAAC;AAAA,EAEb;AAEI,SAAAO,EAAO,WAAW,IACdC,EAAA,KAAKD,EAAO,CAAC,CAAC,IAErBC,EAAO,KAAKD,CAAM,GAGZC;AACR;AAIO,SAASC,EAAgBJ,GAA0B;AACzD,SACCA,EAAK,UAAUA,EAAK,aAAa,OACjCA,EAAK,KAAK,KAAK,EAAE,UAAU,KAC3BA,EAAK,KAAK,OAAO,UAAU;AAE7B;AAEO,MAAMK,WAA+B,WAAW;AAAA,EACtD,YACiBC,GAChBC,GACC;AACK,UAAAA,EAAM,MAAMA,CAAK,GAHP,KAAA,OAAAD;AAAA,EAIjB;AACD;AAaO,MAAME,WAAoB,YAA8C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqB9E,YACS1G,GACA2G,IAAuB;AAAA,IAC9B,OAAO,CAAC;AAAA,IACR,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,EAAA,GAER;AACK;AAhCC,IAAAlS,EAAA,iBAAuB,SAAS,cAAc,KAAK;AACnD,IAAAA,EAAA,cAAO;AACP,IAAAA,EAAA,aAAM;AACN,IAAAA,EAAA,eAAQ;AACR,IAAAA,EAAA,cAAO;AACP,IAAAA,EAAA,eAAQ;AACR,IAAAA,EAAA,uBAA4B,CAAA;AAEpC;AAAA,IAAAA,EAAA,kBAAqB,CAAC,GAAG,CAAC;AACjB,IAAAA,EAAA,wBAAiB;AAAA,MACzB,MAAM,IAAImK,EAAO,CAAC;AAAA,MAClB,MAAM,IAAIA,EAAO,CAAC;AAAA,MAClB,OAAO,IAAIA,EAAO,CAAC;AAAA,IAAA;AA4CZ,IAAAnK,EAAA,0CAAmB;AACV,IAAAA,EAAA,sBAAe,CAAC,MAAkB;AAClD,YAAMmS,IAAU,IAAIL,GAAuB,MAAM,CAAC;AACvC,iBAAAM,KAAY,KAAK,aAAa,IAAI,EAAE,IAAI,KAAK;AAC9C,QAAAA,EAAA,KAAK,MAAMD,CAAO;AAE5B,UAAI,CAAC,KAAK,cAAcA,CAAO,KAAKA,EAAQ;AAC3C,iBAAE,eAAe,GACjB,EAAE,gBAAgB,GAClB,EAAE,yBAAyB,GACpB;AAAA,IACR;AAgCO,IAAAnS,EAAA,mBAAY;AA+GZ,IAAAA,EAAA,eAAQ;AACR,IAAAA,EAAA,uBAAoC;AACpC,IAAAA,EAAA,mBAAY;AA/LX,SAAA,cAAAuL,GACA,KAAA,YAAA2G,GAWH,KAAA,gBAAgB3G,EAAY,cACjC,KAAK,QAAQ;AAAA,MACZ;AAAA,MACA,KAAK,YAAY,MAAM,QAAQ;AAAA,IAAA,GAE5B,KAAK,UAAU,QAClB,KAAK,QAAQ,UAAU,IAAI,KAAK,YAAY,MAAM,QAAQ,WAAW,GAElE,KAAK,UAAU,UAClB,KAAK,QAAQ,UAAU,IAAI,KAAK,YAAY,MAAM,QAAQ,aAAa,GAExE,KAAK,QAAQ,YAAY,SAAS,cAAc,KAAK,CAAC,GACtD,KAAK,QAAQ,YAAY,SAAS,cAAc,KAAK,CAAC,GACtD,KAAK,QAAQ,YAAY,SAAS,cAAc,KAAK,CAAC;AACtD,UAAM8G,IAAO,KAAK,QAAQ,SAAS,CAAC,GAC9BC,IAAQ,KAAK,QAAQ,SAAS,CAAC,GAC/BC,IAAQ,KAAK,QAAQ,SAAS,CAAC;AACrC,IAAAF,EAAK,aAAa,SAAS,KAAK,YAAY,MAAM,QAAQ,aAAa,GACvEC,EAAM,aAAa,SAAS,KAAK,YAAY,MAAM,QAAQ,YAAY,GACvEC,EAAM,aAAa,SAAS,KAAK,YAAY,MAAM,QAAQ,YAAY,GACvE,KAAK,eAAe,GACpB,KAAK,aAAa;AAAA,EACnB;AAAA,EAeA,sBACC7L,GACA8L,GACAC,GACO;AACP,QAAID,GAAU;AACb,YAAME,IAAY,KAAK,aAAa,IAAIhM,CAAI,yBAAS;AACrD,MAAIgM,EAAU,SAAS,KACtB,KAAK,QAAQ,iBAAiBhM,GAAM,KAAK,cAAc+L,CAAO,GAC/DC,EAAU,IAAIF,CAAQ,GACjB,KAAA,aAAa,IAAI9L,GAAMgM,CAAS;AAAA,IACtC;AAAA,EACD;AAAA,EAEA,yBACChM,GACA8L,GACAC,GACO;AACP,QAAID,GAAU;AACb,YAAME,IAAY,KAAK,aAAa,IAAIhM,CAAI;AAC5C,MAAIgM,MACHA,EAAU,OAAOF,CAAQ,GACrBE,EAAU,SAAS,KACtB,KAAK,QAAQ,oBAAoBhM,GAAM,KAAK,cAAc+L,CAAO;AAAA,IAEpE;AAAA,EACD;AAAA,EAGA,OAAOE,IAAoB,KAAK,UAAU,WAAW;AACpD,SAAK,YAAY,IACZ,KAAA,QAAQ,UAAU,IAAI,QAAQ;AACnC,UAAMN,IAAO,KAAK,QAAQ,SAAS,CAAC;AACzB,eAAAZ,KAAQ,KAAK,eAAe;AAC3B,iBAAA7L,KAAK6L,EAAK;AACpB,QAAA7L,EAAE,cAAc,GAChBA,EAAE,eAAe,GACjBA,EAAE,KAAK;AAEG,iBAAAA,KAAK6L,EAAK;AACpB,QAAA7L,EAAE,cAAc,KAAK;AAAA,UACpB,KAAK;AAAA,UACL,KAAK,IAAI,GAAG+M,IAAoB,KAAK,UAAU,SAAS;AAAA,QAAA,GAEzD/M,EAAE,eAAe,GACjBA,EAAE,KAAK;AAAA,IAET;AACK,IAAAyM,EAAA,UAAU,IAAI,QAAQ;AAAA,EAC5B;AAAA,EACA,QAAQM,IAAoB,GAAG;AAC9B,SAAK,YAAY,IACZ,KAAA,QAAQ,UAAU,OAAO,QAAQ;AACtC,UAAMN,IAAO,KAAK,QAAQ,SAAS,CAAC;AACzB,eAAAZ,KAAQ,KAAK,eAAe;AAC3B,iBAAA7L,KAAK6L,EAAK;AAChB,QAAA7L,EAAE,OAAO,iBACZA,EAAE,eAAe,IACjBA,EAAE,KAAK;AAGE,iBAAAA,KAAK6L,EAAK;AACpB,QAAA7L,EAAE,cAAc,KAAK;AAAA,UACpB,KAAK;AAAA,UACL,KAAK,IAAI,GAAG+M,IAAoB,KAAK,UAAU,SAAS;AAAA,QAAA,GAEzD/M,EAAE,MAAM;AAAA,IAEV;AACK,IAAAyM,EAAA,UAAU,OAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,SAAS;AACR,QAAK,KAAK;AACC,iBAAAZ,KAAQ,KAAK;AACZ,mBAAA7L,KAAK6L,EAAK;AACpB,UAAA7L,EAAE,KAAK;AAAA,EAGV;AAAA,EACA,QAAQ;AACP,QAAK,KAAK;AACC,iBAAA6L,KAAQ,KAAK;AACZ,mBAAA7L,KAAK6L,EAAK;AACpB,UAAA7L,EAAE,MAAM;AAAA,EAGX;AAAA,EACA,sBAAsB+M,IAAoB,GAAG;AACtC,UAAA,IAAIA,IAAoB,KAAK,UAAU;AAClC,eAAAlB,KAAQ,KAAK;AACZ,iBAAA7L,KAAK6L,EAAK;AAClB,QAAA7L,EAAA,cAAc,KAAK,IAAI,KAAK,eAAe,KAAK,IAAI,GAAG,CAAC,CAAC,GAC3DA,EAAE,eAAe,GACb,KAAK,KAAK,IAAI,KAAK,gBAAeA,EAAE,KAAK,IACxCA,EAAE,MAAM;AAAA,EAGhB;AAAA,EACA,cAAgC;AAC/B,IAAI,KAAK,UACJ,KAAK,iBACH,KAAA,cAAc,YAAY,KAAK,OAAO,GAEvC,KAAA,QAAQ,MAAM,UAAU,IACxB,KAAA,QAAQ,MAAM,aAAa;AAEjC,UAAMgN,IAAyB;AAAA,MAC9B,KAAK,QAAQ;AAAA,MACb,KAAK,QAAQ;AAAA,IAAA;AAEd,WAAI,KAAK,UACJ,KAAK,iBACR,KAAK,QAAQ,UAET,KAAA,QAAQ,MAAM,UAAU,QACxB,KAAA,QAAQ,MAAM,aAAa,KAE1BA;AAAA,EACR;AAAA,EACA,QAAQb,GAAiB;AACxB,SAAK,YAAYA,GACb,KAAK,UAAU,OAClB,KAAK,QAAQ,UAAU,IAAI,KAAK,YAAY,MAAM,QAAQ,WAAW,IAErE,KAAK,QAAQ,UAAU,OAAO,KAAK,YAAY,MAAM,QAAQ,WAAW,GAErE,KAAK,UAAU,SAClB,KAAK,QAAQ,UAAU,IAAI,KAAK,YAAY,MAAM,QAAQ,aAAa,IAEvE,KAAK,QAAQ,UAAU;AAAA,MACtB,KAAK,YAAY,MAAM,QAAQ;AAAA,IAAA,GAGjC,KAAK,eAAe,GACpB,KAAK,aAAa;AAAA,EACnB;AAAA,EACA,UAAU;AACT,WAAO,KAAK;AAAA,EACb;AAAA,EAIA,OAAO;AACN,SAAK,QAAQ,IACT,KAAK,kBACH,KAAA,cAAc,YAAY,KAAK,OAAO,GAC3C,KAAK,gBAAgB,OAEtB,KAAK,aAAa;AAAA,EACnB;AAAA,EACA,OAAO;AACN,SAAK,QAAQ,IACT,KAAK,QAAQ,kBACX,KAAA,gBAAgB,KAAK,QAAQ,eAClC,KAAK,QAAQ,WAEd,KAAK,aAAa;AAAA,EACnB;AAAA,EACA,eAAe;AACd,QAAI,KAAK,OAAO;AACX,MAAA,KAAK,cAAc,oDACtB,KAAK,YAAY,iDACjB,KAAK,QAAQ;AAAA,QACZ;AAAA,QACA;AAAA,MAAA;AAGF;AAAA,IACD;AACA,QAAIvG,IAAQ;AAEH,IAAAA,KAAA,uBAAuB,KAAK,eAAe,KAClD,qBACA,QAAQ,CAAC,CAAC,MAAM,KAAK,eAAe,KACpC,qBACA,QAAQ,CAAC,CAAC,aAAa,KAAK,eAAe,MAC3C,mBAAmB,EACnB,QAAQ,CAAC,CAAC,MACR,CAAC,KAAK,YAAY,gBAAgB,KAAK,KAAK,cACtCA,KAAA,oBAAoB,KAAK,KAAK,QAExCA,KAAS,eAAe,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,QAC3CA,MAAU,KAAK,cAClB,KAAK,YAAYA,GACZ,KAAA,QAAQ,aAAa,SAASA,CAAK;AAAA,EAE1C;AAAA,EACA,iBAAiB;AAChB,UAAM6G,IAAO,KAAK,QAAQ,SAAS,CAAC,GAC9BC,IAAQ,KAAK,QAAQ,SAAS,CAAC,GAC/BC,IAAQ,KAAK,QAAQ,SAAS,CAAC;AAEjC,QAAA,KAAK,YAAY,oBAAoB;AACnC,MAAAF,EAAA,YAAY,KAAK,UAAU,MAAM,IAAI,CAACjB,MAAMA,EAAE,IAAI,EAAE,KAAK,EAAE,GAC1DkB,EAAA,YAAY,KAAK,UAAU,iBAC3BC,EAAA,YAAY,KAAK,UAAU;AACjC;AAAA,IACD;AACA,UAAMM,IAAe5B,GAAwB,KAAK,UAAU,KAAK;AACjE,IAAAoB,EAAK,YAAY,IACjB,KAAK,gBAAgB;AACrB,eAAWS,KAASD;AACf,UAAA,MAAM,QAAQC,CAAK,GAAG;AAEzB,YAAIA,EAAM,WAAW;AAAG;AACxB,cAAMC,IAASD,EAAM;AAAA,UACpB,CAAClN,GAAGD,OACHC,EAAE,UAAU,KAAK,IAAIA,EAAE,SAASD,EAAE,OAAO,GACzCC,EAAE,YAAY,KAAK,IAAIA,EAAE,WAAWD,EAAE,SAAS,GAC/CC,EAAE,QAAQD,EAAE,MACLC;AAAA,UAER,EAAE,MAAM,IAAI,WAAW,OAAU,SAAS,OAAU;AAAA,QAAA,GAE/CoN,IAAMF,EACV,IAAI,CAACrB,MAASI,EAAgBJ,CAAI,CAAC,EACnC,OAAO,CAAC7L,GAAGD,MAAMC,KAAKD,GAAGkM,EAAgBkB,CAAM,CAAC,GAC5CE,IAAgB,SAAS,cAAc,MAAM;AACrC,QAAAA,EAAA,UAAU,IAAI,mBAAmB;AAC/C,cAAMC,IAAmC,CAAA;AACzC,mBAAWzB,KAAQqB,GAAO;AACnB,gBAAAK,IAAa,SAAS,cAAc,MAAM;AAKhD,cAAIH,GAAK;AACG,YAAAG,EAAA,UAAU,IAAI,WAAW;AACpC,kBAAMC,IAA6B,CAAA;AACnC,uBAAWC,KAAQ5B,EAAK,KAAK,OAAO,MAAM,EAAE,GAAG;AACxC,oBAAA6B,IAAS,SAAS,cAAc,MAAM;AAC5C,cAAAA,EAAO,YAAYD,GACnBD,EAAQ,KAAKE,CAAM,GACnBJ,EAAkB,KAAKI,CAAM,GAC7BH,EAAW,YAAYG,CAAM;AAAA,YAC9B;AACA,kBAAMC,IAAqB;AAAA,cAC1B,GAAG9B;AAAA,cACH,aAAa0B;AAAA,cACb,aAAaC;AAAA,cACb,mBAAmB,CAAC,KAAK,mBAAmBL,GAAQI,CAAU,CAAC;AAAA,cAC/D,gBAAgB,CAAC;AAAA,cACjB,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,iBAAiBH;AAAA,YAAA;AAEb,iBAAA,cAAc,KAAKO,CAAQ;AAAA,UAAA;AAEhC,YAAAJ,EAAW,YAAY1B,EAAK,MAC5B,KAAK,cAAc,KAAK;AAAA,cACvB,GAAGA;AAAA,cACH,aAAa0B;AAAA,cACb,aAAa,CAAC;AAAA,cACd,mBAAmB,CAAC,KAAK,mBAAmB1B,GAAM0B,CAAU,CAAC;AAAA,cAC7D,gBAAgB,CAAC;AAAA,cACjB,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,iBAAiBH;AAAA,YAAA,CACjB;AAEF,UAAAC,EAAc,YAAYE,CAAU;AAAA,QACrC;AACA,QAAIH,KACH,KAAK,cACJ,KAAK,cAAc,SAAS,CAC7B,EAAE,kBAAkB;AAAA,UACnB,GAAG,KAAK;AAAA,YACPE;AAAA,YACAH,EAAO,UAAUA,EAAO;AAAA,YACxBA,EAAO,YAAY,KAAK,UAAU;AAAA,UACnC;AAAA,QAAA,GAGEA,EAAO,KAAK,UAAU,MAAMA,EAAO,QACtCV,EAAK,YAAY,SAAS,eAAe,GAAG,CAAC,GAE9CA,EAAK,YAAYY,CAAa,GAC1BF,EAAO,KAAK,QAAQ,MAAMA,EAAO,QACpCV,EAAK,YAAY,SAAS,eAAe,GAAG,CAAC;AAAA,MAC9C,WACUS,EAAM,KAAK,KAAK,EAAE,WAAW;AAEvC,QAAAT,EAAK,YAAY,SAAS,eAAe,GAAG,CAAC;AAAA,WACvC;AAEA,cAAAW,IAAMnB,EAAgBiB,CAAK,GAC3BK,IAAa,SAAS,cAAc,MAAM,GAC1CI,IAAqB;AAAA,UAC1B,GAAGT;AAAA,UACH,aAAaK;AAAA,UACb,aAAa,CAAC;AAAA,UACd,mBAAmB,CAAC,KAAK,mBAAmBL,GAAOK,CAAU,CAAC;AAAA,UAC9D,gBAAgB,CAAC;AAAA,UACjB,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,iBAAiBH;AAAA,QAAA;AAElB,YAAIA,GAAK;AACG,UAAAG,EAAA,UAAU,IAAI,WAAW;AACpC,gBAAMC,IAA6B,CAAA;AACnC,qBAAWC,KAAQP,EAAM,KAAK,OAAO,MAAM,EAAE,GAAG;AACzC,kBAAAQ,IAAS,SAAS,cAAc,MAAM;AAC5C,YAAAA,EAAO,YAAYD,GACnBD,EAAQ,KAAKE,CAAM,GACnBH,EAAW,YAAYG,CAAM;AAAA,UAC9B;AACA,UAAAC,EAAS,cAAcH;AACvB,gBAAMI,IAAW,KAAK,IAAID,EAAS,UAAUA,EAAS,SAAS;AAC/D,UAAAA,EAAS,kBAAkB;AAAA,YAC1B,GAAG,KAAK;AAAA,cACPH;AAAA,cACAI;AAAA,cACAD,EAAS,YAAY,KAAK,UAAU;AAAA,YACrC;AAAA,UAAA;AAAA,QACD;AAGW,UAAAJ,EAAA,YAAYL,EAAM,KAAK,KAAK;AAExC,QAAIA,EAAM,KAAK,UAAU,MAAMA,EAAM,QACpCT,EAAK,YAAY,SAAS,eAAe,GAAG,CAAC,GAE9CA,EAAK,YAAYc,CAAU,GACvBL,EAAM,KAAK,QAAQ,MAAMA,EAAM,QAClCT,EAAK,YAAY,SAAS,eAAe,GAAG,CAAC,GAEzC,KAAA,cAAc,KAAKkB,CAAQ;AAAA,MACjC;AAEK,IAAAjB,EAAA,YAAY,KAAK,UAAU,iBAC3BC,EAAA,YAAY,KAAK,UAAU;AAAA,EAClC;AAAA,EACQ,mBAAmBd,GAAiBgC,GAAyB;AACpE,UAAMhJ,IAAQgH,EAAK,YAAY,KAAK,UAAU,WACxC+B,IAAW,KAAK,IAAI,KAAM/B,EAAK,UAAUA,EAAK,SAAS;AAC7D,QAAIiC,IAAK;AACL,IAAA,KAAK,UAAU,SACZA,KAAA,IAEH7B,EAAgBJ,CAAI,KAAK+B,IAAW,SAClCE,IAAA;AAEN,UAAM9N,IAAI6N,EAAO;AAAA,MAChB;AAAA,QACC;AAAA,UACC,WAAW;AAAA,QACZ;AAAA,QACA;AAAA,UACC,WAAW,cAAc,CAACC,CAAE;AAAA,QAC7B;AAAA,MACD;AAAA,MACA;AAAA,QACC,UAAU,SAASF,CAAQ,IAAIA,IAAW;AAAA,QAC1C,OAAO,SAAS/I,CAAK,IAAIA,IAAQ;AAAA,QACjC,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,MAAM;AAAA,QACN,QAAQ;AAAA,MACT;AAAA,IAAA;AAED,WAAA7E,EAAE,MAAM,GACDA;AAAA,EACR;AAAA;AAAA;AAAA,EAGQ,uBACPsN,GACAM,GACA/I,GACc;AACd,UAAMkJ,IAAK,KAAK,IAAI,GAAGlJ,CAAK,GACtBmJ,IAAK,KAAK,IAAI,KAAMJ,CAAQ;AAElC,QAAIK,IAAS;AAEb,IAAID,IAAK,SACCC,IAAA;AAGV,QAAIjC,IAAsB,CAAA;AAE1B,YAAQiC,GAAQ;AAAA,MACf,KAAK,kBAAuC;AAC3C,YAAIC,IAAS,GACTC,IAAO;AACP,QAAAH,KAAM,QAAQA,IAAK,OACbE,IAAA,KACFC,IAAA,OACGH,KAAM,OAAQA,IAAK,OACpBE,IAAA,KACFC,IAAA,QACGH,KAAM,OAAQA,IAAK,OAGnBA,KAAM,SACPE,IAAA,GACFC,IAAA;AAEF,cAAAC,IAAY,OAAO,SAASJ,CAAE,IAAI,KAAK,IAAIA,IAAK,KAAK,GAAI,IAAI,GAC7DK,IAAY7D,GAAcH,CAAc;AAC9C,QAAA2B,IAASsB,EAAkB,QAAQ,CAACgB,GAAIvP,GAAGwP,MAAQ;AAClD,gBAAMC,IAAST,IAAMC,IAAK,IAAIO,EAAI,SAAUxP,GACtCiN,IAAsB,CAAA,GAEtByC,IAAqB,IAAI,MAAMtE,CAAwB,EAC3D,KAAK,CAAC,EACN,IAAI,CAACuE,GAAG3P,MAAM;AACR,kBAAAF,KAAKE,IAAI,KAAKoL,GACdrL,IAAIuP,EAAUxP,CAAC,GACf8P,IAAS,KAAK,IAAI9P,IAAI,KAAK,KAAK,CAAC,GACjC+P,IACL,KAAK,IAAI,GAAG/P,IAAIwL,IAAiBvL,IAAI,IAAIA,IAAI,GAAG,IAAIqP,GAI/CU,IAAMzH,GAAaD,MAAiB,IAAIrI,IAAI,MAAMoP,CAAM;AAEvD,mBAAA;AAAA,cACN,QAAQrP;AAAA,cACR,WAAW,GAAG4I,GAAaoH,GAAK,CAAC,CAAC,cACjCF,IAAS,OAAQT,CAClB,MAAM,CAACpP,IAAI,IAAI;AAAA,cACf,YAAY,uBAAuB8P,CAAS;AAAA,YAAA;AAAA,UAC7C,CACA,GACIE,IAAMR,EAAG,QAAQG,GAAQ;AAAA,YAC9B,UAAUL;AAAA,YACV,OAAO,OAAO,SAASI,CAAM,IAAIA,IAAS;AAAA,YAC1C,IAAI,iCAAiCF,EAAG,SAAS,IAAIvP,CAAC;AAAA,YACtD,YAAY;AAAA,YACZ,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,MAAM;AAAA,UAAA,CACN;AACD,iBAAA+P,EAAI,WAAW,MAAM;AACpB,YAAAA,EAAI,MAAM;AAAA,UAAA,GAEXA,EAAI,MAAM,GACV9C,EAAO,KAAK8C,CAAG,GAER9C;AAAAA,QAAA,CACP;AACD;AAAA,MACD;AAAA,MACA,KAAK,cAAoC;AACxC,QAAAA,IAASsB,EAAkB,QAAQ,CAACgB,GAAIvP,GAAGwP,MAAQ;AAClD,gBAAMC,IAAST,IAAMC,IAAK,MAAMO,EAAI,SAAUxP,GACxCiN,IAAsB,CAAA,GAEtByC,IAAqB,IAAI,MAAMtE,CAAwB,EAC3D,KAAK,CAAC,EACN,IAAI,CAACuE,GAAG3P,MAAM;AACR,kBAAAF,KAAKE,IAAI,KAAKoL,GACdrL,IAAID,IAAIwL,IAAiBQ,GAAiBhM,CAAC,IAAI;AAE9C,mBAAA;AAAA,cACN,QAAQA;AAAA,cACR,WAAW,cAAc,CAACC,IAAI,IAAI;AAAA,YAAA;AAAA,UACnC,CACA,GACIgQ,IAAMR,EAAG,QAAQG,GAAQ;AAAA,YAC9B,UAAU,OAAO,SAAST,CAAE,IAAIA,IAAK,IAAI;AAAA,YACzC,OAAO,OAAO,SAASQ,CAAM,IAAIA,IAAS;AAAA,YAC1C,IAAI,6BAA6BF,EAAG,SAAS,IAAIvP,CAAC;AAAA,YAClD,YAAY;AAAA,YACZ,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,MAAM;AAAA,UAAA,CACN;AACD,iBAAA+P,EAAI,WAAW,MAAM;AACpB,YAAAA,EAAI,MAAM;AAAA,UAAA,GAEXA,EAAI,MAAM,GACV9C,EAAO,KAAK8C,CAAG,GAER9C;AAAAA,QAAA,CACP;AACD;AAAA,MACD;AAAA,IACD;AAEO,WAAAA;AAAA,EACR;AAAA,EACA,IAAY,gBAAgB;AAC3B,WAAO,KAAK,UAAU,UAAU,KAAK,UAAU;AAAA,EAChD;AAAA,EACA,kBAAkB;AACjB,IAAI,KAAK,UACJ,KAAK,iBACH,KAAA,cAAc,YAAY,KAAK,OAAO,GAEvC,KAAA,QAAQ,MAAM,UAAU,IACxB,KAAA,QAAQ,MAAM,aAAa;AAEtB,eAAAH,KAAQ,KAAK,eAAe;AACtC,YAAMyC,IAAKzC,EAAK;AAChB,MAAIyC,KACHzC,EAAK,UAAU,WAAW,iBAAiByC,CAAE,EAAE,WAAW,GAC1DzC,EAAK,QAAQyC,EAAG,cAAczC,EAAK,UAAU,GAC7CA,EAAK,SAASyC,EAAG,eAAezC,EAAK,UAAU,MAE/CA,EAAK,QAAQ,GACbA,EAAK,SAAS,GACdA,EAAK,UAAU;AAAA,IAEjB;AACI,IAAA,KAAK,YAAY,mBACpB,KAAK,mCAAmC,IAExC,KAAK,2BAA2B,GAE7B,KAAK,UACJ,KAAK,iBACR,KAAK,QAAQ,UAET,KAAA,QAAQ,MAAM,UAAU,QACxB,KAAA,QAAQ,MAAM,aAAa;AAAA,EAElC;AAAA,EACQ,6BAA6B;AACzB,eAAAA,KAAQ,KAAK,eAAe;AACtC,YAAMgC,IAAShC,EAAK;AACpB,UAAIgC,GAAQ;AACX,QAAAhC,EAAK,QAAQgC,EAAO,aACpBhC,EAAK,SAASgC,EAAO;AACf,cAAAkB,IAAYlD,EAAK,SAAS,GAC1B,CAACmD,GAAW9D,CAAW,IAAIJ;AAAA,UAChCiE,IAAYlD,EAAK;AAAA,QAAA,GAEZoD,IAAiB,GAAG/D,IAAc,GAAG;AACvC,QAAA,KAAK,YAAY,oBACpB2C,EAAO,MAAM,YAAYmB,GACzBnB,EAAO,MAAM,aAAa,aAC1BA,EAAO,MAAM,aAAa,QAC1BA,EAAO,MAAM,WAAWoB,MAExBpB,EAAO,MAAM,kBAAkBmB,GAC/BnB,EAAO,MAAM,mBAAmB,aAChCA,EAAO,MAAM,mBAAmB,QAChCA,EAAO,MAAM,iBAAiBoB;AAEzB,cAAAzD,IAAIK,EAAK,QAAQkD,GACjBG,IAAU,SAAS,CAAC1D,CAAC,WAAW,CAACA,CAAC,mCACvCK,EAAK,SACN,KACCL,IAAI,KAAK,IAAIK,EAAK,UAAUA,EAAK,SAAS,CAC3C;AAEA,QAAAgC,EAAO,MAAM,eAAeqB,GAC5BrB,EAAO,MAAM,qBAAqBqB;AAAA,MACnC;AAAA,IACD;AAAA,EACD;AAAA,EACQ,qCAAqC;AAC5C,UAAMC,IAAgB,KAAK;AAC3B,SAAK,cAAc,QAAQ,CAACtD,GAAM9M,MAAM;AACvC,YAAM8O,IAAShC,EAAK;AACpB,UAAIgC,GAAQ;AAIL,cAAAkB,IAAYlD,EAAK,SAAS,GAC1B,CAACmD,GAAW9D,CAAW,IAAIJ;AAAA,UAChCiE,KAAalD,EAAK,QAAQA,EAAK,UAAU;AAAA,QAAA,GAEpCoD,IAAiB,GAAG/D,IAAc,GAAG;AACvC,QAAA,KAAK,YAAY,oBACpB2C,EAAO,MAAM,YAAYmB,GACzBnB,EAAO,MAAM,aAAa,aAC1BA,EAAO,MAAM,aAAa,QAC1BA,EAAO,MAAM,WAAWoB,MAExBpB,EAAO,MAAM,kBAAkBmB,GAC/BnB,EAAO,MAAM,mBAAmB,aAChCA,EAAO,MAAM,mBAAmB,QAChCA,EAAO,MAAM,iBAAiBoB;AAIzB,cAAAG,IACL,KAAK,cAAc,MAAM,GAAGrQ,CAAC,EAAE,OAAO,CAACiB,GAAGD,MAAMC,IAAID,EAAE,OAAO,CAAC,KAC7D,KAAK,cAAc,CAAC,IAAIgP,IAAY,IAChCM,IAAY,EAAExD,EAAK,QAAQA,EAAK,UAAU,IAAIkD,IAC9CO,IAAc,CAACzQ,MAAc,KAAK,IAAIwQ,GAAW,KAAK,IAAI,GAAGxQ,CAAC,CAAC;AACrE,YAAI0Q,IAAS,CAACH,IAAkBvD,EAAK,QAAQA,EAAK,UAAUkD,GACxDS,IAAa;AACjB,cAAMf,IAAqB,CAAA;AAC3B,YAAIgB,IAAUF,GACVG,IAAW;AACf,cAAMC,IAAY,MAAM;AACvB,gBAAMC,IAAaL,IAASE,GACtBI,IAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGL,CAAU,CAAC,GAC1C5B,IAAWiC,IAAOH,GAClBI,IAAI,KAAK,IAAIlC,IAAWgC,CAAU;AAEpC,cAAAL,IAASF,KAAaI,IAAUJ,GAAW;AAC9C,kBAAMU,IAAa,KAAK,IAAIN,IAAUJ,CAAS,IAAIS,GAC7C1O,IAAQ,GAAGkO,EAAYG,CAAO,CAAC,QAC/BO,IAAkB;AAAA,cACvB,QAAQN,IAAWK;AAAA,cACnB,cAAc3O;AAAAA,YAAA;AAEf,YAAAqN,EAAO,KAAKuB,CAAK;AAAA,UAClB;AACI,cAAAT,IAAS,KAAKE,IAAU,GAAG;AAC9B,kBAAMM,IAAa,KAAK,IAAIN,CAAO,IAAIK,GACjC1O,IAAQ,GAAGkO,EAAYC,CAAM,CAAC,QAC9BS,IAAkB;AAAA,cACvB,QAAQN,IAAWK;AAAA,cACnB,cAAc3O;AAAAA,YAAA;AAEf,YAAAqN,EAAO,KAAKuB,CAAK;AAAA,UAClB;AACA,gBAAM5O,IAAQ,GAAGkO,EAAYC,CAAM,CAAC,QAC9BS,IAAkB;AAAA,YACvB,QAAQH;AAAA,YACR,cAAczO;AAAA,UAAA;AAEf,UAAAqN,EAAO,KAAKuB,CAAK,GACPP,IAAAF,GACCG,IAAAG;AAAA,QAAA;AAEF,QAAAF;AACV,YAAIM,IAAgB;AACpB,aAAK,cAAc,QAAQ,CAACC,GAAWC,MAAM;AAE5C;AACC,kBAAMC,IAAeF,EAAU,YAAY,KAAK,UAAU,WACpDG,IAAiBD,IAAeH;AACtC,YAAAT,KAAca,IAAiBlB,GAC3BkB,IAAiB,KAAaV,KAClBM,IAAAG;AAAA,UACjB;AAEA;AACO,kBAAAE,IAAeJ,EAAU,UAAUA,EAAU;AACnD,YAAAV,KAAcc,IAAenB,GAC7BI,KAAUW,EAAU,OAChBC,MAAM,MACTZ,KAAUR,IAAY,MAEnBoB,MAAM,KAAK,cAAc,SAAS,MACrCZ,KAAUR,IAAY,MAEnBuB,IAAe,KAAaX,KACfM,KAAAK;AAAA,UAClB;AAAA,QAAA,CACA;AACU,mBAAAtQ,KAAK6L,EAAK;AACpB,UAAA7L,EAAE,OAAO;AAEN,YAAA;AACG,gBAAA8O,IAAMjB,EAAO,QAAQY,GAAQ;AAAA,YAClC,UAAUU,KAAiB;AAAA,YAC3B,IAAI,aAAatD,EAAK,IAAI,IAAI9M,CAAC;AAAA,YAC/B,QAAQ;AAAA,YACR,MAAM;AAAA,UAAA,CACN;AACD,UAAA+P,EAAI,MAAM,GACLjD,EAAA,iBAAiB,CAACiD,CAAG;AAAA,iBAClBzT,GAAK;AACb,kBAAQ,KAAK,cAAcoT,GAAQU,GAAe9T,CAAG;AAAA,QACtD;AAAA,MACD;AAAA,IAAA,CACA;AAAA,EACF;AAAA,EACA,aAAa;AACZ,WAAO,KAAK;AAAA,EACb;AAAA,EACA,aACCwK,IAAe,KAAK,MACpBC,IAAc,KAAK,KACnBvL,IAAgB,KAAK,OACrBgW,IAAU,GACVpC,IAAO,GACPpI,IAAQ,IACRlB,IAAQ,GACP;AACK,UAAA2L,IAAc,KAAK,MAAMrC,CAAI,GAC7BsC,IAAgB,KAAK,WACrBC,IAAe,KAAK,YAAY,gBAAgB;AACtD,SAAK,OAAO7K,GACZ,KAAK,MAAMC,GACX,KAAK,QAAQvL,GACR,KAAA,QAASsK,IAAQ,MAAQ;AAC9B,UAAM4H,IAAO,KAAK,QAAQ,SAAS,CAAC,GAC9BC,IAAQ,KAAK,QAAQ,SAAS,CAAC,GAC/BC,IAAQ,KAAK,QAAQ,SAAS,CAAC;AAIjC,QAHCF,EAAA,MAAM,UAAU,GAAG8D,CAAO,IAC/B7D,EAAM,MAAM,UAAU,GAAG6D,IAAU,CAAC,IACpC5D,EAAM,MAAM,UAAU,GAAG4D,IAAU,CAAC,IAChCxK,KAAS,CAAC2K,GAAc;AAY3B,UAXA,KAAK,OAAO,KAAK,IAAI,IAAIF,CAAW,GAChCzK,KACH,KAAK,QAAQ,UAAU;AAAA,QACtB,KAAK,YAAY,MAAM,QAAQ;AAAA,MAAA,GAK5B,KAAA,eAAe,KAAK,YAAYF,CAAI,GACpC,KAAA,eAAe,KAAK,YAAYC,CAAG,GACnC,KAAA,eAAe,MAAM,YAAYvL,CAAK,GACtCmW;AAOE,aAAK,aAAa;AAAA,WAPN;AAClB,cAAMC,IAAe,KAAK;AAC1B,QAAIF,KAAiBE,IACpB,KAAK,KAAK,IAEV,KAAK,KAAK;AAAA,MAEZ;AACI,MAAA5K,KACH,sBAAsB,MAAM;AAC3B,aAAK,QAAQ,UAAU;AAAA,UACtB,KAAK,YAAY,MAAM,QAAQ;AAAA,QAAA;AAAA,MAChC,CACA;AAAA,IAAA;AAKF,WAAK,eAAe,KAAK,kBAAkBF,GAAMhB,CAAK,GACtD,KAAK,eAAe,KAAK,kBAAkBiB,GAAKjB,CAAK,GAChD,KAAA,eAAe,MAAM,kBAAkBtK,CAAK,GAC7C,KAAK,SAAS,KAAK,IAAI,IAAIiW,CAAW,MACzC,KAAK,OAAO,KAAK,IAAI,IAAIA,CAAW,GAC/B,KAAA,QAAQ,MAAM,SAAS,QAAQ,KAAK,IAAI,IAAIA,CAAW,CAAC;AAAA,EAGhE;AAAA,EACA,OAAO1U,IAAQ,GAAG;AACb,IAAC,KAAK,YAAY,gBAAgB,MACjC,KAAA,eAAe,KAAK,OAAOA,CAAK,GAChC,KAAA,eAAe,KAAK,OAAOA,CAAK,GAChC,KAAA,eAAe,MAAM,OAAOA,CAAK,GAClC,KAAK,YACR,KAAK,KAAK,IAEV,KAAK,KAAK;AAAA,EAEZ;AAAA,EAEA,qBAA6B;AACrB,WAAA,QAAQ,KAAK,IAAI,KAAK,KAAK,GAAG,SAAS,KAAK,KAAK,SAAS,KAAK,KAAK;AAAA,EAC5E;AAAA,EAEA,IAAI,YAAY;AACf,UAAMkK,IAAI,KAAK,eAAe,KAAK,mBAAmB,GAChD,IAAI,KAAK,eAAe,KAAK,mBAAmB,GAChDnG,IAAImG,IAAI,KAAK,SAAS,CAAC,GACvBjG,IAAI,IAAI,KAAK,SAAS,CAAC,GACvBkG,IAAK,KAAK,YAAY,KAAK,CAAC,GAC5BC,IAAK,KAAK,YAAY,KAAK,CAAC;AAClC,WAAO,EAAEF,IAAIC,KAAMpG,IAAI,KAAK,IAAIqG,KAAMnG,IAAI;AAAA,EAC3C;AAAA,EACA,UAAgB;AACf,SAAK,QAAQ;EACd;AACD;ACj/BA,MAAM6Q,KAAMC,GAAOC,GAAA,CAAQ;AAKpB,MAAMC,WAA4B,WAAW;AAAA,EACnD,YAIiBC,GAIA7E,GAChBC,GACC;AACD,UAAM,QAAQA,EAAM,IAAI,IAAIA,CAAK,GAPjB,KAAA,YAAA4E,GAIA,KAAA,OAAA7E;AAAA,EAIjB;AACD;AAWO,MAAM8E,WAAoB,YAA8C;AAAA,EAsQ9E,cAAc;AACP;AAtQC,IAAA7W,EAAA,iBAAuB,SAAS,cAAc,KAAK;AACnD,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,oBAA0B,CAAA;AAC1B,IAAAA,EAAA,wBAA8B,CAAA;AAC9B,IAAAA,EAAA,sBAA8B,CAAA;AAC9B,IAAAA,EAAA,4CACH;AACG,IAAAA,EAAA,+CAAsD;AACtD,IAAAA,EAAA,sCAA4B;AAC5B,IAAAA,EAAA,2CAAiC;AACjC,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,yBAAkB;AAClB,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,8BAAuB;AACvB,IAAAA,EAAA,sBAAe;AACf,IAAAA,EAAA,yBAAkB;AAClB,IAAAA,EAAA,wBAAiC,IAAI,eAAe,CAAC,MAAM;AAC5D,YAAA8W,IAAO,EAAE,CAAC,EAAE;AACb,WAAA,KAAK,CAAC,IAAIA,EAAK,OACf,KAAA,KAAK,CAAC,IAAIA,EAAK;AACpB,YAAMC,IAAS,iBAAiB,EAAE,CAAC,EAAE,MAAM,GACrCC,IACL,KAAK,QAAQ,cACb,WAAWD,EAAO,WAAW,IAC7B,WAAWA,EAAO,YAAY,GACzBE,IACL,KAAK,QAAQ,eACb,WAAWF,EAAO,UAAU,IAC5B,WAAWA,EAAO,aAAa;AAC3B,WAAA,UAAU,CAAC,IAAIC,GACf,KAAA,UAAU,CAAC,IAAIC,GACpB,KAAK,aAAa,GACb,KAAA,WAAW,IAAM,EAAI,GAC1B,KAAK,aAAa,QAAQ,CAAC/C,MAAOA,EAAG,iBAAiB;AAAA,IAAA,CACtD;AACO,IAAAlU,EAAA,0BAA0C;AAAA,MACjD,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW;AAAA,IAAA;AAEJ,IAAAA,EAAA,0BAA0C;AAAA,MACjD,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW;AAAA,IAAA;AAEJ,IAAAA,EAAA,2BAA2C;AAAA,MAClD,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW;AAAA,IAAA;AAEJ,IAAAA,EAAA,gBAAS,KAAK,IAAI,KAAK,IAAI,cAAc,MAAM,aAAa,GAAG,GAAG,EAAE;AACpE,IAAAA,EAAA,iBAAU,KAAK;AACf,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA;AACA,IAAAA,EAAA,2BAAsC,CAAC,GAAG,CAAC;AAC3C,IAAAA,EAAA;AACC,IAAAA,EAAA,4BAAqB,IAAI,SAAS,kBAAkB,cAAc;AAClE,IAAAA,EAAA,0BAAmB,IAAI,SAAS,cAAc,MAAM;AACrD,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,qBAA2C;AAC3C,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,sBAAe;AACf,IAAAA,EAAA,wBAAiB,CAAC,GAAG,CAAC;AACrB,IAAAA,EAAA,cAAyB,CAAC,GAAG,CAAC;AAC9B,IAAAA,EAAA,mBAA8B,CAAC,GAAG,CAAC;AAC3B,IAAAA,EAAA,8BAAuB,CAAC,MAA8B;AACtE,YAAMkX,IAAM,IAAIP;AAAA,QACf,KAAK,kBAAkB,IAAI,EAAE,IAAI,KAAK;AAAA,QACtC,EAAE;AAAA,QACF;AAAA,MAAA;AAED,MAAK,KAAK,cAAcO,CAAG,MAC1B,EAAE,eAAe,GACjB,EAAE,gBAAgB,GAClB,EAAE,yBAAyB;AAAA,IAC5B;AA+Ce,IAAAlX,EAAA,eAAQwW,GAAI,iBAAiB;AAAA,MAC5C,aAAa;AAAA,QACZ,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,WAAW;AAAA,QACX,UAAU;AAAA,QACV,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,cAAc;AAAA,QACd,SAAS;AAAA,QACT,WAAW;AAAA,UACV,gBAAgB;AAAA,YACf,QAAQ;AAAA,UACT;AAAA,QACD;AAAA,MACD;AAAA,MACA,WAAW;AAAA,QACV,UAAU;AAAA,QACV,oBAAoB;AAAA,QACpB,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,cAAc;AAAA,QACd,mBAAmB;AAAA,UAClB,iBAAiB;AAAA,UACjB,WAAW;AAAA,QACZ;AAAA,QACA,oBAAoB;AAAA,UACnB,WAAW;AAAA,QACZ;AAAA,MACD;AAAA,MACA,8BAA8B;AAAA,QAC7B,WAAW;AAAA,UACV,SAAS;AAAA,QACV;AAAA,MACD;AAAA,MACA,eAAe;AAAA,QACd,WAAW;AAAA,QACX,iBAAiB;AAAA,MAClB;AAAA,MACA,aAAa;AAAA,QACZ,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,UACX,YAAY;AAAA,UACZ,SAAS;AAAA,QACV;AAAA,MACD;AAAA,MACA,eAAe;AAAA,QACd,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,UAAU;AAAA,UACT,SAAS;AAAA,QACV;AAAA,QACA,oCAAoC;AAAA,UACnC,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,+BAA+B;AAAA,YAC9B,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,YAAY;AAAA,cACX,SAAS;AAAA,cACT,QAAQ;AAAA,YACT;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,MACA,cAAc;AAAA,QACb,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,SAAS;AAAA,MACV;AAAA,MACA,eAAe;AAAA,QACd,SAAS;AAAA,UACR,YACC;AAAA,QACF;AAAA,MACD;AAAA,MACA,eAAe;AAAA,QACd,QAAQ;AAAA,QACR,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,QACV,SAAS;AAAA,QACT,KAAK;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,UACR,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,cAAc;AAAA,UACd,aAAa;AAAA,UACb,iBAAiB;AAAA,UACjB,aAAa;AAAA,QACd;AAAA,QACA,UAAU;AAAA,UACT,OAAO;AAAA,UACP,iBAAiB;AAAA,QAClB;AAAA,MACD;AAAA,MACA,4CAA4C;AAAA,QAC3C,cAAc;AAAA,UACb,SAAS;AAAA,QACV;AAAA,MACD;AAAA,MACA,sBAAsB;AAAA,QACrB,YAAY;AAAA,MACb;AAAA,IAAA,CACA;AACO,IAAAxW,EAAA,uBAAgB,WAAW,iBAAiB,KAAK,OAAO,EAAE,QAAQ;AAIlE,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,oBAAa,MAAM;AAC1B,WAAK,gBAAgB,IAChB,KAAA,eAAe,KAAK,aAAa,EAAI;AAAA,IAAA;AAEnC,IAAAA,EAAA,oBAAa,MAAM;AAC1B,WAAK,gBAAgB;AAAA,IAAA;AAIhB,SAAA,gBAAgB,IAAIoM,GAAc,IAAI,GACtC,KAAA,aAAa,IAAId,GAAa,IAAI,GACvC,KAAK,QAAQ,aAAa,SAAS,KAAK,MAAM,QAAQ,WAAW,GAC7D,KAAK,iBACR,KAAK,QAAQ,UAAU,IAAI,KAAK,MAAM,QAAQ,aAAa,GAE5D,KAAK,aAAa,GACb,KAAA,eAAe,QAAQ,KAAK,OAAO,GACxC,KAAK,QAAQ,YAAY,KAAK,cAAc,YAAY,GACxD,KAAK,QAAQ,YAAY,KAAK,WAAW,YAAY,GACrD,KAAK,MAAM,UACN,KAAA,cAAc,aAAa,GAAG,GAAG,GAC/B,OAAA,iBAAiB,YAAY,KAAK,UAAU,GAC5C,OAAA,iBAAiB,YAAY,KAAK,UAAU;AACnD,QAAI6L,IAAe,GACfC,IAAoC,QACpCC,IAAiB,GACjBC,IAAkB,GAClBC,IAAc,GACdC,IAAW,OAAO,aAAa,GAC/BC,IAAY,GACZC,IAAe;AACnB,SAAK,QAAQ,iBAAiB,cAAc,CAACR,MAAQ;AAChD,MAAA,KAAK,yBACRA,EAAI,eAAe,GACnBC,IAAe,KAAK,cACHE,IAAAH,EAAI,QAAQ,CAAC,EAAE,SACpBO,IAAAJ,GACZC,IAAkB,KAAK,OACTC,IAAA;AAAA,IACf,CACA,GACD,KAAK,QAAQ,iBAAiB,aAAa,CAACL,MAAQ;AAC/C,UAAA,KAAK,sBAAsB;AAC9B,QAAAA,EAAI,eAAe;AACnB,cAAMS,IAAeT,EAAI,QAAQ,CAAC,EAAE,SAC9BxV,IAAQiW,IAAeN,GACvBO,IAAYD,IAAeF,GAC3BI,IACLD,IAAY,IAAI,SAASA,IAAY,IAAI,OAAO;AACjD,QAAIR,MAAcS,KACLT,IAAAS,GACZV,IAAe,KAAK,cACHE,IAAAM,GACjBL,IAAkB,KAAK,SAEvB,KAAK,eAAeH,IAAezV,GAExB+V,IAAAE,GACZD,IAAe,KAAK,OACpB,KAAK,kBAAkB,GACvB,KAAK,WAAW,EAAI;AAAA,MACrB;AAAA,IAAA,CACA,GACD,KAAK,QAAQ,iBAAiB,YAAY,CAACR,MAAQ;AAC9C,UAAA,KAAK,sBAAsB;AAC9B,QAAAA,EAAI,eAAe,GACFG,IAAA;AACX,cAAAS,IAAU,KAAK;AACrB,YAAIA,IAAUJ,IAAe;AAAK,iBAAO,KAAK;AAC9C,cAAMK,IAAiBD,IAAUR;AAE9B,QAAAC,KAAA,KAAK,eAAeJ,KAAgBY,IAAkB;AACzD,YAAIC,IAAK;AACH,cAAAC,IAAc,OAAO,aAAa;AAC7B,QAAAT,IAAAS;AACL,cAAAC,IAAgB,CAACC,MAAe;AAC9B,UAAAH,UAAAG,IACHX,MAAaS,KAAe,KAAK,mBAAA,MAC/B,KAAA,gBAAiBV,KAAeY,IAAKH,KAAO,KAClCT,KAAA,MACf,KAAK,kBAAkB,GACvB,KAAK,WAAW,EAAI,GAEnB,KAAK,IAAIA,CAAW,IAAI,KACxB,CAAC,KAAK,eAAe,SAAS,KAAK,YAAY,KAE/C,sBAAsBW,CAAa,GAEpC,KAAK,iBAAiB,GACjBF,IAAAG;AAAA,QACN;AAED,8BAAsBD,CAAa,GACnC,KAAK,iBAAiB;AAAA,MACvB;AAAA,IAAA,CACA,GACD,KAAK,QAAQ,iBAAiB,SAAS,CAAChB,MAAQ;AAC3C,MAAA,KAAK,yBACJA,EAAI,cAAcA,EAAI,mBACzB,KAAK,gBAAgBA,EAAI,QACzB,KAAK,kBAAkB,GACvB,KAAK,WAAW,EAAI,MAEf,KAAA,gBAAgBA,EAAI,SAAS,IAClC,KAAK,kBAAkB,GACvB,KAAK,WAAW,EAAK,IAEtB,KAAK,iBAAiB;AAAA,IACvB,CACA;AAAA,EACF;AAAA,EA7RA,mBAAmB;AAClB,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,gBAAgBtU,IAAS,IAAM;AAC9B,SAAK,gBAAgB,CAACA,GAClBA,IACH,KAAK,QAAQ,UAAU,OAAO,KAAK,MAAM,QAAQ,aAAa,IAE9D,KAAK,QAAQ,UAAU,IAAI,KAAK,MAAM,QAAQ,aAAa,GAE5D,KAAK,WAAW,EAAI;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB;AACjB,WAAO,CAAC,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAeA,IAAS,IAAM;AAC7B,SAAK,cAAcA,GACnB,KAAK,WAAW;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB;AAChB,WAAO,KAAK;AAAA,EACb;AAAA,EA+HA,IAAW,eAAe;AACzB,WAAO,KAAK;AAAA,EACb;AAAA,EAiHQ,qBAAqB;AAC5B,UAAMwV,IAAU,KAAK;AACrB,WAAIA,MACH,KAAK,aAAa,IAClB,KAAK,uBAAuB,IAC5B,aAAa,KAAK,eAAe,GAC5B,KAAA,kBAAkB,WAAW,MAAM;AACvC,WAAK,aAAa,IAClB,KAAK,eAAe;AAAA,OAClB,GAAI,IAEDA;AAAA,EACR;AAAA,EACQ,mBAAmB;AAC1B,SAAK,uBAAuB;AAAA,EAC7B;AAAA,EACQ,oBAAoB;AAC3B,SAAK,eAAe,KAAK;AAAA,MACxB,KAAK,IAAI,KAAK,eAAe,CAAC,GAAG,KAAK,YAAY;AAAA,MAClD,KAAK,eAAe,CAAC;AAAA,IAAA;AAAA,EAEvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,sBAAqE;;AAChE,QAAA,KAAK,cAAc,OAAO;AAAU;AAClC,UAAAC,IAAc,KAAK,cAAc,IACjC1T,IAAI,KAAK;AACf,QAAIA,MAAM;AACT,WAAInC,IAAA,KAAK,eAAe,CAAC,MAArB,QAAAA,EAAwB,aACvB,KAAK,eAAe,CAAC,EAAE,YAAY6V;AAC/B,eAAA;AAAA,UACNA;AAAA,UACA,KAAK,IAAIA,GAAa,KAAK,eAAe,CAAC,EAAE,YAAY,GAAG;AAAA,UAC5D;AAAA,UACA,KAAK,eAAe,CAAC,EAAE;AAAA,QAAA;AAAA,gBAK1BjV,IAAA,KAAK,eAAeuB,CAAC,MAArB,QAAAvB,EAAwB,aACxBkV,IAAA,KAAK,eAAe3T,IAAI,CAAC,MAAzB,QAAA2T,EAA4B,cAG3B,KAAK,eAAe3T,IAAI,CAAC,EAAE,YAAY0T,KACvC,KAAK,eAAe1T,CAAC,EAAE,UAAU0T;AAE1B,aAAA;AAAA,QACN,KAAK,IAAI,KAAK,eAAe1T,CAAC,EAAE,SAAS0T,CAAW;AAAA,QACpD,KAAK,eAAe1T,IAAI,CAAC,EAAE;AAAA,QAC3BA;AAAA,QACA,KAAK,eAAeA,IAAI,CAAC,EAAE;AAAA,MAAA;AAAA,EAK/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe;AACd,SAAK,gBAAgB,WAAW,iBAAiB,KAAK,OAAO,EAAE,QAAQ;AACvE,QAAI6G,IAAQ;AACH,IAAAA,KAAA,8BACTA,KAAS,KAAK,UAAU,CAAC,IAAI,KAAK,UAAU,GACnCA,KAAA,OACAA,KAAA,+BACTA,KAAS,KAAK,UAAU,CAAC,IAAI,KAAK,UAAU,GACnCA,KAAA,OAIJ,KAAA,QAAQ,aAAa,SAASA,CAAK;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB+M,GAAe;AACjC,SAAK,kBAAkBA,GACvB,KAAK,WAAW;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc3V,GAAiB;AAC9B,IAAI,KAAK,eAAeA,MACxB,KAAK,aAAaA,GAClB,KAAK,WAAW;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc4V,GAAoB;AACjC,eAAWzG,KAAQyG;AACP,iBAAA/G,KAAQM,EAAK;AACvB,QAAAN,EAAK,OAAOA,EAAK,KAAK,QAAQ,QAAQ,GAAG;AAG3C,SAAK,aAAa+G;AAClB,UAAMpD,IAAa;AACnB,SAAK,iBAAiBoD,EACpB;AAAA,MACA,CAACzG,MACAA,EAAK,MAAM,OAAO,CAAC0G,GAAIC,MAAOD,IAAKC,EAAG,KAAK,KAAA,EAAO,QAAQ,CAAC,IAAI;AAAA,IAEhE,EAAA,IAAI,CAAC3G,GAAMpN,GAAG6T,MAAU;AACxB,UAAIzG,EAAK;AACD,eAAA;AAAA,UACN,GAAGA;AAAA,QAAA;AAGL,UAAIpN,MAAM;AACF,eAAA;AAAA,UACN,GAAGoN;AAAA,UACH,WAAW,KAAK,IAAIA,EAAK,YAAYqD,GAAY,CAAC;AAAA,QAAA;AAG9C,YAAAuD,IAAWH,EAAM7T,IAAI,CAAC,GACtBiU,IAAWJ,EAAM7T,IAAI,CAAC;AACxB,UAAAgU,KAAA,QAAAA,EAAU,QAAQC;AACjB,YAAAA,EAAS,UAAU7G,EAAK;AACpB,iBAAA;AAAA,YACN,GAAGA;AAAA,YACH,WACC,KAAK,IAAI6G,EAAS,SAAS7G,EAAK,YAAYqD,CAAU,KACtDrD,EAAK;AAAA,UAAA;AAAA,iBAGE4G,KAAA,QAAAA,EAAU,WAChBA,EAAS,UAAU5G,EAAK;AACpB,eAAA;AAAA,UACN,GAAGA;AAAA,UACH,WACC,KAAK,IAAI4G,KAAA,gBAAAA,EAAU,SAAS5G,EAAK,YAAYqD,CAAU,KACvDrD,EAAK;AAAA,QAAA;AAIF,aAAA;AAAA,QACN,GAAGA;AAAA,MAAA;AAAA,IACJ,CACA,GACF,KAAK,eAAe;AACT,eAAAA,KAAQ,KAAK;AACnB,UAAAA,EAAK,MAAM,SAAS,GAAG;AAC1B,aAAK,eAAe;AACpB;AAAA,MACD;AAED,SAAK,eAAe,QAAQ,CAACA,GAAMpN,GAAG6T,MAAU;AACzC,YAAAK,IAAWL,EAAM7T,IAAI,CAAC,GACtBmU,IAAW/G,EAAK,MAAMA,EAAK,MAAM,SAAS,CAAC;AAC7C,MAAA+G,KAAYjH,EAAgBiH,CAAQ,MACnCD,IACCA,EAAS,YAAY9G,EAAK,YAC7BA,EAAK,UAAU,KAAK,IAAIA,EAAK,UAAU,MAAM8G,EAAS,SAAS,KAG3D9G,EAAA,UAAUA,EAAK,UAAU;AAAA,IAEhC,CACA,GACD,KAAK,eAAe,QAAQ,CAACA,GAAMpN,GAAG6T,MAAU;AAC/C,UAAIzG,EAAK;AAAM;AACT,YAAA8G,IAAWL,EAAM7T,IAAI,CAAC;AAC5B,MAAIkU,KAAA,QAAAA,EAAU,SACbA,EAAS,YAAY,KAAK,IAAIA,EAAS,WAAW9G,EAAK,SAAS;AAAA,IACjE,CACA,GACI,KAAA,aAAa,QAAQ,CAACA,MAAS;AAC9B,MAAAA,EAAA,yBAAyB,SAAS,KAAK,oBAAoB,GAC3DA,EAAA,yBAAyB,eAAe,KAAK,oBAAoB,GACtEA,EAAK,QAAQ;AAAA,IAAA,CACb,GAED,KAAK,eAAe,KAAK,eAAe,IAAI,CAACA,MAAS;AAKrD,YAAMgH,IAAS,IAAI9G,GAAY,MAAMF,CAAI;AAClC,aAAAgH,EAAA,sBAAsB,SAAS,KAAK,oBAAoB,GACxDA,EAAA,sBAAsB,eAAe,KAAK,oBAAoB,GAC9DA;AAAA,IAAA,CAEP,GAOD,KAAK,aAAa,QAAQ,CAAC7E,GAAIvP,MAAM;AACpC,WAAK,QAAQ,YAAYuP,EAAG,WAAY,CAAA,GACnC,KAAA,kBAAkB,IAAIA,GAAIvP,CAAC,GAChCuP,EAAG,gBAAgB;AAAA,IAAA,CACnB,GACI,KAAA,cAAc,aAAa,MAAS,GACzC,KAAK,SAAS,SACd,KAAK,cAAc,SACd,KAAA,wBAAwB,CAAA,CAAE,GAC1B,KAAA,wBAAwB,CAAA,CAAE,GAC1B,KAAA,yBAAyB,CAAA,CAAE,GAC3B,KAAA,eAAe,GAAG,EAAI,GACtB,KAAA,WAAW,IAAM,EAAI;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc;AACb,SAAK,aAAa,IAClB,KAAK,eAAe,GACpB,KAAK,uBAAuB,IAC5B,aAAa,KAAK,eAAe,GACjC,KAAK,kBAAkB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,WAAWvI,IAAQ,IAAOqN,IAAS,IAAO;;AACzC,IAAIA,MACH,KAAK,SAAS,WAAW,iBAAiB,KAAK,OAAO,EAAE,QAAQ,GAC3D,KAAA,aAAa,QAAQ,CAAC9E,MAAO;AAC3B,YAAAtB,IAAyBsB,EAAG;AAC7B,WAAA,eAAe,IAAIA,GAAItB,CAAI,GAChCsB,EAAG,WAAWtB;AAAA,IAAA,CACd,GACD,KAAK,kBAAkB,CAAC,IAAI,KAAK,cAAc,WAAa,EAAA,aAC5D,KAAK,kBAAkB,CAAC,IAAI,KAAK,cAAc,WAAa,EAAA,cAE5D,KAAK,WAAW,WAAW,KAAK,WAAW,YAAY;AAElD,UAAAvG,IAAY,KAAK;AACnB,QAAA8I,IAAS,CAAC,KAAK,cACf8D,IAAmB,KAAK,eACxB1M,IAAoB;AACxB,IAAIF,KACHE,IAAoBF,EAAU,CAAC,IAAIA,EAAU,CAAC,GAC1CE,KAAqB,OACP,KAAK,aAAaF,EAAU,CAAC,IAAI,CAAC,MAE/B4M,IAAA5M,EAAU,CAAC,IAAI,MAI/B,KAAA,cAAc,aAAa,MAAS;AAEpC,UAAA6M,IAAe,KAAK,cAAc,OAAO,GACzCC,IAAe,KAAK,aACxB,MAAM,GAAGF,CAAgB,EACzB;AAAA,MACA,CAACG,GAAKlF,MACL;;AAAA,eAAAkF,KAAOlF,EAAG,QAAQ,EAAE,OAAO,MAAI1R,IAAA,KAAK,eAAe,IAAI0R,CAAE,MAA1B,gBAAA1R,EAA8B,OAAM;AAAA;AAAA,MACpE;AAAA,IAAA;AAEG,SAAA,eAAe,CAAC,IAAI,CAAC2W,GAChBhE,KAAAgE,GACVhE,KAAU,KAAK,KAAK,CAAC,IAAI,KAAK;AACxB,UAAAkE,IAAU,KAAK,aAAaJ,CAAgB;AAClD,QAAII,GAAS;AACZ,YAAMC,MAAa9W,IAAA,KAAK,eAAe,IAAI6W,CAAO,MAA/B,gBAAA7W,EAAmC,OAAM;AAC5D,cAAQ,KAAK,aAAa;AAAA,QACzB,KAAK;AACM,UAAA2S,KAAAmE;AACV;AAAA,QACD,KAAK;AACJ,UAAAnE,KAAUmE,IAAa;AACvB;AAAA,MAGF;AAAA,IACD;AACA,UAAMC,IAAc,KAAK,IAAI,GAAG,KAAK,aAAa;AAClD,QAAI9O,IAAQ,GACR+O,IAAY,MACZC,IAAU;AAEd,SAAK,aAAa,QAAQ,CAACvF,GAAIvP,MAAM;;AACpC,YAAM+U,IAAc,KAAK,cAAc,IAAI/U,CAAC,GACtCgV,IACLD,KAAgB/U,KAAK,KAAK,iBAAiBA,IAAI4U,GAC1CxH,IAAOmC,EAAG;AAEhB,MAAInC,EAAK,UACD,KAAK,KAAK,CAAC,OAAKvP,IAAA,KAAK,eAAe,IAAI0R,CAAE,MAA1B,gBAAA1R,EAA8B,OAAM,IAG3D,CAACiX,KACDlN,KAAqB,QACnB5H,MAAM,KAAK,kBAAiB0H,KAAA,gBAAAA,EAAY,QAAO,MAChD1H,MAAM,KAAK,gBAAgB,OAElB8U,IAAA,IACV,KAAK,cAAc,aAAa,KAAK,UAAU,IAAItE,IAAS,EAAE,GAC1D9I,KACE,KAAA,cAAc,aAAa,CAACA,EAAU,CAAC,GAAGA,EAAU,CAAC,CAAC,CAAC,GAEnD8I,KAAA,KAAK,kBAAkB,CAAC,IAAI;AAEvC,UAAIyE,IAAgB;AAChB,MAAA,CAACD,KAAYhV,MAAM0H,IAAYA,EAAU,CAAC,IAAI,KAAK,iBAClD,KAAK,kBACQuN,IAAA,IACN,KAAK,eACCA,IAAA,OAEAA,IAAA,OAEPF,IACN,KAAK,eACQE,IAAA,OAEAA,IAAA,IAGb,KAAK,eACQA,IAAA,OAEAA,IAAA,KAGd,KAAK,yBACJ,KAAK,eACQA,IAAA,OAEAA,IAAA;AAGlB,UAAIC,IAAY;AAChB,MAAI,KAAK,eACJF,IACSE,IAAA,KAEAA,IAAA,GACRlV,IAAI,KAAK,gBACZkV,KAAa,KAAK,IAAI,KAAK,gBAAgBlV,CAAC,IAAI,IAEhDkV,KAAa,KAAK;AAAA,QACjBlV,IAAI,KAAK,IAAI,KAAK,eAAe4U,CAAW;AAAA,MAAA,KAK5C,KAAK,yBACIM,IAAA,IAEV3F,EAAA;AAAA,QACF,KAAK;AAAA,QACLiB;AAAA,QACAwE,IAAW,IAAIT;AAAA,QACfU;AAAA,QACAC,IAAY;AAAA,QACZlO;AAAA,QACAlB;AAAA,MAAA,GAGGsH,EAAK,QAAQ4H,IAChBxE,OAAU/R,IAAA,KAAK,eAAe,IAAI8Q,CAAE,MAA1B,gBAAA9Q,EAA8B,OAAM,IACnC2O,EAAK,SAChBoD,OAAUmD,IAAA,KAAK,eAAe,IAAIpE,CAAE,MAA1B,gBAAAoE,EAA8B,OAAM,IAE3CnD,KAAU,MACJ1K,KAAA+O,GACIA,KAAA;AAAA,IACd,CACA,GACI,KAAA,eAAe,CAAC,IAAIrE,IAAS,KAAK,eAAe,KAAK,KAAK,CAAC,IAAI,GAErE,KAAK,WAAW,aAAa,KAAK,SAASA,GAAQxJ,GAAOlB,CAAK;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB;AAChB,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAgB;AACf,WAAO,KAAK;AAAA,EACb;AAAA,EACA,aAA0B;AACzB,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,uBAAoC;AAC5B,WAAA,KAAK,WAAW;EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAeqP,GAA0C;AACxD,SAAK,cAAcA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiBC,GAAuB;AACvC,SAAK,gBAAgBA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eAAetE,GAAcuE,IAAS,IAAO;AAc5C,QAJA,KAAK,cAAcvE,GACf,CAAC,KAAK,kBACN,CAAC,KAAK,sBAAsB,CAAC,KAAK,oBACrC,KAAK,QAAQ,MAAM,YAAY,sBAAsB,GAAGA,CAAI,EAAE,GAC3D,KAAK;AAAY;AACf,UAAAwE,wBAAoB,OACpBC,wBAAiB,OACjBC,wBAAe;AAErB,QAAIH;AACQ,iBAAAjI,KAAQ,KAAK;AACvB,QAAAA,EAAK,sBAAsB0D,CAAI;AAK5B,SAAA,SAAS,QAAQ,CAAC2E,MAAc;AAC9B,YAAArI,IAAO,KAAK,eAAeqI,CAAS;AAC1C,UAAIrI,GAAM;AACT,YAAIA,EAAK;AAAM;AACf,cAAM8G,IAAW,KAAK,eAAeuB,IAAY,CAAC;AAClD,YAAIvB,KAAA,QAAAA,EAAU,MAAM;AACnB,gBAAMwB,IAAe,KAAK,eAAeD,IAAY,CAAC,GAChDE,IAAY,KAAK,IAAIvI,EAAK,WAAW8G,KAAA,gBAAAA,EAAU,SAAS,GACxD0B,IAAU,KAAK;AAAA,YACpB,KAAK,IAAIxI,EAAK,UAASsI,KAAA,gBAAAA,EAAc,cAAa,OAAO,SAAS;AAAA,YAClE,KAAK,IAAItI,EAAK,SAAS8G,KAAA,gBAAAA,EAAU,OAAO;AAAA,UAAA;AAErC,WAAAyB,IAAY7E,KAAQ8E,KAAW9E,OAC7B,KAAA,SAAS,OAAO2E,CAAS,GAC9BH,EAAc,IAAIG,CAAS,GACtB,KAAA,SAAS,OAAOA,IAAY,CAAC,GACpBH,EAAA,IAAIG,IAAY,CAAC,GAC3BJ,MACH,KAAK,aAAaI,CAAS,EAAE,QAAQ3E,CAAI,GACzC,KAAK,aAAa2E,IAAY,CAAC,EAAE,QAAQ3E,CAAI;AAAA,QAE/C;WACU1D,EAAK,YAAY0D,KAAQ1D,EAAK,WAAW0D,OAC9C,KAAA,SAAS,OAAO2E,CAAS,GAC9BH,EAAc,IAAIG,CAAS,GACvBJ,KAAQ,KAAK,aAAaI,CAAS,EAAE,QAAQ3E,CAAI;AAAA,MACtD;AAEK,aAAA,SAAS,OAAO2E,CAAS,GAC9BH,EAAc,IAAIG,CAAS,GACvBJ,KAAQ,KAAK,aAAaI,CAAS,EAAE,QAAQ3E,CAAI;AAAA,IACtD,CACA,GACD,KAAK,eAAe,QAAQ,CAAC1D,GAAMyI,GAAIrG,MAAQ;;AAC1C,MAAA,CAACpC,EAAK,QAAQA,EAAK,aAAa0D,KAAQ1D,EAAK,UAAU0D,MACrD,KAAK,SAAS,IAAI+E,CAAE,MACnB,KAAA,SAAS,IAAIA,CAAE,GACpBL,EAAS,IAAIK,CAAE,GACXR,KAAQ,KAAK,aAAaQ,CAAE,EAAE,OAAO/E,CAAI,IACzCjT,IAAA2R,EAAIqG,IAAK,CAAC,MAAV,QAAAhY,EAAa,SACX,KAAA,SAAS,IAAIgY,IAAK,CAAC,GACfL,EAAA,IAAIK,IAAK,CAAC,GACfR,KAAQ,KAAK,aAAaQ,IAAK,CAAC,EAAE,OAAO/E,CAAI;AAAA,IAGpD,CACA,GACI,KAAA,cAAc,QAAQ,CAAClE,MAAM;AACjC,MAAK,KAAK,SAAS,IAAIA,CAAC,MACvB2I,EAAW,IAAI3I,CAAC,GACZyI,KAAQ,KAAK,aAAazI,CAAC,EAAE,QAAQkE,CAAI;AAAA,IAC9C,CACA,GACGuE,KACC,KAAK,cAAc,OAAO,IAC7B,KAAK,gBAAgB,KAAK,IAAI,GAAG,KAAK,aAAa,IAE9C,KAAA,gBAAgB,KAAK,eAAe;AAAA,MACxC,CAACjI,MAASA,EAAK,aAAa0D;AAAA,IAAA,GAG9B,KAAK,cAAc,SACd,KAAA,SAAS,QAAQ,CAAClE,MAAM,KAAK,cAAc,IAAIA,CAAC,CAAC,GACtD,KAAK,WAAW,EAAI,MACV2I,EAAW,OAAO,KAAKC,EAAS,OAAO,OAO7CD,EAAW,SAAS,KAAKC,EAAS,OAAO,KAEnCA,EAAA,QAAQ,CAAC5I,MAAM;AAClB,WAAA,cAAc,IAAIA,CAAC,GACxB,KAAK,aAAaA,CAAC,EAAE,OAAOkE,CAAI;AAAA,IAAA,CAChC,GACD,KAAK,gBAAgB,KAAK,IAAI,GAAG,KAAK,aAAa,GACnD,KAAK,WAAW,KACN0E,EAAS,SAAS,KAAKD,EAAW,OAAO,IAC/CrQ,GAAMqQ,GAAY,KAAK,aAAa,MAElC,KAAA,cAAc,QAAQ,CAAC3I,MAAM;AACjC,MAAK,KAAK,SAAS,IAAIA,CAAC,MAClB,KAAA,cAAc,OAAOA,CAAC,GAC3B,KAAK,aAAaA,CAAC,EAAE,QAAQkE,CAAI;AAAA,IAClC,CACA,GACD,KAAK,WAAW,MAIR0E,EAAA,QAAQ,CAAC5I,MAAM;AAClB,WAAA,cAAc,IAAIA,CAAC,GACxB,KAAK,aAAaA,CAAC,EAAE,OAAOkE,CAAI;AAAA,IAAA,CAChC,GACUyE,EAAA,QAAQ,CAAC3I,MAAM;AACpB,WAAA,cAAc,OAAOA,CAAC,GAC3B,KAAK,aAAaA,CAAC,EAAE,QAAQkE,CAAI;AAAA,IAAA,CACjC,GACG,KAAK,cAAc,OAAO,MAC7B,KAAK,gBAAgB,KAAK,IAAI,GAAG,KAAK,aAAa,IACpD,KAAK,WAAW;AAAA,EAGnB;AAAA;AAAA;AAAA;AAAA,EAIA,QAAQ;AACP,SAAK,cAAc;AACR,eAAA1D,KAAQ,KAAK;AACvB,MAAAA,EAAK,MAAM;AAAA,EAEb;AAAA;AAAA;AAAA;AAAA,EAIA,SAAS;AACR,SAAK,cAAc;AACR,eAAAA,KAAQ,KAAK;AACvB,MAAAA,EAAK,OAAO;AAAA,EAEd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAOrQ,IAAQ,GAAG;AACjB,QAAI,CAAC,KAAK;AAAe;AACzB,UAAM+Y,IAAS/Y,IAAQ;AAClB,SAAA,cAAc,OAAOA,CAAK,GAC1B,KAAA,WAAW,OAAO+Y,CAAM,GAC7B,KAAK,aAAa,QAAQ,CAAC1I,MAASA,EAAK,OAAO0I,CAAM,CAAC;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,wBAAwBjQ,GAA+B;AACtD,SAAK,mBAAmB;AAAA,MACvB,GAAG,KAAK;AAAA,MACR,GAAGA;AAAA,IAAA,GAEJ,KAAK,WAAW,eAAe,KAAK,aAAa,KAAK,gBAAgB,GACtE,KAAK,aAAa;AAAA,MAAQ,CAACuH,MAC1BA,EAAK,eAAe,KAAK,aAAa,KAAK,gBAAgB;AAAA,IAAA;AAAA,EAE7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,wBAAwBvH,GAA+B;AACtD,SAAK,mBAAmB;AAAA,MACvB,GAAG,KAAK;AAAA,MACR,GAAGA;AAAA,IAAA,GAEJ,KAAK,WAAW,eAAe,KAAK,aAAa,KAAK,gBAAgB,GACtE,KAAK,aAAa;AAAA,MAAQ,CAACuH,MAC1BA,EAAK,eAAe,KAAK,aAAa,KAAK,gBAAgB;AAAA,IAAA;AAAA,EAE7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,yBAAyBvH,GAA+B;AACvD,SAAK,oBAAoB;AAAA,MACxB,GAAG,KAAK;AAAA,MACR,GAAGA;AAAA,IAAA,GAEJ,KAAK,aAAa;AAAA,MAAQ,CAACuH,MAC1BA,EAAK,eAAe,MAAM,aAAa,KAAK,iBAAiB;AAAA,IAAA;AAAA,EAE/D;AAAA,EACA,UAAgB;AACf,SAAK,QAAQ,UACb,KAAK,eAAe,cACpB,KAAK,MAAM,UACX,KAAK,aAAa,QAAQ,CAACmC,MAAOA,EAAG,SAAS,GACvC,OAAA,oBAAoB,YAAY,KAAK,UAAU,GACtD,KAAK,WAAW,WAChB,KAAK,cAAc;EACpB;AACD;","x_google_ignoreList":[17]}