sa2kit 2.0.0 → 2.0.2
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.
- package/README.md +1 -1
- package/dist/CollisionBalls-BpHufX3H.d.mts +41 -0
- package/dist/CollisionBalls-BpHufX3H.d.ts +41 -0
- package/dist/ConfigService-BxK06xP6.d.mts +262 -0
- package/dist/ConfigService-BxK06xP6.d.ts +262 -0
- package/dist/UniversalFileService-BpvbZitV.d.mts +139 -0
- package/dist/UniversalFileService-GsP6D3Rc.d.ts +139 -0
- package/dist/audioDetection/index.d.mts +449 -0
- package/dist/audioDetection/index.d.ts +449 -0
- package/dist/audioDetection/index.js +1244 -0
- package/dist/audioDetection/index.js.map +1 -0
- package/dist/audioDetection/index.mjs +1227 -0
- package/dist/audioDetection/index.mjs.map +1 -0
- package/dist/auth/legacy/core/index.d.mts +42 -0
- package/dist/auth/legacy/core/index.d.ts +42 -0
- package/dist/auth/legacy/core/index.js +242 -0
- package/dist/auth/legacy/core/index.js.map +1 -0
- package/dist/auth/legacy/core/index.mjs +226 -0
- package/dist/auth/legacy/core/index.mjs.map +1 -0
- package/dist/auth/legacy/db/index.d.mts +5 -0
- package/dist/auth/legacy/db/index.d.ts +5 -0
- package/dist/auth/legacy/db/index.js +261 -0
- package/dist/auth/legacy/db/index.js.map +1 -0
- package/dist/auth/legacy/db/index.mjs +250 -0
- package/dist/auth/legacy/db/index.mjs.map +1 -0
- package/dist/auth/legacy/index.d.mts +5 -0
- package/dist/auth/legacy/index.d.ts +5 -0
- package/dist/auth/legacy/index.js +1107 -0
- package/dist/auth/legacy/index.js.map +1 -0
- package/dist/auth/legacy/index.mjs +1086 -0
- package/dist/auth/legacy/index.mjs.map +1 -0
- package/dist/auth/legacy/logic/index.d.mts +9 -0
- package/dist/auth/legacy/logic/index.d.ts +9 -0
- package/dist/auth/legacy/logic/index.js +194 -0
- package/dist/auth/legacy/logic/index.js.map +1 -0
- package/dist/auth/legacy/logic/index.mjs +187 -0
- package/dist/auth/legacy/logic/index.mjs.map +1 -0
- package/dist/auth/legacy/miniapp/index.d.mts +5 -0
- package/dist/auth/legacy/miniapp/index.d.ts +5 -0
- package/dist/auth/legacy/miniapp/index.js +506 -0
- package/dist/auth/legacy/miniapp/index.js.map +1 -0
- package/dist/auth/legacy/miniapp/index.mjs +487 -0
- package/dist/auth/legacy/miniapp/index.mjs.map +1 -0
- package/dist/auth/legacy/routes/index.d.mts +53 -0
- package/dist/auth/legacy/routes/index.d.ts +53 -0
- package/dist/auth/legacy/routes/index.js +278 -0
- package/dist/auth/legacy/routes/index.js.map +1 -0
- package/dist/auth/legacy/routes/index.mjs +271 -0
- package/dist/auth/legacy/routes/index.mjs.map +1 -0
- package/dist/auth/legacy/schema/index.d.mts +401 -0
- package/dist/auth/legacy/schema/index.d.ts +401 -0
- package/dist/auth/legacy/schema/index.js +50 -0
- package/dist/auth/legacy/schema/index.js.map +1 -0
- package/dist/auth/legacy/schema/index.mjs +44 -0
- package/dist/auth/legacy/schema/index.mjs.map +1 -0
- package/dist/auth/legacy/server/index.d.mts +13 -0
- package/dist/auth/legacy/server/index.d.ts +13 -0
- package/dist/auth/legacy/server/index.js +21 -0
- package/dist/auth/legacy/server/index.js.map +1 -0
- package/dist/auth/legacy/server/index.mjs +19 -0
- package/dist/auth/legacy/server/index.mjs.map +1 -0
- package/dist/auth/legacy/services/index.d.mts +40 -0
- package/dist/auth/legacy/services/index.d.ts +40 -0
- package/dist/auth/legacy/services/index.js +258 -0
- package/dist/auth/legacy/services/index.js.map +1 -0
- package/dist/auth/legacy/services/index.mjs +252 -0
- package/dist/auth/legacy/services/index.mjs.map +1 -0
- package/dist/auth/legacy/ui/miniapp/index.d.mts +10 -0
- package/dist/auth/legacy/ui/miniapp/index.d.ts +10 -0
- package/dist/auth/legacy/ui/miniapp/index.js +298 -0
- package/dist/auth/legacy/ui/miniapp/index.js.map +1 -0
- package/dist/auth/legacy/ui/miniapp/index.mjs +290 -0
- package/dist/auth/legacy/ui/miniapp/index.mjs.map +1 -0
- package/dist/auth/legacy/ui/web/index.d.mts +22 -0
- package/dist/auth/legacy/ui/web/index.d.ts +22 -0
- package/dist/auth/legacy/ui/web/index.js +899 -0
- package/dist/auth/legacy/ui/web/index.js.map +1 -0
- package/dist/auth/legacy/ui/web/index.mjs +889 -0
- package/dist/auth/legacy/ui/web/index.mjs.map +1 -0
- package/dist/auth/legacy/web/index.d.mts +5 -0
- package/dist/auth/legacy/web/index.d.ts +5 -0
- package/dist/auth/legacy/web/index.js +1107 -0
- package/dist/auth/legacy/web/index.js.map +1 -0
- package/dist/auth/legacy/web/index.mjs +1086 -0
- package/dist/auth/legacy/web/index.mjs.map +1 -0
- package/dist/auth/rn/index.d.mts +64 -0
- package/dist/auth/rn/index.d.ts +64 -0
- package/dist/auth/rn/index.js +765 -0
- package/dist/auth/rn/index.js.map +1 -0
- package/dist/auth/rn/index.mjs +754 -0
- package/dist/auth/rn/index.mjs.map +1 -0
- package/dist/base-api-client-ACKKt13v.d.mts +277 -0
- package/dist/base-api-client-ACKKt13v.d.ts +277 -0
- package/dist/boothVaultService-Cn4WPhjg.d.mts +83 -0
- package/dist/boothVaultService-Cn4WPhjg.d.ts +83 -0
- package/dist/business/index.d.mts +6 -0
- package/dist/business/index.d.ts +6 -0
- package/dist/business/index.js +1682 -0
- package/dist/business/index.js.map +1 -0
- package/dist/business/index.mjs +1675 -0
- package/dist/business/index.mjs.map +1 -0
- package/dist/calendar/index.d.mts +1325 -0
- package/dist/calendar/index.d.ts +1325 -0
- package/dist/calendar/index.js +5964 -0
- package/dist/calendar/index.js.map +1 -0
- package/dist/calendar/index.mjs +5878 -0
- package/dist/calendar/index.mjs.map +1 -0
- package/dist/components/index.d.mts +405 -0
- package/dist/components/index.d.ts +405 -0
- package/dist/components/index.js +2516 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/index.mjs +2396 -0
- package/dist/components/index.mjs.map +1 -0
- package/dist/drizzle-schema-BNhqj2AZ.d.mts +1114 -0
- package/dist/drizzle-schema-BNhqj2AZ.d.ts +1114 -0
- package/dist/festivalCard/index.d.mts +75 -0
- package/dist/festivalCard/index.d.ts +75 -0
- package/dist/festivalCard/index.js +1492 -0
- package/dist/festivalCard/index.js.map +1 -0
- package/dist/festivalCard/index.mjs +1475 -0
- package/dist/festivalCard/index.mjs.map +1 -0
- package/dist/festivalCard/server/index.d.mts +120 -0
- package/dist/festivalCard/server/index.d.ts +120 -0
- package/dist/festivalCard/server/index.js +272 -0
- package/dist/festivalCard/server/index.js.map +1 -0
- package/dist/festivalCard/server/index.mjs +265 -0
- package/dist/festivalCard/server/index.mjs.map +1 -0
- package/dist/festivalCardService-CZomuQ4E.d.mts +80 -0
- package/dist/festivalCardService-CZomuQ4E.d.ts +80 -0
- package/dist/index-1Ag7IBXN.d.ts +144 -0
- package/dist/index-DNKZ7-R_.d.mts +184 -0
- package/dist/index-DNKZ7-R_.d.ts +184 -0
- package/dist/index-DSel44Ke.d.mts +93 -0
- package/dist/index-DSel44Ke.d.ts +93 -0
- package/dist/index-DdeZSeTJ.d.mts +144 -0
- package/dist/index-DrPcMJPc.d.mts +250 -0
- package/dist/index-DrPcMJPc.d.ts +250 -0
- package/dist/index.d.mts +5333 -0
- package/dist/index.d.ts +5333 -0
- package/dist/index.js +18809 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +18533 -0
- package/dist/index.mjs.map +1 -0
- package/dist/mikuContest/ui/web/index.d.mts +2 -0
- package/dist/mikuContest/ui/web/index.d.ts +2 -0
- package/dist/mikuContest/ui/web/index.js +353 -0
- package/dist/mikuContest/ui/web/index.js.map +1 -0
- package/dist/mikuContest/ui/web/index.mjs +343 -0
- package/dist/mikuContest/ui/web/index.mjs.map +1 -0
- package/dist/mikuFireworks3D/index.d.mts +268 -0
- package/dist/mikuFireworks3D/index.d.ts +268 -0
- package/dist/mikuFireworks3D/index.js +1267 -0
- package/dist/mikuFireworks3D/index.js.map +1 -0
- package/dist/mikuFireworks3D/index.mjs +1228 -0
- package/dist/mikuFireworks3D/index.mjs.map +1 -0
- package/dist/mikuFusionGame/index.d.mts +117 -0
- package/dist/mikuFusionGame/index.d.ts +117 -0
- package/dist/mikuFusionGame/index.js +1208 -0
- package/dist/mikuFusionGame/index.js.map +1 -0
- package/dist/mikuFusionGame/index.mjs +1195 -0
- package/dist/mikuFusionGame/index.mjs.map +1 -0
- package/dist/mmd/admin/index.d.mts +487 -0
- package/dist/mmd/admin/index.d.ts +487 -0
- package/dist/mmd/admin/index.js +1058 -0
- package/dist/mmd/admin/index.js.map +1 -0
- package/dist/mmd/admin/index.mjs +1027 -0
- package/dist/mmd/admin/index.mjs.map +1 -0
- package/dist/mmd/index.d.mts +2467 -0
- package/dist/mmd/index.d.ts +2467 -0
- package/dist/mmd/index.js +10119 -0
- package/dist/mmd/index.js.map +1 -0
- package/dist/mmd/index.mjs +10028 -0
- package/dist/mmd/index.mjs.map +1 -0
- package/dist/mmd/server/index.d.mts +139 -0
- package/dist/mmd/server/index.d.ts +139 -0
- package/dist/mmd/server/index.js +424 -0
- package/dist/mmd/server/index.js.map +1 -0
- package/dist/mmd/server/index.mjs +404 -0
- package/dist/mmd/server/index.mjs.map +1 -0
- package/dist/music/index.d.mts +74 -0
- package/dist/music/index.d.ts +74 -0
- package/dist/music/index.js +830 -0
- package/dist/music/index.js.map +1 -0
- package/dist/music/index.mjs +809 -0
- package/dist/music/index.mjs.map +1 -0
- package/dist/music/server/index.d.mts +1 -0
- package/dist/music/server/index.d.ts +1 -0
- package/dist/music/server/index.js +194 -0
- package/dist/music/server/index.js.map +1 -0
- package/dist/music/server/index.mjs +182 -0
- package/dist/music/server/index.mjs.map +1 -0
- package/dist/navigation/index.d.mts +93 -0
- package/dist/navigation/index.d.ts +93 -0
- package/dist/navigation/index.js +453 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/navigation/index.mjs +443 -0
- package/dist/navigation/index.mjs.map +1 -0
- package/dist/portfolio/index.d.mts +66 -0
- package/dist/portfolio/index.d.ts +66 -0
- package/dist/portfolio/index.js +736 -0
- package/dist/portfolio/index.js.map +1 -0
- package/dist/portfolio/index.mjs +724 -0
- package/dist/portfolio/index.mjs.map +1 -0
- package/dist/qqbot/server/index.d.mts +216 -0
- package/dist/qqbot/server/index.d.ts +216 -0
- package/dist/qqbot/server/index.js +394 -0
- package/dist/qqbot/server/index.js.map +1 -0
- package/dist/qqbot/server/index.mjs +385 -0
- package/dist/qqbot/server/index.mjs.map +1 -0
- package/dist/qqbot/ui/web/index.d.mts +10 -0
- package/dist/qqbot/ui/web/index.d.ts +10 -0
- package/dist/qqbot/ui/web/index.js +105 -0
- package/dist/qqbot/ui/web/index.js.map +1 -0
- package/dist/qqbot/ui/web/index.mjs +99 -0
- package/dist/qqbot/ui/web/index.mjs.map +1 -0
- package/dist/screenReceiver/index.d.mts +86 -0
- package/dist/screenReceiver/index.d.ts +86 -0
- package/dist/screenReceiver/index.js +281 -0
- package/dist/screenReceiver/index.js.map +1 -0
- package/dist/screenReceiver/index.mjs +273 -0
- package/dist/screenReceiver/index.mjs.map +1 -0
- package/dist/testYourself/admin/index.d.mts +58 -0
- package/dist/testYourself/admin/index.d.ts +58 -0
- package/dist/testYourself/admin/index.js +1009 -0
- package/dist/testYourself/admin/index.js.map +1 -0
- package/dist/testYourself/admin/index.mjs +1002 -0
- package/dist/testYourself/admin/index.mjs.map +1 -0
- package/dist/testYourself/index.d.mts +53 -0
- package/dist/testYourself/index.d.ts +53 -0
- package/dist/testYourself/index.js +2551 -0
- package/dist/testYourself/index.js.map +1 -0
- package/dist/testYourself/index.mjs +2531 -0
- package/dist/testYourself/index.mjs.map +1 -0
- package/dist/testYourself/server/index.d.mts +1029 -0
- package/dist/testYourself/server/index.d.ts +1029 -0
- package/dist/testYourself/server/index.js +825 -0
- package/dist/testYourself/server/index.js.map +1 -0
- package/dist/testYourself/server/index.mjs +816 -0
- package/dist/testYourself/server/index.mjs.map +1 -0
- package/dist/types-BTiaMsBz.d.mts +292 -0
- package/dist/types-DyG3ZV9V.d.mts +270 -0
- package/dist/types-DyG3ZV9V.d.ts +270 -0
- package/dist/types-ERmJyjx8.d.ts +292 -0
- package/dist/types-HorDyIRv.d.mts +303 -0
- package/dist/types-HorDyIRv.d.ts +303 -0
- package/dist/vocaloidBooth/index.d.mts +64 -0
- package/dist/vocaloidBooth/index.d.ts +64 -0
- package/dist/vocaloidBooth/index.js +376 -0
- package/dist/vocaloidBooth/index.js.map +1 -0
- package/dist/vocaloidBooth/index.mjs +362 -0
- package/dist/vocaloidBooth/index.mjs.map +1 -0
- package/dist/vocaloidBooth/server/index.d.mts +111 -0
- package/dist/vocaloidBooth/server/index.d.ts +111 -0
- package/dist/vocaloidBooth/server/index.js +247 -0
- package/dist/vocaloidBooth/server/index.js.map +1 -0
- package/dist/vocaloidBooth/server/index.mjs +237 -0
- package/dist/vocaloidBooth/server/index.mjs.map +1 -0
- package/dist/vocaloidBooth/web/index.d.mts +3 -0
- package/dist/vocaloidBooth/web/index.d.ts +3 -0
- package/dist/vocaloidBooth/web/index.js +376 -0
- package/dist/vocaloidBooth/web/index.js.map +1 -0
- package/dist/vocaloidBooth/web/index.mjs +362 -0
- package/dist/vocaloidBooth/web/index.mjs.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/music/components/MusicPlayer.tsx","../../src/music/components/MikutapMusicPlayer.tsx","../../src/music/constants.ts","../../src/music/adapters/kugou.ts","../../src/music/adapters/netease.ts","../../src/music/adapters/tencent.ts","../../src/music/adapters/xiami.ts","../../src/music/hooks/useMusic.ts","../../src/music/server/meting.ts","../../src/music/server/miku.ts","../../src/music/server/handlers.ts"],"names":["useState","useRef","useEffect","useCallback","React","clsx","useSWR","useMemo","Meting"],"mappings":";;;;;;;;;;;;;;AA0Ce,SAAR,WAAA,CAA6B;AAAA,EAClC,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA,GAAgB,GAAA;AAAA,EAChB,SAAA,GAAY,EAAA;AAAA,EACZ,OAAA,GAAU,KAAA;AAAA,EACV,YAAA,GAAe,KAAA;AAAA,EACf,iBAAA,GAAoB,KAAA;AAAA,EACpB,aAAA,GAAgB,IAAA;AAAA,EAChB,SAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,cAAA,CAAS,kBAAkB,aAAa,CAAA;AACpE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,cAAA,EAA6B;AAEvD,EAAA,MAAM,WAAA,GAAcC,aAAuB,IAAI,CAAA;AAC/C,EAAA,MAAM,SAAA,GAAYA,aAAuB,IAAI,CAAA;AAC7C,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAID,eAAS,KAAK,CAAA;AAClE,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAG9D,EAAAE,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,mBAAmB,MAAA,EAAW;AAChC,MAAA,SAAA,CAAU,cAAc,CAAA;AAAA,IAC1B;AAAA,EACF,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAGnB,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,KAA4B;AAC9C,IAAA,IAAI,CAAC,OAAA,IAAW,KAAA,CAAM,OAAO,GAAG,OAAO,MAAA;AACvC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACpC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACpC,IAAA,OAAQ,OAAQ,GAAA,GAAO,IAAA,CAAK,UAAS,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,EACxD,CAAA;AAGA,EAAA,MAAM,UAAA,GAAaC,kBAAY,MAAM;AACnC,IAAA,MAAA,IAAS;AAAA,EACX,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAA,MAAM,WAAA,GAAcA,kBAAY,MAAM;AACpC,IAAA,OAAA,IAAU;AAAA,EACZ,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,MAAM,UAAA,GAAaA,kBAAY,MAAM;AACnC,IAAA,MAAA,IAAS;AAAA,EACX,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAA,MAAM,kBAAA,GAAqBA,iBAAA,CAAY,CAAC,SAAA,KAAsB;AAC5D,IAAA,MAAM,aAAA,GAAgB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAC,CAAA;AACxD,IAAA,SAAA,CAAU,aAAa,CAAA;AACvB,IAAA,cAAA,GAAiB,aAAa,CAAA;AAAA,EAChC,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAGnB,EAAA,MAAM,UAAA,GAAaA,iBAAA,CAAY,CAAC,IAAA,KAAiB;AAC/C,IAAA,IAAI,CAAC,QAAA,IAAY,KAAA,CAAM,QAAQ,CAAA,EAAG;AAElC,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,QAAA,EAAU,IAAI,CAAC,CAAA;AACrD,IAAA,MAAA,GAAS,QAAQ,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,QAAA,EAAU,MAAM,CAAC,CAAA;AAGrB,EAAA,MAAM,uBAAA,GAA0BA,iBAAA,CAAY,CAAC,CAAA,KAAwB;AACnE,IAAA,IAAI,CAAC,WAAA,CAAY,OAAA,IAAW,CAAC,QAAA,EAAU;AAEvC,IAAA,qBAAA,CAAsB,IAAI,CAAA;AAC1B,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,OAAA,CAAQ,qBAAA,EAAsB;AACvD,IAAA,MAAM,OAAA,GAAA,CAAW,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAC/C,IAAA,MAAM,OAAO,OAAA,GAAU,QAAA;AACvB,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA,EAAG,CAAC,QAAA,EAAU,UAAU,CAAC,CAAA;AAGzB,EAAA,MAAM,qBAAA,GAAwBA,iBAAA,CAAY,CAAC,CAAA,KAAwB;AACjE,IAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AAExB,IAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,OAAA,CAAQ,qBAAA,EAAsB;AACrD,IAAA,MAAM,OAAA,GAAA,CAAW,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAC/C,IAAA,kBAAA,CAAmB,OAAO,CAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,kBAAkB,CAAC,CAAA;AAGvB,EAAAD,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAkB;AACzC,MAAA,IAAI,kBAAA,IAAsB,WAAA,CAAY,OAAA,IAAW,QAAA,EAAU;AACzD,QAAA,MAAM,IAAA,GAAO,WAAA,CAAY,OAAA,CAAQ,qBAAA,EAAsB;AACvD,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AAC7E,QAAA,MAAM,OAAO,OAAA,GAAU,QAAA;AACvB,QAAA,UAAA,CAAW,IAAI,CAAA;AAAA,MACjB;AAEA,MAAA,IAAI,gBAAA,IAAoB,UAAU,OAAA,EAAS;AACzC,QAAA,MAAM,IAAA,GAAO,SAAA,CAAU,OAAA,CAAQ,qBAAA,EAAsB;AACrD,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AAC7E,QAAA,kBAAA,CAAmB,OAAO,CAAA;AAAA,MAC5B;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,gBAAgB,MAAM;AAC1B,MAAA,qBAAA,CAAsB,KAAK,CAAA;AAC3B,MAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,IAC3B,CAAA;AAEA,IAAA,IAAI,sBAAsB,gBAAA,EAAkB;AAC1C,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,eAAe,CAAA;AACtD,MAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAAA,IACpD;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,eAAe,CAAA;AACzD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,aAAa,CAAA;AAAA,IACvD,CAAA;AAAA,EACF,GAAG,CAAC,kBAAA,EAAoB,kBAAkB,QAAA,EAAU,UAAA,EAAY,kBAAkB,CAAC,CAAA;AAGnF,EAAA,MAAM,eAAA,GAAkBC,iBAAA,CAAY,CAAC,CAAA,KAA4B;AAC/D,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,uBACEC,sBAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWC,SAAA,CAAK,wGAAA,EAA0G,SAAS,CAAA;AAAA,QACnI,KAAA,EAAO,EAAE,KAAA,EAAO,iBAAA,GAAoB,UAAU,OAAA,EAAQ;AAAA,QACtD,OAAA,EAAS,eAAA;AAAA,QACT,WAAA,EAAa,eAAA;AAAA,QACb,SAAA,EAAW,eAAA;AAAA,QACX,YAAA,EAAc,eAAA;AAAA,QACd,UAAA,EAAY,eAAA;AAAA,QACZ,aAAA,EAAe,eAAA;AAAA,QACf,WAAA,EAAa;AAAA,OAAA;AAAA,sBAGbD,sBAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAWC,SAAA,CAAK,2BAA2B,iBAAA,GAAoB,uBAAA,GAA0B,EAAE,CAAA,EAAA,kBAE9FD,sBAAA,CAAA,aAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,YAAA,eAAA,CAAgB,CAAC,CAAA;AAAG,YAAA,UAAA,EAAW;AAAA,UAAG,CAAA;AAAA,UACpD,WAAA,EAAa,eAAA;AAAA,UACb,SAAA,EAAW,eAAA;AAAA,UACX,YAAA,EAAc,eAAA;AAAA,UACd,UAAA,EAAY,eAAA;AAAA,UACZ,aAAA,EAAe,eAAA;AAAA,UACf,WAAA,EAAa,eAAA;AAAA,UACb,SAAA,EAAU,4HAAA;AAAA,UACV,KAAA,EAAM;AAAA,SAAA;AAAA,wBAENA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EAAqC;AAAA,OACtD,kBAGAA,sBAAA,CAAA,aAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,YAAA,eAAA,CAAgB,CAAC,CAAA;AAAG,YAAA,SAAA,GAAY,WAAA,KAAgB,UAAA,EAAW;AAAA,UAAG,CAAA;AAAA,UAChF,WAAA,EAAa,eAAA;AAAA,UACb,SAAA,EAAW,eAAA;AAAA,UACX,YAAA,EAAc,eAAA;AAAA,UACd,UAAA,EAAY,eAAA;AAAA,UACZ,aAAA,EAAe,eAAA;AAAA,UACf,WAAA,EAAa,eAAA;AAAA,UACb,SAAA,EAAWC,SAAA,CAAK,8EAAA,EAAgF,SAAA,GAC1F,sHACA,+HAA+H,CAAA;AAAA,UACrI,KAAA,EAAO,YAAY,cAAA,GAAO;AAAA,SAAA;AAAA,QAEzB,4BACCD,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,cAAA,EAAA,kBACbA,sBAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,6BAAA,EAA8B,mBAC7CA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6BAAA,EAA8B,CAC/C,oBAEAA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sHAAA,EAAuH;AAAA,OAG5I,CAAA;AAAA,MAGC,CAAC,iBAAA,oBACAA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAA,kBACbA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAA,EAAwB,WAAE,CAAA,kBACzCA,sBAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,SAAA;AAAA,UACL,SAAA,EAAU,6DAAA;AAAA,UACV,WAAA,EAAa,qBAAA;AAAA,UACb,OAAA,EAAS,eAAA;AAAA,UACT,YAAA,EAAc,eAAA;AAAA,UACd,UAAA,EAAY,eAAA;AAAA,UACZ,aAAA,EAAe,eAAA;AAAA,UACf,WAAA,EAAa;AAAA,SAAA;AAAA,wBAEbA,sBAAA,CAAA,aAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,kEAAA;AAAA,YACV,KAAA,EAAO,EAAE,KAAA,EAAQ,MAAA,GAAS,MAAO,GAAA;AAAI;AAAA,SACtC;AAAA,wBACDA,sBAAA,CAAA,aAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,kHAAA;AAAA,YACV,OAAO,EAAE,IAAA,EAAO,SAAS,GAAA,GAAO,GAAA,EAAK,WAAW,mCAAA;AAAoC;AAAA;AACrF,OAEL;AAAA,KAEJ;AAAA,EAEJ;AAEA,EAAA,uBACEA,sBAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWC,SAAA,CAAK,gFAAA,EAAkF,SAAS,CAAA;AAAA,MAC3G,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,GAAU,UAAU,OAAA,EAAQ;AAAA,MAC5C,OAAA,EAAS,eAAA;AAAA,MACT,WAAA,EAAa,eAAA;AAAA,MACb,SAAA,EAAW,eAAA;AAAA,MACX,YAAA,EAAc,eAAA;AAAA,MACd,UAAA,EAAY,eAAA;AAAA,MACZ,aAAA,EAAe,eAAA;AAAA,MACf,WAAA,EAAa;AAAA,KAAA;AAAA,IAGZ,CAAC,WAAW,aAAA,IAAiB,KAAA,yDAC3B,KAAA,EAAA,EAAI,SAAA,EAAU,0BACbD,sBAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,WAAU,4CAAA,EAAA,EAA8C,KAAA,CAAM,IAAK,CAAA,kBACvEA,sBAAA,CAAA,aAAA,CAAC,OAAE,SAAA,EAAU,uBAAA,EAAA,EAAwB,0BAAI,CAC3C,CAAA;AAAA,IAID,CAAC,OAAA,oBACAA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EAAA,kBACbA,sBAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,WAAA;AAAA,QACL,SAAA,EAAU,6DAAA;AAAA,QACV,WAAA,EAAa,uBAAA;AAAA,QACb,OAAA,EAAS,eAAA;AAAA,QACT,YAAA,EAAc,eAAA;AAAA,QACd,UAAA,EAAY,eAAA;AAAA,QACZ,aAAA,EAAe,eAAA;AAAA,QACf,WAAA,EAAa;AAAA,OAAA;AAAA,sBAEbA,sBAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,8FAAA;AAAA,UACV,KAAA,EAAO,EAAE,KAAA,EAAO,QAAA,GAAW,IAAM,WAAA,GAAc,QAAA,GAAY,GAAA,GAAO,GAAA,GAAM,IAAA;AAAK;AAAA,OAC9E;AAAA,sBACDA,sBAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,kHAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,MAAM,QAAA,GAAW,CAAA,GAAM,WAAA,GAAc,QAAA,GAAY,MAAO,GAAA,GAAM,IAAA;AAAA,YAC9D,SAAA,EAAW;AAAA;AACb;AAAA;AACD,uBAGHA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EAAA,uDACZ,MAAA,EAAA,IAAA,EAAM,UAAA,CAAW,WAAW,CAAE,mBAC/BA,sBAAA,CAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAM,WAAW,QAAQ,CAAE,CAC9B,CACF,CAAA;AAAA,oBAIFA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EAAA,kBAEbA,sBAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,UAAA,eAAA,CAAgB,CAAC,CAAA;AAAG,UAAA,UAAA,EAAW;AAAA,QAAG,CAAA;AAAA,QACpD,WAAA,EAAa,eAAA;AAAA,QACb,SAAA,EAAW,eAAA;AAAA,QACX,YAAA,EAAc,eAAA;AAAA,QACd,UAAA,EAAY,eAAA;AAAA,QACZ,aAAA,EAAe,eAAA;AAAA,QACf,WAAA,EAAa,eAAA;AAAA,QACb,SAAA,EAAU,gIAAA;AAAA,QACV,KAAA,EAAM;AAAA,OAAA;AAAA,sBAENA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAiC;AAAA,KAClD,kBAGAA,sBAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,UAAA,eAAA,CAAgB,CAAC,CAAA;AAAG,UAAA,SAAA,GAAY,WAAA,KAAgB,UAAA,EAAW;AAAA,QAAG,CAAA;AAAA,QAChF,WAAA,EAAa,eAAA;AAAA,QACb,SAAA,EAAW,eAAA;AAAA,QACX,YAAA,EAAc,eAAA;AAAA,QACd,UAAA,EAAY,eAAA;AAAA,QACZ,aAAA,EAAe,eAAA;AAAA,QACf,WAAA,EAAa,eAAA;AAAA,QACb,SAAA,EAAWC,SAAA,CAAK,oFAAA,EAAsF,SAAA,GAChG,sHACA,+HAA+H,CAAA;AAAA,QACrI,KAAA,EAAO,YAAY,cAAA,GAAO;AAAA,OAAA;AAAA,MAEzB,SAAA,mBACCD,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8EAAA,EAA+E,IAC5F,SAAA,mBACFA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EAAA,kBACbA,sBAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,+BAAA,EAAgC,CAAA,kBAC/CA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAAgC,CACjD,CAAA,mBAEAA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qHAAA,EAAsH;AAAA,KAG3I,CAAA;AAAA,IAGC,CAAC,iBAAA,oBACAA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAAA,kBACbA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAA,EAAwB,WAAE,CAAA,kBACzCA,sBAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,SAAA;AAAA,QACL,SAAA,EAAU,6DAAA;AAAA,QACV,WAAA,EAAa,qBAAA;AAAA,QACb,OAAA,EAAS,eAAA;AAAA,QACT,YAAA,EAAc,eAAA;AAAA,QACd,UAAA,EAAY,eAAA;AAAA,QACZ,aAAA,EAAe,eAAA;AAAA,QACf,WAAA,EAAa;AAAA,OAAA;AAAA,sBAEbA,sBAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,kEAAA;AAAA,UACV,KAAA,EAAO,EAAE,KAAA,EAAQ,MAAA,GAAS,MAAO,GAAA;AAAI;AAAA,OACtC;AAAA,sBACDA,sBAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,kHAAA;AAAA,UACV,OAAO,EAAE,IAAA,EAAO,SAAS,GAAA,GAAO,GAAA,EAAK,WAAW,mCAAA;AAAoC;AAAA;AACrF,KACH,kBACAA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EAAA,EACZ,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,GAAG,CAAA,EAAE,GAC5B,CACF,CAAA;AAAA,IAID,KAAA,oBACCA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BACZ,KACH;AAAA,GAEJ;AAEJ;AChXe,SAAR,kBAAA,CAAoC;AAAA,EACzC,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,SAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,WAAA,GAAcH,aAAuB,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAID,eAAS,KAAK,CAAA;AAGlE,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,KAA4B;AAC9C,IAAA,IAAI,CAAC,OAAA,IAAW,KAAA,CAAM,OAAO,GAAG,OAAO,MAAA;AACvC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACpC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACpC,IAAA,OAAQ,OAAQ,GAAA,GAAO,IAAA,CAAK,UAAS,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,EACxD,CAAA;AAGA,EAAA,MAAM,UAAA,GAAaG,kBAAY,MAAM;AACnC,IAAA,MAAA,IAAS;AAAA,EACX,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAA,MAAM,WAAA,GAAcA,kBAAY,MAAM;AACpC,IAAA,OAAA,IAAU;AAAA,EACZ,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,MAAM,UAAA,GAAaA,iBAAAA,CAAY,CAAC,IAAA,KAAiB;AAC/C,IAAA,IAAI,CAAC,QAAA,IAAY,KAAA,CAAM,QAAQ,CAAA,EAAG;AAElC,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,QAAA,EAAU,IAAI,CAAC,CAAA;AACrD,IAAA,MAAA,GAAS,QAAQ,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,QAAA,EAAU,MAAM,CAAC,CAAA;AAGrB,EAAA,MAAM,uBAAA,GAA0BA,iBAAAA,CAAY,CAAC,CAAA,KAAwB;AACnE,IAAA,IAAI,CAAC,WAAA,CAAY,OAAA,IAAW,CAAC,QAAA,EAAU;AAEvC,IAAA,qBAAA,CAAsB,IAAI,CAAA;AAC1B,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,OAAA,CAAQ,qBAAA,EAAsB;AACvD,IAAA,MAAM,OAAA,GAAA,CAAW,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAC/C,IAAA,MAAM,OAAO,OAAA,GAAU,QAAA;AACvB,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA,EAAG,CAAC,QAAA,EAAU,UAAU,CAAC,CAAA;AAGzB,EAAAD,gBAAU,MAAM;AACd,IAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAkB;AACzC,MAAA,IAAI,kBAAA,IAAsB,WAAA,CAAY,OAAA,IAAW,QAAA,EAAU;AACzD,QAAA,MAAM,IAAA,GAAO,WAAA,CAAY,OAAA,CAAQ,qBAAA,EAAsB;AACvD,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AAC7E,QAAA,MAAM,OAAO,OAAA,GAAU,QAAA;AACvB,QAAA,UAAA,CAAW,IAAI,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,gBAAgB,MAAM;AAC1B,MAAA,qBAAA,CAAsB,KAAK,CAAA;AAAA,IAC7B,CAAA;AAEA,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,eAAe,CAAA;AACtD,MAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAAA,IACpD;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,eAAe,CAAA;AACzD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,aAAa,CAAA;AAAA,IACvD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,kBAAA,EAAoB,QAAA,EAAU,UAAU,CAAC,CAAA;AAG7C,EAAA,MAAM,eAAA,GAAkBC,iBAAAA,CAAY,CAAC,CAAA,KAA4B;AAC/D,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACEC,sBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWC,SAAAA,CAAK,4HAAA,EAA8H,SAAS,CAAA;AAAA,MACvJ,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,EAAQ;AAAA,MACxB,OAAA,EAAS,eAAA;AAAA,MACT,WAAA,EAAa,eAAA;AAAA,MACb,SAAA,EAAW,eAAA;AAAA,MACX,YAAA,EAAc,eAAA;AAAA,MACd,UAAA,EAAY,eAAA;AAAA,MACZ,aAAA,EAAe,eAAA;AAAA,MACf,WAAA,EAAa;AAAA,KAAA;AAAA,IAGZ,KAAA,oBACCD,sBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,kBAAA,EAAA,kBACbA,sBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8CAAA,EAAA,EACZ,KAAA,CAAM,IACT,CAAA,kBACAA,sBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAAA,EAA0B,0BAEzC,CACF,CAAA;AAAA,oBAIFA,sBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,0BAAA,EAAA,kBACbA,sBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,UAAA,eAAA,CAAgB,CAAC,CAAA;AAAG,UAAA,SAAA,GAAY,WAAA,KAAgB,UAAA,EAAW;AAAA,QAAG,CAAA;AAAA,QAChF,WAAA,EAAa,eAAA;AAAA,QACb,SAAA,EAAW,eAAA;AAAA,QACX,YAAA,EAAc,eAAA;AAAA,QACd,UAAA,EAAY,eAAA;AAAA,QACZ,aAAA,EAAe,eAAA;AAAA,QACf,WAAA,EAAa,eAAA;AAAA,QACb,SAAA,EAAWC,SAAAA,CAAK,wHAAA,EAA0H,SAAA,GACpI,yIACA,0IAA0I,CAAA;AAAA,QAChJ,KAAA,EAAO,YAAY,cAAA,GAAO;AAAA,OAAA;AAAA,MAEzB,SAAA,mBACCD,sBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EAAA,kBACbA,sBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAAgC,CAAA,kBAC/CA,sBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAAgC,CACjD,CAAA,mBAEAA,sBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qHAAA,EAAsH;AAAA,KAG3I,CAAA;AAAA,oBAGAA,sBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,MAAA,EAAA,kBACbA,sBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,WAAA;AAAA,QACL,SAAA,EAAU,6EAAA;AAAA,QACV,WAAA,EAAa,uBAAA;AAAA,QACb,OAAA,EAAS,eAAA;AAAA,QACT,YAAA,EAAc,eAAA;AAAA,QACd,UAAA,EAAY,eAAA;AAAA,QACZ,aAAA,EAAe,eAAA;AAAA,QACf,WAAA,EAAa;AAAA,OAAA;AAAA,sBAEbA,sBAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,sGAAA;AAAA,UACV,KAAA,EAAO,EAAE,KAAA,EAAO,QAAA,GAAW,IAAM,WAAA,GAAc,QAAA,GAAY,GAAA,GAAO,GAAA,GAAM,IAAA;AAAK;AAAA,OAC9E;AAAA,sBACDA,sBAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,0HAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,MAAM,QAAA,GAAW,CAAA,GAAM,WAAA,GAAc,QAAA,GAAY,MAAO,GAAA,GAAM,IAAA;AAAA,YAC9D,SAAA,EAAW;AAAA;AACb;AAAA;AACD,KACH,kBAEAA,sBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,mDAAA,EAAA,kBACbA,sBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAM,WAAW,WAAW,CAAE,CAAA,kBAC/BA,sBAAAA,CAAA,aAAA,CAAC,cAAM,UAAA,CAAW,QAAQ,CAAE,CAC9B,CACF,CAAA;AAAA,oBAGAA,sBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCACbA,sBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAWC,SAAAA,CAAK,oFAAA,EAAsF,SAAA,GACrG,8DAAA,GACA,wDAAwD,CAAA,EAAA,kBAC5DD,sBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAWC,SAAAA,CAAK,kDAAA,EAAoD,SAAA,GAAY,gCAAgC,aAAa,CAAA,EAAG,CAAA,kBACrID,uBAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAM,YAAY,oBAAA,GAAQ,oBAAM,CACnC,CACF;AAAA,GACF;AAEJ;;;ACnMO,IAAM,oBAAA,GAAuB,OAAA;;;ACD7B,IAAM,YAAA,GAAmC;AAAA,EAC9C,kBAAkB,IAAA,EAAyB;AACzC,IAAA,MAAM,OAAO,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC3D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,IAAA,IAAQ,KAAK,IAAA,EAAM,IAAA,IAAQ,IAAA,CAAK,IAAA,IAAQ,EAAC;AACvE,IAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAM,IAAA,EAAM,SAAS,IAAA,CAAK,IAAA,EAAM,SAAS,IAAA,CAAK,MAAA;AACjE,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAc;AAE9B,QAAA,IAAI,GAAA,GAAM,KAAK,GAAA,IAAO,EAAA;AACtB,QAAA,IAAI,IAAA,CAAK,aAAa,WAAA,EAAa;AACjC,UAAA,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,WAAA,CAAY,OAAA,CAAQ,UAAU,KAAK,CAAA;AAAA,QAC5D;AAEA,QAAA,OAAO;AAAA,UACL,EAAA,EAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,EAAA;AAAA,UACtB,IAAA,EAAM,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,IAAY,SAAA;AAAA,UACxC,MAAA,EAAQ,KAAK,UAAA,IAAc,gBAAA;AAAA,UAC3B,KAAA,EAAO,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,KAAA,IAAS,EAAA;AAAA,UACxC,GAAA;AAAA,UACA,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,MAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAO,KAAK,SAAA,IAAa,CAAA;AAAA,UACzB,QAAA,EAAU,KAAK,MAAA,KAAW;AAAA,SAC5B;AAAA,MACF,CAAC,CAAA;AAAA,MACD;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,gBAAgB,IAAA,EAA0B;AACxC,IAAA,OAAO,KAAK,GAAA,EAAK,GAAA,IAAO,KAAK,GAAA,EAAK,UAAA,GAAa,CAAC,CAAA,IAAK,IAAA;AAAA,EACvD,CAAA;AAAA,EAEA,cAAc,IAAA,EAAgB;AAC5B,IAAA,MAAM,OAAO,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC3D,IAAA,OAAO,IAAA,CAAK,SAAS,IAAA,CAAK,GAAA,IAAO,KAAK,IAAA,EAAM,KAAA,IAAS,KAAK,IAAA,IAAQ,EAAA;AAAA,EACpE;AACF;;;ACtCO,IAAM,cAAA,GAAqC;AAAA,EAChD,kBAAkB,IAAA,EAAyB;AACzC,IAAA,MAAM,OAAO,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC3D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,EAAQ,KAAA,IAAS,IAAA,CAAK,KAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,GAAO,EAAC,CAAA;AAEjF,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAe;AAAA,QAChC,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,MAAA;AAAA,QACnE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,IAAQ,IAAA,CAAK,KAAA;AAAA,QAChC,GAAA,EAAK,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,KAAA,EAAO,MAAA;AAAA,QAC7B,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,MAAA,EAAQ,SAAA;AAAA,QACR,KAAA,EAAO,IAAA,CAAK,GAAA,KAAQ,CAAA,IAAK,KAAK,GAAA,KAAQ,CAAA;AAAA,QACtC,QAAA,EAAU,KAAK,eAAA,KAAoB;AAAA,OACrC,CAAE,CAAA;AAAA,MACF,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,SAAA,IAAa,KAAA,CAAM;AAAA,KACzC;AAAA,EACF,CAAA;AAAA,EAEA,gBAAgB,IAAA,EAAgB;AAC9B,IAAA,MAAM,OAAO,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC3D,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA,GAAO,CAAC,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAC1C,IAAA,OAAO,KAAK,GAAA,IAAO,IAAA;AAAA,EACrB,CAAA;AAAA,EAEA,cAAc,IAAA,EAAgB;AAC5B,IAAA,MAAM,OAAO,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC3D,IAAA,OAAO,KAAK,KAAA,IAAS,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,MAAM,KAAA,IAAS,EAAA;AAAA,EACvD;AACF;;;AChCO,IAAM,cAAA,GAAqC;AAAA,EAChD,kBAAkB,IAAA,EAAyB;AACzC,IAAA,MAAM,OAAO,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAG3D,IAAA,MAAM,QAAA,GAAW,KAAK,IAAA,EAAM,IAAA,EAAM,QAAQ,IAAA,CAAK,IAAA,EAAM,IAAA,IAAQ,IAAA,CAAK,IAAA,IAAQ,IAAA;AAC1E,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,IAAQ,IAAA,CAAK,SAAS,EAAC;AAC7C,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,QAAA,IAAY,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AAEtD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAc;AAE9B,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,GACpC,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAW,EAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAC5C,IAAA,CAAK,SAAS,CAAC,CAAA,EAAG,IAAA,IAAQ,IAAA,CAAK,MAAA,IAAU,SAAA;AAG9C,QAAA,IAAI,MAAM,IAAA,CAAK,GAAA;AACf,QAAA,IAAI,CAAC,GAAA,IAAO,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK;AAC3B,UAAA,GAAA,GAAM,qDAAA,GAAyD,IAAA,CAAK,KAAA,CAAM,GAAA,GAAO,MAAA;AAAA,QACnF;AAEA,QAAA,OAAO;AAAA,UACL,EAAA,EAAI,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA;AAAA,UAChC,IAAA,EAAM,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,SAAS,IAAA,CAAK,QAAA;AAAA,UACtC,MAAA;AAAA,UACA,OAAO,IAAA,CAAK,KAAA,EAAO,IAAA,IAAQ,IAAA,CAAK,aAAa,IAAA,CAAK,KAAA;AAAA,UAClD,KAAK,GAAA,IAAO,EAAA;AAAA,UACZ,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,MAAA,EAAQ,SAAA;AAAA,UACR,KAAA,EAAO,IAAA,CAAK,GAAA,EAAK,QAAA,KAAa,CAAA;AAAA,UAC9B,QAAA,EAAU,IAAA,CAAK,MAAA,EAAQ,MAAA,KAAW;AAAA,SACpC;AAAA,MACF,CAAC,CAAA;AAAA,MACD;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,gBAAgB,IAAA,EAA0B;AAExC,IAAA,MAAM,IAAA,GAAQ,IAAA;AAEd,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,GAAA;AACzB,IAAA,IAAI,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,OAAO,EAAE,CAAC,CAAA;AACrC,IAAA,OAAA,CAAQ,GAAA,CAAI,aAAa,QAAQ,CAAA;AACnC,IAAA,OAAO,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,GAAI,WAAW,SAAA,GAAa,QAAA;AAAA,EAC/D,CAAA;AAAA,EAEA,cAAc,IAAA,EAAgB;AAC5B,IAAA,MAAM,OAAO,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC3D,IAAA,OAAO,KAAK,KAAA,IAAS,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,MAAM,KAAA,IAAS,EAAA;AAAA,EACvD;AACF;;;ACrDO,IAAM,YAAA,GAAmC;AAAA,EAC9C,kBAAkB,IAAA,EAAyB;AACzC,IAAA,MAAM,OAAO,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAE3D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,EAAM,MAAA,IAAU,KAAK,MAAA,IAAU,IAAA;AACnD,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,KAAU,KAAA,CAAM,QAAQ,IAAI,CAAA,GAAI,OAAO,EAAC,CAAA;AAE7D,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAe;AAAA,QAChC,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,QAAA,EAAS,IAAK,EAAA;AAAA,QAC3B,IAAA,EAAM,KAAK,IAAA,IAAQ,SAAA;AAAA,QACnB,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,EAAE,CAAA,GACzB,KAAK,EAAA,CAAG,GAAA,CAAI,CAAC,CAAA,KAAW,EAAE,IAAI,CAAA,CAAE,KAAK,IAAI,CAAA,GACxC,KAAK,MAAA,IAAU,gBAAA;AAAA,QACpB,KAAA,EAAO,IAAA,CAAK,EAAA,EAAI,IAAA,IAAQ,KAAK,KAAA,IAAS,EAAA;AAAA,QACtC,GAAA,EAAK,IAAA,CAAK,EAAA,EAAI,MAAA,IAAU,KAAK,GAAA,IAAO,EAAA;AAAA,QACpC,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,MAAA,EAAQ,OAAA;AAAA;AAAA,QAER,KAAA,EAAO,IAAA,CAAK,GAAA,KAAQ,CAAA,IAAK,KAAK,GAAA,KAAQ,CAAA;AAAA,QACtC,QAAA,EAAU,KAAK,SAAA,KAAc;AAAA,OAC/B,CAAE,CAAA;AAAA,MACF,KAAA,EAAO,MAAA,CAAO,SAAA,IAAa,KAAA,CAAM;AAAA,KACnC;AAAA,EACF,CAAA;AAAA,EAEA,gBAAgB,IAAA,EAAgB;AAC9B,IAAA,MAAM,OAAO,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAE3D,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,GAAO,CAAC,KAAK,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AACvD,IAAA,OAAO,KAAK,GAAA,IAAO,IAAA;AAAA,EACrB,CAAA;AAAA,EAEA,cAAc,IAAA,EAAgB;AAC5B,IAAA,MAAM,OAAO,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC3D,IAAA,OAAO,IAAA,CAAK,SAAS,IAAA,CAAK,GAAA,IAAO,KAAK,IAAA,EAAM,KAAA,IAAS,KAAK,IAAA,IAAQ,EAAA;AAAA,EACpE;AACF;;;AC7BA,IAAM,OAAA,GAAU,CAAC,GAAA,KAAgB,KAAA,CAAM,GAAG,EAAE,IAAA,CAAK,CAAA,GAAA,KAAO,GAAA,CAAI,IAAA,EAAM,CAAA;AAElE,IAAM,QAAA,GAA+C;AAAA,EACnD,KAAA,EAAO,YAAA;AAAA,EACP,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,KAAA,EAAO;AACT,CAAA;AAEO,SAAS,QAAA,GAAW;AACzB,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIJ,eAA+B,IAAI,CAAA;AAG7E,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,WAAA,EAAa,SAAA,EAAW,aAAY,GAAIM,uBAAA;AAAA,IACpE,aAAA,GAAgB,+BAAgC,kBAAA,CAAmB,aAAA,CAAc,OAAO,CAAA,GAAK,UAAA,IAAc,cAAc,MAAA,IAAU,oBAAA,CAAA,GAAwB,aAAa,aAAA,CAAc,KAAA,IAAS,MAAM,UAAA,IAAc,aAAA,CAAc,UAAU,CAAA,CAAA,IAAM,aAAA,CAAc,IAAA,GAAO,YAAA,GAAe,EAAA,CAAA,GAAM,IAAA;AAAA,IAC3R;AAAA,GACF;AAEA,EAAA,MAAM,YAAA,GAAeC,cAAQ,MAAM;AACjC,IAAA,IAAI,CAAC,OAAA,EAAS,IAAA,IAAQ,CAAC,eAAe,OAAO,MAAA;AAC7C,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,MAAA,IAAU,oBAAoB,CAAA;AACrE,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,OAAA,CAAQ,iBAAA,CAAkB,OAAA,CAAQ,IAAI,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,OAAA,EAAS,aAAa,CAAC,CAAA;AAE3B,EAAA,MAAM,MAAA,GAASJ,iBAAAA,CAAY,CAAC,OAAA,KAA2B;AACrD,IAAA,gBAAA,CAAiB,OAAO,CAAA;AAAA,EAC1B,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,UAAA,GAAaA,iBAAAA,CAAY,OAAO,EAAA,EAAY,SAAiB,oBAAA,KAAsD;AACvH,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,KAAA,CAAM,oBAAA,GAAwB,EAAA,GAAM,aAAc,MAAO,CAAA;AAC3E,MAAA,MAAM,IAAA,GAA8B,MAAM,GAAA,CAAI,IAAA,EAAK;AACnD,MAAA,MAAM,OAAA,GAAU,SAAS,MAAM,CAAA;AAC/B,MAAA,OAAA,CAAQ,GAAA,CAAI,OAAA,EAAS,IAAA,CAAK,IAAA,EAAK,QAAO,OAAO,CAAA;AAC7C,MAAA,IAAI,OAAA,IAAW,KAAK,IAAA,EAAM;AACxB,QAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,EAAe,IAAA,CAAK,IAAI,CAAA;AACpC,QAAA,OAAO,OAAA,CAAQ,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA,CAAA;AAAA,MAC/C;AACA,MAAA,OAAO,KAAK,IAAA,EAAM,GAAA;AAAA,IACpB,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,GAAG,CAAA;AACpD,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,QAAA,GAAWA,iBAAAA,CAAY,OAAO,EAAA,EAAY,SAAiB,oBAAA,KAAsD;AACrH,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,KAAA,CAAM,sBAAA,GAA0B,EAAA,GAAM,aAAc,MAAO,CAAA;AAC7E,MAAA,MAAM,IAAA,GAA8B,MAAM,GAAA,CAAI,IAAA,EAAK;AACnD,MAAA,MAAM,OAAA,GAAU,SAAS,MAAM,CAAA;AAC/B,MAAA,IAAI,OAAA,IAAW,KAAK,IAAA,EAAM;AACxB,QAAA,OAAO,OAAA,CAAQ,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AAAA,MACxC;AACA,MAAA,OAAO,KAAK,IAAA,EAAM,KAAA;AAAA,IACpB,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,GAAG,CAAA;AACjD,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;AC9EO,IAAM,gBAAN,MAAoB;AAAA,EAApB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,SAAA,uBAAkC,GAAA,EAAI;AAAA,EAAA;AAAA,EAEtC,YAAY,MAAA,EAAgB;AAClC,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA,EAAG;AAC/B,MAAA,IAAA,CAAK,UAAU,GAAA,CAAI,MAAA,EAAQ,IAAIK,uBAAA,CAAO,MAAM,CAAC,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,OAAA,EAAsC;AACjD,IAAA,MAAM,EAAE,SAAS,MAAA,GAAS,oBAAA,EAAsB,QAAQ,EAAA,EAAI,MAAA,GAAS,GAAE,GAAI,OAAA;AAC3E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAItC,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,MAAA,CAAO,OAAA,EAAS;AAAA,MAC5C,KAAA;AAAA,MACA,MAAM,MAAA,GAAS;AAAA,KAChB,CAAA;AAED,IAAA,IAAI;AACF,MAAA,OAAO,OAAO,QAAA,KAAa,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,GAAI,QAAA;AAAA,IAC/D,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CAAW,EAAA,EAAY,MAAA,GAAiB,oBAAA,EAAgD;AAC5F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AACtC,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AACrC,IAAA,IAAI;AACF,MAAA,OAAO,OAAO,QAAA,KAAa,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,GAAI,QAAA;AAAA,IAC/D,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,EAAA,EAAY,MAAA,GAAiB,oBAAA,EAAgD;AAC1F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AACtC,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA;AACtC,IAAA,IAAI;AACF,MAAA,OAAO,OAAO,QAAA,KAAa,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,GAAI,QAAA;AAAA,IAC/D,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,EACF;AACF;AAEO,IAAM,YAAA,GAAe,IAAI,aAAA;;;AC1DzB,IAAM,mBAAN,MAAuB;AAAA,EAI5B,WAAA,CAAY,cAA6B,YAAA,EAAc;AAFvD,IAAA,IAAA,CAAQ,YAAA,GAAe,CAAC,0BAAA,EAAQ,MAAA,EAAQ,YAAY,MAAM,CAAA;AAGxD,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,OAAA,EAAsC;AACjD,IAAA,MAAM,EAAE,SAAS,MAAA,GAAS,oBAAA,EAAsB,QAAQ,EAAA,EAAI,MAAA,GAAS,GAAE,GAAI,OAAA;AAE3E,IAAA,MAAM,cAAA,GAAiB,QAAQ,IAAA,EAAK;AAGpC,IAAA,MAAM,cAAA,GAAiB,KAAK,YAAA,CAAa,IAAA;AAAA,MAAK,OAC5C,cAAA,CAAe,WAAA,GAAc,QAAA,CAAS,CAAA,CAAE,aAAa;AAAA,KACvD;AAIA,IAAA,MAAM,WAAA,GAAc,cAAA,GAAiB,cAAA,GAAkB,cAAA,GAAkB,4BAAQ,IAAA,EAAK;AAEtF,IAAA,OAAO,IAAA,CAAK,YAAY,MAAA,CAAO;AAAA,MAC7B,GAAG,OAAA;AAAA,MACH,SAAS,WAAA,IAAe;AAAA;AAAA,KACzB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CAAW,EAAA,EAAY,MAAA,GAAiB,oBAAA,EAAgD;AAC5F,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,EAAA,EAAI,MAAM,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,EAAA,EAAY,MAAA,GAAiB,oBAAA,EAAgD;AAC1F,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,QAAA,CAAS,EAAA,EAAI,MAAM,CAAA;AAAA,EAC7C;AACF;AAEO,IAAM,gBAAA,GAAmB,IAAI,gBAAA;;;AC7C7B,IAAM,sBAAsB,MAAM;AAEvC,EAAA,OAAO,OAAO,GAAA,KAAoC;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,YAAA,EAAa,GAAI,IAAI,GAAA,CAAI,IAAI,GAAG,CAAA;AACxC,MAAA,MAAM,OAAA,GAAU,YAAA,CAAa,GAAA,CAAI,SAAS,CAAA;AAC1C,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,IAAK,oBAAA;AAC7C,MAAA,MAAM,QAAQ,QAAA,CAAS,YAAA,CAAa,GAAA,CAAI,OAAO,KAAK,IAAI,CAAA;AACxD,MAAA,MAAM,SAAS,QAAA,CAAS,YAAA,CAAa,GAAA,CAAI,QAAQ,KAAK,GAAG,CAAA;AACzD,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,KAAM,MAAA;AAE1C,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,IAAA,EAAM;AACrB,QAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,EAAK,OAAA,EAAS,qBAAA,EAAsB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,MACrF;AAEA,MAAA,MAAM,OAAA,GAAU,OAAO,gBAAA,GAAmB,YAAA;AAC1C,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,CAAO;AAAA,QAClC,SAAS,OAAA,IAAW,EAAA;AAAA,QACpB,MAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,OAAO,SAAS,IAAA,CAAK;AAAA,QACnB,IAAA,EAAM,GAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,OAAO,SAAS,IAAA,CAAK;AAAA,QACnB,IAAA,EAAM,GAAA;AAAA,QACN,OAAA,EAAS,MAAM,OAAA,IAAW;AAAA,OAC5B,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AACF;AAKO,IAAM,uBAAuB,MAAM;AACxC,EAAA,OAAO,OAAO,GAAA,KAAoC;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,YAAA,EAAa,GAAI,IAAI,GAAA,CAAI,IAAI,GAAG,CAAA;AACxC,MAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AAChC,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,IAAK,oBAAA;AAE7C,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,EAAK,OAAA,EAAS,gBAAA,EAAiB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,MAChF;AAEA,MAAA,MAAM,GAAA,GAAM,MAAM,YAAA,CAAa,UAAA,CAAW,IAAI,MAAM,CAAA;AAEpD,MAAA,OAAO,SAAS,IAAA,CAAK;AAAA,QACnB,IAAA,EAAM,GAAA;AAAA,QACN,IAAA,EAAM,EAAE,GAAA;AAAI,OACb,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,MAAA,OAAO,SAAS,IAAA,CAAK;AAAA,QACnB,IAAA,EAAM,GAAA;AAAA,QACN,OAAA,EAAS,MAAM,OAAA,IAAW;AAAA,OAC5B,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AACF;AAKO,IAAM,qBAAqB,MAAM;AACtC,EAAA,OAAO,OAAO,GAAA,KAAoC;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,YAAA,EAAa,GAAI,IAAI,GAAA,CAAI,IAAI,GAAG,CAAA;AACxC,MAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AAChC,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,IAAK,oBAAA;AAE7C,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,EAAK,OAAA,EAAS,gBAAA,EAAiB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,MAChF;AAEA,MAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,QAAA,CAAS,IAAI,MAAM,CAAA;AAEpD,MAAA,OAAO,SAAS,IAAA,CAAK;AAAA,QACnB,IAAA,EAAM,GAAA;AAAA,QACN,IAAA,EAAM,EAAE,KAAA;AAAM,OACf,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,MAAA,OAAO,SAAS,IAAA,CAAK;AAAA,QACnB,IAAA,EAAM,GAAA;AAAA,QACN,OAAA,EAAS,MAAM,OAAA,IAAW;AAAA,OAC5B,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AACF","file":"index.js","sourcesContent":["'use client';\n\nimport React, { useState, useEffect, useRef, useCallback } from 'react';\nimport { clsx } from 'clsx';\n\nexport interface MusicPlayerState {\n isPlaying: boolean;\n currentTime: number;\n duration: number;\n volume: number;\n isLoading: boolean;\n error?: string;\n}\n\nexport interface PlayerMusicTrack {\n id: string;\n name: string;\n file: string;\n duration?: number;\n volume?: number;\n}\n\nexport interface MusicPlayerProps {\n track?: PlayerMusicTrack;\n onPlay?: () => void; // 新增播放回调\n onPause?: () => void;\n onStop?: () => void;\n onVolumeChange?: (volume: number) => void;\n onSeek?: (time: number) => void;\n initialVolume?: number;\n className?: string;\n compact?: boolean;\n ultraCompact?: boolean; // 超级紧缩模式,只显示播放控制和音量\n hideVolumeControl?: boolean; // 隐藏音量控制模块\n showTrackInfo?: boolean;\n // 外部状态控制 - 必需的props\n isPlaying: boolean; // 外部播放状态\n currentTime: number; // 外部当前时间\n duration: number; // 外部总时长\n externalVolume?: number; // 外部音量状态\n}\n\nexport default function MusicPlayer({\n track,\n onPlay,\n onPause,\n onStop,\n onVolumeChange,\n onSeek,\n initialVolume = 0.7,\n className = '',\n compact = false,\n ultraCompact = false,\n hideVolumeControl = false,\n showTrackInfo = true,\n isPlaying,\n currentTime,\n duration,\n externalVolume\n}: MusicPlayerProps) {\n const [volume, setVolume] = useState(externalVolume ?? initialVolume);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | undefined>();\n\n const progressRef = useRef<HTMLDivElement>(null);\n const volumeRef = useRef<HTMLDivElement>(null);\n const [isDraggingProgress, setIsDraggingProgress] = useState(false);\n const [isDraggingVolume, setIsDraggingVolume] = useState(false);\n\n // 同步外部音量状态\n useEffect(() => {\n if (externalVolume !== undefined) {\n setVolume(externalVolume);\n }\n }, [externalVolume]);\n\n // 格式化时间显示\n const formatTime = (seconds: number): string => {\n if (!seconds || isNaN(seconds)) return '0:00';\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return (mins) + ':' + (secs.toString().padStart(2, '0'));\n };\n\n // 播放控制\n const handlePlay = useCallback(() => {\n onPlay?.();\n }, [onPlay]);\n\n // 暂停控制\n const handlePause = useCallback(() => {\n onPause?.();\n }, [onPause]);\n\n // 停止控制\n const handleStop = useCallback(() => {\n onStop?.();\n }, [onStop]);\n\n // 音量控制\n const handleVolumeChange = useCallback((newVolume: number) => {\n const clampedVolume = Math.max(0, Math.min(1, newVolume));\n setVolume(clampedVolume);\n onVolumeChange?.(clampedVolume);\n }, [onVolumeChange]);\n\n // 进度控制\n const handleSeek = useCallback((time: number) => {\n if (!duration || isNaN(duration)) return;\n \n const seekTime = Math.max(0, Math.min(duration, time));\n onSeek?.(seekTime);\n }, [duration, onSeek]);\n\n // 鼠标拖拽进度条\n const handleProgressMouseDown = useCallback((e: React.MouseEvent) => {\n if (!progressRef.current || !duration) return;\n \n setIsDraggingProgress(true);\n const rect = progressRef.current.getBoundingClientRect();\n const percent = (e.clientX - rect.left) / rect.width;\n const time = percent * duration;\n handleSeek(time);\n }, [duration, handleSeek]);\n\n // 鼠标拖拽音量条\n const handleVolumeMouseDown = useCallback((e: React.MouseEvent) => {\n if (!volumeRef.current) return;\n \n setIsDraggingVolume(true);\n const rect = volumeRef.current.getBoundingClientRect();\n const percent = (e.clientX - rect.left) / rect.width;\n handleVolumeChange(percent);\n }, [handleVolumeChange]);\n\n // 处理拖拽事件\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (isDraggingProgress && progressRef.current && duration) {\n const rect = progressRef.current.getBoundingClientRect();\n const percent = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n const time = percent * duration;\n handleSeek(time);\n }\n \n if (isDraggingVolume && volumeRef.current) {\n const rect = volumeRef.current.getBoundingClientRect();\n const percent = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n handleVolumeChange(percent);\n }\n };\n\n const handleMouseUp = () => {\n setIsDraggingProgress(false);\n setIsDraggingVolume(false);\n };\n\n if (isDraggingProgress || isDraggingVolume) {\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isDraggingProgress, isDraggingVolume, duration, handleSeek, handleVolumeChange]);\n\n // 阻止事件传播的通用处理器\n const stopPropagation = useCallback((e: React.SyntheticEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n // 如果是超级紧缩模式\n if (ultraCompact) {\n return (\n <div \n className={clsx('flex items-center gap-2 bg-white/90 backdrop-blur-sm rounded-xl p-2 shadow-lg border border-purple-200', className)}\n style={{ width: hideVolumeControl ? '120px' : '192px' }}\n onClick={stopPropagation}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n >\n {/* 控制按钮 */}\n <div className={clsx('flex items-center gap-1', hideVolumeControl ? 'w-full justify-center' : '')}>\n {/* 停止按钮 */}\n <button\n onClick={(e) => { stopPropagation(e); handleStop(); }}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n className=\"w-7 h-7 rounded-lg bg-gray-100 hover:bg-gray-200 border border-gray-300 flex items-center justify-center transition-colors\"\n title=\"停止\"\n >\n <div className=\"w-2.5 h-2.5 bg-gray-600 rounded-sm\"></div>\n </button>\n\n {/* 播放/暂停按钮 */}\n <button\n onClick={(e) => { stopPropagation(e); isPlaying ? handlePause() : handlePlay(); }}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n className={clsx('w-8 h-8 rounded-lg border flex items-center justify-center transition-colors', isPlaying \n ? 'bg-gradient-to-r from-purple-500 to-pink-500 hover:from-purple-600 hover:to-pink-600 text-white border-purple-400' \n : 'bg-gradient-to-r from-green-500 to-blue-500 hover:from-green-600 hover:to-blue-600 text-white border-green-400 cursor-pointer')}\n title={isPlaying ? \"暂停\" : \"播放\"}\n >\n {isPlaying ? (\n <div className=\"flex gap-0.5\">\n <div className=\"w-1 h-3 bg-white rounded-sm\"></div>\n <div className=\"w-1 h-3 bg-white rounded-sm\"></div>\n </div>\n ) : (\n <div className=\"w-0 h-0 border-l-[6px] border-l-white border-t-[4px] border-t-transparent border-b-[4px] border-b-transparent ml-0.5\"></div>\n )}\n </button>\n </div>\n\n {/* 音量控制 */}\n {!hideVolumeControl && (\n <div className=\"flex items-center gap-1 flex-1\">\n <div className=\"text-gray-500 text-xs\">🔊</div>\n <div \n ref={volumeRef}\n className=\"flex-1 h-2 bg-gray-200 rounded-full cursor-pointer relative\"\n onMouseDown={handleVolumeMouseDown}\n onClick={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n >\n <div \n className=\"h-full bg-gradient-to-r from-purple-400 to-pink-400 rounded-full\"\n style={{ width: (volume * 100) + '%' }}\n ></div>\n <div \n className=\"absolute top-1/2 w-3 h-3 bg-white border-2 border-purple-400 rounded-full transform -translate-y-1/2 cursor-grab\"\n style={{ left: (volume * 100) + '%', transform: 'translateX(-50%) translateY(-50%)' }}\n ></div>\n </div>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div \n className={clsx('bg-white/90 backdrop-blur-sm rounded-xl p-4 shadow-lg border border-purple-200', className)}\n style={{ width: compact ? '280px' : '320px' }}\n onClick={stopPropagation}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n >\n {/* 音乐信息 */}\n {!compact && showTrackInfo && track && (\n <div className=\"mb-3\">\n <h3 className=\"text-sm font-medium text-gray-800 truncate\">{track.name}</h3>\n <p className=\"text-xs text-gray-500\">背景音乐</p>\n </div>\n )}\n\n {/* 进度条 */}\n {!compact && (\n <div className=\"mb-3\">\n <div \n ref={progressRef}\n className=\"w-full h-2 bg-gray-200 rounded-full cursor-pointer relative\"\n onMouseDown={handleProgressMouseDown}\n onClick={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n >\n <div \n className=\"h-full bg-gradient-to-r from-purple-400 to-pink-400 rounded-full transition-all duration-100\"\n style={{ width: duration > 0 ? ((currentTime / duration) * 100) + '%' : '0%' }}\n ></div>\n <div \n className=\"absolute top-1/2 w-4 h-4 bg-white border-2 border-purple-400 rounded-full transform -translate-y-1/2 cursor-grab\"\n style={{ \n left: duration > 0 ? ((currentTime / duration) * 100) + '%' : '0%',\n transform: 'translateX(-50%) translateY(-50%)'\n }}\n ></div>\n </div>\n \n <div className=\"flex justify-between text-xs text-gray-500 mt-1\">\n <span>{formatTime(currentTime)}</span>\n <span>{formatTime(duration)}</span>\n </div>\n </div>\n )}\n\n {/* 控制按钮 */}\n <div className=\"flex items-center justify-center gap-3 mb-3\">\n {/* 停止按钮 */}\n <button\n onClick={(e) => { stopPropagation(e); handleStop(); }}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n className=\"w-10 h-10 rounded-full bg-gray-100 hover:bg-gray-200 border border-gray-300 flex items-center justify-center transition-colors\"\n title=\"停止\"\n >\n <div className=\"w-4 h-4 bg-gray-600 rounded-sm\"></div>\n </button>\n\n {/* 播放/暂停按钮 */}\n <button\n onClick={(e) => { stopPropagation(e); isPlaying ? handlePause() : handlePlay(); }}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n className={clsx('w-12 h-12 rounded-full border-2 flex items-center justify-center transition-colors', isPlaying \n ? 'bg-gradient-to-r from-purple-500 to-pink-500 hover:from-purple-600 hover:to-pink-600 text-white border-purple-400' \n : 'bg-gradient-to-r from-green-500 to-blue-500 hover:from-green-600 hover:to-blue-600 text-white border-green-400 cursor-pointer')}\n title={isPlaying ? \"暂停\" : \"播放\"}\n >\n {isLoading ? (\n <div className=\"w-5 h-5 border-2 border-white border-t-transparent rounded-full animate-spin\"></div>\n ) : isPlaying ? (\n <div className=\"flex gap-1\">\n <div className=\"w-1.5 h-4 bg-white rounded-sm\"></div>\n <div className=\"w-1.5 h-4 bg-white rounded-sm\"></div>\n </div>\n ) : (\n <div className=\"w-0 h-0 border-l-[10px] border-l-white border-t-[7px] border-t-transparent border-b-[7px] border-b-transparent ml-1\"></div>\n )}\n </button>\n </div>\n\n {/* 音量控制 */}\n {!hideVolumeControl && (\n <div className=\"flex items-center gap-3\">\n <div className=\"text-gray-500 text-sm\">🔊</div>\n <div \n ref={volumeRef}\n className=\"flex-1 h-2 bg-gray-200 rounded-full cursor-pointer relative\"\n onMouseDown={handleVolumeMouseDown}\n onClick={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n >\n <div \n className=\"h-full bg-gradient-to-r from-purple-400 to-pink-400 rounded-full\"\n style={{ width: (volume * 100) + '%' }}\n ></div>\n <div \n className=\"absolute top-1/2 w-4 h-4 bg-white border-2 border-purple-400 rounded-full transform -translate-y-1/2 cursor-grab\"\n style={{ left: (volume * 100) + '%', transform: 'translateX(-50%) translateY(-50%)' }}\n ></div>\n </div>\n <div className=\"text-xs text-gray-500 w-8 text-right\">\n {Math.round(volume * 100)}%\n </div>\n </div>\n )}\n\n {/* 错误信息 */}\n {error && (\n <div className=\"mt-2 text-xs text-red-500\">\n {error}\n </div>\n )}\n </div>\n );\n}","'use client';\n\nimport React, { useState, useEffect, useRef, useCallback } from 'react';\nimport { clsx } from 'clsx';\n\nexport interface MikutapMusicTrack {\n id: string;\n name: string;\n audioUrl: string;\n audioData?: string;\n duration?: number;\n}\n\nexport interface MikutapMusicPlayerProps {\n track?: MikutapMusicTrack;\n onPlay?: () => void;\n onPause?: () => void;\n onSeek?: (time: number) => void;\n className?: string;\n // 外部状态控制\n isPlaying: boolean;\n currentTime: number;\n duration: number;\n}\n\nexport default function MikutapMusicPlayer({\n track,\n onPlay,\n onPause,\n onSeek,\n className = '',\n isPlaying,\n currentTime,\n duration,\n}: MikutapMusicPlayerProps) {\n const progressRef = useRef<HTMLDivElement>(null);\n const [isDraggingProgress, setIsDraggingProgress] = useState(false);\n\n // 格式化时间显示\n const formatTime = (seconds: number): string => {\n if (!seconds || isNaN(seconds)) return '0:00';\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return (mins) + ':' + (secs.toString().padStart(2, '0'));\n };\n\n // 播放控制\n const handlePlay = useCallback(() => {\n onPlay?.();\n }, [onPlay]);\n\n // 暂停控制\n const handlePause = useCallback(() => {\n onPause?.();\n }, [onPause]);\n\n // 进度控制\n const handleSeek = useCallback((time: number) => {\n if (!duration || isNaN(duration)) return;\n \n const seekTime = Math.max(0, Math.min(duration, time));\n onSeek?.(seekTime);\n }, [duration, onSeek]);\n\n // 鼠标拖拽进度条\n const handleProgressMouseDown = useCallback((e: React.MouseEvent) => {\n if (!progressRef.current || !duration) return;\n \n setIsDraggingProgress(true);\n const rect = progressRef.current.getBoundingClientRect();\n const percent = (e.clientX - rect.left) / rect.width;\n const time = percent * duration;\n handleSeek(time);\n }, [duration, handleSeek]);\n\n // 处理拖拽事件\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (isDraggingProgress && progressRef.current && duration) {\n const rect = progressRef.current.getBoundingClientRect();\n const percent = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n const time = percent * duration;\n handleSeek(time);\n }\n };\n\n const handleMouseUp = () => {\n setIsDraggingProgress(false);\n };\n\n if (isDraggingProgress) {\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isDraggingProgress, duration, handleSeek]);\n\n // 阻止事件传播的通用处理器\n const stopPropagation = useCallback((e: React.SyntheticEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n return (\n <div \n className={clsx('bg-gradient-to-r from-purple-900/95 to-pink-900/95 backdrop-blur-sm rounded-2xl p-4 shadow-2xl border border-purple-300/30', className)}\n style={{ width: '200px' }}\n onClick={stopPropagation}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n >\n {/* 音乐信息 */}\n {track && (\n <div className=\"mb-3 text-center\">\n <div className=\"text-white text-sm font-medium truncate mb-1\">\n {track.name}\n </div>\n <div className=\"text-purple-200 text-xs\">\n 背景音乐\n </div>\n </div>\n )}\n\n {/* 播放/暂停按钮 */}\n <div className=\"flex justify-center mb-3\">\n <button\n onClick={(e) => { stopPropagation(e); isPlaying ? handlePause() : handlePlay(); }}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n className={clsx('w-12 h-12 rounded-full border-2 flex items-center justify-center transition-all duration-300 shadow-lg hover:scale-105', isPlaying \n ? 'bg-gradient-to-r from-orange-400 to-red-500 hover:from-orange-500 hover:to-red-600 text-white border-orange-300 shadow-orange-500/50' \n : 'bg-gradient-to-r from-green-400 to-emerald-500 hover:from-green-500 hover:to-emerald-600 text-white border-green-300 shadow-green-500/50')}\n title={isPlaying ? \"暂停\" : \"播放\"}\n >\n {isPlaying ? (\n <div className=\"flex gap-1\">\n <div className=\"w-1.5 h-4 bg-white rounded-sm\"></div>\n <div className=\"w-1.5 h-4 bg-white rounded-sm\"></div>\n </div>\n ) : (\n <div className=\"w-0 h-0 border-l-[10px] border-l-white border-t-[7px] border-t-transparent border-b-[7px] border-b-transparent ml-1\"></div>\n )}\n </button>\n </div>\n\n {/* 进度条 */}\n <div className=\"mb-2\">\n <div \n ref={progressRef}\n className=\"w-full h-2 bg-white/20 rounded-full cursor-pointer relative overflow-hidden\"\n onMouseDown={handleProgressMouseDown}\n onClick={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n >\n <div \n className=\"h-full bg-gradient-to-r from-cyan-400 to-blue-500 rounded-full transition-all duration-100 shadow-sm\"\n style={{ width: duration > 0 ? ((currentTime / duration) * 100) + '%' : '0%' }}\n ></div>\n <div \n className=\"absolute top-1/2 w-3 h-3 bg-white border-2 border-cyan-400 rounded-full transform -translate-y-1/2 cursor-grab shadow-lg\"\n style={{ \n left: duration > 0 ? ((currentTime / duration) * 100) + '%' : '0%',\n transform: 'translateX(-50%) translateY(-50%)'\n }}\n ></div>\n </div>\n \n <div className=\"flex justify-between text-xs text-purple-200 mt-1\">\n <span>{formatTime(currentTime)}</span>\n <span>{formatTime(duration)}</span>\n </div>\n </div>\n\n {/* 状态指示器 */}\n <div className=\"flex justify-center\">\n <div className={clsx('flex items-center gap-2 text-xs px-3 py-1 rounded-full transition-all duration-300', isPlaying \n ? 'bg-orange-500/20 text-orange-200 border border-orange-400/30' \n : 'bg-gray-500/20 text-gray-300 border border-gray-400/30')}>\n <div className={clsx('w-2 h-2 rounded-full transition-all duration-300', isPlaying ? 'bg-orange-400 animate-pulse' : 'bg-gray-400')}></div>\n <span>{isPlaying ? '播放中' : '已暂停'}</span>\n </div>\n </div>\n </div>\n );\n} ","/**\n * 音乐模块常量定义\n */\n\nexport const DEFAULT_MUSIC_SOURCE = 'kugou';\n\nexport const MUSIC_SOURCES = [\n // 'netease', \n // 'tencent',\n 'kugou',\n // 'xiami',\n] as const;\n\nexport type MusicSource = (typeof MUSIC_SOURCES)[number];\n\nexport const MUSIC_SOURCE_NAMES: Record<MusicSource, string> = {\n // netease: '网易云',\n // tencent: '腾讯音乐',\n kugou: '酷狗音乐',\n // xiami: '虾米音乐',\n};\n\n","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const kugouAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n const info = root.data?.data?.info || root.data?.info || root.info || [];\n const total = root.data?.data?.total || root.data?.total || info.length;\n return {\n tracks: info.map((item: any) => {\n // 优先从 trans_param.union_cover 提取封面,并替换 {size} 为 400\n let pic = item.pic || '';\n if (item.trans_param?.union_cover) {\n pic = item.trans_param.union_cover.replace('{size}', '400');\n }\n\n return {\n id: item.hash || item.id,\n name: item.songname || item.filename || 'Unknown',\n artist: item.singername || 'Unknown Artist',\n album: item.album_name || item.album || '',\n pic: pic,\n url: item.url,\n lrc: item.lrc,\n source: 'kugou',\n isVip: item.privilege >= 8,\n playable: item.status !== 0,\n };\n }),\n total: total,\n };\n },\n\n parseGetSongUrl(data: any): string | null {\n return data.url?.url || data.url?.backup_url?.[0] || null;\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || root.data || '';\n }\n};\n","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const neteaseAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n const songs = root.result?.songs || root.songs || (Array.isArray(root) ? root : []);\n \n return {\n tracks: songs.map((item: any) => ({\n id: item.id,\n name: item.name,\n artist: Array.isArray(item.artist) ? item.artist.join(', ') : item.artist,\n album: item.album?.name || item.album,\n pic: item.pic || item.album?.picUrl,\n url: item.url,\n lrc: item.lrc,\n source: 'netease',\n isVip: item.fee === 1 || item.fee === 4,\n playable: item.noCopyrightRcmd === null,\n })),\n total: root.result?.songCount || songs.length,\n };\n },\n\n parseGetSongUrl(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n const item = root.data?.[0] || root[0] || root;\n return item.url || null;\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || '';\n }\n};\n\n","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const tencentAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n \n // 兼容多种 QQ 音乐返回结构\n const songData = root.data?.data?.song || root.data?.song || root.data || root;\n const list = songData.list || root.songs || [];\n const total = songData.totalnum || root.total || list.length;\n \n return {\n tracks: list.map((item: any) => {\n // 解析歌手名\n const artist = Array.isArray(item.singer) \n ? item.singer.map((s: any) => s.name).join(', ') \n : (item.singer?.[0]?.name || item.artist || 'Unknown');\n\n // 处理封面图 (QQ 音乐封面通常基于 album mid)\n let pic = item.pic;\n if (!pic && item.album?.mid) {\n pic = 'https://y.gtimg.cn/music/photo_new/T002R300x300M000' + (item.album.mid) + '.jpg';\n }\n\n return {\n id: item.mid || item.id || item.songid,\n name: item.name || item.title || item.songname,\n artist: artist,\n album: item.album?.name || item.albumname || item.album,\n pic: pic || '',\n url: item.url,\n lrc: item.lrc,\n source: 'tencent',\n isVip: item.pay?.pay_play === 1,\n playable: item.action?.switch !== 0,\n };\n }),\n total: total,\n };\n },\n\n parseGetSongUrl(data: any): string | null {\n\n const root = data\n\n const urlData = root.url.url;\n let finalUrl = Object.values(urlData)[0] as string;\n console.log('finalUrl2', finalUrl);\n return finalUrl.startsWith('http') ? finalUrl : 'http://' + (finalUrl);\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || '';\n }\n};\n\n","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const xiamiAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n // 虾米返回的结构(根据提供的数据,类似于网易云的结构)\n const result = root.data?.result || root.result || root;\n const songs = result.songs || (Array.isArray(root) ? root : []);\n \n return {\n tracks: songs.map((item: any) => ({\n id: item.id?.toString() || '',\n name: item.name || 'Unknown',\n artist: Array.isArray(item.ar) \n ? item.ar.map((a: any) => a.name).join(', ') \n : (item.artist || 'Unknown Artist'),\n album: item.al?.name || item.album || '',\n pic: item.al?.picUrl || item.pic || '',\n url: item.url,\n lrc: item.lrc,\n source: 'xiami',\n // 这里的逻辑参考提供的数据结构\n isVip: item.fee === 1 || item.fee === 8,\n playable: item.copyright !== 0,\n })),\n total: result.songCount || songs.length,\n };\n },\n\n parseGetSongUrl(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n // 兼容多种可能的包装结构\n const item = root.data?.[0] || root.data || root[0] || root;\n return item.url || null;\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || root.data || '';\n }\n};\n\n","import useSWR from 'swr';\nimport { useState, useCallback, useMemo } from 'react';\nimport { MusicTrack, SearchOptions, SearchResult, MusicApiResponse } from '../types';\nimport { DEFAULT_MUSIC_SOURCE } from '../constants';\nimport { \n kugouAdapter, \n neteaseAdapter, \n tencentAdapter, \n xiamiAdapter,\n MusicSourceAdapter \n} from '../adapters';\n\nconst fetcher = (url: string) => fetch(url).then(res => res.json());\n\nconst ADAPTERS: Record<string, MusicSourceAdapter> = {\n kugou: kugouAdapter,\n netease: neteaseAdapter,\n tencent: tencentAdapter,\n xiami: xiamiAdapter,\n};\n\nexport function useMusic() {\n const [searchOptions, setSearchOptions] = useState<SearchOptions | null>(null);\n\n // 搜索歌曲\n const { data: rawData, error: searchError, isLoading: isSearching } = useSWR<MusicApiResponse<any>>(\n searchOptions ? '/api/music/search?keyword=' + (encodeURIComponent(searchOptions.keyword)) + '&source=' + (searchOptions.source || DEFAULT_MUSIC_SOURCE) + '&limit=' + (searchOptions.limit || 20) + '&offset=' + (searchOptions.offset || 0) + (searchOptions.miku ? '&miku=true' : '') : null,\n fetcher\n );\n\n const searchResult = useMemo(() => {\n if (!rawData?.data || !searchOptions) return undefined;\n const adapter = ADAPTERS[searchOptions.source || DEFAULT_MUSIC_SOURCE];\n if (adapter) {\n return adapter.parseSearchResult(rawData.data);\n }\n return undefined;\n }, [rawData, searchOptions]);\n\n const search = useCallback((options: SearchOptions) => {\n setSearchOptions(options);\n }, []);\n\n // 获取播放链接\n const getSongUrl = useCallback(async (id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<string | undefined> => {\n try {\n const res = await fetch('/api/music/url?id=' + (id) + '&source=' + (source));\n const json: MusicApiResponse<any> = await res.json();\n const adapter = ADAPTERS[source];\n console.log('json2', json.data,source,adapter);\n if (adapter && json.data) {\n console.log('getSongUrl2', json.data);\n return adapter.parseGetSongUrl(json.data) || undefined;\n }\n return json.data?.url;\n } catch (err) {\n console.error('[Music] Failed to get song URL:', err);\n return undefined;\n }\n }, []);\n\n // 获取歌词\n const getLyric = useCallback(async (id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<string | undefined> => {\n try {\n const res = await fetch('/api/music/lyric?id=' + (id) + '&source=' + (source));\n const json: MusicApiResponse<any> = await res.json();\n const adapter = ADAPTERS[source];\n if (adapter && json.data) {\n return adapter.parseGetLyric(json.data);\n }\n return json.data?.lyric;\n } catch (err) {\n console.error('[Music] Failed to get lyric:', err);\n return undefined;\n }\n }, []);\n\n return {\n search,\n searchResult,\n isSearching,\n searchError,\n getSongUrl,\n getLyric,\n };\n}\n\n","import Meting from '@meting/core';\nimport { SearchOptions } from '../types';\nimport { DEFAULT_MUSIC_SOURCE } from '../constants';\n\n/**\n * Meting 服务集成\n */\nexport class MetingService {\n private instances: Map<string, any> = new Map();\n\n private getInstance(source: string) {\n if (!this.instances.has(source)) {\n this.instances.set(source, new Meting(source));\n }\n return this.instances.get(source);\n }\n\n /**\n * 搜索歌曲\n */\n async search(options: SearchOptions): Promise<any> {\n const { keyword, source = DEFAULT_MUSIC_SOURCE, limit = 20, offset = 0 } = options;\n const meting = this.getInstance(source);\n \n // Meting 通常使用 page (1-based) 和 limit 参数\n // 如果 offset 是前端传来的 0-based 页码\n const response = await meting.search(keyword, {\n limit,\n page: offset + 1,\n });\n\n try {\n return typeof response === 'string' ? JSON.parse(response) : response;\n } catch (e) {\n return response;\n }\n }\n\n /**\n * 获取歌曲详情(包含播放链接)\n */\n async getSongUrl(id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<any | undefined> {\n const meting = this.getInstance(source);\n const response = await meting.song(id);\n try {\n return typeof response === 'string' ? JSON.parse(response) : response;\n } catch (e) {\n return response;\n }\n }\n\n /**\n * 获取歌词\n */\n async getLyric(id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<any | undefined> {\n const meting = this.getInstance(source);\n const response = await meting.lyric(id);\n try {\n return typeof response === 'string' ? JSON.parse(response) : response;\n } catch (e) {\n return response;\n }\n }\n}\n\nexport const musicService = new MetingService();\n","import { MetingService, musicService } from './meting';\nimport { SearchOptions, SearchResult } from '../types';\nimport { DEFAULT_MUSIC_SOURCE } from '../constants';\n\n/**\n * 专门用于搜索 Miku/初音未来 相关歌曲的服务\n */\nexport class MikuMusicService {\n private baseService: MetingService;\n private mikuKeywords = ['初音未来', 'Miku', 'Vocaloid', 'MIKU'];\n\n constructor(baseService: MetingService = musicService) {\n this.baseService = baseService;\n }\n\n /**\n * 搜索歌曲,自动增加 Miku 相关关键词\n */\n async search(options: SearchOptions): Promise<any> {\n const { keyword, source = DEFAULT_MUSIC_SOURCE, limit = 20, offset = 0 } = options;\n \n const trimmedKeyword = keyword.trim();\n \n // 如果关键词中已经包含了 miku 相关词,就不再额外添加\n const hasMikuKeyword = this.mikuKeywords.some(k => \n trimmedKeyword.toLowerCase().includes(k.toLowerCase())\n );\n\n // 组合关键词:用户关键词 + 初音未来\n // 如果用户没搜初音,我们就帮他搜初音\n const mikuKeyword = hasMikuKeyword ? trimmedKeyword : (trimmedKeyword) + ' 初音未来'.trim();\n\n return this.baseService.search({\n ...options,\n keyword: mikuKeyword || '初音未来', // 如果输入为空,默认搜初音未来\n });\n }\n\n /**\n * 获取歌曲详情(包含播放链接)- 直接透传\n */\n async getSongUrl(id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<any | undefined> {\n return this.baseService.getSongUrl(id, source);\n }\n\n /**\n * 获取歌词 - 直接透传\n */\n async getLyric(id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<any | undefined> {\n return this.baseService.getLyric(id, source);\n }\n}\n\nexport const mikuMusicService = new MikuMusicService();\n\n\n\n\n\n\n\n","import { musicService } from './meting';\nimport { mikuMusicService } from './miku';\nimport { MusicApiResponse } from '../types';\nimport { DEFAULT_MUSIC_SOURCE } from '../constants';\n\n/**\n * 创建搜索接口处理器\n */\nexport const createSearchHandler = () => {\n// ...\n return async (req: Request): Promise<Response> => {\n try {\n const { searchParams } = new URL(req.url);\n const keyword = searchParams.get('keyword');\n const source = searchParams.get('source') || DEFAULT_MUSIC_SOURCE;\n const limit = parseInt(searchParams.get('limit') || '20');\n const offset = parseInt(searchParams.get('offset') || '0');\n const miku = searchParams.get('miku') === 'true';\n\n if (!keyword && !miku) {\n return Response.json({ code: 400, message: 'Keyword is required' }, { status: 400 });\n }\n\n const service = miku ? mikuMusicService : musicService;\n const result = await service.search({\n keyword: keyword || '',\n source: source as any,\n limit,\n offset,\n miku,\n });\n\n return Response.json({\n code: 200,\n data: result,\n });\n } catch (error: any) {\n console.error('[Music] Search error:', error);\n return Response.json({\n code: 500,\n message: error.message || 'Internal Server Error',\n }, { status: 500 });\n }\n };\n};\n\n/**\n * 创建歌曲链接接口处理器\n */\nexport const createSongUrlHandler = () => {\n return async (req: Request): Promise<Response> => {\n try {\n const { searchParams } = new URL(req.url);\n const id = searchParams.get('id');\n const source = searchParams.get('source') || DEFAULT_MUSIC_SOURCE;\n\n if (!id) {\n return Response.json({ code: 400, message: 'ID is required' }, { status: 400 });\n }\n\n const url = await musicService.getSongUrl(id, source);\n\n return Response.json({\n code: 200,\n data: { url },\n });\n } catch (error: any) {\n console.error('[Music] Get URL error:', error);\n return Response.json({\n code: 500,\n message: error.message || 'Internal Server Error',\n }, { status: 500 });\n }\n };\n};\n\n/**\n * 创建歌词接口处理器\n */\nexport const createLyricHandler = () => {\n return async (req: Request): Promise<Response> => {\n try {\n const { searchParams } = new URL(req.url);\n const id = searchParams.get('id');\n const source = searchParams.get('source') || DEFAULT_MUSIC_SOURCE;\n\n if (!id) {\n return Response.json({ code: 400, message: 'ID is required' }, { status: 400 });\n }\n\n const lyric = await musicService.getLyric(id, source);\n\n return Response.json({\n code: 200,\n data: { lyric },\n });\n } catch (error: any) {\n console.error('[Music] Get lyric error:', error);\n return Response.json({\n code: 500,\n message: error.message || 'Internal Server Error',\n }, { status: 500 });\n }\n };\n};\n\n"]}
|