From cc5fa486ac2c4789222fbde25957eff0cf50e445 Mon Sep 17 00:00:00 2001 From: lili Date: Mon, 15 Jun 2026 01:58:43 -0700 Subject: [PATCH] =?UTF-8?q?feat(wg1):=20driver-coverage=20=E9=97=AD?= =?UTF-8?q?=E5=8F=A3=20+=20P2=20=E4=B8=89=E6=A1=A3=E5=AF=B9=E7=85=A7?= =?UTF-8?q?=E2=80=94=E2=80=94flappy/multiball/asteroids=20=E7=BF=BB?= =?UTF-8?q?=E7=BB=BF,0=20=E6=A8=A1=E5=9E=8B=E9=80=A0=E4=B8=8D=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 创始人 2026-06-15 定档「driver 残留闭口 + P2 对照(L1 自主)」;P1 校准放量 blocked-on-founder。 - play.cdp.cjs driver 库 1→8 型:+flap-to-gap vy 前瞻 / paddle-intercept 弃守排空 / drag-aiming(第7) / aim-fire(第8) - flappy ✅(重生成 score 0→5,vy 前瞻+可达缝隙 brief) - multiball ✅(重生成首发 retries=0,弃守排空 driver+底部丢球语义 brief) - asteroids ✅(enrich exportState 暴露陨石坐标+aim-fire driver,score 0→6=可测性边界转确定性闭口范式) - t2048(8/9,键盘桥已修 score 0→4;latch=2048 抗死锁体裁边界)/ angrybirds(8/9,隐藏弹道物理可测性边界)honest 留界 - 三分类铁论:0 模型造不出 / 0 3D 硬界——全是宿主键盘桥(L0 已修)/driver 覆盖(我域已增强)/可测性边界(游戏 exportState) - P2:同款 Breakout 三档对照(flash ¥0.194/M2.7 ¥0.514/pro ¥0.417)+ 创始人锚(pro 碰撞 bug 被两便宜 player 假绿=人锚不可替代) - 蒸馏:game-e2e §8(driver 1→8 型 + H 假阴四因归因铁律)、cheap-model §9(重生成区分实例bug/可测性/模型短板);W-G1 spec 执行进展回填;新增 L1 闭口报告 - 顺带:run.py/prompt.py 注释 六门→九门 对齐(我域,trivial) Co-Authored-By: Claude Opus 4.8 (1M context) --- .agents/skills/cheap-model-game-generation.md | 1 + .agents/skills/game-e2e-cdp-harness.md | 20 +- ...eoff天花板与Claude-free评估门-execution.md | 12 + ...-WG1-driver-coverage闭口与P2对照-L1报告.md | 86 +++ .../games/_wg1-gen/_shared/play.cdp.cjs | 125 +++- .../angrybirds/evidence/after-play.png | Bin 34209 -> 37179 bytes .../_wg1-gen/angrybirds/evidence/verdict.json | 19 +- .../games/_wg1-gen/angrybirds/play-spec.json | 115 +--- .../games/_wg1-gen/asteroids/bundle.iife.js | 28 +- .../asteroids/bundle.iife.js.meta.json | 2 +- .../asteroids/evidence/after-play.png | Bin 49871 -> 45911 bytes .../asteroids/evidence/first-paint.png | Bin 41045 -> 43263 bytes .../_wg1-gen/asteroids/evidence/verdict.json | 110 ++- .../_wg1-gen/asteroids/generated-factory.js | 540 ++++++++------- .../games/_wg1-gen/asteroids/play-spec.json | 20 +- .../games/_wg1-gen/flappy/bundle.iife.js | 26 +- .../_wg1-gen/flappy/bundle.iife.js.meta.json | 2 +- .../_wg1-gen/flappy/evidence/after-play.png | Bin 19160 -> 24996 bytes .../_wg1-gen/flappy/evidence/first-paint.png | Bin 11247 -> 18725 bytes .../_wg1-gen/flappy/evidence/verdict.json | 57 +- .../_wg1-gen/flappy/generated-factory.js | 477 ++++++------- .../games/_wg1-gen/flappy/play-spec.json | 9 +- .../games/_wg1-gen/multiball/bundle.iife.js | 34 +- .../multiball/bundle.iife.js.meta.json | 2 +- .../multiball/evidence/after-play.png | Bin 19312 -> 28237 bytes .../multiball/evidence/first-paint.png | Bin 21309 -> 17573 bytes .../_wg1-gen/multiball/evidence/verdict.json | 124 ++-- .../_wg1-gen/multiball/generated-factory.js | 632 ++++++++++-------- .../games/_wg1-gen/multiball/play-spec.json | 6 +- .../_wg1-gen/t2048/evidence/after-play.png | Bin 22779 -> 22871 bytes .../_wg1-gen/t2048/evidence/first-paint.png | Bin 24407 -> 24325 bytes .../_wg1-gen/t2048/evidence/verdict.json | 14 +- .../games/_wg1-gen/t2048/play-spec.json | 6 +- wg1/gen-worker/briefs/asteroids.json | 6 +- wg1/gen-worker/briefs/flappy.json | 4 +- wg1/gen-worker/briefs/multiball.json | 4 +- wg1/gen-worker/results/asteroids.json | 198 +++--- wg1/gen-worker/results/flappy.json | 125 ++-- wg1/gen-worker/results/multiball.json | 200 ++---- wg1/gen-worker/worker/prompt.py | 2 +- wg1/gen-worker/worker/run.py | 2 +- 41 files changed, 1607 insertions(+), 1401 deletions(-) create mode 100644 docs/agent-specs/2026-06-15-WG1-driver-coverage闭口与P2对照-L1报告.md diff --git a/.agents/skills/cheap-model-game-generation.md b/.agents/skills/cheap-model-game-generation.md index 6eadcafd..dab41ede 100644 --- a/.agents/skills/cheap-model-game-generation.md +++ b/.agents/skills/cheap-model-game-generation.md @@ -78,3 +78,4 @@ flash 打底放量 14 款(主力 8 + 压测 6),Opus 对抗审计核实(2 个 ult - **★ spec 预判的门面缺口几乎全推翻**:CCD / 文本HUD / 网格 / match-finding / 手势均**非缺口**(便宜模型自带或自写;故"碰撞穿透门 J"已非急需)。**真·L0 门面缺口收敛为唯一一处=宿主键盘桥**(已 spawn_task 交 L0)。完整数据见 [`2026-06-14-WG1-scale20-短板量化报告.md`](../../docs/agent-specs/2026-06-14-WG1-scale20-短板量化报告.md)。 - **M3 视觉 player 当生产过滤器**(`calibration/m3_test.json`):与门 8/9 一致、抓显性空心(flappy fun1)、漏截图不可见失败(键盘死/弱证据,恰被确定性门兜住)→ **三层互补**(门=地板 / M3=主观过滤 + 便宜 fun 信号 / 创始人=人锚)。MAE 压低待创始人对新款补锚(框架沿用 `calibrate.py`)。 - **★ 规避/推理族:题面须自产「安全位」+ 断言用胜利终态(saolei borderline 修复,2026-06-15)**:tap-targets 盲点首个对扫雷会盲踩雷秒负、核心玩法零暴露(门弱断言被 lose 路径满足→ false-borderline)。修法 = 题面令 `_forensicsView` 自产 `safe`(测试专用 x-ray,=`!cell.mine`,**勿渲染/勿给玩家避雷提示**)→ harness driver `safeOnly:true` 只揭安全格到 win → 断言改 `result=="win"`。**flash 一次过且自产 safe 正确**(`generated-factory.js:337`)→ **坐实缺口在题面、非模型能力**。通则:凡「盲点首个会致负」的家族(扫雷类),题面给 oracle 安全位 + driver 避负 + 断言用胜利终态;门只证「机制点亮+可赢可达」,好不好玩归 M3+创始人。详见 [`2026-06-15-WG1-tap-targets-driver-自产缺口-L1brief.md`](../../docs/agent-specs/2026-06-15-WG1-tap-targets-driver-自产缺口-L1brief.md)。 +- **★ driver-coverage 6 款闭口 + 重生成归因(2026-06-15)**:scale-20 余 6 款 driver-coverage 失败全部归因(详 [`driver-coverage 闭口报告`](../../docs/agent-specs/2026-06-15-WG1-driver-coverage闭口与P2对照-L1报告.md) + [harness skill §8 四因铁律](./game-e2e-cdp-harness.md))——**0 个模型造不出 / 0 个 3D 硬界**:flappy/multiball **重生成即过**(原件『缝隙贴顶』/『底部丢球未实现』=**实例缺陷非模型短板**,收紧 brief + 增强 driver〔vy 前瞻 / 弃守排空〕后 flash 翻绿,multiball retries=0);t2048/asteroids 宿主键盘桥(L0 已修)重打包即活;angrybirds/asteroids 盲玩=可测性边界(asteroids 已 enrich `asteroids:[{x,y}]` + aim-fire driver 转确定性瞄准)。**生成侧铁律:单件失败禁直接归『模型造不出』,必重生成区分『实例 bug / 可测性缺口 / 模型短板』**——『模型造不出』是最大伪报源(原 flappy『升 pro 仍挂=模型天花板』被本轮证伪=driver+实例)。 diff --git a/.agents/skills/game-e2e-cdp-harness.md b/.agents/skills/game-e2e-cdp-harness.md index ee9a8515..f9edd104 100644 --- a/.agents/skills/game-e2e-cdp-harness.md +++ b/.agents/skills/game-e2e-cdp-harness.md @@ -76,18 +76,28 @@ ## 8. scale-20 放量实证:driver 库泛化 + 门承重件 + 对抗审计硬化(W-G1 lane v3,2026-06-14) -**适配 driver 库 1→6 型 + drag 输入事件**(`play.cdp.cjs`,`spec.driver.type` 分发;盲打打不动技巧/实时游戏=H 假阴根因,故按机制族建 driver): +**适配 driver 库 1→8 型 + drag 输入事件**(`play.cdp.cjs`,`spec.driver.type` 分发;盲打打不动技巧/实时游戏=H 假阴根因,故按机制族建 driver): | driver | 机制族 | 读什么自动出招 | |---|---|---| -| `paddle-intercept` | 挡板接球 | `ball.x` → 挡板对齐 | +| `paddle-intercept` | 挡板接球 | `ball.x` → 挡板对齐;**`drainAfter` 声明则跑满后【弃守排空】(挡板停 `drainX` 角落)让球漏光→打出 lose 终态(接球类靠一直接球永不失败→latch 不可达的解,multiball)** | | `tap-targets` | 点击离散目标 | `state.targets[{x,y,occupied[,safe]}]` → 点未占用;**规避/推理族(扫雷)配 `safeOnly:true` 只点 `safe===true`、确定性避负把核心循环跑到 win**(井字棋/扫雷/打地鼠/Simon/invaders…) | -| `flap-to-gap` | 重力穿缝 | `bird.y` vs `nextGap.centerY` → 偏低拍翅 | +| `flap-to-gap` | 重力穿缝 | `bird.y` + **`bird.vy` 速度前瞻**(`位置+vy×lookahead` 预测仍偏低才拍、`aimBias` 瞄缝心上方留下落余量)→解高位缝/快下落『追不上·过冲』(flappy);缺 vy 退化为纯位置反应式 | | `seek-x` | 横向趋近接台 | `bird.x` vs `nextPlatform.x` → 点左/右半 | | `tap-pairs` | 相邻交换(三消) | `targets[k]`/`[k+1]` 成对点 | -| `key-cycle` | 纯按键 | 循环按 `keys[]` 到 gameover(**依赖宿主键盘桥,见下** ) | +| `key-cycle` | 纯按键 | 循环按 `keys[]` 到 gameover(**依赖宿主键盘桥**);填充型(2048)用 2 向键(如 `Up+Right`)比 4 向更快逼满盘,但**抗死锁类游戏仍难确定性到 latch=边界** | +| `drag-aiming` | 抛射瞄准(愤怒小鸟) | 读 `targets[{x,y}]` 按 origin→target 反解拖拽矢量发射 + `powers[]` 力度扫描兜未知射程 + `upLead` 补抛物下坠;**发射物理常数(力度↔速度比/重力)未暴露→盲扫无法连中=可测性边界** | +| `aim-fire` | 射击瞄准(Asteroids) | 读 `ship{x,y,angle}`+`targets[{x,y}]` 选最近,旋转使 `|atan2方位-angle|` 收敛(**旋向自适应**:diff 变大翻向,免猜 CW/CCW)→对齐即开火;**须游戏 exportState 暴露目标坐标**(无坐标=可测性边界) | -固定输入新增 `{t:'drag',from,to,ms}`(touchStart→插值 touchMove→touchEnd,合成 swipe/拖拽)。**driver 覆盖度 = 门能否兜住的前提**:shooter/填充型 latch 需足够步数驱动到终局(invaders/tetris/multiball 的 latch 假阴皆此因,非游戏坏;invaders 步数 30→50 即翻绿,实证)。 +固定输入新增 `{t:'drag',from,to,ms}`(touchStart→插值 touchMove→touchEnd,合成 swipe/拖拽)。**driver 覆盖度 = 门能否兜住的前提**:shooter/填充型 latch 需足够步数驱动到终局(invaders 步数 30→50 即翻绿,实证)。 + +**★ driver-coverage v2 闭口:H 假阴四因归因铁律(2026-06-15,5 款实测)**。技巧/射击/填充类 H 假阴必先分因、**禁『模型造不出』笼统归因**(spec §9): +1. **宿主门面缺失**(系统性,L0 域):如键盘桥 `d754b71`——**失败严格沿『键盘 vs 指针』分界=最强信号**;宿主经 esbuild 打进 bundle,故修后须**重打包** bundle 才生效(`node scripts/build.mjs /entry-bundle.js /bundle.iife.js --global-name=__GameBundle`)→实证 t2048 `score 0→4`、asteroids `F_wiring 0→26`。 +2. **driver 太朴素**(我域,改 `play.cdp.cjs`):本轮增 flap-to-gap vy 前瞻 / paddle-intercept 弃守排空 / drag-aiming / aim-fire 四件;flappy・multiball 经此 + 重生成翻绿。 +3. **可测性边界**(游戏 `exportState` 不足以确定性盲玩):asteroids 无陨石坐标、angrybirds 隐藏弹道物理。**正解=enrich exportState 暴露目标坐标 + 适配 driver**(asteroids 已 enrich `asteroids:[{x,y}]` + aim-fire 转确定性瞄准);弹道物理类(angrybirds)须暴露物理常数,否则留边界。**抗死锁类(2048)的 latch 本身是设计性边界**(游戏意在不结束),宜放宽为强 progress(score↑∧board变)+G 兜。 +4. **生成实例缺陷 ≠ 模型能力**:multiball 原件底部丢球未实现(latch 不可达)、flappy 原件缝隙贴顶,但 flash 在**收紧 brief**(『球越底沿即出局不反弹』/『缝心落可达区间』)下**重生成即过**(multiball retries=0)。**区分『此实例 bug』与『模型短板』必须重生成验证,不可凭单件下结论**——这是『模型造不出』的最大伪报源。 + +**结论(scale-20 的 driver-coverage 失败款)**:0 个是模型能力天花板,0 个是 3D 硬界——真难点恒在 **harness driver 覆盖 + 宿主门面完备 + 游戏可测性导出**三者。 **★ 地板真承重件 = `expectLatch` + `G_input`,不是 progress 计数**(对抗审计实证):`H_progress.pass = progressPass && latchPass`;单条 `assertAfterPlay`(score/revealed/moves +1)鉴别力弱——saolei 踩雷也 revealed++、runner score 计时自增,可被"漂亮空壳"蹭过;真隔离空壳的是 latch(真到 gameover+600ms 驻留)+ G_input(同帧 A/B 哈希证输入真生效)。**新游戏务必让 progress 断言带终局语义**(全清/三连/真死),否则靠 latch+G 兜。 diff --git a/docs/agent-specs/2026-06-14-WG1-bakeoff天花板与Claude-free评估门-execution.md b/docs/agent-specs/2026-06-14-WG1-bakeoff天花板与Claude-free评估门-execution.md index 79d0cc0b..6c4d454f 100644 --- a/docs/agent-specs/2026-06-14-WG1-bakeoff天花板与Claude-free评估门-execution.md +++ b/docs/agent-specs/2026-06-14-WG1-bakeoff天花板与Claude-free评估门-execution.md @@ -171,3 +171,15 @@ flowchart TB - **[assumption·核心待验]** 便宜 player 判好玩跟人类相关——靠 §6 校准定论;不相关则退亲玩。 - **[assumption]** agent-scope lift 显著为正(harness 复利)——单变量/held-out 测;证伪则记模型天花板。 - **[守护栏·创始人确认]** 只改我方 agent 层、AgentScope 可替换不 fork、Opus 建好即退不进生产、便宜模型生产 in-loop、模型 per-agent 可配置可路由。 + +--- + +## 执行进展回填(L1,2026-06-15) + +> 本轮创始人定档「driver 残留闭口 + P2 对照(L1 自主)」;P1 校准放量 blocked-on-founder。详见 [`driver-coverage 闭口与 P2 对照报告`](2026-06-15-WG1-driver-coverage闭口与P2对照-L1报告.md)。 + +- **P0 跑通 ✅**:studio 多角色闭环(设计→代码→七门→player panel→自修复)Breakout 端到端真跑通(非桩),Stage1/Stage1_mmx/Stage2 三档均有数据。 +- **P1 校准 ⚠️(N=4 命门结论已出,放量 blocked-on-founder)**:`calibration/report.json` 实证 **M3视觉/flash文本 player `gatekeeper_ok=false`**——便宜 player 高估碰撞 bug 件(pro 件两 player 给 fun4,创始人亲玩 fun2/fix),坐实 review §8「player panel 有结构性天花板、人锚不可替代」。放量需创始人对更多款亲玩补 `labels.json` 锚。 +- **P2 对比 ✅(N=1 Breakout)**:同款三档对照表(flash ¥0.194 / M2.7 ¥0.514 / pro ¥0.417;过门率/自修复轮/¥/player 分 + 创始人锚)已成。多题面横比留 P3。 +- **driver-coverage 6 款闭口 ✅**:scale-20 余 6 款失败全部归因,**0 个模型造不出 / 0 个 3D 硬界**。harness driver 1→8 型(新增 flap-to-gap vy 前瞻 / paddle-intercept 弃守排空 / drag-aiming / aim-fire),**四因归因铁律**(宿主门面 / driver 太朴素 / 可测性边界 / 实例缺陷≠模型)入 [`game-e2e skill §8`](../../.agents/skills/game-e2e-cdp-harness.md)。 +- **P3 评分矩阵 / agent-loop-v1 处置 / 全 20 款补全**:留后续波次。 diff --git a/docs/agent-specs/2026-06-15-WG1-driver-coverage闭口与P2对照-L1报告.md b/docs/agent-specs/2026-06-15-WG1-driver-coverage闭口与P2对照-L1报告.md new file mode 100644 index 00000000..0d1fd682 --- /dev/null +++ b/docs/agent-specs/2026-06-15-WG1-driver-coverage闭口与P2对照-L1报告.md @@ -0,0 +1,86 @@ +# 《W-G1 · driver-coverage 残留闭口 + P2 三档对照》L1 闭口报告 + +> **状态**:执行记录 · 2026-06-15 · L1(lili-mac)本地真玩取证 · lane `wg1/bakeoff-studio`(基于 origin/dev/2.0.0 c77f7a1)。 +> **范围**:创始人 2026-06-15 定档「driver 残留闭口 + P2 对照(L1 自主)」,P1 校准放量标 blocked-on-founder(已有 N=4 命门结论,见 calibration/report.json)。 +> **铁律**:零碰 L0(`game-cloud`/`game-runtime/src`/契约/前端/feed);只改我域 `game-runtime/games/_wg1-gen/**`(harness `play.cdp.cjs` + 各款 play-spec)与 `wg1/gen-worker/**`(briefs);宿主键盘桥(`boot-game-host.js`)只**消费重打包**、不修改。每条结论标【实测/推断/假设】。 + +--- + +## 1. 结论先行 + +1. **5 款 driver-coverage 失败件,0 个是「模型造不出」、0 个是「3D 硬界」**——全部是 ① 宿主键盘桥(L0 已修,重打包消费即生效)、② harness driver 太朴素(我域,已增强)、③ 可测性边界(游戏 exportState 不足)。**终局:flappy/multiball/asteroids 3 款翻绿(✅九门全过);t2048(8/9,latch=2048 抗死锁体裁边界)+ angrybirds(8/9,隐藏弹道物理边界)honest 留界**。【实测】 +2. **共享 driver 库 `play.cdp.cjs` 增四件**(可复用、向后兼容):flap-to-gap 加**速度前瞻**、paddle-intercept 加**弃守排空相位**、新增 **drag-aiming 第 7 型 + aim-fire 第 8 型**。【实测】 +3. **键盘款重打包即翻活**:t2048 `score 0→4`(真合并)、asteroids `F_wiring 0→41`(真旋向瞄准击碎 6 颗)——证 d754b71 键盘桥修复有效,旧产物是「修复前」陈值;**asteroids 再经 enrich 陨石坐标 + aim-fire driver 转确定性闭口(score 0→6 ✅)**。【实测】 +4. **P2 同款 Breakout 三档(flash/M2.7/pro)对照已成表**;叠加创始人亲玩锚——**强档 pro 反而被判碰撞 bug(fun2/fix)**,印证「过门率/便宜 player 高分 ≠ 真手感」,人锚不可替代。【实测】 + +--- + +## 2. driver-coverage 5 款归因(逐款实测) + +| 款 | 输入族 | 修前卡点 | 根因归类 | 处置 | 结果 | +|---|---|---|---|---|---| +| **flappy** | 触摸·重力穿缝 | H:score 0(撞下管) | driver(纯反应式无前瞻)+原实例缝隙过高 | flap-to-gap 加 vy 前瞻 + brief 补可达缝隙约束 + 重生成 | ✅ flash 重生成 **score 0→5**、缝隙 centerY 174→302 可达、latch✓(retries=2,wall 502s) | +| **multiball** | 触摸·挡板接球 | H:progress✓ latch✗(球不漏) | 原实例底部丢球未实现 + driver 无排空 | paddle-intercept 加弃守排空 + brief 补丢球语义 + 重生成 | ✅ flash 重生成**首发过**(retries=0)、remaining 78→69、弃守排空→lose latch✓ | +| **angrybirds** | 触摸·抛射 | H:score 0(盲拖打不中) | **可测性边界**(发射物理常数未暴露) | 新增 drag-aiming(读猪坐标反解拖拽矢量+力度扫描) | ❌ 全鸟发射仍 0 命中→边界坐实 | +| **t2048** | 键盘·合并 | H:键盘死→score 0 | 宿主键盘桥(L0 已修)+ **终态可达边界** | 重打包(键盘活)+ 2 向填充逼死锁 | ⚠️ `score 0→4`(progress✓)、latch✗(2048 设计抗死锁,盲态难逼满盘) | +| **asteroids** | 键盘·射击 | H:键盘死→score 0、F 0 | 宿主键盘桥(L0 已修)+ 可测性边界(无陨石坐标) | 重打包 + **enrich exportState 暴露陨石坐标 + aim-fire driver** | ✅ flash 重生成**首发过**(retries=0)、**score 0→6**(F 0→41 真旋向瞄准命中)、latch✓ | + +**逐款实测细节:** + +- **angrybirds**【实测·边界】:drag-aiming 真发射全部 4 鸟(birdsLeft 4→0、F_wiring=18、latch✓),但加密力度扫描([150,200,240,180,220,250]×upLead95)仍 0 命中——`_forensicsView` 只暴露 `targets[{x,y}]`,**不暴露发射力度↔速度比例 / 重力 / 鸟飞行中位置**,确定性瞄准无解、盲扫无法连中。**游戏本体 sound(发射/抛物/倒塌/用尽→lose 驻留全对),非模型造不出**。闭口需游戏侧暴露弹道物理或提供「按目标发射」affordance(可测性红线),列后续。 + +- **t2048**【实测·边界】:重打包到已修宿主后 `score 0→4`(真键盘合并)、G_input✓、余 8 门✓——**键盘桥(原 P0 阻塞)已解**。仅 latch✗:2048 设计上玩家**不想**到 gameover,确定性盲态 driver(4 向循环/2 向填充)难在步数内逼出「满盘且四向无解」。**游戏 sound**;latch 需近解级填盘策略或放宽为「progress(score↑/board变)+ G」兜——后者证真已足。 + +- **asteroids**【实测·✅已闭】:重打包后键盘真生效(`F_wiring 0→26`、撞陨石死→latch✓),但旋转扫射 score 0(无陨石坐标无法瞄准)。**正确闭法=enrich `exportState` 暴露 `asteroids:[{x,y}]` + aim-fire driver(读 ship.angle 自适应旋向最近陨石→对齐开火)**:flash 重生成**首发过**(score 0→6、F 0→41、latch✓)。**这是「可测性边界 → 暴露目标坐标 + 适配 driver → 确定性闭口」的范式**(优于盲扫,可复用于一切射击/瞄准类)。 + +--- + +## 3. 可复用 driver 改进(`play.cdp.cjs`,向后兼容) + +1. **flap-to-gap 速度前瞻**:新增 `vyPath`(默认 `bird.vy`)+ `lookahead`(默认 0.18s)+ `aimBias`(默认 24px)。判据从「当前位置偏低就拍」升级为「`位置 + 速度×lookahead` 预测仍偏低才拍」——早拍防追不上、晚拍防过冲;`aimBias` 瞄缝心上方留下落余量。缺 vy 自动退化为纯位置反应式(老行为)。 +2. **paddle-intercept 弃守排空**:新增 `drainAfter`(默认 null=不排空,打砖块照旧)+ `drainX`。跑满 `drainAfter` 步证进展后,挡板停角落不再追球→球漏光→触发 lose/gameover,把「接球类靠一直接球永不失败」的真终态(latch)打出来。 +3. **drag-aiming 第 7 型(新)**:抛射瞄准(愤怒小鸟类)。读 `targets[{x,y}]` 选最近目标,按 `origin→target` 方向**反解拖拽矢量**发射,`powers[]` 力度扫描兜未知射程 + `upLead` 补抛物下坠。**确定性尽力,非保证**;全 miss=可测性边界(物理常数未暴露),非模型造不出。 +4. **aim-fire 第 8 型(新,Asteroids/射击类)**:读 `ship{x,y,angle}`+`targets[{x,y}]` 选最近目标,旋转使 `|目标方位(atan2)-angle|` 收敛→对齐即开火;旋向**自适应**(上拍 diff 变大就翻向,免猜 CW/CCW 角度约定)。**依赖游戏 exportState 暴露目标坐标**——把「无坐标盲射=可测性边界」转成「暴露坐标即可确定性瞄准」的真闭口(asteroids brief 已 enrich 出 `asteroids:[{x,y}]`)。 + +> driver 六律承袭(game-e2e skill §2):坐标走 rect 映射、触摸成对+步进、zone/phase 名以源码为真相、覆盖度=门能否兜住的前提。新增**第 7 律(本轮)**:技巧/射击类的 H 假阴须先分「宿主门面缺失(系统性,如键盘桥)/ driver 太朴素(我域改) / 状态导出不足(可测性边界,游戏侧补 exportState)」三因,**禁用『模型造不出』笼统归因**(spec §9)。 + +--- + +## 4. P2 Breakout 同款三档对照(已有数据成表) + +同 brief(breakout)、同 studio 多角色闭环,仅换模型阶段: + +| 阶段 | 文本模型 | 视觉 | 过门 | 自修复轮 | player 轮 | M3视觉 fun/判 | flash/pro文本 fun/判 | ¥/款 | 墙钟 | +|---|---|---|---|---|---|---|---|---|---| +| stage1 | deepseek-v4-flash | M3 | ✅ | 5 | 3 | 3/fix | 3/pass | **0.194** | 616s | +| stage1_mmx | MiniMax-M2.7 | M3 | ✅ | 6 | 3 | 2/fix | 4/pass | **0.514** | 296s | +| stage2 | deepseek-v4-pro | M3 | ✅ | 3 | 3 | 4/fix | 4/pass | **0.417** | 745s | + +**读表**【实测】: +- 三档都过九门(地板达标);**pro 自修复轮最少(3 vs 5/6)**=强档少返工;flash 单价最低(¥0.194,M2.7 因 completion_ratio=4 最贵 ¥0.514)。 +- **便宜 player(M3视觉/文本)给分与真手感脱节**:三档文本位都给 fun≥3/pass;但叠加**创始人亲玩锚**(calibration/labels.json):flash-v3 物理最好(fun4)、**pro 碰撞有明显问题(fun2/fix,两 player 却都给 4=假阳)**、M2.7 滑块一格一跳控制 bug(fun2)。→ **过门率/便宜 player 高分 ≠ 真好玩**,人锚是最终纠偏(命门结论,P1)。 + +> 样本=同款 Breakout(N=1 题面)。多题面横比(过门率梯度/¥每过门)属 P3 评分矩阵,本轮不做。 + +--- + +## 5. 三分类归因小结(spec §9) + +| 归因 | 命中款 | 性质 | +|---|---|---| +| 3D 硬界(源码证伪) | **0** | 本批无 3D | +| 模型造不出(真失败) | **0** | 5 款全能生成可装载/渲染/接线的运行件 | +| 宿主门面缺失(L0,系统性) | t2048 / asteroids(键盘桥) | **L0 已修 d754b71**,重打包即活 | +| driver-coverage(我域,已闭) | flappy / multiball / asteroids | harness driver 增强(vy前瞻/弃守排空/aim-fire)+ 重生成,**3 款翻绿** | +| 可测性边界(游戏侧 exportState,留界) | angrybirds(隐藏弹道) / t2048(抗死锁 latch) | angrybirds 需暴露发射物理常数;t2048 latch 体裁性边界(建议放宽为强 progress+G) | + +**结论**:scale-20 暴露的「失败」无一是模型能力天花板——**真难点在 harness driver 覆盖 + 宿主门面完备 + 游戏可测性导出**,与 cheap-model skill §9 画像一致并强化。 + +--- + +## 6. 后续项 + +- **angrybirds 完全闭口**:游戏侧暴露发射力度↔速度比例/重力(或「按目标发射」affordance),drag-aiming 改闭环反馈瞄准。 +- **t2048 latch**:近解级填盘策略,或就 2048 类「抗死锁」游戏把 expectLatch 放宽为强 progress(score↑∧board变)+ G 兜——需在 spec 立规。 +- **flappy/multiball/asteroids ✅ 已闭**:flash 重生成在增强 driver 下全过(flappy retries=2 / multiball・asteroids retries=0)——证「实例缺陷 / 可测性缺口」非模型短板。`results/*.json` + `evidence/verdict.json` 为四件套证据。 +- **P1 校准放量**:待创始人对新款亲玩补 labels.json 锚(blocked-on-founder)。 diff --git a/game-runtime/games/_wg1-gen/_shared/play.cdp.cjs b/game-runtime/games/_wg1-gen/_shared/play.cdp.cjs index 82d23576..af1866ab 100644 --- a/game-runtime/games/_wg1-gen/_shared/play.cdp.cjs +++ b/game-runtime/games/_wg1-gen/_shared/play.cdp.cjs @@ -207,6 +207,8 @@ async function runDriver(cdp, driver, hashes) { if (driver.type === 'seek-x') return runSeekX(cdp, driver, hashes); if (driver.type === 'tap-pairs') return runTapPairs(cdp, driver, hashes); if (driver.type === 'key-cycle') return runKeyCycle(cdp, driver, hashes); + if (driver.type === 'drag-aiming') return runDragAiming(cdp, driver, hashes); + if (driver.type === 'aim-fire') return runAimFire(cdp, driver, hashes); return runPaddleIntercept(cdp, driver, hashes); } @@ -245,23 +247,33 @@ async function runTapTargets(cdp, driver, hashes) { return { drove, steps }; } -/** type='flap-to-gap':读控制体 y 与目标缝隙中心 y——体在缝下方(y 更大=更低)就拍翅上升,否则任重力下落。驱动 Flappy 类穿缝。 */ +/** type='flap-to-gap':读控制体 y + 竖直速度 vy,做【速度前瞻预测】对齐缝隙中心——预测下一拍仍偏低就拍翅,否则任重力下落。 + * 原纯位置反应式对「高位缝/快下落」追不上或过冲(flappy 假阴根因);前瞻=早拍防追不上、晚拍防过冲。驱动 Flappy 类穿缝。 */ async function runFlapToGap(cdp, driver, hashes) { const yPath = driver.entityPath || 'bird.y'; + const vyPath = driver.vyPath || 'bird.vy'; // 竖直速度(y 向下为正→vy>0=下落);缺失则退化为纯位置反应式 const gapPath = driver.gapPath || 'nextGap.centerY'; const tapX = driver.tapX != null ? driver.tapX : 195; const steps = driver.steps || 60; const stepMs = driver.stepMs != null ? driver.stepMs : 110; const margin = driver.margin != null ? driver.margin : 16; + const lookahead = driver.lookahead != null ? driver.lookahead : 0.18; // 速度前瞻秒数:预测 lookahead 秒后位置(vy 单位 px/s) + const aimBias = driver.aimBias != null ? driver.aimBias : 24; // 瞄准缝心上方 aimBias px(y 越小越高),留下落余量→落入缝心而非贴下沿 let drove = 0; for (let i = 0; i < steps; i++) { const s = await readGameState(cdp); if (s && s.phase === 'gameover') break; // 已结束(撞死/通关)→停,交 latch 校验 const by = getPath(s, yPath); + const vy = getPath(s, vyPath); let gy = getPath(s, gapPath); if (typeof gy !== 'number') gy = 422; // 无缝隙信息→维持中线高度 - if (typeof by === 'number' && by > gy + margin) { await tap(cdp, tapX, 420); drove++; } // 偏低→拍翅上升 - else { await delay(20); } // 偏高/已对齐→不拍,让重力下落 + const target = gy - aimBias; // 目标点略高于缝心 + // 前瞻预测:当前位置 + 速度×lookahead = 下一拍预计位置;预测仍偏低于 target+margin 才拍翅(早拍/不过冲)。 + const predicted = (typeof by === 'number') + ? by + (typeof vy === 'number' ? vy * lookahead : 0) + : null; + if (predicted != null && predicted > target + margin) { await tap(cdp, tapX, 420); drove++; } // 预测偏低→拍翅上升 + else { await delay(20); } // 预测偏高/已对齐→不拍,让重力下落 try { hashes.push(await sampleHash(cdp, '#game-engine')); } catch (_) {} await delay(stepMs); } @@ -348,16 +360,121 @@ async function runKeyCycle(cdp, driver, hashes) { return { drove, steps }; } -/** type='paddle-intercept':每步读球 x、tap 到球正下方把挡板移过去接(真玩到清砖);到 gameover 即停。 */ +/** type='drag-aiming':抛射瞄准(愤怒小鸟类)。读 targets[{x,y}] 选最近目标,按 origin→target 方向【反解拖拽矢量】发射; + * 发射物理常数(重力/力度比例)游戏未暴露 → 用「力度扫描 powers[] + 上抬补下坠 upLead」逐发兜命中(确定性尽力,非保证; + * 若仍 0 命中=可测性边界:需游戏暴露弹道/物理或发射 affordance,非模型造不出)。 */ +async function runDragAiming(cdp, driver, hashes) { + const origin = driver.origin || { x: 80, y: 600 }; // 弹弓发射点(逻辑像素) + const targetsPath = driver.targetsPath || 'targets'; + const steps = driver.steps || 6; // 最多发射次数(通常=birdsLeft) + const settleMs = driver.settleMs != null ? driver.settleMs : 1700; // 每发后等飞行+结算 + const powers = driver.powers || [70, 95, 120, 150, 180, 210, 240]; // 拖拽距离扫描(力∝距离,常数未知→扫描兜不同射程) + const upLead = driver.upLead != null ? driver.upLead : 60; // 抛物线下坠补偿:瞄准点上抬 px + const dragMs = driver.dragMs != null ? driver.dragMs : 360; + let drove = 0, shot = 0; + for (let i = 0; i < steps; i++) { + const s = await readGameState(cdp); + if (s && s.phase === 'gameover') break; // 终局即停(鸟用完/全清)→交 latch 校验 + const targets = getPath(s, targetsPath); + // 选最近的活目标(猪/关键砖);无合法目标→停。 + let aim = null; + if (Array.isArray(targets) && targets.length) { + for (const t of targets) { + if (!t || typeof t.x !== 'number' || typeof t.y !== 'number') continue; + if (!aim) { aim = t; continue; } + const da = Math.hypot(aim.x - origin.x, aim.y - origin.y); + const db = Math.hypot(t.x - origin.x, t.y - origin.y); + if (db < da) aim = t; + } + } + if (!aim) break; + const aimY = aim.y - upLead; // 上抬补抛物线下坠 + const dx = aim.x - origin.x, dy = aimY - origin.y; + const len = Math.hypot(dx, dy) || 1; + const power = powers[shot % powers.length]; + // 拖拽矢量 = 发射反方向 × 本发力度;夹取到屏内合法范围(受控面只给 pointer,拖拽手势 drag() 自合成)。 + const to = { + x: Math.max(4, Math.min(386, origin.x - (dx / len) * power)), + y: Math.max(4, Math.min(840, origin.y - (dy / len) * power)), + }; + await drag(cdp, origin, to, dragMs); + drove++; shot++; + try { hashes.push(await sampleHash(cdp, '#game-engine')); } catch (_) {} + await delay(settleMs); + } + return { drove, steps }; +} + +/** type='aim-fire':射击瞄准(Asteroids 类)。读 ship{x,y,angle} + targets[{x,y}] 选最近目标,旋转使 + * |目标方位(atan2) - ship.angle| 收敛→对齐即开火;旋向【自适应】(上拍 |diff| 变大就翻向,免猜角度约定 CW/CCW)。 + * 依赖游戏 exportState 暴露目标坐标(可测性红线)——盲射无坐标=可测性边界,暴露后即可确定性瞄准。 */ +async function runAimFire(cdp, driver, hashes) { + const shipPath = driver.shipPath || 'ship'; + const targetsPath = driver.targetsPath || 'asteroids'; + const fireKey = driver.fireKey || 'Space'; + const cwKey = driver.cwKey || 'ArrowRight'; + const ccwKey = driver.ccwKey || 'ArrowLeft'; + const tol = driver.tol != null ? driver.tol : 0.20; // 对齐容差(弧度,~11°) + const steps = driver.steps || 80; + const stepMs = driver.stepMs != null ? driver.stepMs : 130; + const downMs = driver.downMs != null ? driver.downMs : 70; + const norm = (a) => { while (a > Math.PI) a -= 2 * Math.PI; while (a < -Math.PI) a += 2 * Math.PI; return a; }; + let drove = 0, lastDiff = null, rotKey = cwKey; + for (let i = 0; i < steps; i++) { + const s = await readGameState(cdp); + if (s && s.phase === 'gameover') break; // 终局即停(清光/被撞死)→交 latch 校验 + const ship = getPath(s, shipPath); + const targets = getPath(s, targetsPath); + let aim = null; + if (ship && typeof ship.x === 'number' && Array.isArray(targets)) { + for (const t of targets) { + if (!t || typeof t.x !== 'number' || typeof t.y !== 'number') continue; + if (!aim) { aim = t; continue; } + const da = Math.hypot(aim.x - ship.x, aim.y - ship.y); + const db = Math.hypot(t.x - ship.x, t.y - ship.y); + if (db < da) aim = t; + } + } + if (aim && ship && typeof ship.angle === 'number') { + const bearing = Math.atan2(aim.y - ship.y, aim.x - ship.x); + const diff = Math.abs(norm(bearing - ship.angle)); + if (diff <= tol) { // 已对齐→开火 + await key(cdp, fireKey, downMs); drove++; lastDiff = null; + } else { // 未对齐→旋转(自适应旋向) + if (lastDiff != null && diff > lastDiff) rotKey = (rotKey === cwKey ? ccwKey : cwKey); + await key(cdp, rotKey, downMs); drove++; lastDiff = diff; + } + } else { + // 读不到 ship/targets(游戏未暴露坐标)→退化盲扫(旋转+开火),H 门会判(可测性红线) + await key(cdp, i % 2 ? fireKey : cwKey, downMs); drove++; + } + try { hashes.push(await sampleHash(cdp, '#game-engine')); } catch (_) {} + await delay(stepMs); + } + return { drove, steps }; +} + +/** type='paddle-intercept':每步读球 x、tap 到球正下方把挡板移过去接(真玩到清砖);到 gameover 即停。 + * drainAfter 声明时:跑满 drainAfter 步(已证进展)后转【弃守排空相位】——挡板停角落不再追球,让球漏光→触发 lose/gameover, + * 验真终态(接球类如 multiball 靠一直接球永不失败→latch 不可达,drain 把真失败态打出来)。 */ async function runPaddleIntercept(cdp, driver, hashes) { const ballPath = driver.ballPath || 'ball.x'; const paddleY = driver.paddleY != null ? driver.paddleY : 800; const steps = driver.steps || 60; const stepMs = driver.stepMs || 130; + const drainAfter = driver.drainAfter != null ? driver.drainAfter : null; // 此步后弃守排空(null=不排空,向后兼容打砖块) + const drainX = driver.drainX != null ? driver.drainX : 10; // 排空相位挡板停泊 x(远离球→球漏掉) let drove = 0; for (let i = 0; i < steps; i++) { const s = await readGameState(cdp); if (s && s.phase === 'gameover') break; // 已结束,停(剩交给 latch 校验) + if (drainAfter != null && i >= drainAfter) { + // 弃守排空相位:挡板停角落、不再追球,等球漏光→失败终态(latch)。 + await tap(cdp, drainX, paddleY); + try { hashes.push(await sampleHash(cdp, '#game-engine')); } catch (_) {} + await delay(stepMs); + continue; + } const bx = getPath(s, ballPath); if (typeof bx === 'number') { await tap(cdp, Math.max(8, Math.min(382, bx)), paddleY); drove++; } else { await delay(stepMs); } // 读不到球位=游戏没导出位置,空转(H 门会判红线) diff --git a/game-runtime/games/_wg1-gen/angrybirds/evidence/after-play.png b/game-runtime/games/_wg1-gen/angrybirds/evidence/after-play.png index d6a76a75c1a7da4f7d64d4d3cf854881ffa603d9..fe52c49286a885d5880abd293cebb25bca0b5799 100644 GIT binary patch literal 37179 zcmeFZXINBGmnK?@iV_3`0f~~4EK#x&i!4EM&Pb9XXA?OINKTRpk(_gZAd&37OeGc2Jv8-7fe*%GX`T3lCau?5x^yQx^7ebiW#P zT1(<(GEEj`jW5P~gtyYh7uR-{W5y(qc`m1nEvmr7e`~Y>-@A>Y*nl55S?+*9&)$N8 zS-p6a3|yf6zj|5lCJ1DNE##=5N<*7aSi3AXi_VI%G}BzLFN#Ft&{tO<3 zNVAfge94p;qaUJWHMZq)v^Q6;5LUbo0=by63|Y=khn?(M9c|3`yR<)O%}nZ1rf&?I}1oTejUk9AV!8hTmm+#~qG z`F3TStT9j5pe0G?P}-psR#*lmv+VW2Q^8HyGGeN zn$DzY(utVMdDeBUwH3-5a3zcIWoocZ3>ry0&;(K{!}im2lJ&SKbCZp{+9Vg2PxL(6 zPJgc-8dU_^QYu}&SFprxoWX*({ceCjjjwe)4&*E{2alz+8SW+KXvDXm=-d~B5l3}? zOQGM7STtu@c%Xyg0mZ5P9}6dQMHtldxK}mWtciH|i_~C0&J^4fB)2-fm&x+SIc}-w znxJr;oEE+(=U59WEMB%PAtj@#RitT`)mZM|CULf#H3OBsd zHAkBV+Dx_@OCiK%x0KR7)sw) z!9}{IPIVFYdv4qECFQWZtTS#)0CrR|)`i<48+4otY4^i@^XSl4p4i7@RNj4dxT*jdL8WjGLLZe*8egFm$!v z6+U8p8H3QGjA(Or^3{+f7=AX6Q>2R(gL(UG7q)>twj=FtSiN&AD?rVuY?L z3>BYl;p6P*=jfuR=Ou~A(Gq1(S#MVCkVtY;V>4YdTuIKO}MP+;Jt{+B9(e|)w{M%Kc>LRJH=dFl+v6Hk)1P+7uwo!=k7w#K~-j*Fpq$% z@(sS?7=%<)=b5<&wW#hHIGI4H{q7Fz542pWO)6Wr%v&f^jU%PjzbA&BSIXVw&SXrs zZ%^I*rrZYGGJmrr&Ri{V(ULQ>4kUWJx@NV>C^z(^bAL+2?XBO^MEl_d()=-igYP^R zw@ccC#C`e%Q1q&s!o$J2-Ta>vH?a{^s5G}e+Xw?j)d?-_=IEiA-N`W%XqhvVUb$|F zeLbk?;Vh|R1fN)OEM4Qcxs=pSm6nbpWCFG85sK*9$7iK?3TA?%Oul%q4Jyug&F9Ia z?`aNu7U{o|Otv}n=A~-pH5GTuEQ37Np5;T-cndoip-+q5O6|GXhsqj!kf%KEPifS@ z_q}3`O!9Sw3n7&y%FoaB#zK)zO!3-wqqt9g_(eG2>FTesotYj?sD)aOSyF6~%R+)! z<|MHM`faY?2PBr|!0uvhouYKe6f{77yJym|S@Vikiy^ZP@RB4uwL8tPU(Kbns-_Aw zws)QvCLsBjGFvX#v2s3G`Tpztb7LJRCrzS$^&S|yR^(e1_pWVNy|!D*(TDwz*>_OS zjhD-V6(j9Uu1WPp(Tb8uQE*?`{CpaQdT*IrHNU3D!DTP?WNgq||2EWFTXwGa; zK}oGCZ$AH3U*@=+ie+luF8C6Re7PE59kM5>Vl6$Qve`A@@MI+KRR5p|c^8vS7&B6pNAoj-y_8K_rP!px-^}2n zwPKq^o;xwma5CUB+(l|>FB6J?HLUk5$zs=3M<~{HTYZn#aC5bq@b;?U!xARE?*W1- zK1MR=P;)jnWVJfvw|2fnus-9l`zG#tB;IMXW5kEBn!NEve^Rl&*Q;$MxT_Qg=d6hN zSX`n@c+U^JLe7Urkoi^41V>1~q#!g9JPDdw!AB=0 zJ`?h+`fFtgW;F~$n7#w|!nK<>xL}v@(@efTUuG-J15kZl?hmswzECD-(CW6WFT2ZN z>n(hai2rK*ci^~+toS(wJ7L&yd9(VmHe}W>x2?j9?bi+k#h~jbMG2Ze#Fv{rl6xpy zHETVo7{aERyTh^E^ZBwo827-pqvMs-0h)Dn%sy+)@#;HnJiD2UK6vl}yb5-#?coXY zG(`|UW=tHs_d!B@$#aY#RX+LRRz#lv#jhNxVmnuFpD6ZnTeg$EIoG~FPoy|frUo_K zJ=|JRb?Q|e{>wN-d-X!Qqf5~C!0+x~n;9B~L+`m%e(Q4%x(f~G+8NcQ{Dg20h5Q6{qc(R&HNN5qP30aP<3i>K{vD-!0ayGu6 zapsTnAsmApE_Y!%w`$`GV$b#@v9jV_2g=d*?_JK?ERSUK3Jv)f93Asy#0#8$KWxW z@n@S?%i(fY2z=R2ac8^Vfc#h25X!{9(LJ`z7mi^wh%-4|85|}*KwVvLa{dg3s(6mM z4tj*}17kZANf8%_Z}C!6p%hU+3J$~H~=KUIdVi=vi)Uj$;fEmLbuBqT;Xoh$v=MRJY_H(>qb7BI{4@@H&x^=1n_79f~zZ` z49SIsQ}=oOpU9XzDXgDSt9P75KsHPNM?0Rut*>Y3n#8NVeM6$M!U)fd#h4{JA9nasj{g9B1fa z!Xn&@O|y3uHKr!7$Yf-ZR1X!xPTTjZeUqinfA4qVcXsO?4J%(@h^Y-^*4bU^TjCk~F1b?GsA5a}Sq=}1$mEWHDU5}EBUXbgk57E!NqAbK z%R)t5gi1kZ?Z0{{kr%^mp2+^Eu2b!#qXnKHwnl-@9-Tkwm{9G)VVORynnJ8lJMwKu zFhczAF*!*r6-Fx8D}Re0RUM2X9!>3hFoK%$=imW>z9cmjpUtgo;v9(+b2m}b9lQOU z*(M1bO_me2UdWk4vu}J0hl-Al9gTgjAzE#Z9ehqA4nM8Lk;+_6A(>ns62rCEh#ibX zhB#aJws|mf#+-PmQsLjtVe2xE9;7dP^2qqi%vs8$6~r0`B%|cvg07Raw2TmXM+gLB zWhF>e|NfDr=a&9&>|3URWo1)I30UFgSsFF(R8OeZT(eeKaa^%7UwP?9$a*E!aXo*3eTRBh~GnP7)m^qIatKe1}GJ#;pqQPvxdAIjDrtff#F@F00< z453tBXGk8(W>d1p#C}*8rm*K5H1+n9sM1AKGhOw2gy9n;#JAQ<*1Yg7q5iWWj?~Fq z{l6B&GNs2-x^Of2v%ObvS@icwxi;jtdO7i2lNpo+sJrctF)H$hnCxZT*&3?~Md2OwT zbls(-$JAIJ#iUz?^`5}!B`3V+6)bAGRANLX4~D&5>QdzeNDwt06Z0uaYlLV+5AIKe z!c}@^mSHD;c*D_)&Od!)hM~uVeoI(RCfs?e?AcD=Y#VfBbV)n(g19xf;Bl@b){8j& z9SHO}?_zOp@a?gMfUw9Doh%X#NMP+|e1by)6J6+^PxxcSZ3*uM zp&zJul*htwN8-oF^pe5;!)bg1f#b1jAd@m9qMmLag#6&i+Cen*Cd8dD#*R4vecCN> z6Sj>-KXWKzi_Eg)kG4N<^awsPOFCXR?efag{$&0XnbtIuw&l6pZM8m`{gU%?*dM4& zrsnN3I>MeF+P1&fl$o)Oj5L{iKAJh#VZS|_$1Njbb{2n!`b(gV|MXkq+1~SwGk3Xp z@kc{Q^^y4EEsUaTYm zBR8+~U4&$3rx?r3=UYNk`G}cSR7X#kC7=i5VfeD4!+BO!$FWKCHwzW2k~LnFFa+Gh z1fGm?=;h9zV^{A_=&xStY%kN76nX0X{p6O+{@lPpK}yKj$r+g)XTNzE3%La1LWuiRO*XAm)R5dNtyF-+SvKMGIp)|8vUhZ(ayr5wg4D-Ayb-7slr(2O@ z0TS7OGT>#nZ$qBL#z|}xL!P4#jQ}Og^eR+p=iSd1YknxdztpiJMb=izLAQBXuw%Dp z#&j{+h4c5hH@Xx5nFrly)UNv;{3?cyPAYprN;2EjgbzMZh|V$QVv&%WSy+I)?)P<* zo)ni3p77M7ROdAJ>poI>_xdN9(A#vM*pw2RZ#;uy5b3c)wRLerha^|l=F4)^I%Fq{AJ-0rUhK{12jwwyfk3acsIB$n{Y#RoTJH$w z*C~vHzxEP&NgvOpoXJVoF&V zn8k`zzCiC7b@U4fg@mNEnsKD(4`?QAaQ359R<-!Ip9UBjByE3+Oi)8>!m zMvxc?Sn1X$X-J37cnV%FGkwydaCGz~xcO=`55C{#F&dBDD(1|SD8Bp?cCnH;W)TFl zg)f@3_x}(Ea^dx4AtI?P&X|-|F!i24ewt2&FQm13S~ihYMLQ>?2#F0lD9Dt_v2Dtg zbsCd zZ$p}Uo^mb)T?Ce?*8&>xF}`C$el8TNtQ<)vyPoPE)HUfE}|v6_-u#J2Z9GP%U9t zReAm`_soDu^^@Z>yoKx(HNt;)M@qxIc`XdKx4WMgvRZ&lFz-Od-Gk;;X+5-#)K)q4 zxJvZXzWL`NZdIxoAbq#0Ig{EOLY(v@;c`o_Xvd8>Qg{Yc%X>7lu?sd!XWHKJQlc$& z{r4H9#yKghMtykKocdJc4l}o+J@#?)%_EqKA;v|U!8qt%rOh2)cnpi1O>o7Fj88?+ zgq(8ZE$-faxIWU*C`g2`DHF&(+Rf-tqWVZrlzdavMa%wV86wyZfLxWS5?<(Up1~@Au-o8 z-gHv1x^=5g7}f$s_#?h?=E;gAWd;Lv*$KdSIF0(HhusZ3I>YkAD{G4g#TDE zD3T$YR=$o`A%R8HeA^gS3}Hu{ z%lZ6;fZ8R{?%-C$kvf%rWawRqUA*xlLVH<9eH>HWJ0X@=M6x7lyzM> zF}jJ#X_pf9KZ-T=+d+Ji@Hvk3OC(E(Fk}!6l=9)55_5GG6*rgmg&d~|kTEc7N62q` zrNE48%b&X<7O{t2=kJw5hCD7;A{k}9*8cSH`mmuy_@Ww;1&G`~@r0xKwr|Y8le2hT zpHSMzYpkJzp=Es@aKm}#QL^d7=UG{LN9yZJVBFN_VqAvIeG|3V>NZ^3b?_1c?HHS1)kQMn^+Q+BwwyZ~rwz>g=|c)CP>xf=1p>u`Glp<%Y#X90VxVaxfrKZbJHzUsdoje3T9 z(QMpup+wj0s`UZp0QVJQ5VjTiv{qlwzjmoPn)@@=Yrek>JsX_zRDYxt66qS-v6aQA*Hy+q>1%ZTX0&pGne_NSUl zzk~8}d{ZV}!fmW49>*cknePmbzYAH6Hfg;Ryc`Of{sG3WCW#@Vsb~PB; z<%cx~qJ!kNcmL!Q{Lr@F-uyUxX=w&#uMp^^4N)+JC^!~2idwTLEB~zfgYs@G>MZfn zi=;vkj2)k(CXc0=e2<~c9|*r|YVE z(Q2^Z6bko1`^4fQ3|>zGyzazp`Aw|iObg8O#}9g7I2p0l!eYuR$u4(WQ!lY! zQ^qQPO;p0!ByKKI7rCs`(wBd3-Wpw&}8{uXH+YE0W|f{b30@^iDVMil&^#W zkM%-|D&0&1qHCN7o)>=Jq~=t|n3Zi_WKs3G$=nnF^8}$q*UKps%GESCztl7sY;^@c zNPFVer{!fDI^6J@4g{*WEydM2;m_?nD5Er$mOA~Ey$_L=C`Schyw7!pECIi1IOlHv^J-14+WENfVxdMR*}W|V5vM=ALBp- zxsHy8@;YOdtehG}s#4GNX<1$XKb~3>p&6^lQj$+HX(Pi7bR&(1gL^}tnR)-9z=fNq zRMxqy1U^*ao&=hPpiz0YYakF8xhn8G(ci}1o9jt{?mj>J_g#MX7*rw0H=;?syVUB^ zKf?fT_HAg~YLk`7l=4MS74(kDglum9{#65zKZ)S$GwD41QU^on9lw8nQx|vJnil1Y zDMXPut%uq1k&-3KT+FR5L zKII7|frU>_(YbipG2G{BL5m7{kJiF+NA2ujb&>ukHmgqN%=3HmJ4qI*J+0z86wX?y!<<$x>n|u%;dIdMoMPHLG0UfsOm30%3>M zm*_EUfq+UP@8BnV{W_jxGK&^Gu@+J|FxB`BV6G> ze5-M}F5HBijPzBi%;s-M2^V+>Bln)NgZ{RMYkrt}qWZdyiRJWoAJ~&U)C& z#VA%#g#@tZw9e!3S&yZLaUb)^8t&mlJCN$Ss%WNaYCzMFK+-QB1ywx-HMF_0CS=EX z>wQwk`iO`Bdj8ePa;$xlYwUi9ukHF%MACU~Qj@*dAG<B~T_;wk97qD=cGX$86lWcLVpfv%L@f>${ZPQOv8{ zDC3tRkrkasu2C+WNaN3ZgAZjeeL<&vU`sA{`^eSk;7^Wz=NIBrO)f>+z%1m0{oNt zBya4M*{-=5+aq*g9`Wg0sZ<_&%Fjo~n+m($J04An{ZccXaC_b=N`oe%M+2ysKEMnt4YUe%SIbru?pj zxpAxAmI=+w)qQr4^Ax)BeoNelR8Dj<+I?^a#aCaiaMH#xxL&dC2Z_|qbrth z8M{P?U(^1|)P{#)al4lI6J*#5((>#=Ttrkfn#((b!R!dEq;0>+uJkARohJsNJ+t0U;6(q|ycr}Rf1pTn1Fp5m zTZD3F^J7Eu$=U}{=T~}ktgTf+=LaiXM60!PUMdL#SkpB2eR9pp$x-A{K5nY?Y`6Wq z`|TCW{eJCfmlN%2R!b?NPzdD6-rNt@#X0IF&SSwiaObi{3;x;?{ngE&;*w7}!6C)1 z)=s^`%TfKLi0)Kt|C>x8FAu1~`R`n0F27ISL~huza0IcC^qiia&di{xChFeWF`t~A zG!CAbnk1LmsjJ8GmNqpt`Ab{OGY)#v2mEejmsp`vUSZXi<=N6`0wYh;Y-T#q{bQ|& zXT?gXZ|RL8$X3%-*T?e~Hc##@k9Xl8z(vf1x4J^H(_JAWOVl2!B5 zz+jKOt!N+UsSU=!v@ES9`DLXs+{Ua`_*j6)lSJ$0CSJcDcgkqh!IuSCV5d28Y?+Ay!Ta{9q?`g_h|wX$1tZe~(2R&VFrU5P-?d;x zU|$5`U9*Yt@$u1bpUdyV!a!z8qYS4A5hqX4&WHPdnX1 zG`q}dN#q?Lq(s)GxV*lTAnQ|TwmFvD9CXpnxrYx9Slb!gr%!~QvUOd!Q4d<`F&xe; zp~Kb8`ssol%z!7;s9v9GVeQwtc>ZO3Azs`9Kc%Og`_!|C&$6k>dp*?<*X)Pyd8>Z6 zp`j5~*bzVBfd^cwU;AC3-s)4^ z?kp|}8TOu8JRMizP|4{Ocq~u`Lv>l8H)r$O-%y~N&E{W9(8$RK;DT@mtBIYLVT={9 zptI6EO3=(TmODn+yx@(2GF-t`kgvC&h+iX=ALisJBKn-Yw0!9pDxPH@fyBrw&hHej zK2=aq7-J0Gn=4ycIoz34(K;oa3W+SnIRDXP3JhI8n6hOh&`zh;lsnwDCA5Gc1Wzo_ z|CHk|)-Czt#<~#pBHMv2)SXUV>sIFn(ws-j7<``pxPZ9>=a82h1iHTz763RmAs`s@ z0j-U_z~4FnHMTDMx8~LOD1bI2)F`dYIZ&E$HhR0wX4L$kS*#V!&tgN2b)pHOixzH&K*_phTXAkiNLWTvdU{;#EZ&;%0V^m zEmeN=F!MI9{W8A6!4};zHsoxK5@-5wVnPB58L5O8YBVyBkSlE3Xsg-cc+s2yDe+PhQnz=02ZQB>{q8bvTg@Ux zr>S(|7GKKMV(q&EYs#cNXXWG`%WY9@Sd{Eh%i^=PN*32{ESFTzAAWC6p#G6=`$X!^ zgYUAc-50vAW1tVTIrJc*eAy#I&x>GsA)E>MoBK>ObaY-sO2bX?1u2z&+QN^%OErgv zU1!kv(&`)N5g_9BhWWdmGAwrBfzo0+Uvf-t{yr9CYH@--W6C)jcAuL)?K#u(V1KoVv-_xth4opIuJpn0(i-2JICDQh?KFO>(IT0k|>C&@P|q{Pkf9XtYvE`WZ` z%gakhsM^aT<>TYa7WYW)az`|opQh-c@vH4}-ZI)1IitCJawmuBOXs8NYaJOGUsHe` zDpgo_9o}0I4mH4$4%n*~?x`C?G8~83&C|O=kWeUC=hvQCHhAo@*LaBR&szTvPk?wM- zbY)nduxk~RfK&K!)TM}tCT&cI#=~WL@Vj&BFn;ULk6akqFF~w(H#TQfp^$T4TP%gXMs$AFO^Sj)X*ztbK&# zWv%(_nStzK*?#`{*>bzfAN|lm0mFv@LVT-V#drDRQd?y2)EL}T?QYZKZZ+Ino}Qk! zrh!^-*2TYjbi234h zRyZd6!8XIQ?SIO6!67@~yH=T=zH~Kv8XM@b+)ZsxTLc19SSjJqFTI>{WDFs3wy`Pn zu-cp(46VJ-AJ#kSzfc8}IygR04?9XwGH1~o?Uy+(QK-HgL7HPI+IgN#O=XJgpt!f@ zg*$=dm^tJsZ29Wv*(g^w9_zJyk-FbCUZ*L+)O=!Pxc(sw^-X~3Vrzd<0-Gmy-mapO zU>El1z4%L5_(S0vZyKYL*sNrR9>idM-44x4UknV3W#xPd5V4RQK*Icxtch|VMin34 za`p=Z?T+d$1p)poceJ;^bb`fb_x6tr_G5uSLSOn zOxTNYb<1{z%|A@bI8uz}%{QVd+cK|HKs7jE9~W%z>lLu+E()Foy)%0hsm!?-wuS;) zDl7(C+tB0hWjSAxj24nn6#l|eU@;G{1L3Hj(mg5rHVm2y1d)C`%_xU||HQ4xOU29H zQ61z$_7C!-TlSw!hx}7GmH!&#|AdwDyLtd@%KvX?1pZkx*OyGb+6h>(Z4?*;s=3I# zzHO>O+{~$_!0sY#G|@%UblZ6Pr6Mno<^VC#k%0HU)GbE51j`Gwnrv=Q^A-_Sn@t<}_(_W#((384{K| z@=gmij(2A6T>}XcS7QOP?|*kRAtSOf{0Sc=K+Q#jB)?o6|eH+w$ z0i?S}VA^$SHa+UBs2djw|cnu_MT+4;YzS@m4$XGdJ~?3Q?`W@DVGYO%*A~K$zvu7j{mO z1WHn!oc0fv)H=<(C2@jfk%{XR_Y^chzYc)(Ok&f-TeZzdLe}i|Fu_OAn;$=fXssm9 zlPn}dk`_6rya~Erb%XEMXh2{qTRO785Fe>IK{Z6=s*~RLc7a}Yl5YhK^)m+P4D~yp z?ycu+(NvS^0S({y^Aq%mPM*(lM^sQ>16g(2&RKeAe7iN=#r1MA>9wZ0YhpWKwiQ8f zY|&!F0(U~@8WkyXxlP8XGTaG3AjM?z)@O;^D<54L22CT??f_bS#-^%GeP5f{+NFT0 zwu=b_%1~z0^kPkOyasyn@Dp&uzmeGO`I=aqL1h8Yf!n2%+ygB14XyD>QiJH8SmsI} zYC@DR02uQHYx(7Zn@+=%4THPbShL8xKvO4fe5&(hg+-R{SG!bsKB$Ve)Zq&!U@f1i z46Zg~nNXZ+PcR$++x#lB9{%^Bj8Q*9h4Dy4*h{@{@eR6PmgO?5rMi{fLNdPKpYDHLL*dr7Zm%KF`B7yOylrTCsw})!1h0`7(5YK%LakW$So|d zZ>ujHRI4FvXv;r=tQbjYRo$Qhps6hO9-axUb_R>d9FLVQA<)xm<+$P|bignMDY||? z@DXTgbmjw{_)z-0gojC$o|;aer}+`FY?%3iIO*SGD{%+!k{U&_Fcu?OZs;)DJVmw*Zj8_xk1%xRh@f1M5O`c)Tm8eU2oon zb_uMr#XC*R?vI)PYOoUhf(0kj5gCKgp9e`M+kjmtAcOa9D!Tk4>om#ITsN{th=3gv zz=!?XMyBNDCh|x7gA3N*wQ27HV@|1c_OKTarWfbv7Rw~7Yu?~h0>&)Y05;@JA5^{K z-^}7jY}fFZ;{>`6-Q0TVFXbsW6I0Dd{>C)4rDfbKc$-II7s~6IyHB2L% zKpUd_m92=6$Ad;z&eQ zk~_bXy~h)ut}+=7i!JPp+M(KJa-_*YH5*fPw!C~qLvZC7u9&>X-+_FF2O1ufyiTo@ z#vxXFOx|sxKa3KS@b<2AA}+8eC|Yj3`KD1F_9zCWQ-AM9(&;n)!GR}l8cTnef)ulS ziw9`#*PMpS2eo~q;WmE4${P^@dLtTXUUSW?<*=LbE$~P5JqRGee>nh#5(70R{d!N@ zH2dmS0XZ2`_xfLCzw^wk_~f-=U5B+Uxl&dXi*Lq_nxQ9%Tc5>#5U|D!nU*}vnt4@| zL)ZPaAAJAK!U1bYkNA6V99Efm?Iz8emq3T)h47hn9p#U6D|KHR8aoo(vj7^jd zrUR>D2jocG90lHrZ#5K03aC;8sM>AP{0qF`)Q;6tGM{YQu~O*(bPJkk2v?r?>|)=E z&g}%-5hwtcDx8Vqi(fb;uH9eF^VH@L-7@}bE1IU?9g_P7tV*8(7NJ%1w_)^egpvPw z(qhHFt47(}7keE3I9`7ru5{Vw4TNtkQ1BY{Wq!iX5Z)5{(0-I%IKl} zDNiOTO5{h=H4*YqwrfTY`+oWR3*A#>VcLo$eiECn45B4rRRtOR1Y0rr+Gu@Ik-y6V z7$>c&M6wB~Hbs_n28oZ{pK1Cx_J5Qw3{@6xfJA^z^yW)DM(fJ=&m5Ciul>#ay0h4T zMWzCsf>CjsKqnOMZQ#!ggM?x%=X~Cc?xA|6O`#6b&(^Pf>E0-NI;XHkHfU2-;*uFO zay74mc%rD?K(z8^#DTnijveO(2An zw(S+!t~tHvY~mzVWo$5cOI;@h>V~W$@4mTpV)i7B`1pllX^a8+9gvZO$^P4HK!%Lw zice%ToL2m;l!0yts3r#pP`^IQ7f2MW+)iTw)TGf2;Kn~I^8%FdPwZ0u&yDlng~9*+ zHmX6h?_?KmuDBu_=ra`9WL%z67EY+E)y!ZvnXJ7H1HD-Q+PW1sQmZ8yI*bZxTW?3k zgh8TxWDh{)b4fO?HFiVqkvZoX9z>uo453gU1G)r+CMy;T(b zW!5){*AVm!kpTpP2lL9<2_Yy`tRxK?lwa$7VXW%jg(R~T!uDKJApopbNHUuVh1LYds_-}_|7XS5 zcdcK7_SGoil~#+w5oW@4yn9~2iVTwa!nK-rOXF(#NIJlO_k389ntt~-)g`uL9(?aR zxh*2i7xOm=(%J**nE7vWnF6wQWqINzHZ$!E$dcQXFhRlJg@`(O0`=}XWi~XIw{P8Z z; zdbh2K|CI|MZojVth@@r+*whZpFZ+)L=Fy6K;`m>o_>>#7oupUTynxN^7FXwU_5GE} zD}#D4xAKpW`L&EvIgw0~4}XgogL)Hpj>l4{w}ZeYLXgoF;MV_3q!A=DCH8R2TukK> zduZl&yIT_2rIMkNxXT{zq|zfZr~j)E3{==JhC=`xP^Gh(BmgVqJ#=<`Ky1}1nAO%y z1bW*1WQ;33>v17PUj~KHC5crhkXv+1#}s&0a4iElGEWB=Fxmg^9R%GZd@&1}VhY#a z2vNBcWHf#A1qcdHnGW&np<9=)K{ZPNb#0}lzr-(Ot(XPf)r4@+fdK2^7TJvsHv44z z7$T1#->D!4s#HaW?uIxI#vynSOk&XNA9p!OnZyu-x+(t$3m!d=T}Dx!#q1^VsG@_;GJ&rFN5EWdFwk6 zP1@1~0_B*pD(hMf(w~t8e4Mxn(X6`6go$n-vNfq#6@cTu2Ere^e#A%3(t`wnT8{0Z zLLXWiqGO!NmdXNzr!=lA!UcVLB^{BiIu%;b&)&aT7wyX@Q+k1qEKg)pW2xl<2K>I< zMB)Qm1$I`7jEASdq%cmMgzop_D|^w(GU|Xzd5c~iyh@e_v^$&#WK;hc;!Rp2Ur(oM z>BzxN(C3xR>)nuf^0Ow5PWzCnJXaGCh?a&`m3Z2vJ-y`Uy3sqvpg@wx+jQ4KzvgIE zv-0^1hbO|dq{!FxxldZ3Tr>Nqrz9K~Z7|6M;kyQMa#ftTlrMOhD4>=WAw8T(^R_qq zV>sV3@4bs8v29Bp&@faF=*)H>BqFJtOjS&YBGcp$ zdi(GY%>KO=r>9LKvb~)qz7d8|GH_-Z92E+UNpe(Fj#5cuXzNp0G?mx>>~P} zVRe3x826BYTo_nYyWgEBrHKsD#ry!Aq!1X!1xQ|b!OS8F)Wg}8iETfgMKc=#ufI4q zCgYvb;S}4*T$RO71BedLGBb@Wj3N(l*Z1jf1GezyLjhTl{1XlU~d-2#1%0ry;_PAPb7LHa_uv{GGxjqJP{&DK{#w>HQ) zC(N6eW)7sO3Co zn|CCj7lzU!R?~tfn-ls4y?05>;gnuL@HtUrd;X1le8Z@0BfWiA>C=?JrAE--5|y%? z{%npIaSfmshbfYCpa?irA;aso4}aSU8P@ z{E!8GhDEXcTt9D<5bc?Bjo5|C8N?EMwj?o%voMP&L={s}vM88+)Gc1l)dV1MD-qmd zw)!^nkW?Xd?M=KidE+D2G8(74l(p(7tlWZzw?Iz*iuWlQM>!Tvstw!2gisNIk3;~8 zym|)Ays|eYl(S;wGk~?j@BbUA^Ir+zfAAY&{<9{<|I6t3KLoD-x*Lc%|6MTuFPZ$8 zO#YKry#Fz#`3;CWysY({H46kX{N7Siyan@mgth3%!sOfLGHAuMG_sz;17)AEs8a3< z65I#@Xeyu4n6AgD+QZ|($5aZ5NbUhglrCq=-Zq=v7FP?25O<1tLD3EQyK~;h&gbS~ zZXSZ-)ui^**ed#7svk{{V0=-*D|a_Xy`XYGQ>fDj@OjrjTRl#9b<@+1z*A8_E9N!? zo92B8FE5J>1f6ex&I6+1vv}u0!N%oS57H^7X{ADTXLh&VUq0%yn!O_H&s+WF1rDwR zkKg|ye*eh(sKjO_dh{!Akb;v3*Mmel3}?lc?uXzn)WAE&UP$?VYMYDSzuizjp(K8y z=)y9d3>IM*F_%F>`@MyIfAHzhNTehPuRP6^-&CoWV`Kffv_nm1I;!WemZbJYrt+*C zpef(53opD&qf-lX-P^6zuL!X9DwJSO`!Oh)35zp*ja+1;Qrbu``e=PhD(di;mj~n< zKmDL#QGcRR*h9mJ0lr`=-e~+poj3E61vT1`Q|c9Ku{oyE4A+DxM5k2sofkg8){z}7IFEB( zM+BF59`!fDgp8{Lv2%QpH)ceX0V|IEJg)<(HVhFT&vHV{annWw3!<4{E_Y6Q9$AMt zF4jccQw6*s&PCXXr;gt2~s!6)Ef zw@J^W3+V!ff23`-FAH3-UUO_)kq2tVH{ojL8wO(-@l}U5R(4ulOdESG>X2Vz{xn?r zy=n{jU$c1rv*}Tjrvn)3;{_LTEf29?BXEH)8ibrZ7k|2Q^STk+Uo&_VEhD_$Xp1tc zYh@mFl1f)pmzN#bYR9Ae|K$eqBpDZ)GG~Q)C;yRp#AT3`B+ z`@CIR)+SEI^<>#LpYlXMp*2m>I{0FtIkDxNMYf|1?{z%z^1ls7kDP}Qstp`{HVu)3 z%~FPDJAQ^9trN>^%T*^$p&W<5GAzh_yp-7jaM?;4AmSh1K&PHDP*Ox!c(zWnf!Doi z7n$?_wD*=lakXE*XorLtA%YViBsjr6cnH>w1PSi0Y22j=NeFIDa1HM68rqw1`31Rv ztyWZB$7buBBTk0>=aM**y?pahf1g;WJQxG^y!xltkD^&)I%l(2s2gjyP~;-_ksBgR z-~0K>gFyy3j=J2?#X zcU^Rv*zjl~=35i*g*iWxlPSTM>%9pC9sV;sD z744!M^gxnO=K8P>W{bMv6zMdiVb{XI~Ru$a6GiJ+f|_0X#v z5f=4ai!B@;vbXR;f~!q5P*kMSMr_q<-!NJ~#iq`lqv@?Vw8FcK1GBi@0;_S5L;6~B z!LM})8S%VPi|8j}PaZb*Mc10g(-_>7K<9dv-Vfkv3oj0Sd$%sk5rF=piNx@JV2fhs zj>E;Yv@ux~is&NO-J{pX?b(lIZM|CeTc(Kgx+02ux3}aKlpLqR|!p6dQdo#KzLg0vVYbS(sS0iPh(aYNSVS6f028U@Ag+Wh?-a9@lD-55dEhG7CIjHegRU6Yr>A0!H()3#)e{3x93$xn|$^OUp0u6(oVm~PaIqp#AT z*Sfm-RPgbBN&z5IaZDyj+l=y8saiThLviO`{k7LPXU^XJB^r9JtMSu*n#h#atMo{w zofU|-feKA*p3~Wi*KSh|%N)uPV7__1H8qMW+14Uqb(r?2xp`D^S@$glEnawp{%OZ) zt$l?`ZSaf@IB5Y0vjGaF@n=F^cYeY&p3B0(urOUQ?YFD+`~A=Q=*NOumS>9IcDI35 z-lKGy=d^(BNir#S2%DS1hvCFm-893Ip>qm7Q$BBRGgmNW!I}3^K{xz9=P5t5(CU%V z(u3&;Dt1Ch{*r^m?#R(apF<~iedwB4TtG^EJxy#a&@+#3C z_o5sB2sc|Wa6S&vHrN{&7$_08Ehhp8*SPKyJ~`w|`O}8VZW$3ZhMarg?Ge}0*;6XvyS^Z$nZP6JNSJJ`~HQ(R?+QNqAjm1 zHgNfqj0|#r2dSlDi`gV5PH*zW()vcq_ZMWODe){BC2)GGm3rk{(b1_OX zb~nYV<=c&5iBX7$2N)Q%ctt!5bV{Wbrcv|s;*t-$Yl`<*xWt4*0jC**BFk{%_$7R@OXE=I;i8LW8Ux=Fs`<9&IJa#=_tlb}Kk!*2bNYmgP!3I)qH0RW9ih ztdvP_`T%&|i2YHPWVbVgSxaEc4~w^Rj73LW>3XqJ!aB!q0m8jhW0l%IT~xn+EN&la z0#Sn?nC)hU?1!19on;vl1~A-!WjawuMRM&UO!4Dj~HZ_(Hn5zW0aF;4Th*zg?_Nu~t)Y?@qrqMk`+ zwxJ?1Zn9?e8VFv6eR#$z!$XwNt!nIH(uj9-*#t)kgUmomTzMQ{N_s1SapMa0)KJ@&7DvAI(4Q-He86_c zu3u8LJk@U-+^mKbal`f(xiF$mPrcMo2Gpk9SO3KNsd)YygNgK>6a#hnoMXr(gj;u< zxIY-bm^FMFIY`c3d9?6#KOQ+zW-XcY4#o8L)J6T$+o%1NX&i%9b+!u_!FZCtl&kr} z&7_0)xE2lKx&lLACiaAjHSdjfMtxk;_2dU2FvwQ4I+&r3L6f&;Lm8}ipl-LlVKzCy zdfCQ=Uu)T`Rr>Q6>hg`f%HaiTv3>#Dd|TTx%i@|ei09=swv;$p#3WO`#;QeUGCiz$4R|J?GkBvIh2^t(HzLlTuFx;eWr#J3vbNM zK!H4W7Fl}2uop?y;9827+fJVIy(TW1PrY|L{OBKJNkixx{U8)u%b^L6uIu0I^q^mZ z;>AIvgOI@QfUe4Q_w{$n(Klkvsg+xn=qZku?yKp1^u_(OkQ8P-<{+V>ikdobc#EdW zF`W-9&vz^^FIl(a5jm;+@r*i2B&6cu-IgntVamL93`rInBnV!SAIOO@In5T$fEHzp zK>H`P_Wr1;3|-y_>_%0Is7YGpVT|uq8jNX2-r%b%3 zGI|H>`|J0PRP2AU%ISavBT%mDxe?vJS>@`z1>H(?2cBh6i=6t)BqHJyG*4Vn)EVS9 z=5=mZ)00SYa#LVe~t5P3JL6-zjLL^ zqe0p9oYLj$q1G-Q(EqT@M>n^4LY*QAD{u{gnE6=pWHZ=?Y7bLl&;KvhI2$h< z#;itge(}T;w+XPvffTIThcW#&@L#da@7ryj(GC_@wx8JcHBNddP+Gc)FC=AV9PA)6 z+G{0fb8xu&>iaXt2j~XIpP~G!GHbwpV}DjNX^CgC@?jQBd*mT}yhh#ea&0=?Re9ju zu2qJ+#)!9D=6<>e%cjC?UH8=T^86tZvdHyI>h3ZE66TO-sE~N*|`P6=wzam3VQL4avV5^*&UO4xCHTU7S;|HOo zdML%2E9By~YDN)LRSD)XHHdKXreviTgTF>)xv2a&QZ+6i^bbfyY^O-pHe(Tv_3#D1 zA%`mg1=ql@M*Z@=fF0}u5SqHD(H1tc73ui$nBDai?l6=NWqsue#YBzb`S%AfwUHkG zT!gAK`JFza?K=B&gn$FEL5*2CibJfl{eU~Sd^dz%&5y2u|iss)1Ic0#Vq#{lU6XI zAV0>B?7Wa^*{?Q};qC!+)jB6PBe2ocvJ(!+bQ@fbp!1QEyRyJMb367?*U~P4j{oK8%=>>Uhd9GVJt*H?&5t2NF)WeZk^_xKaL>B$^ebjayp)p)G zPxOpV|0LjMEnehBs|=ze6+50Oq+t~d@DHgAeT|NK41bweX*I~{c!nn6;S0=&r<6sX zrrk`}C;x1`KVS~=!ts~Dk-yJ!hn0iIJTo&p&*@#iBuS_FY^64tG)kx_xm6igKE?I| z?DT_sQi6qGsaafePtDwaj|CixPZDGmp&S=`il`A$imjbO7fBdj!4rmA9Qfl%YMWE1FC{?KfRjQ0!NTl0_CNw;j8U0R>k~ z4jvq^zcT^*TW?zoW!{XDc=Uv1;e;JpWJIoBh-yElB}~_){wnuK4hOdlgIxSq4#G^b zc$8{4poW@I*i071Qv6Rbs$IJZxgJ~~Y5cx-L|erL=(jQq=NneyQ2VdkOAXZ^=m9F) zmdkpe`#Rt4!GV%@l`JJ%%J{}W2fCE;pO~bSeFK|mL{dIf&x2=$Qu= zAaJoed1Sz#83S*wtc|({O4{*B{Z+!nX=XN9C6H~txY!Z}Brn*v#iafk*5_So5RP?T zaP0;H!037uSw-t)>}7jbr=d$y2NnRPGJ+jCqB2xXw~DBg8ZO1F1CaKQ{I4K^X_Iyt zeW!`17Cn{sK(gAo5Hot|Uo{~$9Ge)`L?BS5j)=Uzsg?>w+T_qPpf8brb)M%snbZbG zc4Fmfi31Vf3z5NJgVh|n{mb!f8cC%;_c)_w!yJZUrcToLmoe-m`09qGF(dKq33~{YyO|Y@ z+D97GWL2hkEFiW$#>ZdG`LjrCZgzgNd~r>mor8|`m9OtxoW|T2AGGALBN40NEcy+G zQ&VW#KhcJLQXdX|Wpp}C0kcN~sz+rhH~($@aEa?D=tZa5VE7lGmUv3-`bjn9H^bTw zy4xjAi_M?*cO_CX^QW{XKElDsgsa~niiV&uvJ`Hxrdl7l9JvL>8@v1G4!&s(EVu}R z*Jx2MLPu!Qm7z>goMjHNh7iyg0Rv(BiR*rz=S502xRfF<6-rQTfvh%-O6Q}&msv-z zC;bI`>7x7cr$xO&56_@#_;D1z0Ox`R5u0{mDKDm$@uHhgs+gQ=SshL8%)`R;3AqhD zu6pu;J_-Dp5$rs`O(q-sJz#f?A;F&>YkVUT(9{ua7x$#S6X(-yfIs21=E1JRbYEEC z!!IRQ>xK;CEyYBKi>LT5=&uR>S*pKiPZe-V}=%{10Fdb!?;XKe;1CTT={-%%khT8d*xrT<`hA-#hAVbABsp+;|FD&!)zV z*u_{%=9ZGlaUVF|vPstCvi6D0{oL)j+B^Cm{>Xs^-X0(=p0M+gWxb^7Yd! z37CJrrX~ZCn$g_Z%J)S zhBT)t5b>Yv{&-t9FR;U?w|{?(6SZNzf^D`U;0Vl8xx9MEadZ4J>?C(5$Ky?^LcUBy z&`ic`O(Ifahx>mWtgOu$`n$t=Ig47dftwy)F`_X z{nRYpo37fCb+V-H%*>#i7mA30&PU8=M>>XCKdvxu6LSxF^Ewr-jj!Kt9IXYUEp^(j z(4I_b?Ri9nyH}utMjGW4s#>c~?hPfc5=n^Z8Lgzn?Wr|>$}S9ZXb%e7s7cX13e8<& za&lhB8eQopEc*){>f&`R*cPpG(w&2X?2qqsfMdSfrS={JCFhim@F+vx*f__q z7gUJEyjs_Z7Y$2J1yYRKb)zT!gdB~)5MOeqv^sJkhbdd9pr9NtBk|5UHo^V><~4DV zG7jrty~YkLJz%sNJwe{usMcWWl-eGL5 zrb7O+Gj(>a2KEXn1g%%cZ#z@an5}J^SP_%-)a$xJmzC9g#XoG zBd|wI#v>mTEItnkYuJ**xL+E$QhM z^CEl2u@6`cf?q!F(7F|B2C%$|fstbp;c$CQK4r{e@T zhwJB4$`LRr%(}N=o=oxS=ks2L7o;9l^-K6Co5%@@FGm6%3pQ$cOI3F>fTrFhD8|Ki`=K$xdUb#ZG|9&prs=-XU*K2{%oV{P1 z;4<7B{V12(C)M5?ti~d}mT0a%B5IL=I@$X}OKf!a0L&%SZm0w00vf0UP~@454Ef3J z0K0!5P~G0#kuiOdp=x1@ya4CZDXpuID7nd=JXxYp z^2i8pQ8(xIiS1q-DaYjsi3oqMmPo4|f(Ky10B0qr_DdAAe4N_CcmH2|dt)T!ZYqRp z+GXyILo5DaEkF%Oz<)+$7Tx|QM20ZogLTT>rP@^F^h>}~XCn+fjts8z8K=9WkCGnc&Y_*1Z94J=p?Ajh}E zf~g1(%1ispq&IUWQKo+~ILNW&w0>4GZv|gn{#ab{B$B$$a5=%XqBE}$p2Gjw{8*Ar zFzXZ3%N)Nucqe!aMfrPcYGv^_Q#m~&hk*ueJ7s~TQ3D9fBE^aEn9ff)(+j+}3u_oF zMX4qyJsO7FoIt)Ydk`DBX?P$-Z-RyYgrCLrJGjzc;KHxy4EpCS=k(Y~#NLKW$g^n~ zrCBnERk&2`UY^hQ%<2Km^b6}h+*3Alf+jL@$mVm86*`^1>}{vi>r)j(Z0@QTj(m9S zVeIy5Vg+J3qrW~L#acKXZmZO>|J{FGt!@SnJq1);jX2vZw)sqw`l{l1?4$gFitXQA zzuJS&f(4fat=4L_H=eTHY*z2@54HS7x{ClpEa^`N_^ITlf@fCZ$sdpuYH&Rcl;ewS zaOe152vaar0DBt#6UMwd#`kLo(+_MW7l?br{g4dMdNqVHRYiTPsA);~t?hk8Yuhdlm2=cbYj$0H5jU zPr;7i6_=K|3!9wWsR(RnL2;MsKuo0I?iFCRLFWs;s~W;i2MA0 zadERBzLi`FWp;pT1pB0}D5;iR^W@M9*fYk?)*S!y>Jw>?Jk@%tC#cKzdTpS`P7zi* z&y9JlFA-#q+xB$S(ce4DTs^}l)lgBjEdJ#brkKV^%Bq5kg0n729j!TrxV0}_dYlYb#pSf7%g z|IOa*dPKbHl&sNkR->&Hu82@CjYe+I??3vHLCQOR{iFTOZ^xJZa_5UEB7J)rtU8D+ z19=h!keF9ODhBma7Lfi^UEUjfeau7EV*jjsm5oVI{$iuyu{H;<())<|1Jxqt&T)Yd zr-iT+MRC{D0IlgSThh4bAoi%jOkQu}y!kgkzgH^J=8k6uPnX!jzV*Ee+bqko&7IH| z7_BQ`6Om`<3%SiZ)tE4ZWS3SJv{E1MbUM6)nQuf4Hgy`e$;$*&CPursnz3_hEmOYw zhO6Y%RP2gY;_Q+PU0kljC-!JGaFb&o=MuMx->aaC6Y)`?p_;bZhzwI7F%YxR-F-+`1Q$%wXb*pp za$%u@6HVGC+A#~>BtZ@A3N=nC6wbMPxf8lS5t)cQKPZX!ZdYzM1XBI6{{v9WK}%+S z&Bs1bmO~d2;2S=_Dk<#kos-ki{1H!{{=FRdE%5m}!_o3g5qM^#JQZwna3a2+l9a&0 zxp;yWl(hc<+vS9@204Y?KOVpU8uM&S42FKy+`+f^@@?v{C0{%;btwK#wHt)4$|?4V z5Lgz#7-`s{4Z;)2=}lkBJ`C=}n>0ZAF5t?u(ut@W$Xd})&-W_rxzuec{62TH_%C&? z^75}=U!fu)(F9QgMw&Jh|A3J|y*WeJMm7}bn{F7aGYGN!Pyerl<^%IE`!pa`<*nMH_UI&*(yF@f1V3-KQF4ye8Fu%+2C}G z?Oq&`&GjpxWA;@>2=k-RQYk=UP>PEz>T&d4Omq#EyARps7z;Wdy(Rqx>T9t>ux8~?<)1k+Io5?1mZ}9& zyUHDL+y+1=WB$=+I!^=~y5Gqe3w@4^9&!`z+=wDHbi~-1XZx|gDzcfb)(<{t|7JXspDsmCSOb-%$ORpfNq(KMSQRCaaxcs%??*ojT7?OyoQK1V%Y|IQm+( zGu3;#yKf{Umu8ch(Z(#FoL&jWckBj6FXvcikxdCbB; z6Lh-6YzhP~9SY_q*f3rw1+z)(CFBbjJNf_3zxI0pAOml|n+v8Ntq9k*U$HBYu@MM0nr8 zYR^lQq5Yiinu06!8}K&4^t$(VI+@SFru5WgE8@eyB!L>nH;=+Hrt+p3%3xx@gEph{ zozi&|%!^vE9=azpABfpk%+bfQk{J&QTAE*7W}|Zpx1SBO0#~g$P7zTO@Av&ykr);{ zQ{7z|^4pn}#=V$5f%i1{Im(gbQZl1phV&8x$76untqy*1@;{}Y_ey8``iC}+~Z5(+nb~_r}>Ar4LTHkEKx0h@&_?K111M7Dt>i=((E7n`2+Rp ztjp>vGqEwBCoZD>i}AUO`tF_sl`z{oCMY5l!|L7hUpNn<-2^2cx)-WiR#JKcT~7qa zvUd6!%xcJp64>BZCRrZh0B3^c(OyE1%R&?p@{B6-6!DI4O6WEC4+C6AOY#&crTQFw+(`tU8l$=l}GI&8!G2tf_MPX4x|Ev zD1svD&D81X;Z5jYn|kkt^8#n5q!j?e5kve|gDHRm1r^e0)a3p1q!k7TI{Sp{?!O-b zC`Kivm7xA!ffR&#u)9g*d{SMqI`SGdOp$M!fLlyAL)XFrALcj-J^&!VIcPsbwNv+OY$c7dbazK7jJzcm8 z%K!v6kc9LKVlUUMh|tp|hos{f;WIn8-_gkjob8|P1^Dt?rr6Zc1#saW~sdQ*k~ zLW}f|fpvu)GQ8+IbEupbyh0a)Uww~0uirJO9Pp9_;0Rk0dCj9Lr1Q>vudVka9s%TF z{KmPVpvGqxC}eX1SfkY^k*}Zgq*=>Nhb6Q$gaMQ*LE((lJ&ki64R$G#6Ql()JyAS( z0RF?4!_%q#xs+dN9m{`#=>t5qJ-)ApyM8yt|EeCC%2@2nsgfs;&rhngkvLhIjf6aL zSZb${Oa91#RFQkpW(N5m%V5L42Cs^%^?iA@*)K3{?gWKrn35RF#Buq)wU%!f%e!`o ziY$OQD*6&y#WBY`M<-X2fmZ6|6kkSuC&klbBwc0a=Z#Yp*aOgCFa2t${T?3M5>OT# z5d>Bv!E^YIaH|30)ZfriKdGDnsUM&uDxcKRMq?lY?%RqeMc(r_0J;XEXCgDTM`gvK zy7A^c$MB;-LC~^nB10SVjBnvz>*KeV{kv0*USap>6Px=b{D38+={`85lx1NTxnF5A?r;y(9YiXS3A9HV?Rc<%IQIvK)%hvt zWA9#RwOPPrkwcDC0`Id*+Cd#P*VD%U`}@`#qsx*4e&Oqk>2wX9_|23sPmcKvRMh+x zFvgzOjZVG!w152dp8!k#xJ^JpBsoM`s7u#&xD^fzo8r0Ty5*>{meFjgV+$=-$@>H3 z;s9tQKn{}!S}%ZPWl#X+|0rSm-%6xG(eMAWeg-;EK{-mhZJ2`B+Orz&r+qcM*Nr5O zzJ{mO$_;rI_VPSLxdqTRH0(+kQTZpMBxOn5apo|# z;Zht8)F*TYEt##2=vOEQs{_Oz3Cj)hxM>m3-o+!%a2z+(o1Ae+cx=s-)LiT=$q2YF zNqR_)#N=->0Da-J6ux{>t1l}DI<suk>WO>>_ocEju;{kd)0?wfs6qnAzF za*empOKZ!?v4>7uOD@Zmh%jVnylO_bZ4OtS(~yNQkiQcBB>!sCOLxNX+X6q2J+JNg zJ4c;T-lKEA(}k+FxZ5gnw*Doz^F*jD8V+{o1Dt|jDj5iM2)sZlaacz63q>H|b-Oed zGy!L|W9jp2t4Xi98ONCn7Ca_ZGI-L255;QCs*jl#goFuSCB#>WPS6A;_KTm zHW`Lh@M}R`J!j|h7^*O(Jhd{Ll`gx#e&KYR<2jKt?B*vKDO&E(+1ep)Tgla)cwXp5 zPpNmhbYhXtLh^$o07CX5@z|1c@8_ut2_=~->t(b+WG$_)C8}*|0U!3d+&2}BX0aWM ze6i`?haO18p;l<6Yl^%&>PN@G3-3!5EU<&As;WAu%yupn)a|cEyE93F#(sd&^xBD? zRVwl|;r8h9O4&$)H}8sbwb4(3BQw-!AwcMn(T`Y9EyPn;ubxsARS z=kIu|7fsr(Qf->G1*kreH4wp)wd1j$PXE%L7j`^QDD)#6_6fn6XB+zaO;h*m-(=O2 zbkaZ%Hr}(p$kPjvREONq%Uc3IvqiL#amsdQh4NA9xaojBjv=N zFYtS=hN{3p6+RXy8@1l?xesSmYvQ=92UGVVjhGl?uaR+yFRIf*NPv^cw7NbbWLt~) zO`$lLYdT!(Kc9W{q&p(K?tHug>l=_;(Q2Mo5#87Q{rya|OJ4920q@StQ8-RgKa$$G zfIe1Pjpt}~q0_}_eUN%cIozSMrW)E3M(%oyj0ELA3Vk4&?T+BopK~gbs2R!n;yPP; zia}UqHJHp9?$J@^GiwkgUFZqZ_2X2)P#gKRPC>AI{c)g zo^cgehB?j~vF6G4x|2nHMfFX^8zSEL(M-Bs#b>@6!#vQt5G z)Aa*2fy&)1yh)FJDKc56EGuk_^ZWQWk35yN;3HP16f>vusVp9@yu_20 za?NPuPk`Qa9Bo|n`+-Bqu&0F1J)z!d1C(mbjrwAy ziK2D?JriTkHs>p`)XVR*oUzwx2qBK=YdH$y;XRk6@$To6<#hHO{Js*@Xtk zAukMkO6_Tp`EbFy1b#%dX6%^d?Rna?o(n}$caW<>t;~3ax^3*u#Tdey#P$;!4qfO2 zg#&N##0mY=Hvoy3I7y2AP4V3L49(Z9IqZifc*<^_m%fG5 zbyrMOs~5uroNx20?QfhtJP!^OV;v_1vXZY)CfPLR^oAwYotS5)wxvBW~!BqS!2=V2wh)nvSozt@amlnd=i7XR%kvYR^2Y&E|qq$ z-Z&zBBFhGS%(e%*eN|>YzT?qYwHxSM=6q;W6%Iv|b_Jd9rE~(1L_^Rri}N*kv|(}$ z?x(XUdV2JZvaIp%C4-L)#Xm=>3!)F}GC^)T-*4`(M*LpJ1RK+Lb$6GTZ;a-+{;hZ2ZJ5)V zaa?y8=RY+j)rxq2bBsBDb>_`KOc+VhFbW;XDUeQNVWYK()V>-fskUdZvf5NqH^e_Z zJIVJTa1ht6p)w6fpIaUs&lnx884rHJqcg`DF6buBSW~FIJr$ln=C(F)`E=5{@Anfn zqdu3btXmQ{M9AW8)n5;w2Wsp3nSQVY2JJbSMUcSNKuW!1N5Ugw7FbgYptHDVM)cQ6 zcuOtS8?@?#8g6FF8m<&u8Id@Hoz%pUmp|z)6BGSY$MVXFudjxsZ|%dH?Pm3seI8Zs z-pr&{lFS{hm*=TdZl(g)>A8ST1KK0Y@ibd4isOd)Y1@mqDL|5ca!BNXwtYv(h~+SM zIU%eo-W=}yqi#`Wo>#+VHo<&t+s(i!m~%>tG@q{7-F6?4dm{TlW9DJ&`h};m0e*K^ zgfej%p;Iem-RBEAK-Ih+DM;*lLgF%T1C(3^=i9{$t}>`EzrilILl!?g-ZZQzw?r5L zLI`V2C-(XFm>M`oDbHoQ-x79Os9$qDQRAj~PQ(rUW<6w+w~!j?hEZ=`_7>>VVH+U4I?j!L(dZrB3{P$ZP)8onq9UnFs+!}AIuYt!k>g?`4mw>4Dpft454Lb$u6PU}T3s`K-V@w`U(_>5}oP?tZ{r@1$oQ-XE-kw=IG$M14e{H9nloCXu*gK?jWDdJ z=Wx(CY0URlxM4t9Hd-#ub`BqT1lg|=5CDVo(o(s?j4Px$Cn;24AVZ7sVxekjn#I=9 zZq`A{7f;1c_*Q-9X6@XyrWK;p2j1;){4&+%9S@pwdF1a=@vsaElocXN53@QTtUC0DGvzZ2 zp8WixOv-t2+_0Q?uG_C~vr7uw%Bsz)GM|2*+P-8_n>O^SVrb|bm;_6;%4Q|oEd1-s zAsZ5_ZOlmyQ-XM#wkl-*W_Q84ht0C>62SM85BY9~a-PVt6I=Yylapt)tZ;u$;nRZ6NK&3p|Mk!Y%l;4q8I*v9`su!wRYXEU+F&a`9f*6;<+lpE@n zmSobOpU?Cnwby!C^n>~TD0|8TPp-|U>=N*;|Ghqi0_xggk@@P$KWM-4M;>DYhjJZ~(IzFEB*E77!6?0otX^YnfD|9Yf?pE?) zY2K`eGHCoSqb85f$RiIyk^;qwI;>0qGG8;m0x1XsFXk-8QGmXE1L6daft0`hGyfQo zn5X-~;|}!YCnr3Mr)UWyebSlZ%6ixw}g!QD~=ibH~H@lxD^LraPTEd&Tb z3j~+omH;=r=lkxQJNM3=^T)mCJ2U6yj|}sR?6vn^>silUvcomi70GYY-Ua{wF?he0?6>LlQ0wbaoTMEyfP>I|@&<`5gckg^& zc3h6L^k$FF${!Z7V)saT`|e8msJ_a-Cv0$@z()Aq-@uN zGX*B@39Y{Z%36_dN~b7!`bchV<<=hQNak(4w0(9a=hDJWSr-+>HKiyN7+=An_Ar!L zRo1Ta5NUWJd+~1d)Ru(#Qe%kev0WN&dp#Wewo#-GNh?YH*v3bqsky!DaAkkNhQ(fC zt*Om(H#g09(>1`>-Bk$ycs?^|kQ|I0ClLURNj`n>X_DRXkYQ^$hH=hK{%e?=Fkhr? ze#o8`?-D4YzSHj6l8b#(r6r3VzbESy%Fo8JTN`~hrO^4Y`kx!_{^fHnC)v$GZzv-jo8Rky<<92jPmc^Ks^@AD9}-)75NI#X20Bl>6!`+KY4- zM+GZjNmlyXluUO%er>JUm;@1)(l*Me0RYvoXq8q-n^e4=1_-V%<@t0R7HQ@?ytkhX zZCOlejd^I-MD>q}6^*IDjm60q zwi>E^v-s5?)+-0?i`Bm`@xu=UwAE)?=0z%ehm+Jc)GSN;jfbYru@_7xL0dD&AfCc8 zRYff}DzH7+*`%$ZxIlm^woj?|lIzBY#Z!!`jq7s^3WE;*R#u$oS`DzY*~ zLNj%YI%UOPPq#X%mVBd%;sn|G5ekEnwG1Z?NbpRHCNb_dji z!6G*hvj!pyNqD@eue?J4-=~GA<@K!>1{$q@CW^3PjkQo0-=7VhybA;V! zH5jOn6RYZea}bom=wkPX^&zV>AMFS>Kki#ga{Eri zEwbWw=V`hwL5Px0;bLDlJBp&C#ODSC}?ZAuq@E*KK(oNhibmsN3n@ zzp7c_40Waf##j5^c1psySMud+-?0#ey_OJeQRBaf0`=d zbEh$DSp0aYp}_V_U`fMb6=!+-+R?>_Usc)eOO9q-06@w|qiuD9y-Q!(zy{y+gN&)l ziY|JS9)V2^!hXJ?e1|?&#{1$|F@XvocwOqU2LomWow3%d8Yr_OlmrXp_`DjX5?Pf) z`0LsPJd{zeqSEM${eIrL_JZlE_pl?M3f~-X^xUS=#jEWmT#gZZ&SSF}?4Gq#=JM2$ z*7j9mX1`&ZbLVZKByIRF*7!;=1@Z6T$e@WawlkfM7F&VYKOY7qyy(d%x6-{4%CX^P zg}Mp)TWZMBWW4FLl$QbwdD6oqW!r*1O=iOX(Fi`B!kKtQKSp+E2jU~^6l1mc9Gt(G zlqs{3-T(kNAE*8o5s3V;6A(elQ-wQPp>}XFbdVS%ZUq} z3Xl(xUR>CZ4ceJuI_+N!I6~5?Q1hQ1CCdPvXO{_J+lV#IpYi!`!A?tEx^M<4%rUK; z^9*07hsu} zYVH2jnj6|Q=|bq{yh71mVPNC>vve~8I*H>jt*%C0(t4UTh=e5M)dN=9*ZSvsO_rdI z2$gJ(s}0Y17`W7(32NmGUaraZJ~ackeO=mF8<5VjVWR)S5k?^1 z%B0+@IMRc3-a{PkfqIY4%)|Ce;L^4YMVCmqXhLcG>`1`cdJK3-%3};z6tw*P0O#`E zmpKH%4E*?f`{&elQ-!9ImXRWQ(4@JW;U27Nc!aI6^kaOj=YTu+qq`X9)cmzyf7Z{M zA~isVrP`t{2JIJ{YIJ&{EjjgAvzOhPw8(nOeqWI#GIE(;)1^U;?*F>drfI+ma+EWtkAt1fEP`+ z^+#0|UM4=WE6_T%3P01$4suhC_Q$JCzXd<}vzZ#1F~OIb-?n|bZS;`pCNI6dj2)(m z7DSI0nZbc^Tl9hRm<5C6a$v&u^W#h4LE@aRNjQy!WH9QiZjmuwTYzHQx77DI4;R#2 z&Sl!)B*OhGL3f=R^II!hgMKDKd6fQknPIKnJJ%fw2mztrem0g(z;ZHdZ3(8N(b9^R zy-lKF>=kbuF*BbZ5%8b4{7f$kEn_Pw8R|)n|LCVnq)AvcwdsUK zm?i053Oq?>TFw}sb6KQOyz9l5XfpR^G@CJ~9js-dHvJ8J=hgiIn(cr+W$p)42MN(; zc-_4@$hy>ss5ECxqW#!j!6G9OT|Ti+Nl4>qs4EN_jZee-l4>KkN>thG4cVv$Vkwp$ zj=GeU?FL@fqtA~9x2C9h9ZvhAA*b`P!BWqk|GDwfL~7R1Oh`DtEdmoSP(Zl6GxG(F zo{W$CmLI@0A+UX)M)vYz_?SvkdG=(pdp2P62veZTtpoX1zOppL_1LXtlb7HbDnLg4 z^DjWZWqAdA=z(jH=ftfoX|^*-$-4Out{y5IBjcfl_wPoQrpM+JmRv}LXm6o~>#vJM zyDKOj&tp+?zN6K%dwmnwx*gv_!i)0&vHZ`IFu2k=l0SXIv}VSk1(1^)R!nsruNWNlJkTyFCe1sk+s&52`* z%G&g{(l6=QihnzDsL94N#chO)Y!2Gyo=XC)HJA*MWgfJ}LiA!>kRJ*x$<|^5wl9CJ zv>Bd#Atc5~7B;AyEe-ik?pD`-6=mGeU?YM#DxY~>s+zOmIDC|q)F|0uaGm6nh!>uv zL<4Nt>}`Fi`7F5#5x>0b8k8B&_`2Kim0q6~h+b$U$fTJOzjp2w6ukIzK4Hx^ig3$W z=qxjEH3fEwQWX3niwo?lG9r1D`KNeKmkqinWW^d;+WMoO93fg(zFqDqAuTRGF+5Cj z8|%C;bE8Ny?ScPbNX3zd$-4N>%spaiIh&koKS;^E zhK-^lo^etX@c7(4%L6#-tY>?E@@;pQ9Z!qZdG7$-O;iA>kh?2uS|5iR?>Cb+EnzsV zGe`uUzif6iIM_AVZR*Pk8&DjvHxiXzDn;Fn?P*LSqQg$E#}J>iD!RzL zyi^bc{?L<;%3|udCBhAHd(8V7v)EHBTS#v{GVlTw2zqSboG_RFIwte2f3W4Z4k#bPHvbdJ&lO7+)!G4=1 z+^&2?>3c5CE#>M=aLZ{CW&q-`W&~YrJ@$gsoLf6dO|BMAp zSD$BT1n+M27FA<*>E8G1gZKh25BJRub*C(8yXf1D8313;4zKh2`0zI4+}x(X&A8^p zzocE$HWpKBtqpk92PFe>L9sJ|$GYt}{LfE)VVykL>N+W5Tub8Hi4{TCyLWbv2FuL| z%dy?gVwp@KsnzzuAk&)CB|;6n)Tp(??Gp$$4NQ2wLQ7EPn3^65T&v0Q8yf@RlnR#m zf@eLlf_{cjH@L4Vp{yx@sZsP?BdUmjp)#c29>d(w>1pC15i!v)kOXVaBYLmQh2FCT z^rimbne+;chOSJ&K7$YBOl3}dc7?I|#1LIOvUxs85iBa4@jbjd=6qV`89M;*EgwFe z`!nW*gL7Eqc^t#R&CmnYuC*;S`iZ&L{mN#?ufet&Qq=tyb=tAu%)-#KqAZB|JiPQ{ zY~XU=URM>hBMiZ7(Obw1#s2wSOsALOv&&#+AK$aAc_HRs^R9wm205D)%^Pp23MkM{1bo!l~ZG~xtd<_sJiXWm;;iH^-* zIMvb?kd9}Qb(u;MDFU0KM<*Utl!>UKb_oL|dfprl!kPls^Wv@DuiM$J_M?UxPCCd! z3X4$1ImYUGv5Pli3Ih}_GF}1eImnQQ(x(k~@}gjU66)h_)-RXb4TflFble#Pw6VSu z$ufuYi_&;ZZ0m6=6Mi!<7WYObeb6fAIJ|R{vKvFm1r+8X&ZOmq9VyhU`yTJ1_eAg5 zxB|?-Hpn+r51t?!1Et4t0SkAQT!PzO@e}d+mMd%O9S5b#lTF^3<-?Nob-LVLLqu=( z1iMQ2-LN5p_BM|6nHfx-*ovpb;6>Kp5OmUruUpc+VZ3Hdtv{83EMbRWjp=Ugpp zN|LO8BPN_JRdemYjf4#Fe(ms`{&`+lXY~?!=x=IXv%vH7M#Lvw&kId=*HvGQpk+|| z8{^N~P4_*2?s%4(q=qVezeT5#=17~K=D4xWJ2mo=kdexN4G7XRGph#=IFx~g$7h0` zX3C@>8GDx`=_x@~vRYTG z+ik|TDMzn)SpV;&1hj(5QLr7bm^Juxxuz__$K8w5EPG&l= zg~|?b3aP!-R*IOd%NE}^eGMcMP5!?U)I^|n)Z}=E$53b#$`)I}V6igvx{qHFeN9cp znnCiBb6u32(bS*cnih7x@9Zjld@EgiD?!o;szqTQ)e-J%gx_!Uf_s_~7^i3HG=o+s z8el#P$?MtIlBrRwmk`&t>h0mTB~6)UJn<&=PVKhSpSm~lGh=aj!Mj6&Yjg#UL+Dc4 z_7W>I$SWcl*0xY^P}_Q88DMw;7GVU?+-|IB<6? z266gl-dn(0+XVJVu+Eo_XW#Df;=Fi%-fIJ`m|K-IpTmriL&&bpn|HfaBM@yXiYDh(p_R!I~3v$o>6|7zI81=F>(I;QNHZSoS5wgpt(wUvW5HxT}Vy zQugVPOD`P`(w&|iJl|NLK`CKBeU?Al_Sb32b= zL@xB|=(j;+Q}VbqBdi9L)>BwhROf9{+tFqZ@tAj~uGzj~7I^(O-|0_c)9#9EBMJN2 z?#or#zQ^$!1?rtTtjJMocDt;VUY_-}wb>dU4HJ`0P<3&9Dd`kkmN}rutGc67d+o=* zJF}w9(~Y0~X7%Ge*^|jcQe{XFv6@rjhrl5hvg&Z;Em2Nx2z{y>451z#k$ohx-CK7< zY|hOmCr&Q-=0W;ifvNkjUjb>9aXnU=-}f-FfMPq?{gR6=hSuBxY@c)=zM}L9vXfmw zf9qEsVf!qdIJZPJEsaE3m7{?aX4cGw_N5t%Ktdu+uQ)QfUgUEI9R>WLsA#^IQM>l? zUApRfH*{589;Mm&5k(|to5|^M1^ux>h;&0|0*y$dUIbUA6ZhY>A1>N-95iFDA-^gY zg)Y61i=R_9+9v@eBjM~}#*%DI@i*AQK3ctuHjZVxgbeolcr%FP?;Bi-e)NU|gjtR% zMJJIc?cEnkR`ERS^Amq#E{GYFI!qW*#6Fs8IFEB~-fy#3G3+*hY^|GJZhugWY3eGo zPg%(dI(uVgjN+4kOc76oqz^vvLxw4bnm3_tpk_kQ$(~p{=N104dtU;}!m_>8tuWP1 z-QGo0&6&&ooU|ej5f@PFL%O7!0+5{-5Voy>3lX%&T(zI_#v7FwtWqCM5xDI#CzE;V z?6+ivakGCQQp)eoZ!eU<>Q~+w|EiRmAIeDY8`Z1L2zmnHR!g=h&(qlcufaKrwCS6_ zd+tH4Y1|*#V-1hbdhWBcDxa3Y6}{2kLEQ|>e5vX&8`w~M*h6Wd+P5p#{4IpT3V-|g zqq6QfZT!sTN$7%?E0K9PwqK&mq9tE&4D(;$xVue%ZCww>7tyuvZ87}~06arbsh1=| zag7_6naMJF!2^ZX;Rw8QYfXC%8Wd1cRcn9_1n)xqJuqBBVg40Og^n7KQEEdYzV!%$ zX4+r9ODgTVAsVXd+OwAx*^r&p_(+)0SbRRKF#qrBa;2q@Ii>s{s6BtGJ6^ldYI68h z5>Me1Nc4Sv&_^A?FA3aHPon#a8!-eHHXrO!j|AJPrFslA`4LCh+09PXcvk5(Rhuaq zBcl0@Z28QzH`MuUeWwJSU@Dfv_EIdn3)Ej+l($?iW@jf2R1i}SletW7&qv|Ybbs4s zbXC$=9V+6s#9QXd>iYd9t^B;rn#CrT0=SxwtDN^;yCw224}2kf_rT6&DeU3cKNwpl zdwU0-{S(Ai=G@t=MyF>=d3^rEDpqf><#gPl%4rU(_FduBP(Bwr_d8r5E>4B=_jF$f znp&DEvHOaA;~a|6(6g{=1ZB3hq@JS+>ei9Ov&+iMv;Ou{vzpfl^QgM)*m#$Q;>8DIbnUW(!AQK@9d0PrY+xV_*P7O`!~ea^Y)&`4m0bWQY-=htQ`H-EqhN^etG_rcCzDQwQ=L`5=SvNUjOIqZ(sQ|x*uj8ls}^0IF8ZY9qGApMzsmEJKxS#enrS)d~lV7=&mdqr>fYe6OTyDV8eM#&KqSe zzxPx=tI6Jd;721Sl)}K+YvW#Cc*EQ%_H(qWQvIUB@z2j2k(A!<_J}`~w&&FW^4X$} zMU4Y3G=>f20Dw)%mNmZ^V`Q2;t=h>cgY9R&u(($pzvbsQxlTXxSmrJ8kA|d@FUb_{qORQ!Ukf8NyjA)qvnPbE#66^o^+$jj9jht5d5xdu zDfu-K6P7;&{{P8aKELrkq^KNjvv^jwF60v;f?>9G1!>ZJ?B(r6 z26(&kh3%a=aQ~nz8MJRd1R8;|jGI^VCJ@zr)^p0Fd?RAL z=5SB9NZKX3#chTY_u4yOjy)B=+f`DoW46I!cKR4gEd~-;;3aiV5lm0 z89Wzk)r~u*W@=eIG)i`|hl)90ZVw_AM!Hmz()z?cnj;1$KP5_K^= zc3}#@>FS%|=jJZjQpo#;>`eWRSo{{*vjf&+K%3MbQY20bHotf+SZ<%p4uXP@W;?bL zr>H2M>4U#10)VlsCP05H@1KLUVa7I#35D_A+=NVt0%QT+&;tltOZk7K*u9T zF@q(+ewisRqq!ZDGDdV7g3hUN4^ht&`)3d4C}ILC;UeC{8*t)3UO_?gU2T$*|1nq% zG5s_y)?%ohjT~l1z?V+qH`!*MV@+rjKV$@uU7KIQKmGf5{k2oq;6!NrW#7vfw#Jxr z`xC1q0L()buBx|Qqf_s;!=nm)>K@F%5r2wcs8plU1zn?$-fb-ikeJ+^K z2BK${8k%XcZ%v^|^F61?)-HYcMoWINXHxQKXoI)s#~YK-jA58rik$!><%y=?9l&xEVCI|z13^h)??ZOF1!7d+|= zk28f6YN`Ad=lENC2mG9ELW6Aq{m)r$r3~HPh}nx57UW=qB!oNyYAIFAxW5bz%P0Iw z=imV!xT#Rnpbm`1KmxX_ugI{gTB2fg%TI@d=G>M;Bav8M&WtHH7O#zpSH4id8 zo5^9U7-K_)icVK!#k3VB4z!K63!yf0V?i|4yfPSj0kwZg69ULuALni&( zlC5@6%2DI#k5xIaqeilpuzprF64_W5za}2^wH=g+l*=1FJM(9Sq!|ULaDh@1m~_AU z-g9aV9MhijG@OTT_|8EPhwF=X)O2P;TppYJ;)QtVWni?Le5DMtWAiufg$wmf6d^LO#kG0w|!kMyp-!=c8oEP8tjB-}taNRqs8S-Ew$rsMPj z{m>zIE%|Y=erffq)9hSZGr`Gw5#u3g=yA$ylNNhVitX8R<^Nca&7YagT5BqK@o}5C z=JtuSYGY&HNU858G-PyqeEbOxJtl8C+|(ptpiWLsKJVHRB(8l|W9a;M zV|rE zmr?Ip)-{x%=}rZ;s&9%@G0~H0x}4eKT7a|k>fZT`O-IT!%7RSU7vm^0I`ypGk98r4 zN$-Q(fc-Q+K)<8U^s&;DkIT!2Wkwoc2L}gx`*?vz(F)cinXTZdn(Uy|B&Mgg2Z6Rz z1<9uC;)6;`V@L#cVx&+l9bIO`-3?<5^z?CeW#s!gtf-!_KeM~<-Rvyxi__R=wT(4} zJb8?P5i<0h6F^;Q9fvCW)X$IwnSR-Qt{6%!Mpr5;09@CkOOLq*-&2Tx}i>5kkJD=J< zeNy9gM7Ra?)#&qrY8rP=!Xa9KePWeUzsH)V!e9k*HU6P3af{9RBRCH|3AAl^3PM6t>r?ujDk>^|yu_EBvlf79x#p=0c06~WZiwY4>kJ6plk&u*$`oyOGM7Rzcl zjk}XKFl1;i->)+3-4%{n_odYzd*pn;Kr8jroZ`X(S2O3MUhBO{Uq4HNyrtLz=qDj! z-4HNlKhNx9zH_Lpp{4{S+~3qR+0|8ec6OFFNf3W+tJvLVc2R97yxwdYU}R)zDa*mn zy>IvK3A0OqAck(+_e9gEC+G!e0&!0wN3 zYZHlP!maxn_9q_ z40dG_t2#FW@*{Fn0MXyRRJwZ?+>SH%vmEFxh_vP&BY)gvpx;zQ_GM>Z@VrgS zLrA7e+d=&y_X0wi1~EdmsP$>ao^z}BO~DaE&>Y0$!okfXmLdwzBjj{lF-dwY6n@54 zhTl#*&k+G6+KloTashZAH)eR8EqgWf;EH*X$Ob1-?iI9P>cQ{dt}ZSbKKl9+nXQW- zOoGmJs|+ljIumJ(KF^e(zafU)Ecj1&It6uh(4REvl{SYOdpf;eQY(~n+0(ObAGOEw zJq6Ja%?k-34SX1CJfr!o%-)VmwiLbsZFW=+7Kvn;YCrxKD4I+QNo*3kJn-vOX++*? zLuJ+5tT0jJpV?XnNWM4tC8PYK1Nz!lm76}g3rjE*OilQt01lhF%P2lEJ3EX z1?c-5E5w>B_i=lp@lpfS< z+ogTCG}09EJ%jootC#zhBC-A^(LzAe{|Ww2#ZiWTXPRa|6d}buXa`&jaioy>Ej>}d zs0FoDcR3#;!~TJ_NKe3^X5%r2+=Ko63rX4OD!?$tRW3%tM@aLZDC$z~>9$ikia8?9 zz5?()TLGR$BC1XY_08vGMVK8^|8Qa^N^ScD=sOQA5)&0Bk{Y7eZ+UE{a)?$*2xvEF zdk~&|v3wThGdMYk)m^FW{h8i3>*uYeQoHkIamPMJ2%kFJz4iVKg{Uw#up!=(bo=z={%7zD`7jwCD2S~EnZ0s@-pxgBVL2*}nA zl_O^t4exxc@LZz)$tKQ(79P`M#Us9#a5{N)ERlOn^DEU=18pwW8iGc{lXyRfjH#_V12bp1p*hS zEhiQB(-}Hd5%#YR{;Pxk>fpal_rIne^QZrUVD=p3AIfdrQ!LW+GIxYHGy5r&h=gX7i_IcaSsFG%r7F~1i z9T!Hx*S&)uhMQqYO-B~`^~6>!DoTY>kh|?cXmTHLO94LMDnUN)crArX?g8NI$5JZ( zmhmd1An*aX?MR~KM915u5PiQ7-0lqiXUeFpV*%%;l|Izw%tIi59&i&uGhGv*eDF-CK9W@ zimMD;nj&kOybeCyFR|CPJg>gVZ57T1Gh>^jPu}-zj9P5Agt?}rGU>YGJ+q6&RJn=a zzUR6*l+FXEjU!y52vItHVc}A{$_{vno}PI2YnusoE#Mqo=6e{(%dTLB!qF6}-cid; zj1Fo)z+^;bui3GeM6n#kkCT^qkB-+yI61Plmoii>4v45vy47sQlgitra@HWXtY^tl zpNN-0WVG~z8gJ^udr9}Eenc~pMO=sved+yl#s-k}N&TANvN?ap>tz=q86pEC2 zd6Y1uE{jaUpejoeK3+F}uBud{whNp62lDFm(!7JzPi9B8KKMn%vjKjv*}vQh!B{XW z4>+dV*2l3)I*66oKbswp?{BpgzD{XMGiGOfeVN~T`X)eC-73#fBwEd8Nh~5G+5m2e z^bX6F3^w#>>}qzsGw@sqmEH?9&V008VO=A|c0yM?Yec9g%ET35F1@hLRI zr$S{V^t^Yl!JLux>O=Qtpr{ztSF44ywN1)8sfD^~o$}MEF9;Hels}ZO_GW3sGT1j- zzs0D&))ZZ`9V91q(8TW5*(_!=%@`{*<0?ojaeL8dQM3}VLP$3kntk+8mkTlj{k`g& zoZ*DWJpZIDPIF~hJT{-G4FyHnwA)+EZ^Fl9fO{b#JT6aXTR|&ZZc=}#J|HUlQxz-3 zg#VVN)T6Sp2%*UsPA%$q{%YUjA$vst?8>Nm?@zEJltdyO<;O~R{o*C*(G=nXI(p2LSL-2_Em0(WjP;oovHO`OBUz?8)#R70Pn8(Pm5VtqN}4v z)tt+>>ej#oAv$bKfhG>=-|`9DQ;J?PX}9v{yzTRBWrQfo;Loo@;kMwB{5YHTg>yDZ_aX7 z-KN{TYq`qcg&rhWE8mv#aeA4UoO&>(QyF*vYQ851%nNz-Cf!1^NhwmPazfhji@v~m z-ziS$a~jopqHf$vsFh#)(Vy`rd9#|~o^r~aD+77BQ)3C9m-N`|WprNiG)l_(>%T4U zkKuUXZUyM;qN$IifL_Hb-MW_`r^P4T{faf&JEH#l4y$s?^$V}R0IEN>m;!2)IE6ld zY}NCRgFuogT(e%JzGwv7P6Zip3W89=!pWN_f}iXK6s@4C3tj5LhQ4wSI6nQORU_44 zOMO;lPC<(pCC)DY@`GeR!WFQo@}P;eL>@M5T+*5klo@yso!EQCX@&zc6NnyzOxyOJPG}n01K+zQ8iOfg3E|rd(@;3Xd=9_Hc$SX^> zR>m==mlKPsf$T-&`pm%b#B~))oQ<~-I#l@z3#{D&qK&&Jnib}L%Dm}3yBpQo;*>sr zROLViBbLeldPN9dOj zPl`|ySH4of2ZX4sS?%hN%`V~?k*D7ka#`conbNPT;zS!w>C|aU&i?|yV3YQkvMd8h ziD6OKZ*#ZP<0rqQfY;CdZ}DWMI?YuFLssbGZ9d6d#LEmiQ1V}-QW%xdQ-0g}hc#EnSHK)jx&a`s(b zoeKOzn%OLAG+y^Pmsx<$9f2vAp6S%ZwsDeiJ+iX3IPR%$v1mR&N-mAELb_H zRDk2zi@OE|XWHTLzr3c_^-JvlprRe60`o*f4 zO-()3lKyuJ!3L+DDr89YfV~?;@l3Bqq4kyZm(li*^*186z-7kzcyDbFs&(J|YcJAs zdwbnK*KyjLWcOm4=m`ntv%}8^Qk+Qus6@3)9Hx)Sr1w^i++s;kAFnKij)of(q<8f7 z{>-L=SYtt~B$r|^nNs%j&{+Rs6(6(W*9PnD6}{c^ z^+f(Pq`Z%He4oWz3GJ<^^zF_SlbMl{u0yEfL@bLW<|$_zI7x;y4hueuuQ4Qk^Z@U( z?`nP;B+x#KB#y2l7dIZZeU}`x5SHYZQ;>zhCW89Bc}%Wvs4kYqaS=PRSo{Ab{-owh z!9>C4L&B`Q_dUb)Nfjx__#(QcaVXbEZKr+JJ}Duq@m19lbA>BRqlu?8D6buQpzuU7 zG0N`U=MbvHXxFcbLELHWkG5E*?1T?)$_hIuwDP6hF^ORev19Fja3yq&)WDYDOdeBn zsdI%mCbIJyWk)R^@iMI|zXACAf@sEor$j6P0B#d^?0@L7>y{`0!0`_5ua{R87UGOg zV;7c$EPmKwIUNlM2(xHnM9Zt9ESmK4?CE$cO9rMk0)J$)5IcVS-|-&Fs+a^+l}t@m z4Uw|e2#|buyc0N|C>8IWnMPuZI^+&rQA%dFZQ0 zhVxxR$ix^B4V-JASbZ~Ah|fR&mQh(kPH|iW6-;!`%TsiBT~k5!Z!G5QcO<>gWg(7E zrf%iI2k(@=I+pCOFYi$^swLg2@U`U8W7_ho=FC*0X1w$HWKa{1KF+2izoo-OH9-QP zO6m#S4biEuEw=`%EZr_vx_HF9VYp6(PL%Og>pitx%VpOgCvIfr`?rxTtHqWfY^1(1 zWl67LYU3^NM$gFJ>>_tb_wpBsS3Zp_#B>pzmCaQyKEm7TwV$grgUsjwl3|?O#^0TJvvmfP&2D~gJ zy&Q&)GGQrmwr?%hp9#ozUiDJxf-^S=EFSr0tcl{Ub~KPmGH7#>)n+0}tW!=mLack> zzhmSzu~*UCo>@5}F^d&I9vl+51T#vb81~s!R5S>{}FPoLAfoHurG>f z(H^1=-uR1X0gn1xRAbC;<|@11`7+Nq@`hvEB!ZT?wsRL)Z5#Wr-F}0;ObU#vDD7N} z*Q{&HvpPdA6u0{y6iyM%CvT`Y_q5b=v`0Rw0}Kp(RGdET7y$M+vS+45lA0w?ay;W| z#~;NDR5RffKw)>uoNay_+ zrRCTLXs@=IB5_bF@os;@;>(htB8=a(?SQx6`)~Op@;a*Z11$f1!ag^jmm`}-Ka9!y z^8)k<&Ach4pHlx5HCCt%IT?|e?8hY!51iPUo|G5S!RQ{XJ`bIJ{ zFICx0?FK63O6z2U^}d{}g3-JEaqJu#9K-!O!{Vlcyt7B)`IvuL2jlJ6lewPnY}Dgq z%{r(4iWd&JqGH7Fd6)7Ac0crpFp`)_vKF@-|HoifSC!H%S(S;$jhA}w;Qu^&`ZPS> z*gqyjfp6=P3!X-SC}aB}(YAVsWc`!M|Bb8{Wr+~RNdU{tG|Itlgs1mXf7Yh33L;hA zEIC2EQY`jIJ4O_Ml;m2csfjVAk?^P#){*e4Ebepmcgt6f`jqScO4b>&)UL=-u)9R` zpB@8?ti>fQ;G4th;tX7LRwT7=#}*dsFS^@I{K=yKXR;1VzuK~v#93)k6Ork3_t)xW z6|dY&xyO=;fq_k%a&Xesuzr18BJK>9IL{zbyd33*f6TIGUU73_ zYg1E{7~aseZ*Xa7aCr7NwofLNd(XoEAG!PgU+DT*TPDcOD>yp*LP_7~pPsybcBDU( zZ-l!rz3h<(FR7^E-aRgU_Rn$;4y~?9vvW7#Lt!SLavj(t9u!|xDgQWdhHcd8-nw`U z0PLGN6fJRds~0hek7ldubsj?)nX1IS8h5fSzl5o7j0I_f`*0W^B5w?!?O zTm_~=LxyIR#;%AS&)@EMx!sH!e8qM?4bEg@boBb6)2{H1@bZOc?sKq^N4KjVX;BI| zP?Zs*ggk(k3b1{HBS8&1<@*@r;@Jess?r_RA=iSNS|$NaOJt9O%s)JyW^@n0JT7j! zn#_$~bffZ5HsynNCn8B+5~X#w3=zuCGBY2q}i;;_UoO{LE8jF&51sl`t>{GHU-%s`yC zm3?`-+fp3VoYwmn73IC_FTaDvYU-OC%HV89;GG!P?R%C=x)E1XmJ5D8#2~uanH9_y zagASzA|DlAO9@vEkU+2tr64Ju9Nsydov@jktxRg*+9a>MTkLQDAN-}}pEFRDI9GYG zbg;iR+&u6>h$HJ^-}+XMj_pr(`=U!%h$!%42{`kAwD+A+Q8rt;t%!(7P!vRx0*d4$ zl4(>BP?F>vlpr~0ng*4m1iQ%@B?ke?&?H5&faK6LEm>ldbHh}B=ggfsvu52jckYil zKjt5+skh#$T~&MU=h^$+<>TUe-$^w7OM$=-5=a7CrS2o!Ao)Y=D9pB{Ym7#oPp>Xj zF$W#ZAz>qL1H7J6M)KGuL&e^rPBCFIme{`>^QH6lo!y~BDiY;=H}^#g{sQ@wQ(NzM zUv4#e3_BRT{&x;~Yp(eZ(f_)O9;s9q!S!i~S7j9a{uY6?;8Q%{gbKd?&m43du}VC`UdWs&jDgzL^(L@v&CYXANcKlS3^fxBOgdYD8RnziiilT|*| zm89=4C_(kIqnt^l(wxY{f;fO~(b^$?=`uIB5<)xkqf?r(Yw36|Et1XZhr4p2Fow)_ zA}QPqc$9Gcg>$E6N^x>2fpP(Gt`R5M{|k=HQn{scETuM^Q-zh>VZ$f?>$8peBkxd*jDumXRtzs0C!nUQC8hOY(-3(dH9escGedm zGC=|uZ8^7T`Q5T*_M+M%%tc7X=g=(9Yoo4*a_D)(4f$wl*GK?6ZnU@=+{hQ+cD1)K zzAoS}cg?sWe?Ys`Zeg;tawZUF<7#-#fJ|4V(;cy+mI z2G?$Cu5EssiYSe*9?3qSqDgHvwxDb7wW$1iT%C;>mUGCV=4^Sm#t>ZVt?CV)Yt&y*KjY4$V!*C>D@FV+5{JWqA(<3UYBR8JWjWIO!-H6Sp;8hO?sb5#HF@OvJ{ZUc5t<()zSO^_Bk`ul`E zWcxki50%cKQLhPsrO(MeS<=_?Kgim!Bo&_qt5Ys5^ut*%{yR((RhRHBRd2u7t@u#Q z=WD*6gOeV{SYY-jWuqZK`@B{-=s2^ms+DbFQV&ILI>rANE;$mw?gzd6G;z0*z^_Oq zYV_CTolt$|NL6B=xK^v#S)ExoRWA7O*DYgTxQX2uwNP>Y%z2IBNYL3UASvA#P0@Fi zXvhLdVQXOne<5RoQpbDU-RCPThd&Z83YO2wb0U~t(>o2mf_vB9d4)aXaV#WH7c5UE z_FF5!oYw-|{qj7n(kLT>+vMfi!vOEw72hM$U57p^wLG+7lB54T;g(*(982v{IX!)< zsh*?m;I^Yc!3*O^^oB{g8IN6)A!W(uj47VrJ?0CNVd?}zbJZsxmiau#tE{^SK%KN3 zcs+36a_s#F%o5YGjiu|_J34jEJc)QOaOJUPkaJtd!lPzMm^<{2u_m54#&z|K#4Vfdf{6|VM9yj$Rh))?>rN1m$D?4l9UPbXh zGS260_3}hkQ-1tA7~ciaqaOGVV5oX^{*#6#0&As20-P@FS6_S8J0*4F78X*}!E2L3#xwFoOTlUN(CgD(K#T5n)92vp>;~l; zOM~ahTT%Oq^-_`SrMIstmMb-k?y;RMn}R*gNjuKJ=V^4G>HUayE1i8ib^eDATD|(? z#Rr+YWY-Z7x`+ODuzW7rR-ecL9&WN$=aI% zgbffxp5+3Is?bwM+d7(j(hmi+ks%*O$CXKDNG&I6*d9iwC<_Ps410`g>;~CJUmtN; zyf(#f;7ihc{<^;8o>59lr+C<~!s0?)`ZTxRif|X&H=>c`%N}a=$!Fx2fDWzVZti7I z<}UAKyD0%$hSLr!jgtebY~n}!`Azb3@qi`JWcTeH<5&8xLo;rEfID*Xd21+gaL>=l zSp0FuhDMy)-)-9eFr>VWt{u&(j-^pY_-(l7+k-Kn9GMS|h3U)7%$_I}8s`@1lsw@_ zK0xI-e-kE%h`rp*u9(M=Hf`u4l6FqJ*fR>nwJ%wTx=pw5aKtJv)zSb{rj`nz8dhtMt%Mf!AD|iy1B>;DQYl!yQQ&jOD7I~2!I1e^v5;d+8c1@z6(27%Yf+kqFr`v~983bTTneHI}>Srj$tJq$h zwwCc5IQ?1*lu=(U{QB7`H*kkl0KmhJ(wmCuX;tGPL z(J2#8**hG0t~+r;o<4{2s{ zCH%7j_A@xm&q>aSH=2Hh8!ukL{Gsrb-=`sL&Dab!q|1^R&8^y*@acJk9`X< zr8QrLcaWnulT~<_UZqqi`zKhX#^Vq7-v&-m!@u3FyDPNfI^OsRah3!eiHxq-;}2QO zEO+Q@-B^TlSU3PB=-6%Yruln|!IBbJ@x;UPcV=_6L|Wk6Z3B-vk(9wEhruq5mW2*R z)*?4qv6}=9Y7=eC%oRScmFKb)h*VfMRWiE+bg{nk@Lsm1TPl-aU#)^k`Lq|wimgZ& zku2Q^ebvdEAhdHP3)-8gxzqXIaJcJlT%H~0qHpHn3~`#1gg44C^gtus8aPxgpVuyP zHIaPrZqrclJ9$TP-N>QU_UXlZT`+~Z3;M;bcKp_*5*!6nrlVsYelEy=A5(PsYY=9` zdt^mP8y&TFM+33!(*ECx-m@f~`U%06uMrN@!zIkCL9Lbs4tAqqxN_&$Voj3*FOl-( z+A8Ar3P~@(o3DN{di_q0*wFOdJS|@lh6bW0JZa22DzFzh=vk_&`L&Vg6(1kkvIbT( zVVn_~MW>}(*`Qe6!)m~CXiuVY!a>cX)-~XE*h&!gWpe0CT1Tspvi!i9yk{-2mR2o| zN4HJ(It>xD;B)E+nU@Qzs&BrMcqxH)6yMBM@@f_h;_C&qj0%SA{crQ7meap zM9_FtZe%pRE`1S787VoCEWYDqVy9!Wvx$gm_sPW5HQqhX->ohI0t!O5^6V2ADRvFa zgg_QdIZvtraA#Xl4v(Yxv`o!_W1!+(Vt+SLHoD+5sjwV|>~k1d9J~1){6g45aSWhf z6JP|cLi4OB+~3^UvTrJ_HJQc$F@8eE8Q4oA!EY5GukOeZe&FqpNNh`a5|agV7DDgGY<&y>ae5pI$5c3%T`G=dLOW<(AqQh~KQSeaDj%n;z~(LZA9J zLS&bu$!QCQY`$s*lSW!v-l5;R4-W-~*?=b613);^v3<~hy69bT>t+0_SPX)%4* z>A1r7WO-9L1jB+;*$?-Os{CjW{lOnP= zNN&4D+!22#AX5PIkkAvE|LhebQ(10%@%HG{+chInHU?GtQog!Fmq3kqLg-gBK_shN zDZhaqr0PVJEvnb{wo9~BB91I}_hLjYb!4ZWw&2I-4jk1|9i(cdu8Wq#dC^x+q+gYR zqpfaOY4q{>DUZW)qPCJ!I{oDIw@kiwKfw9a=wEzC|0SAvZ{7XgSGla8F@edCr-vQv zK4gZpGxf0zu64#RR9bY5ewWNMT65wQnL0Y?D$efQ2tFcItMnmzR-5 z{IL|N>*Rq=DvE8fjw6Py808>ud?nWy<#`f+rWSk>9yu=t8p+ z)#_|eLjfC2$Q57DJPyGi@){Btj%&Q}&ei+r5%gj#q|HCa2w+GVtG?1Mw-=E1nv|U; zC}f#iAm~wgGi8dg)To0cCH*6x0XSA=yTn$!gHF6H-4X%@+V*9F*Ijhu^zI;@2IZgX zEXc8)7mrt|g8w;yy8}<8IXrO>dCB5LjznXtdPE991(ycLyb z%hw7PU1*gM+T*-OeZiNZq;H$VuYaYRnaCRjy)Irha zC;r#hjSXFYjYJv8NOgv}1M>)Rx|R@>Uqf9q!F$VXZB}ajg2f3PF}qKhc1hjc5Kx5= z%91|={5sU_C1w%iq-g>C>0iCGQ7Oi1^%mG$cOrG_{rfP1 z&uqwS&^Kt zmkX=pyb*KpUr9y4@qr{&L)9R`KnteWkjqc@3!VFE-L$jVG#%ZCE?BS-Lommd4iK!V0iU4viXsPP2{}8KW zj8iM;Wy6GQyx67h{f$YJxeEit$xG>^k|y312&-bOAP>-4U3zg3R+T4Fpl7ugFcn?R zL}PZA9J@vk{JrxO$!VdlZBHA{{XEGu=KgFqw2RdLDZzEg^VN9X>i56|Zj?a9s(3@d z=&znosk`jP4LyXRfXpbZA8z1?+-FA`eu^(|OeV-I22h8g)`pclT?WzSuUY0*CB3^E z|KWFfML}VxUfUcaK~DFn5t>(p=fMteELM)8Qv^jhe&p^8fdH9IVrbU;kF(;`OhR+< zD2o@x;R(>>7)%|rwn+%A1%u}67kkr-ln2Q201 z_J}l7`eO(7Nr6NKPAf7FL#%C#BWR8ccfp&&W9B^Y`9yiIKZ_hEL6o;9OPDba)Lmivz2-0pNcHk;($wx51 z>`IX-uOwA5idLK>&eU;=P90h=J-Gz3R@>dslfRWL0bdJIVnjR;iSc}cmPLUeZ9o~Y zUm`J0Kt7NJ8rgx#--2M5HUDHmE?f)&d8iOe8ql1d@Y@wu3Ii$5qB=rzdhNa*zskiYYrw1r-zg*s8Ggb-CkJrvB4M1<`jiwr z*TAiAM*v>Niw1hb3o6HzD)n1-Ek}mlWZ9B?A=t~^!9{a~VXZGYXKsP}Qv#m7tOK(B zpSXeU|M!a@4M;+H9IxIcT8L;x>6o~#r8OMO4*z;! zKR(cEtNq2W(xtWQM)#cK1hVx@kFs*LW77%|Gd>FvF#9Xcp+OfixVXVuecf@C4|7{h zu}r0Lf34&?E@xmVdqss-XuUVtzuLOxXa>U=wO;o}4}Lc%xp>9hy;AtAuClVBKaHl* z_P=rgL!-mOL*115+Ec|}zU0S7wY}QXHnNwz74ej1`lG!;9HAmHF=M-4g^w-Oh4ZfC zGHB{nbhiqu0Fpz=s@Qz;$yQ4s&><-};hxE1lxoxRJp4-p)u8g;Ahzjf{_OZ|;SV=Z zqG=6<-PCq2n?OrQ@8$QAL5ANcoL6f|oAi{SxE=Psb}OPp%9st~yON%ibW6_Lc%y98 zZ}lzCf8j1WG+ZDBm<*XpP}${>m4O0taBO>To9^2&bjuNqtJBde#GWk$!@bWWS}R

w~YP_Sb%xj7N*qe`(0v{t?o!#EjK4(1>PWV7RH!!5rQB zDNyz^{5GO{{uw2Gwb#ksn&(*y8p{JQy$oV%HhliyTvah;dMPo2(9M$KnpFcV{@d3m zC~oUHbnn}KXs2$ai}wO`h^;^>J)pYPqyk{iERx1PjIcZr-DEhSpuiHNZH)2P<#Cp(KxNapCH z7-y?${MP7b!+Mt|aQV-(kmjiu>J)pK9+QKAs&%YGPrStBDJaOljCsZ7`E2P_ob?}H zc{QV4&C|`$i!8I@epBouCUpRAaY4MSZZo zMghu@7Cd4*=h`O2!l9xq+p8b63S`+uD-ClIGL+jIgr4O`DK7|ZNl3<0D?XyC#~U$g zO7HUF;8rW2<7O~KAr$aEXrs%j8A9Q}HT@*-ev7q1H^$yie_<7(c?WEGA?@@s<&+}0 zPd7bulMhGjni8JHd@^S??5oanB1H(1e2xJJ zr^!Q*$y`?7yU}Z6-xlB3_U+@_=96PoW4-l|6G;bwMzIY~(N*QW_Zz^q7Q_LB?8t@i z#wVyBKgD-`5Z&>0n}zgk)0RkSDfN77$5Dnn-KX8aXSnxh3n=z^9kq6~8ze>Q3suy( zBepuc9&mE5{v3=tG6I$TfdaY*;E=N%D`JK!#yV~8wsyYm1Mye^p2OOvlTFWVv8^}T zy&T&e)Q4fw3_)Kd1Tk7TN8qFqd=)zX&1Q zIl9VXyN$A8kuhF!?eq6$U1xQ5irCJ?#sOAljMhk-3WSglpqcM>Z*UmH$~l{3;6Us8 z=p)t~Rb(x#JlFwR;-1ySED}*hlIfG=gfHY}Xoh zkhxMTbgEL@I~q;+CMb7_YZx`sPlS;6L?LTOE>K?P5no%iweYBb23Vac@k;TwE@Q}eVYM<>9n zil0r|Z{_FON!a!*$M!4CZJ!-t(@$38FQ>DFgr2Tz@p1VF5vB10C@~i$l2I{(*@jgx_*TFCHJVG``L+bTPy5gx3 za;({X#m2QW+v!IM&CW#z0RUw-p@PXZWXR}+_IjkE=l)4e7`S_)=iE>EyK=3K-C z5N*Ln1E}seUYftup=N4zk%JCcRyUwN>mZrZItpcoI5^0aHmSj9 zrk{ejA1}^mRN1F{AB~VOO}wb_ZBed{iR5YcUE6mE$Km6@+aDI6iSQk-Y^S++Ea{wf z?l*q5?A9po=-jA2T|6%FpMTyh>9ySklsidCFhzANs%CNQ`S4T~p7#(f?GT7qWlEGa zIqTgoKAo@3j=~-sn-m*Yx=iZSY%$_6<(}!Hca-P)I?!%ATxVyi7bbcH;aG z*h@6x{p#V&w`M~U0>{cSb_dx;om}s{{lyXKVrd`yb;9YgD2~ecJn=bYrI35knVe3jEW6DyY(AywoNAY)Vl{s zM^&b(Hur}erz)SvA20MK`D}lYqmL=~MO7`J(qMVJ4bokdQd1q#b(0<~c(U%2hZMzP zDEl=>|9y%+2XxKh;nkL48hP~V!8lqPKBGqS!>***E!Gf9qpH{bSZS-FdXIkOJSE;{ z`0ONfyBF`M4|6_=9i}((yS5yn@J8GP9iA-h{GxEXHYqu|2`*pwe9LZX>w9+ml@dw( z&X}qeQ+(x++eQSFmglFl-W}`Mi=33jhVT}iZd$Af-ofN-BEFkyykg!_j=q9hzyXWs z&*Y+^q?6ppG9ExJCyi$Fg*TOPf1fdDkUVG$6-Y0XOg;PEXEo_I!RLRt@%b)Sq>;Yc z(NZo?5?s|CsU3q2a>Sly9$f7?vnlomx7{AEqZ{XkG@xTg^T}ix(xGg5w6v6TI}HZ8 zqjq))O{JFE{X*~qS9dnp&gAK^Z#vB3)oz4Qd-W+#qfd{<%7|kglNuAV{$@Gxlc&bU zL(%>55zCXcuA3AwLKd*zKQMK^{K)Q^KetM@xFS=WhT|7{61AvBc=kjdMjm$ww>qzm z)vlaGrRp@ykBR8vW}?+ZxF>^s1gu7)Y7OOw+fFce<@<-j7&50-~F)?#aK0+2pzFIY zbyzdLUzOx+Ya_19l*)-@m5)3@8Qs8g) z^%SR-pU?iX7DG=_L&=)&UP-del-bCtZ>~~ZmBr7@s4r=Lv*Ag*9XDV{)w^#-?T2cP zTdRsNQ%3__Qoe3{;v<1MZ|#}=`szte8*TT$A1}n6r9koXwT0{|HnW&lZIQ>zMC6|E zJs}-8+(@O%@6wYqI1E0^T9{UY4}o$7)Hy$E`j$!d8d~Duf2=yqgy+34>K$(^=yyb} zaZe@5qyC&LF2&mt+gLbSWVE}&es*ZNhFhS|Rl4=SNv5_i1utfdHxyVXBPRD$Ma@^a zuZUb{e7*GDo0j~@t9y1~p@o%?S*JceRwEJLCx*Jx^X4o)N6Hb)h%37D>hfzSOPB{J zq#ntJ^xD^rz5t;DI3j@Xp~(f1IeeSI5)iQKC6N3mLtqLBAENvZHTk32jLNa@t2z&v zN@f5l#b8Wpb}QWymjfskLnznQiHwfZG-QswVP}DN-d@~Uo%#a#bDz%<>#fuB7HvHK zLgrX38~eK-u!>(20de=wFr|Mc@&5P6BKoW<3j(>YrzrbK^PhF|{P$<~zcczL(gFXw zjQ_(*_YUjV9~ BwKD(! diff --git a/game-runtime/games/_wg1-gen/angrybirds/evidence/verdict.json b/game-runtime/games/_wg1-gen/angrybirds/evidence/verdict.json index 6f1d81a0..5eb86aff 100644 --- a/game-runtime/games/_wg1-gen/angrybirds/evidence/verdict.json +++ b/game-runtime/games/_wg1-gen/angrybirds/evidence/verdict.json @@ -1,6 +1,6 @@ { "gameId": "angrybirds", - "url": "http://localhost:4320/games/_wg1-gen/angrybirds/index.html", + "url": "http://localhost:4322/games/_wg1-gen/angrybirds/index.html", "ts": null, "guards": { "A_boot": { @@ -8,8 +8,8 @@ }, "C_frame": { "pass": true, - "f0": 48, - "f1": 78, + "f0": 49, + "f1": 79, "delta": 30 }, "I_control": { @@ -18,13 +18,13 @@ }, "D_render": { "pass": true, - "bright": 34719, + "bright": 35274, "maxCh": 255 }, "E_live": { "pass": true, - "distinctStates": 10, - "samples": 15 + "distinctStates": 6, + "samples": 6 }, "B_uncaught": { "pass": true, @@ -54,7 +54,10 @@ }, "G_input": { "pass": true, - "skipped": "无 tap/key 输入" + "inputHash": "d66e1b3e", + "controlHash": "e30f433f", + "atFrame": 712, + "ctrlFrame": 712 }, "H_progress": { "pass": false, @@ -65,7 +68,7 @@ "before": 0, "after": 0, "pass": false, - "why": "盲态固定拖拽发射→偶中目标得分;若固定角度打不中(需读目标算拖拽矢量)则不升=暴露拖拽瞄准缺口" + "why": "drag-aiming 读猪坐标反解拖拽矢量发射(力度扫描兜射程)→命中得分上升;若发射物理常数未暴露致全 miss 则 0=可测性边界,非模型造不出" } ], "latch": { diff --git a/game-runtime/games/_wg1-gen/angrybirds/play-spec.json b/game-runtime/games/_wg1-gen/angrybirds/play-spec.json index b87ed976..0894cf97 100644 --- a/game-runtime/games/_wg1-gen/angrybirds/play-spec.json +++ b/game-runtime/games/_wg1-gen/angrybirds/play-spec.json @@ -1,106 +1,13 @@ { - "inputs": [ - { - "t": "wait", - "ms": 700 - }, - { - "t": "drag", - "from": { - "x": 80, - "y": 600 - }, - "to": { - "x": 44, - "y": 668 - }, - "ms": 420 - }, - { - "t": "wait", - "ms": 1700 - }, - { - "t": "drag", - "from": { - "x": 80, - "y": 600 - }, - "to": { - "x": 40, - "y": 690 - }, - "ms": 420 - }, - { - "t": "wait", - "ms": 1700 - }, - { - "t": "drag", - "from": { - "x": 80, - "y": 600 - }, - "to": { - "x": 50, - "y": 655 - }, - "ms": 420 - }, - { - "t": "wait", - "ms": 1700 - }, - { - "t": "drag", - "from": { - "x": 80, - "y": 600 - }, - "to": { - "x": 38, - "y": 700 - }, - "ms": 420 - }, - { - "t": "wait", - "ms": 1700 - }, - { - "t": "drag", - "from": { - "x": 80, - "y": 600 - }, - "to": { - "x": 54, - "y": 648 - }, - "ms": 420 - }, - { - "t": "wait", - "ms": 1700 - }, - { - "t": "drag", - "from": { - "x": 80, - "y": 600 - }, - "to": { - "x": 42, - "y": 680 - }, - "ms": 420 - }, - { - "t": "wait", - "ms": 1700 - } - ], + "driver": { + "type": "drag-aiming", + "origin": { "x": 80, "y": 600 }, + "targetsPath": "targets", + "steps": 6, + "settleMs": 1700, + "powers": [150, 200, 240, 180, 220, 250], + "upLead": 95 + }, "expectedEngineCallPrefixes": [ "particles.", "audio.synth" @@ -109,8 +16,8 @@ { "path": "score", "op": "increased", - "why": "盲态固定拖拽发射→偶中目标得分;若固定角度打不中(需读目标算拖拽矢量)则不升=暴露拖拽瞄准缺口" + "why": "drag-aiming 读猪坐标反解拖拽矢量发射(力度扫描兜射程)→命中得分上升;若发射物理常数未暴露致全 miss 则 0=可测性边界,非模型造不出" } ], "expectLatch": true -} \ No newline at end of file +} diff --git a/game-runtime/games/_wg1-gen/asteroids/bundle.iife.js b/game-runtime/games/_wg1-gen/asteroids/bundle.iife.js index 09c7cc44..60d9213a 100644 --- a/game-runtime/games/_wg1-gen/asteroids/bundle.iife.js +++ b/game-runtime/games/_wg1-gen/asteroids/bundle.iife.js @@ -1,34 +1,34 @@ -"use strict";var __GameBundle=(()=>{var zi=Object.defineProperty;var kc=Object.getOwnPropertyDescriptor;var Gc=Object.getOwnPropertyNames;var Fc=Object.prototype.hasOwnProperty;var jc=(n,t,e)=>()=>{if(e)throw e[0];try{return n&&(t=n(n=0)),t}catch(s){throw e=[s],s}};var Hr=(n,t)=>{for(var e in t)zi(n,e,{get:t[e],enumerable:!0})},Bc=(n,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Gc(t))!Fc.call(n,i)&&i!==e&&zi(n,i,{get:()=>t[i],enumerable:!(s=kc(t,i))||s.enumerable});return n};var Nc=n=>Bc(zi({},"__esModule",{value:!0}),n);var Ic={};Hr(Ic,{ASSERT:()=>f,BLACK:()=>it,BLUE:()=>Za,Box2dDistanceJoint:()=>Ti,Box2dFrictionJoint:()=>$o,Box2dGearJoint:()=>qo,Box2dJoint:()=>Xt,Box2dKinematicObject:()=>No,Box2dMotorJoint:()=>Qo,Box2dObject:()=>_s,Box2dPinJoint:()=>Uo,Box2dPlugin:()=>Ai,Box2dPrismaticJoint:()=>Ho,Box2dPulleyJoint:()=>Ko,Box2dRaycastResult:()=>wi,Box2dRevoluteJoint:()=>Wo,Box2dRopeJoint:()=>Vo,Box2dStaticObject:()=>Si,Box2dTargetJoint:()=>Jo,Box2dTileLayer:()=>zo,Box2dWeldJoint:()=>Yo,Box2dWheelJoint:()=>Xo,CLEAR_BLACK:()=>pe,CLEAR_WHITE:()=>rn,CYAN:()=>ql,CanvasLayer:()=>ui,Color:()=>wt,Ease:()=>Ci,EngineObject:()=>Ue,GRAY:()=>Vl,GREEN:()=>Qa,ImageFont:()=>ii,LOG:()=>xt,Light:()=>Oo,LightSystemPlugin:()=>Lo,MAGENTA:()=>Hl,Medal:()=>xi,NewgroundsMedal:()=>_o,NewgroundsPlugin:()=>Ro,ORANGE:()=>Wl,PI:()=>X,PURPLE:()=>tc,Particle:()=>hi,ParticleEmitter:()=>vo,PathFinder:()=>Zo,PathFinderNode:()=>_i,PostProcessPlugin:()=>Po,RED:()=>rr,RandomGenerator:()=>go,Sound:()=>bs,SoundInstance:()=>ci,TextureInfo:()=>Ve,TileCollisionLayer:()=>vs,TileInfo:()=>Re,TileLayer:()=>xs,TileLayerData:()=>wn,Timer:()=>Ee,Tween:()=>Ei,UIButton:()=>Cs,UICheckbox:()=>Go,UILayout:()=>Bo,UIObject:()=>re,UISlider:()=>Fo,UISystemPlugin:()=>Io,UIText:()=>vi,UITextInput:()=>Mo,UITile:()=>ko,UIVideo:()=>jo,Vector2:()=>rt,WHITE:()=>W,YELLOW:()=>Ka,ZzFXMusic:()=>Do,abs:()=>nt,atan2:()=>sr,audioContext:()=>ft,audioDefaultSampleRate:()=>Qn,audioIsRunning:()=>ms,audioMasterGain:()=>Je,box2d:()=>m,box2dDebug:()=>qr,box2dInit:()=>ad,box2dSetDebug:()=>rd,cameraAngle:()=>Q,cameraFit:()=>rh,cameraPos:()=>_t,cameraScale:()=>H,canvasClearColor:()=>tn,canvasColorTiles:()=>Pi,canvasFixedSize:()=>Gn,canvasMaxAspect:()=>kn,canvasMaxSize:()=>Mn,canvasMinAspect:()=>os,canvasPixelRatio:()=>en,canvasPixelated:()=>lr,ceil:()=>us,clamp:()=>N,combineCanvases:()=>wr,cos:()=>lt,debug:()=>jt,debugCircle:()=>Ut,debugClear:()=>Ml,debugLine:()=>we,debugOverlap:()=>fo,debugOverlay:()=>Me,debugPoint:()=>nr,debugPointSize:()=>ka,debugPoly:()=>Il,debugRect:()=>bt,debugScreenshot:()=>Fa,debugShowErrors:()=>kl,debugText:()=>In,debugVideoCaptureIsActive:()=>Te,debugVideoCaptureStart:()=>ja,debugVideoCaptureStop:()=>Ba,debugWatermark:()=>Ri,distanceAngle:()=>zl,distanceWrap:()=>ir,drawCanvas2D:()=>Rn,drawCircle:()=>si,drawCircleGradient:()=>sh,drawContext:()=>Et,drawCount:()=>Ce,drawCrescent:()=>ud,drawEllipse:()=>ic,drawEllipseGradient:()=>oc,drawLine:()=>mn,drawLineList:()=>mo,drawNineSlice:()=>_c,drawNineSliceScreen:()=>cd,drawPoly:()=>Un,drawRect:()=>ni,drawRectGradient:()=>th,drawRegularPoly:()=>sc,drawText:()=>ih,drawTextScreen:()=>nn,drawTextureWrapped:()=>eh,drawThreeSlice:()=>Rc,drawThreeSliceScreen:()=>ld,drawTile:()=>Mt,enablePhysicsSolver:()=>Ii,engineAddPlugin:()=>Cn,engineImageFont:()=>lc,engineInit:()=>Pl,engineName:()=>Hs,engineObjects:()=>vt,engineObjectsCallback:()=>Ol,engineObjectsCollect:()=>Ma,engineObjectsCollide:()=>er,engineObjectsDestroy:()=>Ll,engineObjectsRaycast:()=>Dl,engineObjectsUpdate:()=>Ia,engineVersion:()=>Xs,fetchJSON:()=>Xl,floor:()=>St,fontDefault:()=>Rs,formatTime:()=>ar,frame:()=>Oa,frameRate:()=>Cl,gamepadConnected:()=>xo,gamepadDirectionEmulateStick:()=>yr,gamepadDpad:()=>bo,gamepadIsDown:()=>Ie,gamepadPrimary:()=>mt,gamepadStick:()=>gs,gamepadStickCount:()=>uc,gamepadVibrate:()=>Sh,gamepadVibrateStop:()=>wh,gamepadWasPressed:()=>Rr,gamepadWasReleased:()=>vh,gamepadsEnable:()=>Mi,getCameraSize:()=>ac,getCrescentPoints:()=>Pc,getNoteFrequency:()=>gc,getPaused:()=>_l,glAntialias:()=>Mr,glCanvas:()=>et,glCircleSides:()=>Ps,glClearCanvas:()=>vc,glClearRect:()=>Ec,glCompileShader:()=>Co,glContext:()=>g,glCopyToContext:()=>Br,glCreateProgram:()=>Xn,glCreateTexture:()=>ji,glDeleteTexture:()=>wc,glDraw:()=>Ts,glDrawColoredPoints:()=>Jr,glDrawOutlineTransform:()=>zr,glDrawPoints:()=>Ac,glDrawPointsTransform:()=>Nr,glDrawUntextured:()=>Tc,glEnable:()=>G,glFlush:()=>Rt,glSetAntialias:()=>Yh,glSetRenderTarget:()=>is,glSetTexture:()=>Fr,glSetTextureData:()=>jr,glSetTextureWrap:()=>Sc,gravity:()=>Vt,headlessMode:()=>z,hsl:()=>Ge,hypot:()=>Na,inputClear:()=>ks,inputClearKey:()=>Cr,inputMouseMoveThreshold:()=>Er,inputPreventDefault:()=>Fn,inputWASDEmulateDirection:()=>rs,isArray:()=>de,isColor:()=>U,isFullscreen:()=>cc,isIntersecting:()=>Va,isNumber:()=>L,isOnScreen:()=>ah,isOverlapping:()=>Qs,isPowerOfTwo:()=>hs,isStringLike:()=>V,isTouchDevice:()=>ie,isUsingGamepad:()=>Bn,isVector2:()=>O,keyDirection:()=>bh,keyIsDown:()=>It,keyWasPressed:()=>Gt,keyWasReleased:()=>_r,lastInputDevice:()=>Qe,lerp:()=>Wt,lerpAngle:()=>Jl,lerpWrap:()=>Ua,lightSystem:()=>q,lineTest:()=>qa,log2:()=>za,mainCanvas:()=>B,mainCanvasSize:()=>I,mainContext:()=>ut,max:()=>K,medalDisplaySize:()=>mi,medalDisplaySlideTime:()=>jn,medalDisplayTime:()=>yi,medals:()=>As,medalsForEach:()=>Bi,medalsInit:()=>Zh,medalsPreventUnlock:()=>Ur,medalsReset:()=>td,min:()=>tt,mod:()=>se,mouseDelta:()=>Tr,mouseDeltaScreen:()=>xe,mouseInWindow:()=>oi,mouseIsDown:()=>cs,mousePos:()=>De,mousePosScreen:()=>Jt,mouseWasPressed:()=>ps,mouseWasReleased:()=>xh,mouseWheel:()=>Ar,nearestPowerOfTwo:()=>Ul,newgrounds:()=>Es,noise1D:()=>Zl,noise2D:()=>tu,objectDefaultAngleDamping:()=>fr,objectDefaultDamping:()=>dr,objectDefaultFriction:()=>gr,objectDefaultMass:()=>hr,objectDefaultRestitution:()=>pr,objectMaxSpeed:()=>Fe,oscillate:()=>Wa,particleEmitRateScale:()=>Zs,paused:()=>Ae,percent:()=>Bt,percentLerp:()=>Nl,playSamples:()=>Ir,pointerLockExit:()=>Eh,pointerLockIsActive:()=>hc,pointerLockRequest:()=>Ah,postProcess:()=>kt,primitiveCount:()=>_e,rand:()=>dt,randBool:()=>Ha,randColor:()=>po,randInCircle:()=>$a,randInt:()=>or,randSign:()=>Xa,randVec2:()=>Ya,readSaveData:()=>Kl,rgb:()=>J,round:()=>$s,saveCanvas:()=>ec,saveDataURL:()=>ds,saveText:()=>Yl,screenToWorld:()=>Is,screenToWorldDelta:()=>rc,screenToWorldTransform:()=>Ms,setAdditiveBlendMode:()=>fs,setCameraAngle:()=>nu,setCameraPos:()=>eu,setCameraScale:()=>su,setCanvasClearColor:()=>ru,setCanvasColorTiles:()=>ou,setCanvasFixedSize:()=>uu,setCanvasMaxAspect:()=>lu,setCanvasMaxSize:()=>au,setCanvasMinAspect:()=>cu,setCanvasPixelRatio:()=>du,setCanvasPixelated:()=>nc,setCursor:()=>hh,setDebugKey:()=>Zu,setDebugWatermark:()=>Qu,setEnablePhysicsSolver:()=>Su,setFontDefault:()=>fu,setGLCircleSides:()=>mu,setGLEnable:()=>yu,setGamepadDirectionEmulateStick:()=>Ou,setGamepadsEnable:()=>Lu,setGravity:()=>Ru,setHeadlessMode:()=>gu,setInputMouseMoveThreshold:()=>ph,setInputPreventDefault:()=>fh,setInputWASDEmulateDirection:()=>Du,setMedalDisplaySize:()=>sd,setMedalDisplaySlideTime:()=>nd,setMedalDisplayTime:()=>ed,setMedalsPreventUnlock:()=>id,setObjectDefaultAngleDamping:()=>Au,setObjectDefaultDamping:()=>Tu,setObjectDefaultFriction:()=>Cu,setObjectDefaultMass:()=>wu,setObjectDefaultRestitution:()=>Eu,setObjectMaxSpeed:()=>_u,setParticleEmitRateScale:()=>Pu,setPaused:()=>Rl,setShowSplashScreen:()=>pu,setSoundDefaultRange:()=>$u,setSoundDefaultTaper:()=>Ku,setSoundEnable:()=>Xu,setSoundVolume:()=>Yu,setTileDefaultBleed:()=>vu,setTileDefaultPadding:()=>xu,setTileDefaultSize:()=>bu,setTilesPixelated:()=>hu,setTimeScale:()=>iu,setTouchGamepadAlpha:()=>Vu,setTouchGamepadAnalog:()=>zu,setTouchGamepadButtonCount:()=>Fu,setTouchGamepadCenterButtonSize:()=>Gu,setTouchGamepadDisplayTime:()=>Wu,setTouchGamepadEnable:()=>Mu,setTouchGamepadFloating:()=>Ju,setTouchGamepadLeftButtonCount:()=>Bu,setTouchGamepadLeftStick:()=>ju,setTouchGamepadPassthrough:()=>ku,setTouchGamepadRightStick:()=>Nu,setTouchGamepadSize:()=>Uu,setTouchGamepadVibration:()=>qu,setTouchInputEnable:()=>Iu,setVibrateEnable:()=>Hu,shareURL:()=>$l,showSplashScreen:()=>ur,sign:()=>ne,sin:()=>st,smoothStep:()=>Ks,soundDefaultRange:()=>xr,soundDefaultTaper:()=>vr,soundEnable:()=>Ht,soundVolume:()=>Sn,speak:()=>Nh,speakStop:()=>zh,tan:()=>Ja,textureInfos:()=>cn,tile:()=>Ds,tileCollisionGetData:()=>li,tileCollisionLayers:()=>sn,tileCollisionRaycast:()=>yc,tileCollisionTest:()=>$e,tileDefaultBleed:()=>Di,tileDefaultPadding:()=>Oi,tileDefaultSize:()=>Li,tileLayersLoad:()=>Uh,tilesPixelated:()=>Tn,time:()=>Kt,timeDelta:()=>tr,timeReal:()=>on,timeScale:()=>cr,toggleFullscreen:()=>uh,touchGamepadAlpha:()=>br,touchGamepadAnalog:()=>Ls,touchGamepadButtonCount:()=>Yn,touchGamepadCenterButtonSize:()=>fe,touchGamepadDisplayTime:()=>as,touchGamepadEnable:()=>an,touchGamepadFloating:()=>ln,touchGamepadLeftButtonCount:()=>$n,touchGamepadLeftStick:()=>_n,touchGamepadPassthrough:()=>mr,touchGamepadRightStick:()=>Kn,touchGamepadSize:()=>qt,touchGamepadVibration:()=>ti,touchInputEnable:()=>yn,tweenProperty:()=>hd,tweenStopAll:()=>dd,tweenUpdate:()=>Dc,uiDebug:()=>Wr,uiSetDebug:()=>od,uiSystem:()=>E,usingGamepadInput:()=>mh,usingKeyboardInput:()=>yh,usingMouseInput:()=>gh,vec2:()=>b,vibrate:()=>Pr,vibrateEnable:()=>Os,vibrateStop:()=>Th,workCanvas:()=>Ne,workContext:()=>Ke,workReadCanvas:()=>Se,workReadContext:()=>je,worldToScreen:()=>Pn,worldToScreenDelta:()=>oh,writeSaveData:()=>Ql,zzfx:()=>Jh,zzfxG:()=>Gi,zzfxM:()=>Cc});function _l(){return Ae}function Rl(n=!0){Ae=n}function Cn(n,t,e,s){f(!bn.find(o=>o.update===n&&o.render===t&&o.glContextLost===e&&o.glContextRestored===s));let i=new uo(n,t,e,s);bn.push(i)}async function Pl(n,t,e,s,i,o=[],a){if(Da&&console.log(`${Hs} Engine v${Xs}`),f(!ut,"engine already initialized"),ut)return;f(de(o),"pass in images as array"),document.body||document.documentElement.appendChild(document.createElement("body")),a||(a=document.body),n||(n=()=>{}),t||(t=()=>{}),e||(e=()=>{}),s||(s=()=>{}),i||(i=()=>{});function r(){I=b(B.width,B.height),ut.imageSmoothingEnabled=!Tn,Eo()}function c(y=0){let x=y-ao;ao||(x=0),ao=y,(jt||Ri)&&(Ys=Wt(Ys,1e3/(x||1),.05));let v=jt&&It("Equal"),w=jt&&It("Minus"),_=v?10:w?.1:1;on+=x*_/1e3;let S=cr*_;x*=S,be+=Ae?0:x,S<=1&&(be=tt(be,50));let C=!1;if(Ae){C=!0,l(),Ea(),bn.forEach(T=>{var P;return(P=T.update)==null?void 0:P.call(T)});for(let T of vt)T.parent||T.updateTransforms();Sa(),e(),Ca(),Te()&&A()}else{let T=0;for(be<0&&be>-9&&(T=be,be=0);be>=0;be-=1e3/60)Kt=Oa++/60,C=!0,l(),Ea(),t(),bn.forEach(P=>{var M;return(M=P.update)==null?void 0:M.call(P)}),Ia(),Sa(),e(),Ca(),Te()&&A();be+=T}Te()||A(),requestAnimationFrame(c);function A(){if(!z){C||l(),r(),s(),vt.sort((T,P)=>T.renderOrder-P.renderOrder);for(let T of vt)T.destroyed||T.render();i(),bn.forEach(T=>{var P;return(P=T.render)==null?void 0:P.call(T)}),_h(),Fl(),Rt(),jl(),Ce=0,_e=0}}}function l(){if(!z){if(Gn.x){I=Gn.copy();let y=innerWidth/innerHeight,x=Gn.x/Gn.y,v=ykn){let C=I.y*kn|0;I.x=tt(C,Mn.x)}else if(w0&&!G&&(ut.fillStyle=tn.toString(),ut.fillRect(0,0,I.x,I.y),ut.fillStyle=it.toString()),ut.lineJoin="round",ut.lineCap="round"}}if(z)return d();qh(a);let u="margin:0;overflow:hidden;background:#000;user-select:none;-webkit-user-select:none;touch-action:none;-webkit-touch-callout:none";a.style.cssText=u,B=a.appendChild(document.createElement("canvas")),Et=ut=B.getContext("2d"),Ch(),Bh(),Gl();let h="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)";B.style.cssText=h,et&&(et.style.cssText=h),nc(lr),l(),Eo(),Ne=new OffscreenCanvas(64,64),Ke=Ne.getContext("2d"),Se=new OffscreenCanvas(64,64),je=Se.getContext("2d",{willReadFrequently:!0});let p=o.map((y,x)=>Ta(x,y));return o.length||p.push(Ta(0)),p.push(dh()),ur&&p.push(new Promise(y=>{let x=0;v();function v(){ks(),Qh(x+=.01),x>1?y():setTimeout(v,16)}})),await Promise.all(p),d();async function d(){await n(),c()}}function Ia(){er=vt.filter(t=>t.collideSolidObjects);function n(t){if(!t.destroyed){t.update();for(let e of t.children)n(e)}}for(let t of vt)if(!(t.parent||t.destroyed)){t.update(),t.updatePhysics();for(let e of t.children)n(e);t.updateTransforms()}vt=vt.filter(t=>!t.destroyed)}function Ll(n=!0){for(let t of vt)t.parent||t.destroy(n);vt=vt.filter(t=>!t.destroyed)}function Ma(n,t,e=vt){let s=[];if(n)if(t instanceof rt)for(let i of e)i.isOverlapping(n,t)&&s.push(i);else{let i=t*t;for(let o of e)n.distanceSquared(o.pos)e(i))}function Dl(n,t,e=vt){let s=[];for(let i of e)i.collideRaycast&&Va(n,t,i.pos,i.size)&&(he&&bt(i.pos,i.size,"#f00"),s.push(i));return he&&we(n,t,s.length?"#f00":"#00f",.02),s}function f(n,...t){if(!n)throw console.assert(n,...t),new Error("Assert failed!")}function xt(...n){console.log(...n)}function bt(n,t=b(),e=W,s=0,i=0,o=!1,a=!1){f(O(n),"pos must be a vec2"),f(O(t),"size must be a vec2"),f(V(e)||U(e),"color is invalid"),f(L(s),"time must be a number"),f(L(i),"angle must be a number"),U(e)&&(e=e.toString());let r=new Ee(s);Ze.push({pos:n.copy(),size:t.copy(),color:e,timer:r,angle:i,fill:o,screenSpace:a})}function Il(n,t,e=W,s=0,i=0,o=!1,a=!1){f(O(n),"pos must be a vec2"),f(de(t),"points must be an array"),f(V(e)||U(e),"color is invalid"),f(L(s),"time must be a number"),f(L(i),"angle must be a number"),U(e)&&(e=e.toString()),n=n.copy(),t=t.map(c=>c.copy());let r=new Ee(s);Ze.push({pos:n,points:t,color:e,timer:r,angle:i,fill:o,screenSpace:a})}function Ut(n,t=0,e=W,s=0,i=!1,o=!1){f(O(n),"pos must be a vec2"),f(L(t),"size must be a number"),f(V(e)||U(e),"color is invalid"),f(L(s),"time must be a number"),U(e)&&(e=e.toString()),n=n.copy();let a=new Ee(s);Ze.push({pos:n,size:t,color:e,timer:a,angle:0,fill:i,screenSpace:o})}function nr(n,t,e,s,i=!1){bt(n,void 0,t,e,s,!1,i)}function we(n,t,e,s=.1,i=0,o=!1){f(O(n),"posA must be a vec2"),f(O(t),"posB must be a vec2"),f(L(s),"width must be a number");let a=b((t.x-n.x)/2,(t.y-n.y)/2),r=b(s,a.length()*2);bt(n.add(a),r,e,i,a.angle(),!0,o)}function fo(n,t,e,s,i,o,a=!1){f(O(n),"posA must be a vec2"),f(O(e),"posB must be a vec2"),f(O(t),"sizeA must be a vec2"),f(O(s),"sizeB must be a vec2");let r=b(tt(n.x-t.x/2,e.x-s.x/2),tt(n.y-t.y/2,e.y-s.y/2)),c=b(K(n.x+t.x/2,e.x+s.x/2),K(n.y+t.y/2,e.y+s.y/2));bt(r.lerp(c,.5),c.subtract(r),i,o,0,!1,a)}function In(n,t,e=1,s=W,i=0,o=0,a="monospace",r=!1){f(V(n),"text must be a string"),f(O(t),"pos must be a vec2"),f(L(e),"size must be a number"),f(V(s)||U(s),"color is invalid"),f(L(i),"time must be a number"),f(L(o),"angle must be a number"),f(V(a),"font must be a string"),U(s)&&(s=s.toString()),t=t.copy();let c=new Ee(i);Ze.push({text:n,pos:t,size:e,color:s,timer:c,angle:o,font:a,screenSpace:r})}function Ml(){Ze=[]}function Fa(){ho=1}function kl(){let n=e=>{document.body.style="background-color:#111;margin:8px",document.body.innerHTML="

"+e},t=console.assert;console.assert=(e,...s)=>{if(t(e,...s),!e){let i=s.join(" "),o=new Error().stack;throw`Assertion failed!
+"use strict";var __GameBundle=(()=>{var zi=Object.defineProperty;var kc=Object.getOwnPropertyDescriptor;var Gc=Object.getOwnPropertyNames;var Fc=Object.prototype.hasOwnProperty;var jc=(n,t,e)=>()=>{if(e)throw e[0];try{return n&&(t=n(n=0)),t}catch(s){throw e=[s],s}};var Hr=(n,t)=>{for(var e in t)zi(n,e,{get:t[e],enumerable:!0})},Nc=(n,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Gc(t))!Fc.call(n,i)&&i!==e&&zi(n,i,{get:()=>t[i],enumerable:!(s=kc(t,i))||s.enumerable});return n};var Bc=n=>Nc(zi({},"__esModule",{value:!0}),n);var Ic={};Hr(Ic,{ASSERT:()=>p,BLACK:()=>ot,BLUE:()=>Za,Box2dDistanceJoint:()=>Ti,Box2dFrictionJoint:()=>$o,Box2dGearJoint:()=>qo,Box2dJoint:()=>$t,Box2dKinematicObject:()=>Bo,Box2dMotorJoint:()=>Qo,Box2dObject:()=>Rs,Box2dPinJoint:()=>Uo,Box2dPlugin:()=>Ai,Box2dPrismaticJoint:()=>Ho,Box2dPulleyJoint:()=>Ko,Box2dRaycastResult:()=>wi,Box2dRevoluteJoint:()=>Wo,Box2dRopeJoint:()=>Vo,Box2dStaticObject:()=>Si,Box2dTargetJoint:()=>Jo,Box2dTileLayer:()=>zo,Box2dWeldJoint:()=>Yo,Box2dWheelJoint:()=>Xo,CLEAR_BLACK:()=>ye,CLEAR_WHITE:()=>ln,CYAN:()=>ql,CanvasLayer:()=>ui,Color:()=>Et,Ease:()=>Ci,EngineObject:()=>qe,GRAY:()=>Vl,GREEN:()=>Qa,ImageFont:()=>ii,LOG:()=>St,Light:()=>Oo,LightSystemPlugin:()=>Lo,MAGENTA:()=>Hl,Medal:()=>xi,NewgroundsMedal:()=>_o,NewgroundsPlugin:()=>Ro,ORANGE:()=>Wl,PI:()=>Y,PURPLE:()=>tc,Particle:()=>hi,ParticleEmitter:()=>vo,PathFinder:()=>Zo,PathFinderNode:()=>_i,PostProcessPlugin:()=>Po,RED:()=>rr,RandomGenerator:()=>go,Sound:()=>xs,SoundInstance:()=>ci,TextureInfo:()=>He,TileCollisionLayer:()=>Ss,TileInfo:()=>Oe,TileLayer:()=>vs,TileLayerData:()=>En,Timer:()=>Re,Tween:()=>Ei,UIButton:()=>_s,UICheckbox:()=>Go,UILayout:()=>No,UIObject:()=>ce,UISlider:()=>Fo,UISystemPlugin:()=>Io,UIText:()=>vi,UITextInput:()=>Mo,UITile:()=>ko,UIVideo:()=>jo,Vector2:()=>ct,WHITE:()=>V,YELLOW:()=>Ka,ZzFXMusic:()=>Do,abs:()=>st,atan2:()=>sr,audioContext:()=>ft,audioDefaultSampleRate:()=>ts,audioIsRunning:()=>bs,audioMasterGain:()=>We,box2d:()=>m,box2dDebug:()=>qr,box2dInit:()=>ad,box2dSetDebug:()=>rd,cameraAngle:()=>tt,cameraFit:()=>rh,cameraPos:()=>Pt,cameraScale:()=>H,canvasClearColor:()=>sn,canvasColorTiles:()=>Pi,canvasFixedSize:()=>jn,canvasMaxAspect:()=>Fn,canvasMaxSize:()=>Gn,canvasMinAspect:()=>rs,canvasPixelRatio:()=>on,canvasPixelated:()=>lr,ceil:()=>hs,clamp:()=>j,combineCanvases:()=>wr,cos:()=>lt,debug:()=>Nt,debugCircle:()=>Wt,debugClear:()=>Ml,debugLine:()=>Ee,debugOverlap:()=>fo,debugOverlay:()=>Fe,debugPoint:()=>nr,debugPointSize:()=>ka,debugPoly:()=>Il,debugRect:()=>xt,debugScreenshot:()=>Fa,debugShowErrors:()=>kl,debugText:()=>kn,debugVideoCaptureIsActive:()=>Ce,debugVideoCaptureStart:()=>ja,debugVideoCaptureStop:()=>Na,debugWatermark:()=>Ri,distanceAngle:()=>zl,distanceWrap:()=>ir,drawCanvas2D:()=>On,drawCircle:()=>si,drawCircleGradient:()=>sh,drawContext:()=>_t,drawCount:()=>Pe,drawCrescent:()=>ud,drawEllipse:()=>ic,drawEllipseGradient:()=>oc,drawLine:()=>vn,drawLineList:()=>mo,drawNineSlice:()=>_c,drawNineSliceScreen:()=>cd,drawPoly:()=>Wn,drawRect:()=>ni,drawRectGradient:()=>th,drawRegularPoly:()=>sc,drawText:()=>ih,drawTextScreen:()=>rn,drawTextureWrapped:()=>eh,drawThreeSlice:()=>Rc,drawThreeSliceScreen:()=>ld,drawTile:()=>It,enablePhysicsSolver:()=>Ii,engineAddPlugin:()=>Pn,engineImageFont:()=>lc,engineInit:()=>Pl,engineName:()=>Hs,engineObjects:()=>wt,engineObjectsCallback:()=>Ol,engineObjectsCollect:()=>Ma,engineObjectsCollide:()=>er,engineObjectsDestroy:()=>Ll,engineObjectsRaycast:()=>Dl,engineObjectsUpdate:()=>Ia,engineVersion:()=>Xs,fetchJSON:()=>Xl,floor:()=>At,fontDefault:()=>Ps,formatTime:()=>ar,frame:()=>Oa,frameRate:()=>Cl,gamepadConnected:()=>xo,gamepadDirectionEmulateStick:()=>yr,gamepadDpad:()=>bo,gamepadIsDown:()=>Ge,gamepadPrimary:()=>bt,gamepadStick:()=>ys,gamepadStickCount:()=>uc,gamepadVibrate:()=>Sh,gamepadVibrateStop:()=>wh,gamepadWasPressed:()=>Rr,gamepadWasReleased:()=>vh,gamepadsEnable:()=>Mi,getCameraSize:()=>ac,getCrescentPoints:()=>Pc,getNoteFrequency:()=>gc,getPaused:()=>_l,glAntialias:()=>Mr,glCanvas:()=>nt,glCircleSides:()=>Ls,glClearCanvas:()=>vc,glClearRect:()=>Ec,glCompileShader:()=>Co,glContext:()=>g,glCopyToContext:()=>Nr,glCreateProgram:()=>$n,glCreateTexture:()=>ji,glDeleteTexture:()=>wc,glDraw:()=>As,glDrawColoredPoints:()=>Jr,glDrawOutlineTransform:()=>zr,glDrawPoints:()=>Ac,glDrawPointsTransform:()=>Br,glDrawUntextured:()=>Tc,glEnable:()=>G,glFlush:()=>Lt,glSetAntialias:()=>Yh,glSetRenderTarget:()=>os,glSetTexture:()=>Fr,glSetTextureData:()=>jr,glSetTextureWrap:()=>Sc,gravity:()=>qt,headlessMode:()=>B,hsl:()=>Ne,hypot:()=>Ba,inputClear:()=>Gs,inputClearKey:()=>Cr,inputMouseMoveThreshold:()=>Er,inputPreventDefault:()=>Nn,inputWASDEmulateDirection:()=>as,isArray:()=>pe,isColor:()=>J,isFullscreen:()=>cc,isIntersecting:()=>Va,isNumber:()=>R,isOnScreen:()=>ah,isOverlapping:()=>Qs,isPowerOfTwo:()=>ds,isStringLike:()=>U,isTouchDevice:()=>re,isUsingGamepad:()=>zn,isVector2:()=>O,keyDirection:()=>bh,keyIsDown:()=>Dt,keyWasPressed:()=>Ft,keyWasReleased:()=>_r,lastInputDevice:()=>en,lerp:()=>Ht,lerpAngle:()=>Jl,lerpWrap:()=>Ua,lightSystem:()=>q,lineTest:()=>qa,log2:()=>za,mainCanvas:()=>F,mainCanvasSize:()=>I,mainContext:()=>ut,max:()=>Q,medalDisplaySize:()=>mi,medalDisplaySlideTime:()=>Bn,medalDisplayTime:()=>yi,medals:()=>Es,medalsForEach:()=>Ni,medalsInit:()=>Zh,medalsPreventUnlock:()=>Ur,medalsReset:()=>td,min:()=>et,mod:()=>oe,mouseDelta:()=>Tr,mouseDeltaScreen:()=>we,mouseInWindow:()=>oi,mouseIsDown:()=>ls,mousePos:()=>ke,mousePosScreen:()=>Vt,mouseWasPressed:()=>gs,mouseWasReleased:()=>xh,mouseWheel:()=>Ar,nearestPowerOfTwo:()=>Ul,newgrounds:()=>Cs,noise1D:()=>Zl,noise2D:()=>tu,objectDefaultAngleDamping:()=>fr,objectDefaultDamping:()=>dr,objectDefaultFriction:()=>gr,objectDefaultMass:()=>hr,objectDefaultRestitution:()=>pr,objectMaxSpeed:()=>Be,oscillate:()=>Wa,particleEmitRateScale:()=>Zs,paused:()=>_e,percent:()=>Bt,percentLerp:()=>Bl,playSamples:()=>Ir,pointerLockExit:()=>Eh,pointerLockIsActive:()=>hc,pointerLockRequest:()=>Ah,postProcess:()=>Gt,primitiveCount:()=>Le,rand:()=>dt,randBool:()=>Ha,randColor:()=>po,randInCircle:()=>$a,randInt:()=>or,randSign:()=>Xa,randVec2:()=>Ya,readSaveData:()=>Kl,rgb:()=>z,round:()=>$s,saveCanvas:()=>ec,saveDataURL:()=>fs,saveText:()=>Yl,screenToWorld:()=>Ms,screenToWorldDelta:()=>rc,screenToWorldTransform:()=>ks,setAdditiveBlendMode:()=>ps,setCameraAngle:()=>nu,setCameraPos:()=>eu,setCameraScale:()=>su,setCanvasClearColor:()=>ru,setCanvasColorTiles:()=>ou,setCanvasFixedSize:()=>uu,setCanvasMaxAspect:()=>lu,setCanvasMaxSize:()=>au,setCanvasMinAspect:()=>cu,setCanvasPixelRatio:()=>du,setCanvasPixelated:()=>nc,setCursor:()=>hh,setDebugKey:()=>Zu,setDebugWatermark:()=>Qu,setEnablePhysicsSolver:()=>Su,setFontDefault:()=>fu,setGLCircleSides:()=>mu,setGLEnable:()=>yu,setGamepadDirectionEmulateStick:()=>Ou,setGamepadsEnable:()=>Lu,setGravity:()=>Ru,setHeadlessMode:()=>gu,setInputMouseMoveThreshold:()=>ph,setInputPreventDefault:()=>fh,setInputWASDEmulateDirection:()=>Du,setMedalDisplaySize:()=>sd,setMedalDisplaySlideTime:()=>nd,setMedalDisplayTime:()=>ed,setMedalsPreventUnlock:()=>id,setObjectDefaultAngleDamping:()=>Au,setObjectDefaultDamping:()=>Tu,setObjectDefaultFriction:()=>Cu,setObjectDefaultMass:()=>wu,setObjectDefaultRestitution:()=>Eu,setObjectMaxSpeed:()=>_u,setParticleEmitRateScale:()=>Pu,setPaused:()=>Rl,setShowSplashScreen:()=>pu,setSoundDefaultRange:()=>$u,setSoundDefaultTaper:()=>Ku,setSoundEnable:()=>Xu,setSoundVolume:()=>Yu,setTileDefaultBleed:()=>vu,setTileDefaultPadding:()=>xu,setTileDefaultSize:()=>bu,setTilesPixelated:()=>hu,setTimeScale:()=>iu,setTouchGamepadAlpha:()=>Vu,setTouchGamepadAnalog:()=>zu,setTouchGamepadButtonCount:()=>Fu,setTouchGamepadCenterButtonSize:()=>Gu,setTouchGamepadDisplayTime:()=>Wu,setTouchGamepadEnable:()=>Mu,setTouchGamepadFloating:()=>Ju,setTouchGamepadLeftButtonCount:()=>Nu,setTouchGamepadLeftStick:()=>ju,setTouchGamepadPassthrough:()=>ku,setTouchGamepadRightStick:()=>Bu,setTouchGamepadSize:()=>Uu,setTouchGamepadVibration:()=>qu,setTouchInputEnable:()=>Iu,setVibrateEnable:()=>Hu,shareURL:()=>$l,showSplashScreen:()=>ur,sign:()=>ie,sin:()=>it,smoothStep:()=>Ks,soundDefaultRange:()=>xr,soundDefaultTaper:()=>vr,soundEnable:()=>Yt,soundVolume:()=>An,speak:()=>Bh,speakStop:()=>zh,tan:()=>Ja,textureInfos:()=>hn,tile:()=>Is,tileCollisionGetData:()=>li,tileCollisionLayers:()=>an,tileCollisionRaycast:()=>yc,tileCollisionTest:()=>Ze,tileDefaultBleed:()=>Di,tileDefaultPadding:()=>Oi,tileDefaultSize:()=>Li,tileLayersLoad:()=>Uh,tilesPixelated:()=>Cn,time:()=>Zt,timeDelta:()=>tr,timeReal:()=>cn,timeScale:()=>cr,toggleFullscreen:()=>uh,touchGamepadAlpha:()=>br,touchGamepadAnalog:()=>Os,touchGamepadButtonCount:()=>Kn,touchGamepadCenterButtonSize:()=>ge,touchGamepadDisplayTime:()=>cs,touchGamepadEnable:()=>un,touchGamepadFloating:()=>dn,touchGamepadLeftButtonCount:()=>Qn,touchGamepadLeftStick:()=>Ln,touchGamepadPassthrough:()=>mr,touchGamepadRightStick:()=>Zn,touchGamepadSize:()=>Xt,touchGamepadVibration:()=>ti,touchInputEnable:()=>xn,tweenProperty:()=>hd,tweenStopAll:()=>dd,tweenUpdate:()=>Dc,uiDebug:()=>Wr,uiSetDebug:()=>od,uiSystem:()=>E,usingGamepadInput:()=>mh,usingKeyboardInput:()=>yh,usingMouseInput:()=>gh,vec2:()=>b,vibrate:()=>Pr,vibrateEnable:()=>Ds,vibrateStop:()=>Th,workCanvas:()=>Ue,workContext:()=>tn,workReadCanvas:()=>Ae,workReadContext:()=>ze,worldToScreen:()=>Dn,worldToScreenDelta:()=>oh,writeSaveData:()=>Ql,zzfx:()=>Jh,zzfxG:()=>Gi,zzfxM:()=>Cc});function _l(){return _e}function Rl(n=!0){_e=n}function Pn(n,t,e,s){p(!Sn.find(o=>o.update===n&&o.render===t&&o.glContextLost===e&&o.glContextRestored===s));let i=new uo(n,t,e,s);Sn.push(i)}async function Pl(n,t,e,s,i,o=[],a){if(Da&&console.log(`${Hs} Engine v${Xs}`),p(!ut,"engine already initialized"),ut)return;p(pe(o),"pass in images as array"),document.body||document.documentElement.appendChild(document.createElement("body")),a||(a=document.body),n||(n=()=>{}),t||(t=()=>{}),e||(e=()=>{}),s||(s=()=>{}),i||(i=()=>{});function r(){I=b(F.width,F.height),ut.imageSmoothingEnabled=!Cn,Eo()}function c(y=0){let x=y-ao;ao||(x=0),ao=y,(Nt||Ri)&&(Ys=Ht(Ys,1e3/(x||1),.05));let v=Nt&&Dt("Equal"),w=Nt&&Dt("Minus"),_=v?10:w?.1:1;cn+=x*_/1e3;let S=cr*_;x*=S,Se+=_e?0:x,S<=1&&(Se=et(Se,50));let C=!1;if(_e){C=!0,l(),Ea(),Sn.forEach(T=>{var P;return(P=T.update)==null?void 0:P.call(T)});for(let T of wt)T.parent||T.updateTransforms();Sa(),e(),Ca(),Ce()&&A()}else{let T=0;for(Se<0&&Se>-9&&(T=Se,Se=0);Se>=0;Se-=1e3/60)Zt=Oa++/60,C=!0,l(),Ea(),t(),Sn.forEach(P=>{var k;return(k=P.update)==null?void 0:k.call(P)}),Ia(),Sa(),e(),Ca(),Ce()&&A();Se+=T}Ce()||A(),requestAnimationFrame(c);function A(){if(!B){C||l(),r(),s(),wt.sort((T,P)=>T.renderOrder-P.renderOrder);for(let T of wt)T.destroyed||T.render();i(),Sn.forEach(T=>{var P;return(P=T.render)==null?void 0:P.call(T)}),_h(),Fl(),Lt(),jl(),Pe=0,Le=0}}}function l(){if(!B){if(jn.x){I=jn.copy();let y=innerWidth/innerHeight,x=jn.x/jn.y,v=yFn){let C=I.y*Fn|0;I.x=et(C,Gn.x)}else if(w0&&!G&&(ut.fillStyle=sn.toString(),ut.fillRect(0,0,I.x,I.y),ut.fillStyle=ot.toString()),ut.lineJoin="round",ut.lineCap="round"}}if(B)return f();qh(a);let u="margin:0;overflow:hidden;background:#000;user-select:none;-webkit-user-select:none;touch-action:none;-webkit-touch-callout:none";a.style.cssText=u,F=a.appendChild(document.createElement("canvas")),_t=ut=F.getContext("2d"),Ch(),Nh(),Gl();let h="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)";F.style.cssText=h,nt&&(nt.style.cssText=h),nc(lr),l(),Eo(),Ue=new OffscreenCanvas(64,64),tn=Ue.getContext("2d"),Ae=new OffscreenCanvas(64,64),ze=Ae.getContext("2d",{willReadFrequently:!0});let d=o.map((y,x)=>Ta(x,y));return o.length||d.push(Ta(0)),d.push(dh()),ur&&d.push(new Promise(y=>{let x=0;v();function v(){Gs(),Qh(x+=.01),x>1?y():setTimeout(v,16)}})),await Promise.all(d),f();async function f(){await n(),c()}}function Ia(){er=wt.filter(t=>t.collideSolidObjects);function n(t){if(!t.destroyed){t.update();for(let e of t.children)n(e)}}for(let t of wt)if(!(t.parent||t.destroyed)){t.update(),t.updatePhysics();for(let e of t.children)n(e);t.updateTransforms()}wt=wt.filter(t=>!t.destroyed)}function Ll(n=!0){for(let t of wt)t.parent||t.destroy(n);wt=wt.filter(t=>!t.destroyed)}function Ma(n,t,e=wt){let s=[];if(n)if(t instanceof ct)for(let i of e)i.isOverlapping(n,t)&&s.push(i);else{let i=t*t;for(let o of e)n.distanceSquared(o.pos)e(i))}function Dl(n,t,e=wt){let s=[];for(let i of e)i.collideRaycast&&Va(n,t,i.pos,i.size)&&(fe&&xt(i.pos,i.size,"#f00"),s.push(i));return fe&&Ee(n,t,s.length?"#f00":"#00f",.02),s}function p(n,...t){if(!n)throw console.assert(n,...t),new Error("Assert failed!")}function St(...n){console.log(...n)}function xt(n,t=b(),e=V,s=0,i=0,o=!1,a=!1){p(O(n),"pos must be a vec2"),p(O(t),"size must be a vec2"),p(U(e)||J(e),"color is invalid"),p(R(s),"time must be a number"),p(R(i),"angle must be a number"),J(e)&&(e=e.toString());let r=new Re(s);nn.push({pos:n.copy(),size:t.copy(),color:e,timer:r,angle:i,fill:o,screenSpace:a})}function Il(n,t,e=V,s=0,i=0,o=!1,a=!1){p(O(n),"pos must be a vec2"),p(pe(t),"points must be an array"),p(U(e)||J(e),"color is invalid"),p(R(s),"time must be a number"),p(R(i),"angle must be a number"),J(e)&&(e=e.toString()),n=n.copy(),t=t.map(c=>c.copy());let r=new Re(s);nn.push({pos:n,points:t,color:e,timer:r,angle:i,fill:o,screenSpace:a})}function Wt(n,t=0,e=V,s=0,i=!1,o=!1){p(O(n),"pos must be a vec2"),p(R(t),"size must be a number"),p(U(e)||J(e),"color is invalid"),p(R(s),"time must be a number"),J(e)&&(e=e.toString()),n=n.copy();let a=new Re(s);nn.push({pos:n,size:t,color:e,timer:a,angle:0,fill:i,screenSpace:o})}function nr(n,t,e,s,i=!1){xt(n,void 0,t,e,s,!1,i)}function Ee(n,t,e,s=.1,i=0,o=!1){p(O(n),"posA must be a vec2"),p(O(t),"posB must be a vec2"),p(R(s),"width must be a number");let a=b((t.x-n.x)/2,(t.y-n.y)/2),r=b(s,a.length()*2);xt(n.add(a),r,e,i,a.angle(),!0,o)}function fo(n,t,e,s,i,o,a=!1){p(O(n),"posA must be a vec2"),p(O(e),"posB must be a vec2"),p(O(t),"sizeA must be a vec2"),p(O(s),"sizeB must be a vec2");let r=b(et(n.x-t.x/2,e.x-s.x/2),et(n.y-t.y/2,e.y-s.y/2)),c=b(Q(n.x+t.x/2,e.x+s.x/2),Q(n.y+t.y/2,e.y+s.y/2));xt(r.lerp(c,.5),c.subtract(r),i,o,0,!1,a)}function kn(n,t,e=1,s=V,i=0,o=0,a="monospace",r=!1){p(U(n),"text must be a string"),p(O(t),"pos must be a vec2"),p(R(e),"size must be a number"),p(U(s)||J(s),"color is invalid"),p(R(i),"time must be a number"),p(R(o),"angle must be a number"),p(U(a),"font must be a string"),J(s)&&(s=s.toString()),t=t.copy();let c=new Re(i);nn.push({text:n,pos:t,size:e,color:s,timer:c,angle:o,font:a,screenSpace:r})}function Ml(){nn=[]}function Fa(){ho=1}function kl(){let n=e=>{document.body.style="background-color:#111;margin:8px",document.body.innerHTML="
"+e},t=console.assert;console.assert=(e,...s)=>{if(t(e,...s),!e){let i=s.join(" "),o=new Error().stack;throw`Assertion failed!
 `+i+`
 `+o}},onunhandledrejection=e=>n(e.reason.stack||e.reason),onerror=(e,s,i,o)=>n(`${e}
 ${s}
-Ln ${i}, Col ${o}`)}function Gl(){Da&&console.warn("LittleJS DEBUG build loaded. Use the release build for production.")}function Sa(){jt&&(Gt(Ga)&&(Me=!Me),Me&&(Gt("Digit1")&&(ue=!ue,xn=!1),Gt("Digit2")&&(xn=!xn,ue=!1),Gt("Digit3")&&(vn=!vn),Gt("Digit4")&&(he=!he),Gt("Digit5")&&Fa(),Gt("Digit7")&&(Jn=!Jn)),Te()?(!Me||Gt("Digit6"))&&Ba():Me&&Gt("Digit6")&&ja())}function Fl(){if(Te())return;Rt();let n=Ce,t=_e;ho&&(wr(),ec(B),ho=0);let e=ut;if(vn&&Mi){let o=0;for(let a=0;a<8;a++)xo(a)&&o++;for(let a=0;a<8;a++){if(!xo(a))continue;let r=1,c=.2,l=_t.add(b(-r*2,((o-1)/2-a)*r*3));In(a,l.add(b(-r,r)),1),a===mt&&In("Main",l.add(b(-r*2,0)),1,"#0f0");let u=ve[a].length;for(let p=0;p{e.save();let o=i.pos,a=1,r=i.angle;if(i.screenSpace||(o=Pn(i.pos),a=H,r-=Q),e.translate(o.x|0,o.y|0),e.rotate(r),e.scale(1,i.text?1:-1),e.fillStyle=i.color,e.strokeStyle=i.color,i.text!==void 0)e.font=i.size*a+"px "+i.font,e.textAlign="center",e.textBaseline="middle",e.fillText(i.text,0,0);else if(i.points!==void 0){e.beginPath();for(let c of i.points){let l=c.scale(a).floor();e.lineTo(l.x,l.y)}e.closePath(),i.fill&&e.fill(),e.stroke()}else if(i.size===0||i.size.x===0&&i.size.y===0){let c=ka*a;e.fillRect(-c/2,-1,c,3),e.fillRect(-1,-c/2,3,c)}else if(i.size.x!==void 0){let c=i.size.scale(a).floor(),l=c.x,u=c.y;i.fill&&e.fillRect(-l/2|0,-u/2|0,l,u),e.strokeRect(-l/2|0,-u/2|0,l,u)}else e.beginPath(),e.arc(0,0,i.size*a/2,0,9),i.fill&&e.fill(),e.stroke();e.restore()}),Ze=Ze.filter(i=>i.timer<0),s){let i=yc(s.pos,De);i&&ni(i.floor().add(b(.5)),b(1),J(0,1,1,.3),0,!1),mn(De,s.pos,.1,i?J(1,0,0,.5):J(0,1,0,.5),void 0,void 0,!1);let o="mouse pos = "+De;sn.length&&(o+=`
-mouse collision = `+li(De)),o+=`
+Ln ${i}, Col ${o}`)}function Gl(){Da&&console.warn("LittleJS DEBUG build loaded. Use the release build for production.")}function Sa(){Nt&&(Ft(Ga)&&(Fe=!Fe),Fe&&(Ft("Digit1")&&(de=!de,wn=!1),Ft("Digit2")&&(wn=!wn,de=!1),Ft("Digit3")&&(Tn=!Tn),Ft("Digit4")&&(fe=!fe),Ft("Digit5")&&Fa(),Ft("Digit7")&&(Vn=!Vn)),Ce()?(!Fe||Ft("Digit6"))&&Na():Fe&&Ft("Digit6")&&ja())}function Fl(){if(Ce())return;Lt();let n=Pe,t=Le;ho&&(wr(),ec(F),ho=0);let e=ut;if(Tn&&Mi){let o=0;for(let a=0;a<8;a++)xo(a)&&o++;for(let a=0;a<8;a++){if(!xo(a))continue;let r=1,c=.2,l=Pt.add(b(-r*2,((o-1)/2-a)*r*3));kn(a,l.add(b(-r,r)),1),a===bt&&kn("Main",l.add(b(-r*2,0)),1,"#0f0");let u=Te[a].length;for(let d=0;d{e.save();let o=i.pos,a=1,r=i.angle;if(i.screenSpace||(o=Dn(i.pos),a=H,r-=tt),e.translate(o.x|0,o.y|0),e.rotate(r),e.scale(1,i.text?1:-1),e.fillStyle=i.color,e.strokeStyle=i.color,i.text!==void 0)e.font=i.size*a+"px "+i.font,e.textAlign="center",e.textBaseline="middle",e.fillText(i.text,0,0);else if(i.points!==void 0){e.beginPath();for(let c of i.points){let l=c.scale(a).floor();e.lineTo(l.x,l.y)}e.closePath(),i.fill&&e.fill(),e.stroke()}else if(i.size===0||i.size.x===0&&i.size.y===0){let c=ka*a;e.fillRect(-c/2,-1,c,3),e.fillRect(-1,-c/2,3,c)}else if(i.size.x!==void 0){let c=i.size.scale(a).floor(),l=c.x,u=c.y;i.fill&&e.fillRect(-l/2|0,-u/2|0,l,u),e.strokeRect(-l/2|0,-u/2|0,l,u)}else e.beginPath(),e.arc(0,0,i.size*a/2,0,9),i.fill&&e.fill(),e.stroke();e.restore()}),nn=nn.filter(i=>i.timer<0),s){let i=yc(s.pos,ke);i&&ni(i.floor().add(b(.5)),b(1),z(0,1,1,.3),0,!1),vn(ke,s.pos,.1,i?z(1,0,0,.5):z(0,1,0,.5),void 0,void 0,!1);let o="mouse pos = "+ke;an.length&&(o+=`
+mouse collision = `+li(ke)),o+=`
 
 --- object info ---
-`,o+=s.toString(),nn(o,Jt,24,J(),.05,void 0,"center","monospace")}{e.save(),e.fillStyle="#fff",e.textAlign="left",e.textBaseline="top",e.font="20px monospace",e.shadowColor="#000",e.shadowBlur=9;let a=9,r=0,c=24;if(Me){e.fillText(`${Hs} v${Xs}`,a,r+=c/2),e.fillText("Time: "+ar(Kt),a,r+=c),e.fillText("FPS: "+Ys.toFixed(1)+(G?" WebGL":" Canvas2D"),a,r+=c),e.fillText("Objects: "+vt.length,a,r+=c),e.fillText("Draw Calls: "+Ce,a,r+=c),e.fillText("Primitives: "+_e,a,r+=c),e.fillText("---------",a,r+=c),e.fillStyle="#f00",e.fillText("ESC: Debug Overlay",a,r+=c),e.fillStyle=ue?"#f00":"#fff",e.fillText("1: Debug Physics",a,r+=c),e.fillStyle=xn?"#f00":"#fff",e.fillText("2: Debug Particles",a,r+=c),e.fillStyle=vn?"#f00":"#fff",e.fillText("3: Debug Gamepads",a,r+=c),e.fillStyle=he?"#f00":"#fff",e.fillText("4: Debug Raycasts",a,r+=c),e.fillStyle="#fff",e.fillText("5: Save Screenshot",a,r+=c),e.fillText("6: Toggle Video Capture",a,r+=c),e.fillStyle=Jn?"#f00":"#fff",e.fillText("7: Debug Sound",a,r+=c);let l="",u="";for(let h in Y[0])It(h,0)&&(parseInt(h)<3?u+=h+" ":l+=h+" ");u&&e.fillText("Mouse: "+u,a,r+=c),l&&e.fillText("Keys: "+l,a,r+=c);for(let h=1;hs.push(r.data),i.onstop=()=>{let r=new Blob(s,{type:"video/webm"}),c=URL.createObjectURL(r);ds(c,"capture.webm",1e3)};let o,a;if(Ht){a=new ConstantSourceNode(ft,{offset:0}),a.connect(Je),a.start(),o=ft.createMediaStreamDestination(),Je.connect(o);for(let r of o.stream.getAudioTracks())n.addTrack(r)}try{i.start()}catch{xt("Video capture not supported in this browser!"),a==null||a.stop();return}xt("Video capture started."),ke={mediaRecorder:i,captureTimer:e,videoTrack:t,silentAudioSource:a,audioStreamDestination:o}}function Ba(){var n,t,e;f(Te(),"Not capturing video!"),xt(`Video capture ended. ${ke.captureTimer.get().toFixed(2)} seconds recorded.`),le.style.display="none",(n=ke.silentAudioSource)==null||n.stop(),(t=ke.mediaRecorder)==null||t.stop(),(e=ke.videoTrack)==null||e.stop(),ke=void 0}function Bl(){f(Te(),"Not capturing video!"),wr(),ke.videoTrack.requestFrame(),le.textContent="\u25CF REC "+ar(ke.captureTimer)}function Zt(n){if(jt){let t=Object.keys(n),e={};t.forEach(s=>e[s]=n[s]),t.forEach(s=>{Object.defineProperty(n,s,{get:()=>e[s],set:i=>{f(!1,`Cannot modify engine constant. Attempted to set constant (${n}) property '${s}' to '${i}'.`)},enumerable:!0})})}return Object.freeze(n)}function se(n,t=1){return(n%t+t)%t}function N(n,t=0,e=1){return ne?e:n}function Bt(n,t,e){return(e-=t)?N((n-t)/e):0}function Wt(n,t,e){return n+N(e)*(t-n)}function Nl(n,t,e,s,i){return Wt(s,i,Bt(n,t,e))}function ir(n,t,e=1){f(e>0,"distanceWrap wrapSize must be > 0");let s=(n-t)%e;return s*2%e-s}function Ua(n,t,e,s=1){return n+N(e)*ir(t,n,s)}function zl(n,t){return ir(n,t,2*X)}function Jl(n,t,e){return Ua(n,t,e,2*X)}function Ks(n){return n*n*(3-2*n)}function hs(n){return!(n&n-1)}function Ul(n){return 2**us(za(n))}function Qs(n,t,e,s=b()){let i=(n.x-e.x)*2,o=(n.y-e.y)*2,a=t.x+s.x,r=t.y+s.y;return nt(i)p)return!1;h=K(y,h)}else{if(y0?r.x+1:r.x,x=h>0?r.y+1:r.y,v=c?(y-n.x)/c:1/0,w=l?(x-n.y)/l:1/0,_=0,S=v,C=w,A=pr.x&&(T.x=r.x+1-P),M.yr.y&&(T.y=r.y+1-P),s&&(A?s.set(-u,0):s.set(0,-h)),T}(A=SURL.revokeObjectURL(n),e)}function $l(n,t,e){var s;f(V(n),"shareURL requires title string"),f(V(t),"shareURL requires url string"),(s=navigator.share)==null||s.call(navigator,{title:n,url:t}).then(()=>e==null?void 0:e())}function Kl(n,t){f(V(n),"loadData requires saveName string");let e={};try{let s=localStorage[n];if(s)try{e=JSON.parse(s)}catch{xt("readSaveData: corrupt JSON for",n,"\u2014 using defaults")}}catch{xt("readSaveData: localStorage unavailable \u2014 using defaults")}return{...t,...e}}function Ql(n,t){f(V(n),"saveData requires saveName string");try{localStorage[n]=JSON.stringify(t)}catch{xt("writeSaveData: failed to write",n)}}function yo(n){let t=(n|0)^2654435769;return t=Math.imul(t^t>>>16,2246822507),t=Math.imul(t^t>>>13,3266489909),t^=t>>>16,(t>>>0)/2**32}function Zl(n){let t=St(n);return Wt(yo(t),yo(t+1),Ks(n-t))}function tu(n,t){let e=St(n),s=St(t),i=Ks(n-e),o=Ks(t-s),a=(r,c)=>yo(r+c*374761393);return Wt(Wt(a(e,s),a(e+1,s),i),Wt(a(e,s+1),a(e+1,s+1),i),o)}function eu(n){_t=n.copy()}function nu(n){Q=n}function su(n){H=n}function iu(n){cr=n}function ou(n){Pi=n}function ru(n){tn=n.copy()}function au(n){Mn=n.copy()}function cu(n){os=n}function lu(n){kn=n}function uu(n){Gn=n.copy()}function nc(n){lr=n,B&&(B.style.imageRendering=n?"pixelated":""),et&&(et.style.imageRendering=n?"pixelated":"")}function hu(n){Tn=n}function du(n){en=n}function fu(n){Rs=n}function pu(n){ur=n}function gu(n){z=n}function yu(n){if(n&&!Ao){console.warn("Can not enable WebGL if it was disabled on start.");return}G=n,et&&(et.style.display=n?"":"none")}function mu(n){Ps=n}function bu(n){Li=n.copy()}function xu(n){Oi=n}function vu(n){Di=n}function Su(n){Ii=n}function wu(n){hr=n}function Tu(n){dr=n}function Au(n){fr=n}function Eu(n){pr=n}function Cu(n){gr=n}function _u(n){Fe=n}function Ru(n){Vt=n.copy()}function Pu(n){Zs=n}function Lu(n){Mi=n}function Ou(n){yr=n}function Du(n){rs=n}function Iu(n){yn=n}function Mu(n){an=n}function ku(n){mr=n}function Gu(n){fe=n}function Fu(n){Yn=n,n>0&&(Kn=!1)}function ju(n){_n=n,n&&($n=0)}function Bu(n){$n=n,n>0&&(_n=!1)}function Nu(n){Kn=n,n&&(Yn=0)}function zu(n){Ls=n}function Ju(n){ln=n}function Uu(n){qt=n}function Vu(n){br=n}function Wu(n){as=n}function qu(n){ti=n}function Hu(n){Os=n}function Xu(n){Ht=n}function Yu(n){Sn=n,Ht&&!z&&Je&&(Je.gain.value=n)}function $u(n){xr=n}function Ku(n){vr=n}function Qu(n){Ri=n}function Zu(n){Ga=n}function ei(n){return n.r>=1&&n.g>=1&&n.b>=1}function Sr(n){return n.r<=0&&n.g<=0&&n.b<=0&&n.a<=0}function Ds(n=0,t=Li,e=0,s=Oi,i=Di){if(f(O(n)||typeof n=="number","index must be a vec2 or number"),f(O(t)||typeof t=="number","size must be a vec2 or number"),f(L(e)||e instanceof Ve,"texture must be a number or TextureInfo"),f(L(s),"padding must be a number"),z)return new Re;typeof t=="number"&&(f(t>0),t=new rt(t,t));let o=typeof e=="number"?cn[e]:e;f(o instanceof Ve,"tile texture is not loaded"),f(o.size.x>0,"tile texture is not loaded");let a=t.x+s*2,r=t.y+s*2,c,l;if(typeof n=="number"){let h=o.size.x/a|0;c=n%h,l=n/h|0}else c=n.x,l=n.y;let u=new rt(c*a+s,l*r+s);return new Re(u,t,o,s,i)}function Mt(n,t=b(1),e,s=W,i=0,o,a,r=G,c=!1,l){var p;f(O(n),"pos must be a vec2"),f(O(t),"size must be a vec2"),f(U(s),"color is invalid"),f(L(i),"angle must be a number"),f(!a||U(a),"additiveColor must be a color"),f(!l||!r,"context only supported in canvas 2D mode");let u=e==null?void 0:e.textureInfo,h=(p=e==null?void 0:e.bleed)!=null?p:0;if(r&&G)if(f(!!g,"WebGL is not enabled!"),c&&([n,t,i]=Ms(n,t,i)),u){let d=u.sizeInverse,y=e.pos.x*d.x,x=e.pos.y*d.y,v=e.size.x*d.x,w=e.size.y*d.y;if(Fr(u.glTexture),h){let _=d.x*h,S=d.y*h;Ts(n.x,n.y,o?-t.x:t.x,t.y,i,y+_,x+S,y-_+v,x-S+w,s.rgbaInt(),a&&a.rgbaInt())}else Ts(n.x,n.y,o?-t.x:t.x,t.y,i,y,x,y+v,x+w,s.rgbaInt(),a&&a.rgbaInt())}else{let d=a?s.add(a):s;Tc(n.x,n.y,t.x,t.y,i,d.rgbaInt())}else++Ce,++_e,Rn(n,t,i,o,d=>{if(u){d.scale(1,-1);let y=e.pos.x,x=e.pos.y,v=e.size.x,w=e.size.y;lh(d,u.image,y,x,v,w,-.5,-.5,1,1,s,a,h)}else{let y=a?s.add(a):s;d.fillStyle=y.toString(),d.fillRect(-.5,-.5,1,1)}},c,l)}function ni(n,t,e,s,i,o,a){Mt(n,t,void 0,e,s,!1,void 0,i,o,a)}function th(n,t,e=W,s=rn,i=0,o=G,a=!1,r){if(f(O(n),"pos must be a vec2"),f(O(t),"size must be a vec2"),f(U(e)&&U(s),"color is invalid"),f(L(i),"angle must be a number"),f(!r||!o,"context only supported in canvas 2D mode"),o&&G){f(!!g,"WebGL is not enabled!"),a&&(n=Is(n),t=t.scale(1/H),i+=Q);let c=[],l=[],u=t.x/2,h=t.y/2,p=e.rgbaInt(),d=s.rgbaInt(),y=lt(-i),x=st(-i);for(let v=4;v--;){let w=v&1?u:-u,_=v&2?h:-h,S=w*y-_*x,C=w*x+_*y,A=v&2?p:d;c.push(b(n.x+S,n.y+C)),l.push(A)}Jr(c,l)}else++Ce,++_e,Rn(n,t,i,!1,c=>{let l=c.createLinearGradient(0,.5,0,-.5);l.addColorStop(0,e.toString()),l.addColorStop(1,s.toString()),c.fillStyle=l,c.fillRect(-.5,-.5,1,1)},a,r)}function eh(n,t,e,s=0,i=W,o=0,a,r=G,c=!1,l){if(f(O(n),"pos must be a vec2"),f(O(t),"size must be a vec2"),f(O(e),"wrapCount must be a vec2"),f(U(i),"color is invalid"),f(L(o),"angle must be a number"),f(!a||U(a),"additiveColor must be a color"),f(!l||!r,"context only supported in canvas 2D mode"),f(!(s instanceof Re),"pass a TextureInfo or texture index, not a TileInfo \u2014 use tileInfo.textureInfo"),z)return;let u=typeof s=="number"?cn[s]:s;if(f(u instanceof Ve,"texture not loaded"),f(u.size.x>0,"texture not loaded"),f(u.wrap,"drawTextureWrapped requires a wrap-enabled texture; call textureInfo.setWrap(true) first"),r&&G){f(!!g,"WebGL is not enabled!"),c&&([n,t,o]=Ms(n,t,o)),Fr(u.glTexture),Ts(n.x,n.y,t.x,t.y,o,0,0,e.x,e.y,i.rgbaInt(),a&&a.rgbaInt());return}++Ce,++_e,c||(n=Pn(n),t=t.scale(H),o-=Q);let h=!Pi||(a?ei(i.add(a))&&a.a<=0:ei(i)),p=!h&&a&&!Sr(a),d=h?u.image:ch(u.image,i,a);l=l||Et,l.save(),l.translate(n.x+.5,n.y+.5),l.rotate(o),l.globalAlpha=p?1:i.a;let y=l.createPattern(d,"repeat"),x=new DOMMatrix().translate(-t.x/2,-t.y/2).scale(t.x/(e.x*d.width),t.y/(e.y*d.height));y.setTransform(x),l.fillStyle=y,l.fillRect(-t.x/2,-t.y/2,t.x,t.y),l.globalAlpha=1,l.restore()}function mo(n,t=.1,e=W,s=!1,i=b(),o=0,a=G,r=!1,c){if(f(de(n),"points must be an array"),f(L(t),"width must be a number"),f(U(e),"color is invalid"),f(O(i),"pos must be a vec2"),f(L(o),"angle must be a number"),f(!c||!a,"context only supported in canvas 2D mode"),a&&G){f(!!g,"WebGL is not enabled!");let l=b(1);r&&([i,l,o]=Ms(i,l,o)),zr(n,e.rgbaInt(),t,i.x,i.y,l.x,l.y,o,s)}else++Ce,++_e,Rn(i,b(1),o,!1,l=>{l.strokeStyle=e.toString(),l.lineWidth=t,l.beginPath();for(let u=0;u0&&zr(n,s.rgbaInt(),e,i.x,i.y,l.x,l.y,o)}else Rn(i,b(1),o,!1,l=>{l.fillStyle=t.toString(),l.beginPath();for(let u of n)l.lineTo(u.x,u.y);l.closePath(),l.fill(),e&&(l.strokeStyle=s.toString(),l.lineWidth=e,l.stroke())},r,c)}function ic(n,t=b(1),e=W,s=0,i=0,o=it,a=G,r=!1,c){f(O(n),"pos must be a vec2"),f(O(t),"size must be a vec2"),f(U(e)&&U(o),"color is invalid"),f(L(s),"angle must be a number"),f(L(i),"lineWidth must be a number"),f(i>=0,"lineWidth must be a positive value or 0"),f(!c||!a,"context only supported in canvas 2D mode"),i=N(i,0,tt(t.x,t.y)),a&&G?sc(n,t,Ps,e,i,o,s,a,r,c):Rn(n,b(1),s,!1,l=>{l.fillStyle=e.toString(),l.beginPath(),l.ellipse(0,0,t.x/2,t.y/2,0,0,9),l.fill(),i&&(l.strokeStyle=o.toString(),l.lineWidth=i,l.stroke())},r,c)}function si(n,t=1,e=W,s=0,i=it,o=G,a=!1,r){f(L(t),"size must be a number"),ic(n,b(t),e,0,s,i,o,a,r)}function oc(n,t=b(1),e=W,s=rn,i=0,o=G,a=!1,r){if(f(O(n),"pos must be a vec2"),f(O(t),"size must be a vec2"),f(U(e)&&U(s),"color is invalid"),f(L(i),"angle must be a number"),f(!r||!o,"context only supported in canvas 2D mode"),!z)if(o&&G){f(!!g,"WebGL is not enabled!"),a&&(n=Is(n),t=t.scale(1/H),i+=Q);let c=Ps,l=t.x/2,u=t.y/2,h=e.rgbaInt(),p=s.rgbaInt(),d=nh++,y=lt(-i),x=st(-i),v=C=>{let A=st(C)*l,T=lt(C)*u;return b(n.x+A*y-T*x,n.y+A*x+T*y)},w=d%c/c*X*2,_=[v(w)],S=[p];for(let C=c;C--;){let A=(C+d)%c/c*X*2;_.push(n),S.push(h),_.push(v(A)),S.push(p)}Jr(_,S)}else++Ce,++_e,Rn(n,t,i,!1,c=>{let l=c.createRadialGradient(0,0,0,0,0,.5);l.addColorStop(0,e.toString()),l.addColorStop(1,s.toString()),c.fillStyle=l,c.beginPath(),c.ellipse(0,0,.5,.5,0,0,9),c.fill()},a,r)}function sh(n,t=1,e=W,s=rn,i=G,o=!1,a){f(L(t),"size must be a number"),oc(n,b(t),e,s,0,i,o,a)}function Rn(n,t,e=0,s=!1,i,o=!1,a=Et){f(O(n),"pos must be a vec2"),f(O(t),"size must be a vec2"),f(L(e),"angle must be a number"),f(typeof i=="function","drawFunction must be a function"),o||(n=Pn(n),t=t.scale(H),e-=Q),a.save(),a.translate(n.x+.5,n.y+.5),a.rotate(e),a.scale(s?-t.x:t.x,-t.y),i(a),a.restore()}function ih(n,t,e=1,s=W,i=0,o=it,a="center",r=Rs,c="",l,u=0,h=Et){t=Pn(t),e*=H,i*=H,u-=Q,u*=-1,nn(n,t,e,s,i,o,a,r,c,l,u,h)}function nn(n,t,e,s=W,i=0,o=it,a="center",r=Rs,c="",l,u=0,h=Et){f(V(n),"text must be a string"),f(O(t),"pos must be a vec2"),f(L(e),"size must be a number"),f(U(s),"color must be a color"),f(L(i),"lineWidth must be a number"),f(U(o),"lineColor must be a color"),f(["left","center","right"].includes(a),"align must be left, center, or right"),f(V(r),"font must be a string"),f(V(c),"fontStyle must be a string"),f(L(u),"angle must be a number");let p=(n+"").split(`
-`),d=t.y-(p.length-1)*e/2;h.save(),h.fillStyle=s.toString(),h.strokeStyle=o.toString(),h.lineWidth=i,h.textAlign=a,h.font=c+" "+e+"px "+r,h.textBaseline="middle",h.translate(t.x,d),h.rotate(-u);let y=0;p.forEach(x=>{i&&h.strokeText(x,0,y,l),h.fillText(x,0,y,l),y+=e}),h.restore()}async function Ta(n,t){f(L(n),"textureIndex must be a number"),f(!cn[n],"textureIndex is already loaded!"),f(!t||V(t),"image src must be a string");let e=new Image;t&&await new Promise(s=>{e.onerror=e.onload=s,e.crossOrigin="anonymous",e.src=t}),cn[n]=new Ve(e)}function Is(n){f(O(n),"screenPos must be a vec2");let t=(n.x-I.x/2+.5)/H,e=(n.y-I.y/2+.5)/-H;if(Q){let s=lt(-Q),i=st(-Q),o=t*s-e*i,a=t*i+e*s;t=o,e=a}return new rt(t+_t.x,e+_t.y)}function Pn(n){f(O(n),"worldPos must be a vec2");let t=n.x-_t.x,e=n.y-_t.y;if(Q){let s=lt(Q),i=st(Q),o=t*s-e*i,a=t*i+e*s;t=o,e=a}return new rt(t*H+I.x/2-.5,e*-H+I.y/2-.5)}function rc(n){f(O(n),"screenDelta must be a vec2");let t=n.x/H,e=n.y/-H;if(Q){let s=lt(-Q),i=st(-Q),o=t*s-e*i,a=t*i+e*s;t=o,e=a}return new rt(t,e)}function oh(n){f(O(n),"worldDelta must be a vec2");let t=n.x,e=n.y;if(Q){let s=lt(Q),i=st(Q),o=t*s-e*i,a=t*i+e*s;t=o,e=a}return new rt(t*H,e*-H)}function Ms(n,t,e=0){return f(O(n),"screenPos must be a vec2"),f(O(t),"screenSize must be a vec2"),f(L(e),"screenAngle must be a number"),[Is(n),t.scale(1/H),e+Q]}function ac(){return I.scale(1/H)}function rh(n,t,e,s){f(O(n),"center must be a vec2"),f(O(t),"size must be a vec2");let i=p(e),o=p(s),a=t.x+i.left+i.right,r=t.y+i.top+i.bottom,c=I.x-o.left-o.right,l=I.y-o.top-o.bottom;if(!(a>0&&r>0&&c>0&&l>0))return H;H=tt(c/a,l/r);let u=b(i.right-i.left,i.top-i.bottom).scale(.5),h=b(o.right-o.left,o.top-o.bottom).scale(.5/H);return _t=n.add(u).add(h),H;function p(d){return(d===void 0||L(d))&&(d=b(d)),O(d)?{top:d.y,right:d.x,bottom:d.y,left:d.x}:{top:d.top||0,right:d.right||0,bottom:d.bottom||0,left:d.left||0}}}function ah(n,t=0){if(f(O(n),"pos must be a vec2"),f(O(t)||L(t),"size must be a vec2 or number"),!H)return!1;let e=n.x-_t.x,s=n.y-_t.y;if(Q){let a=lt(Q),r=st(Q),c=e*a-s*r,l=e*r+s*a;e=c,s=l}e*=H*2,s*=-H*2,t instanceof rt&&(t=t.length()),t*=H;let i=I.x,o=I.y;return e+t>-i&&e-t-o&&s-t{n.onerror=n.onload=r,n.crossOrigin="anonymous",n.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAAeAQMAAABnrVXaAAAABlBMVEUAAAD///+l2Z/dAAAAAXRSTlMAQObYZgAAAjpJREFUOMu9kzFu2zAUhn+CAROgqrk+B2l0BWYxMjlXeYaAtFtbdA1sGgHqRQfI0CNkSG5AwYB0BQ8d5Bsomwah6CPVeGg6tEPzAxLwyI+P78cP4u9lNO9OoMKnLMOobG5020/yaj/MrRcCGh1gBbyiLTPJEYaIiom5KM9Jq7KgynMGtb6L4GL4MF2H4LQKCXTvDVw2I4MsgZT7QLExdiutH+D08VOP3INXRrWX1/mmpbkNgAPYRVANb4xpcegYvhiNbIXauQICEjBuYLfMakaakWQeXxiZ0VDtuJCKs3ztMV59QtsHJNcRxDzfdL21ty3PrfIcXTN+E+GFAv6T5nbT9jd50/WFxb5ksdAv49qS6ouymG66ji08UMT6moykYLAo+V0j23GN4m829ZySAD5K7QsBfQTvOG8eE+gTeGYRAmnNAubN3hf5Zv9tJWDHp/VTuaSm7SN4fyINQqaNO3RMVxvpSPXnOChnRNvFcGY0gnwiPswYwTKVPE0zVtX3mTEIOoFzaqLrGuJaV+Uqumb71fVk/VoOH3cdLNQP/FHi8hV0CQNoqBZsUPlLPMsdCJro9QAaQQ0woDy9BJm0eTxCFnO9srcYlhNVlfR2EyTrph1uUtbUtAJifwRgrKuYdXVHeb0YI3QpawohQHkloI3J5FuVwI5ORxC9k2Tuz9Ir1IjgeIPGMHYkAZe2RuYkmWFmt3gGbTPOmBUWVTmRmHtGrfpzG/yuQNOKa6gBB/WA9khitPgl6/GP+gl2Af6tCbvaygAAAABJRU5ErkJggg=="});let t=b(),e=b(8),s=1,i=0,o=new Ve(n),a=new Re(t,e,o,s,i);lc=new ii(a)}function fh(n=!0){Fn=n}function ph(n){Er=n}function gh(){return Qe==="mouse"}function yh(){return Qe==="keyboard"}function mh(){return Qe==="gamepad"}function Cr(n,t=0,e=!0,s=!0,i=!0){Y[t]&&(Y[t][n]&=~((e?1:0)|(s?2:0)|(i?4:0)))}function ks(){Y.length=0,Y[0]=[],oe.length=0,An.length=0,Gs.length=0,ve.length=0,pn.length=0}function It(n,t=0){var e;return f(V(n),"key must be a number or string"),f(t>0||typeof n!="number"||n<3,"use code string for keyboard"),!!(((e=Y[t])==null?void 0:e[n])&1)}function Gt(n,t=0){var e;return f(V(n),"key must be a number or string"),f(t>0||typeof n!="number"||n<3,"use code string for keyboard"),!!(((e=Y[t])==null?void 0:e[n])&2)}function _r(n,t=0){var e;return f(V(n),"key must be a number or string"),f(t>0||typeof n!="number"||n<3,"use code string for keyboard"),!!(((e=Y[t])==null?void 0:e[n])&4)}function bh(n="ArrowUp",t="ArrowDown",e="ArrowLeft",s="ArrowRight"){f(V(n),"up key must be a string"),f(V(t),"down key must be a string"),f(V(e),"left key must be a string"),f(V(s),"right key must be a string");let i=o=>It(o)?1:0;return b(i(s)-i(e),i(n)-i(t))}function cs(n){return f(L(n),"mouse button must be a number"),It(n)}function ps(n){return f(L(n),"mouse button must be a number"),Gt(n)}function xh(n){return f(L(n),"mouse button must be a number"),_r(n)}function Ie(n,t=mt){return f(L(n),"button must be a number"),f(L(t),"gamepad must be a number"),It(n,t+1)}function Rr(n,t=mt){return f(L(n),"button must be a number"),f(L(t),"gamepad must be a number"),Gt(n,t+1)}function vh(n,t=mt){return f(L(n),"button must be a number"),f(L(t),"gamepad must be a number"),_r(n,t+1)}function gs(n,t=mt){var e,s;return f(L(n),"stick must be a number"),f(L(t),"gamepad must be a number"),(s=(e=ve[t])==null?void 0:e[n])!=null?s:b()}function bo(n=mt){var t;return f(L(n),"gamepad must be a number"),(t=pn[n])!=null?t:b()}function xo(n=mt){return f(L(n),"gamepad must be a number"),!!Y[n+1]}function uc(n=mt){var t,e;return f(L(n),"gamepad must be a number"),(e=(t=ve[n])==null?void 0:t.length)!=null?e:0}function Sh(n=mt,t=200,e=1,s=1,i=0){var a,r,c;if(f(L(n),"gamepad must be a number"),!Os||z)return;let o=(a=navigator==null?void 0:navigator.getGamepads)==null?void 0:a.call(navigator)[n];(c=(r=o==null?void 0:o.vibrationActuator)==null?void 0:r.playEffect)==null||c.call(r,"dual-rumble",{duration:t,strongMagnitude:e,weakMagnitude:s,startDelay:i})}function wh(n=mt){var e,s,i;if(f(L(n),"gamepad must be a number"),!Os||z)return;let t=(e=navigator==null?void 0:navigator.getGamepads)==null?void 0:e.call(navigator)[n];(i=(s=t==null?void 0:t.vibrationActuator)==null?void 0:s.reset)==null||i.call(s)}function Pr(n=100){var t;f(L(n)||de(n),"pattern must be a number or array"),Os&&!z&&((t=navigator==null?void 0:navigator.vibrate)==null||t.call(navigator,n))}function Th(){Pr(0)}function Ah(){var n;!ie&&((n=B.requestPointerLock)==null||n.call(B))}function Eh(){var n;(n=document.exitPointerLock)==null||n.call(document)}function hc(){return document.pointerLockElement===B}function Ch(){if(z)return;document.addEventListener("keydown",n),document.addEventListener("keyup",t),document.addEventListener("mousedown",s),document.addEventListener("mouseup",i),document.addEventListener("mousemove",o),document.addEventListener("mouseleave",a),document.addEventListener("wheel",r,{passive:!1}),document.addEventListener("contextmenu",c),document.addEventListener("blur",l),ie&&yn&&u();function n(p){if(p.repeat||(Y[0][p.code]=3,rs&&(Y[0][e(p.code)]=3)),!Fn||!p.cancelable||!document.hasFocus()||p.ctrlKey||p.metaKey||p.altKey||x(p.target)||x(document.activeElement))return;let d=typeof p.key=="string"&&p.key.length===1;(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Space","Tab","Backspace"].includes(p.code)||d)&&p.preventDefault();function x(v){let w=v==null?void 0:v.tagName;return(v==null?void 0:v.isContentEditable)||["INPUT","TEXTAREA","SELECT"].includes(w)}}function t(p){Y[0][p.code]=Y[0][p.code]&2|4,rs&&(Y[0][e(p.code)]=4)}function e(p){return rs?p==="KeyW"?"ArrowUp":p==="KeyS"?"ArrowDown":p==="KeyA"?"ArrowLeft":p==="KeyD"?"ArrowRight":p:p}function s(p){if(ie&&yn)return;Ht&&!z&&ft&&!ms()&&ft.resume(),Y[0][p.button]=3;let d=Jt;Jt=h(b(p.x,p.y)),xe=xe.add(Jt.subtract(d)),Fn&&p.cancelable&&document.hasFocus()&&p.preventDefault()}function i(p){ie&&yn||(Y[0][p.button]=Y[0][p.button]&2|4)}function o(p){oi=!0;let d=Jt;Jt=h(b(p.x,p.y));let y=hc()?b(p.movementX,p.movementY):Jt.subtract(d);xe=xe.add(y)}function a(){oi=!1}function r(p){p.ctrlKey||(Ar+=ne(p.deltaY)),Fn&&p.cancelable&&document.hasFocus()&&p.preventDefault()}function c(p){p.preventDefault()}function l(){ks(),Be.clear(),oe.length=0,An.length=0,Gs.length=0}function u(){document.addEventListener("touchstart",y=>d(y),{passive:!1}),document.addEventListener("touchmove",y=>d(y),{passive:!1}),document.addEventListener("touchend",y=>d(y),{passive:!1});let p;function d(y){if(yn){if(Ht&&!z&&ft&&!ms()&&ft.resume(),!an||mr){let x=S=>ys.includes(S.target)||S.target===gn,v=[];for(let S of y.touches)x(S)||v.push(S);let w=v.length,_=0;if(w){let S=b(v[0].clientX,v[0].clientY),C=Jt;Jt=h(S),p?xe=xe.add(Jt.subtract(C)):Y[0][_]=3}else p&&(Y[0][_]=Y[0][_]&2|4);p=w}return Fn&&y.cancelable&&document.hasFocus()&&y.preventDefault(),!0}}}function h(p){let d=B.getBoundingClientRect(),y=Bt(p.x,d.left,d.right),x=Bt(p.y,d.top,d.bottom);return b(y*B.width,x*B.height)}}function Ea(){if(z)return;!(yn&&ie)&&!document.hasFocus()&&ks(),De=Is(Jt),Tr=rc(xe),Rh(),t(),n();function n(){let e=cs(0)||cs(1)||cs(2)||xe.length()>Er,s=!1;for(let o=uc();o--&&!s;)s=gs(o).lengthSquared()>.04;for(let o=17;o--&&!s;)s=Ie(o);let i=!1;for(let o in Y[0])if(isNaN(+o)&&Y[0][o]&1){i=!0;break}s?Qe="gamepad":e?Qe="mouse":i&&(Qe="keyboard"),Bn=Qe==="gamepad"}function t(){var a,r,c,l,u,h,p;let e=d=>{let v=w=>w>.3?Bt(w,.3,.8):w<-.3?-Bt(-w,.3,.8):0;return b(v(d.x),v(-d.y)).clampLength()};if(an&&ie){if(f(!_n||!$n,"set touchGamepadLeftStick or touchGamepadLeftButtonCount, not both"),f(!Kn||!Yn,"set touchGamepadRightStick or touchGamepadButtonCount, not both"),!Vn.isSet())return;mt=0;let d=(a=ve[0])!=null?a:ve[0]=[],y=(r=pn[0])!=null?r:pn[0]=b();d.length=0,y.set();for(let v=0;v<2;v++){if(!We(v))continue;let w=Dr(v);d[w]=b();let _=(c=An[v])!=null?c:b();if(Ls)d[w]=e(_);else if(_.lengthSquared()>.3){let S=N($s(_.x),-1,1),C=N($s(_.y),-1,1);d[w]=b(S,-C).clampLength(),w||y.set(S,-C)}}let x=(l=Y[1])!=null?l:Y[1]=[];for(let v=12;v--;){let w=Ie(v,0);x[v]=oe[v]?w?1:3:w?4:0,ti&&x[v]===3&&(v===9||Ph(v))&&Pr(ti)}return}try{if(!Mi||!(navigator!=null&&navigator.getGamepads))return}catch{return}if(!jt&&!document.hasFocus())return;let s=8,i=navigator.getGamepads(),o=tt(s,i.length);for(let d=0;d>1]=e(b(y.axes[S],y.axes[S+1]));let _=!1;for(let S=y.buttons.length;S--;){let C=y.buttons[S],A=Ie(S,d);x[S]=C.pressed?A?1:3:A?4:0,C.pressed&&(!C.value||C.value>.9)&&(_=!0)}_&&(co[d]=!0,co[mt]||(mt=d)),y.mapping==="standard"&&w.set((Ie(15,d)&&1)-(Ie(14,d)&&1),(Ie(12,d)&&1)-(Ie(13,d)&&1)),yr&&(w.x||w.y)&&(v[0]=w.clampLength())}an&&Bn&&Vn.unset()}}function Ca(){if(!z){for(let n of Y)for(let t in n)n[t]&=1;Ar=0,Tr=b(),xe=b()}}function _h(){Ih()}function Rh(){if(Ye||!an||!ie||z||!document.body)return;let n=Ye=document.createElement("div");n.style.cssText="position:fixed;inset:0;z-index:50;pointer-events:none;opacity:0;touch-action:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none;transition:opacity .2s;box-sizing:border-box;padding:env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left)";let t=dc=document.createElement("div");t.style.cssText="position:relative;width:100%;height:100%;pointer-events:none",n.appendChild(t);let e=Lr=document.createElementNS(ai,"svg");e.style.cssText="position:absolute;inset:0;width:100%;height:100%;pointer-events:none;overflow:visible;fill:none;stroke:#fff;stroke-width:3",t.appendChild(e);let s=()=>{let i=document.createElement("div");return i.style.cssText="position:absolute;pointer-events:auto;touch-action:none",i.addEventListener("pointerdown",o=>Fh(o,i)),i.addEventListener("pointermove",o=>jh(o)),i.addEventListener("pointerup",o=>_a(o)),i.addEventListener("pointercancel",o=>_a(o)),t.appendChild(i),i};ys[0]=s(),ys[1]=s(),gn=s(),addEventListener("resize",()=>Wn=!0),document.body.appendChild(n),Wn=!0}function ki(){return dc.getBoundingClientRect()}function We(n){return n?Kn:_n}function Ln(n){return n?Yn:$n}function Or(n){return n?0:4}function Dr(n){return n&&_n?1:0}function qn(n){return We(n)||Ln(n)>0}function Ph(n){for(let t=0;t<2;t++){let e=Or(t);if(!We(t)&&n>=e&&no.style.cssText="position:absolute;pointer-events:auto;touch-action:none;"+a;if(Ae){for(let o of ys)o.style.display="none";fe?(i(gn,"inset:0"),gn.style.display=""):gn.style.display="none"}else{for(let a=0;a<2;a++){let r=ys[a],c=a?"right":"left";if(r.style.display=qn(a)?"":"none",ln){let l=qn(a?0:1)?"50%":"100%";i(r,`${c}:0;bottom:0;width:${l};height:60%`)}else i(r,`${c}:0;bottom:0;width:${3*s}px;height:${3*s}px`)}gn.style.display=fe?"":"none";let o=fe;i(gn,`left:50%;top:50%;width:${2*o}px;height:${2*o}px;transform:translate(-50%,-50%)`)}Oh(t,e),Wn=!1}function Oh(n,t){let e=Lr;for(;e.firstChild;)e.removeChild(e.firstChild);let s=fc={face:[],thumb:[]},i=qt,o=(r,c,l,u)=>{let h=document.createElementNS(ai,"circle");return h.setAttribute("cx",r),h.setAttribute("cy",c),h.setAttribute("r",l),u&&h.setAttribute("fill",u),e.appendChild(h),h},a=r=>{let c=i*.18,l=i*.5,u=r.x,h=r.y,p=document.createElementNS(ai,"path");p.setAttribute("d",`M ${u-c} ${h-l} H ${u+c} V ${h-c} H ${u+l} V ${h+c} H ${u+c} V ${h+l} H ${u-c} V ${h+c} H ${u-l} V ${h-c} H ${u-c} Z`),e.appendChild(p)};for(let r=0;r<2;r++){let c=Ln(r),l=Or(r),u=ze(r,n,t);if(We(r))Ls?o(u.x,u.y,i/2):a(u),s.thumb[r]=o(u.x,u.y,i/4,"#fff");else if(c===1)s.face[l]=o(u.x,u.y,i/2,"#000");else for(let h=0;h2?p:tt(p,c-1);d=d===3?2:d===2?3:d;let y=b().setDirection(p,i/2);c===2&&(y.x*=-1),r||(y.x*=-1);let x=u.add(y);s.face[l+d]=o(x.x,x.y,i/4,"#000")}}jt&&vn&&Dh(n,t)}function Dh(n,t){let e=qt,s=Lr,i=(a,r,c)=>{let l=document.createElementNS(ai,a);for(let u in r)l.setAttribute(u,r[u]);l.setAttribute("stroke",c),l.setAttribute("stroke-width",2),l.setAttribute("fill","none"),s.appendChild(l)},o=(a,r,c)=>i("circle",{cx:a.x,cy:a.y,r},c);i("line",{x1:n/2,y1:0,x2:n/2,y2:t},"#0f0");for(let a=0;a<2;a++)if(We(a))if(ln){let r=t*.4,c=!qn(a?0:1),l=c?0:a?n/2:0;i("rect",{x:l,y:r,width:c?n:n/2,height:t-r},"#0ff")}else o(ze(a,n,t),2*e,"#0ff");else Ln(a)>=1&&o(ze(a,n,t),e,"#0ff");if(fe){o(b(n/2,t/2),fe,"#ff0");for(let a=0;a<2;a++)qn(a)&&o(ze(a,n,t),2*e,"#f0f")}}function Ih(){var l;if(!Ye||z)return;if(!an||!ie){Ye.style.display!=="none"&&(Ye.style.display="none",Be.clear(),oe.length=0,An.length=0,Gs.length=0);return}Ye.style.display="";let n=jt&&vn,t=[Yn,$n,_n,Kn,Ls,qt,ln,fe,Ae,n].join();t!==Aa&&(Aa=t,Wn=!0),Wn&&Lh();let e=as?Bt(Vn.get(),as+1,as):1,s=n||Vn.isSet()&&e>0&&!Ae;if(Ye.style.opacity=s?n?1:e*br:0,!s)return;let i=ki(),o=i.width,a=i.height,r=qt,c=fc;if(c){for(let u=0;u<2;u++)if(We(u)&&c.thumb[u]){let p=ze(u,o,a).add(((l=An[u])!=null?l:b()).scale(r/2));c.thumb[u].setAttribute("cx",p.x),c.thumb[u].setAttribute("cy",p.y)}for(let u=0;u=qt)return-1;if(i===1)return o;let r=a.subtract(t);n||(r.x*=-1);let c=i===2?r.xo:r&&ze(a,t,e).distance(n)<2*s)return{role:"stick",side:a}}else if(Ln(a)>=1){let c=kh(a,n,t,e);if(c>=0)return{role:"face",btn:c}}}if(fe){for(let a=0;a<2;a++)if(qn(a)&&ze(a,t,e).distance(n)<2*s)return;if(b(t/2,e/2).distance(n)h.getChannelData(v).set(x)),p.buffer=h,p.playbackRate.value=e,p.loop=i,a=a||ft.createGain(),a.gain.value=t,a.connect(Je);let d=new StereoPannerNode(ft,{pan:N(s,-1,1)});p.connect(d).connect(a),p.addEventListener("ended",()=>{a.disconnect(),d.disconnect(),c&&c(p)});let y=r*e;return p.start(0,y),jt&&Jn&&xt("sound","vol",t.toFixed(2),"rate",e.toFixed(2),"pan",s.toFixed(2),i?"loop":""),p}function Jh(...n){return Ir([Gi(...n)])}function Gi(n=1,t=.05,e=220,s=0,i=0,o=.1,a=0,r=1,c=0,l=0,u=0,h=0,p=0,d=0,y=0,x=0,v=0,w=1,_=0,S=0,C=0){let A=Qn,T=X*2,P=c*=500*T/A/A,M=e*=(1+dt(t,-t))*T/A,pt=0,at=0,ct=0,yt=1,Nt,ge=[],Pt=0,ht=0,Lt=0,Pe,un=2,hn=T*nt(C)*2/A,ae=lt(hn),Le=st(hn)/2/un,te=1+Le,R=-2*ae/te,F=(1-Le)/te,k=(1+ne(C)*ae)/2/te,j=-(ne(C)+ae)/te,$=k,Z=0,Tt=0,At=0,Ot=0;for(s=s*A||9,_*=A,i*=A,o*=A,v*=A,l*=500*T/A**3,y*=T/A,u*=T/A,h*=A,p=p*A|0,Nt=s+_+i+o+v|0;ht1?a>2?a>3?a>4?Pt/T%14?Lt:ne(Lt)*nt(Lt)**r)*(htht?0:(hth&&(e+=u,M+=u,yt=0),p&&!(++at%p)&&(e=M,c=P,yt||(yt=1));return ge}function li(n,t=!0){for(let e of sn)if((!t||e.isSolid)&&n.arrayCheck(e.size)){let s=e.getCollisionData(n);if(s)return s}return 0}function $e(n,t=b(),e,s=!0){for(let i of sn)if((!s||i.isSolid)&&i.collisionTest(n,t,e))return i}function yc(n,t,e,s,i=!0){let o,a,r,c=s&&b();for(let l of sn)if(!i||l.isSolid){let u=l.collisionRaycast(n,t,e,c);if(u){let h=n.distanceSquared(u);(o===void 0||h{G=!1,et.style.display="none",e.preventDefault(),xt("WebGL context lost! Switching to Canvas2d rendering.");for(let s of ls)s.glTexture=void 0;Qt=void 0,Ct=0,En=!1,bn.forEach(s=>{var i;return(i=s.glContextLost)==null?void 0:i.call(s)})}),et.addEventListener("webglcontextrestored",()=>{G=!0,et.style.display="",xt("WebGL context restored, reinitializing..."),t();for(let e of ls)e.glTexture=ji(e.image,e.wrap);bn.forEach(e=>{var s;return(s=e.glContextRestored)==null?void 0:s.call(e)})});function t(){di=Xn(`#version 300 es
+`,o+=s.toString(),rn(o,Vt,24,z(),.05,void 0,"center","monospace")}{e.save(),e.fillStyle="#fff",e.textAlign="left",e.textBaseline="top",e.font="20px monospace",e.shadowColor="#000",e.shadowBlur=9;let a=9,r=0,c=24;if(Fe){e.fillText(`${Hs} v${Xs}`,a,r+=c/2),e.fillText("Time: "+ar(Zt),a,r+=c),e.fillText("FPS: "+Ys.toFixed(1)+(G?" WebGL":" Canvas2D"),a,r+=c),e.fillText("Objects: "+wt.length,a,r+=c),e.fillText("Draw Calls: "+Pe,a,r+=c),e.fillText("Primitives: "+Le,a,r+=c),e.fillText("---------",a,r+=c),e.fillStyle="#f00",e.fillText("ESC: Debug Overlay",a,r+=c),e.fillStyle=de?"#f00":"#fff",e.fillText("1: Debug Physics",a,r+=c),e.fillStyle=wn?"#f00":"#fff",e.fillText("2: Debug Particles",a,r+=c),e.fillStyle=Tn?"#f00":"#fff",e.fillText("3: Debug Gamepads",a,r+=c),e.fillStyle=fe?"#f00":"#fff",e.fillText("4: Debug Raycasts",a,r+=c),e.fillStyle="#fff",e.fillText("5: Save Screenshot",a,r+=c),e.fillText("6: Toggle Video Capture",a,r+=c),e.fillStyle=Vn?"#f00":"#fff",e.fillText("7: Debug Sound",a,r+=c);let l="",u="";for(let h in K[0])Dt(h,0)&&(parseInt(h)<3?u+=h+" ":l+=h+" ");u&&e.fillText("Mouse: "+u,a,r+=c),l&&e.fillText("Keys: "+l,a,r+=c);for(let h=1;hs.push(r.data),i.onstop=()=>{let r=new Blob(s,{type:"video/webm"}),c=URL.createObjectURL(r);fs(c,"capture.webm",1e3)};let o,a;if(Yt){a=new ConstantSourceNode(ft,{offset:0}),a.connect(We),a.start(),o=ft.createMediaStreamDestination(),We.connect(o);for(let r of o.stream.getAudioTracks())n.addTrack(r)}try{i.start()}catch{St("Video capture not supported in this browser!"),a==null||a.stop();return}St("Video capture started."),je={mediaRecorder:i,captureTimer:e,videoTrack:t,silentAudioSource:a,audioStreamDestination:o}}function Na(){var n,t,e;p(Ce(),"Not capturing video!"),St(`Video capture ended. ${je.captureTimer.get().toFixed(2)} seconds recorded.`),he.style.display="none",(n=je.silentAudioSource)==null||n.stop(),(t=je.mediaRecorder)==null||t.stop(),(e=je.videoTrack)==null||e.stop(),je=void 0}function Nl(){p(Ce(),"Not capturing video!"),wr(),je.videoTrack.requestFrame(),he.textContent="\u25CF REC "+ar(je.captureTimer)}function ee(n){if(Nt){let t=Object.keys(n),e={};t.forEach(s=>e[s]=n[s]),t.forEach(s=>{Object.defineProperty(n,s,{get:()=>e[s],set:i=>{p(!1,`Cannot modify engine constant. Attempted to set constant (${n}) property '${s}' to '${i}'.`)},enumerable:!0})})}return Object.freeze(n)}function oe(n,t=1){return(n%t+t)%t}function j(n,t=0,e=1){return ne?e:n}function Bt(n,t,e){return(e-=t)?j((n-t)/e):0}function Ht(n,t,e){return n+j(e)*(t-n)}function Bl(n,t,e,s,i){return Ht(s,i,Bt(n,t,e))}function ir(n,t,e=1){p(e>0,"distanceWrap wrapSize must be > 0");let s=(n-t)%e;return s*2%e-s}function Ua(n,t,e,s=1){return n+j(e)*ir(t,n,s)}function zl(n,t){return ir(n,t,2*Y)}function Jl(n,t,e){return Ua(n,t,e,2*Y)}function Ks(n){return n*n*(3-2*n)}function ds(n){return!(n&n-1)}function Ul(n){return 2**hs(za(n))}function Qs(n,t,e,s=b()){let i=(n.x-e.x)*2,o=(n.y-e.y)*2,a=t.x+s.x,r=t.y+s.y;return st(i)d)return!1;h=Q(y,h)}else{if(y0?r.x+1:r.x,x=h>0?r.y+1:r.y,v=c?(y-n.x)/c:1/0,w=l?(x-n.y)/l:1/0,_=0,S=v,C=w,A=dr.x&&(T.x=r.x+1-P),k.yr.y&&(T.y=r.y+1-P),s&&(A?s.set(-u,0):s.set(0,-h)),T}(A=SURL.revokeObjectURL(n),e)}function $l(n,t,e){var s;p(U(n),"shareURL requires title string"),p(U(t),"shareURL requires url string"),(s=navigator.share)==null||s.call(navigator,{title:n,url:t}).then(()=>e==null?void 0:e())}function Kl(n,t){p(U(n),"loadData requires saveName string");let e={};try{let s=localStorage[n];if(s)try{e=JSON.parse(s)}catch{St("readSaveData: corrupt JSON for",n,"\u2014 using defaults")}}catch{St("readSaveData: localStorage unavailable \u2014 using defaults")}return{...t,...e}}function Ql(n,t){p(U(n),"saveData requires saveName string");try{localStorage[n]=JSON.stringify(t)}catch{St("writeSaveData: failed to write",n)}}function yo(n){let t=(n|0)^2654435769;return t=Math.imul(t^t>>>16,2246822507),t=Math.imul(t^t>>>13,3266489909),t^=t>>>16,(t>>>0)/2**32}function Zl(n){let t=At(n);return Ht(yo(t),yo(t+1),Ks(n-t))}function tu(n,t){let e=At(n),s=At(t),i=Ks(n-e),o=Ks(t-s),a=(r,c)=>yo(r+c*374761393);return Ht(Ht(a(e,s),a(e+1,s),i),Ht(a(e,s+1),a(e+1,s+1),i),o)}function eu(n){Pt=n.copy()}function nu(n){tt=n}function su(n){H=n}function iu(n){cr=n}function ou(n){Pi=n}function ru(n){sn=n.copy()}function au(n){Gn=n.copy()}function cu(n){rs=n}function lu(n){Fn=n}function uu(n){jn=n.copy()}function nc(n){lr=n,F&&(F.style.imageRendering=n?"pixelated":""),nt&&(nt.style.imageRendering=n?"pixelated":"")}function hu(n){Cn=n}function du(n){on=n}function fu(n){Ps=n}function pu(n){ur=n}function gu(n){B=n}function yu(n){if(n&&!Ao){console.warn("Can not enable WebGL if it was disabled on start.");return}G=n,nt&&(nt.style.display=n?"":"none")}function mu(n){Ls=n}function bu(n){Li=n.copy()}function xu(n){Oi=n}function vu(n){Di=n}function Su(n){Ii=n}function wu(n){hr=n}function Tu(n){dr=n}function Au(n){fr=n}function Eu(n){pr=n}function Cu(n){gr=n}function _u(n){Be=n}function Ru(n){qt=n.copy()}function Pu(n){Zs=n}function Lu(n){Mi=n}function Ou(n){yr=n}function Du(n){as=n}function Iu(n){xn=n}function Mu(n){un=n}function ku(n){mr=n}function Gu(n){ge=n}function Fu(n){Kn=n,n>0&&(Zn=!1)}function ju(n){Ln=n,n&&(Qn=0)}function Nu(n){Qn=n,n>0&&(Ln=!1)}function Bu(n){Zn=n,n&&(Kn=0)}function zu(n){Os=n}function Ju(n){dn=n}function Uu(n){Xt=n}function Vu(n){br=n}function Wu(n){cs=n}function qu(n){ti=n}function Hu(n){Ds=n}function Xu(n){Yt=n}function Yu(n){An=n,Yt&&!B&&We&&(We.gain.value=n)}function $u(n){xr=n}function Ku(n){vr=n}function Qu(n){Ri=n}function Zu(n){Ga=n}function ei(n){return n.r>=1&&n.g>=1&&n.b>=1}function Sr(n){return n.r<=0&&n.g<=0&&n.b<=0&&n.a<=0}function Is(n=0,t=Li,e=0,s=Oi,i=Di){if(p(O(n)||typeof n=="number","index must be a vec2 or number"),p(O(t)||typeof t=="number","size must be a vec2 or number"),p(R(e)||e instanceof He,"texture must be a number or TextureInfo"),p(R(s),"padding must be a number"),B)return new Oe;typeof t=="number"&&(p(t>0),t=new ct(t,t));let o=typeof e=="number"?hn[e]:e;p(o instanceof He,"tile texture is not loaded"),p(o.size.x>0,"tile texture is not loaded");let a=t.x+s*2,r=t.y+s*2,c,l;if(typeof n=="number"){let h=o.size.x/a|0;c=n%h,l=n/h|0}else c=n.x,l=n.y;let u=new ct(c*a+s,l*r+s);return new Oe(u,t,o,s,i)}function It(n,t=b(1),e,s=V,i=0,o,a,r=G,c=!1,l){var d;p(O(n),"pos must be a vec2"),p(O(t),"size must be a vec2"),p(J(s),"color is invalid"),p(R(i),"angle must be a number"),p(!a||J(a),"additiveColor must be a color"),p(!l||!r,"context only supported in canvas 2D mode");let u=e==null?void 0:e.textureInfo,h=(d=e==null?void 0:e.bleed)!=null?d:0;if(r&&G)if(p(!!g,"WebGL is not enabled!"),c&&([n,t,i]=ks(n,t,i)),u){let f=u.sizeInverse,y=e.pos.x*f.x,x=e.pos.y*f.y,v=e.size.x*f.x,w=e.size.y*f.y;if(Fr(u.glTexture),h){let _=f.x*h,S=f.y*h;As(n.x,n.y,o?-t.x:t.x,t.y,i,y+_,x+S,y-_+v,x-S+w,s.rgbaInt(),a&&a.rgbaInt())}else As(n.x,n.y,o?-t.x:t.x,t.y,i,y,x,y+v,x+w,s.rgbaInt(),a&&a.rgbaInt())}else{let f=a?s.add(a):s;Tc(n.x,n.y,t.x,t.y,i,f.rgbaInt())}else++Pe,++Le,On(n,t,i,o,f=>{if(u){f.scale(1,-1);let y=e.pos.x,x=e.pos.y,v=e.size.x,w=e.size.y;lh(f,u.image,y,x,v,w,-.5,-.5,1,1,s,a,h)}else{let y=a?s.add(a):s;f.fillStyle=y.toString(),f.fillRect(-.5,-.5,1,1)}},c,l)}function ni(n,t,e,s,i,o,a){It(n,t,void 0,e,s,!1,void 0,i,o,a)}function th(n,t,e=V,s=ln,i=0,o=G,a=!1,r){if(p(O(n),"pos must be a vec2"),p(O(t),"size must be a vec2"),p(J(e)&&J(s),"color is invalid"),p(R(i),"angle must be a number"),p(!r||!o,"context only supported in canvas 2D mode"),o&&G){p(!!g,"WebGL is not enabled!"),a&&(n=Ms(n),t=t.scale(1/H),i+=tt);let c=[],l=[],u=t.x/2,h=t.y/2,d=e.rgbaInt(),f=s.rgbaInt(),y=lt(-i),x=it(-i);for(let v=4;v--;){let w=v&1?u:-u,_=v&2?h:-h,S=w*y-_*x,C=w*x+_*y,A=v&2?d:f;c.push(b(n.x+S,n.y+C)),l.push(A)}Jr(c,l)}else++Pe,++Le,On(n,t,i,!1,c=>{let l=c.createLinearGradient(0,.5,0,-.5);l.addColorStop(0,e.toString()),l.addColorStop(1,s.toString()),c.fillStyle=l,c.fillRect(-.5,-.5,1,1)},a,r)}function eh(n,t,e,s=0,i=V,o=0,a,r=G,c=!1,l){if(p(O(n),"pos must be a vec2"),p(O(t),"size must be a vec2"),p(O(e),"wrapCount must be a vec2"),p(J(i),"color is invalid"),p(R(o),"angle must be a number"),p(!a||J(a),"additiveColor must be a color"),p(!l||!r,"context only supported in canvas 2D mode"),p(!(s instanceof Oe),"pass a TextureInfo or texture index, not a TileInfo \u2014 use tileInfo.textureInfo"),B)return;let u=typeof s=="number"?hn[s]:s;if(p(u instanceof He,"texture not loaded"),p(u.size.x>0,"texture not loaded"),p(u.wrap,"drawTextureWrapped requires a wrap-enabled texture; call textureInfo.setWrap(true) first"),r&&G){p(!!g,"WebGL is not enabled!"),c&&([n,t,o]=ks(n,t,o)),Fr(u.glTexture),As(n.x,n.y,t.x,t.y,o,0,0,e.x,e.y,i.rgbaInt(),a&&a.rgbaInt());return}++Pe,++Le,c||(n=Dn(n),t=t.scale(H),o-=tt);let h=!Pi||(a?ei(i.add(a))&&a.a<=0:ei(i)),d=!h&&a&&!Sr(a),f=h?u.image:ch(u.image,i,a);l=l||_t,l.save(),l.translate(n.x+.5,n.y+.5),l.rotate(o),l.globalAlpha=d?1:i.a;let y=l.createPattern(f,"repeat"),x=new DOMMatrix().translate(-t.x/2,-t.y/2).scale(t.x/(e.x*f.width),t.y/(e.y*f.height));y.setTransform(x),l.fillStyle=y,l.fillRect(-t.x/2,-t.y/2,t.x,t.y),l.globalAlpha=1,l.restore()}function mo(n,t=.1,e=V,s=!1,i=b(),o=0,a=G,r=!1,c){if(p(pe(n),"points must be an array"),p(R(t),"width must be a number"),p(J(e),"color is invalid"),p(O(i),"pos must be a vec2"),p(R(o),"angle must be a number"),p(!c||!a,"context only supported in canvas 2D mode"),a&&G){p(!!g,"WebGL is not enabled!");let l=b(1);r&&([i,l,o]=ks(i,l,o)),zr(n,e.rgbaInt(),t,i.x,i.y,l.x,l.y,o,s)}else++Pe,++Le,On(i,b(1),o,!1,l=>{l.strokeStyle=e.toString(),l.lineWidth=t,l.beginPath();for(let u=0;u0&&zr(n,s.rgbaInt(),e,i.x,i.y,l.x,l.y,o)}else On(i,b(1),o,!1,l=>{l.fillStyle=t.toString(),l.beginPath();for(let u of n)l.lineTo(u.x,u.y);l.closePath(),l.fill(),e&&(l.strokeStyle=s.toString(),l.lineWidth=e,l.stroke())},r,c)}function ic(n,t=b(1),e=V,s=0,i=0,o=ot,a=G,r=!1,c){p(O(n),"pos must be a vec2"),p(O(t),"size must be a vec2"),p(J(e)&&J(o),"color is invalid"),p(R(s),"angle must be a number"),p(R(i),"lineWidth must be a number"),p(i>=0,"lineWidth must be a positive value or 0"),p(!c||!a,"context only supported in canvas 2D mode"),i=j(i,0,et(t.x,t.y)),a&&G?sc(n,t,Ls,e,i,o,s,a,r,c):On(n,b(1),s,!1,l=>{l.fillStyle=e.toString(),l.beginPath(),l.ellipse(0,0,t.x/2,t.y/2,0,0,9),l.fill(),i&&(l.strokeStyle=o.toString(),l.lineWidth=i,l.stroke())},r,c)}function si(n,t=1,e=V,s=0,i=ot,o=G,a=!1,r){p(R(t),"size must be a number"),ic(n,b(t),e,0,s,i,o,a,r)}function oc(n,t=b(1),e=V,s=ln,i=0,o=G,a=!1,r){if(p(O(n),"pos must be a vec2"),p(O(t),"size must be a vec2"),p(J(e)&&J(s),"color is invalid"),p(R(i),"angle must be a number"),p(!r||!o,"context only supported in canvas 2D mode"),!B)if(o&&G){p(!!g,"WebGL is not enabled!"),a&&(n=Ms(n),t=t.scale(1/H),i+=tt);let c=Ls,l=t.x/2,u=t.y/2,h=e.rgbaInt(),d=s.rgbaInt(),f=nh++,y=lt(-i),x=it(-i),v=C=>{let A=it(C)*l,T=lt(C)*u;return b(n.x+A*y-T*x,n.y+A*x+T*y)},w=f%c/c*Y*2,_=[v(w)],S=[d];for(let C=c;C--;){let A=(C+f)%c/c*Y*2;_.push(n),S.push(h),_.push(v(A)),S.push(d)}Jr(_,S)}else++Pe,++Le,On(n,t,i,!1,c=>{let l=c.createRadialGradient(0,0,0,0,0,.5);l.addColorStop(0,e.toString()),l.addColorStop(1,s.toString()),c.fillStyle=l,c.beginPath(),c.ellipse(0,0,.5,.5,0,0,9),c.fill()},a,r)}function sh(n,t=1,e=V,s=ln,i=G,o=!1,a){p(R(t),"size must be a number"),oc(n,b(t),e,s,0,i,o,a)}function On(n,t,e=0,s=!1,i,o=!1,a=_t){p(O(n),"pos must be a vec2"),p(O(t),"size must be a vec2"),p(R(e),"angle must be a number"),p(typeof i=="function","drawFunction must be a function"),o||(n=Dn(n),t=t.scale(H),e-=tt),a.save(),a.translate(n.x+.5,n.y+.5),a.rotate(e),a.scale(s?-t.x:t.x,-t.y),i(a),a.restore()}function ih(n,t,e=1,s=V,i=0,o=ot,a="center",r=Ps,c="",l,u=0,h=_t){t=Dn(t),e*=H,i*=H,u-=tt,u*=-1,rn(n,t,e,s,i,o,a,r,c,l,u,h)}function rn(n,t,e,s=V,i=0,o=ot,a="center",r=Ps,c="",l,u=0,h=_t){p(U(n),"text must be a string"),p(O(t),"pos must be a vec2"),p(R(e),"size must be a number"),p(J(s),"color must be a color"),p(R(i),"lineWidth must be a number"),p(J(o),"lineColor must be a color"),p(["left","center","right"].includes(a),"align must be left, center, or right"),p(U(r),"font must be a string"),p(U(c),"fontStyle must be a string"),p(R(u),"angle must be a number");let d=(n+"").split(`
+`),f=t.y-(d.length-1)*e/2;h.save(),h.fillStyle=s.toString(),h.strokeStyle=o.toString(),h.lineWidth=i,h.textAlign=a,h.font=c+" "+e+"px "+r,h.textBaseline="middle",h.translate(t.x,f),h.rotate(-u);let y=0;d.forEach(x=>{i&&h.strokeText(x,0,y,l),h.fillText(x,0,y,l),y+=e}),h.restore()}async function Ta(n,t){p(R(n),"textureIndex must be a number"),p(!hn[n],"textureIndex is already loaded!"),p(!t||U(t),"image src must be a string");let e=new Image;t&&await new Promise(s=>{e.onerror=e.onload=s,e.crossOrigin="anonymous",e.src=t}),hn[n]=new He(e)}function Ms(n){p(O(n),"screenPos must be a vec2");let t=(n.x-I.x/2+.5)/H,e=(n.y-I.y/2+.5)/-H;if(tt){let s=lt(-tt),i=it(-tt),o=t*s-e*i,a=t*i+e*s;t=o,e=a}return new ct(t+Pt.x,e+Pt.y)}function Dn(n){p(O(n),"worldPos must be a vec2");let t=n.x-Pt.x,e=n.y-Pt.y;if(tt){let s=lt(tt),i=it(tt),o=t*s-e*i,a=t*i+e*s;t=o,e=a}return new ct(t*H+I.x/2-.5,e*-H+I.y/2-.5)}function rc(n){p(O(n),"screenDelta must be a vec2");let t=n.x/H,e=n.y/-H;if(tt){let s=lt(-tt),i=it(-tt),o=t*s-e*i,a=t*i+e*s;t=o,e=a}return new ct(t,e)}function oh(n){p(O(n),"worldDelta must be a vec2");let t=n.x,e=n.y;if(tt){let s=lt(tt),i=it(tt),o=t*s-e*i,a=t*i+e*s;t=o,e=a}return new ct(t*H,e*-H)}function ks(n,t,e=0){return p(O(n),"screenPos must be a vec2"),p(O(t),"screenSize must be a vec2"),p(R(e),"screenAngle must be a number"),[Ms(n),t.scale(1/H),e+tt]}function ac(){return I.scale(1/H)}function rh(n,t,e,s){p(O(n),"center must be a vec2"),p(O(t),"size must be a vec2");let i=d(e),o=d(s),a=t.x+i.left+i.right,r=t.y+i.top+i.bottom,c=I.x-o.left-o.right,l=I.y-o.top-o.bottom;if(!(a>0&&r>0&&c>0&&l>0))return H;H=et(c/a,l/r);let u=b(i.right-i.left,i.top-i.bottom).scale(.5),h=b(o.right-o.left,o.top-o.bottom).scale(.5/H);return Pt=n.add(u).add(h),H;function d(f){return(f===void 0||R(f))&&(f=b(f)),O(f)?{top:f.y,right:f.x,bottom:f.y,left:f.x}:{top:f.top||0,right:f.right||0,bottom:f.bottom||0,left:f.left||0}}}function ah(n,t=0){if(p(O(n),"pos must be a vec2"),p(O(t)||R(t),"size must be a vec2 or number"),!H)return!1;let e=n.x-Pt.x,s=n.y-Pt.y;if(tt){let a=lt(tt),r=it(tt),c=e*a-s*r,l=e*r+s*a;e=c,s=l}e*=H*2,s*=-H*2,t instanceof ct&&(t=t.length()),t*=H;let i=I.x,o=I.y;return e+t>-i&&e-t-o&&s-t{n.onerror=n.onload=r,n.crossOrigin="anonymous",n.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAAeAQMAAABnrVXaAAAABlBMVEUAAAD///+l2Z/dAAAAAXRSTlMAQObYZgAAAjpJREFUOMu9kzFu2zAUhn+CAROgqrk+B2l0BWYxMjlXeYaAtFtbdA1sGgHqRQfI0CNkSG5AwYB0BQ8d5Bsomwah6CPVeGg6tEPzAxLwyI+P78cP4u9lNO9OoMKnLMOobG5020/yaj/MrRcCGh1gBbyiLTPJEYaIiom5KM9Jq7KgynMGtb6L4GL4MF2H4LQKCXTvDVw2I4MsgZT7QLExdiutH+D08VOP3INXRrWX1/mmpbkNgAPYRVANb4xpcegYvhiNbIXauQICEjBuYLfMakaakWQeXxiZ0VDtuJCKs3ztMV59QtsHJNcRxDzfdL21ty3PrfIcXTN+E+GFAv6T5nbT9jd50/WFxb5ksdAv49qS6ouymG66ji08UMT6moykYLAo+V0j23GN4m829ZySAD5K7QsBfQTvOG8eE+gTeGYRAmnNAubN3hf5Zv9tJWDHp/VTuaSm7SN4fyINQqaNO3RMVxvpSPXnOChnRNvFcGY0gnwiPswYwTKVPE0zVtX3mTEIOoFzaqLrGuJaV+Uqumb71fVk/VoOH3cdLNQP/FHi8hV0CQNoqBZsUPlLPMsdCJro9QAaQQ0woDy9BJm0eTxCFnO9srcYlhNVlfR2EyTrph1uUtbUtAJifwRgrKuYdXVHeb0YI3QpawohQHkloI3J5FuVwI5ORxC9k2Tuz9Ir1IjgeIPGMHYkAZe2RuYkmWFmt3gGbTPOmBUWVTmRmHtGrfpzG/yuQNOKa6gBB/WA9khitPgl6/GP+gl2Af6tCbvaygAAAABJRU5ErkJggg=="});let t=b(),e=b(8),s=1,i=0,o=new He(n),a=new Oe(t,e,o,s,i);lc=new ii(a)}function fh(n=!0){Nn=n}function ph(n){Er=n}function gh(){return en==="mouse"}function yh(){return en==="keyboard"}function mh(){return en==="gamepad"}function Cr(n,t=0,e=!0,s=!0,i=!0){K[t]&&(K[t][n]&=~((e?1:0)|(s?2:0)|(i?4:0)))}function Gs(){K.length=0,K[0]=[],ae.length=0,_n.length=0,Fs.length=0,Te.length=0,mn.length=0}function Dt(n,t=0){var e;return p(U(n),"key must be a number or string"),p(t>0||typeof n!="number"||n<3,"use code string for keyboard"),!!(((e=K[t])==null?void 0:e[n])&1)}function Ft(n,t=0){var e;return p(U(n),"key must be a number or string"),p(t>0||typeof n!="number"||n<3,"use code string for keyboard"),!!(((e=K[t])==null?void 0:e[n])&2)}function _r(n,t=0){var e;return p(U(n),"key must be a number or string"),p(t>0||typeof n!="number"||n<3,"use code string for keyboard"),!!(((e=K[t])==null?void 0:e[n])&4)}function bh(n="ArrowUp",t="ArrowDown",e="ArrowLeft",s="ArrowRight"){p(U(n),"up key must be a string"),p(U(t),"down key must be a string"),p(U(e),"left key must be a string"),p(U(s),"right key must be a string");let i=o=>Dt(o)?1:0;return b(i(s)-i(e),i(n)-i(t))}function ls(n){return p(R(n),"mouse button must be a number"),Dt(n)}function gs(n){return p(R(n),"mouse button must be a number"),Ft(n)}function xh(n){return p(R(n),"mouse button must be a number"),_r(n)}function Ge(n,t=bt){return p(R(n),"button must be a number"),p(R(t),"gamepad must be a number"),Dt(n,t+1)}function Rr(n,t=bt){return p(R(n),"button must be a number"),p(R(t),"gamepad must be a number"),Ft(n,t+1)}function vh(n,t=bt){return p(R(n),"button must be a number"),p(R(t),"gamepad must be a number"),_r(n,t+1)}function ys(n,t=bt){var e,s;return p(R(n),"stick must be a number"),p(R(t),"gamepad must be a number"),(s=(e=Te[t])==null?void 0:e[n])!=null?s:b()}function bo(n=bt){var t;return p(R(n),"gamepad must be a number"),(t=mn[n])!=null?t:b()}function xo(n=bt){return p(R(n),"gamepad must be a number"),!!K[n+1]}function uc(n=bt){var t,e;return p(R(n),"gamepad must be a number"),(e=(t=Te[n])==null?void 0:t.length)!=null?e:0}function Sh(n=bt,t=200,e=1,s=1,i=0){var a,r,c;if(p(R(n),"gamepad must be a number"),!Ds||B)return;let o=(a=navigator==null?void 0:navigator.getGamepads)==null?void 0:a.call(navigator)[n];(c=(r=o==null?void 0:o.vibrationActuator)==null?void 0:r.playEffect)==null||c.call(r,"dual-rumble",{duration:t,strongMagnitude:e,weakMagnitude:s,startDelay:i})}function wh(n=bt){var e,s,i;if(p(R(n),"gamepad must be a number"),!Ds||B)return;let t=(e=navigator==null?void 0:navigator.getGamepads)==null?void 0:e.call(navigator)[n];(i=(s=t==null?void 0:t.vibrationActuator)==null?void 0:s.reset)==null||i.call(s)}function Pr(n=100){var t;p(R(n)||pe(n),"pattern must be a number or array"),Ds&&!B&&((t=navigator==null?void 0:navigator.vibrate)==null||t.call(navigator,n))}function Th(){Pr(0)}function Ah(){var n;!re&&((n=F.requestPointerLock)==null||n.call(F))}function Eh(){var n;(n=document.exitPointerLock)==null||n.call(document)}function hc(){return document.pointerLockElement===F}function Ch(){if(B)return;document.addEventListener("keydown",n),document.addEventListener("keyup",t),document.addEventListener("mousedown",s),document.addEventListener("mouseup",i),document.addEventListener("mousemove",o),document.addEventListener("mouseleave",a),document.addEventListener("wheel",r,{passive:!1}),document.addEventListener("contextmenu",c),document.addEventListener("blur",l),re&&xn&&u();function n(d){if(d.repeat||(K[0][d.code]=3,as&&(K[0][e(d.code)]=3)),!Nn||!d.cancelable||!document.hasFocus()||d.ctrlKey||d.metaKey||d.altKey||x(d.target)||x(document.activeElement))return;let f=typeof d.key=="string"&&d.key.length===1;(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Space","Tab","Backspace"].includes(d.code)||f)&&d.preventDefault();function x(v){let w=v==null?void 0:v.tagName;return(v==null?void 0:v.isContentEditable)||["INPUT","TEXTAREA","SELECT"].includes(w)}}function t(d){K[0][d.code]=K[0][d.code]&2|4,as&&(K[0][e(d.code)]=4)}function e(d){return as?d==="KeyW"?"ArrowUp":d==="KeyS"?"ArrowDown":d==="KeyA"?"ArrowLeft":d==="KeyD"?"ArrowRight":d:d}function s(d){if(re&&xn)return;Yt&&!B&&ft&&!bs()&&ft.resume(),K[0][d.button]=3;let f=Vt;Vt=h(b(d.x,d.y)),we=we.add(Vt.subtract(f)),Nn&&d.cancelable&&document.hasFocus()&&d.preventDefault()}function i(d){re&&xn||(K[0][d.button]=K[0][d.button]&2|4)}function o(d){oi=!0;let f=Vt;Vt=h(b(d.x,d.y));let y=hc()?b(d.movementX,d.movementY):Vt.subtract(f);we=we.add(y)}function a(){oi=!1}function r(d){d.ctrlKey||(Ar+=ie(d.deltaY)),Nn&&d.cancelable&&document.hasFocus()&&d.preventDefault()}function c(d){d.preventDefault()}function l(){Gs(),Je.clear(),ae.length=0,_n.length=0,Fs.length=0}function u(){document.addEventListener("touchstart",y=>f(y),{passive:!1}),document.addEventListener("touchmove",y=>f(y),{passive:!1}),document.addEventListener("touchend",y=>f(y),{passive:!1});let d;function f(y){if(xn){if(Yt&&!B&&ft&&!bs()&&ft.resume(),!un||mr){let x=S=>ms.includes(S.target)||S.target===bn,v=[];for(let S of y.touches)x(S)||v.push(S);let w=v.length,_=0;if(w){let S=b(v[0].clientX,v[0].clientY),C=Vt;Vt=h(S),d?we=we.add(Vt.subtract(C)):K[0][_]=3}else d&&(K[0][_]=K[0][_]&2|4);d=w}return Nn&&y.cancelable&&document.hasFocus()&&y.preventDefault(),!0}}}function h(d){let f=F.getBoundingClientRect(),y=Bt(d.x,f.left,f.right),x=Bt(d.y,f.top,f.bottom);return b(y*F.width,x*F.height)}}function Ea(){if(B)return;!(xn&&re)&&!document.hasFocus()&&Gs(),ke=Ms(Vt),Tr=rc(we),Rh(),t(),n();function n(){let e=ls(0)||ls(1)||ls(2)||we.length()>Er,s=!1;for(let o=uc();o--&&!s;)s=ys(o).lengthSquared()>.04;for(let o=17;o--&&!s;)s=Ge(o);let i=!1;for(let o in K[0])if(isNaN(+o)&&K[0][o]&1){i=!0;break}s?en="gamepad":e?en="mouse":i&&(en="keyboard"),zn=en==="gamepad"}function t(){var a,r,c,l,u,h,d;let e=f=>{let v=w=>w>.3?Bt(w,.3,.8):w<-.3?-Bt(-w,.3,.8):0;return b(v(f.x),v(-f.y)).clampLength()};if(un&&re){if(p(!Ln||!Qn,"set touchGamepadLeftStick or touchGamepadLeftButtonCount, not both"),p(!Zn||!Kn,"set touchGamepadRightStick or touchGamepadButtonCount, not both"),!qn.isSet())return;bt=0;let f=(a=Te[0])!=null?a:Te[0]=[],y=(r=mn[0])!=null?r:mn[0]=b();f.length=0,y.set();for(let v=0;v<2;v++){if(!Xe(v))continue;let w=Dr(v);f[w]=b();let _=(c=_n[v])!=null?c:b();if(Os)f[w]=e(_);else if(_.lengthSquared()>.3){let S=j($s(_.x),-1,1),C=j($s(_.y),-1,1);f[w]=b(S,-C).clampLength(),w||y.set(S,-C)}}let x=(l=K[1])!=null?l:K[1]=[];for(let v=12;v--;){let w=Ge(v,0);x[v]=ae[v]?w?1:3:w?4:0,ti&&x[v]===3&&(v===9||Ph(v))&&Pr(ti)}return}try{if(!Mi||!(navigator!=null&&navigator.getGamepads))return}catch{return}if(!Nt&&!document.hasFocus())return;let s=8,i=navigator.getGamepads(),o=et(s,i.length);for(let f=0;f>1]=e(b(y.axes[S],y.axes[S+1]));let _=!1;for(let S=y.buttons.length;S--;){let C=y.buttons[S],A=Ge(S,f);x[S]=C.pressed?A?1:3:A?4:0,C.pressed&&(!C.value||C.value>.9)&&(_=!0)}_&&(co[f]=!0,co[bt]||(bt=f)),y.mapping==="standard"&&w.set((Ge(15,f)&&1)-(Ge(14,f)&&1),(Ge(12,f)&&1)-(Ge(13,f)&&1)),yr&&(w.x||w.y)&&(v[0]=w.clampLength())}un&&zn&&qn.unset()}}function Ca(){if(!B){for(let n of K)for(let t in n)n[t]&=1;Ar=0,Tr=b(),we=b()}}function _h(){Ih()}function Rh(){if(Qe||!un||!re||B||!document.body)return;let n=Qe=document.createElement("div");n.style.cssText="position:fixed;inset:0;z-index:50;pointer-events:none;opacity:0;touch-action:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none;transition:opacity .2s;box-sizing:border-box;padding:env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left)";let t=dc=document.createElement("div");t.style.cssText="position:relative;width:100%;height:100%;pointer-events:none",n.appendChild(t);let e=Lr=document.createElementNS(ai,"svg");e.style.cssText="position:absolute;inset:0;width:100%;height:100%;pointer-events:none;overflow:visible;fill:none;stroke:#fff;stroke-width:3",t.appendChild(e);let s=()=>{let i=document.createElement("div");return i.style.cssText="position:absolute;pointer-events:auto;touch-action:none",i.addEventListener("pointerdown",o=>Fh(o,i)),i.addEventListener("pointermove",o=>jh(o)),i.addEventListener("pointerup",o=>_a(o)),i.addEventListener("pointercancel",o=>_a(o)),t.appendChild(i),i};ms[0]=s(),ms[1]=s(),bn=s(),addEventListener("resize",()=>Hn=!0),document.body.appendChild(n),Hn=!0}function ki(){return dc.getBoundingClientRect()}function Xe(n){return n?Zn:Ln}function In(n){return n?Kn:Qn}function Or(n){return n?0:4}function Dr(n){return n&&Ln?1:0}function Xn(n){return Xe(n)||In(n)>0}function Ph(n){for(let t=0;t<2;t++){let e=Or(t);if(!Xe(t)&&n>=e&&no.style.cssText="position:absolute;pointer-events:auto;touch-action:none;"+a;if(_e){for(let o of ms)o.style.display="none";ge?(i(bn,"inset:0"),bn.style.display=""):bn.style.display="none"}else{for(let a=0;a<2;a++){let r=ms[a],c=a?"right":"left";if(r.style.display=Xn(a)?"":"none",dn){let l=Xn(a?0:1)?"50%":"100%";i(r,`${c}:0;bottom:0;width:${l};height:60%`)}else i(r,`${c}:0;bottom:0;width:${3*s}px;height:${3*s}px`)}bn.style.display=ge?"":"none";let o=ge;i(bn,`left:50%;top:50%;width:${2*o}px;height:${2*o}px;transform:translate(-50%,-50%)`)}Oh(t,e),Hn=!1}function Oh(n,t){let e=Lr;for(;e.firstChild;)e.removeChild(e.firstChild);let s=fc={face:[],thumb:[]},i=Xt,o=(r,c,l,u)=>{let h=document.createElementNS(ai,"circle");return h.setAttribute("cx",r),h.setAttribute("cy",c),h.setAttribute("r",l),u&&h.setAttribute("fill",u),e.appendChild(h),h},a=r=>{let c=i*.18,l=i*.5,u=r.x,h=r.y,d=document.createElementNS(ai,"path");d.setAttribute("d",`M ${u-c} ${h-l} H ${u+c} V ${h-c} H ${u+l} V ${h+c} H ${u+c} V ${h+l} H ${u-c} V ${h+c} H ${u-l} V ${h-c} H ${u-c} Z`),e.appendChild(d)};for(let r=0;r<2;r++){let c=In(r),l=Or(r),u=Ve(r,n,t);if(Xe(r))Os?o(u.x,u.y,i/2):a(u),s.thumb[r]=o(u.x,u.y,i/4,"#fff");else if(c===1)s.face[l]=o(u.x,u.y,i/2,"#000");else for(let h=0;h2?d:et(d,c-1);f=f===3?2:f===2?3:f;let y=b().setDirection(d,i/2);c===2&&(y.x*=-1),r||(y.x*=-1);let x=u.add(y);s.face[l+f]=o(x.x,x.y,i/4,"#000")}}Nt&&Tn&&Dh(n,t)}function Dh(n,t){let e=Xt,s=Lr,i=(a,r,c)=>{let l=document.createElementNS(ai,a);for(let u in r)l.setAttribute(u,r[u]);l.setAttribute("stroke",c),l.setAttribute("stroke-width",2),l.setAttribute("fill","none"),s.appendChild(l)},o=(a,r,c)=>i("circle",{cx:a.x,cy:a.y,r},c);i("line",{x1:n/2,y1:0,x2:n/2,y2:t},"#0f0");for(let a=0;a<2;a++)if(Xe(a))if(dn){let r=t*.4,c=!Xn(a?0:1),l=c?0:a?n/2:0;i("rect",{x:l,y:r,width:c?n:n/2,height:t-r},"#0ff")}else o(Ve(a,n,t),2*e,"#0ff");else In(a)>=1&&o(Ve(a,n,t),e,"#0ff");if(ge){o(b(n/2,t/2),ge,"#ff0");for(let a=0;a<2;a++)Xn(a)&&o(Ve(a,n,t),2*e,"#f0f")}}function Ih(){var l;if(!Qe||B)return;if(!un||!re){Qe.style.display!=="none"&&(Qe.style.display="none",Je.clear(),ae.length=0,_n.length=0,Fs.length=0);return}Qe.style.display="";let n=Nt&&Tn,t=[Kn,Qn,Ln,Zn,Os,Xt,dn,ge,_e,n].join();t!==Aa&&(Aa=t,Hn=!0),Hn&&Lh();let e=cs?Bt(qn.get(),cs+1,cs):1,s=n||qn.isSet()&&e>0&&!_e;if(Qe.style.opacity=s?n?1:e*br:0,!s)return;let i=ki(),o=i.width,a=i.height,r=Xt,c=fc;if(c){for(let u=0;u<2;u++)if(Xe(u)&&c.thumb[u]){let d=Ve(u,o,a).add(((l=_n[u])!=null?l:b()).scale(r/2));c.thumb[u].setAttribute("cx",d.x),c.thumb[u].setAttribute("cy",d.y)}for(let u=0;u=Xt)return-1;if(i===1)return o;let r=a.subtract(t);n||(r.x*=-1);let c=i===2?r.xo:r&&Ve(a,t,e).distance(n)<2*s)return{role:"stick",side:a}}else if(In(a)>=1){let c=kh(a,n,t,e);if(c>=0)return{role:"face",btn:c}}}if(ge){for(let a=0;a<2;a++)if(Xn(a)&&Ve(a,t,e).distance(n)<2*s)return;if(b(t/2,e/2).distance(n)h.getChannelData(v).set(x)),d.buffer=h,d.playbackRate.value=e,d.loop=i,a=a||ft.createGain(),a.gain.value=t,a.connect(We);let f=new StereoPannerNode(ft,{pan:j(s,-1,1)});d.connect(f).connect(a),d.addEventListener("ended",()=>{a.disconnect(),f.disconnect(),c&&c(d)});let y=r*e;return d.start(0,y),Nt&&Vn&&St("sound","vol",t.toFixed(2),"rate",e.toFixed(2),"pan",s.toFixed(2),i?"loop":""),d}function Jh(...n){return Ir([Gi(...n)])}function Gi(n=1,t=.05,e=220,s=0,i=0,o=.1,a=0,r=1,c=0,l=0,u=0,h=0,d=0,f=0,y=0,x=0,v=0,w=1,_=0,S=0,C=0){let A=ts,T=Y*2,P=c*=500*T/A/A,k=e*=(1+dt(t,-t))*T/A,pt=0,W=0,$=0,gt=1,zt,me=[],Jt=0,rt=0,Tt=0,be,fn=2,pn=T*st(C)*2/A,le=lt(pn),De=it(pn)/2/fn,ne=1+De,L=-2*le/ne,X=(1-De)/ne,N=(1+ie(C)*le)/2/ne,yt=-(ie(C)+le)/ne,vt=N,Mt=0,M=0,Z=0,Ct=0;for(s=s*A||9,_*=A,i*=A,o*=A,v*=A,l*=500*T/A**3,y*=T/A,u*=T/A,h*=A,d=d*A|0,zt=s+_+i+o+v|0;rt1?a>2?a>3?a>4?Jt/T%14?Tt:ie(Tt)*st(Tt)**r)*(rtrt?0:(rth&&(e+=u,k+=u,gt=0),d&&!(++W%d)&&(e=k,c=P,gt||(gt=1));return me}function li(n,t=!0){for(let e of an)if((!t||e.isSolid)&&n.arrayCheck(e.size)){let s=e.getCollisionData(n);if(s)return s}return 0}function Ze(n,t=b(),e,s=!0){for(let i of an)if((!s||i.isSolid)&&i.collisionTest(n,t,e))return i}function yc(n,t,e,s,i=!0){let o,a,r,c=s&&b();for(let l of an)if(!i||l.isSolid){let u=l.collisionRaycast(n,t,e,c);if(u){let h=n.distanceSquared(u);(o===void 0||h{G=!1,nt.style.display="none",e.preventDefault(),St("WebGL context lost! Switching to Canvas2d rendering.");for(let s of us)s.glTexture=void 0;te=void 0,Rt=0,Rn=!1,Sn.forEach(s=>{var i;return(i=s.glContextLost)==null?void 0:i.call(s)})}),nt.addEventListener("webglcontextrestored",()=>{G=!0,nt.style.display="",St("WebGL context restored, reinitializing..."),t();for(let e of us)e.glTexture=ji(e.image,e.wrap);Sn.forEach(e=>{var s;return(s=e.glContextRestored)==null?void 0:s.call(e)})});function t(){di=$n(`#version 300 es
 precision highp float;uniform mat4 m;in vec2 g;in vec4 p,u,c,a;in float r;out vec2 v;out vec4 d,e;void main(){vec2 s=(g-.5)*p.zw;gl_Position=m*vec4(p.xy+s*cos(r)-vec2(-s.y,s)*sin(r),1,1);v=mix(u.xw,u.zy,g);d=c;e=a;}`,`#version 300 es
-precision highp float;uniform sampler2D s;in vec2 v;in vec4 d,e;out vec4 c;void main(){c=texture(s,v)*d+e;}`),fi=Xn(`#version 300 es
+precision highp float;uniform sampler2D s;in vec2 v;in vec4 d,e;out vec4 c;void main(){c=texture(s,v)*d+e;}`),fi=$n(`#version 300 es
 precision highp float;uniform mat4 m;in vec2 p;in vec4 c;out vec4 d;void main(){gl_Position=m*vec4(p,1,1);d=c;}`,`#version 300 es
-precision highp float;in vec4 d;out vec4 c;void main(){c=d;}`);let e=new ArrayBuffer(gi);Ft=new Float32Array(e),Ss=new Uint32Array(e),So=g.createBuffer(),Nn=g.createBuffer(),kr=g.createFramebuffer(),Ct=0;let s=new Float32Array([0,0,1,0,0,1,1,1]);g.bindBuffer(g.ARRAY_BUFFER,Nn),g.bufferData(g.ARRAY_BUFFER,s,g.STATIC_DRAW);let i,o,a,r=(c,l,u,h,p=0)=>{let d=g.getAttribLocation(o,c),y=u===1,x=u&&a;g.enableVertexAttribArray(d),g.vertexAttribPointer(d,h,l,y,x,i),g.vertexAttribDivisor(d,p),i+=h*u};wo=g.createVertexArray(),g.bindVertexArray(wo),i=0,o=di,a=mc,g.bindBuffer(g.ARRAY_BUFFER,Nn),r("g",g.FLOAT,0,2),g.bindBuffer(g.ARRAY_BUFFER,So),g.bufferData(g.ARRAY_BUFFER,gi,g.DYNAMIC_DRAW),r("p",g.FLOAT,4,4,1),r("u",g.FLOAT,4,4,1),r("c",g.UNSIGNED_BYTE,1,4,1),r("a",g.UNSIGNED_BYTE,1,4,1),r("r",g.FLOAT,4,1,1),To=g.createVertexArray(),g.bindVertexArray(To),i=0,o=fi,a=bc,r("p",g.FLOAT,4,2),r("c",g.UNSIGNED_BYTE,1,4)}}function ws(n=!1){!n&&!En||(Rt(),En=!1,g.useProgram(di),g.bindVertexArray(wo))}function xc(){En||(Rt(),En=!0,g.useProgram(fi),g.bindVertexArray(To))}function Eo(n=!0){if(!G||!g)return;f(!Ct,"glPreRender called with unflushed batch."),pi||(et.width=I.x,et.height=I.y),g.viewport(0,0,I.x,I.y),n&&vc();let t=b(2*H).divide(I);pi&&(t.y=-t.y);let e=_t.rotate(-Q),s=b(-1).subtract(e.multiply(t)),i=lt(Q),o=st(Q),a=[t.x*i,t.y*o,0,0,-t.x*o,t.y*i,0,0,1,1,1,0,s.x,s.y,0,1],r=(c,l,u)=>{g.useProgram(c);let h=g.getUniformLocation(c,l);g.uniformMatrix4fv(h,!1,u)};r(fi,"m",a),r(di,"m",a),g.activeTexture(g.TEXTURE0),cn[0]&&(Qt=cn[0].glTexture,g.bindTexture(g.TEXTURE_2D,Qt)),g.bindBuffer(g.ARRAY_BUFFER,So),On=Hn=!1,ws(!0)}function vc(){if(!g)return;let n=tn;g.clearColor(n.r,n.g,n.b,n.a),g.clear(g.COLOR_BUFFER_BIT)}function Fr(n){!g||n===Qt||(Rt(),Qt=n,g.bindTexture(g.TEXTURE_2D,Qt))}function Sc(n,t=!0){if(!g||!n)return;let e=n===Qt;e?Rt():g.bindTexture(g.TEXTURE_2D,n);let s=t?g.REPEAT:g.CLAMP_TO_EDGE;g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_S,s),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_T,s),!e&&Qt&&g.bindTexture(g.TEXTURE_2D,Qt)}function Co(n,t){if(!g)return;let e=g.createShader(t);if(g.shaderSource(e,n),g.compileShader(e),jt&&!g.getShaderParameter(e,g.COMPILE_STATUS))throw g.getShaderInfoLog(e);return e}function Xn(n,t){if(!g)return;let e=g.createProgram();if(g.attachShader(e,Co(n,g.VERTEX_SHADER)),g.attachShader(e,Co(t,g.FRAGMENT_SHADER)),g.linkProgram(e),jt&&!g.getProgramParameter(e,g.LINK_STATUS))throw g.getProgramInfoLog(e);return e}function ji(n,t=!1){if(!g)return;let e=g.createTexture(),s=!1;if(n!=null&&n.width)jr(e,n),g.bindTexture(g.TEXTURE_2D,e),s=!Tn&&hs(n.width)&&hs(n.height);else{let r=new Uint8Array([255,255,255,255]);g.bindTexture(g.TEXTURE_2D,e),g.texImage2D(g.TEXTURE_2D,0,g.RGBA,1,1,0,g.RGBA,g.UNSIGNED_BYTE,r)}let i=Tn?g.NEAREST:g.LINEAR,o=s?g.LINEAR_MIPMAP_LINEAR:i;g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MAG_FILTER,i),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MIN_FILTER,o);let a=t?g.REPEAT:g.CLAMP_TO_EDGE;return g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_S,a),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_T,a),s&&g.generateMipmap(g.TEXTURE_2D),g.bindTexture(g.TEXTURE_2D,Qt),e}function wc(n){g&&g.deleteTexture(n)}function jr(n,t){g&&(f((t==null?void 0:t.width)>0,"Invalid image data."),g.bindTexture(g.TEXTURE_2D,n),g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,t),!Tn&&hs(t.width)&&hs(t.height)&&g.generateMipmap(g.TEXTURE_2D),g.bindTexture(g.TEXTURE_2D,Qt))}function Hh(n){z||(ls.add(n),g&&(n.glTexture?jr(n.glTexture,n.image):n.glTexture=ji(n.image,n.wrap)))}function Xh(n){if(z)return;ls.delete(n);let t=n.glTexture;n.glTexture=void 0,wc(t)}function Rt(){if(G&&g&&Ct){let n=Hn?g.ONE:g.ONE_MINUS_SRC_ALPHA;g.blendFuncSeparate(g.SRC_ALPHA,n,g.ONE,n),g.enable(g.BLEND);let t=Ct*(En?Fi:Gr);g.bufferSubData(g.ARRAY_BUFFER,0,Ft,0,t),En?g.drawArrays(g.TRIANGLE_STRIP,0,Ct):g.drawArraysInstanced(g.TRIANGLE_STRIP,0,4,Ct),++Ce,_e+=Ct,Ct=0}Hn=On}function Br(n){!G||!g||(Rt(),n.drawImage(et,0,0))}function Yh(n=!0){f(!et,"must be called before engineInit"),Mr=n}function Ts(n,t,e,s,i=0,o=0,a=0,r=1,c=1,l=-1,u=0){(Ct>=Wh||Hn!==On)&&Rt(),ws();let h=Ct++*Gr;Ft[h++]=n,Ft[h++]=t,Ft[h++]=e,Ft[h++]=s,Ft[h++]=o,Ft[h++]=a,Ft[h++]=r,Ft[h++]=c,Ss[h++]=l,Ss[h++]=u,Ft[h++]=i}function Tc(n,t,e,s,i,o){Ts(n,t,e,s,i,0,0,0,0,0,o)}function Nr(n,t,e,s,i,o,a,r=!0){let c=[],l=st(-a),u=lt(-a);for(let p of n){let d=p.x*i,y=p.y*o;c.push(b(e+u*d-l*y,s+l*d+u*y))}let h=r?Kh(c):c;Ac(h,t)}function zr(n,t,e,s,i,o,a,r,c=!0){let l=$h(n,e,c);Nr(l,t,s,i,o,a,r,!1)}function Ac(n,t){if(!G||n.length<3)return;let e=n.length+2;if((Ct+e>=zn||Hn!==On)&&Rt(),f(e=zn)return;xc();let s=Ct*Fi;for(let i=e;i--;){let o=N(i-1,0,e-3),a=n[o];Ft[s++]=a.x,Ft[s++]=a.y,Ss[s++]=t}Ct+=e}function Jr(n,t){if(!G||n.length<3)return;let e=n.length+2;if((Ct+e>=zn||Hn!==On)&&Rt(),f(e=zn)return;xc();let s=Ct*Fi;for(let i=e;i--;){let o=N(i-1,0,e-3),a=n[o],r=t[o];Ft[s++]=a.x,Ft[s++]=a.y,Ss[s++]=r}Ct+=e}function is(n,t=!1){n?(pi=n,g.bindFramebuffer(g.FRAMEBUFFER,kr),g.framebufferTexture2D(g.FRAMEBUFFER,g.COLOR_ATTACHMENT0,g.TEXTURE_2D,n,0),Eo(t)):(Rt(),pi=void 0,g.bindFramebuffer(g.FRAMEBUFFER,null),g.viewport(0,0,I.x,I.y))}function Ec(n,t,e,s){G&&(g.enable(g.SCISSOR_TEST),g.scissor(n,t,e,s),g.clearColor(0,0,0,0),g.clear(g.COLOR_BUFFER_BIT),g.disable(g.SCISSOR_TEST))}function $h(n,t,e=!0){if(n.length<2)return[];let s=t/2,i=[],o=n.length,a=1e-6,r=10;for(let c=0;ca?-d/y:0,S=y>a?p/y:0,C=w>a?-v/w:0,A=w>a?x/w:0,T=_+C,P=S+A,M=(T*T+P*P)**.5;if(Ma){let yt=tt(1/ct,r);T*=yt,P*=yt}}let pt=b(u.x-T*s,u.y-P*s),at=b(u.x+T*s,u.y+P*s);i.push(pt),i.push(at)}return i.length>1&&e&&(i.push(i[0]),i.push(i[1])),i}function Kh(n){if(n.length<3)return[];let t=(d,y,x)=>(y.x-d.x)*(x.y-d.y)-(y.y-d.y)*(x.x-d.x);(d=>{let y=0;for(let x=d.length;x--;){let v=(x+1)%d.length;y+=d[x].cross(d[v])}return y})(n)<0&&(n=n.slice().reverse());let s=1e-9,i=(d,y,x,v)=>{let w=t(y,x,d),_=t(x,v,d),S=t(v,y,d),C=(w<-s?1:0)+(_<-s?1:0)+(S<-s?1:0),A=(w>s?1:0)+(_>s?1:0)+(S>s?1:0);return!(C&&A)},o=[];for(let d=0;d3&&r++{if(C>=0){let T=s.fillStyle=s.createLinearGradient(v,w,_,S);T.addColorStop(0,h(C,2)),T.addColorStop(1,h(C,1))}else s.fillStyle="#000";C>=-1?(s.fill(),A&&s.stroke()):s.stroke()},c=(v,w,_,S=0,C=2*X,A,T)=>{s.beginPath(),s.arc(v,w,_,d*S,d*C),r(v,w-_,v,w+_,A,T)},l=(v,w,_,S,C)=>{s.beginPath(),s.rect(v,w,_,S*d),r(v,w+S,v+_,w,C)},u=(v,w,_,S)=>{s.beginPath();for(let C of v)s.lineTo(C.x,C.y);s.closePath(),r(0,_,0,_+S,w)},h=(v,w)=>w?`hsl(${[.95,.56,.13][v%3]*360} 99%${[0,50,75][w]}%)`:"#000",p=Wa(1,1,n),d=Bt(p,.1,.5),y=tt(6,tt(o,a)/99);s.translate(o/2,a/2),s.scale(y,y),s.translate(-40,-35),d<1&&s.setLineDash([99*d,99]),s.lineJoin=s.lineCap="round",s.lineWidth=.1+d*1.9;{let w="LittleJS";s.font="900 15.5px arial",s.lineWidth=.1+d*3.9,s.textAlign="center",s.textBaseline="top",l(11,55,59,8*d,-1),s.beginPath();let _=0;for(let S=0;S5?1:0),s[S?"strokeText":"fillText"](w[C],P,54+.5,17*d),A+=T}s.lineWidth=.1+d*1.9,l(3,54,73,0)}l(7,15,26,-7,0),l(25,15,8,25,-1),l(10,40,15,-25,1),l(14,21,7,9,2),l(38,20,6,-6,2),l(49,20,10,-6,0);let x=[b(44,8),b(64,8),b(59,8+6*d),b(49,8+6*d)];u(x,2,8,6*d),l(44,8,20,-7,0);for(let v=5;v--;)c(59-v*6*d,30,10,0,2*X,1,0);c(59,30,4,0,7,2),l(35,20,24,0),c(59,30,10),c(47,30,10,X/2,X*3/2),c(35,30,10,X/2,X*3/2),l(7,40,13,7,-1),l(17,40,43,14,-1);for(let v=3;v--;)for(let w=2;w--;)c(17+15*v,47,w?7:1,0,2*X,2);for(let v=2;v--;){let w=6,_=7,S=53+w*d*v,C=[b(S+_,54),b(S,40),b(S+w*d,40),b(S+_+w*d,54)];u(C,0,40,14)}s.restore()}function Zh(n){if(bi=n,!fn){let e={};try{e=JSON.parse(localStorage[n]||"{}")}catch{e={}}Bi(s=>{s.unlocked=!!(e[s.id]&&e[s.id].unlocked)}),Vr()}Cn(void 0,t);function t(){if(!qs.length)return;let e=qs[0],s=on-Ws;if(!Ws)Ws=on;else if(s>yi)Ws=0,qs.shift();else{let i=yi-jn,o=si?(s-i)/jn:0;e.render(o)}}}function Bi(n){Object.values(As).forEach(t=>n(t))}function td(){Bi(n=>n.unlocked=!1),Vr()}function Vr(){if(!bi)return;let n={};Bi(t=>{let e={name:t.name,description:t.description,icon:t.icon,unlocked:t.unlocked};t.image&&(e.src=t.image.src),n[t.id]=e}),localStorage[bi]=JSON.stringify(n)}function ed(n){yi=n}function nd(n){jn=n}function sd(n){mi=n.copy()}function id(n){Ur=n}function Cc(n,t,e,s=125){let i,o,a,r,c,l,u,h,p,d,y,x,v,w=0,_,S=[],C=[],A=[],T=0,P=0,M=1,pt={},at=Qn/s*60>>2;for(;M;T++)S=[M=h=x=0],e.forEach((ct,yt)=>{for(u=t[ct][T]||[0,0,0],M|=t[ct][T]&&1,_=x+(t[ct][0].length-2-(h?0:1))*at,v=yt===e.length-1,i=2,a=x;iat-99&&p&&y<1?y+=1/99:0)l=(1-y)*S[w++]/2||0,C[a]=(C[a]||0)-l*P+l,A[a]=(A[a++]||0)+l*P+l;c&&(y=c%1,P=u[1]||0,(c|=0)&&(S=pt[[d=u[w=0]||0,c]]=pt[[d,c]]||(r=[...n[d]],r[2]=(r[2]||220)*2**(c/12-1),c>0?Gi(...r):[])))}x=_});return[C,A]}function od(n){Wr=typeof n=="boolean"?n?1:0:n}function rd(n){qr=n}async function ad(){return new Ai(await Box2D()),e(),Cn(n,t),m;function n(){if(!Ae){m.step(),m.objects=m.objects.filter(s=>!s.destroyed);for(let s of m.objects)s.body&&(s.pos=m.vec2From(s.body.GetPosition()),s.angle=-s.body.GetAngle())}}function t(){(qr||ue)&&m.world.DrawDebugData()}function e(){let i=new m.instance.JSDraw,o=l=>new wt(l.get_r(),l.get_g(),l.get_b()),a=l=>o(m.instance.wrapPointer(l,m.instance.b2Color)),r=l=>a(l).scale(1,.8),c=(l,u)=>{let h=[];for(let p=u;p--;)h.push(m.vec2FromPointer(l+p*8));return h};i.DrawSegment=function(l,u,h){h=r(h),l=m.vec2FromPointer(l),u=m.vec2FromPointer(u),mn(l,u,.1,h,b(),0,!1)},i.DrawPolygon=function(l,u,h){h=r(h);let p=c(l,u);Un(p,rn,.1,h,b(),0,!1)},i.DrawSolidPolygon=function(l,u,h){h=r(h);let p=c(l,u);Un(p,h,0,h,b(),0,!1)},i.DrawCircle=function(l,u,h){h=r(h),l=m.vec2FromPointer(l),si(l,u*2,rn,.1,h,!1)},i.DrawSolidCircle=function(l,u,h,p){p=r(p),l=m.vec2FromPointer(l),h=m.vec2FromPointer(h).scale(u),si(l,u*2,p,.1,p,!1),mn(b(),h,.1,p,l,0,!1)},i.DrawTransform=function(l){l=m.instance.wrapPointer(l,m.instance.b2Transform);let u=m.vec2From(l.get_p()),h=-l.get_q().GetAngle(),p=b(1,0),d=J(.75,0,0,.8),y=b(0,1),x=J(0,.75,0,.8);mn(b(),p,.1,d,u,h,!1),mn(b(),y,.1,x,u,h,!1)},i.AppendFlags(m.instance.b2Draw.e_shapeBit),i.AppendFlags(m.instance.b2Draw.e_jointBit),m.world.SetDebugDraw(i)}}function cd(n,t,e,s=32,i=2,o=0){_c(n,t,e,W,s,it,i,o,!1,!0)}function _c(n,t,e,s,i=1,o,a=.05,r=0,c=G,l,u){let h=e.offset(e.size),p=t.add(b(a-i*2)),d=b(i),y=t.scale(.5).subtract(d.scale(.5)),x=l?-1:1,v=l?-r:r;Mt(n,p,h,s,r,!1,o,c,l,u);for(let w=4;w--;){let _=w%2,S=y.multiply(b(_?w===1?1:-1:0,_?0:w?-1:1)),C=b(_?i:p.x,_?p.y:i),A=h.offset(e.size.multiply(b(w===1?1:w===3?-1:0,w===0?-x:w===2?x:0)));Mt(n.add(S.rotate(v)),C,A,s,r,!1,o,c,l,u)}for(let w=4;w--;){let _=w>1,S=w&&w<3,C=y.multiply(b(_?-1:1,S?-1:1)),A=h.offset(e.size.multiply(b(_?-1:1,S?x:-x)));Mt(n.add(C.rotate(v)),d,A,s,r,!1,o,c,l,u)}}function ld(n,t,e,s=32,i=2,o=0){Rc(n,t,e,W,s,it,i,o,!1,!0)}function Rc(n,t,e,s,i=1,o,a=.05,r=0,c=G,l,u){let h=e.frame(0),p=e.frame(1),d=e.frame(2),y=t.add(b(a-i*2)),x=b(i),v=t.scale(.5).subtract(x.scale(.5)),w=l?-1:1,_=l?-r:r;Mt(n,y,d,s,r,!1,o,c,l,u);for(let S=4;S--;){let C=r+S*X/2,A=S%2,T=v.multiply(b(A?S===1?1:-1:0,A?0:S?-w:w)),P=b(A?y.y:y.x,i);Mt(n.add(T.rotate(_)),P,p,s,C,!1,o,c,l,u)}for(let S=4;S--;){let C=r+S*X/2,A=!S||S>2,T=S>1,P=v.multiply(b(A?-1:1,T?-w:w));Mt(n.add(P.rotate(_)),x,h,s,C,!1,o,c,l,u)}}function ud(n,t=1,e=0,s=W,i=0,o=!1,a=0,r=it,c=G,l=!1,u){let h=Pc(b(),t,e,0,o);Un(h,s,a,r,n,i,c,l,u)}function Pc(n,t=1,e=0,s=0,i=!1,o=Ps){f(O(n),"pos must be a vec2"),f(L(t)&&L(e),"size and percent must be numbers");let a=se(e*4,4);a>=2&&(s+=X),a=a<=2?a-1:3-a,i&&(a=-a,s+=X);let r=[],c=K(3,o>>1),l=t/2;for(let u=0;u<=c;u++){let h=u/c*X;r.push(b(l*lt(h),l*st(h)).rotate(s).add(n))}for(let u=c;u>=0;u--){let h=u/c*X;r.push(b(l*lt(h),-l*a*st(h)).rotate(s).add(n))}return r}function La(n){return n&&typeof n.lerp=="function"}function hd(n,t,e,s,i=1,o={}){f(n!=null&&typeof n=="object","tweenProperty target must be an object"),f(V(t)&&t.length>0,"tweenProperty propertyPath must be a non-empty string");let a=t.split("."),r=a.pop(),c=l=>{let u=n;for(let h of a)u=u[h];u[r]=l};return new Ei(c,e,s,i,o)}function Lc(n){n.loopRemaining!==1/0&&n.loopRemaining<=1||(n.loopRemaining!==1/0&&(n.loopRemaining-=1),n.life=n.duration,n.thenCallback=()=>Lc(n),$t.push(n),n.callback(n.interp(n.duration)))}function Oc(n){if(n.loopRemaining!==1/0&&n.loopRemaining<=1)return;n.loopRemaining!==1/0&&(n.loopRemaining-=1);let t=n.start;n.start=n.end,n.end=t,n.life=n.duration,n.thenCallback=()=>Oc(n),$t.push(n),n.callback(n.interp(n.duration))}function Dc(n,t){n===void 0?(n=Kt-Ra,t=on-Pa,Ra=Kt,Pa=on):t===void 0&&(t=n);for(let e=$t.length;e--;){let s=$t[e];if(s.paused)continue;let i=s.useRealTime?t:n;if(!(i<=0))if(s.life-=i,s.life>0)s.callback(s.interp(s.life));else{s.callback(s.interp(0)),$t.splice(e,1);let o=s.thenCallback;s.thenCallback=void 0,o&&o()}}}function dd(){for(let n of $t)n.thenCallback=void 0;$t.length=0}var Hs,Xs,Cl,tr,vt,er,Oa,Kt,on,Ae,ao,be,Ys,Da,bn,uo,jt,ka,Ri,Ga,Me,Ze,ue,he,xn,vn,Jn,ho,ke,le,X,nt,St,us,$s,tt,K,ne,Na,za,st,lt,Ja,sr,go,rt,wt,W,rn,it,pe,Vl,rr,Wl,Ka,Qa,ql,Za,tc,Hl,Ee,_t,Q,H,cr,Pi,tn,Mn,os,kn,Gn,lr,Tn,en,Rs,ur,z,G,Ps,Li,Oi,Di,Ii,hr,dr,fr,pr,gr,Fe,Vt,Zs,Mi,yr,rs,yn,an,mr,fe,Yn,_n,$n,Kn,Ls,ln,qt,br,as,ti,Os,Ht,Sn,xr,vr,Ue,B,ut,Et,Ne,Ke,Se,je,I,cn,Ce,_e,Re,Ve,nh,lc,ii,De,Jt,Tr,xe,Ar,oi,Bn,Qe,Er,Fn,mt,ie,Y,ve,pn,co,Vn,oe,An,ri,Gs,Be,Ye,dc,Lr,fc,ys,gn,Wn,Aa,ai,ft,Je,Qn,bs,ci,sn,wn,ui,xs,vs,vo,Vh,hi,et,g,Mr,di,fi,En,On,Hn,Qt,So,Nn,Ft,Ss,Ct,ls,wo,To,kr,pi,Ao,gi,Gr,mc,Wh,Fi,bc,zn,fn,yi,jn,mi,Ur,As,qs,bi,Ws,xi,Es,_o,Ro,kt,Po,q,Lo,Oo,Do,E,Wr,Io,re,vi,Mo,ko,Cs,Go,Fo,jo,Bo,m,qr,_s,Si,No,zo,wi,Xt,Jo,Ti,Uo,Vo,Wo,qo,Ho,Xo,Yo,$o,Ko,Qo,Ai,$t,Ra,Pa,Ei,Ci,fd,lo,_i,Zo,Mc=jc(()=>{"use strict";Hs="LittleJS",Xs="1.18.19",Cl=60,tr=.016666666666666666,vt=[],er=[],Oa=0,Kt=0,on=0,Ae=!1;ao=0,be=0,Ys=0,Da=!0,bn=[],uo=class{constructor(t,e,s,i){this.update=t,this.render=e,this.glContextLost=s,this.glContextRestored=i}};jt=!0,ka=.5,Ri=!0,Ga="Escape",Me=!1,Ze=[],ue=!1,he=!1,xn=!1,vn=!1,Jn=!1;X=Math.PI,nt=Math.abs,St=Math.floor,us=Math.ceil,$s=Math.round,tt=Math.min,K=Math.max,ne=n=>Math.sign(n),Na=(...n)=>Math.hypot(...n),za=n=>Math.log2(n),st=Math.sin,lt=Math.cos,Ja=Math.tan,sr=Math.atan2;go=class{constructor(t=123456789){f(t!==0,"RandomGenerator seed must be non-zero (xorshift is fixed at 0)"),this.seed=t}float(t=1,e=0){return this.seed^=this.seed<<13,this.seed^=this.seed>>>17,this.seed^=this.seed<<5,e+(t-e)*((this.seed>>>0)/2**32)}int(t,e=0){return St(this.float(t,e))}bool(t=.5){return this.float().5?1:-1}floatSign(t=1,e=0){let s=tt(t,e),o=K(t,e)-s,a=this.float(o*2);return at?this.scale(t/e):this.copy()}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}reflect(t,e=1){return this.subtract(t.scale((1+e)*this.dot(t)))}angle(){return sr(this.x,this.y)}setAngle(t=0,e=1){return Yt(t),Yt(e),this.x=e*st(t),this.y=e*lt(t),this}rotate(t){Yt(t);let e=lt(-t),s=st(-t);return new n(this.x*e-this.y*s,this.x*s+this.y*e)}setDirection(t,e=1){return Yt(t),Yt(e),t=se(t,4),f(t===0||t===1||t===2||t===3,"Vector2.setDirection() direction must be an integer between 0 and 3."),this.x=t%2?t-1?-e:e:0,this.y=t%2?0:t?-e:e,this}direction(){return nt(this.x)>nt(this.y)?this.x<0?3:1:this.y<0?2:0}abs(){return new n(nt(this.x),nt(this.y))}floor(){return new n(St(this.x),St(this.y))}snap(t){return Yt(t),new n(St(this.x*t)/t,St(this.y*t)/t)}mod(t=1){return new n(se(this.x,t),se(this.y,t))}area(){return nt(this.x*this.y)}lerp(t,e){wa(t),Yt(e);let s=N(e);return new n(t.x*s+this.x*(1-s),t.y*s+this.y*(1-s))}arrayCheck(t){return this.x>=0&&this.y>=0&&this.x(u=se(u,1))*6<1?c+(l-c)*6*u:u*2<1?l:u*3<2?c+(l-c)*(4-u*6):c;return this.r=r(a,o,t+1/3),this.g=r(a,o,t),this.b=r(a,o,t-1/3),this.a=i,ss(this),this}HSLA(){let t=N(this.r),e=N(this.g),s=N(this.b),i=N(this.a),o=K(t,e,s),a=tt(t,e,s),r=(o+a)/2,c=0,l=0;if(o!==a){let u=o-a;l=r>.5?u/(2-o-a):u/(o+a),t===o?c=(e-s)/u+(e((s=N(s)*255|0)<16?"0":"")+s.toString(16);return"#"+e(this.r)+e(this.g)+e(this.b)+(t?e(this.a):"")}setHex(t){if(f(V(t),"Color hex code must be a string"),f(t[0]==="#","Color hex code must start with #"),f([4,5,7,9].includes(t.length),"Invalid hex"),t.length<6){let e=s=>N(parseInt(t[s],16)/15);this.r=e(1),this.g=e(2),this.b=e(3),this.a=t.length===5?e(4):1}else{let e=s=>N(parseInt(t.slice(s,s+2),16)/255);this.r=e(1),this.g=e(3),this.b=e(5),this.a=t.length===9?e(7):1}return ss(this),this}rgbaInt(){let t=N(this.r)*255|0,e=N(this.g)*255<<8,s=N(this.b)*255<<16,i=N(this.a)*255<<24;return t+e+s+i}isValid(){return L(this.r)&&L(this.g)&&L(this.b)&&L(this.a)}},W=Zt(J()),rn=Zt(J(1,1,1,0)),it=Zt(J(0,0,0)),pe=Zt(J(0,0,0,0)),Vl=Zt(J(.5,.5,.5)),rr=Zt(J(1,0,0)),Wl=Zt(J(1,.5,0)),Ka=Zt(J(1,1,0)),Qa=Zt(J(0,1,0)),ql=Zt(J(0,1,1)),Za=Zt(J(0,0,1)),tc=Zt(J(.5,0,1)),Hl=Zt(J(1,0,1)),Ee=class{constructor(t,e=!1){f(t===void 0||L(t),"Constructed Timer is invalid.",t),this.useRealTime=e;let s=this.getGlobalTime();this.time=t===void 0?void 0:s+t,this.setTime=t}set(t=0){f(L(t),"Timer is invalid.",t);let e=this.getGlobalTime();this.time=e+t,this.setTime=t}setUseRealTime(t=!0){f(!this.isSet(),"Cannot change global time setting while timer is set."),this.useRealTime=t}unset(){this.time=void 0}isSet(){return this.time!==void 0}active(){return this.getGlobalTime()=this.time}get(){return this.isSet()?this.getGlobalTime()-this.time:0}getPercent(){return this.isSet()?this.setTime?1-Bt(this.time-this.getGlobalTime(),0,this.setTime):1:0}getSetTime(){return this.isSet()?this.setTime:0}getGlobalTime(){return this.useRealTime?on:Kt}toString(){return this.isSet()?nt(this.get())+" seconds "+(this.get()<0?"before":"after"):"unset"}valueOf(){return this.get()}};_t=b(),Q=0,H=32,cr=1,Pi=!0,tn=pe,Mn=b(1920,1080),os=0,kn=0,Gn=b(),lr=!1,Tn=!0,en=1,Rs="arial",ur=!1,z=!1,G=!0,Ps=32,Li=b(16),Oi=0,Di=0,Ii=!0,hr=1,dr=1,fr=1,pr=0,gr=.8,Fe=1,Vt=b(),Zs=1,Mi=!0,yr=!0,rs=!0,yn=!0,an=!1,mr=!1,fe=0,Yn=4,_n=!0,$n=0,Kn=!1,Ls=!0,ln=!1,qt=100,br=.3,as=3,ti=0,Os=!0,Ht=!0,Sn=.3,xr=40,vr=.7;Ue=class n{constructor(t=b(),e=b(1),s,i=0,o=W,a=0){f(O(t),"object pos must be a vec2"),f(O(e),"object size must be a vec2"),f(!s||s instanceof Re,"object tileInfo should be a TileInfo or undefined"),f(typeof i=="number"&&isFinite(i),"object angle should be a number"),f(U(o),"object color should be a valid rgba color"),f(typeof a=="number","object renderOrder should be a number"),this.pos=t.copy(),this.size=e.copy(),this.drawSize=void 0,this.tileInfo=s,this.angle=i,this.color=o.copy(),this.additiveColor=void 0,this.mirror=!1,this.destroyed=!1,this.mass=hr,this.damping=dr,this.angleDamping=fr,this.restitution=pr,this.friction=gr,this.gravityScale=1,this.renderOrder=a,this.velocity=b(),this.angleVelocity=0,this.spawnTime=Kt,this.children=[],this.clampSpeed=!0,this.groundObject=void 0,this.parent=void 0,this.localPos=b(),this.localAngle=0,this.collideTiles=!1,this.collideSolidObjects=!1,this.isSolid=!1,this.collideRaycast=!1,vt.push(this)}updateTransforms(){let t=this.parent;if(t){let e=t.getMirrorSign(),s=this.localPos,i=t.pos,o=s.x*e,a=s.y,r=t.angle;if(r){let c=lt(-r),l=st(-r);this.pos.set(o*c-a*l+i.x,o*l+a*c+i.y)}else this.pos.set(o+i.x,a+i.y);this.angle=e*this.localAngle+r}for(let e of this.children)e.updateTransforms()}updatePhysics(){if(f(!this.parent),this.destroyed)return;this.clampSpeed&&(this.velocity.x=N(this.velocity.x,-Fe,Fe),this.velocity.y=N(this.velocity.y,-Fe,Fe));let t=this.pos.copy();if(this.velocity.x*=this.damping,this.velocity.y*=this.damping,this.mass&&(this.velocity.x+=Vt.x*this.gravityScale,this.velocity.y+=Vt.y*this.gravityScale),this.pos.x+=this.velocity.x,this.pos.y+=this.velocity.y,this.angle+=this.angleVelocity*=this.angleDamping,f(this.angleDamping>=0&&this.angleDamping<=1),f(this.damping>=0&&this.damping<=1),!Ii||!this.mass)return;let e=this.velocity.y<0&&Vt.y<0||this.velocity.y>0&&Vt.y>0;if(this.groundObject){let s=K(this.friction,this.groundObject.friction),i=this.groundObject.velocity.x;this.velocity.x=i+(this.velocity.x-i)*s,this.groundObject=void 0}if(this.collideSolidObjects)for(let i of er){if(i.destroyed||i.parent||i===this||!this.isSolid&&!i.isSolid||!this.isOverlappingObject(i))continue;let o=this.collideWithObject(i),a=i.collideWithObject(this);if(!o||!a)continue;if(Qs(t,this.size,i.pos,i.size)){let p=t.subtract(i.pos),d=p.length(),x=d<.001?b(0,1):p.scale(.001/d);this.velocity=this.velocity.add(x),i.mass&&(i.velocity=i.velocity.subtract(x)),ue&&fo(this.pos,this.size,i.pos,i.size,"#f00");continue}let r=this.size.add(i.size),c=(t.y-i.pos.y)*2>r.y+Vt.y,l=nt(t.y-i.pos.y)*20?-1:1)>0?St(t.y-this.size.y/2+1)+this.size.y/2+.001:us(t.y+this.size.y/2-1)-this.size.y/2-.001;if(nt(u-this.pos.y)<.1&&!$e(b(this.pos.x,u),this.size,this)){this.pos.y=u,ue&&bt(this.pos,this.size,"#ff0");return}this.pos.x=t.x,this.velocity.x*=-a}if(o||!i){if(e){let c=this.size.y/2+1e-4;this.pos.y=Vt.y<0?St(t.y-this.size.y/2)+c:us(t.y+this.size.y/2)-c,this.groundObject=s}else this.pos.y=t.y,this.groundObject=void 0;this.velocity.y*=-a}ue&&bt(this.pos,this.size,"#f00")}}}update(){}render(){Mt(this.pos,this.drawSize||this.size,this.tileInfo,this.color,this.angle,this.mirror,this.additiveColor)}renderLight(){}destroy(t=!1){var e;if(!this.destroyed){this.destroyed=!0,(e=this.parent)==null||e.removeChild(this);for(let s of this.children)s.parent=void 0,s.destroy(t)}}localToWorld(t){return this.pos.add(t.rotate(this.angle))}worldToLocal(t){return t.subtract(this.pos).rotate(-this.angle)}localToWorldVector(t){return t.rotate(this.angle)}worldToLocalVector(t){return t.rotate(-this.angle)}collideWithTile(t,e){return t>0}collideWithObject(t){return!0}getUp(t=1){return b().setAngle(this.angle,t)}getRight(t=1){return b().setAngle(this.angle+X/2,t)}getAliveTime(){return Kt-this.spawnTime}getSpeed(){return this.velocity.length()}applyAcceleration(t){this.mass&&(this.velocity=this.velocity.add(t))}applyAngularAcceleration(t){this.mass&&(this.angleVelocity+=t)}applyForce(t){this.mass&&this.applyAcceleration(t.scale(1/this.mass))}getMirrorSign(){return this.mirror?-1:1}addChild(t,e=b(),s=0){return f(!this.destroyed,"cannot add child to destroyed object"),this.destroyed||(f(!t.parent&&!this.children.includes(t)),f(t instanceof n,"child must be an EngineObject"),f(t!==this,"cannot add self as child"),this.children.push(t),t.parent=this,t.localPos=e.copy(),t.localAngle=s,t.updateTransforms()),t}removeChild(t){f(t.parent===this&&this.children.includes(t)),this.children.splice(this.children.indexOf(t),1),t.parent=void 0}isOverlappingObject(t){return this.isOverlapping(t.pos,t.size)}isOverlapping(t,e=b()){return Qs(this.pos,this.size,t,e)}setCollision(t=!0,e=!0,s=!0,i=!0){f(t||!e,"solid objects must be set to collide"),this.collideSolidObjects=t,this.isSolid=e,this.collideTiles=s,this.collideRaycast=i}toString(){let t="type = "+this.constructor.name;return(this.pos.x||this.pos.y)&&(t+=`
+precision highp float;in vec4 d;out vec4 c;void main(){c=d;}`);let e=new ArrayBuffer(gi);jt=new Float32Array(e),ws=new Uint32Array(e),So=g.createBuffer(),Jn=g.createBuffer(),kr=g.createFramebuffer(),Rt=0;let s=new Float32Array([0,0,1,0,0,1,1,1]);g.bindBuffer(g.ARRAY_BUFFER,Jn),g.bufferData(g.ARRAY_BUFFER,s,g.STATIC_DRAW);let i,o,a,r=(c,l,u,h,d=0)=>{let f=g.getAttribLocation(o,c),y=u===1,x=u&&a;g.enableVertexAttribArray(f),g.vertexAttribPointer(f,h,l,y,x,i),g.vertexAttribDivisor(f,d),i+=h*u};wo=g.createVertexArray(),g.bindVertexArray(wo),i=0,o=di,a=mc,g.bindBuffer(g.ARRAY_BUFFER,Jn),r("g",g.FLOAT,0,2),g.bindBuffer(g.ARRAY_BUFFER,So),g.bufferData(g.ARRAY_BUFFER,gi,g.DYNAMIC_DRAW),r("p",g.FLOAT,4,4,1),r("u",g.FLOAT,4,4,1),r("c",g.UNSIGNED_BYTE,1,4,1),r("a",g.UNSIGNED_BYTE,1,4,1),r("r",g.FLOAT,4,1,1),To=g.createVertexArray(),g.bindVertexArray(To),i=0,o=fi,a=bc,r("p",g.FLOAT,4,2),r("c",g.UNSIGNED_BYTE,1,4)}}function Ts(n=!1){!n&&!Rn||(Lt(),Rn=!1,g.useProgram(di),g.bindVertexArray(wo))}function xc(){Rn||(Lt(),Rn=!0,g.useProgram(fi),g.bindVertexArray(To))}function Eo(n=!0){if(!G||!g)return;p(!Rt,"glPreRender called with unflushed batch."),pi||(nt.width=I.x,nt.height=I.y),g.viewport(0,0,I.x,I.y),n&&vc();let t=b(2*H).divide(I);pi&&(t.y=-t.y);let e=Pt.rotate(-tt),s=b(-1).subtract(e.multiply(t)),i=lt(tt),o=it(tt),a=[t.x*i,t.y*o,0,0,-t.x*o,t.y*i,0,0,1,1,1,0,s.x,s.y,0,1],r=(c,l,u)=>{g.useProgram(c);let h=g.getUniformLocation(c,l);g.uniformMatrix4fv(h,!1,u)};r(fi,"m",a),r(di,"m",a),g.activeTexture(g.TEXTURE0),hn[0]&&(te=hn[0].glTexture,g.bindTexture(g.TEXTURE_2D,te)),g.bindBuffer(g.ARRAY_BUFFER,So),Mn=Yn=!1,Ts(!0)}function vc(){if(!g)return;let n=sn;g.clearColor(n.r,n.g,n.b,n.a),g.clear(g.COLOR_BUFFER_BIT)}function Fr(n){!g||n===te||(Lt(),te=n,g.bindTexture(g.TEXTURE_2D,te))}function Sc(n,t=!0){if(!g||!n)return;let e=n===te;e?Lt():g.bindTexture(g.TEXTURE_2D,n);let s=t?g.REPEAT:g.CLAMP_TO_EDGE;g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_S,s),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_T,s),!e&&te&&g.bindTexture(g.TEXTURE_2D,te)}function Co(n,t){if(!g)return;let e=g.createShader(t);if(g.shaderSource(e,n),g.compileShader(e),Nt&&!g.getShaderParameter(e,g.COMPILE_STATUS))throw g.getShaderInfoLog(e);return e}function $n(n,t){if(!g)return;let e=g.createProgram();if(g.attachShader(e,Co(n,g.VERTEX_SHADER)),g.attachShader(e,Co(t,g.FRAGMENT_SHADER)),g.linkProgram(e),Nt&&!g.getProgramParameter(e,g.LINK_STATUS))throw g.getProgramInfoLog(e);return e}function ji(n,t=!1){if(!g)return;let e=g.createTexture(),s=!1;if(n!=null&&n.width)jr(e,n),g.bindTexture(g.TEXTURE_2D,e),s=!Cn&&ds(n.width)&&ds(n.height);else{let r=new Uint8Array([255,255,255,255]);g.bindTexture(g.TEXTURE_2D,e),g.texImage2D(g.TEXTURE_2D,0,g.RGBA,1,1,0,g.RGBA,g.UNSIGNED_BYTE,r)}let i=Cn?g.NEAREST:g.LINEAR,o=s?g.LINEAR_MIPMAP_LINEAR:i;g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MAG_FILTER,i),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MIN_FILTER,o);let a=t?g.REPEAT:g.CLAMP_TO_EDGE;return g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_S,a),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_T,a),s&&g.generateMipmap(g.TEXTURE_2D),g.bindTexture(g.TEXTURE_2D,te),e}function wc(n){g&&g.deleteTexture(n)}function jr(n,t){g&&(p((t==null?void 0:t.width)>0,"Invalid image data."),g.bindTexture(g.TEXTURE_2D,n),g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,t),!Cn&&ds(t.width)&&ds(t.height)&&g.generateMipmap(g.TEXTURE_2D),g.bindTexture(g.TEXTURE_2D,te))}function Hh(n){B||(us.add(n),g&&(n.glTexture?jr(n.glTexture,n.image):n.glTexture=ji(n.image,n.wrap)))}function Xh(n){if(B)return;us.delete(n);let t=n.glTexture;n.glTexture=void 0,wc(t)}function Lt(){if(G&&g&&Rt){let n=Yn?g.ONE:g.ONE_MINUS_SRC_ALPHA;g.blendFuncSeparate(g.SRC_ALPHA,n,g.ONE,n),g.enable(g.BLEND);let t=Rt*(Rn?Fi:Gr);g.bufferSubData(g.ARRAY_BUFFER,0,jt,0,t),Rn?g.drawArrays(g.TRIANGLE_STRIP,0,Rt):g.drawArraysInstanced(g.TRIANGLE_STRIP,0,4,Rt),++Pe,Le+=Rt,Rt=0}Yn=Mn}function Nr(n){!G||!g||(Lt(),n.drawImage(nt,0,0))}function Yh(n=!0){p(!nt,"must be called before engineInit"),Mr=n}function As(n,t,e,s,i=0,o=0,a=0,r=1,c=1,l=-1,u=0){(Rt>=Wh||Yn!==Mn)&&Lt(),Ts();let h=Rt++*Gr;jt[h++]=n,jt[h++]=t,jt[h++]=e,jt[h++]=s,jt[h++]=o,jt[h++]=a,jt[h++]=r,jt[h++]=c,ws[h++]=l,ws[h++]=u,jt[h++]=i}function Tc(n,t,e,s,i,o){As(n,t,e,s,i,0,0,0,0,0,o)}function Br(n,t,e,s,i,o,a,r=!0){let c=[],l=it(-a),u=lt(-a);for(let d of n){let f=d.x*i,y=d.y*o;c.push(b(e+u*f-l*y,s+l*f+u*y))}let h=r?Kh(c):c;Ac(h,t)}function zr(n,t,e,s,i,o,a,r,c=!0){let l=$h(n,e,c);Br(l,t,s,i,o,a,r,!1)}function Ac(n,t){if(!G||n.length<3)return;let e=n.length+2;if((Rt+e>=Un||Yn!==Mn)&&Lt(),p(e=Un)return;xc();let s=Rt*Fi;for(let i=e;i--;){let o=j(i-1,0,e-3),a=n[o];jt[s++]=a.x,jt[s++]=a.y,ws[s++]=t}Rt+=e}function Jr(n,t){if(!G||n.length<3)return;let e=n.length+2;if((Rt+e>=Un||Yn!==Mn)&&Lt(),p(e=Un)return;xc();let s=Rt*Fi;for(let i=e;i--;){let o=j(i-1,0,e-3),a=n[o],r=t[o];jt[s++]=a.x,jt[s++]=a.y,ws[s++]=r}Rt+=e}function os(n,t=!1){n?(pi=n,g.bindFramebuffer(g.FRAMEBUFFER,kr),g.framebufferTexture2D(g.FRAMEBUFFER,g.COLOR_ATTACHMENT0,g.TEXTURE_2D,n,0),Eo(t)):(Lt(),pi=void 0,g.bindFramebuffer(g.FRAMEBUFFER,null),g.viewport(0,0,I.x,I.y))}function Ec(n,t,e,s){G&&(g.enable(g.SCISSOR_TEST),g.scissor(n,t,e,s),g.clearColor(0,0,0,0),g.clear(g.COLOR_BUFFER_BIT),g.disable(g.SCISSOR_TEST))}function $h(n,t,e=!0){if(n.length<2)return[];let s=t/2,i=[],o=n.length,a=1e-6,r=10;for(let c=0;ca?-f/y:0,S=y>a?d/y:0,C=w>a?-v/w:0,A=w>a?x/w:0,T=_+C,P=S+A,k=(T*T+P*P)**.5;if(ka){let gt=et(1/$,r);T*=gt,P*=gt}}let pt=b(u.x-T*s,u.y-P*s),W=b(u.x+T*s,u.y+P*s);i.push(pt),i.push(W)}return i.length>1&&e&&(i.push(i[0]),i.push(i[1])),i}function Kh(n){if(n.length<3)return[];let t=(f,y,x)=>(y.x-f.x)*(x.y-f.y)-(y.y-f.y)*(x.x-f.x);(f=>{let y=0;for(let x=f.length;x--;){let v=(x+1)%f.length;y+=f[x].cross(f[v])}return y})(n)<0&&(n=n.slice().reverse());let s=1e-9,i=(f,y,x,v)=>{let w=t(y,x,f),_=t(x,v,f),S=t(v,y,f),C=(w<-s?1:0)+(_<-s?1:0)+(S<-s?1:0),A=(w>s?1:0)+(_>s?1:0)+(S>s?1:0);return!(C&&A)},o=[];for(let f=0;f3&&r++{if(C>=0){let T=s.fillStyle=s.createLinearGradient(v,w,_,S);T.addColorStop(0,h(C,2)),T.addColorStop(1,h(C,1))}else s.fillStyle="#000";C>=-1?(s.fill(),A&&s.stroke()):s.stroke()},c=(v,w,_,S=0,C=2*Y,A,T)=>{s.beginPath(),s.arc(v,w,_,f*S,f*C),r(v,w-_,v,w+_,A,T)},l=(v,w,_,S,C)=>{s.beginPath(),s.rect(v,w,_,S*f),r(v,w+S,v+_,w,C)},u=(v,w,_,S)=>{s.beginPath();for(let C of v)s.lineTo(C.x,C.y);s.closePath(),r(0,_,0,_+S,w)},h=(v,w)=>w?`hsl(${[.95,.56,.13][v%3]*360} 99%${[0,50,75][w]}%)`:"#000",d=Wa(1,1,n),f=Bt(d,.1,.5),y=et(6,et(o,a)/99);s.translate(o/2,a/2),s.scale(y,y),s.translate(-40,-35),f<1&&s.setLineDash([99*f,99]),s.lineJoin=s.lineCap="round",s.lineWidth=.1+f*1.9;{let w="LittleJS";s.font="900 15.5px arial",s.lineWidth=.1+f*3.9,s.textAlign="center",s.textBaseline="top",l(11,55,59,8*f,-1),s.beginPath();let _=0;for(let S=0;S5?1:0),s[S?"strokeText":"fillText"](w[C],P,54+.5,17*f),A+=T}s.lineWidth=.1+f*1.9,l(3,54,73,0)}l(7,15,26,-7,0),l(25,15,8,25,-1),l(10,40,15,-25,1),l(14,21,7,9,2),l(38,20,6,-6,2),l(49,20,10,-6,0);let x=[b(44,8),b(64,8),b(59,8+6*f),b(49,8+6*f)];u(x,2,8,6*f),l(44,8,20,-7,0);for(let v=5;v--;)c(59-v*6*f,30,10,0,2*Y,1,0);c(59,30,4,0,7,2),l(35,20,24,0),c(59,30,10),c(47,30,10,Y/2,Y*3/2),c(35,30,10,Y/2,Y*3/2),l(7,40,13,7,-1),l(17,40,43,14,-1);for(let v=3;v--;)for(let w=2;w--;)c(17+15*v,47,w?7:1,0,2*Y,2);for(let v=2;v--;){let w=6,_=7,S=53+w*f*v,C=[b(S+_,54),b(S,40),b(S+w*f,40),b(S+_+w*f,54)];u(C,0,40,14)}s.restore()}function Zh(n){if(bi=n,!yn){let e={};try{e=JSON.parse(localStorage[n]||"{}")}catch{e={}}Ni(s=>{s.unlocked=!!(e[s.id]&&e[s.id].unlocked)}),Vr()}Pn(void 0,t);function t(){if(!qs.length)return;let e=qs[0],s=cn-Ws;if(!Ws)Ws=cn;else if(s>yi)Ws=0,qs.shift();else{let i=yi-Bn,o=si?(s-i)/Bn:0;e.render(o)}}}function Ni(n){Object.values(Es).forEach(t=>n(t))}function td(){Ni(n=>n.unlocked=!1),Vr()}function Vr(){if(!bi)return;let n={};Ni(t=>{let e={name:t.name,description:t.description,icon:t.icon,unlocked:t.unlocked};t.image&&(e.src=t.image.src),n[t.id]=e}),localStorage[bi]=JSON.stringify(n)}function ed(n){yi=n}function nd(n){Bn=n}function sd(n){mi=n.copy()}function id(n){Ur=n}function Cc(n,t,e,s=125){let i,o,a,r,c,l,u,h,d,f,y,x,v,w=0,_,S=[],C=[],A=[],T=0,P=0,k=1,pt={},W=ts/s*60>>2;for(;k;T++)S=[k=h=x=0],e.forEach(($,gt)=>{for(u=t[$][T]||[0,0,0],k|=t[$][T]&&1,_=x+(t[$][0].length-2-(h?0:1))*W,v=gt===e.length-1,i=2,a=x;iW-99&&d&&y<1?y+=1/99:0)l=(1-y)*S[w++]/2||0,C[a]=(C[a]||0)-l*P+l,A[a]=(A[a++]||0)+l*P+l;c&&(y=c%1,P=u[1]||0,(c|=0)&&(S=pt[[f=u[w=0]||0,c]]=pt[[f,c]]||(r=[...n[f]],r[2]=(r[2]||220)*2**(c/12-1),c>0?Gi(...r):[])))}x=_});return[C,A]}function od(n){Wr=typeof n=="boolean"?n?1:0:n}function rd(n){qr=n}async function ad(){return new Ai(await Box2D()),e(),Pn(n,t),m;function n(){if(!_e){m.step(),m.objects=m.objects.filter(s=>!s.destroyed);for(let s of m.objects)s.body&&(s.pos=m.vec2From(s.body.GetPosition()),s.angle=-s.body.GetAngle())}}function t(){(qr||de)&&m.world.DrawDebugData()}function e(){let i=new m.instance.JSDraw,o=l=>new Et(l.get_r(),l.get_g(),l.get_b()),a=l=>o(m.instance.wrapPointer(l,m.instance.b2Color)),r=l=>a(l).scale(1,.8),c=(l,u)=>{let h=[];for(let d=u;d--;)h.push(m.vec2FromPointer(l+d*8));return h};i.DrawSegment=function(l,u,h){h=r(h),l=m.vec2FromPointer(l),u=m.vec2FromPointer(u),vn(l,u,.1,h,b(),0,!1)},i.DrawPolygon=function(l,u,h){h=r(h);let d=c(l,u);Wn(d,ln,.1,h,b(),0,!1)},i.DrawSolidPolygon=function(l,u,h){h=r(h);let d=c(l,u);Wn(d,h,0,h,b(),0,!1)},i.DrawCircle=function(l,u,h){h=r(h),l=m.vec2FromPointer(l),si(l,u*2,ln,.1,h,!1)},i.DrawSolidCircle=function(l,u,h,d){d=r(d),l=m.vec2FromPointer(l),h=m.vec2FromPointer(h).scale(u),si(l,u*2,d,.1,d,!1),vn(b(),h,.1,d,l,0,!1)},i.DrawTransform=function(l){l=m.instance.wrapPointer(l,m.instance.b2Transform);let u=m.vec2From(l.get_p()),h=-l.get_q().GetAngle(),d=b(1,0),f=z(.75,0,0,.8),y=b(0,1),x=z(0,.75,0,.8);vn(b(),d,.1,f,u,h,!1),vn(b(),y,.1,x,u,h,!1)},i.AppendFlags(m.instance.b2Draw.e_shapeBit),i.AppendFlags(m.instance.b2Draw.e_jointBit),m.world.SetDebugDraw(i)}}function cd(n,t,e,s=32,i=2,o=0){_c(n,t,e,V,s,ot,i,o,!1,!0)}function _c(n,t,e,s,i=1,o,a=.05,r=0,c=G,l,u){let h=e.offset(e.size),d=t.add(b(a-i*2)),f=b(i),y=t.scale(.5).subtract(f.scale(.5)),x=l?-1:1,v=l?-r:r;It(n,d,h,s,r,!1,o,c,l,u);for(let w=4;w--;){let _=w%2,S=y.multiply(b(_?w===1?1:-1:0,_?0:w?-1:1)),C=b(_?i:d.x,_?d.y:i),A=h.offset(e.size.multiply(b(w===1?1:w===3?-1:0,w===0?-x:w===2?x:0)));It(n.add(S.rotate(v)),C,A,s,r,!1,o,c,l,u)}for(let w=4;w--;){let _=w>1,S=w&&w<3,C=y.multiply(b(_?-1:1,S?-1:1)),A=h.offset(e.size.multiply(b(_?-1:1,S?x:-x)));It(n.add(C.rotate(v)),f,A,s,r,!1,o,c,l,u)}}function ld(n,t,e,s=32,i=2,o=0){Rc(n,t,e,V,s,ot,i,o,!1,!0)}function Rc(n,t,e,s,i=1,o,a=.05,r=0,c=G,l,u){let h=e.frame(0),d=e.frame(1),f=e.frame(2),y=t.add(b(a-i*2)),x=b(i),v=t.scale(.5).subtract(x.scale(.5)),w=l?-1:1,_=l?-r:r;It(n,y,f,s,r,!1,o,c,l,u);for(let S=4;S--;){let C=r+S*Y/2,A=S%2,T=v.multiply(b(A?S===1?1:-1:0,A?0:S?-w:w)),P=b(A?y.y:y.x,i);It(n.add(T.rotate(_)),P,d,s,C,!1,o,c,l,u)}for(let S=4;S--;){let C=r+S*Y/2,A=!S||S>2,T=S>1,P=v.multiply(b(A?-1:1,T?-w:w));It(n.add(P.rotate(_)),x,h,s,C,!1,o,c,l,u)}}function ud(n,t=1,e=0,s=V,i=0,o=!1,a=0,r=ot,c=G,l=!1,u){let h=Pc(b(),t,e,0,o);Wn(h,s,a,r,n,i,c,l,u)}function Pc(n,t=1,e=0,s=0,i=!1,o=Ls){p(O(n),"pos must be a vec2"),p(R(t)&&R(e),"size and percent must be numbers");let a=oe(e*4,4);a>=2&&(s+=Y),a=a<=2?a-1:3-a,i&&(a=-a,s+=Y);let r=[],c=Q(3,o>>1),l=t/2;for(let u=0;u<=c;u++){let h=u/c*Y;r.push(b(l*lt(h),l*it(h)).rotate(s).add(n))}for(let u=c;u>=0;u--){let h=u/c*Y;r.push(b(l*lt(h),-l*a*it(h)).rotate(s).add(n))}return r}function La(n){return n&&typeof n.lerp=="function"}function hd(n,t,e,s,i=1,o={}){p(n!=null&&typeof n=="object","tweenProperty target must be an object"),p(U(t)&&t.length>0,"tweenProperty propertyPath must be a non-empty string");let a=t.split("."),r=a.pop(),c=l=>{let u=n;for(let h of a)u=u[h];u[r]=l};return new Ei(c,e,s,i,o)}function Lc(n){n.loopRemaining!==1/0&&n.loopRemaining<=1||(n.loopRemaining!==1/0&&(n.loopRemaining-=1),n.life=n.duration,n.thenCallback=()=>Lc(n),Qt.push(n),n.callback(n.interp(n.duration)))}function Oc(n){if(n.loopRemaining!==1/0&&n.loopRemaining<=1)return;n.loopRemaining!==1/0&&(n.loopRemaining-=1);let t=n.start;n.start=n.end,n.end=t,n.life=n.duration,n.thenCallback=()=>Oc(n),Qt.push(n),n.callback(n.interp(n.duration))}function Dc(n,t){n===void 0?(n=Zt-Ra,t=cn-Pa,Ra=Zt,Pa=cn):t===void 0&&(t=n);for(let e=Qt.length;e--;){let s=Qt[e];if(s.paused)continue;let i=s.useRealTime?t:n;if(!(i<=0))if(s.life-=i,s.life>0)s.callback(s.interp(s.life));else{s.callback(s.interp(0)),Qt.splice(e,1);let o=s.thenCallback;s.thenCallback=void 0,o&&o()}}}function dd(){for(let n of Qt)n.thenCallback=void 0;Qt.length=0}var Hs,Xs,Cl,tr,wt,er,Oa,Zt,cn,_e,ao,Se,Ys,Da,Sn,uo,Nt,ka,Ri,Ga,Fe,nn,de,fe,wn,Tn,Vn,ho,je,he,Y,st,At,hs,$s,et,Q,ie,Ba,za,it,lt,Ja,sr,go,ct,Et,V,ln,ot,ye,Vl,rr,Wl,Ka,Qa,ql,Za,tc,Hl,Re,Pt,tt,H,cr,Pi,sn,Gn,rs,Fn,jn,lr,Cn,on,Ps,ur,B,G,Ls,Li,Oi,Di,Ii,hr,dr,fr,pr,gr,Be,qt,Zs,Mi,yr,as,xn,un,mr,ge,Kn,Ln,Qn,Zn,Os,dn,Xt,br,cs,ti,Ds,Yt,An,xr,vr,qe,F,ut,_t,Ue,tn,Ae,ze,I,hn,Pe,Le,Oe,He,nh,lc,ii,ke,Vt,Tr,we,Ar,oi,zn,en,Er,Nn,bt,re,K,Te,mn,co,qn,ae,_n,ri,Fs,Je,Qe,dc,Lr,fc,ms,bn,Hn,Aa,ai,ft,We,ts,xs,ci,an,En,ui,vs,Ss,vo,Vh,hi,nt,g,Mr,di,fi,Rn,Mn,Yn,te,So,Jn,jt,ws,Rt,us,wo,To,kr,pi,Ao,gi,Gr,mc,Wh,Fi,bc,Un,yn,yi,Bn,mi,Ur,Es,qs,bi,Ws,xi,Cs,_o,Ro,Gt,Po,q,Lo,Oo,Do,E,Wr,Io,ce,vi,Mo,ko,_s,Go,Fo,jo,No,m,qr,Rs,Si,Bo,zo,wi,$t,Jo,Ti,Uo,Vo,Wo,qo,Ho,Xo,Yo,$o,Ko,Qo,Ai,Qt,Ra,Pa,Ei,Ci,fd,lo,_i,Zo,Mc=jc(()=>{"use strict";Hs="LittleJS",Xs="1.18.19",Cl=60,tr=.016666666666666666,wt=[],er=[],Oa=0,Zt=0,cn=0,_e=!1;ao=0,Se=0,Ys=0,Da=!0,Sn=[],uo=class{constructor(t,e,s,i){this.update=t,this.render=e,this.glContextLost=s,this.glContextRestored=i}};Nt=!0,ka=.5,Ri=!0,Ga="Escape",Fe=!1,nn=[],de=!1,fe=!1,wn=!1,Tn=!1,Vn=!1;Y=Math.PI,st=Math.abs,At=Math.floor,hs=Math.ceil,$s=Math.round,et=Math.min,Q=Math.max,ie=n=>Math.sign(n),Ba=(...n)=>Math.hypot(...n),za=n=>Math.log2(n),it=Math.sin,lt=Math.cos,Ja=Math.tan,sr=Math.atan2;go=class{constructor(t=123456789){p(t!==0,"RandomGenerator seed must be non-zero (xorshift is fixed at 0)"),this.seed=t}float(t=1,e=0){return this.seed^=this.seed<<13,this.seed^=this.seed>>>17,this.seed^=this.seed<<5,e+(t-e)*((this.seed>>>0)/2**32)}int(t,e=0){return At(this.float(t,e))}bool(t=.5){return this.float().5?1:-1}floatSign(t=1,e=0){let s=et(t,e),o=Q(t,e)-s,a=this.float(o*2);return at?this.scale(t/e):this.copy()}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}reflect(t,e=1){return this.subtract(t.scale((1+e)*this.dot(t)))}angle(){return sr(this.x,this.y)}setAngle(t=0,e=1){return Kt(t),Kt(e),this.x=e*it(t),this.y=e*lt(t),this}rotate(t){Kt(t);let e=lt(-t),s=it(-t);return new n(this.x*e-this.y*s,this.x*s+this.y*e)}setDirection(t,e=1){return Kt(t),Kt(e),t=oe(t,4),p(t===0||t===1||t===2||t===3,"Vector2.setDirection() direction must be an integer between 0 and 3."),this.x=t%2?t-1?-e:e:0,this.y=t%2?0:t?-e:e,this}direction(){return st(this.x)>st(this.y)?this.x<0?3:1:this.y<0?2:0}abs(){return new n(st(this.x),st(this.y))}floor(){return new n(At(this.x),At(this.y))}snap(t){return Kt(t),new n(At(this.x*t)/t,At(this.y*t)/t)}mod(t=1){return new n(oe(this.x,t),oe(this.y,t))}area(){return st(this.x*this.y)}lerp(t,e){wa(t),Kt(e);let s=j(e);return new n(t.x*s+this.x*(1-s),t.y*s+this.y*(1-s))}arrayCheck(t){return this.x>=0&&this.y>=0&&this.x(u=oe(u,1))*6<1?c+(l-c)*6*u:u*2<1?l:u*3<2?c+(l-c)*(4-u*6):c;return this.r=r(a,o,t+1/3),this.g=r(a,o,t),this.b=r(a,o,t-1/3),this.a=i,is(this),this}HSLA(){let t=j(this.r),e=j(this.g),s=j(this.b),i=j(this.a),o=Q(t,e,s),a=et(t,e,s),r=(o+a)/2,c=0,l=0;if(o!==a){let u=o-a;l=r>.5?u/(2-o-a):u/(o+a),t===o?c=(e-s)/u+(e((s=j(s)*255|0)<16?"0":"")+s.toString(16);return"#"+e(this.r)+e(this.g)+e(this.b)+(t?e(this.a):"")}setHex(t){if(p(U(t),"Color hex code must be a string"),p(t[0]==="#","Color hex code must start with #"),p([4,5,7,9].includes(t.length),"Invalid hex"),t.length<6){let e=s=>j(parseInt(t[s],16)/15);this.r=e(1),this.g=e(2),this.b=e(3),this.a=t.length===5?e(4):1}else{let e=s=>j(parseInt(t.slice(s,s+2),16)/255);this.r=e(1),this.g=e(3),this.b=e(5),this.a=t.length===9?e(7):1}return is(this),this}rgbaInt(){let t=j(this.r)*255|0,e=j(this.g)*255<<8,s=j(this.b)*255<<16,i=j(this.a)*255<<24;return t+e+s+i}isValid(){return R(this.r)&&R(this.g)&&R(this.b)&&R(this.a)}},V=ee(z()),ln=ee(z(1,1,1,0)),ot=ee(z(0,0,0)),ye=ee(z(0,0,0,0)),Vl=ee(z(.5,.5,.5)),rr=ee(z(1,0,0)),Wl=ee(z(1,.5,0)),Ka=ee(z(1,1,0)),Qa=ee(z(0,1,0)),ql=ee(z(0,1,1)),Za=ee(z(0,0,1)),tc=ee(z(.5,0,1)),Hl=ee(z(1,0,1)),Re=class{constructor(t,e=!1){p(t===void 0||R(t),"Constructed Timer is invalid.",t),this.useRealTime=e;let s=this.getGlobalTime();this.time=t===void 0?void 0:s+t,this.setTime=t}set(t=0){p(R(t),"Timer is invalid.",t);let e=this.getGlobalTime();this.time=e+t,this.setTime=t}setUseRealTime(t=!0){p(!this.isSet(),"Cannot change global time setting while timer is set."),this.useRealTime=t}unset(){this.time=void 0}isSet(){return this.time!==void 0}active(){return this.getGlobalTime()=this.time}get(){return this.isSet()?this.getGlobalTime()-this.time:0}getPercent(){return this.isSet()?this.setTime?1-Bt(this.time-this.getGlobalTime(),0,this.setTime):1:0}getSetTime(){return this.isSet()?this.setTime:0}getGlobalTime(){return this.useRealTime?cn:Zt}toString(){return this.isSet()?st(this.get())+" seconds "+(this.get()<0?"before":"after"):"unset"}valueOf(){return this.get()}};Pt=b(),tt=0,H=32,cr=1,Pi=!0,sn=ye,Gn=b(1920,1080),rs=0,Fn=0,jn=b(),lr=!1,Cn=!0,on=1,Ps="arial",ur=!1,B=!1,G=!0,Ls=32,Li=b(16),Oi=0,Di=0,Ii=!0,hr=1,dr=1,fr=1,pr=0,gr=.8,Be=1,qt=b(),Zs=1,Mi=!0,yr=!0,as=!0,xn=!0,un=!1,mr=!1,ge=0,Kn=4,Ln=!0,Qn=0,Zn=!1,Os=!0,dn=!1,Xt=100,br=.3,cs=3,ti=0,Ds=!0,Yt=!0,An=.3,xr=40,vr=.7;qe=class n{constructor(t=b(),e=b(1),s,i=0,o=V,a=0){p(O(t),"object pos must be a vec2"),p(O(e),"object size must be a vec2"),p(!s||s instanceof Oe,"object tileInfo should be a TileInfo or undefined"),p(typeof i=="number"&&isFinite(i),"object angle should be a number"),p(J(o),"object color should be a valid rgba color"),p(typeof a=="number","object renderOrder should be a number"),this.pos=t.copy(),this.size=e.copy(),this.drawSize=void 0,this.tileInfo=s,this.angle=i,this.color=o.copy(),this.additiveColor=void 0,this.mirror=!1,this.destroyed=!1,this.mass=hr,this.damping=dr,this.angleDamping=fr,this.restitution=pr,this.friction=gr,this.gravityScale=1,this.renderOrder=a,this.velocity=b(),this.angleVelocity=0,this.spawnTime=Zt,this.children=[],this.clampSpeed=!0,this.groundObject=void 0,this.parent=void 0,this.localPos=b(),this.localAngle=0,this.collideTiles=!1,this.collideSolidObjects=!1,this.isSolid=!1,this.collideRaycast=!1,wt.push(this)}updateTransforms(){let t=this.parent;if(t){let e=t.getMirrorSign(),s=this.localPos,i=t.pos,o=s.x*e,a=s.y,r=t.angle;if(r){let c=lt(-r),l=it(-r);this.pos.set(o*c-a*l+i.x,o*l+a*c+i.y)}else this.pos.set(o+i.x,a+i.y);this.angle=e*this.localAngle+r}for(let e of this.children)e.updateTransforms()}updatePhysics(){if(p(!this.parent),this.destroyed)return;this.clampSpeed&&(this.velocity.x=j(this.velocity.x,-Be,Be),this.velocity.y=j(this.velocity.y,-Be,Be));let t=this.pos.copy();if(this.velocity.x*=this.damping,this.velocity.y*=this.damping,this.mass&&(this.velocity.x+=qt.x*this.gravityScale,this.velocity.y+=qt.y*this.gravityScale),this.pos.x+=this.velocity.x,this.pos.y+=this.velocity.y,this.angle+=this.angleVelocity*=this.angleDamping,p(this.angleDamping>=0&&this.angleDamping<=1),p(this.damping>=0&&this.damping<=1),!Ii||!this.mass)return;let e=this.velocity.y<0&&qt.y<0||this.velocity.y>0&&qt.y>0;if(this.groundObject){let s=Q(this.friction,this.groundObject.friction),i=this.groundObject.velocity.x;this.velocity.x=i+(this.velocity.x-i)*s,this.groundObject=void 0}if(this.collideSolidObjects)for(let i of er){if(i.destroyed||i.parent||i===this||!this.isSolid&&!i.isSolid||!this.isOverlappingObject(i))continue;let o=this.collideWithObject(i),a=i.collideWithObject(this);if(!o||!a)continue;if(Qs(t,this.size,i.pos,i.size)){let d=t.subtract(i.pos),f=d.length(),x=f<.001?b(0,1):d.scale(.001/f);this.velocity=this.velocity.add(x),i.mass&&(i.velocity=i.velocity.subtract(x)),de&&fo(this.pos,this.size,i.pos,i.size,"#f00");continue}let r=this.size.add(i.size),c=(t.y-i.pos.y)*2>r.y+qt.y,l=st(t.y-i.pos.y)*20?-1:1)>0?At(t.y-this.size.y/2+1)+this.size.y/2+.001:hs(t.y+this.size.y/2-1)-this.size.y/2-.001;if(st(u-this.pos.y)<.1&&!Ze(b(this.pos.x,u),this.size,this)){this.pos.y=u,de&&xt(this.pos,this.size,"#ff0");return}this.pos.x=t.x,this.velocity.x*=-a}if(o||!i){if(e){let c=this.size.y/2+1e-4;this.pos.y=qt.y<0?At(t.y-this.size.y/2)+c:hs(t.y+this.size.y/2)-c,this.groundObject=s}else this.pos.y=t.y,this.groundObject=void 0;this.velocity.y*=-a}de&&xt(this.pos,this.size,"#f00")}}}update(){}render(){It(this.pos,this.drawSize||this.size,this.tileInfo,this.color,this.angle,this.mirror,this.additiveColor)}renderLight(){}destroy(t=!1){var e;if(!this.destroyed){this.destroyed=!0,(e=this.parent)==null||e.removeChild(this);for(let s of this.children)s.parent=void 0,s.destroy(t)}}localToWorld(t){return this.pos.add(t.rotate(this.angle))}worldToLocal(t){return t.subtract(this.pos).rotate(-this.angle)}localToWorldVector(t){return t.rotate(this.angle)}worldToLocalVector(t){return t.rotate(-this.angle)}collideWithTile(t,e){return t>0}collideWithObject(t){return!0}getUp(t=1){return b().setAngle(this.angle,t)}getRight(t=1){return b().setAngle(this.angle+Y/2,t)}getAliveTime(){return Zt-this.spawnTime}getSpeed(){return this.velocity.length()}applyAcceleration(t){this.mass&&(this.velocity=this.velocity.add(t))}applyAngularAcceleration(t){this.mass&&(this.angleVelocity+=t)}applyForce(t){this.mass&&this.applyAcceleration(t.scale(1/this.mass))}getMirrorSign(){return this.mirror?-1:1}addChild(t,e=b(),s=0){return p(!this.destroyed,"cannot add child to destroyed object"),this.destroyed||(p(!t.parent&&!this.children.includes(t)),p(t instanceof n,"child must be an EngineObject"),p(t!==this,"cannot add self as child"),this.children.push(t),t.parent=this,t.localPos=e.copy(),t.localAngle=s,t.updateTransforms()),t}removeChild(t){p(t.parent===this&&this.children.includes(t)),this.children.splice(this.children.indexOf(t),1),t.parent=void 0}isOverlappingObject(t){return this.isOverlapping(t.pos,t.size)}isOverlapping(t,e=b()){return Qs(this.pos,this.size,t,e)}setCollision(t=!0,e=!0,s=!0,i=!0){p(t||!e,"solid objects must be set to collide"),this.collideSolidObjects=t,this.isSolid=e,this.collideTiles=s,this.collideRaycast=i}toString(){let t="type = "+this.constructor.name;return(this.pos.x||this.pos.y)&&(t+=`
 pos = `+this.pos),(this.velocity.x||this.velocity.y)&&(t+=`
 velocity = `+this.velocity),(this.size.x||this.size.y)&&(t+=`
 size = `+this.size),this.angle&&(t+=`
 angle = `+this.angle.toFixed(3)),this.color&&(t+=`
-color = `+this.color),t}renderDebugInfo(){if(!jt)return;let t=this.collideTiles||this.collideSolidObjects||this.isSolid;if(!t&&!this.parent)return;let e=b(K(this.size.x,.2),K(this.size.y,.2)),s=J(this.collideTiles?1:0,this.collideSolidObjects?1:0,this.isSolid?1:0,.5);bt(this.pos,e,s,0,this.angle,t),this.parent&&bt(this.pos,e.scale(.8),J(1,1,1,.5),0,this.angle),this.parent&&we(this.pos,this.parent.pos,J(1,1,1,.5),.5)}},I=b(),cn=[];Re=class n{constructor(t=b(),e=Li,s=cn[0],i=Oi,o=Di){this.pos=t.copy(),this.size=e.copy(),this.padding=i,this.textureInfo=s,this.bleed=o}offset(t){return new n(this.pos.add(t),this.size,this.textureInfo,this.padding,this.bleed)}frame(t){f(typeof t=="number");let e=this.size.x+this.padding*2,s=t*e;return f(s+this.size.x<=this.textureInfo.size.x,"frame extends beyond texture width!"),this.offset(new rt(s))}setFullImage(t=this.textureInfo){return this.textureInfo=t,this.pos=new rt,this.size=t.size.copy(),this.bleed=this.padding=0,this}tile(t){return Ds(t,this.size,this.textureInfo,this.padding,this.bleed)}},Ve=class{constructor(t,e=!0,s=!1){this.image=t,this.size=t?b(t.width,t.height):b(),this.sizeInverse=t?b(1/t.width,1/t.height):b(),this.glTexture=void 0,this.wrap=s,e&&this.createWebGLTexture()}createWebGLTexture(){Hh(this)}destroyWebGLTexture(){Xh(this)}hasWebGL(){return!!this.glTexture}setWrap(t=!0){this.wrap=t,Sc(this.glTexture,t)}};nh=0;ii=class{constructor(t){f(!!t,"tileInfo is required for ImageFont"),this.tileInfo=t.frame(0)}drawText(t,e,s=1,i,o,a,r){f(O(s)||typeof s=="number","size must be a vec2 or number"),typeof s=="number"?(f(s>0),s*=H,s=new rt(s,s)):s=s.scale(H),this.drawTextScreen(t,Pn(e),s,i,o,a,r)}drawTextScreen(t,e,s,i=!0,o=W,a=G,r){f(V(t),"text must be a string"),f(O(e),"pos must be a vec2"),f(O(s)||typeof s=="number","size must be a vec2 or number"),f(U(o),"color must be a color"),s=typeof s=="number"?new rt(s,s):s;let c=new rt,l=this.tileInfo,u=l.padding,h=l.size.x+u*2,p=l.size.y+u*2,d=l.textureInfo.size.x/h|0;(t+"").split(`
-`).forEach((y,x)=>{let v=i?(y.length-1)*s.x/2:0;for(let w=y.length;w--;){let _=y.charCodeAt(w),S=_<32||_>127?95:_-32,C=S%d,A=S/d|0;l.pos.x=C*h+u,l.pos.y=A*p+u,c.x=e.x+w*s.x-v|0,c.y=e.y+x*s.y|0,Mt(c,s,l,o,0,!1,void 0,a,!0,r)}})}};De=b(),Jt=b(),Tr=b(),xe=b(),Ar=0,oi=!0,Bn=!1,Qe="mouse",Er=6,Fn=!0,mt=0,ie=!z&&window.ontouchstart!==void 0;Y=[[]],ve=[],pn=[],co=[],Vn=new Ee,oe=[],An=[],ri=[],Gs=[],Be=new Map,ys=[],Wn=!0;ai="http://www.w3.org/2000/svg";ft=new AudioContext,Qn=44100;bs=class{constructor(t,e,s=xr,i=vr,o){var a;if(!(!Ht||z)){if(f(!t||de(t)||V(t),"asset must be a file name or zzfx array"),f(e===void 0||L(e),"randomness must be a number"),f(e===void 0||e>=0&&e<=1,"randomness must be between 0 and 1"),f(L(s),"range must be a number"),f(L(i),"taper must be a number"),this.range=s,this.taper=i,this.randomness=e!=null?e:0,this.sampleRate=Qn,this.loadedPercent=0,this.onloadCallback=o,de(t)){let r=t.slice(),c=e!=null?e:.05,l=1;this.randomness=(a=r[l])!=null?a:c,r[l]=0,this.sampleChannels=[Gi(...r)],this.loadedPercent=1,o==null||o(this)}else if(typeof t=="string"){let r=t;this.loadSound(r)}}}play(t,e=1,s=1,i=1,o=!1,a=!1){if(f(!t||O(t),"pos must be a vec2"),f(L(e),"volume must be a number"),f(L(s),"pitch must be a number"),f(L(i),"randomnessScale must be a number"),!Ht||z||!this.sampleChannels)return;let r;if(t){let u=this.range;if(u){let h=_t.distanceSquared(t);if(h>u*u)return;e*=Bt(h**.5,u,u*this.taper)}r=Pn(t).x*2/B.width-1}let c=s+s*this.randomness*i*dt(-1,1),l=new ci(this,e,c,r,o,a);return jt&&Jn&&t&&(Ut(t,.5,"#0ff",.5,!0),this.range&&(Ut(t,2*this.range,"#0ff",.5),Ut(t,2*this.range*this.taper,"#0ff",.5)),In("vol "+e.toFixed(2)+" pitch "+c.toFixed(2),t,.5,"#0ff",.5)),l}playMusic(t=1,e=!0,s=!1){return this.play(void 0,t,1,0,e,s)}playNote(t=0,e,s){f(L(t),"semitoneOffset must be a number");let i=gc(t,1);return this.play(e,s,i,0)}getDuration(){var t,e;return((e=(t=this.sampleChannels)==null?void 0:t[0])==null?void 0:e.length)/this.sampleRate||0}isLoaded(){return this.loadedPercent===1}async loadSound(t){var c;let e=await fetch(t);if(!e.ok)throw new Error(`Failed to load sound from ${t}: ${e.status} ${e.statusText}`);let s=await e.arrayBuffer(),i=await ft.decodeAudioData(s),o=i.numberOfChannels,a=1e5,r=[];for(let l=0;lsetTimeout(v,0));let d=tt(p+a,h);for(;p=0,"Sound volume must be positive or zero"),f(s>=0,"Sound rate must be positive or zero"),f(L(i),"Sound pan must be a number"),this.sound=t,this.volume=e,this.rate=s,this.pan=i,this.loop=o,this.pausedTime=0,this.startTime=void 0,this.gainNode=void 0,this.source=void 0,this.onendedCallback=r=>{r===this.source&&(this.source=void 0)},a||this.start()}start(t=0){f(t>=0,"Sound start offset must be positive or zero"),this.isPlaying()&&this.stop(),this.gainNode=ft.createGain(),this.source=Ir(this.sound.sampleChannels,this.volume,this.rate,this.pan,this.loop,this.sound.sampleRate,this.gainNode,t,this.onendedCallback),this.source?(this.startTime=ft.currentTime-t,this.pausedTime=void 0):(this.startTime=void 0,this.pausedTime=0)}setVolume(t){f(t>=0,"Sound volume must be positive or zero"),this.volume=t,this.gainNode&&(this.gainNode.gain.value=t)}stop(t=0){if(f(t>=0,"Sound fade time must be positive or zero"),this.isPlaying())if(t){let e=ft.currentTime,s=e+t;this.gainNode.gain.cancelScheduledValues(e),this.gainNode.gain.setValueAtTime(this.volume,e),this.gainNode.gain.linearRampToValueAtTime(0,s),this.source.stop(s)}else this.source.stop();this.pausedTime=0,this.source=void 0,this.startTime=void 0}pause(){this.isPaused()||(this.pausedTime=this.getCurrentTime(),this.source.stop(),this.source=void 0,this.startTime=void 0)}resume(){this.isPaused()&&this.start(this.pausedTime)}isPlaying(){return!!this.source}isPaused(){return!this.isPlaying()}getCurrentTime(){if(!this.isPlaying())return this.pausedTime;let t=this.getDuration();return t?se(ft.currentTime-this.startTime,t):0}getDuration(){return this.rate?this.sound.getDuration()/this.rate:0}getSource(){return this.source}};sn=[];wn=class{constructor(t,e=0,s=!1,i=new wt){this.tile=t,this.direction=e,this.mirror=s,this.color=i.copy()}clear(){this.tile=this.direction=0,this.mirror=!1,this.color=new wt}},ui=class extends Ue{constructor(t,e,s=0,i=0,o=b(512),a=!0){var r;f(O(o),"canvasSize must be a Vector2"),super(t,e,void 0,s,W,i),this.canvas=z?void 0:new OffscreenCanvas(o.x,o.y),this.context=(r=this.canvas)==null?void 0:r.getContext("2d"),this.textureInfo=new Ve(this.canvas,a),this.mass=0}destroy(){this.destroyed||(this.textureInfo.destroyWebGLTexture(),super.destroy())}render(){this.draw(this.pos,this.size,this.color,this.angle,this.mirror,this.additiveColor)}draw(t,e,s=W,i=0,o=!1,a,r=!1,c){let l=new Re().setFullImage(this.textureInfo),u=this.hasWebGL();Mt(t,e,l,s,i,o,a,u,r,c)}updateWebGL(){this.textureInfo.createWebGLTexture()}hasWebGL(){return G&&this.textureInfo.hasWebGL()}},xs=class extends ui{constructor(t,e,s=Ds(),i=0,o=!0){let a=s?e.multiply(s.size):e;if(super(t,e,0,i,a,o),this.tileInfo=void 0,this.data=[],this.isUsingWebGL=!1,z){this.render=()=>{},this.redraw=()=>{},this.redrawStart=()=>{},this.redrawEnd=()=>{},this.drawTileData=()=>{},this.redrawTileData=()=>{},this.drawLayerTile=()=>{},this.drawLayerRect=()=>{},this.drawTile=()=>{},this.drawRect=()=>{},this.clearLayerRect=()=>{};return}s&&(this.tileInfo=s.frame(0),this.tileInfo.bleed=0);for(let r=this.size.area();r--;)this.data.push(new wn)}setData(t,e,s=!1){if(t=t.floor(),f(O(t),"layerPos must be a Vector2"),f(e instanceof wn,"data must be a TileLayerData"),!t.arrayCheck(this.size)||(this.data[(t.y|0)*this.size.x+(t.x|0)]=e,!s))return;Et===this.context?this.drawTileData(t):this.redrawTileData(t)}clearData(t,e=!1){this.setData(t,new wn,e)}getData(t){return f(O(t),"layerPos must be a Vector2"),t.arrayCheck(this.size)?this.data[(t.y|0)*this.size.x+(t.x|0)]:void 0}update(){!G&&this.isUsingWebGL&&(this.isUsingWebGL=!1,this.redraw())}render(){f(Et!==this.context,"must call redrawEnd() after drawing tiles!");let t=this.drawSize||this.size,e=this.pos.add(t.scale(.5));this.draw(e,this.size,this.color,this.angle,this.mirror,this.additiveColor)}onRedraw(){}redraw(){this.redrawStart(!0);for(let t=this.size.x;t--;)for(let e=this.size.y;e--;)this.drawTileData(b(t,e),!1);this.isUsingWebGL&&Rt(),this.onRedraw(),this.redrawEnd()}redrawStart(t=!1){var s,i;if(!this.context)return;f(Et!==this.context),this.savedRenderSettings=[Et,I,_t,H,tn],Et=this.context;let e=(i=(s=this.tileInfo)==null?void 0:s.size)!=null?i:b(1);I=this.size.multiply(e),tn=pe,_t=this.size.multiply(e).scale(.5),H=1,this.isUsingWebGL=this.hasWebGL(),this.isUsingWebGL?is(this.textureInfo.glTexture,t):(this.context.imageSmoothingEnabled=!Tn,t&&(this.canvas.width=I.x,this.canvas.height=I.y))}redrawEnd(){this.context&&(f(Et===this.context),this.isUsingWebGL&&is(),[Et,I,_t,H,tn]=this.savedRenderSettings)}drawTileData(t,e=!0){var r,c;if(!this.context)return;f(Et===this.context,"must call redrawStart() before drawing tiles");let s=(c=(r=this.tileInfo)==null?void 0:r.size)!=null?c:b(1),i=t.multiply(s);e&&this.clearLayerRect(i,s);let o=this.getData(t);if(!o||!o.tile)return;let a=this.tileInfo&&this.tileInfo.tile(o.tile);this.drawLayerTile(i,s,a,o.color,o.direction*X/2,o.mirror)}redrawTileData(t,e=!0){this.context&&(f(Et!==this.context,"redrawStart() should not be active when calling redrawTileData(), instead use drawTileData()"),this.redrawStart(),this.drawTileData(t,e),this.redrawEnd())}drawLayerTile(t,e=b(1),s,i=W,o=0,a,r){let c=t.add(e.scale(.5));Mt(c,e,s,i,o,a,r,this.isUsingWebGL)}drawLayerRect(t,e,s,i=0){this.drawLayerTile(t,e,void 0,s,i)}drawTile(t,e=b(1),s,i=new wt,o=0,a=!1){t=t.subtract(this.pos).multiply(this.tileInfo.size),e=e.multiply(this.tileInfo.size),t.y=this.canvas.height-t.y;let r=I;I=b(this.canvas.width,this.canvas.height);let c=this.hasWebGL();c&&is(this.textureInfo.glTexture);let l=c?void 0:this.context;Mt(t,e,s,i,o,a,void 0,c,!0,l),c&&is(),I=r}drawRect(t,e,s,i){this.drawTile(t,e,void 0,s,i)}clearLayerRect(t,e){f(Et===this.context,"must call redrawStart() before clearing tiles");let s=t.x,i=this.canvas.height-t.y-e.y;this.hasWebGL()?Ec(s,i,e.x,e.y):this.context.clearRect(s,i,e.x,e.y)}},vs=class extends xs{constructor(t,e,s=Ds(),i=0,o=!0){super(t,e.floor(),s,i,o),this.collisionData=[],this.initCollision(this.size),sn.push(this),this.isSolid=!0}destroy(){if(this.destroyed)return;let t=sn.indexOf(this);f(t>=0,"tile collision layer not found in array"),t>=0&&sn.splice(t,1),super.destroy()}initCollision(t){f(O(t),"size must be a Vector2"),this.size=t.floor(),this.collisionData=[],this.collisionData.length=t.area(),this.collisionData.fill(0)}setCollisionData(t,e=1){f(O(t),"layerPos must be a Vector2");let s=(t.y|0)*this.size.x+(t.x|0);t.arrayCheck(this.size)&&(this.collisionData[s]=e)}clearCollisionData(t){this.setCollisionData(t,0)}getCollisionData(t){f(O(t),"layerPos must be a Vector2");let e=(t.y|0)*this.size.x+(t.x|0);return t.arrayCheck(this.size)?this.collisionData[e]:0}collisionTest(t,e=new rt,s){f(O(t)&&O(e),"pos and size must be Vector2s"),f(!s||typeof s=="function"||s instanceof Ue,"callbackObject must be a function or EngineObject");let i=s?typeof s=="function"?(p,d)=>s(p,d):(p,d)=>s.collideWithTile(p,d):()=>!0,o=t.x-this.pos.x,a=t.y-this.pos.y;if(o+e.x/2<0||o-e.x/2>this.size.x||a+e.y/2<0||a-e.y/2>this.size.y)return!1;let r=K(o-e.x/2|0,0),c=K(a-e.y/2|0,0),l=tt(K(o+e.x/2,r+1),this.size.x),u=tt(K(a+e.y/2,c+1),this.size.y),h=new rt;for(let p=c;ps(l,u):(l,u)=>s.collideWithTile(l,u):l=>l>0,a=l=>{let u=this.getCollisionData(r.set(l.x-this.pos.x,l.y-this.pos.y));return u&&o(u,l)},r=new rt,c=qa(t,e,a,i);if(he&&c){let l=c.floor().add(b(.5));bt(l,b(1),"#f008"),we(t,e,"#00f",.02),we(t,c,"#f00",.02),nr(c,"#0f0"),i&&we(c,c.add(i),"#ff0",.02)}return c}},vo=class extends Ue{constructor(t,e,s=0,i=0,o=100,a=X,r,c=W,l=W,u=rn,h=rn,p=.5,d=.1,y=1,x=.1,v=.05,w=1,_=1,S=0,C=X,A=.1,T=.2,P=!1,M=!1,pt=!0,at=M?1e9:0,ct=!1){super(t,b(),r,e,void 0,at),this.emitCircle=typeof s=="number",this.emitSize=typeof s=="number"?b(s):s.copy(),this.emitTime=i,this.emitRate=o,this.emitConeAngle=a,this.colorStartA=c.copy(),this.colorStartB=l.copy(),this.colorEndA=u.copy(),this.colorEndB=h.copy(),this.randomColorLinear=pt,this.particleTime=p,this.sizeStart=d,this.sizeEnd=y,this.speed=x,this.angleSpeed=v,this.damping=w,this.angleDamping=_,this.gravityScale=S,this.particleConeAngle=C,this.fadeRate=A,this.randomness=T,this.collideTiles=P,this.additive=M,this.localSpace=ct,this.trailScale=0,this.particleCreateCallback=void 0,this.particleDestroyCallback=void 0,this.particleCollideCallback=void 0,this.velocityInheritance=0,this.emitTimeBuffer=0,this.particles=[],this.previousAngle=this.angle,this.previousPos=this.pos.copy()}update(){if(f(this.angleDamping>=0&&this.angleDamping<=1),f(this.damping>=0&&this.damping<=1),this.velocityInheritance){let s=this.velocityInheritance;this.velocity.x=s*(this.pos.x-this.previousPos.x),this.velocity.y=s*(this.pos.y-this.previousPos.y),this.angleVelocity=s*(this.angle-this.previousAngle),this.previousAngle=this.angle,this.previousPos.x=this.pos.x,this.previousPos.y=this.pos.y}if(this.isActive()){if(this.emitRate&&Zs){let s=1/this.emitRate/Zs;for(this.emitTimeBuffer+=tr;this.emitTimeBuffer>0;this.emitTimeBuffer-=s)this.emitParticle()}}else this.particles.length===0&&this.destroy(!0);let t=this.particles,e=0;for(let s=0;s_+_*dt(s,-s),o=i(this.particleTime),a=i(this.sizeStart),r=i(this.sizeEnd),c=i(this.speed),l=i(this.angleSpeed)*Xa(),u=dt(this.emitConeAngle,-this.emitConeAngle),h=po(this.colorStartA,this.colorStartB,this.randomColorLinear),p=po(this.colorEndA,this.colorEndB,this.randomColorLinear),d=this.localSpace?u:this.angle+u,y=b(c*st(d),c*lt(d)),x=l;!this.localSpace&&this.velocityInheritance>0&&(y.x+=this.velocity.x,y.y+=this.velocity.y,x+=this.angleVelocity);let v=new hi(this,t,e,h,p,o,a,r,y,x);return this.particles.push(v),(w=this.particleCreateCallback)==null||w.call(this,v),v}updatePhysics(){}render(){for(let t of this.particles)t.render()}isActive(){return!this.emitTime||this.getAliveTime()0&&(this.destroyed=!1,this.emitTime=-1))}},Vh=new rt,hi=class{constructor(t,e,s,i,o,a,r,c,l=b(),u=0){this.emitter=t,this.pos=e,this.angle=s,this.size=b(r),this.color=i.copy(),this.colorStart=i,this.colorEnd=o,this.lifeTime=a,this.sizeStart=r,this.sizeEnd=c,this.velocity=l,this.angleVelocity=u,this.spawnTime=Kt,this.mirror=Ha(),this.groundObject=void 0,this.destroyed=!1,this.tileInfo=t.tileInfo}update(){let t=this.emitter,e=t.damping,s=t.angleDamping,i=t.restitution,o=t.friction,a=t.gravityScale,r=t.collideTiles,c=t.particleCollideCallback;if(this.lifeTime>0&&Kt-this.spawnTime>this.lifeTime){this.destroy();return}let l=this.pos.copy();if(this.velocity.x*=e,this.velocity.y*=e,this.pos.x+=this.velocity.x+=Vt.x*a,this.pos.y+=this.velocity.y+=Vt.y*a,this.angle+=this.angleVelocity*=s,!Ii||!r)return;let u=this.velocity.lengthSquared();if(u>Fe*Fe){let p=Fe/u**.5;this.velocity.x*=p,this.velocity.y*=p}this.groundObject=void 0;let h=c?p=>{let d=li(p);return d&&c(this,d,p)}:p=>li(p)>0;if(h(this.pos)){let p=$e(this.pos);if(!h(l)){let d=h(b(this.pos.x,l.y)),y=h(b(l.x,this.pos.y)),x=K(i,p.restitution),v=K(o,p.friction);d&&(this.pos.x=l.x,this.velocity.x*=-x,this.velocity.y*=v),(y||!d)&&((this.velocity.y<0&&Vt.y<0||this.velocity.y>0&&Vt.y>0)&&(this.groundObject=p),this.pos.y=l.y,this.velocity.y*=-x,this.velocity.x*=v),ue&&bt(this.pos,this.size,"#f00")}}}destroy(){let t=this.emitter.particleDestroyCallback,e=this.colorEnd;this.color.set(e.r,e.g,e.b,e.a),this.size.set(this.sizeEnd,this.sizeEnd),this.destroyed=!0,t==null||t(this)}render(){let t=this.emitter,e=t.localSpace,s=t.additive,i=t.trailScale,o=t.fadeRate/2,a=this.lifeTime>0?tt((Kt-this.spawnTime)/this.lifeTime,1):1,r=1-a,c=r*this.sizeStart+a*this.sizeEnd,l=b(c),u=a1-o?(1-a)/o:1;this.color.r=r*this.colorStart.r+a*this.colorEnd.r,this.color.g=r*this.colorStart.g+a*this.colorEnd.g,this.color.b=r*this.colorStart.b+a*this.colorEnd.b,this.color.a=(r*this.colorStart.a+a*this.colorEnd.a)*u;let h=Vh.set(this.pos.x,this.pos.y),p=this.angle;if(e){let d=t.angle,y=lt(-d),x=st(-d);h.set(t.pos.x+h.x*y-h.y*x,t.pos.y+h.x*x+h.y*y),p+=d}if(s&&fs(),i){let d=e?this.velocity.rotate(t.angle):this.velocity,y=d.length();if(y){let x=y*i;l.y=K(l.x,x),p=sr(d.x,d.y),Mt(h,l,this.tileInfo,this.color,p,this.mirror)}}else Mt(h,l,this.tileInfo,this.color,p,this.mirror);s&&fs(!1),xn&&bt(h,l,"#f005",0,p)}},Mr=!0,Ao=!0,gi=5e5,Gr=11,mc=Gr*4,Wh=gi/mc|0,Fi=3,bc=Fi*4,zn=gi/bc|0;fn=!1,yi=5,jn=.5,mi=b(640,80),Ur=!1,As={},qs=[];xi=class{constructor(t,e,s="",i="\u{1F3C6}",o){f(t>=0&&!As[t]),this.id=t,this.name=e,this.description=s,this.icon=i,this.unlocked=!1,this.image=void 0,o&&((this.image=new Image).src=o),As[t]=this}unlock(){Ur||this.unlocked||(f(bi,"save name must be set"),this.unlocked=!0,Vr(),qs.push(this))}render(t=0){let e=ut,s=tt(mi.x,B.width),i=mi.y,o=B.width-s,a=-i*t,r=Ge(0,0,.9);e.save(),e.beginPath(),e.fillStyle=r.toString(),e.strokeStyle=it.toString(),e.lineWidth=3,e.rect(o,a,s,i),e.fill(),e.stroke(),e.clip();let c=b(.1,.05).scale(i),l=i-2*c.x;this.renderIcon(b(o+c.x+l/2,a+i/2),l);let u=i*.5,h=i*.3,p=b(o+l+2*c.x,a+c.y*2+u/2),d=s-l-3*c.x;nn(this.name,p,u,it,0,void 0,"left",void 0,void 0,d),p.y=a+i-c.y*2-h/2,nn(this.description,p,h,it,0,void 0,"left",void 0,void 0,d),e.restore()}renderIcon(t,e){this.image?ut.drawImage(this.image,t.x-e/2,t.y-e/2,e,e):nn(this.icon,t,e*.7,it)}};_o=class extends xi{constructor(t,e,s,i,o){super(t,e,s,i,o)}unlock(){super.unlock(),Es&&Es.unlockMedal(this.id)}},Ro=class{constructor(t,e,s){var c,l,u;f(!Es,"there can only be one newgrounds object"),f(!e||s,"must provide cryptojs if there is a cipher"),Es=this,this.app_id=t,this.cipher=e,this.cryptoJS=s,this.host=location?location.hostname:"";let i=new URL(location.href);if(this.session_id=i.searchParams.get("ngio_session_id"),!this.session_id)return;let o=this.call("Medal.getList");if(!o||!o.result||o.result.error){fn&&xt("Newgrounds session unavailable; skipping plugin init"),this.medals=[],this.scoreboards=[];return}this.medals=((c=o.result.data)==null?void 0:c.medals)||[],fn&&xt(this.medals);for(let h of this.medals){let p=As[h.id];p&&(p.image=new Image,p.image.src=h.icon,p.name=h.name,p.description=h.description,p.unlocked=h.unlocked,p.difficulty=h.difficulty,p.value=h.value,p.value&&(p.description=p.description+` (${p.value})`))}let a=this.call("ScoreBoard.getBoards");this.scoreboards=((u=(l=a==null?void 0:a.result)==null?void 0:l.data)==null?void 0:u.scoreboards)||[],fn&&xt(this.scoreboards);let r=60*1e3;setInterval(()=>this.call("Gateway.ping",0,!0),r)}unlockMedal(t){return this.call("Medal.unlock",{id:t},!0)}postScore(t,e){return this.call("ScoreBoard.postScore",{id:t,value:e},!0)}getScores(t,e,s=0,i=0,o=10){return this.call("ScoreBoard.getScores",{id:t,user:e,social:s,skip:i,limit:o})}logView(){return this.call("App.logView",{host:this.host},!0)}call(t,e,s=!1){let i={component:t,parameters:e};if(this.cipher){let l=this.cryptoJS,u=l.enc.Base64.parse(this.cipher),h=l.lib.WordArray.random(16),p=l.AES.encrypt(JSON.stringify(i),u,{iv:h});i.secure=l.enc.Base64.stringify(h.concat(p.ciphertext)),i.parameters=0}let o={app_id:this.app_id,session_id:this.session_id,call:i},a=new FormData;a.append("input",JSON.stringify(o));let r=new XMLHttpRequest;r.open("POST","https://newgrounds.io/gateway_v3.php",!fn&&s);try{r.send(a)}catch(l){fn&&xt("newgrounds call failed",l);return}return fn&&xt(r.responseText),r.responseText&&JSON.parse(r.responseText)}},Po=class{constructor(t,e=!1,s=!1){f(!kt,"Post process already initialized"),f(!(e&&s),"Post process cannot both include main canvas and use feedback texture"),kt=this,t||(t="void mainImage(out vec4 c,vec2 p){c=texture(iChannel0,p/iResolution.xy);}"),this.shader=void 0,this.texture=void 0,this.vao=void 0,i(),Cn(void 0,r,o,a);function i(){if(z)return;if(!G){console.warn("PostProcessPlugin: WebGL not enabled!");return}kt.texture=ji(),kt.shader=Xn(`#version 300 es
+color = `+this.color),t}renderDebugInfo(){if(!Nt)return;let t=this.collideTiles||this.collideSolidObjects||this.isSolid;if(!t&&!this.parent)return;let e=b(Q(this.size.x,.2),Q(this.size.y,.2)),s=z(this.collideTiles?1:0,this.collideSolidObjects?1:0,this.isSolid?1:0,.5);xt(this.pos,e,s,0,this.angle,t),this.parent&&xt(this.pos,e.scale(.8),z(1,1,1,.5),0,this.angle),this.parent&&Ee(this.pos,this.parent.pos,z(1,1,1,.5),.5)}},I=b(),hn=[];Oe=class n{constructor(t=b(),e=Li,s=hn[0],i=Oi,o=Di){this.pos=t.copy(),this.size=e.copy(),this.padding=i,this.textureInfo=s,this.bleed=o}offset(t){return new n(this.pos.add(t),this.size,this.textureInfo,this.padding,this.bleed)}frame(t){p(typeof t=="number");let e=this.size.x+this.padding*2,s=t*e;return p(s+this.size.x<=this.textureInfo.size.x,"frame extends beyond texture width!"),this.offset(new ct(s))}setFullImage(t=this.textureInfo){return this.textureInfo=t,this.pos=new ct,this.size=t.size.copy(),this.bleed=this.padding=0,this}tile(t){return Is(t,this.size,this.textureInfo,this.padding,this.bleed)}},He=class{constructor(t,e=!0,s=!1){this.image=t,this.size=t?b(t.width,t.height):b(),this.sizeInverse=t?b(1/t.width,1/t.height):b(),this.glTexture=void 0,this.wrap=s,e&&this.createWebGLTexture()}createWebGLTexture(){Hh(this)}destroyWebGLTexture(){Xh(this)}hasWebGL(){return!!this.glTexture}setWrap(t=!0){this.wrap=t,Sc(this.glTexture,t)}};nh=0;ii=class{constructor(t){p(!!t,"tileInfo is required for ImageFont"),this.tileInfo=t.frame(0)}drawText(t,e,s=1,i,o,a,r){p(O(s)||typeof s=="number","size must be a vec2 or number"),typeof s=="number"?(p(s>0),s*=H,s=new ct(s,s)):s=s.scale(H),this.drawTextScreen(t,Dn(e),s,i,o,a,r)}drawTextScreen(t,e,s,i=!0,o=V,a=G,r){p(U(t),"text must be a string"),p(O(e),"pos must be a vec2"),p(O(s)||typeof s=="number","size must be a vec2 or number"),p(J(o),"color must be a color"),s=typeof s=="number"?new ct(s,s):s;let c=new ct,l=this.tileInfo,u=l.padding,h=l.size.x+u*2,d=l.size.y+u*2,f=l.textureInfo.size.x/h|0;(t+"").split(`
+`).forEach((y,x)=>{let v=i?(y.length-1)*s.x/2:0;for(let w=y.length;w--;){let _=y.charCodeAt(w),S=_<32||_>127?95:_-32,C=S%f,A=S/f|0;l.pos.x=C*h+u,l.pos.y=A*d+u,c.x=e.x+w*s.x-v|0,c.y=e.y+x*s.y|0,It(c,s,l,o,0,!1,void 0,a,!0,r)}})}};ke=b(),Vt=b(),Tr=b(),we=b(),Ar=0,oi=!0,zn=!1,en="mouse",Er=6,Nn=!0,bt=0,re=!B&&window.ontouchstart!==void 0;K=[[]],Te=[],mn=[],co=[],qn=new Re,ae=[],_n=[],ri=[],Fs=[],Je=new Map,ms=[],Hn=!0;ai="http://www.w3.org/2000/svg";ft=new AudioContext,ts=44100;xs=class{constructor(t,e,s=xr,i=vr,o){var a;if(!(!Yt||B)){if(p(!t||pe(t)||U(t),"asset must be a file name or zzfx array"),p(e===void 0||R(e),"randomness must be a number"),p(e===void 0||e>=0&&e<=1,"randomness must be between 0 and 1"),p(R(s),"range must be a number"),p(R(i),"taper must be a number"),this.range=s,this.taper=i,this.randomness=e!=null?e:0,this.sampleRate=ts,this.loadedPercent=0,this.onloadCallback=o,pe(t)){let r=t.slice(),c=e!=null?e:.05,l=1;this.randomness=(a=r[l])!=null?a:c,r[l]=0,this.sampleChannels=[Gi(...r)],this.loadedPercent=1,o==null||o(this)}else if(typeof t=="string"){let r=t;this.loadSound(r)}}}play(t,e=1,s=1,i=1,o=!1,a=!1){if(p(!t||O(t),"pos must be a vec2"),p(R(e),"volume must be a number"),p(R(s),"pitch must be a number"),p(R(i),"randomnessScale must be a number"),!Yt||B||!this.sampleChannels)return;let r;if(t){let u=this.range;if(u){let h=Pt.distanceSquared(t);if(h>u*u)return;e*=Bt(h**.5,u,u*this.taper)}r=Dn(t).x*2/F.width-1}let c=s+s*this.randomness*i*dt(-1,1),l=new ci(this,e,c,r,o,a);return Nt&&Vn&&t&&(Wt(t,.5,"#0ff",.5,!0),this.range&&(Wt(t,2*this.range,"#0ff",.5),Wt(t,2*this.range*this.taper,"#0ff",.5)),kn("vol "+e.toFixed(2)+" pitch "+c.toFixed(2),t,.5,"#0ff",.5)),l}playMusic(t=1,e=!0,s=!1){return this.play(void 0,t,1,0,e,s)}playNote(t=0,e,s){p(R(t),"semitoneOffset must be a number");let i=gc(t,1);return this.play(e,s,i,0)}getDuration(){var t,e;return((e=(t=this.sampleChannels)==null?void 0:t[0])==null?void 0:e.length)/this.sampleRate||0}isLoaded(){return this.loadedPercent===1}async loadSound(t){var c;let e=await fetch(t);if(!e.ok)throw new Error(`Failed to load sound from ${t}: ${e.status} ${e.statusText}`);let s=await e.arrayBuffer(),i=await ft.decodeAudioData(s),o=i.numberOfChannels,a=1e5,r=[];for(let l=0;lsetTimeout(v,0));let f=et(d+a,h);for(;d=0,"Sound volume must be positive or zero"),p(s>=0,"Sound rate must be positive or zero"),p(R(i),"Sound pan must be a number"),this.sound=t,this.volume=e,this.rate=s,this.pan=i,this.loop=o,this.pausedTime=0,this.startTime=void 0,this.gainNode=void 0,this.source=void 0,this.onendedCallback=r=>{r===this.source&&(this.source=void 0)},a||this.start()}start(t=0){p(t>=0,"Sound start offset must be positive or zero"),this.isPlaying()&&this.stop(),this.gainNode=ft.createGain(),this.source=Ir(this.sound.sampleChannels,this.volume,this.rate,this.pan,this.loop,this.sound.sampleRate,this.gainNode,t,this.onendedCallback),this.source?(this.startTime=ft.currentTime-t,this.pausedTime=void 0):(this.startTime=void 0,this.pausedTime=0)}setVolume(t){p(t>=0,"Sound volume must be positive or zero"),this.volume=t,this.gainNode&&(this.gainNode.gain.value=t)}stop(t=0){if(p(t>=0,"Sound fade time must be positive or zero"),this.isPlaying())if(t){let e=ft.currentTime,s=e+t;this.gainNode.gain.cancelScheduledValues(e),this.gainNode.gain.setValueAtTime(this.volume,e),this.gainNode.gain.linearRampToValueAtTime(0,s),this.source.stop(s)}else this.source.stop();this.pausedTime=0,this.source=void 0,this.startTime=void 0}pause(){this.isPaused()||(this.pausedTime=this.getCurrentTime(),this.source.stop(),this.source=void 0,this.startTime=void 0)}resume(){this.isPaused()&&this.start(this.pausedTime)}isPlaying(){return!!this.source}isPaused(){return!this.isPlaying()}getCurrentTime(){if(!this.isPlaying())return this.pausedTime;let t=this.getDuration();return t?oe(ft.currentTime-this.startTime,t):0}getDuration(){return this.rate?this.sound.getDuration()/this.rate:0}getSource(){return this.source}};an=[];En=class{constructor(t,e=0,s=!1,i=new Et){this.tile=t,this.direction=e,this.mirror=s,this.color=i.copy()}clear(){this.tile=this.direction=0,this.mirror=!1,this.color=new Et}},ui=class extends qe{constructor(t,e,s=0,i=0,o=b(512),a=!0){var r;p(O(o),"canvasSize must be a Vector2"),super(t,e,void 0,s,V,i),this.canvas=B?void 0:new OffscreenCanvas(o.x,o.y),this.context=(r=this.canvas)==null?void 0:r.getContext("2d"),this.textureInfo=new He(this.canvas,a),this.mass=0}destroy(){this.destroyed||(this.textureInfo.destroyWebGLTexture(),super.destroy())}render(){this.draw(this.pos,this.size,this.color,this.angle,this.mirror,this.additiveColor)}draw(t,e,s=V,i=0,o=!1,a,r=!1,c){let l=new Oe().setFullImage(this.textureInfo),u=this.hasWebGL();It(t,e,l,s,i,o,a,u,r,c)}updateWebGL(){this.textureInfo.createWebGLTexture()}hasWebGL(){return G&&this.textureInfo.hasWebGL()}},vs=class extends ui{constructor(t,e,s=Is(),i=0,o=!0){let a=s?e.multiply(s.size):e;if(super(t,e,0,i,a,o),this.tileInfo=void 0,this.data=[],this.isUsingWebGL=!1,B){this.render=()=>{},this.redraw=()=>{},this.redrawStart=()=>{},this.redrawEnd=()=>{},this.drawTileData=()=>{},this.redrawTileData=()=>{},this.drawLayerTile=()=>{},this.drawLayerRect=()=>{},this.drawTile=()=>{},this.drawRect=()=>{},this.clearLayerRect=()=>{};return}s&&(this.tileInfo=s.frame(0),this.tileInfo.bleed=0);for(let r=this.size.area();r--;)this.data.push(new En)}setData(t,e,s=!1){if(t=t.floor(),p(O(t),"layerPos must be a Vector2"),p(e instanceof En,"data must be a TileLayerData"),!t.arrayCheck(this.size)||(this.data[(t.y|0)*this.size.x+(t.x|0)]=e,!s))return;_t===this.context?this.drawTileData(t):this.redrawTileData(t)}clearData(t,e=!1){this.setData(t,new En,e)}getData(t){return p(O(t),"layerPos must be a Vector2"),t.arrayCheck(this.size)?this.data[(t.y|0)*this.size.x+(t.x|0)]:void 0}update(){!G&&this.isUsingWebGL&&(this.isUsingWebGL=!1,this.redraw())}render(){p(_t!==this.context,"must call redrawEnd() after drawing tiles!");let t=this.drawSize||this.size,e=this.pos.add(t.scale(.5));this.draw(e,this.size,this.color,this.angle,this.mirror,this.additiveColor)}onRedraw(){}redraw(){this.redrawStart(!0);for(let t=this.size.x;t--;)for(let e=this.size.y;e--;)this.drawTileData(b(t,e),!1);this.isUsingWebGL&&Lt(),this.onRedraw(),this.redrawEnd()}redrawStart(t=!1){var s,i;if(!this.context)return;p(_t!==this.context),this.savedRenderSettings=[_t,I,Pt,H,sn],_t=this.context;let e=(i=(s=this.tileInfo)==null?void 0:s.size)!=null?i:b(1);I=this.size.multiply(e),sn=ye,Pt=this.size.multiply(e).scale(.5),H=1,this.isUsingWebGL=this.hasWebGL(),this.isUsingWebGL?os(this.textureInfo.glTexture,t):(this.context.imageSmoothingEnabled=!Cn,t&&(this.canvas.width=I.x,this.canvas.height=I.y))}redrawEnd(){this.context&&(p(_t===this.context),this.isUsingWebGL&&os(),[_t,I,Pt,H,sn]=this.savedRenderSettings)}drawTileData(t,e=!0){var r,c;if(!this.context)return;p(_t===this.context,"must call redrawStart() before drawing tiles");let s=(c=(r=this.tileInfo)==null?void 0:r.size)!=null?c:b(1),i=t.multiply(s);e&&this.clearLayerRect(i,s);let o=this.getData(t);if(!o||!o.tile)return;let a=this.tileInfo&&this.tileInfo.tile(o.tile);this.drawLayerTile(i,s,a,o.color,o.direction*Y/2,o.mirror)}redrawTileData(t,e=!0){this.context&&(p(_t!==this.context,"redrawStart() should not be active when calling redrawTileData(), instead use drawTileData()"),this.redrawStart(),this.drawTileData(t,e),this.redrawEnd())}drawLayerTile(t,e=b(1),s,i=V,o=0,a,r){let c=t.add(e.scale(.5));It(c,e,s,i,o,a,r,this.isUsingWebGL)}drawLayerRect(t,e,s,i=0){this.drawLayerTile(t,e,void 0,s,i)}drawTile(t,e=b(1),s,i=new Et,o=0,a=!1){t=t.subtract(this.pos).multiply(this.tileInfo.size),e=e.multiply(this.tileInfo.size),t.y=this.canvas.height-t.y;let r=I;I=b(this.canvas.width,this.canvas.height);let c=this.hasWebGL();c&&os(this.textureInfo.glTexture);let l=c?void 0:this.context;It(t,e,s,i,o,a,void 0,c,!0,l),c&&os(),I=r}drawRect(t,e,s,i){this.drawTile(t,e,void 0,s,i)}clearLayerRect(t,e){p(_t===this.context,"must call redrawStart() before clearing tiles");let s=t.x,i=this.canvas.height-t.y-e.y;this.hasWebGL()?Ec(s,i,e.x,e.y):this.context.clearRect(s,i,e.x,e.y)}},Ss=class extends vs{constructor(t,e,s=Is(),i=0,o=!0){super(t,e.floor(),s,i,o),this.collisionData=[],this.initCollision(this.size),an.push(this),this.isSolid=!0}destroy(){if(this.destroyed)return;let t=an.indexOf(this);p(t>=0,"tile collision layer not found in array"),t>=0&&an.splice(t,1),super.destroy()}initCollision(t){p(O(t),"size must be a Vector2"),this.size=t.floor(),this.collisionData=[],this.collisionData.length=t.area(),this.collisionData.fill(0)}setCollisionData(t,e=1){p(O(t),"layerPos must be a Vector2");let s=(t.y|0)*this.size.x+(t.x|0);t.arrayCheck(this.size)&&(this.collisionData[s]=e)}clearCollisionData(t){this.setCollisionData(t,0)}getCollisionData(t){p(O(t),"layerPos must be a Vector2");let e=(t.y|0)*this.size.x+(t.x|0);return t.arrayCheck(this.size)?this.collisionData[e]:0}collisionTest(t,e=new ct,s){p(O(t)&&O(e),"pos and size must be Vector2s"),p(!s||typeof s=="function"||s instanceof qe,"callbackObject must be a function or EngineObject");let i=s?typeof s=="function"?(d,f)=>s(d,f):(d,f)=>s.collideWithTile(d,f):()=>!0,o=t.x-this.pos.x,a=t.y-this.pos.y;if(o+e.x/2<0||o-e.x/2>this.size.x||a+e.y/2<0||a-e.y/2>this.size.y)return!1;let r=Q(o-e.x/2|0,0),c=Q(a-e.y/2|0,0),l=et(Q(o+e.x/2,r+1),this.size.x),u=et(Q(a+e.y/2,c+1),this.size.y),h=new ct;for(let d=c;ds(l,u):(l,u)=>s.collideWithTile(l,u):l=>l>0,a=l=>{let u=this.getCollisionData(r.set(l.x-this.pos.x,l.y-this.pos.y));return u&&o(u,l)},r=new ct,c=qa(t,e,a,i);if(fe&&c){let l=c.floor().add(b(.5));xt(l,b(1),"#f008"),Ee(t,e,"#00f",.02),Ee(t,c,"#f00",.02),nr(c,"#0f0"),i&&Ee(c,c.add(i),"#ff0",.02)}return c}},vo=class extends qe{constructor(t,e,s=0,i=0,o=100,a=Y,r,c=V,l=V,u=ln,h=ln,d=.5,f=.1,y=1,x=.1,v=.05,w=1,_=1,S=0,C=Y,A=.1,T=.2,P=!1,k=!1,pt=!0,W=k?1e9:0,$=!1){super(t,b(),r,e,void 0,W),this.emitCircle=typeof s=="number",this.emitSize=typeof s=="number"?b(s):s.copy(),this.emitTime=i,this.emitRate=o,this.emitConeAngle=a,this.colorStartA=c.copy(),this.colorStartB=l.copy(),this.colorEndA=u.copy(),this.colorEndB=h.copy(),this.randomColorLinear=pt,this.particleTime=d,this.sizeStart=f,this.sizeEnd=y,this.speed=x,this.angleSpeed=v,this.damping=w,this.angleDamping=_,this.gravityScale=S,this.particleConeAngle=C,this.fadeRate=A,this.randomness=T,this.collideTiles=P,this.additive=k,this.localSpace=$,this.trailScale=0,this.particleCreateCallback=void 0,this.particleDestroyCallback=void 0,this.particleCollideCallback=void 0,this.velocityInheritance=0,this.emitTimeBuffer=0,this.particles=[],this.previousAngle=this.angle,this.previousPos=this.pos.copy()}update(){if(p(this.angleDamping>=0&&this.angleDamping<=1),p(this.damping>=0&&this.damping<=1),this.velocityInheritance){let s=this.velocityInheritance;this.velocity.x=s*(this.pos.x-this.previousPos.x),this.velocity.y=s*(this.pos.y-this.previousPos.y),this.angleVelocity=s*(this.angle-this.previousAngle),this.previousAngle=this.angle,this.previousPos.x=this.pos.x,this.previousPos.y=this.pos.y}if(this.isActive()){if(this.emitRate&&Zs){let s=1/this.emitRate/Zs;for(this.emitTimeBuffer+=tr;this.emitTimeBuffer>0;this.emitTimeBuffer-=s)this.emitParticle()}}else this.particles.length===0&&this.destroy(!0);let t=this.particles,e=0;for(let s=0;s_+_*dt(s,-s),o=i(this.particleTime),a=i(this.sizeStart),r=i(this.sizeEnd),c=i(this.speed),l=i(this.angleSpeed)*Xa(),u=dt(this.emitConeAngle,-this.emitConeAngle),h=po(this.colorStartA,this.colorStartB,this.randomColorLinear),d=po(this.colorEndA,this.colorEndB,this.randomColorLinear),f=this.localSpace?u:this.angle+u,y=b(c*it(f),c*lt(f)),x=l;!this.localSpace&&this.velocityInheritance>0&&(y.x+=this.velocity.x,y.y+=this.velocity.y,x+=this.angleVelocity);let v=new hi(this,t,e,h,d,o,a,r,y,x);return this.particles.push(v),(w=this.particleCreateCallback)==null||w.call(this,v),v}updatePhysics(){}render(){for(let t of this.particles)t.render()}isActive(){return!this.emitTime||this.getAliveTime()0&&(this.destroyed=!1,this.emitTime=-1))}},Vh=new ct,hi=class{constructor(t,e,s,i,o,a,r,c,l=b(),u=0){this.emitter=t,this.pos=e,this.angle=s,this.size=b(r),this.color=i.copy(),this.colorStart=i,this.colorEnd=o,this.lifeTime=a,this.sizeStart=r,this.sizeEnd=c,this.velocity=l,this.angleVelocity=u,this.spawnTime=Zt,this.mirror=Ha(),this.groundObject=void 0,this.destroyed=!1,this.tileInfo=t.tileInfo}update(){let t=this.emitter,e=t.damping,s=t.angleDamping,i=t.restitution,o=t.friction,a=t.gravityScale,r=t.collideTiles,c=t.particleCollideCallback;if(this.lifeTime>0&&Zt-this.spawnTime>this.lifeTime){this.destroy();return}let l=this.pos.copy();if(this.velocity.x*=e,this.velocity.y*=e,this.pos.x+=this.velocity.x+=qt.x*a,this.pos.y+=this.velocity.y+=qt.y*a,this.angle+=this.angleVelocity*=s,!Ii||!r)return;let u=this.velocity.lengthSquared();if(u>Be*Be){let d=Be/u**.5;this.velocity.x*=d,this.velocity.y*=d}this.groundObject=void 0;let h=c?d=>{let f=li(d);return f&&c(this,f,d)}:d=>li(d)>0;if(h(this.pos)){let d=Ze(this.pos);if(!h(l)){let f=h(b(this.pos.x,l.y)),y=h(b(l.x,this.pos.y)),x=Q(i,d.restitution),v=Q(o,d.friction);f&&(this.pos.x=l.x,this.velocity.x*=-x,this.velocity.y*=v),(y||!f)&&((this.velocity.y<0&&qt.y<0||this.velocity.y>0&&qt.y>0)&&(this.groundObject=d),this.pos.y=l.y,this.velocity.y*=-x,this.velocity.x*=v),de&&xt(this.pos,this.size,"#f00")}}}destroy(){let t=this.emitter.particleDestroyCallback,e=this.colorEnd;this.color.set(e.r,e.g,e.b,e.a),this.size.set(this.sizeEnd,this.sizeEnd),this.destroyed=!0,t==null||t(this)}render(){let t=this.emitter,e=t.localSpace,s=t.additive,i=t.trailScale,o=t.fadeRate/2,a=this.lifeTime>0?et((Zt-this.spawnTime)/this.lifeTime,1):1,r=1-a,c=r*this.sizeStart+a*this.sizeEnd,l=b(c),u=a1-o?(1-a)/o:1;this.color.r=r*this.colorStart.r+a*this.colorEnd.r,this.color.g=r*this.colorStart.g+a*this.colorEnd.g,this.color.b=r*this.colorStart.b+a*this.colorEnd.b,this.color.a=(r*this.colorStart.a+a*this.colorEnd.a)*u;let h=Vh.set(this.pos.x,this.pos.y),d=this.angle;if(e){let f=t.angle,y=lt(-f),x=it(-f);h.set(t.pos.x+h.x*y-h.y*x,t.pos.y+h.x*x+h.y*y),d+=f}if(s&&ps(),i){let f=e?this.velocity.rotate(t.angle):this.velocity,y=f.length();if(y){let x=y*i;l.y=Q(l.x,x),d=sr(f.x,f.y),It(h,l,this.tileInfo,this.color,d,this.mirror)}}else It(h,l,this.tileInfo,this.color,d,this.mirror);s&&ps(!1),wn&&xt(h,l,"#f005",0,d)}},Mr=!0,Ao=!0,gi=5e5,Gr=11,mc=Gr*4,Wh=gi/mc|0,Fi=3,bc=Fi*4,Un=gi/bc|0;yn=!1,yi=5,Bn=.5,mi=b(640,80),Ur=!1,Es={},qs=[];xi=class{constructor(t,e,s="",i="\u{1F3C6}",o){p(t>=0&&!Es[t]),this.id=t,this.name=e,this.description=s,this.icon=i,this.unlocked=!1,this.image=void 0,o&&((this.image=new Image).src=o),Es[t]=this}unlock(){Ur||this.unlocked||(p(bi,"save name must be set"),this.unlocked=!0,Vr(),qs.push(this))}render(t=0){let e=ut,s=et(mi.x,F.width),i=mi.y,o=F.width-s,a=-i*t,r=Ne(0,0,.9);e.save(),e.beginPath(),e.fillStyle=r.toString(),e.strokeStyle=ot.toString(),e.lineWidth=3,e.rect(o,a,s,i),e.fill(),e.stroke(),e.clip();let c=b(.1,.05).scale(i),l=i-2*c.x;this.renderIcon(b(o+c.x+l/2,a+i/2),l);let u=i*.5,h=i*.3,d=b(o+l+2*c.x,a+c.y*2+u/2),f=s-l-3*c.x;rn(this.name,d,u,ot,0,void 0,"left",void 0,void 0,f),d.y=a+i-c.y*2-h/2,rn(this.description,d,h,ot,0,void 0,"left",void 0,void 0,f),e.restore()}renderIcon(t,e){this.image?ut.drawImage(this.image,t.x-e/2,t.y-e/2,e,e):rn(this.icon,t,e*.7,ot)}};_o=class extends xi{constructor(t,e,s,i,o){super(t,e,s,i,o)}unlock(){super.unlock(),Cs&&Cs.unlockMedal(this.id)}},Ro=class{constructor(t,e,s){var c,l,u;p(!Cs,"there can only be one newgrounds object"),p(!e||s,"must provide cryptojs if there is a cipher"),Cs=this,this.app_id=t,this.cipher=e,this.cryptoJS=s,this.host=location?location.hostname:"";let i=new URL(location.href);if(this.session_id=i.searchParams.get("ngio_session_id"),!this.session_id)return;let o=this.call("Medal.getList");if(!o||!o.result||o.result.error){yn&&St("Newgrounds session unavailable; skipping plugin init"),this.medals=[],this.scoreboards=[];return}this.medals=((c=o.result.data)==null?void 0:c.medals)||[],yn&&St(this.medals);for(let h of this.medals){let d=Es[h.id];d&&(d.image=new Image,d.image.src=h.icon,d.name=h.name,d.description=h.description,d.unlocked=h.unlocked,d.difficulty=h.difficulty,d.value=h.value,d.value&&(d.description=d.description+` (${d.value})`))}let a=this.call("ScoreBoard.getBoards");this.scoreboards=((u=(l=a==null?void 0:a.result)==null?void 0:l.data)==null?void 0:u.scoreboards)||[],yn&&St(this.scoreboards);let r=60*1e3;setInterval(()=>this.call("Gateway.ping",0,!0),r)}unlockMedal(t){return this.call("Medal.unlock",{id:t},!0)}postScore(t,e){return this.call("ScoreBoard.postScore",{id:t,value:e},!0)}getScores(t,e,s=0,i=0,o=10){return this.call("ScoreBoard.getScores",{id:t,user:e,social:s,skip:i,limit:o})}logView(){return this.call("App.logView",{host:this.host},!0)}call(t,e,s=!1){let i={component:t,parameters:e};if(this.cipher){let l=this.cryptoJS,u=l.enc.Base64.parse(this.cipher),h=l.lib.WordArray.random(16),d=l.AES.encrypt(JSON.stringify(i),u,{iv:h});i.secure=l.enc.Base64.stringify(h.concat(d.ciphertext)),i.parameters=0}let o={app_id:this.app_id,session_id:this.session_id,call:i},a=new FormData;a.append("input",JSON.stringify(o));let r=new XMLHttpRequest;r.open("POST","https://newgrounds.io/gateway_v3.php",!yn&&s);try{r.send(a)}catch(l){yn&&St("newgrounds call failed",l);return}return yn&&St(r.responseText),r.responseText&&JSON.parse(r.responseText)}},Po=class{constructor(t,e=!1,s=!1){p(!Gt,"Post process already initialized"),p(!(e&&s),"Post process cannot both include main canvas and use feedback texture"),Gt=this,t||(t="void mainImage(out vec4 c,vec2 p){c=texture(iChannel0,p/iResolution.xy);}"),this.shader=void 0,this.texture=void 0,this.vao=void 0,i(),Pn(void 0,r,o,a);function i(){if(B)return;if(!G){console.warn("PostProcessPlugin: WebGL not enabled!");return}Gt.texture=ji(),Gt.shader=$n(`#version 300 es
 precision highp float;in vec2 p;void main(){gl_Position=vec4(p+p-1.,1,1);}`,`#version 300 es
 precision highp float;uniform sampler2D iChannel0;uniform vec3 iResolution;uniform float iTime;out vec4 c;
 `+t+`
-void main(){mainImage(c,gl_FragCoord.xy);c.a=1.;}`),kt.vao=g.createVertexArray(),g.bindVertexArray(kt.vao),g.bindBuffer(g.ARRAY_BUFFER,Nn);let c=8,l=g.getAttribLocation(kt.shader,"p");g.enableVertexAttribArray(l),g.vertexAttribPointer(l,2,g.FLOAT,!1,c,0)}function o(){kt.shader=void 0,kt.texture=void 0,xt("PostProcessPlugin: WebGL context lost")}function a(){i(),xt("PostProcessPlugin: WebGL context restored")}function r(){if(z||!G)return;Rt(),g.bindFramebuffer(g.FRAMEBUFFER,null),g.useProgram(kt.shader),g.bindVertexArray(kt.vao),g.pixelStorei(g.UNPACK_FLIP_Y_WEBGL,!0),g.disable(g.BLEND),g.activeTexture(g.TEXTURE0),g.bindTexture(g.TEXTURE_2D,kt.texture),e?(Ne.width=I.x,Ne.height=I.y,Br(Ke),Ke.drawImage(B,0,0),B.width|=0,g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,Ne)):s||g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,et);let c=l=>g.getUniformLocation(kt.shader,l);g.uniform1i(c("iChannel0"),0),g.uniform1f(c("iTime"),Kt),g.uniform3f(c("iResolution"),B.width,B.height,1),g.drawArrays(g.TRIANGLE_STRIP,0,4),s&&g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,et),g.pixelStorei(g.UNPACK_FLIP_Y_WEBGL,!1),ws(!0)}}},Lo=class{constructor(t,e){f(!q,"LightSystemPlugin already initialized"),f(!kt,"LightSystemPlugin must be created before PostProcessPlugin"),q=this,this.enabled=!0,this.ambientColor=(e||it).copy(),this.textureSize=t?t.copy():void 0,this.texture=void 0,this.lightShader=void 0,this.compositeShader=void 0,this.lightVAO=void 0,this.compositeVAO=void 0,s(),Cn(void 0,i,o,a);function s(){if(z)return;if(!G){console.warn("LightSystemPlugin: WebGL not enabled!");return}q.textureSize||(q.textureSize=I.copy()),q.texture=g.createTexture(),g.bindTexture(g.TEXTURE_2D,q.texture),g.texImage2D(g.TEXTURE_2D,0,g.RGBA,q.textureSize.x,q.textureSize.y,0,g.RGBA,g.UNSIGNED_BYTE,null),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MAG_FILTER,g.LINEAR),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MIN_FILTER,g.LINEAR),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_S,g.CLAMP_TO_EDGE),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_T,g.CLAMP_TO_EDGE),q.lightShader=Xn(`#version 300 es
+void main(){mainImage(c,gl_FragCoord.xy);c.a=1.;}`),Gt.vao=g.createVertexArray(),g.bindVertexArray(Gt.vao),g.bindBuffer(g.ARRAY_BUFFER,Jn);let c=8,l=g.getAttribLocation(Gt.shader,"p");g.enableVertexAttribArray(l),g.vertexAttribPointer(l,2,g.FLOAT,!1,c,0)}function o(){Gt.shader=void 0,Gt.texture=void 0,St("PostProcessPlugin: WebGL context lost")}function a(){i(),St("PostProcessPlugin: WebGL context restored")}function r(){if(B||!G)return;Lt(),g.bindFramebuffer(g.FRAMEBUFFER,null),g.useProgram(Gt.shader),g.bindVertexArray(Gt.vao),g.pixelStorei(g.UNPACK_FLIP_Y_WEBGL,!0),g.disable(g.BLEND),g.activeTexture(g.TEXTURE0),g.bindTexture(g.TEXTURE_2D,Gt.texture),e?(Ue.width=I.x,Ue.height=I.y,Nr(tn),tn.drawImage(F,0,0),F.width|=0,g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,Ue)):s||g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,nt);let c=l=>g.getUniformLocation(Gt.shader,l);g.uniform1i(c("iChannel0"),0),g.uniform1f(c("iTime"),Zt),g.uniform3f(c("iResolution"),F.width,F.height,1),g.drawArrays(g.TRIANGLE_STRIP,0,4),s&&g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,nt),g.pixelStorei(g.UNPACK_FLIP_Y_WEBGL,!1),Ts(!0)}}},Lo=class{constructor(t,e){p(!q,"LightSystemPlugin already initialized"),p(!Gt,"LightSystemPlugin must be created before PostProcessPlugin"),q=this,this.enabled=!0,this.ambientColor=(e||ot).copy(),this.textureSize=t?t.copy():void 0,this.texture=void 0,this.lightShader=void 0,this.compositeShader=void 0,this.lightVAO=void 0,this.compositeVAO=void 0,s(),Pn(void 0,i,o,a);function s(){if(B)return;if(!G){console.warn("LightSystemPlugin: WebGL not enabled!");return}q.textureSize||(q.textureSize=I.copy()),q.texture=g.createTexture(),g.bindTexture(g.TEXTURE_2D,q.texture),g.texImage2D(g.TEXTURE_2D,0,g.RGBA,q.textureSize.x,q.textureSize.y,0,g.RGBA,g.UNSIGNED_BYTE,null),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MAG_FILTER,g.LINEAR),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MIN_FILTER,g.LINEAR),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_S,g.CLAMP_TO_EDGE),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_T,g.CLAMP_TO_EDGE),q.lightShader=$n(`#version 300 es
 precision highp float;uniform mat4 m;uniform vec2 lightPos;uniform float radius;in vec2 g;out vec2 vWorldPos;void main(){vec2 worldP=lightPos+(g-.5)*2.*radius;gl_Position=m*vec4(worldP,1,1);vWorldPos=worldP;}`,`#version 300 es
-precision highp float;uniform vec2 lightPos;uniform float radius;uniform float fadeRange;uniform vec4 color;in vec2 vWorldPos;out vec4 c;void main(){float dist=distance(vWorldPos,lightPos);float t=clamp((radius-dist)/max(fadeRange,1e-6),0.,1.);c=vec4(color.rgb*t*color.a,1.);}`),q.compositeShader=Xn(`#version 300 es
+precision highp float;uniform vec2 lightPos;uniform float radius;uniform float fadeRange;uniform vec4 color;in vec2 vWorldPos;out vec4 c;void main(){float dist=distance(vWorldPos,lightPos);float t=clamp((radius-dist)/max(fadeRange,1e-6),0.,1.);c=vec4(color.rgb*t*color.a,1.);}`),q.compositeShader=$n(`#version 300 es
 precision highp float;in vec2 p;void main(){gl_Position=vec4(p+p-1.,1,1);}`,`#version 300 es
-precision highp float;uniform sampler2D s;uniform vec3 iResolution;out vec4 c;void main(){vec2 uv=gl_FragCoord.xy/iResolution.xy;c=vec4(texture(s,uv).rgb,1.);}`),q.lightVAO=g.createVertexArray(),g.bindVertexArray(q.lightVAO),g.bindBuffer(g.ARRAY_BUFFER,Nn);let r=g.getAttribLocation(q.lightShader,"g");g.enableVertexAttribArray(r),g.vertexAttribPointer(r,2,g.FLOAT,!1,8,0),q.compositeVAO=g.createVertexArray(),g.bindVertexArray(q.compositeVAO),g.bindBuffer(g.ARRAY_BUFFER,Nn);let c=g.getAttribLocation(q.compositeShader,"p");g.enableVertexAttribArray(c),g.vertexAttribPointer(c,2,g.FLOAT,!1,8,0)}function i(){if(z||!G||!q.enabled||!q.texture)return;Rt();let r=On,c=q.ambientColor;g.bindFramebuffer(g.FRAMEBUFFER,kr),g.framebufferTexture2D(g.FRAMEBUFFER,g.COLOR_ATTACHMENT0,g.TEXTURE_2D,q.texture,0),g.viewport(0,0,q.textureSize.x,q.textureSize.y),g.clearColor(c.r,c.g,c.b,c.a),g.clear(g.COLOR_BUFFER_BIT),fs(),g.enable(g.BLEND),g.blendFunc(g.ONE,g.ONE);for(let u of vt)u.destroyed||u.renderLight();Rt(),g.bindFramebuffer(g.FRAMEBUFFER,null),g.viewport(0,0,I.x,I.y),g.useProgram(q.compositeShader),g.bindVertexArray(q.compositeVAO),g.activeTexture(g.TEXTURE0),g.bindTexture(g.TEXTURE_2D,q.texture);let l=q.compositeShader;g.uniform1i(g.getUniformLocation(l,"s"),0),g.uniform3f(g.getUniformLocation(l,"iResolution"),B.width,B.height,1),g.blendFunc(g.DST_COLOR,g.ZERO),g.drawArrays(g.TRIANGLE_STRIP,0,4),Qt&&g.bindTexture(g.TEXTURE_2D,Qt),fs(r),ws(!0)}function o(){q.texture=void 0,q.lightShader=void 0,q.compositeShader=void 0,q.lightVAO=void 0,q.compositeVAO=void 0,xt("LightSystemPlugin: WebGL context lost")}function a(){s(),xt("LightSystemPlugin: WebGL context restored")}}drawLight(t){if(z||!G||!this.lightShader)return;Rt(),g.useProgram(this.lightShader),g.bindVertexArray(this.lightVAO);let e=b(2*H).divide(I),s=_t.rotate(-Q),i=b(-1).subtract(s.multiply(e)),o=lt(Q),a=st(Q),r=[e.x*o,e.y*a,0,0,-e.x*a,e.y*o,0,0,1,1,1,0,i.x,i.y,0,1],c=this.lightShader;g.uniformMatrix4fv(g.getUniformLocation(c,"m"),!1,r),g.uniform2f(g.getUniformLocation(c,"lightPos"),t.pos.x,t.pos.y),g.uniform1f(g.getUniformLocation(c,"radius"),t.radius),g.uniform1f(g.getUniformLocation(c,"fadeRange"),t.fadeRange);let l=t.color;g.uniform4f(g.getUniformLocation(c,"color"),l.r,l.g,l.b,l.a),g.drawArrays(g.TRIANGLE_STRIP,0,4),ws(!0)}},Oo=class extends Ue{constructor(t,e,s,i){super(t,b(1),void 0,0,s),f(L(e)&&e>=0,"Light radius must be a non-negative number"),f(i===void 0||L(i)&&i>=0,"Light fadeRange must be a non-negative number when provided"),this.radius=e,this.fadeRange=i===void 0?e:i}render(){}renderLight(){q&&q.drawLight(this)}},Do=class extends bs{constructor(t){super(void 0),!(!Ht||z)&&(this.randomness=0,this.sampleChannels=Cc(...t),this.sampleRate=Qn)}playMusic(t=1,e=!0){return super.play(void 0,t,1,0,e)}};Wr=0;Io=class{constructor(t=ut){f(!E,"UI system already initialized"),E=this,this.activateOnPress=!1,this.defaultColor=W,this.defaultLineColor=it,this.defaultTextColor=it,this.defaultButtonColor=Ge(0,0,.7),this.defaultHoverColor=Ge(0,0,.9),this.defaultDisabledColor=Ge(0,0,.3),this.defaultGradientColor=void 0,this.defaultLineWidth=4,this.defaultCornerRadius=0,this.defaultTextFitScale=.8,this.defaultFont=Rs,this.defaultSoundPress=void 0,this.defaultSoundRelease=void 0,this.defaultSoundClick=void 0,this.defaultShadowColor=pe,this.defaultShadowBlur=5,this.defaultShadowOffset=b(5),this.nativeHeight=0,this.navigationObject=void 0,this.navigationTimer=new Ee(void 0,!0),this.navigationDelay=.2,this.navigationDirection=1,this.navigationMode=!1,this.uiObjects=[],this.uiContext=t,this.activeObject=void 0,this.hoverObject=void 0,this.lastHoverObject=void 0,this.confirmDialog=void 0,this._keyInputObject=void 0,this._onKeyDown=o=>{var a;return(a=this._keyInputObject)==null?void 0:a.onKeyDown(o)},Cn(s,i);function e(o){let a,r;o.parent?(a=o.parent.nativePos,r=o.parent.size):(a=E.screenToNative(I.scale(.5)),r=E.nativeHeight?b(I.x*E.nativeHeight/I.y,E.nativeHeight):I);let c=o.anchor;o.nativePos=a.add(r.multiply(c).scale(.5)).subtract(o.size.multiply(c).scale(.5)).add(o.localPos)}function s(){E.activeObject&&!E.activeObject.visible&&(E.activeObject=void 0),E.lastHoverObject=E.hoverObject,E.hoverObject=void 0,ps(0)&&(E.navigationMode=!1,E.navigationObject=void 0),E.keyInputObject&&(E.activeObject=E.keyInputObject,E.hoverObject=E.keyInputObject,E.navigationMode=!1,E.navigationObject=void 0);let o=E.getNavigableObjects();if(!o.length)E.navigationObject=void 0;else if(!E.keyInputObject){if(o.includes(E.navigationObject)||(E.navigationObject=void 0),ie||E.navigationMode&&!E.navigationObject&&(E.navigationObject=o.find(r=>r.navigationAutoSelect)),!E.navigationTimer.active()){let r=ne(E.getNavigationDirection());if(r){let c;if(E.navigationObject){let l=o.indexOf(E.navigationObject),u=se(l+r,o.length);c=o[u]}else if(c=o.find(l=>l.navigationAutoSelect),!c){let l=r>0?0:o.length-1;c=o[l]}E.navigationObject!==c&&(E.navigationMode=!0,E.hoverObject=void 0,E.navigationObject=c,E.navigationTimer.set(E.navigationDelay),c.soundPress&&c.soundPress.play())}}E.navigationObject&&E.getNavigationWasPressed()&&E.navigationObject.navigatePressed()}for(let r=E.uiObjects.length;r--;){let c=E.uiObjects[r];c.parent||a(c)}E.uiObjects=E.uiObjects.filter(r=>!r.destroyed);function a(r){if(!(r.destroyed||!r.visible)){e(r);for(let c=r.children.length;c--;){let l=r.children[c];l&&a(l)}r.destroyed||r.update()}}}function i(){let o=E.uiContext;if(o.save(),E.nativeHeight){let r=I.y/E.nativeHeight;o.translate(-r*I.x/2,0),o.scale(r,r),o.translate(I.x/2/r,0)}function a(r){if(r.visible){e(r),r.render();for(let c of r.children)a(c)}}if(E.uiObjects.forEach(r=>r.parent||a(r)),Wr>0){let r=function(c,l=!0){l&&(l=!!c.visible),e(c),c.renderDebug(l);for(let u of c.children)r(u,l)};E.uiObjects.forEach(c=>c.parent||r(c))}o.restore()}}drawRect(t,e,s=W,i=0,o=it,a=0,r,c=it,l=0,u=b()){f(O(t),"pos must be a vec2"),f(O(e),"size must be a vec2"),f(U(s),"color must be a color"),f(L(i),"lineWidth must be a number"),f(U(o),"lineColor must be a color"),f(L(a),"cornerRadius must be a number");let h=E.uiContext;if(r){let p=h.createLinearGradient(t.x,t.y-e.y/2,t.x,t.y+e.y/2),d=s.toString();p.addColorStop(0,d),p.addColorStop(.5,r.toString()),p.addColorStop(1,d),h.fillStyle=p}else h.fillStyle=s.toString();(l||u.x||u.y)&&c.a>0&&(h.shadowColor=c.toString(),h.shadowBlur=l,h.shadowOffsetX=u.x,h.shadowOffsetY=u.y),h.beginPath(),a&&h.roundRect?h.roundRect(t.x-e.x/2,t.y-e.y/2,e.x,e.y,a):h.rect(t.x-e.x/2,t.y-e.y/2,e.x,e.y),h.fill(),h.shadowColor="#0000",i&&o.a>0&&(h.strokeStyle=o.toString(),h.lineWidth=i,h.stroke())}drawLine(t,e,s=E.defaultLineWidth,i=E.defaultLineColor){f(O(t),"posA must be a vec2"),f(O(e),"posB must be a vec2"),f(L(s),"lineWidth must be a number"),f(U(i),"lineColor must be a color");let o=E.uiContext;o.strokeStyle=i.toString(),o.lineWidth=s,o.beginPath(),o.lineTo(t.x,t.y),o.lineTo(e.x,e.y),o.stroke()}drawTile(t,e,s,i=E.defaultColor,o=0,a=!1,r=it,c=0,l=b()){let u=E.uiContext;(c||l.x||l.y)&&r.a>0&&(u.shadowColor=r.toString(),u.shadowBlur=c,u.shadowOffsetX=l.x,u.shadowOffsetY=l.y),Mt(t,e,s,i,o,a,pe,!1,!0,u),u.shadowColor="#0000"}drawText(t,e,s,i=E.defaultColor,o=E.defaultLineWidth,a=E.defaultLineColor,r="center",c=E.defaultFont,l="",u=!0,h=void 0,p=it,d=0,y=b()){let x=E.uiContext;p.a>0&&(h&&nn(t,e.add(h),s.y,p,o,a,r,c,l,u?s.x:void 0,0,x),(d||y.x||y.y)&&(x.shadowColor=p.toString(),x.shadowBlur=d,x.shadowOffsetX=y.x,x.shadowOffsetY=y.y)),nn(t,e,s.y,i,o,a,r,c,l,u?s.x:void 0,0,x),x.shadowColor="#0000"}setupDragAndDrop(t,e,s,i){if(this._dragListeners)for(let[a,r]of this._dragListeners)document.removeEventListener(a,r);this._dragListeners=[];let o=(a,r)=>{let c=l=>{l.preventDefault(),a&&a(l)};document.addEventListener(r,c),this._dragListeners.push([r,c])};o(t,"drop"),o(e,"dragenter"),o(s,"dragleave"),o(i,"dragover")}screenToNative(t){if(!E.nativeHeight)return t;let e=I.y/E.nativeHeight,s=1/e,i=t.copy();return i.x+=e*I.x/2,i.x*=s,i.y*=s,i.x-=s*I.x/2,i}get keyInputObject(){return this._keyInputObject}set keyInputObject(t){let e=!!this._keyInputObject;this._keyInputObject=t,!e&&t?document.addEventListener("keydown",this._onKeyDown):e&&!t&&document.removeEventListener("keydown",this._onKeyDown)}destroyObjects(){for(let t of this.uiObjects)t.parent||t.destroy();this.uiObjects=this.uiObjects.filter(t=>!t.destroyed),this.activeObject=void 0,this.hoverObject=void 0,this.lastHoverObject=void 0,this.keyInputObject=void 0}getNavigableObjects(){function t(s){if(!(!s.visible||s.disabled)){s.isInteractive()&&s.navigationIndex!==void 0&&e.push(s);for(let i=s.children.length;i--;)t(s.children[i])}}let e=[];for(let s=E.uiObjects.length;s--;){let i=E.uiObjects[s];E.confirmDialog&&i!==E.confirmDialog||i.parent||t(i)}return e.sort((s,i)=>s.navigationIndex-i.navigationIndex),e}getNavigationDirection(){let t=E.navigationDirection===1,e=E.navigationDirection===2;if(Bn){let l=gs(0,mt),u=bo(mt);return e?-(l.y||u.y)||l.x||u.x:t?-(l.y||u.y):l.x||u.x}let s="ArrowUp",i="ArrowDown",o="ArrowLeft",a="ArrowRight";if(e)return It(s)||It(o)?-1:It(i)||It(a)?1:0;let r=t?s:o,c=t?i:a;return It(r)?-1:It(c)?1:0}getNavigationOtherDirection(){if(E.navigationDirection===2)return 0;let t=E.navigationDirection===1;if(Bn){let i=gs(0,mt),o=bo(mt);return t?i.x||o.x:i.y||o.y}let e=t?"ArrowLeft":"ArrowUp",s=t?"ArrowRight":"ArrowDown";return It(e)?-1:It(s)?1:0}getNavigationWasPressed(){return Bn?Rr(0,mt):Gt("Space")||Gt("Enter")}showConfirmDialog(t="Are you sure?",e,s,i=b(500,250),o="Escape"){f(!E.confirmDialog);let a=E.navigationDirection;E.navigationDirection=2;let r=new re(b(),i);E.confirmDialog=r,r.onRender=()=>{let d=Ge(0,0,0,.7);E.drawRect(b(),b(1e9),d)},r.onUpdate=()=>{Gt(o)&&p()},r.isMouseOverlapping=()=>!0;let c=50,l=new vi(b(0,-50),b(i.x-c,70),t);r.addChild(l);let u=new Cs(b(-80,50),b(120,70),"Yes");u.textHeight=40,u.navigationIndex=1,u.hoverColor=Ge(0,1,.5),u.onClick=()=>{p(),e&&e()},r.addChild(u);let h=new Cs(b(80,50),b(120,70),"No");h.textHeight=40,h.navigationIndex=2,h.navigationAutoSelect=!0,h.onClick=()=>{p(),s&&s()},r.addChild(h);function p(){f(E.confirmDialog===r),r.destroy(),E.confirmDialog=void 0,E.navigationDirection=a,ks()}}},re=class{constructor(t=b(),e=b()){var s,i;f(O(t),"ui object pos must be a vec2"),f(O(e),"ui object size must be a vec2"),this.localPos=t.copy(),this.nativePos=t.copy(),this.size=e.copy(),this.color=E.defaultColor.copy(),this.activeColor=void 0,this.text=void 0,this.disabledColor=E.defaultDisabledColor.copy(),this.disabled=!1,this.textColor=E.defaultTextColor.copy(),this.hoverColor=E.defaultHoverColor.copy(),this.lineColor=E.defaultLineColor.copy(),this.gradientColor=E.defaultGradientColor?E.defaultGradientColor.copy():void 0,this.lineWidth=E.defaultLineWidth,this.cornerRadius=E.defaultCornerRadius,this.font=E.defaultFont,this.fontStyle=void 0,this.textWidth=void 0,this.textHeight=void 0,this.textFitScale=E.defaultTextFitScale,this.textShadow=void 0,this.textLineColor=E.defaultLineColor.copy(),this.textLineWidth=0,this.visible=!0,this.children=[],this.parent=void 0,this.extraTouchSize=0,this.soundPress=E.defaultSoundPress,this.soundRelease=E.defaultSoundRelease,this.soundClick=E.defaultSoundClick,this.interactive=!1,this.dragActivate=!1,this.canBeHover=!0,this.shadowColor=(s=E.defaultShadowColor)==null?void 0:s.copy(),this.shadowBlur=E.defaultShadowBlur,this.shadowOffset=(i=E.defaultShadowOffset)==null?void 0:i.copy(),this.navigationIndex=void 0,this.navigationAutoSelect=!1,this.anchor=b(),E.uiObjects.push(this)}addChild(t){return f(!t.parent&&!this.children.includes(t)),this.children.push(t),t.parent=this,t}removeChild(t){f(t.parent===this&&this.children.includes(t)),this.children.splice(this.children.indexOf(t),1),t.parent=void 0}destroy(){var t;if(!this.destroyed){E.activeObject===this&&(E.activeObject=void 0),E.hoverObject===this&&(E.hoverObject=void 0),E.lastHoverObject===this&&(E.lastHoverObject=void 0),E.navigationObject===this&&(E.navigationObject=void 0),E.keyInputObject===this&&(E.keyInputObject=void 0),this.destroyed=1,(t=this.parent)==null||t.removeChild(this);for(let e of this.children)e.parent=void 0,e.destroy();this.children.length=0}}isMouseOverlapping(){if(!oi)return!1;let t=ie?this.size.add(b(this.extraTouchSize||0)):this.size,e=E.screenToNative(Jt);return Qs(this.nativePos,t,e)}update(){if(this.onUpdate(),this.disabled&&(this===E.activeObject&&(E.activeObject=void 0),this===E.keyInputObject&&(E.keyInputObject=void 0)),E.keyInputObject)return;let t=E.lastHoverObject===this,e=this.isActiveObject(),s=cs(0),i=this.dragActivate?s:ps(0);this.canBeHover&&(E.navigationMode||(i||e||!s&&!ie)&&!E.hoverObject&&this.isMouseOverlapping()&&(E.hoverObject=this)),this.isHoverObject()&&(this.disabled||(i&&this.interactive&&((!this.dragActivate||!t||ps(0))&&this.onPress(),this.soundPress&&this.soundPress.play(),E.activeObject&&!e&&E.activeObject.onRelease(),E.activeObject=this,E.activateOnPress&&this.click(!this.soundPress)),E.activateOnPress||!s&&this.isActiveObject()&&this.interactive&&this.click()),i&&Cr(0,0,0,1,0)),e&&(!s||this.dragActivate&&!this.isHoverObject())&&(this.onRelease(),this.soundRelease&&this.soundRelease.play(),E.activeObject=void 0),this.isHoverObject()!==t&&(this.isHoverObject()?this.onEnter():this.onLeave())}render(){if(this.onRender(),!this.size.x||!this.size.y)return;let t=this.isNavigationObject(),e=t?this.color:this.interactive&&this.isActiveObject()&&!this.disabled?this.color:this.lineColor,s=t?this.hoverColor:this.disabled?this.disabledColor:this.interactive?this.isActiveObject()?this.activeColor||this.hoverColor:this.isHoverObject()?this.hoverColor:this.color:this.color,i=this.lineWidth*(t?1.5:1);E.drawRect(this.nativePos,this.size,s,i,e,this.cornerRadius,this.gradientColor,this.shadowColor,this.shadowBlur,this.shadowOffset)}getTextSize(){return b(this.textWidth||this.textFitScale*this.size.x,this.textHeight||this.textFitScale*this.size.y)}navigatePressed(){this.click()}isHoverObject(){return E.hoverObject===this}isActiveObject(){return E.activeObject===this}isNavigationObject(){return E.navigationObject===this}isKeyInputObject(){return E.keyInputObject===this}isInteractive(){return this.interactive&&this.visible&&!this.disabled}toString(){let t="type = "+this.constructor.name;return this.text&&(t+=`
+precision highp float;uniform sampler2D s;uniform vec3 iResolution;out vec4 c;void main(){vec2 uv=gl_FragCoord.xy/iResolution.xy;c=vec4(texture(s,uv).rgb,1.);}`),q.lightVAO=g.createVertexArray(),g.bindVertexArray(q.lightVAO),g.bindBuffer(g.ARRAY_BUFFER,Jn);let r=g.getAttribLocation(q.lightShader,"g");g.enableVertexAttribArray(r),g.vertexAttribPointer(r,2,g.FLOAT,!1,8,0),q.compositeVAO=g.createVertexArray(),g.bindVertexArray(q.compositeVAO),g.bindBuffer(g.ARRAY_BUFFER,Jn);let c=g.getAttribLocation(q.compositeShader,"p");g.enableVertexAttribArray(c),g.vertexAttribPointer(c,2,g.FLOAT,!1,8,0)}function i(){if(B||!G||!q.enabled||!q.texture)return;Lt();let r=Mn,c=q.ambientColor;g.bindFramebuffer(g.FRAMEBUFFER,kr),g.framebufferTexture2D(g.FRAMEBUFFER,g.COLOR_ATTACHMENT0,g.TEXTURE_2D,q.texture,0),g.viewport(0,0,q.textureSize.x,q.textureSize.y),g.clearColor(c.r,c.g,c.b,c.a),g.clear(g.COLOR_BUFFER_BIT),ps(),g.enable(g.BLEND),g.blendFunc(g.ONE,g.ONE);for(let u of wt)u.destroyed||u.renderLight();Lt(),g.bindFramebuffer(g.FRAMEBUFFER,null),g.viewport(0,0,I.x,I.y),g.useProgram(q.compositeShader),g.bindVertexArray(q.compositeVAO),g.activeTexture(g.TEXTURE0),g.bindTexture(g.TEXTURE_2D,q.texture);let l=q.compositeShader;g.uniform1i(g.getUniformLocation(l,"s"),0),g.uniform3f(g.getUniformLocation(l,"iResolution"),F.width,F.height,1),g.blendFunc(g.DST_COLOR,g.ZERO),g.drawArrays(g.TRIANGLE_STRIP,0,4),te&&g.bindTexture(g.TEXTURE_2D,te),ps(r),Ts(!0)}function o(){q.texture=void 0,q.lightShader=void 0,q.compositeShader=void 0,q.lightVAO=void 0,q.compositeVAO=void 0,St("LightSystemPlugin: WebGL context lost")}function a(){s(),St("LightSystemPlugin: WebGL context restored")}}drawLight(t){if(B||!G||!this.lightShader)return;Lt(),g.useProgram(this.lightShader),g.bindVertexArray(this.lightVAO);let e=b(2*H).divide(I),s=Pt.rotate(-tt),i=b(-1).subtract(s.multiply(e)),o=lt(tt),a=it(tt),r=[e.x*o,e.y*a,0,0,-e.x*a,e.y*o,0,0,1,1,1,0,i.x,i.y,0,1],c=this.lightShader;g.uniformMatrix4fv(g.getUniformLocation(c,"m"),!1,r),g.uniform2f(g.getUniformLocation(c,"lightPos"),t.pos.x,t.pos.y),g.uniform1f(g.getUniformLocation(c,"radius"),t.radius),g.uniform1f(g.getUniformLocation(c,"fadeRange"),t.fadeRange);let l=t.color;g.uniform4f(g.getUniformLocation(c,"color"),l.r,l.g,l.b,l.a),g.drawArrays(g.TRIANGLE_STRIP,0,4),Ts(!0)}},Oo=class extends qe{constructor(t,e,s,i){super(t,b(1),void 0,0,s),p(R(e)&&e>=0,"Light radius must be a non-negative number"),p(i===void 0||R(i)&&i>=0,"Light fadeRange must be a non-negative number when provided"),this.radius=e,this.fadeRange=i===void 0?e:i}render(){}renderLight(){q&&q.drawLight(this)}},Do=class extends xs{constructor(t){super(void 0),!(!Yt||B)&&(this.randomness=0,this.sampleChannels=Cc(...t),this.sampleRate=ts)}playMusic(t=1,e=!0){return super.play(void 0,t,1,0,e)}};Wr=0;Io=class{constructor(t=ut){p(!E,"UI system already initialized"),E=this,this.activateOnPress=!1,this.defaultColor=V,this.defaultLineColor=ot,this.defaultTextColor=ot,this.defaultButtonColor=Ne(0,0,.7),this.defaultHoverColor=Ne(0,0,.9),this.defaultDisabledColor=Ne(0,0,.3),this.defaultGradientColor=void 0,this.defaultLineWidth=4,this.defaultCornerRadius=0,this.defaultTextFitScale=.8,this.defaultFont=Ps,this.defaultSoundPress=void 0,this.defaultSoundRelease=void 0,this.defaultSoundClick=void 0,this.defaultShadowColor=ye,this.defaultShadowBlur=5,this.defaultShadowOffset=b(5),this.nativeHeight=0,this.navigationObject=void 0,this.navigationTimer=new Re(void 0,!0),this.navigationDelay=.2,this.navigationDirection=1,this.navigationMode=!1,this.uiObjects=[],this.uiContext=t,this.activeObject=void 0,this.hoverObject=void 0,this.lastHoverObject=void 0,this.confirmDialog=void 0,this._keyInputObject=void 0,this._onKeyDown=o=>{var a;return(a=this._keyInputObject)==null?void 0:a.onKeyDown(o)},Pn(s,i);function e(o){let a,r;o.parent?(a=o.parent.nativePos,r=o.parent.size):(a=E.screenToNative(I.scale(.5)),r=E.nativeHeight?b(I.x*E.nativeHeight/I.y,E.nativeHeight):I);let c=o.anchor;o.nativePos=a.add(r.multiply(c).scale(.5)).subtract(o.size.multiply(c).scale(.5)).add(o.localPos)}function s(){E.activeObject&&!E.activeObject.visible&&(E.activeObject=void 0),E.lastHoverObject=E.hoverObject,E.hoverObject=void 0,gs(0)&&(E.navigationMode=!1,E.navigationObject=void 0),E.keyInputObject&&(E.activeObject=E.keyInputObject,E.hoverObject=E.keyInputObject,E.navigationMode=!1,E.navigationObject=void 0);let o=E.getNavigableObjects();if(!o.length)E.navigationObject=void 0;else if(!E.keyInputObject){if(o.includes(E.navigationObject)||(E.navigationObject=void 0),re||E.navigationMode&&!E.navigationObject&&(E.navigationObject=o.find(r=>r.navigationAutoSelect)),!E.navigationTimer.active()){let r=ie(E.getNavigationDirection());if(r){let c;if(E.navigationObject){let l=o.indexOf(E.navigationObject),u=oe(l+r,o.length);c=o[u]}else if(c=o.find(l=>l.navigationAutoSelect),!c){let l=r>0?0:o.length-1;c=o[l]}E.navigationObject!==c&&(E.navigationMode=!0,E.hoverObject=void 0,E.navigationObject=c,E.navigationTimer.set(E.navigationDelay),c.soundPress&&c.soundPress.play())}}E.navigationObject&&E.getNavigationWasPressed()&&E.navigationObject.navigatePressed()}for(let r=E.uiObjects.length;r--;){let c=E.uiObjects[r];c.parent||a(c)}E.uiObjects=E.uiObjects.filter(r=>!r.destroyed);function a(r){if(!(r.destroyed||!r.visible)){e(r);for(let c=r.children.length;c--;){let l=r.children[c];l&&a(l)}r.destroyed||r.update()}}}function i(){let o=E.uiContext;if(o.save(),E.nativeHeight){let r=I.y/E.nativeHeight;o.translate(-r*I.x/2,0),o.scale(r,r),o.translate(I.x/2/r,0)}function a(r){if(r.visible){e(r),r.render();for(let c of r.children)a(c)}}if(E.uiObjects.forEach(r=>r.parent||a(r)),Wr>0){let r=function(c,l=!0){l&&(l=!!c.visible),e(c),c.renderDebug(l);for(let u of c.children)r(u,l)};E.uiObjects.forEach(c=>c.parent||r(c))}o.restore()}}drawRect(t,e,s=V,i=0,o=ot,a=0,r,c=ot,l=0,u=b()){p(O(t),"pos must be a vec2"),p(O(e),"size must be a vec2"),p(J(s),"color must be a color"),p(R(i),"lineWidth must be a number"),p(J(o),"lineColor must be a color"),p(R(a),"cornerRadius must be a number");let h=E.uiContext;if(r){let d=h.createLinearGradient(t.x,t.y-e.y/2,t.x,t.y+e.y/2),f=s.toString();d.addColorStop(0,f),d.addColorStop(.5,r.toString()),d.addColorStop(1,f),h.fillStyle=d}else h.fillStyle=s.toString();(l||u.x||u.y)&&c.a>0&&(h.shadowColor=c.toString(),h.shadowBlur=l,h.shadowOffsetX=u.x,h.shadowOffsetY=u.y),h.beginPath(),a&&h.roundRect?h.roundRect(t.x-e.x/2,t.y-e.y/2,e.x,e.y,a):h.rect(t.x-e.x/2,t.y-e.y/2,e.x,e.y),h.fill(),h.shadowColor="#0000",i&&o.a>0&&(h.strokeStyle=o.toString(),h.lineWidth=i,h.stroke())}drawLine(t,e,s=E.defaultLineWidth,i=E.defaultLineColor){p(O(t),"posA must be a vec2"),p(O(e),"posB must be a vec2"),p(R(s),"lineWidth must be a number"),p(J(i),"lineColor must be a color");let o=E.uiContext;o.strokeStyle=i.toString(),o.lineWidth=s,o.beginPath(),o.lineTo(t.x,t.y),o.lineTo(e.x,e.y),o.stroke()}drawTile(t,e,s,i=E.defaultColor,o=0,a=!1,r=ot,c=0,l=b()){let u=E.uiContext;(c||l.x||l.y)&&r.a>0&&(u.shadowColor=r.toString(),u.shadowBlur=c,u.shadowOffsetX=l.x,u.shadowOffsetY=l.y),It(t,e,s,i,o,a,ye,!1,!0,u),u.shadowColor="#0000"}drawText(t,e,s,i=E.defaultColor,o=E.defaultLineWidth,a=E.defaultLineColor,r="center",c=E.defaultFont,l="",u=!0,h=void 0,d=ot,f=0,y=b()){let x=E.uiContext;d.a>0&&(h&&rn(t,e.add(h),s.y,d,o,a,r,c,l,u?s.x:void 0,0,x),(f||y.x||y.y)&&(x.shadowColor=d.toString(),x.shadowBlur=f,x.shadowOffsetX=y.x,x.shadowOffsetY=y.y)),rn(t,e,s.y,i,o,a,r,c,l,u?s.x:void 0,0,x),x.shadowColor="#0000"}setupDragAndDrop(t,e,s,i){if(this._dragListeners)for(let[a,r]of this._dragListeners)document.removeEventListener(a,r);this._dragListeners=[];let o=(a,r)=>{let c=l=>{l.preventDefault(),a&&a(l)};document.addEventListener(r,c),this._dragListeners.push([r,c])};o(t,"drop"),o(e,"dragenter"),o(s,"dragleave"),o(i,"dragover")}screenToNative(t){if(!E.nativeHeight)return t;let e=I.y/E.nativeHeight,s=1/e,i=t.copy();return i.x+=e*I.x/2,i.x*=s,i.y*=s,i.x-=s*I.x/2,i}get keyInputObject(){return this._keyInputObject}set keyInputObject(t){let e=!!this._keyInputObject;this._keyInputObject=t,!e&&t?document.addEventListener("keydown",this._onKeyDown):e&&!t&&document.removeEventListener("keydown",this._onKeyDown)}destroyObjects(){for(let t of this.uiObjects)t.parent||t.destroy();this.uiObjects=this.uiObjects.filter(t=>!t.destroyed),this.activeObject=void 0,this.hoverObject=void 0,this.lastHoverObject=void 0,this.keyInputObject=void 0}getNavigableObjects(){function t(s){if(!(!s.visible||s.disabled)){s.isInteractive()&&s.navigationIndex!==void 0&&e.push(s);for(let i=s.children.length;i--;)t(s.children[i])}}let e=[];for(let s=E.uiObjects.length;s--;){let i=E.uiObjects[s];E.confirmDialog&&i!==E.confirmDialog||i.parent||t(i)}return e.sort((s,i)=>s.navigationIndex-i.navigationIndex),e}getNavigationDirection(){let t=E.navigationDirection===1,e=E.navigationDirection===2;if(zn){let l=ys(0,bt),u=bo(bt);return e?-(l.y||u.y)||l.x||u.x:t?-(l.y||u.y):l.x||u.x}let s="ArrowUp",i="ArrowDown",o="ArrowLeft",a="ArrowRight";if(e)return Dt(s)||Dt(o)?-1:Dt(i)||Dt(a)?1:0;let r=t?s:o,c=t?i:a;return Dt(r)?-1:Dt(c)?1:0}getNavigationOtherDirection(){if(E.navigationDirection===2)return 0;let t=E.navigationDirection===1;if(zn){let i=ys(0,bt),o=bo(bt);return t?i.x||o.x:i.y||o.y}let e=t?"ArrowLeft":"ArrowUp",s=t?"ArrowRight":"ArrowDown";return Dt(e)?-1:Dt(s)?1:0}getNavigationWasPressed(){return zn?Rr(0,bt):Ft("Space")||Ft("Enter")}showConfirmDialog(t="Are you sure?",e,s,i=b(500,250),o="Escape"){p(!E.confirmDialog);let a=E.navigationDirection;E.navigationDirection=2;let r=new ce(b(),i);E.confirmDialog=r,r.onRender=()=>{let f=Ne(0,0,0,.7);E.drawRect(b(),b(1e9),f)},r.onUpdate=()=>{Ft(o)&&d()},r.isMouseOverlapping=()=>!0;let c=50,l=new vi(b(0,-50),b(i.x-c,70),t);r.addChild(l);let u=new _s(b(-80,50),b(120,70),"Yes");u.textHeight=40,u.navigationIndex=1,u.hoverColor=Ne(0,1,.5),u.onClick=()=>{d(),e&&e()},r.addChild(u);let h=new _s(b(80,50),b(120,70),"No");h.textHeight=40,h.navigationIndex=2,h.navigationAutoSelect=!0,h.onClick=()=>{d(),s&&s()},r.addChild(h);function d(){p(E.confirmDialog===r),r.destroy(),E.confirmDialog=void 0,E.navigationDirection=a,Gs()}}},ce=class{constructor(t=b(),e=b()){var s,i;p(O(t),"ui object pos must be a vec2"),p(O(e),"ui object size must be a vec2"),this.localPos=t.copy(),this.nativePos=t.copy(),this.size=e.copy(),this.color=E.defaultColor.copy(),this.activeColor=void 0,this.text=void 0,this.disabledColor=E.defaultDisabledColor.copy(),this.disabled=!1,this.textColor=E.defaultTextColor.copy(),this.hoverColor=E.defaultHoverColor.copy(),this.lineColor=E.defaultLineColor.copy(),this.gradientColor=E.defaultGradientColor?E.defaultGradientColor.copy():void 0,this.lineWidth=E.defaultLineWidth,this.cornerRadius=E.defaultCornerRadius,this.font=E.defaultFont,this.fontStyle=void 0,this.textWidth=void 0,this.textHeight=void 0,this.textFitScale=E.defaultTextFitScale,this.textShadow=void 0,this.textLineColor=E.defaultLineColor.copy(),this.textLineWidth=0,this.visible=!0,this.children=[],this.parent=void 0,this.extraTouchSize=0,this.soundPress=E.defaultSoundPress,this.soundRelease=E.defaultSoundRelease,this.soundClick=E.defaultSoundClick,this.interactive=!1,this.dragActivate=!1,this.canBeHover=!0,this.shadowColor=(s=E.defaultShadowColor)==null?void 0:s.copy(),this.shadowBlur=E.defaultShadowBlur,this.shadowOffset=(i=E.defaultShadowOffset)==null?void 0:i.copy(),this.navigationIndex=void 0,this.navigationAutoSelect=!1,this.anchor=b(),E.uiObjects.push(this)}addChild(t){return p(!t.parent&&!this.children.includes(t)),this.children.push(t),t.parent=this,t}removeChild(t){p(t.parent===this&&this.children.includes(t)),this.children.splice(this.children.indexOf(t),1),t.parent=void 0}destroy(){var t;if(!this.destroyed){E.activeObject===this&&(E.activeObject=void 0),E.hoverObject===this&&(E.hoverObject=void 0),E.lastHoverObject===this&&(E.lastHoverObject=void 0),E.navigationObject===this&&(E.navigationObject=void 0),E.keyInputObject===this&&(E.keyInputObject=void 0),this.destroyed=1,(t=this.parent)==null||t.removeChild(this);for(let e of this.children)e.parent=void 0,e.destroy();this.children.length=0}}isMouseOverlapping(){if(!oi)return!1;let t=re?this.size.add(b(this.extraTouchSize||0)):this.size,e=E.screenToNative(Vt);return Qs(this.nativePos,t,e)}update(){if(this.onUpdate(),this.disabled&&(this===E.activeObject&&(E.activeObject=void 0),this===E.keyInputObject&&(E.keyInputObject=void 0)),E.keyInputObject)return;let t=E.lastHoverObject===this,e=this.isActiveObject(),s=ls(0),i=this.dragActivate?s:gs(0);this.canBeHover&&(E.navigationMode||(i||e||!s&&!re)&&!E.hoverObject&&this.isMouseOverlapping()&&(E.hoverObject=this)),this.isHoverObject()&&(this.disabled||(i&&this.interactive&&((!this.dragActivate||!t||gs(0))&&this.onPress(),this.soundPress&&this.soundPress.play(),E.activeObject&&!e&&E.activeObject.onRelease(),E.activeObject=this,E.activateOnPress&&this.click(!this.soundPress)),E.activateOnPress||!s&&this.isActiveObject()&&this.interactive&&this.click()),i&&Cr(0,0,0,1,0)),e&&(!s||this.dragActivate&&!this.isHoverObject())&&(this.onRelease(),this.soundRelease&&this.soundRelease.play(),E.activeObject=void 0),this.isHoverObject()!==t&&(this.isHoverObject()?this.onEnter():this.onLeave())}render(){if(this.onRender(),!this.size.x||!this.size.y)return;let t=this.isNavigationObject(),e=t?this.color:this.interactive&&this.isActiveObject()&&!this.disabled?this.color:this.lineColor,s=t?this.hoverColor:this.disabled?this.disabledColor:this.interactive?this.isActiveObject()?this.activeColor||this.hoverColor:this.isHoverObject()?this.hoverColor:this.color:this.color,i=this.lineWidth*(t?1.5:1);E.drawRect(this.nativePos,this.size,s,i,e,this.cornerRadius,this.gradientColor,this.shadowColor,this.shadowBlur,this.shadowOffset)}getTextSize(){return b(this.textWidth||this.textFitScale*this.size.x,this.textHeight||this.textFitScale*this.size.y)}navigatePressed(){this.click()}isHoverObject(){return E.hoverObject===this}isActiveObject(){return E.activeObject===this}isNavigationObject(){return E.navigationObject===this}isKeyInputObject(){return E.keyInputObject===this}isInteractive(){return this.interactive&&this.visible&&!this.disabled}toString(){let t="type = "+this.constructor.name;return this.text&&(t+=`
 text = `+this.text),(this.nativePos.x||this.nativePos.y)&&(t+=`
 nativePos = `+this.nativePos),(this.localPos.x||this.localPos.y)&&(t+=`
 localPos = `+this.localPos),(this.size.x||this.size.y)&&(t+=`
 size = `+this.size),this.color&&(t+=`
-color = `+this.color),t}renderDebug(t=!0){let e=t?this.isHoverObject()?Ka:this.disabled?tc:this.interactive?rr:Za:Qa;E.drawRect(this.nativePos,this.size,pe,4,e)}click(t=!0){this.onClick(),t&&this.soundClick&&this.soundClick.play()}onUpdate(){}onRender(){}onEnter(){}onLeave(){}onPress(){}onRelease(){}onClick(){}onChange(){}},vi=class extends re{constructor(t,e,s="",i="center",o=E.defaultFont){super(t,e),f(V(s),"ui text must be a string"),f(["left","center","right"].includes(i),"ui text align must be left, center, or right"),f(V(o),"ui text font must be a string"),this.text=s,this.align=i,this.font=o,this.canBeHover=!1,this.color=pe,this.shadowColor=pe,this.gradientColor=void 0,this.lineWidth=0,this.textFitScale=1}render(){super.render();let t=this.getTextSize();E.drawText(this.text,this.nativePos,t,this.textColor,this.textLineWidth,this.textLineColor,this.align,this.font,this.fontStyle,!0,this.textShadow,this.shadowColor,this.shadowBlur,this.shadowOffset)}},Mo=class extends re{constructor(t,e,s=""){super(t,e),f(V(s),"ui text must be a string"),this.maxLength=0,this.text=s,this.interactive=!0,this.canBeHover=!0}click(){E.keyInputObject=this,this.onClick()}stopEditing(){this.isKeyInputObject()&&(this.soundRelease&&this.soundRelease.play(),E.activeObject=void 0,E.keyInputObject=void 0,this.onChange())}onKeyDown(t){let e=t.code,s=t.key;e==="Backspace"?this.text=this.text.slice(0,-1):e==="Enter"||e==="Escape"?this.stopEditing():s.length===1&&(!this.maxLength||this.text.lengththis.size.y,s=e?this.size.y:this.size.x,i=e?this.size.x:this.size.y,o=e?this.nativePos.x:this.nativePos.y,a=i-s,r=o-a/2,c=o+a/2,l=E.screenToNative(Jt);this.value=e?Bt(l.x,r,c):Bt(l.y,c,r)}else if(this.isNavigationObject()){let e=E.getNavigationOtherDirection();E.navigationTimer.active()||(this.value=N(this.value+e*.01))}this.value===t||this.onChange()}render(){super.render();let t=this.size.x>this.size.y,e=t?this.size.x:this.size.y,s=t?this.size.y:this.size.x;if(this.fillMode){let o=tt(s,this.cornerRadius*2),a=Wt(o,e,this.value),r=(a-e)*(t?.5:-.5),c=this.nativePos.add(t?b(r,0):b(0,r)),l=this.disabled?this.disabledColor:this.handleColor,u=t?b(a,this.size.y):b(this.size.x,a);E.drawRect(c,u,l,this.lineWidth,this.lineColor,this.cornerRadius,this.gradientColor)}else{let o=N(t?this.value:1-this.value),a=(e-s)*(o-.5),r=this.nativePos.add(t?b(a,0):b(0,a)),c=this.disabled?this.disabledColor:this.handleColor,l=b(s);E.drawRect(r,l,c,this.lineWidth,this.lineColor,this.cornerRadius,this.gradientColor)}let i=this.getTextSize();E.drawText(this.text,this.nativePos,i,this.textColor,this.textLineWidth,this.textLineColor,this.align,this.font,this.fontStyle,!0,this.textShadow)}navigatePressed(){this.value=this.value?0:1,this.onChange(),this.onRelease(),super.navigatePressed()}},jo=class extends re{constructor(t,e,s,i=!1,o=!1,a=1){super(t,e||b()),f(V(s),"video src must be a string"),f(L(a),"video volume must be a number"),this.color=it,this.cornerRadius=0,this.volume=a,this.video=document.createElement("video"),this.video.loop=o,this.video.volume=N(a*Sn),this.video.muted=!Ht,this.video.style.display="none",this.video.src=s,document.body.appendChild(this.video),i&&this.play()}async play(){try{await this.video.play()}catch{}}pause(){this.video.pause()}stop(){this.video.pause(),this.video.currentTime=0}isLoading(){return this.video.readyState=1,"ui layout columns must be a number >= 1"),f(L(s),"ui layout gap must be a number"),f(L(i),"ui layout padding must be a number"),this.columns=e,this.gap=s,this.padding=i,o&&(this.color=pe,this.gradientColor=void 0,this.lineWidth=0,this.shadowColor=pe),this.relayout()}addChild(t){return super.addChild(t),this.relayout(),t}removeChild(t){super.removeChild(t),this.relayout()}relayout(){let t=this.children.length;if(!t){this.size=b(this.padding*2);return}let e=this.columns,s=us(t/e),i=new Array(e).fill(0),o=new Array(s).fill(0);for(let p=0;p=0&&m.objects.splice(t,1),super.destroy()}updatePhysics(){}render(){this.tileInfo?super.render():this.drawFixtures(this.color,this.lineColor,this.lineWidth)}renderDebugInfo(){let t=!this.getIsAwake(),e=this.getBodyType()===m.bodyTypeStatic,s=J(t?1:0,t?1:0,e?1:0,.5);this.drawFixtures(s)}drawFixtures(t=W,e=it,s=.1,i,o){this.getFixtureList().forEach(a=>{m.castShapeObject(a.GetShape()).GetType()!==m.instance.b2Shape.e_edge&&m.drawFixture(a,this.pos,this.angle,t,e,s,i,o)}),this.edgeLists.forEach(a=>mo(a,s,e,!1,this.pos,this.angle)),this.edgeLoops.forEach(a=>mo(a,s,e,!0,this.pos,this.angle))}beginContact(t){}endContact(t){}addShape(t,e=1,s=.2,i=0,o=!1){f(L(e),"density must be a number"),f(L(s),"friction must be a number"),f(L(i),"restitution must be a number");let a=new m.instance.b2FixtureDef;return a.set_shape(t),a.set_density(e),a.set_friction(s),a.set_restitution(i),a.set_isSensor(o),this.body.CreateFixture(a)}addBox(t=b(1),e=b(),s=0,i,o,a,r){f(O(t),"size must be a Vector2"),f(t.x>0&&t.y>0,"size must be positive"),f(O(e),"offset must be a Vector2"),f(L(s),"angle must be a number");let c=new m.instance.b2PolygonShape;return c.SetAsBox(t.x/2,t.y/2,m.vec2dTo(e),-s),this.addShape(c,i,o,a,r)}addPoly(t,e,s,i,o){f(de(t),"points must be an array");function a(c){f(3<=c.length&&c.length<=8);let l=m.instance._malloc(c.length*8);for(let p=0,d=0;p>2]=c[p].x,d+=4,m.instance.HEAPF32[l+d>>2]=c[p].y,d+=4;let u=m.instance.wrapPointer(l,m.instance.b2Vec2),h=new m.instance.b2PolygonShape;return h.Set(u,c.length),m.instance._free(l),h}let r=a(t);return this.addShape(r,e,s,i,o)}addRegularPoly(t=1,e=8,s,i,o,a){f(L(t)&&t>0,"diameter must be a positive number"),f(L(e)&&e>2,"sides must be a positive number greater than 2");let r=[],c=t/2;for(let l=e;l--;)r.push(b(c,0).rotate((l+.5)/e*X*2));return this.addPoly(r,s,i,o,a)}addRandomPoly(t=1,e,s,i,o){f(L(t)&&t>0,"diameter must be a positive number");let a=or(3,9),r=[],c=t/2;for(let l=a;l--;)r.push(b(dt(c/2,c*1.5),0).rotate(l/a*X*2));return this.addPoly(r,e,s,i,o)}addCircle(t=1,e=b(),s,i,o,a){f(L(t)&&t>0,"diameter must be a positive number"),f(O(e),"offset must be a Vector2");let r=new m.instance.b2CircleShape;return r.set_m_p(m.vec2dTo(e)),r.set_m_radius(t/2),this.addShape(r,s,i,o,a)}addEdge(t,e,s,i,o,a){f(O(t),"point1 must be a Vector2"),f(O(e),"point2 must be a Vector2");let r=new m.instance.b2EdgeShape;return r.Set(m.vec2dTo(t),m.vec2dTo(e)),this.addShape(r,s,i,o,a)}addEdgeList(t,e,s,i,o){f(de(t),"points must be an array");let a=[],r=[];for(let c=0;ct[se(l,t.length)];for(let l=0;lthis.destroyFixture(t))}getCenterOfMass(){return m.vec2From(this.body.GetWorldCenter())}getLinearVelocity(){return m.vec2From(this.body.GetLinearVelocity())}getAngularVelocity(){return this.body.GetAngularVelocity()}getMass(){return this.body.GetMass()}getInertia(){return this.body.GetInertia()}getIsAwake(){return this.body.IsAwake()}getBodyType(){return this.body.GetType()}getSpeed(){return this.getLinearVelocity().length()}setTransform(t,e){this.pos=t,this.angle=e,this.body.SetTransform(m.vec2dTo(t),-e)}setPosition(t){this.setTransform(t,this.body.GetAngle())}setAngle(t){this.setTransform(m.vec2From(this.body.GetPosition()),t)}setLinearVelocity(t){this.body.SetLinearVelocity(m.vec2dTo(t))}setAngularVelocity(t){this.body.SetAngularVelocity(t)}setLinearDamping(t){this.body.SetLinearDamping(t)}setAngularDamping(t){this.body.SetAngularDamping(t)}setGravityScale(t=1){this.body.SetGravityScale(this.gravityScale=t)}setBullet(t=!0){this.body.SetBullet(t)}setAwake(t=!0){this.body.SetAwake(t)}setBodyType(t){this.body.SetType(t)}setSleepingAllowed(t=!0){this.body.SetSleepingAllowed(t)}setFixedRotation(t=!0){this.body.SetFixedRotation(t)}setCenterOfMass(t){this.setMassData(t)}setMass(t){this.setMassData(void 0,t)}setMomentOfInertia(t){this.setMassData(void 0,void 0,t)}resetMassData(){this.body.ResetMassData()}setMassData(t,e,s){let i=new m.instance.b2MassData;this.body.GetMassData(i),t!==void 0&&i.set_center(m.vec2dTo(t)),e!==void 0&&i.set_mass(e),s!==void 0&&i.set_I(s),this.body.SetMassData(i)}setFilterData(t=0,e=0,s=0){this.getFixtureList().forEach(i=>{let o=i.GetFilterData();o.set_categoryBits(t),o.set_maskBits(65535&~e),o.set_groupIndex(s)})}setSensor(t=!0){this.getFixtureList().forEach(e=>e.SetSensor(t))}applyForce(t,e){e||(e=this.getCenterOfMass()),this.setAwake(),this.body.ApplyForce(m.vec2dTo(t),m.vec2dTo(e))}applyAcceleration(t,e){e||(e=this.getCenterOfMass()),this.setAwake();let s=t.scale(this.getMass());this.body.ApplyLinearImpulse(m.vec2dTo(s),m.vec2dTo(e))}applyImpulse(t,e){e||(e=this.getCenterOfMass()),this.setAwake(),this.body.ApplyLinearImpulse(m.vec2dTo(t),m.vec2dTo(e))}applyTorque(t){this.setAwake(),this.body.ApplyTorque(t)}applyAngularAcceleration(t){this.setAwake(),this.body.ApplyAngularImpulse(t*this.getInertia())}applyAngularImpulse(t){this.setAwake(),this.body.ApplyAngularImpulse(t)}hasFixtures(){return!m.isNull(this.body.GetFixtureList())}getFixtureList(){let t=[];for(let e=this.body.GetFixtureList();!m.isNull(e);)t.push(e),e=e.GetNext();return t}hasJoints(){return!m.isNull(this.body.GetJointList())}getJointList(){let t=[];for(let e=this.body.GetJointList();!m.isNull(e);)t.push(e),e=e.get_next();return t}},Si=class extends _s{constructor(t,e,s,i=0,o,a=0){let r=m.bodyTypeStatic;super(t,e,s,i,o,r,a)}},No=class extends _s{constructor(t,e,s,i=0,o,a=0){let r=m.bodyTypeKinematic;super(t,e,s,i,o,r,a)}},zo=class extends Si{constructor(t){f(t instanceof vs,"tileLayer must be a TileCollisionLayer"),super(t.pos,t.size),this.tileLayer=t,this.addChild(t)}render(){}buildCollision(t=.2,e=0){this.destroyAllFixtures(),this.pos=this.tileLayer.pos.copy(),this.size=this.tileLayer.size.copy();let s=[],i=(a,r)=>a+r*this.size.x,o=(a,r)=>!s[i(a,r)]&&this.tileLayer.getCollisionData(b(a,r))>0;for(let a=0;ai.fractiono.pos.distanceSquared(t)0,"Tween duration must be > 0"),this.callback=t,this.start=e,this.end=s,this.duration=i,this.life=i,this.ease=o.ease||Ci.LINEAR,this.useRealTime=!!o.useRealTime,this.paused=!!o.paused,this.thenCallback=void 0,this.loopRemaining=0,$t.push(this),t(this.interp(i))}setEase(t){return this.ease=t,this}then(t){return this.thenCallback=t,this.loopRemaining=0,this}loop(t=1/0){return this.loopRemaining=t,this.thenCallback=()=>Lc(this),this}pingPong(t=1/0){return this.loopRemaining=t,this.thenCallback=()=>Oc(this),this}pause(){this.paused=!0}resume(){this.paused=!1}restart(){this.life=this.duration,this.paused=!1,$t.indexOf(this)<0&&$t.push(this),this.callback(this.interp(this.duration))}isActive(){return!this.paused&&$t.indexOf(this)>=0}getPercent(){return Bt(this.duration-this.life,0,this.duration)}getValue(){return this.interp(this.life)}interp(t){let e=this.ease((this.duration-t)/this.duration);return La(this.start)?this.start.lerp(this.end,e):this.start+(this.end-this.start)*e}stop(){let t=$t.indexOf(this);t>=0&&$t.splice(t,1),this.thenCallback=void 0}},Ci={LINEAR:n=>n,POWER:n=>t=>t**n,SINE:n=>1-lt(n*(X/2)),CIRC:n=>1-(1-n*n)**.5,EXPO:n=>n===0?0:2**(10*n-10),BACK:n=>n*n*(2.70158*n-1.70158),ELASTIC:n=>n===0?0:n===1?1:-(2**(10*n-10))*st((37-40*n)*X/6),SPRING:n=>1-(st(X*(1-n)*(.2+2.5*(1-n)**3))*n**2.2+(1-n))*(1+1.2*n),BOUNCE:n=>{let t=1-n,e;return t<4/11?e=7.5625*t*t:t<8/11?e=7.5625*(t-=6/11)*t+.75:t<10/11?e=7.5625*(t-=9/11)*t+.9375:e=7.5625*(t-=10.5/11)*t+.984375,1-e},IN:n=>n,OUT:n=>t=>1-n(1-t),IN_OUT:n=>Ci.PIECEWISE(n,Ci.OUT(n)),PIECEWISE:(...n)=>{let t=n.length;return e=>{let s=e*t-1e-9>>0;return(n[s]((e-s/t)*t)+s)/t}},BEZIER:(n,t,e,s)=>{let i=o=>{let a=1-o,r=3*a*a*o,c=3*a*o*o,l=o**3;return[r*n+c*e+l,r*t+c*s+l]};return o=>{let a=0,r=1;for(let c=0;c<128;c++){let l=(a+r)/2,[u,h]=i(l);if(nt(u-o)<1e-5)return h;u=this.size.x||e>=this.size.y?null:this.nodes[t+e*this.size.x]}worldToTile(t){let e=this.tileLayer?this.tileLayer.pos.x:0,s=this.tileLayer?this.tileLayer.pos.y:0;return b(St(t.x-e),St(t.y-s))}tileToWorld(t,e){let s=this.tileLayer?this.tileLayer.pos.x:0,i=this.tileLayer?this.tileLayer.pos.y:0;return b(t+.5+s,e+.5+i)}buildNodeData(){let t=this.size.x,e=this.size.y,s=this.tileLayer?this.tileLayer.pos.x:0,i=this.tileLayer?this.tileLayer.pos.y:0;for(let o=0;o0&&(c?l>0&&bt(r.posWorld,lo,J(1,0,0,tt(.2,l*.05)),this.debugTime):bt(r.posWorld,lo,J(1,0,0,.25),this.debugTime))}}aStarSearch(t,e){f(t&&e,"aStarSearch needs both endpoints"),f(t!==e,"aStarSearch: start and end must differ \u2014 caller should handle trivial case"),f(t.walkable&&e.walkable,"aStarSearch: endpoints must be walkable");let s=[t];t.isOpen=!0;let i=0;for(;s.length>0;){let o=0,a=s[0].f;for(let c=1;cthis.maxLoop)break;r.isOpen=!1,s.splice(o,1),r.isClosed=!0,this.debug&&this.debugTime>0&&bt(r.posWorld,lo,J(1,1,1,.05),this.debugTime);for(let c=-1;c<=1;++c)for(let l=-1;l<=1;++l){if(l===0&&c===0)continue;let u=this.getNode(r.pos.x+l,r.pos.y+c);if(!u||!u.walkable||u.isClosed)continue;let h=1;if(l!==0&&c!==0){let v=this.getNode(r.pos.x+l,r.pos.y);if(!v||!v.walkable)continue;let w=this.getNode(r.pos.x,r.pos.y+c);if(!w||!w.walkable)continue;h=fd}let p=r.g+h+u.cost;if(!u.isOpen)u.isOpen=!0,s.push(u);else if(p>=u.g)continue;u.parent=r,u.g=p;let d=nt(e.pos.x-u.pos.x),y=nt(e.pos.y-u.pos.y),x=K(d,y)+(Math.SQRT2-1)*tt(d,y);u.f=u.g+x*this.heuristicWeight}}return e.parent!==null}getNearestClearNode(t,e=10,s=!0){f(O(t),"worldPos must be a Vector2"),s&&this.buildNodeData();let i=this.tileLayer?this.tileLayer.pos.x:0,o=this.tileLayer?this.tileLayer.pos.y:0,a=St(t.x-i),r=St(t.y-o);for(let c=0;c<=e;++c){let l=null,u=0;for(let h=-c;h<=c;++h)for(let p=-c;p<=c;++p){if(c>0&&nt(p)!==c&&nt(h)!==c)continue;let d=this.getNode(a+p,r+h);if(!d||!d.isClear())continue;let y=d.posWorld.x-t.x,x=d.posWorld.y-t.y,v=y*y+x*x;(!l||v0&&Ut(i.posWorld,.3,J(.5,0,.5,.5),this.debugTime),t.splice(e,1),e=K(1,e-1);continue}else if(c===2){this.debug&&this.debugTime>0&&Ut(i.posWorld,.3,J(1,0,0,.5),this.debugTime);let d,y;s.pos.y===i.pos.y&&o.pos.x===i.pos.x?(d=s.pos.x,y=o.pos.y):(d=o.pos.x,y=s.pos.y);let x=this.getNode(d,y);if(x&&x.isClear()){t.splice(e,1),e=K(1,e-1);continue}}else if(c===5){this.debug&&this.debugTime>0&&Ut(i.posWorld,.3,J(1,1,0,.5),this.debugTime);let d=e>=2?t[e-2]:s,y,x,v,w;l===0||h===0?(y=o.pos.x,x=i.pos.y,v=s.pos.x,w=i.pos.y):(y=i.pos.x,x=o.pos.y,v=i.pos.x,w=s.pos.y);let _=y-d.pos.x,S=x-d.pos.y,C=v-d.pos.x,A=w-d.pos.y,T=_*_+S*S,P=C*C+A*A,M=T0&&Ut(i.posWorld,.3,J(0,1,0,.5),this.debugTime),l===h&&u===p){++e;continue}else{let d,y;s.pos.y===o.pos.y?(d=i.pos.x,y=s.pos.y):(d=s.pos.x,y=i.pos.y);let x=this.getNode(d,y);if(x&&x.isClear()){t[e]=x,e=K(1,e-1);continue}}++e}}smoothPathStringPull(t){if(t.length<=2)return;for(let i of t)if(!i.isClear())return;let e=t.slice();t.length=0,t.push(e[0]);let s=0;for(let i=1;i0&&we(o.posWorld,t[t.length-1].posWorld,J(0,0,1,.3),.02,this.debugTime);continue}for(;s=1;--e){let s=t[e-1],i=t[e],o=t[e+1];(i.pos.x-s.pos.x)*(o.pos.y-s.pos.y)===(i.pos.y-s.pos.y)*(o.pos.x-s.pos.x)&&t.splice(e,1)}}isNodeClear(t,e){let s=this.getNode(t,e);return s!==null&&s.isClear()}isLineClear(t,e){f(O(t)&&O(e),"isLineClear needs Vector2 endpoints"),f(this.isNodeClear(t.x,t.y)&&this.isNodeClear(e.x,e.y),"isLineClear endpoints must be in-bounds and clear");let s=e.x-t.x,i=e.y-t.y,o=nt(s),a=nt(i),r=ne(s),c=ne(i),l=t.x,u=t.y;if(a===o){for(;l!==e.x;){if(l!==t.x&&(!this.isNodeClear(l,u)||!this.isNodeClear(l,u-c))||!this.isNodeClear(l,u+c))return!1;l+=r,u+=c}if(!this.isNodeClear(e.x,e.y-c))return!1}else if(ar.posWorld.copy());if(this.debug&&this.debugTime>0&&a.length>0){for(let r=1;rpd,bootGameHost:()=>yd,default:()=>gd});var js=class{constructor(t){this._state=(t==null?2654435769:t)>>>0}next(){this._state=this._state+1831565813>>>0;let t=this._state;return t=Math.imul(t^t>>>15,t|1),t^=t+Math.imul(t^t>>>7,t|61),((t^t>>>14)>>>0)/4294967296}range(t,e){return t+this.next()*(e-t)}reseed(t){this._state=(t==null?2654435769:t)>>>0}},Ji=class{constructor(t){this._clock=t||Jc(),this._origin=this._clock()}nowMs(){return this._clock()}elapsedMs(){return this._clock()-this._origin}},Ui=class{constructor(t){this._time=t,this._subs=new Map}sourceFor(t){let e=this,s=t==null?null:t;return{on(i,o){if(e._assertType(i),typeof o!="function")throw new Error("[HostDevInputBridge] on \u7684 handler \u5FC5\u987B\u662F\u51FD\u6570");let a=e._subs.get(i)||[],r={handler:o,scope:s};return a.push(r),e._subs.set(i,a),{cancel(){let c=e._subs.get(i);if(!c)return;let l=c.indexOf(r);l>=0&&c.splice(l,1)}}},off(i,o){e._assertType(i);let a=e._subs.get(i);if(!a)return;let r=a.findIndex(c=>c.handler===o&&c.scope===s);r>=0&&a.splice(r,1)}}}_emit(t,e){this._assertType(t);let s=e||{},i={type:t,x:typeof s.x=="number"?s.x:0,y:typeof s.y=="number"?s.y:0,key:typeof s.key=="string"?s.key:"",tMs:this._time.nowMs()},o=this._subs.get(t);if(!o||o.length===0)return;let a=o.slice();for(let r of a)try{r.handler(i)}catch(c){qe("[host-dev input] \u8F93\u5165 handler \u629B\u9519\uFF08\u5DF2\u9694\u79BB\uFF09type="+t,c)}}disposeScope(t){if(t==null)return 0;let e=0;for(let[s,i]of this._subs){let o=i.filter(a=>a.scope!==t);e+=i.length-o.length,o.length===0?this._subs.delete(s):this._subs.set(s,o)}return e}_subscriptionCount(){let t=0;for(let e of this._subs.values())t+=e.length;return t}_assertType(t){if(!Vi.has(t))throw new Error("[HostDevInputBridge] \u975E\u6CD5\u8F93\u5165\u4E8B\u4EF6\u7C7B\u578B\uFF1A"+String(t)+"\uFF08\u4EC5\u652F\u6301 "+Array.from(Vi).join("/")+"\uFF09")}},Vi=new Set(["pointerdown","pointermove","pointerup","keydown","keyup"]);function Xr(n){let t=n||{},e=new Ji(t.clock),s=new js(t.seed),i=t.seed==null?2654435769:t.seed>>>0,o=new Ui(e),a=typeof t.audioFactory=="function"?t.audioFactory:null,r=null,c=!1,l=typeof t.engineFactory=="function"?t.engineFactory:null,u=null,h=!1,p=new Map,d=0,y=0;function x(){if(r)return r;if(!a)return c||(qi("[host-dev audio] \u672A\u6CE8\u5165 audioFactory\uFF0CgetAudioContext \u8FD4\u56DE null\uFF08P6 \u987B\u5BB9\u9519\u964D\u7EA7\uFF1B\u96C6\u6210\u6BB5\u6CE8\u5165\u771F\u5B9E\u5DE5\u5382\uFF09"),c=!0),null;try{r=a()}catch(C){qe("[host-dev audio] audioFactory \u629B\u9519\uFF0CgetAudioContext \u964D\u7EA7\u8FD4\u56DE null",C),r=null}return r}function v(){if(u)return u;if(!l)return h||(qi("[host-dev engine] \u672A\u6CE8\u5165 engineFactory\uFF0CgetEngine \u8FD4\u56DE null\uFF08\u63D2\u4EF6\u987B\u5BB9\u9519\u964D\u7EA7\uFF1A\u7C92\u5B50\u9000\u53D7\u63A7\u9762\u81EA\u7BA1/\u5408\u6210\u6838\u9000 vendored/\u6570\u5B66\u9000\u5185\u7F6E\uFF1B\u96C6\u6210\u6BB5\u6CE8\u5165\u771F\u5B9E\u80CC\u4E66\uFF09"),h=!0),null;try{u=l()}catch(C){qe("[host-dev engine] engineFactory \u629B\u9519\uFF0CgetEngine \u964D\u7EA7\u8FD4\u56DE null",C),u=null}return u}function w(C,A){return{getContext2d(){return t.context2d==null?null:t.context2d},onFrame(P){let M=d++;return p.set(M,P),{cancel(){p.delete(M)}}},getInput(){return o.sourceFor(C)},getAudioContext(){return x()},getEngine(){return v()},time:e,random:A}}let _=w(null,s),S={context:_,tick(C){y+=1;let A=Array.from(p.values());for(let T of A)try{T(C,y)}catch(P){qe("[host-dev tick] \u5E27\u56DE\u8C03\u629B\u9519\uFF08\u5DF2\u9694\u79BB\uFF09frame="+y,P)}},frameCount(){return y},inputBridge:o,deriveContextFor(C,A){let T=zc(i,C),P=new js(T);return w(A==null?C:A,P)}};return Object.defineProperty(_,Wi,{value:S,enumerable:!1,writable:!1,configurable:!1}),S}var Wi=Symbol("zaomeng.coreProtocol.contextBundle"),Bs=class{constructor(){this._plugins=new Map,this._initOrder=[],this._initErrors=[],this._phase="idle",this._disposed=!1,this._context=void 0,this._pluginContexts=new Map}register(t){if(!t||typeof t!="object")throw new Error("[PluginRegistry] register \u9700\u8981\u4E00\u4E2A\u63D2\u4EF6\u5BF9\u8C61");if(typeof t.name!="string"||t.name.length===0)throw new Error("[PluginRegistry] \u63D2\u4EF6\u7F3A\u5C11\u5408\u6CD5 name");if(typeof t.version!="string"||t.version.length===0)throw new Error("[PluginRegistry] \u63D2\u4EF6 "+t.name+" \u7F3A\u5C11\u5408\u6CD5 version");if(typeof t.init!="function")throw new Error("[PluginRegistry] \u63D2\u4EF6 "+t.name+" \u7F3A\u5C11 init \u51FD\u6570");if(t.dispose!=null&&typeof t.dispose!="function")throw new Error("[PluginRegistry] \u63D2\u4EF6 "+t.name+" \u7684 dispose \u5FC5\u987B\u662F\u51FD\u6570\u6216\u7701\u7565");if(this._plugins.has(t.name))throw new Error("[PluginRegistry] \u63D2\u4EF6\u91CD\u540D\u62D2\u7EDD\uFF1A"+t.name+" \u5DF2\u6CE8\u518C");return this._plugins.set(t.name,t),this}has(t){return this._plugins.has(t)}get(t){return this._plugins.get(t)}list(){return Array.from(this._plugins.keys())}initAll(){if(this._phase==="initialized")return qi("[PluginRegistry] initAll \u91CD\u590D\u8C03\u7528\uFF0C\u5DF2\u5FFD\u7565\uFF08\u5DF2\u5904\u4E8E initialized\uFF09"),this._initResult();if(this._phase==="disposed")throw new Error("[PluginRegistry] \u5DF2 dispose \u7684\u6CE8\u518C\u5668\u4E0D\u53EF\u518D initAll");if(this._context==null)throw new Error("[PluginRegistry] \u672A\u6CE8\u5165\u53D7\u63A7\u4E0A\u4E0B\u6587\uFF1A\u8BF7\u5728 initAll() \u4E4B\u524D\u8C03\u7528 useContext(context)\u3002\uFF08host-dev \u7528\u6CD5\uFF1Aconst { context } = createHostDevContext(); reg.useContext(context); reg.initAll();\uFF09");for(let[t,e]of this._plugins){let s=this._missingDeps(e);if(s.length>0){let o=new Error("[PluginRegistry] \u63D2\u4EF6 "+t+" \u4F9D\u8D56\u7F3A\u5931\uFF1A"+s.join(", ")+"\uFF08\u672A\u6CE8\u518C\uFF09");this._initErrors.push({name:t,error:o}),qe("[PluginRegistry] \u8DF3\u8FC7 init\uFF08\u4F9D\u8D56\u7F3A\u5931\uFF0C\u5DF2\u9694\u79BB\uFF09\uFF1A"+t,o);continue}let i=this._contextFor(t);try{e.init(i),this._initOrder.push(t)}catch(o){let a=o instanceof Error?o:new Error(String(o));this._initErrors.push({name:t,error:a}),qe("[PluginRegistry] \u63D2\u4EF6 init \u629B\u9519\uFF08\u5DF2\u9694\u79BB\uFF0C\u4E0D\u8FDE\u5750\uFF09\uFF1A"+t,a)}}return this._phase="initialized",this._initResult()}_contextFor(t){let e=this._pluginContexts.get(t);if(e)return e;let s=this._context&&this._context[Wi],i;return s&&typeof s.deriveContextFor=="function"?i=s.deriveContextFor(t,t):i=this._context,this._pluginContexts.set(t,i),i}disposeAll(){if(this._disposed)return{disposed:[],errors:[]};let t=[],e=[],s=this._context&&this._context[Wi],i=s&&s.inputBridge;for(let o=this._initOrder.length-1;o>=0;o--){let a=this._initOrder[o],r=this._plugins.get(a);if(r&&typeof r.dispose=="function")try{r.dispose(),t.push(a)}catch(c){let l=c instanceof Error?c:new Error(String(c));e.push({name:a,error:l}),qe("[PluginRegistry] \u63D2\u4EF6 dispose \u629B\u9519\uFF08\u5DF2\u9694\u79BB\uFF09\uFF1A"+a,l)}if(i&&typeof i.disposeScope=="function")try{i.disposeScope(a)}catch(c){qe("[PluginRegistry] \u56DE\u6536\u63D2\u4EF6\u8F93\u5165\u8BA2\u9605\u629B\u9519\uFF08\u5DF2\u9694\u79BB\uFF09\uFF1A"+a,c)}}return this._disposed=!0,this._phase="disposed",{disposed:t,errors:e}}useContext(t){if(this._phase!=="idle")throw new Error("[PluginRegistry] useContext \u5FC5\u987B\u5728 initAll() \u4E4B\u524D\u8C03\u7528\uFF08\u5F53\u524D\u9636\u6BB5\uFF1A"+this._phase+"\uFF09\u3002\u8BF7\u5728\u4EFB\u4F55 initAll/disposeAll \u4E4B\u524D\u6CE8\u5165\u53D7\u63A7\u4E0A\u4E0B\u6587\u3002");if(t==null||typeof t!="object")throw new Error("[PluginRegistry] useContext \u9700\u8981\u4E00\u4E2A\u53D7\u63A7\u4E0A\u4E0B\u6587\u5BF9\u8C61\u3002\uFF08host-dev \u7528\u6CD5\uFF1Aconst { context } = createHostDevContext(); reg.useContext(context);\uFF09");return this._context=t,this}_missingDeps(t){return!Array.isArray(t.dependencies)||t.dependencies.length===0?[]:t.dependencies.filter(e=>!this._plugins.has(e))}_initResult(){return{ok:this._initErrors.length===0,initialized:this._initOrder.slice(),errors:this._initErrors.slice()}}};function zc(n,t){let e=2166136261,s=16777619,i=n>>>0;for(let a=0;a<32;a+=8){let r=i>>>a&255;e^=r,e=Math.imul(e,s)>>>0}let o=String(t);for(let a=0;a>>0,e^=r>>>8&255,e=Math.imul(e,s)>>>0}return e>>>0}function Jc(){if(typeof globalThis!="undefined"&&globalThis.performance&&typeof globalThis.performance.now=="function")return()=>globalThis.performance.now();if(typeof process!="undefined"&&process.hrtime&&typeof process.hrtime.bigint=="function"){let n=process.hrtime.bigint();return()=>Number(process.hrtime.bigint()-n)/1e6}return()=>Date.now()}function qe(n,t){let e=t&&t.stack?t.stack:t&&t.message?t.message:t;typeof console!="undefined"&&typeof console.error=="function"&&console.error(n+(e?"\uFF1A"+e:""))}function qi(n){typeof console!="undefined"&&typeof console.warn=="function"&&console.warn(n)}var xd=Object.freeze(Array.from(Vi)),Yr="core-protocol-v0";var $r=Object.freeze(["t_boot","t_plugins_ready","t_game_init","t_first_paint","t_input_bound","t_game_start"]),Hi=$r.reduce((n,t,e)=>(n[t]=e,n),Object.create(null)),Uc=new Set($r);function Xi(n){let t=2166136261;for(let e=0;e>>0).toString(16).padStart(8,"0")}var Kr=Xi("runtime-probe::seed::v1");function Ns(n){return n===null||typeof n!="object"?JSON.stringify(n):Array.isArray(n)?"["+n.map(Ns).join(",")+"]":"{"+Object.keys(n).sort().map(e=>JSON.stringify(e)+":"+Ns(n[e])).join(",")+"}"}function Qr(n){let t=Ns(n.extra==null?null:n.extra),e=Ns(Array.isArray(n.pluginSet)?n.pluginSet:[]);return["seq="+n.seq,"anchor="+n.anchor,"tMono="+n.tMono,"buildSha="+(n.buildSha||""),"pluginSet="+e,"extra="+t].join("|")}function Vc(n){return Math.round(n*1e3)/1e3}function Wc(n){if(!Array.isArray(n))return{ok:!1,reason:"records_not_array"};let t=Kr,e=-1;for(let s=0;stypeof C=="string").slice().sort():[],i=typeof t.sink=="function"?t.sink:null,o=t.autoBoot!==!1,a=typeof t.inputAnchorType=="string"?t.inputAnchorType:"pointerdown",r=()=>0,c=!1,l=0,u=Kr,h=[],p=new Set,d=-1,y=null,x=!1,v=!1,w=!1;function _(C,A){let T=null;if(!Uc.has(C))T="unknown_anchor";else{p.has(C)&&(T=T?T+";duplicate_anchor":"duplicate_anchor");let M=Hi[C];MC.time.nowMs(),c=!0,o&&!v&&_("t_boot",{auto:!0}),y=C.getInput().on(a,A=>{x||(x=!0,_("t_input_bound",{firstInput:!0,type:A.type}))}),_("t_input_bound",{stage:"registered",type:a})},dispose(){w||(y&&(y.cancel(),y=null),w=!0)},mark:_,getRecords(){return h.map(C=>({...C}))},toJSONL(){return h.map(C=>JSON.stringify(C)).join(`
-`)},verify(){return Wc(h)}}}function qc(n,t){let e=t&&t.stack?t.stack:t&&t.message?t.message:t;typeof console!="undefined"&&typeof console.error=="function"&&console.error(n+(e?"\uFF1A"+e:""))}function ta(n){let t=n.LJS,e=n.engineMath,s=n.engineMode,i=n.recHook||(()=>{});if(s!=="real")return null;let o=e;return{math:{lerp:(r,c,l)=>(i("math.lerp"),o.lerp(r,c,l)),smoothStep:r=>(i("math.smoothStep"),o.smoothStep(r)),easing:Object.fromEntries(Object.keys(o.easing).map(r=>[r,c=>(i("math.easing."+r),o.easing[r](c))]))},particles:{spawnEmitter(r){i("particles.spawnEmitter");let c=t.screenToWorld(t.vec2(r.pos.x,r.pos.y)),l=t.cameraScale,u=r.emitTime!=null?r.emitTime:r.count!=null?1/60:0,h=r.emitRate!=null?r.emitRate:r.count!=null?r.count*60:100,p=(r.speed!=null?r.speed:0)/l/60,d=r.damping!=null?r.damping:1,y=r.colorStart||{r:1,g:1,b:1,a:1},x=r.colorEnd||{r:1,g:1,b:1,a:0},v=t.rgb(y.r,y.g,y.b,y.a),w=t.rgb(x.r,x.g,x.b,x.a),_=new t.ParticleEmitter(c,r.angle!=null?r.angle:0,(r.emitSize!=null?r.emitSize:0)/l,u,h,r.coneAngle!=null?r.coneAngle:Math.PI,void 0,v,v,w,w,r.particleTime!=null?r.particleTime:.5,(r.sizeStart!=null?r.sizeStart:6)/l,(r.sizeEnd!=null?r.sizeEnd:0)/l,p,0,d,1,r.gravityScale!=null?r.gravityScale:0,Math.PI,.1,0,!1,r.additive!=null?r.additive:!1,!0);return{isActive(){return _.isActive()},stop(){_.destroyed||_.destroy(!0)}}}},audio:{synth:{synthSfx:r=>{i("audio.synth.synthSfx");try{return t.zzfxG(...r)}catch(c){return console.error("[host][engine-audio] zzfxG \u5408\u6210\u5F02\u5E38\uFF0C\u8FD4 null\uFF1A"+(c&&c.message?c.message:c)),null}},synthSong:(r,c,l,u)=>{i("audio.synth.synthSong");try{return t.zzfxM(r,c,l,u)}catch(h){return console.error("[host][engine-audio] zzfxM \u5408\u6210\u5F02\u5E38\uFF0C\u8FD4 null\uFF1A"+(h&&h.message?h.message:h)),null}}}}}}function ce(n){return n<0?0:n>1?1:n}function ea(n){let t=n.Ease,e=t.POWER(2),s=t.POWER(3),i=t.OUT(e),o=t.IN_OUT(e),a=t.OUT(s),r=t.IN_OUT(s),c=t.OUT(t.BACK),l=t.OUT(t.ELASTIC);return{lerp:(u,h,p)=>n.lerp(u,h,p),smoothStep:u=>n.smoothStep(u),easing:{linear:u=>t.LINEAR(ce(u)),quadIn:u=>e(ce(u)),quadOut:u=>i(ce(u)),quadInOut:u=>o(ce(u)),cubicIn:u=>s(ce(u)),cubicOut:u=>a(ce(u)),cubicInOut:u=>r(ce(u)),backIn:u=>t.BACK(ce(u)),backOut:u=>c(ce(u)),elasticIn:u=>t.ELASTIC(ce(u)),elasticOut:u=>l(ce(u))}}}var He=2,zs=1/60;async function na(n){let t=n.canvas,e=n.statusEl||null,s=n.engine,i=n.seed>>>0,o=n.mode||"play",a=n.engineMode||"real",r=n.viewport.w,c=n.viewport.h,l=n.factory,u=n.buildFactoryOpts||(()=>{}),h=n.plugins||{},p=n.registerOrder||Object.values(h),d=n.onReady||(()=>{}),y=n.recHook||(()=>{});function x(D){e&&(e.textContent=D)}let v=[];window.addEventListener("error",D=>v.push({type:"error",message:String(D&&D.message||D)})),window.addEventListener("unhandledrejection",D=>v.push({type:"unhandledrejection",message:String(D&&D.reason&&D.reason.message||D&&D.reason||D)}));let w=null,_=!1;function S(){if(!_)return null;if(w)return w;let D=window.AudioContext||window.webkitAudioContext;return D?(w=new D,w):null}let C=0,A=null,T=null,P=null,M=null,pt=[],at={},ct=null;function yt(D,ot){try{P&&P.mark(D,ot)}catch(ee){v.push({type:"mark",message:String(ee&&ee.message||ee)})}}function Nt(){T&&typeof T._refreshChecklist=="function"&&T._refreshChecklist(at)}async function ge(D,ot){A=Xr({context2d:D,seed:i,audioFactory:S,clock:()=>C,engineFactory:()=>ta({LJS:a==="real"?s:null,engineMath:a==="real"?ea(s):null,engineMode:a,recHook:y})});let ee=new Bs;for(let ye of p)ee.register(ye);ee.useContext(A.context),M=ee.initAll(),pt=ee.list().concat(["runtime-probe"]),P=Zr({pluginSet:pt,inputAnchorType:"pointerdown",autoBoot:!0});let Dt=A.deriveContextFor("runtime-probe","runtime-probe");yt("t_boot",{by:"game-host",stage:"pre-init",engineMode:a}),yt("t_plugins_ready",{initialized:M.initialized.length,ok:M.ok});let Ni=u(A.context,{bundle:A,plugins:h,getRealAudioCtx:()=>w});T=l(Ni),await T.init({ctx:A.context,mainContext:D,canvas:ot(),seed:i}),ct=T&&typeof T._forensicsView=="function"?T._forensicsView():null,yt("t_game_init",{hasForensics:!!ct}),ht(),yt("t_first_paint",{frame:A.frameCount()});try{P.init(Dt)}catch(ye){v.push({type:"probe-init",message:String(ye&&ye.message||ye)})}yt("t_game_start",{mode:o,engineMode:a}),Nt(),d(un,{bundle:A,game:T,probe:P,checklist:at,uncaught:v,pluginSet:pt,initRes:M,getGameForensics:()=>ct,mark:yt,stepOneFrame:ht})}let Pt=null;function ht(D){let ot=typeof D=="number"?D:zs;T&&(C+=ot*1e3,T.update(ot),a==="stub"&&Pt&&T.render(Pt),Nt())}function Lt(D){for(let ot=0;ot{}),T&&typeof T._onAudioUnlock=="function"&&T._onAudioUnlock()}let un={seed:i,mode:o,engineMode:a,protocol:Yr,frameCount:()=>A?A.frameCount():0,stepFrames:Lt,startRaf:()=>F(),stopRaf:()=>k(),tap(D,ot){Pe(),A&&(A.inputBridge._emit("pointerdown",{x:D,y:ot}),A.inputBridge._emit("pointerup",{x:D,y:ot}))},do(D){T&&typeof T._handleAction=="function"&&T._handleAction(D)},state:()=>ct?ct.state():{phase:"booting"}};function hn(D){let ot=A.inputBridge;function ee(Dt,Ni){let ye=D.getBoundingClientRect();return{x:(Dt-ye.left)/ye.width*r,y:(Ni-ye.top)/ye.height*c}}D.addEventListener("pointerdown",Dt=>{Pe(),ot._emit("pointerdown",ee(Dt.clientX,Dt.clientY))}),D.addEventListener("pointermove",Dt=>{ot._emit("pointermove",ee(Dt.clientX,Dt.clientY))}),D.addEventListener("pointerup",Dt=>{ot._emit("pointerup",ee(Dt.clientX,Dt.clientY))}),window.addEventListener("keydown",Dt=>{Pe(),ot._emit("keydown",{key:Dt.key})}),window.addEventListener("keyup",Dt=>ot._emit("keyup",{key:Dt.key}))}let ae=0,Le=!1,te=0;function R(D){if(!Le)return;te===0&&(te=D);let ot=(D-te)/1e3;te=D,ot>.05&&(ot=.05),ht(ot),ae=window.requestAnimationFrame(R)}function F(){a==="stub"&&(Le||(Le=!0,te=0,ae=window.requestAnimationFrame(R)))}function k(){Le=!1,ae&&window.cancelAnimationFrame(ae),ae=0}function j(D){D.width=r*He,D.height=c*He,D.style.width=r+"px",D.style.height=c+"px";let ot=D.getContext("2d",{willReadFrequently:!0});return ot.setTransform(He,0,0,He,0,0),ot}async function $(){let D=j(t);return Pt=D,await ge(D,()=>t),hn(t),o==="evidence"?x(`evidence \u5C31\u7EEA seed=${i} \xB7 \u7528 host \u9A71\u52A8\uFF08stepFrames/tap\uFF09`):(x(`seed=${i} \xB7 \u70B9\u5F00\u59CB\uFF08\u9996\u6B21\u70B9\u51FB\u5F00\u58F0\uFF09`),F()),un}let Z=()=>{},Tt=()=>{};function At(){window.__gameHostEngineInitFired=!0}function Ot(){Z()}function Oe(){}function Zn(){Tt()}function dn(){}async function Fs(D){await ge(D,()=>s.mainCanvas),hn(s.mainCanvas),Z=()=>{T&&(C+=zs*1e3,T.update(zs))},Tt=()=>{if(T){D.save(),D.setTransform(He,0,0,He,0,0);try{D.imageSmoothingEnabled=!1}catch{}T.render(D),D.restore()}},s.mainCanvas&&(s.mainCanvas.id="game-engine"),window.__engine={frame(){return s.frame},time(){return s.time},timeReal(){return s.timeReal},paused(){return s.paused},timeScale(){return s.timeScale},snapshot(){return{frame:s.frame,time:s.time,timeReal:s.timeReal,paused:s.paused,timeScale:s.timeScale}}},x(`engine RAF running \xB7 seed=${i} engine=real`)}if(a!=="real")return await $();if(!s){let D="real \u901A\u9053\u672A\u6CE8\u5165\u5F15\u64CE\uFF08opts.engine \u7F3A\u5931\uFF09\uFF1A\u8BF7\u7ECF entry \u5305\u88C5\u5C42\u542F\u52A8\uFF08host \u4E0D\u76F4\u63A5 import \u5F15\u64CE\uFF0CQ4/Option C\uFF09";throw x("ENGINE INJECT MISSING: "+D),new Error(D)}s.setGLEnable(!1),s.setShowSplashScreen(!1),s.setDebugWatermark(!1),s.setCanvasClearColor(s.BLACK),s.setCanvasFixedSize(s.vec2(r*He,c*He));let Dn=document.createElement("div");return Dn.id="engine-root",document.body.appendChild(Dn),await s.engineInit(At,Ot,Oe,Zn,dn,[],Dn).then(()=>Fs(s.mainContext)).catch(D=>{throw window.__gameHostBootError=String(D&&D.message||D),x("ENGINE INIT FAILED: "+window.__gameHostBootError),D}),un}var Yi=class{constructor(t){let e=t||{},s=typeof e.cellSize=="number"&&e.cellSize>0?e.cellSize:64;this._cellSize=s,this._cells=new Map,this._entries=new Map,this._seq=0}get size(){return this._entries.size}_cellRange(t){let e=this._cellSize,s=Math.floor((t.x-t.hw)/e),i=Math.floor((t.x+t.hw)/e),o=Math.floor((t.y-t.hh)/e),a=Math.floor((t.y+t.hh)/e);return{cx0:s,cy0:o,cx1:i,cy1:a}}insert(t,e){this._entries.has(t)&&this.remove(t);let{cx0:s,cy0:i,cx1:o,cy1:a}=this._cellRange(e),r=[];for(let l=i;l<=a;l++)for(let u=s;u<=o;u++){let h=u+","+l,p=this._cells.get(h);p||(p=new Set,this._cells.set(h,p)),p.add(t),r.push(h)}let c={x:e.x,y:e.y,hw:e.hw,hh:e.hh};this._entries.set(t,{id:t,box:c,seq:this._seq++,cells:r})}remove(t){let e=this._entries.get(t);if(!e)return!1;for(let s of e.cells){let i=this._cells.get(s);i&&(i.delete(t),i.size===0&&this._cells.delete(s))}return this._entries.delete(t),!0}query(t){let{cx0:e,cy0:s,cx1:i,cy1:o}=this._cellRange(t),a=new Set;for(let r=s;r<=o;r++)for(let c=e;c<=i;c++){let l=this._cells.get(c+","+r);if(l)for(let u of l)a.add(u)}return this._collect(a)}queryPoint(t,e){let s=this._cellSize,i=Math.floor(t/s),o=Math.floor(e/s),a=this._cells.get(i+","+o);return a?this._collect(new Set(a)):[]}clear(){this._cells.clear(),this._entries.clear(),this._seq=0}_collect(t){let e=[];for(let s of t){let i=this._entries.get(s);i&&e.push(i)}return e.sort((s,i)=>s.seq-i.seq),e.map(s=>({id:s.id,box:s.box}))}};function sa(n){let t=n||{},e=new Yi({cellSize:t.cellSize}),s=!1;return{name:"collision",version:"1.0.0",dependencies:[],spatial:e,init(o){},dispose(){s||(e.clear(),s=!0)}}}function ia(n){let t=!1;return{name:"physics-lite",version:"1.0.0",dependencies:[],init(s){},dispose(){t||(t=!0)}}}var Hc=["pointerdown","pointermove","pointerup","keydown","keyup"];function zt(n){return n<0?0:n>1?1:n}var Xc=n=>(n=zt(n),n*n),Yc=n=>(n=zt(n),1-(1-n)*(1-n)),$c=n=>(n=zt(n),n<.5?2*n*n:1-Math.pow(-2*n+2,2)/2),Kc=n=>(n=zt(n),n*n*n),Qc=n=>{n=zt(n);let t=1-n;return 1-t*t*t},Zc=n=>(n=zt(n),n<.5?4*n*n*n:1-Math.pow(-2*n+2,3)/2),aa=2*Math.PI/3,oa=2*Math.PI/4.5,tl=n=>(n=zt(n),n===0?0:n===1?1:-Math.pow(2,10*n-10)*Math.sin((n*10-10.75)*aa)),el=n=>(n=zt(n),n===0?0:n===1?1:Math.pow(2,-10*n)*Math.sin((n*10-.75)*aa)+1),nl=n=>(n=zt(n),n===0?0:n===1?1:n<.5?-(Math.pow(2,20*n-10)*Math.sin((20*n-11.125)*oa))/2:Math.pow(2,-20*n+10)*Math.sin((20*n-11.125)*oa)/2+1),Us=1.70158,Js=Us*1.525,ca=Us+1,sl=n=>(n=zt(n),ca*n*n*n-Us*n*n),il=n=>{n=zt(n);let t=n-1;return 1+ca*t*t*t+Us*t*t},ol=n=>(n=zt(n),n<.5?Math.pow(2*n,2)*((Js+1)*2*n-Js)/2:(Math.pow(2*n-2,2)*((Js+1)*(n*2-2)+Js)+2)/2),rl=n=>zt(n),ra=Object.freeze({linear:rl,quadIn:Xc,quadOut:Yc,quadInOut:$c,cubicIn:Kc,cubicOut:Qc,cubicInOut:Zc,elasticIn:tl,elasticOut:el,elasticInOut:nl,backIn:sl,backOut:il,backInOut:ol});var al=["linear","quadIn","quadOut","quadInOut","cubicIn","cubicOut","cubicInOut","elasticIn","elasticOut","elasticInOut","backIn","backOut","backInOut"];function cl(n){let t=n&&n.easing;if(!t)return ra;let e=i=>typeof t[i]=="function"?o=>t[i](zt(o)):ra[i],s={};for(let i of al)s[i]=e(i);return Object.freeze(s)}var $i=class{constructor(t,e,s){let i=s||{};this._time=e,this._windowMs=typeof i.windowMs=="number"&&i.windowMs>0?i.windowMs:120;let o=Array.isArray(i.types)&&i.types.length>0?i.types:Hc;this._records=new Map,this._subs=[],this._disposed=!1;for(let a of o){this._records.set(a,null);let r=t.on(a,c=>{this._records.set(a,c.tMs)});this._subs.push(r)}}consume(t,e){let s=typeof e=="number"?e:this._time.nowMs(),i=this._records.get(t);return i==null?!1:s-i<=this._windowMs?(this._records.set(t,null),!0):(this._records.set(t,null),!1)}peek(t,e){let s=typeof e=="number"?e:this._time.nowMs(),i=this._records.get(t);return i==null?!1:s-i<=this._windowMs}clear(){for(let t of this._records.keys())this._records.set(t,null)}dispose(){if(!this._disposed){for(let t of this._subs)try{t.cancel()}catch(e){}this._subs=[],this._disposed=!0}}};function la(n){let t=n||{},e=null,s=null,i=!1;return{name:"gamefeel",version:"1.0.0",dependencies:[],get inputBuffer(){return e},get easing(){return cl(s)},init(a){let r=a.getInput();e=new $i(r,a.time,{windowMs:t.inputBufferMs,types:t.inputTypes});let c=a.getEngine();s=c?c.math:null},dispose(){i||(e&&(e.dispose(),e=null),s=null,i=!0)}}}function Vs(n,t){let e=t<0?0:t>1?1:t;switch(n&&n.kind){case"constant":return n.value;case"linear":return n.from+(n.to-n.from)*e;case"easeInOut":{let s=e*e*(3-2*e);return n.from+(n.to-n.from)*s}case"decay":{let s=n.power==null?2:n.power,i=Math.pow(1-e,s);return n.to+(n.from-n.to)*i}default:return 0}}var ll=Object.freeze({burst:Object.freeze({mode:"burst",count:24,angle:0,spread:Math.PI,speedMin:80,speedMax:160,lifeMin:.4,lifeMax:.8,gravity:0,drag:0,sizeCurve:{kind:"decay",from:6,to:0,power:1.5},alphaCurve:{kind:"linear",from:1,to:0}}),trail:Object.freeze({mode:"continuous",rate:60,angle:Math.PI,spread:.25,speedMin:20,speedMax:50,lifeMin:.2,lifeMax:.5,gravity:0,drag:1.5,sizeCurve:{kind:"easeInOut",from:4,to:0},alphaCurve:{kind:"decay",from:.8,to:0,power:2}}),drift:Object.freeze({mode:"continuous",rate:12,angle:Math.PI/2,spread:.6,speedMin:10,speedMax:30,lifeMin:1.5,lifeMax:3,gravity:8,drag:.5,sizeCurve:{kind:"constant",value:3},alphaCurve:{kind:"decay",from:.7,to:0,power:1}})});function ul(n){let t=ll[n];return t?Ki(t):null}function Ki(n){let t={};for(let e of Object.keys(n)){let s=n[e];t[e]=s&&typeof s=="object"?Ki(s):s}return t}function hl(n,t,e){let s=n.mode==="continuous";return{pos:{x:t,y:e},angle:n.angle,coneAngle:n.spread,emitSize:0,emitTime:s?0:1/60,emitRate:s?n.rate||0:void 0,count:s?void 0:n.count||0,particleTime:(n.lifeMin+n.lifeMax)/2,speed:(n.speedMin+n.speedMax)/2,gravityScale:n.gravity||0,damping:n.drag!=null?1-n.drag/60:1,sizeStart:Vs(n.sizeCurve,0),sizeEnd:Vs(n.sizeCurve,1),colorStart:{r:1,g:1,b:1,a:Vs(n.alphaCurve,0)},colorEnd:{r:1,g:1,b:1,a:Vs(n.alphaCurve,1)},additive:!1}}function ua(n){let t=n||{},e=null,s=null,i=null,o=new Map,a=0,r={isActive(){return!1},stop(){}},c=0,l=1,u=0,h=0,p=0,d={x:0,y:0,remain:0,dur:0,amplitude:0,frequency:0,_phase:0},y={alpha:0,remain:0,dur:0,peak:0},x={scale:1,remain:0,dur:0,amplitude:0,frequency:0},v=!1;function w(A){if(u>0)if(u-=A,u<=0)u=0,l=1;else{let T=h>0?1-u/h:1;l=p+(1-p)*T}if(d.remain>0)if(d.remain-=A,d.remain<=0)d.remain=0,d.x=0,d.y=0;else{let T=d.remain/d.dur,P=d.amplitude*T;d._phase+=d.frequency*A*Math.PI*2,d.x=Math.sin(d._phase)*P,d.y=Math.cos(d._phase*1.3)*P}if(y.remain>0&&(y.remain-=A,y.remain<=0?(y.remain=0,y.alpha=0):y.alpha=y.peak*(y.remain/y.dur)),x.remain>0)if(x.remain-=A,x.remain<=0)x.remain=0,x.scale=1;else{let T=x.remain/x.dur,P=(1-T)*x.frequency*Math.PI*2;x.scale=1+Math.sin(P)*x.amplitude*T}}function _(A){c+=1,w(A)}function S(A){let T=A!==void 0?A:e?e.getContext2d():null;if(T&&y.alpha>0){T.globalAlpha=y.alpha,T.fillStyle="#ffffff";let P=T.canvas?T.canvas.width:0,M=T.canvas?T.canvas.height:0;T.fillRect(0,0,P,M),T.globalAlpha=1}}return{name:"particles-juice",version:"1.0.0",dependencies:[],init(A){var T;e=A,i=((T=A.getEngine())==null?void 0:T.particles)||null,typeof t.seed=="number"&&A.random.reseed(t.seed),t.autoStep!==!1&&(s=A.onFrame(P=>{_(P)}))},dispose(){v||(s&&(s.cancel(),s=null),o.forEach(A=>{try{A.stop()}catch{}}),o.clear(),l=1,u=0,d.remain=0,d.x=0,d.y=0,y.remain=0,y.alpha=0,x.remain=0,x.scale=1,v=!0)},spawnEmitter(A,T,P,M){let pt=typeof A=="string"?ul(A):Ki(A);if(!pt)return-1;M&&(pt=Object.assign(pt,M));let at=a++;if(!i)return o.set(at,r),at;let ct=i.spawnEmitter(hl(pt,T,P));return o.set(at,ct),at},stopEmitter(A){let T=o.get(A);if(T)try{T.stop()}catch{}},step(A){_(A)},render(A){S(A)},particleCount(){return 0},emitterCount(){let A=0;for(let T of o.values())T.isActive()&&(A+=1);return A},hitStop(A,T){h=Math.max(0,A),u=h,p=T==null?0:Math.max(0,Math.min(1,T)),l=h>0?p:1},getTimeScale(){return l},shakeScreen(A,T,P){d.dur=Math.max(0,A),d.remain=d.dur,d.amplitude=Math.max(0,T),d.frequency=P==null?30:P,d._phase=0,d.x=0,d.y=0},getShakeOffset(){return{x:d.x,y:d.y}},flashScreen(A,T){y.dur=Math.max(0,A),y.remain=y.dur,y.peak=T==null?.8:Math.max(0,Math.min(1,T)),y.alpha=y.dur>0?y.peak:0},getFlashAlpha(){return y.alpha},pulseScale(A,T,P){x.dur=Math.max(0,A),x.remain=x.dur,x.amplitude=T==null?.2:T,x.frequency=P==null?4:P,x.scale=1},getPulseScale(){return x.scale},juiceSnapshot(){return{timeScale:l,shake:{x:d.x,y:d.y},flashAlpha:y.alpha,pulseScale:x.scale}},probe(){return{particles:0,emitters:o.size,dropped:0,steps:c,disposed:v}}}}function ha(n){let t=gt(n.r)/255,e=gt(n.g)/255,s=gt(n.b)/255,i=Math.max(t,e,s),o=Math.min(t,e,s),a=(i+o)/2,r=0,c=0,l=i-o;return l>1e-12&&(c=a>.5?l/(2-i-o):l/(i+o),i===t?r=(e-s)/l%6:i===e?r=(s-t)/l+2:r=(t-e)/l+4,r*=60,r<0&&(r+=360)),{h:r,s:c,l:a}}function da(n){let t=(n.h%360+360)%360,e=Xe(n.s),s=Xe(n.l);if(e<1e-12){let r=Math.round(s*255);return{r,g:r,b:r}}let i=s<.5?s*(1+e):s+e-s*e,o=2*s-i,a=t/360;return{r:Math.round(Qi(o,i,a+1/3)*255),g:Math.round(Qi(o,i,a)*255),b:Math.round(Qi(o,i,a-1/3)*255)}}function Qi(n,t,e){let s=e;return s<0&&(s+=1),s>1&&(s-=1),s<1/6?n+(t-n)*6*s:s<1/2?t:s<2/3?n+(t-n)*(2/3-s)*6:n}function gt(n){return n<0?0:n>255?255:n}function Xe(n){return n<0?0:n>1?1:n}function dl(n,t){let e=pl(n.from,t);if(e>=0&&e({r:gt(r.r),g:gt(r.g),b:gt(r.b)})),to:o}}function Zi(n,t,e){return n+(t-n)*e}function ml(n,t){let e=ha(n),s=e.h+(t.hue||0),i=Xe(e.s*(t.sat==null?1:t.sat)),o=Xe(e.l*(t.light==null?1:t.light));return da({h:s,s:i,l:o})}var bl=Object.freeze([Object.freeze([0,8,2,10]),Object.freeze([12,4,14,6]),Object.freeze([3,11,1,9]),Object.freeze([15,7,13,5])]);function fa(n){let t=n||{},e=null,s=!1,i={vignette:{enabled:to(t.vignette&&t.vignette.enabled,!1),strength:eo(t.vignette&&t.vignette.strength,.5)},dither:{enabled:to(t.dither&&t.dither.enabled,!1),strength:eo(t.dither&&t.dither.strength,.5)},scanline:{enabled:to(t.scanline&&t.scanline.enabled,!1),strength:eo(t.scanline&&t.scanline.strength,.5)}};function o(r){let c=r!==void 0?r:e?e.getContext2d():null;if(!c)return;let l=c.canvas?c.canvas.width:0,u=c.canvas?c.canvas.height:0;if(i.vignette.enabled&&i.vignette.strength>0&&l>0&&u>0){let h=c.createRadialGradient(l/2,u/2,Math.min(l,u)*.25,l/2,u/2,Math.max(l,u)*.75);h.addColorStop(0,"rgba(0,0,0,0)"),h.addColorStop(1,"rgba(0,0,0,"+i.vignette.strength.toFixed(3)+")"),c.fillStyle=h,c.fillRect(0,0,l,u)}if(i.scanline.enabled&&i.scanline.strength>0&&l>0&&u>0){c.fillStyle="rgba(0,0,0,"+(i.scanline.strength*.5).toFixed(3)+")";for(let h=0;h0&&l>0&&u>0&&typeof c.getImageData=="function"&&typeof c.putImageData=="function"){let h=c.getImageData(0,0,l,u);xl(h,i.dither.strength),c.putImageData(h,0,0)}}return{name:"palette-post",version:"1.0.0",dependencies:[],init(r){e=r},dispose(){s||(e=null,s=!0)},applyPaletteMap(r,c){return dl(r,c)},applyPaletteMapToBuffer(r,c){return fl(r,c)},lerpPaletteMap(r,c,l){return yl(r,c,l)},shiftHsl(r,c){return ml(r,c)},rgbToHsl(r){return ha(r)},hslToRgb(r){return da(r)},setPost(r){if(r)for(let c of["vignette","dither","scanline"])r[c]&&(typeof r[c].enabled=="boolean"&&(i[c].enabled=r[c].enabled),typeof r[c].strength=="number"&&(i[c].strength=Xe(r[c].strength)))},getPost(){return{vignette:{enabled:i.vignette.enabled,strength:i.vignette.strength},dither:{enabled:i.dither.enabled,strength:i.dither.strength},scanline:{enabled:i.scanline.enabled,strength:i.scanline.strength}}},renderPost(r){o(r)},probe(){return{disposed:s,post:this.getPost()}}}}function xl(n,t){let e=Xe(t);if(e<=0)return n;let{data:s,width:i}=n,a=255/(Math.max(2,Math.round(16-e*14))-1);for(let r=0;r+3>2)%i,l=Math.floor((r>>2)/i),u=(bl[l&3][c&3]/16-.5)*a;for(let h=0;h<3;h++){let p=s[r+h]+u,d=Math.round(p/a)*a;s[r+h]=d<0?0:d>255?255:d}}return n}function to(n,t){return typeof n=="boolean"?n:t}function eo(n,t){return typeof n=="number"?Xe(n):t}var so=Object.freeze({blip:Object.freeze({name:"blip",params:Object.freeze([.6,0,880,0,.03,.06,1,1.5])}),thud:Object.freeze({name:"thud",params:Object.freeze([.8,0,90,0,.04,.18,0,1,0,0,0,0,0,4])}),chime:Object.freeze({name:"chime",params:Object.freeze([.5,0,660,.02,.12,.3,1,2])})}),pa=Object.keys(so);function vl(n){let t=[];return n==null||typeof n!="object"?{ok:!1,errors:["song \u5FC5\u987B\u662F\u5BF9\u8C61"]}:(!Array.isArray(n.instruments)||n.instruments.length===0?t.push("instruments \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4"):n.instruments.forEach((e,s)=>{(!Array.isArray(e)||e.some(i=>typeof i!="number"||!Number.isFinite(i)))&&t.push(`instruments[${s}] \u5FC5\u987B\u662F\u6709\u9650\u6570\u5B57\u6570\u7EC4\uFF08ZzFX \u53C2\u6570\u5305\uFF09`)}),!Array.isArray(n.patterns)||n.patterns.length===0?t.push("patterns \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4"):n.patterns.forEach((e,s)=>{if(!Array.isArray(e)||e.length===0){t.push(`patterns[${s}] \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4\uFF08\u81F3\u5C11\u4E00\u4E2A\u58F0\u90E8\u901A\u9053\uFF09`);return}e.forEach((i,o)=>{if(!Array.isArray(i)||i.length<2){t.push(`patterns[${s}][${o}] \u901A\u9053\u81F3\u5C11\u542B [\u4E50\u5668\u7D22\u5F15, \u58F0\u50CF]`);return}if(i.some(c=>typeof c!="number"||!Number.isFinite(c))){t.push(`patterns[${s}][${o}] \u901A\u9053\u5FC5\u987B\u5168\u4E3A\u6709\u9650\u6570\u5B57`);return}let a=i[0]|0;Array.isArray(n.instruments)&&(a<0||a>=n.instruments.length)&&t.push(`patterns[${s}][${o}] \u4E50\u5668\u7D22\u5F15 ${a} \u8D8A\u754C\uFF08instruments \u957F\u5EA6 ${n.instruments.length}\uFF09`);let r=i[1];(r<-1||r>1)&&t.push(`patterns[${s}][${o}] \u58F0\u50CF ${r} \u8D8A\u754C\uFF08\u5E94 -1..+1\uFF09`)})}),!Array.isArray(n.sequence)||n.sequence.length===0?t.push("sequence \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4"):n.sequence.forEach((e,s)=>{if(typeof e!="number"||!Number.isInteger(e)){t.push(`sequence[${s}] \u5FC5\u987B\u662F\u6574\u6570 pattern \u7D22\u5F15`);return}Array.isArray(n.patterns)&&(e<0||e>=n.patterns.length)&&t.push(`sequence[${s}] \u7D22\u5F15 ${e} \u8D8A\u754C\uFF08patterns \u957F\u5EA6 ${n.patterns.length}\uFF09`)}),n.bpm!=null&&(typeof n.bpm!="number"||!(n.bpm>0))&&t.push("bpm \u5FC5\u987B\u662F\u6B63\u6570"),{ok:t.length===0,errors:t})}function me(n){return typeof n!="number"||Number.isNaN(n)||n<0?0:n>1?1:n}function Sl(n,t){switch(n){case"ease-in":return t*t;case"ease-out":return Math.sqrt(t);case"constant":return 1;default:return t}}function ga(n,t){let e=me(t);return n==null||!Array.isArray(n.voices)?[]:n.voices.map(s=>{let i=String(s&&s.id!=null?s.id:""),o=Array.isArray(s&&s.channelIndices)?s.channelIndices.slice():[],a=typeof s.minIntensity=="number"?me(s.minIntensity):0,r=typeof s.maxIntensity=="number"?me(s.maxIntensity):1,c=typeof s.volumeCurve=="string"?s.volumeCurve:"linear",l=typeof s.baseVolume=="number"?me(s.baseVolume):1;if(er)return{id:i,on:!1,volume:0,channelIndices:o};let u=r-a,h=u<=0?1:(e-a)/u,p=me(Sl(c,h)*l);return{id:i,on:!0,volume:p,channelIndices:o}})}function ya(n,t,e,s){try{let i=t[0]||[],o=t[1]||i,a=Math.max(i.length,o.length);if(a===0)return null;let c=n.createBuffer(2,a,44100);c.getChannelData(0).set(i),c.getChannelData(1).set(o.length?o:i);let l=n.createBufferSource();l.buffer=c,l.loop=!!s;let u=n.createGain();return u.gain.value=me(e*.3),l.connect(u),u.connect(n.destination),l.start(),{stop(){try{l.stop()}catch(h){}try{l.disconnect(),u.disconnect()}catch(h){}}}}catch(i){return io("[audio-music] \u53D7\u63A7\u97F3\u9891\u64AD\u653E\u5F02\u5E38\uFF0C\u964D\u7EA7\u4E3A\u9759\u9ED8",i),null}}function ma(n){let t=n||{},e=typeof t.masterVolume=="number"?me(t.masterVolume):1,s=()=>null,i=null,o=null,a={voices:[]},r=1,c=null,l=!1,u=0,h=!1,p=!1;function d(){let S=s();return S==null?(u+=1,h||(no("[audio-music] \u65E0\u53D7\u63A7\u97F3\u9891\u4E0A\u4E0B\u6587\uFF08getAudioContext \u8FD4\u56DE null\uFF09\uFF0C\u5168\u90E8\u53D1\u58F0\u9759\u9ED8 no-op\uFF08\u8BC4\u4F30\u73AF\u5883\u65E0\u58F0\u5361\u65F6\u7684\u5BB9\u9519\u964D\u7EA7\uFF09"),h=!0),null):S}function y(){if(!o||!i)return null;try{let S=typeof o.bpm=="number"&&o.bpm>0?o.bpm:125;return i.synthSong(o.instruments,o.patterns,o.sequence,S)}catch(S){return io("[audio-music] \u66F2\u8C31\u6E32\u67D3\u5F02\u5E38\uFF0C\u964D\u7EA7\u4E3A\u9759\u9ED8",S),null}}function x(){let S=ga(a,r);if(S.length===0)return 1;let C=0;for(let A of S)A.on&&(C=Math.max(C,A.volume));return C}function v(S,C){typeof C=="number"&&(r=me(C));let A=d();if(A==null||!o)return;w();let T=y();if(!T)return;let P=me(e*x());c=ya(A,T,P,S),l=!!S&&c!=null}function w(){c&&(c.stop(),c=null),l=!1}return{name:"audio-music",version:"1.0.0",dependencies:[],init(S){s=()=>S.getAudioContext();let C=S.getEngine&&S.getEngine();i=C?C.audio.synth:null},dispose(){p||(w(),p=!0)},loadSong(S){let C=vl(S);return C.ok?o={instruments:S.instruments,patterns:S.patterns,sequence:S.sequence,bpm:typeof S.bpm=="number"?S.bpm:125}:no("[audio-music] \u66F2\u8C31\u6821\u9A8C\u5931\u8D25\uFF0C\u672A\u8F7D\u5165\uFF1A"+C.errors.join("\uFF1B")),C},play(S){v(!1,S)},stop(){w()},loop(S){v(!0,S)},setIntensityLayering(S){a=S&&Array.isArray(S.voices)?{voices:S.voices}:{voices:[]}},setIntensity(S){r=me(S)},resolveVoices(S){return ga(a,S)},playSfx(S){let C=so[S];if(!C){no("[audio-music] \u672A\u77E5\u97F3\u6548\u9884\u8BBE\uFF1A"+String(S));return}let A=d();if(A!=null)try{let T=i?i.synthSfx(C.params):null;if(!T)return;ya(A,[T,T],e,!1)}catch(T){io("[audio-music] \u97F3\u6548\u64AD\u653E\u5F02\u5E38\uFF0C\u964D\u7EA7\u4E3A\u9759\u9ED8 name="+S,T)}},getPreset(S){return so[S]},listPresets(){return pa.slice()},probe(){return{hasAudio:s()!=null,hasSong:o!=null,intensity:r,voiceCount:a.voices.length,looping:l,silentNoops:u,presetCount:pa.length}}}}function io(n,t){let e=t&&t.stack?t.stack:t&&t.message?t.message:t;typeof console!="undefined"&&typeof console.error=="function"&&console.error(n+(e?"\uFF1A"+e:""))}function no(n){typeof console!="undefined"&&typeof console.warn=="function"&&console.warn(n)}var wl="zaomeng.save";function Tl(n){if(typeof TextEncoder!="undefined")return new TextEncoder().encode(n).length;if(typeof Buffer!="undefined"&&typeof Buffer.byteLength=="function")return Buffer.byteLength(n,"utf8");let t=0;for(let e=0;e=55296&&s<=56319?(t+=4,e++):t+=3}return t}function ro(){let n=new Map;return{getItem(t){return n.has(t)?n.get(t):null},setItem(t,e){n.set(t,e)},removeItem(t){n.delete(t)},keys(){return Array.from(n.keys())}}}function ba(){if(typeof localStorage=="undefined")throw new Error("[save-progress] createLocalStorageAdapter \u9700\u8981\u5168\u5C40 localStorage\uFF08\u4EC5\u6D4F\u89C8\u5668\u96C6\u6210\u6BB5\u53EF\u7528\uFF09\u3002node/host-dev \u8BF7\u7528\u7F3A\u7701\u5185\u5B58 adapter \u6216 createMemoryAdapter()\u3002");return{getItem(n){return localStorage.getItem(n)},setItem(n,t){localStorage.setItem(n,t)},removeItem(n){localStorage.removeItem(n)},keys(){let n=[];for(let t=0;t0?t.namespace:wl;if(e.indexOf(":")>=0)throw new Error('[save-progress] namespace \u4E0D\u5F97\u542B\u5206\u9694\u7B26 ":"\uFF08\u5F53\u524D="'+e+'"\uFF09');let s=typeof t.maxValueBytes=="number"&&t.maxValueBytes>0?Math.floor(t.maxValueBytes):32768,i=!Al(t.adapter),o=i?ro():t.adapter,a=e+":",r=0,c=0,l=!1;function u(d){return typeof d!="string"||d.length===0?a+String(d):a+d}function h(){try{let d=o.keys();return Array.isArray(d)?d.filter(y=>typeof y=="string"&&y.indexOf(a)===0):[]}catch(d){return ts("[save-progress] adapter.keys() \u5F02\u5E38\uFF0C\u964D\u7EA7\u8FD4\u56DE\u7A7A\u96C6",d),[]}}return{name:"save-progress",version:"1.0.0",dependencies:[],init(d){h()},dispose(){},get(d,y){if(!oo(d))return y;let x;try{x=o.getItem(u(d))}catch(v){return ts("[save-progress] adapter.getItem \u5F02\u5E38\uFF0C\u8FD4\u56DE\u9ED8\u8BA4\u503C key="+d,v),y}if(x==null)return y;try{return JSON.parse(x)}catch{return r+=1,l||(es("[save-progress] \u68C0\u6D4B\u5230\u635F\u574F\u5B58\u6863\uFF08\u975E\u6CD5 JSON\uFF09\uFF0C\u5DF2\u5BB9\u9519\u56DE\u9000\u9ED8\u8BA4\u503C key="+d),l=!0),y}},set(d,y){if(!oo(d))return es("[save-progress] set \u6536\u5230\u975E\u6CD5 key\uFF0C\u62D2\u7EDD\u5199\u5165\uFF1A"+String(d)),!1;let x;try{x=JSON.stringify(y)}catch{return c+=1,es("[save-progress] \u503C\u4E0D\u53EF JSON \u5E8F\u5217\u5316\uFF08\u5FAA\u73AF\u5F15\u7528?\uFF09\uFF0C\u62D2\u7EDD\u5199\u5165 key="+d),!1}if(x===void 0)return c+=1,es("[save-progress] \u503C\u5E8F\u5217\u5316\u4E3A undefined\uFF08\u5982\u7EAF undefined/\u51FD\u6570\uFF09\uFF0C\u62D2\u7EDD\u5199\u5165 key="+d),!1;let v=Tl(x);if(v>s)return c+=1,es("[save-progress] \u503C\u8D85\u5B57\u8282\u4E0A\u9650\u62D2\u7EDD\u5199\u5165 key="+d+"\uFF08"+v+" > "+s+" bytes\uFF09"),!1;try{return o.setItem(u(d),x),!0}catch(w){return c+=1,ts("[save-progress] adapter.setItem \u5F02\u5E38\uFF0C\u5199\u5165\u5931\u8D25 key="+d,w),!1}},remove(d){if(oo(d))try{o.removeItem(u(d))}catch(y){ts("[save-progress] adapter.removeItem \u5F02\u5E38\uFF08\u5DF2\u5FFD\u7565\uFF09key="+d,y)}},clear(){let d=h(),y=0;for(let x of d)try{o.removeItem(x),y+=1}catch(v){ts("[save-progress] clear \u65F6 removeItem \u5F02\u5E38\uFF08\u5DF2\u8DF3\u8FC7\uFF09fullKey="+x,v)}return y},probe(){return{namespace:e,maxValueBytes:s,usingMemoryAdapter:i,size:h().length,corruptRecoveries:r,rejectedWrites:c}}}}function oo(n){return typeof n=="string"&&n.length>0}function Al(n){return!!n&&typeof n.getItem=="function"&&typeof n.setItem=="function"&&typeof n.removeItem=="function"&&typeof n.keys=="function"}function ts(n,t){let e=t&&t.stack?t.stack:t&&t.message?t.message:t;typeof console!="undefined"&&typeof console.error=="function"&&console.error(n+(e?"\uFF1A"+e:""))}function es(n){typeof console!="undefined"&&typeof console.warn=="function"&&console.warn(n)}var El={w:390,h:844};function va(n){let t=((n&&n.seed)!=null?n.seed:0)>>>0,e=sa({cellSize:96}),s=ia(),i=la({inputBufferMs:260,inputTypes:["pointerdown"]}),o=ua({seed:t,maxParticles:600}),a=fa({vignette:{enabled:!0,strength:.22}}),r=ma({masterVolume:.8}),c;try{c=ba()}catch(p){console.warn("[generic] localStorage \u4E0D\u53EF\u7528\uFF0C\u5B58\u6863\u9000\u5185\u5B58 adapter\uFF1A"+(p&&p.message)),c=ro()}let l=xa({namespace:"zaomeng-generic",adapter:c});return{plugins:{collision:e,physics:s,gamefeel:i,juice:o,palettePost:a,audioMusic:r,save:l},registerOrder:[e,s,i,o,a,l,r],viewport:El,buildFactoryOpts:(p,d)=>({runtime:{plugins:d.plugins,bundle:d.bundle,getRealAudioCtx:d.getRealAudioCtx}})}}function ns(n){let t=n||{},e=null,s=[],i="booting",o=null,a=0,r={x:0,y:0,vx:0,vy:0,angle:0,radius:15},c=[],l=[],u=0,h={},p=200,d=600,y=2e3,x=.99,v=15,w=30,_=15,S=40,C=80,A=5,T=200,P=3;function M(R){R.x<0?R.x+=390:R.x>390&&(R.x-=390),R.y<0?R.y+=844:R.y>844&&(R.y-=844)}function pt(R,F,k,j){let $=F.x-R.x,Z=F.y-R.y,Tt=R.x-k.x,At=R.y-k.y,Ot=$*$+Z*Z,Oe=2*(Tt*$+At*Z),Zn=Tt*Tt+At*At-j*j,dn=Oe*Oe-4*Ot*Zn;if(dn<0)return!1;dn=Math.sqrt(dn);let Fs=(-Oe-dn)/(2*Ot),Dn=(-Oe+dn)/(2*Ot);return Fs>=0&&Fs<=1||Dn>=0&&Dn<=1}function at(R,F,k,j){let $=R-k,Z=F-j;return Math.sqrt($*$+Z*Z)}function ct(R,F,k,j,$){return{x:R,y:F,vx:j,vy:$,radius:k,isBig:k>=w}}function yt(){c=[];let R=e.random;for(let F=0;F{Z.key&&(h[Z.key]=!0)});s.push(k);let j=F.on("keyup",Z=>{Z.key&&(h[Z.key]=!1)});s.push(j);let $=F.on("pointerdown",()=>{i==="gameover"&&Pe()});s.push($),Lt(),i="playing",o=null}function hn(R){if(i==="gameover")return;let F=e.time.nowMs();h.ArrowLeft&&(r.angle-=P*R),h.ArrowRight&&(r.angle+=P*R),h.ArrowUp&&(r.vx+=Math.cos(r.angle)*T*R,r.vy+=Math.sin(r.angle)*T*R,ge(r.x-Math.cos(r.angle)*20,r.y-Math.sin(r.angle)*20,{r:1,g:.8,b:.2,a:1},{r:1,g:.4,b:0,a:0},5)),h.Space&&ht(),r.vx*=x,r.vy*=x,r.x+=r.vx*R,r.y+=r.vy*R,M(r);for(let k of c)k.x+=k.vx*R,k.y+=k.vy*R,M(k);for(let k=l.length-1;k>=0;k--){let j=l[k],$=j.x,Z=j.y;if(j.x+=j.vx*R,j.y+=j.vy*R,F-j.born>y){l.splice(k,1);continue}if(j.x<0||j.x>390||j.y<0||j.y>844){l.splice(k,1);continue}let Tt=!1;for(let At=c.length-1;At>=0;At--){let Ot=c[At];if(pt({x:$,y:Z},{x:j.x,y:j.y},{x:Ot.x,y:Ot.y},Ot.radius)){Tt=!0,a+=1,ge(j.x,j.y,{r:1,g:.9,b:.5,a:1},{r:1,g:.3,b:0,a:0},30),Pt([1,.1,880,,,.2,,.4]),Ot.isBig&&Nt(Ot),c.splice(At,1);break}}Tt&&l.splice(k,1)}for(let k of c){let j=r.x-k.x,$=r.y-k.y;if(j*j+$*$<(r.radius+k.radius)*(r.radius+k.radius)){i="gameover",o="lose",ge(r.x,r.y,{r:1,g:.2,b:.2,a:1},{r:.5,g:0,b:0,a:0},40),Pt([1,.2,100,,,.5,,1.5]);return}}c.length===0&&(i="gameover",o="win")}function ae(R){R.fillStyle="#0a0a1a",R.fillRect(0,0,390,844);for(let F of c)R.fillStyle=F.isBig?"#8b5e3c":"#a0744a",R.beginPath(),R.arc(F.x,F.y,F.radius,0,Math.PI*2),R.fill(),R.strokeStyle="#d4a76a",R.lineWidth=2,R.stroke();for(let F of l)R.fillStyle="#ffff00",R.beginPath(),R.arc(F.x,F.y,F.radius,0,Math.PI*2),R.fill();R.save(),R.translate(r.x,r.y),R.rotate(r.angle),R.fillStyle=i==="gameover"?"#ff4444":"#44aaff",R.beginPath(),R.moveTo(20,0),R.lineTo(-15,-12),R.lineTo(-10,0),R.lineTo(-15,12),R.closePath(),R.fill(),R.strokeStyle="#ffffff",R.lineWidth=1.5,R.stroke(),R.restore(),R.fillStyle="#ffffff",R.font="bold 16px monospace",R.fillText("Score: "+a,10,30),R.fillText("Asteroids: "+c.length,10,50),R.fillText("Phase: "+i,10,70),i==="gameover"&&(R.fillStyle=o==="win"?"#00ff00":"#ff0000",R.font="bold 28px monospace",R.textAlign="center",R.fillText(o==="win"?"YOU WIN!":"GAME OVER",195,400),R.font="16px monospace",R.fillStyle="#ffffff",R.fillText("Tap to restart",195,430),R.textAlign="start")}function Le(){for(let R of s)try{R.cancel()}catch{}s=[],c=[],l=[],i="booting",o=null}function te(){return{seed:e&&e.random?e.random.seed:null,state:()=>({phase:i,result:o,score:a,asteroidsRemaining:c.length,ship:{x:r.x,y:r.y,angle:r.angle}})}}return{init:un,update:hn,render:ae,destroy:Le,_forensicsView:te}}var pd=ns,gd=ns;async function yd(n){let t=n||{},e=t.engine||await Promise.resolve().then(()=>(Mc(),Ic)),s=(t.seed!=null?t.seed:305441741)>>>0,i=va({seed:s});return na({canvas:t.canvas,statusEl:t.statusEl||null,engine:e,seed:s,mode:t.mode||"play",engineMode:"real",viewport:i.viewport,factory:ns,plugins:i.plugins,registerOrder:i.registerOrder,buildFactoryOpts:i.buildFactoryOpts,recHook:t.recHook||null,onReady:t.onReady||null})}return Nc(md);})();
+color = `+this.color),t}renderDebug(t=!0){let e=t?this.isHoverObject()?Ka:this.disabled?tc:this.interactive?rr:Za:Qa;E.drawRect(this.nativePos,this.size,ye,4,e)}click(t=!0){this.onClick(),t&&this.soundClick&&this.soundClick.play()}onUpdate(){}onRender(){}onEnter(){}onLeave(){}onPress(){}onRelease(){}onClick(){}onChange(){}},vi=class extends ce{constructor(t,e,s="",i="center",o=E.defaultFont){super(t,e),p(U(s),"ui text must be a string"),p(["left","center","right"].includes(i),"ui text align must be left, center, or right"),p(U(o),"ui text font must be a string"),this.text=s,this.align=i,this.font=o,this.canBeHover=!1,this.color=ye,this.shadowColor=ye,this.gradientColor=void 0,this.lineWidth=0,this.textFitScale=1}render(){super.render();let t=this.getTextSize();E.drawText(this.text,this.nativePos,t,this.textColor,this.textLineWidth,this.textLineColor,this.align,this.font,this.fontStyle,!0,this.textShadow,this.shadowColor,this.shadowBlur,this.shadowOffset)}},Mo=class extends ce{constructor(t,e,s=""){super(t,e),p(U(s),"ui text must be a string"),this.maxLength=0,this.text=s,this.interactive=!0,this.canBeHover=!0}click(){E.keyInputObject=this,this.onClick()}stopEditing(){this.isKeyInputObject()&&(this.soundRelease&&this.soundRelease.play(),E.activeObject=void 0,E.keyInputObject=void 0,this.onChange())}onKeyDown(t){let e=t.code,s=t.key;e==="Backspace"?this.text=this.text.slice(0,-1):e==="Enter"||e==="Escape"?this.stopEditing():s.length===1&&(!this.maxLength||this.text.lengththis.size.y,s=e?this.size.y:this.size.x,i=e?this.size.x:this.size.y,o=e?this.nativePos.x:this.nativePos.y,a=i-s,r=o-a/2,c=o+a/2,l=E.screenToNative(Vt);this.value=e?Bt(l.x,r,c):Bt(l.y,c,r)}else if(this.isNavigationObject()){let e=E.getNavigationOtherDirection();E.navigationTimer.active()||(this.value=j(this.value+e*.01))}this.value===t||this.onChange()}render(){super.render();let t=this.size.x>this.size.y,e=t?this.size.x:this.size.y,s=t?this.size.y:this.size.x;if(this.fillMode){let o=et(s,this.cornerRadius*2),a=Ht(o,e,this.value),r=(a-e)*(t?.5:-.5),c=this.nativePos.add(t?b(r,0):b(0,r)),l=this.disabled?this.disabledColor:this.handleColor,u=t?b(a,this.size.y):b(this.size.x,a);E.drawRect(c,u,l,this.lineWidth,this.lineColor,this.cornerRadius,this.gradientColor)}else{let o=j(t?this.value:1-this.value),a=(e-s)*(o-.5),r=this.nativePos.add(t?b(a,0):b(0,a)),c=this.disabled?this.disabledColor:this.handleColor,l=b(s);E.drawRect(r,l,c,this.lineWidth,this.lineColor,this.cornerRadius,this.gradientColor)}let i=this.getTextSize();E.drawText(this.text,this.nativePos,i,this.textColor,this.textLineWidth,this.textLineColor,this.align,this.font,this.fontStyle,!0,this.textShadow)}navigatePressed(){this.value=this.value?0:1,this.onChange(),this.onRelease(),super.navigatePressed()}},jo=class extends ce{constructor(t,e,s,i=!1,o=!1,a=1){super(t,e||b()),p(U(s),"video src must be a string"),p(R(a),"video volume must be a number"),this.color=ot,this.cornerRadius=0,this.volume=a,this.video=document.createElement("video"),this.video.loop=o,this.video.volume=j(a*An),this.video.muted=!Yt,this.video.style.display="none",this.video.src=s,document.body.appendChild(this.video),i&&this.play()}async play(){try{await this.video.play()}catch{}}pause(){this.video.pause()}stop(){this.video.pause(),this.video.currentTime=0}isLoading(){return this.video.readyState=1,"ui layout columns must be a number >= 1"),p(R(s),"ui layout gap must be a number"),p(R(i),"ui layout padding must be a number"),this.columns=e,this.gap=s,this.padding=i,o&&(this.color=ye,this.gradientColor=void 0,this.lineWidth=0,this.shadowColor=ye),this.relayout()}addChild(t){return super.addChild(t),this.relayout(),t}removeChild(t){super.removeChild(t),this.relayout()}relayout(){let t=this.children.length;if(!t){this.size=b(this.padding*2);return}let e=this.columns,s=hs(t/e),i=new Array(e).fill(0),o=new Array(s).fill(0);for(let d=0;d=0&&m.objects.splice(t,1),super.destroy()}updatePhysics(){}render(){this.tileInfo?super.render():this.drawFixtures(this.color,this.lineColor,this.lineWidth)}renderDebugInfo(){let t=!this.getIsAwake(),e=this.getBodyType()===m.bodyTypeStatic,s=z(t?1:0,t?1:0,e?1:0,.5);this.drawFixtures(s)}drawFixtures(t=V,e=ot,s=.1,i,o){this.getFixtureList().forEach(a=>{m.castShapeObject(a.GetShape()).GetType()!==m.instance.b2Shape.e_edge&&m.drawFixture(a,this.pos,this.angle,t,e,s,i,o)}),this.edgeLists.forEach(a=>mo(a,s,e,!1,this.pos,this.angle)),this.edgeLoops.forEach(a=>mo(a,s,e,!0,this.pos,this.angle))}beginContact(t){}endContact(t){}addShape(t,e=1,s=.2,i=0,o=!1){p(R(e),"density must be a number"),p(R(s),"friction must be a number"),p(R(i),"restitution must be a number");let a=new m.instance.b2FixtureDef;return a.set_shape(t),a.set_density(e),a.set_friction(s),a.set_restitution(i),a.set_isSensor(o),this.body.CreateFixture(a)}addBox(t=b(1),e=b(),s=0,i,o,a,r){p(O(t),"size must be a Vector2"),p(t.x>0&&t.y>0,"size must be positive"),p(O(e),"offset must be a Vector2"),p(R(s),"angle must be a number");let c=new m.instance.b2PolygonShape;return c.SetAsBox(t.x/2,t.y/2,m.vec2dTo(e),-s),this.addShape(c,i,o,a,r)}addPoly(t,e,s,i,o){p(pe(t),"points must be an array");function a(c){p(3<=c.length&&c.length<=8);let l=m.instance._malloc(c.length*8);for(let d=0,f=0;d>2]=c[d].x,f+=4,m.instance.HEAPF32[l+f>>2]=c[d].y,f+=4;let u=m.instance.wrapPointer(l,m.instance.b2Vec2),h=new m.instance.b2PolygonShape;return h.Set(u,c.length),m.instance._free(l),h}let r=a(t);return this.addShape(r,e,s,i,o)}addRegularPoly(t=1,e=8,s,i,o,a){p(R(t)&&t>0,"diameter must be a positive number"),p(R(e)&&e>2,"sides must be a positive number greater than 2");let r=[],c=t/2;for(let l=e;l--;)r.push(b(c,0).rotate((l+.5)/e*Y*2));return this.addPoly(r,s,i,o,a)}addRandomPoly(t=1,e,s,i,o){p(R(t)&&t>0,"diameter must be a positive number");let a=or(3,9),r=[],c=t/2;for(let l=a;l--;)r.push(b(dt(c/2,c*1.5),0).rotate(l/a*Y*2));return this.addPoly(r,e,s,i,o)}addCircle(t=1,e=b(),s,i,o,a){p(R(t)&&t>0,"diameter must be a positive number"),p(O(e),"offset must be a Vector2");let r=new m.instance.b2CircleShape;return r.set_m_p(m.vec2dTo(e)),r.set_m_radius(t/2),this.addShape(r,s,i,o,a)}addEdge(t,e,s,i,o,a){p(O(t),"point1 must be a Vector2"),p(O(e),"point2 must be a Vector2");let r=new m.instance.b2EdgeShape;return r.Set(m.vec2dTo(t),m.vec2dTo(e)),this.addShape(r,s,i,o,a)}addEdgeList(t,e,s,i,o){p(pe(t),"points must be an array");let a=[],r=[];for(let c=0;ct[oe(l,t.length)];for(let l=0;lthis.destroyFixture(t))}getCenterOfMass(){return m.vec2From(this.body.GetWorldCenter())}getLinearVelocity(){return m.vec2From(this.body.GetLinearVelocity())}getAngularVelocity(){return this.body.GetAngularVelocity()}getMass(){return this.body.GetMass()}getInertia(){return this.body.GetInertia()}getIsAwake(){return this.body.IsAwake()}getBodyType(){return this.body.GetType()}getSpeed(){return this.getLinearVelocity().length()}setTransform(t,e){this.pos=t,this.angle=e,this.body.SetTransform(m.vec2dTo(t),-e)}setPosition(t){this.setTransform(t,this.body.GetAngle())}setAngle(t){this.setTransform(m.vec2From(this.body.GetPosition()),t)}setLinearVelocity(t){this.body.SetLinearVelocity(m.vec2dTo(t))}setAngularVelocity(t){this.body.SetAngularVelocity(t)}setLinearDamping(t){this.body.SetLinearDamping(t)}setAngularDamping(t){this.body.SetAngularDamping(t)}setGravityScale(t=1){this.body.SetGravityScale(this.gravityScale=t)}setBullet(t=!0){this.body.SetBullet(t)}setAwake(t=!0){this.body.SetAwake(t)}setBodyType(t){this.body.SetType(t)}setSleepingAllowed(t=!0){this.body.SetSleepingAllowed(t)}setFixedRotation(t=!0){this.body.SetFixedRotation(t)}setCenterOfMass(t){this.setMassData(t)}setMass(t){this.setMassData(void 0,t)}setMomentOfInertia(t){this.setMassData(void 0,void 0,t)}resetMassData(){this.body.ResetMassData()}setMassData(t,e,s){let i=new m.instance.b2MassData;this.body.GetMassData(i),t!==void 0&&i.set_center(m.vec2dTo(t)),e!==void 0&&i.set_mass(e),s!==void 0&&i.set_I(s),this.body.SetMassData(i)}setFilterData(t=0,e=0,s=0){this.getFixtureList().forEach(i=>{let o=i.GetFilterData();o.set_categoryBits(t),o.set_maskBits(65535&~e),o.set_groupIndex(s)})}setSensor(t=!0){this.getFixtureList().forEach(e=>e.SetSensor(t))}applyForce(t,e){e||(e=this.getCenterOfMass()),this.setAwake(),this.body.ApplyForce(m.vec2dTo(t),m.vec2dTo(e))}applyAcceleration(t,e){e||(e=this.getCenterOfMass()),this.setAwake();let s=t.scale(this.getMass());this.body.ApplyLinearImpulse(m.vec2dTo(s),m.vec2dTo(e))}applyImpulse(t,e){e||(e=this.getCenterOfMass()),this.setAwake(),this.body.ApplyLinearImpulse(m.vec2dTo(t),m.vec2dTo(e))}applyTorque(t){this.setAwake(),this.body.ApplyTorque(t)}applyAngularAcceleration(t){this.setAwake(),this.body.ApplyAngularImpulse(t*this.getInertia())}applyAngularImpulse(t){this.setAwake(),this.body.ApplyAngularImpulse(t)}hasFixtures(){return!m.isNull(this.body.GetFixtureList())}getFixtureList(){let t=[];for(let e=this.body.GetFixtureList();!m.isNull(e);)t.push(e),e=e.GetNext();return t}hasJoints(){return!m.isNull(this.body.GetJointList())}getJointList(){let t=[];for(let e=this.body.GetJointList();!m.isNull(e);)t.push(e),e=e.get_next();return t}},Si=class extends Rs{constructor(t,e,s,i=0,o,a=0){let r=m.bodyTypeStatic;super(t,e,s,i,o,r,a)}},Bo=class extends Rs{constructor(t,e,s,i=0,o,a=0){let r=m.bodyTypeKinematic;super(t,e,s,i,o,r,a)}},zo=class extends Si{constructor(t){p(t instanceof Ss,"tileLayer must be a TileCollisionLayer"),super(t.pos,t.size),this.tileLayer=t,this.addChild(t)}render(){}buildCollision(t=.2,e=0){this.destroyAllFixtures(),this.pos=this.tileLayer.pos.copy(),this.size=this.tileLayer.size.copy();let s=[],i=(a,r)=>a+r*this.size.x,o=(a,r)=>!s[i(a,r)]&&this.tileLayer.getCollisionData(b(a,r))>0;for(let a=0;ai.fractiono.pos.distanceSquared(t)0,"Tween duration must be > 0"),this.callback=t,this.start=e,this.end=s,this.duration=i,this.life=i,this.ease=o.ease||Ci.LINEAR,this.useRealTime=!!o.useRealTime,this.paused=!!o.paused,this.thenCallback=void 0,this.loopRemaining=0,Qt.push(this),t(this.interp(i))}setEase(t){return this.ease=t,this}then(t){return this.thenCallback=t,this.loopRemaining=0,this}loop(t=1/0){return this.loopRemaining=t,this.thenCallback=()=>Lc(this),this}pingPong(t=1/0){return this.loopRemaining=t,this.thenCallback=()=>Oc(this),this}pause(){this.paused=!0}resume(){this.paused=!1}restart(){this.life=this.duration,this.paused=!1,Qt.indexOf(this)<0&&Qt.push(this),this.callback(this.interp(this.duration))}isActive(){return!this.paused&&Qt.indexOf(this)>=0}getPercent(){return Bt(this.duration-this.life,0,this.duration)}getValue(){return this.interp(this.life)}interp(t){let e=this.ease((this.duration-t)/this.duration);return La(this.start)?this.start.lerp(this.end,e):this.start+(this.end-this.start)*e}stop(){let t=Qt.indexOf(this);t>=0&&Qt.splice(t,1),this.thenCallback=void 0}},Ci={LINEAR:n=>n,POWER:n=>t=>t**n,SINE:n=>1-lt(n*(Y/2)),CIRC:n=>1-(1-n*n)**.5,EXPO:n=>n===0?0:2**(10*n-10),BACK:n=>n*n*(2.70158*n-1.70158),ELASTIC:n=>n===0?0:n===1?1:-(2**(10*n-10))*it((37-40*n)*Y/6),SPRING:n=>1-(it(Y*(1-n)*(.2+2.5*(1-n)**3))*n**2.2+(1-n))*(1+1.2*n),BOUNCE:n=>{let t=1-n,e;return t<4/11?e=7.5625*t*t:t<8/11?e=7.5625*(t-=6/11)*t+.75:t<10/11?e=7.5625*(t-=9/11)*t+.9375:e=7.5625*(t-=10.5/11)*t+.984375,1-e},IN:n=>n,OUT:n=>t=>1-n(1-t),IN_OUT:n=>Ci.PIECEWISE(n,Ci.OUT(n)),PIECEWISE:(...n)=>{let t=n.length;return e=>{let s=e*t-1e-9>>0;return(n[s]((e-s/t)*t)+s)/t}},BEZIER:(n,t,e,s)=>{let i=o=>{let a=1-o,r=3*a*a*o,c=3*a*o*o,l=o**3;return[r*n+c*e+l,r*t+c*s+l]};return o=>{let a=0,r=1;for(let c=0;c<128;c++){let l=(a+r)/2,[u,h]=i(l);if(st(u-o)<1e-5)return h;u=this.size.x||e>=this.size.y?null:this.nodes[t+e*this.size.x]}worldToTile(t){let e=this.tileLayer?this.tileLayer.pos.x:0,s=this.tileLayer?this.tileLayer.pos.y:0;return b(At(t.x-e),At(t.y-s))}tileToWorld(t,e){let s=this.tileLayer?this.tileLayer.pos.x:0,i=this.tileLayer?this.tileLayer.pos.y:0;return b(t+.5+s,e+.5+i)}buildNodeData(){let t=this.size.x,e=this.size.y,s=this.tileLayer?this.tileLayer.pos.x:0,i=this.tileLayer?this.tileLayer.pos.y:0;for(let o=0;o0&&(c?l>0&&xt(r.posWorld,lo,z(1,0,0,et(.2,l*.05)),this.debugTime):xt(r.posWorld,lo,z(1,0,0,.25),this.debugTime))}}aStarSearch(t,e){p(t&&e,"aStarSearch needs both endpoints"),p(t!==e,"aStarSearch: start and end must differ \u2014 caller should handle trivial case"),p(t.walkable&&e.walkable,"aStarSearch: endpoints must be walkable");let s=[t];t.isOpen=!0;let i=0;for(;s.length>0;){let o=0,a=s[0].f;for(let c=1;cthis.maxLoop)break;r.isOpen=!1,s.splice(o,1),r.isClosed=!0,this.debug&&this.debugTime>0&&xt(r.posWorld,lo,z(1,1,1,.05),this.debugTime);for(let c=-1;c<=1;++c)for(let l=-1;l<=1;++l){if(l===0&&c===0)continue;let u=this.getNode(r.pos.x+l,r.pos.y+c);if(!u||!u.walkable||u.isClosed)continue;let h=1;if(l!==0&&c!==0){let v=this.getNode(r.pos.x+l,r.pos.y);if(!v||!v.walkable)continue;let w=this.getNode(r.pos.x,r.pos.y+c);if(!w||!w.walkable)continue;h=fd}let d=r.g+h+u.cost;if(!u.isOpen)u.isOpen=!0,s.push(u);else if(d>=u.g)continue;u.parent=r,u.g=d;let f=st(e.pos.x-u.pos.x),y=st(e.pos.y-u.pos.y),x=Q(f,y)+(Math.SQRT2-1)*et(f,y);u.f=u.g+x*this.heuristicWeight}}return e.parent!==null}getNearestClearNode(t,e=10,s=!0){p(O(t),"worldPos must be a Vector2"),s&&this.buildNodeData();let i=this.tileLayer?this.tileLayer.pos.x:0,o=this.tileLayer?this.tileLayer.pos.y:0,a=At(t.x-i),r=At(t.y-o);for(let c=0;c<=e;++c){let l=null,u=0;for(let h=-c;h<=c;++h)for(let d=-c;d<=c;++d){if(c>0&&st(d)!==c&&st(h)!==c)continue;let f=this.getNode(a+d,r+h);if(!f||!f.isClear())continue;let y=f.posWorld.x-t.x,x=f.posWorld.y-t.y,v=y*y+x*x;(!l||v0&&Wt(i.posWorld,.3,z(.5,0,.5,.5),this.debugTime),t.splice(e,1),e=Q(1,e-1);continue}else if(c===2){this.debug&&this.debugTime>0&&Wt(i.posWorld,.3,z(1,0,0,.5),this.debugTime);let f,y;s.pos.y===i.pos.y&&o.pos.x===i.pos.x?(f=s.pos.x,y=o.pos.y):(f=o.pos.x,y=s.pos.y);let x=this.getNode(f,y);if(x&&x.isClear()){t.splice(e,1),e=Q(1,e-1);continue}}else if(c===5){this.debug&&this.debugTime>0&&Wt(i.posWorld,.3,z(1,1,0,.5),this.debugTime);let f=e>=2?t[e-2]:s,y,x,v,w;l===0||h===0?(y=o.pos.x,x=i.pos.y,v=s.pos.x,w=i.pos.y):(y=i.pos.x,x=o.pos.y,v=i.pos.x,w=s.pos.y);let _=y-f.pos.x,S=x-f.pos.y,C=v-f.pos.x,A=w-f.pos.y,T=_*_+S*S,P=C*C+A*A,k=T0&&Wt(i.posWorld,.3,z(0,1,0,.5),this.debugTime),l===h&&u===d){++e;continue}else{let f,y;s.pos.y===o.pos.y?(f=i.pos.x,y=s.pos.y):(f=s.pos.x,y=i.pos.y);let x=this.getNode(f,y);if(x&&x.isClear()){t[e]=x,e=Q(1,e-1);continue}}++e}}smoothPathStringPull(t){if(t.length<=2)return;for(let i of t)if(!i.isClear())return;let e=t.slice();t.length=0,t.push(e[0]);let s=0;for(let i=1;i0&&Ee(o.posWorld,t[t.length-1].posWorld,z(0,0,1,.3),.02,this.debugTime);continue}for(;s=1;--e){let s=t[e-1],i=t[e],o=t[e+1];(i.pos.x-s.pos.x)*(o.pos.y-s.pos.y)===(i.pos.y-s.pos.y)*(o.pos.x-s.pos.x)&&t.splice(e,1)}}isNodeClear(t,e){let s=this.getNode(t,e);return s!==null&&s.isClear()}isLineClear(t,e){p(O(t)&&O(e),"isLineClear needs Vector2 endpoints"),p(this.isNodeClear(t.x,t.y)&&this.isNodeClear(e.x,e.y),"isLineClear endpoints must be in-bounds and clear");let s=e.x-t.x,i=e.y-t.y,o=st(s),a=st(i),r=ie(s),c=ie(i),l=t.x,u=t.y;if(a===o){for(;l!==e.x;){if(l!==t.x&&(!this.isNodeClear(l,u)||!this.isNodeClear(l,u-c))||!this.isNodeClear(l,u+c))return!1;l+=r,u+=c}if(!this.isNodeClear(e.x,e.y-c))return!1}else if(ar.posWorld.copy());if(this.debug&&this.debugTime>0&&a.length>0){for(let r=1;rpd,bootGameHost:()=>yd,default:()=>gd});var js=class{constructor(t){this._state=(t==null?2654435769:t)>>>0}next(){this._state=this._state+1831565813>>>0;let t=this._state;return t=Math.imul(t^t>>>15,t|1),t^=t+Math.imul(t^t>>>7,t|61),((t^t>>>14)>>>0)/4294967296}range(t,e){return t+this.next()*(e-t)}reseed(t){this._state=(t==null?2654435769:t)>>>0}},Ji=class{constructor(t){this._clock=t||Jc(),this._origin=this._clock()}nowMs(){return this._clock()}elapsedMs(){return this._clock()-this._origin}},Ui=class{constructor(t){this._time=t,this._subs=new Map}sourceFor(t){let e=this,s=t==null?null:t;return{on(i,o){if(e._assertType(i),typeof o!="function")throw new Error("[HostDevInputBridge] on \u7684 handler \u5FC5\u987B\u662F\u51FD\u6570");let a=e._subs.get(i)||[],r={handler:o,scope:s};return a.push(r),e._subs.set(i,a),{cancel(){let c=e._subs.get(i);if(!c)return;let l=c.indexOf(r);l>=0&&c.splice(l,1)}}},off(i,o){e._assertType(i);let a=e._subs.get(i);if(!a)return;let r=a.findIndex(c=>c.handler===o&&c.scope===s);r>=0&&a.splice(r,1)}}}_emit(t,e){this._assertType(t);let s=e||{},i={type:t,x:typeof s.x=="number"?s.x:0,y:typeof s.y=="number"?s.y:0,key:typeof s.key=="string"?s.key:"",tMs:this._time.nowMs()},o=this._subs.get(t);if(!o||o.length===0)return;let a=o.slice();for(let r of a)try{r.handler(i)}catch(c){Ye("[host-dev input] \u8F93\u5165 handler \u629B\u9519\uFF08\u5DF2\u9694\u79BB\uFF09type="+t,c)}}disposeScope(t){if(t==null)return 0;let e=0;for(let[s,i]of this._subs){let o=i.filter(a=>a.scope!==t);e+=i.length-o.length,o.length===0?this._subs.delete(s):this._subs.set(s,o)}return e}_subscriptionCount(){let t=0;for(let e of this._subs.values())t+=e.length;return t}_assertType(t){if(!Vi.has(t))throw new Error("[HostDevInputBridge] \u975E\u6CD5\u8F93\u5165\u4E8B\u4EF6\u7C7B\u578B\uFF1A"+String(t)+"\uFF08\u4EC5\u652F\u6301 "+Array.from(Vi).join("/")+"\uFF09")}},Vi=new Set(["pointerdown","pointermove","pointerup","keydown","keyup"]);function Xr(n){let t=n||{},e=new Ji(t.clock),s=new js(t.seed),i=t.seed==null?2654435769:t.seed>>>0,o=new Ui(e),a=typeof t.audioFactory=="function"?t.audioFactory:null,r=null,c=!1,l=typeof t.engineFactory=="function"?t.engineFactory:null,u=null,h=!1,d=new Map,f=0,y=0;function x(){if(r)return r;if(!a)return c||(qi("[host-dev audio] \u672A\u6CE8\u5165 audioFactory\uFF0CgetAudioContext \u8FD4\u56DE null\uFF08P6 \u987B\u5BB9\u9519\u964D\u7EA7\uFF1B\u96C6\u6210\u6BB5\u6CE8\u5165\u771F\u5B9E\u5DE5\u5382\uFF09"),c=!0),null;try{r=a()}catch(C){Ye("[host-dev audio] audioFactory \u629B\u9519\uFF0CgetAudioContext \u964D\u7EA7\u8FD4\u56DE null",C),r=null}return r}function v(){if(u)return u;if(!l)return h||(qi("[host-dev engine] \u672A\u6CE8\u5165 engineFactory\uFF0CgetEngine \u8FD4\u56DE null\uFF08\u63D2\u4EF6\u987B\u5BB9\u9519\u964D\u7EA7\uFF1A\u7C92\u5B50\u9000\u53D7\u63A7\u9762\u81EA\u7BA1/\u5408\u6210\u6838\u9000 vendored/\u6570\u5B66\u9000\u5185\u7F6E\uFF1B\u96C6\u6210\u6BB5\u6CE8\u5165\u771F\u5B9E\u80CC\u4E66\uFF09"),h=!0),null;try{u=l()}catch(C){Ye("[host-dev engine] engineFactory \u629B\u9519\uFF0CgetEngine \u964D\u7EA7\u8FD4\u56DE null",C),u=null}return u}function w(C,A){return{getContext2d(){return t.context2d==null?null:t.context2d},onFrame(P){let k=f++;return d.set(k,P),{cancel(){d.delete(k)}}},getInput(){return o.sourceFor(C)},getAudioContext(){return x()},getEngine(){return v()},time:e,random:A}}let _=w(null,s),S={context:_,tick(C){y+=1;let A=Array.from(d.values());for(let T of A)try{T(C,y)}catch(P){Ye("[host-dev tick] \u5E27\u56DE\u8C03\u629B\u9519\uFF08\u5DF2\u9694\u79BB\uFF09frame="+y,P)}},frameCount(){return y},inputBridge:o,deriveContextFor(C,A){let T=zc(i,C),P=new js(T);return w(A==null?C:A,P)}};return Object.defineProperty(_,Wi,{value:S,enumerable:!1,writable:!1,configurable:!1}),S}var Wi=Symbol("zaomeng.coreProtocol.contextBundle"),Ns=class{constructor(){this._plugins=new Map,this._initOrder=[],this._initErrors=[],this._phase="idle",this._disposed=!1,this._context=void 0,this._pluginContexts=new Map}register(t){if(!t||typeof t!="object")throw new Error("[PluginRegistry] register \u9700\u8981\u4E00\u4E2A\u63D2\u4EF6\u5BF9\u8C61");if(typeof t.name!="string"||t.name.length===0)throw new Error("[PluginRegistry] \u63D2\u4EF6\u7F3A\u5C11\u5408\u6CD5 name");if(typeof t.version!="string"||t.version.length===0)throw new Error("[PluginRegistry] \u63D2\u4EF6 "+t.name+" \u7F3A\u5C11\u5408\u6CD5 version");if(typeof t.init!="function")throw new Error("[PluginRegistry] \u63D2\u4EF6 "+t.name+" \u7F3A\u5C11 init \u51FD\u6570");if(t.dispose!=null&&typeof t.dispose!="function")throw new Error("[PluginRegistry] \u63D2\u4EF6 "+t.name+" \u7684 dispose \u5FC5\u987B\u662F\u51FD\u6570\u6216\u7701\u7565");if(this._plugins.has(t.name))throw new Error("[PluginRegistry] \u63D2\u4EF6\u91CD\u540D\u62D2\u7EDD\uFF1A"+t.name+" \u5DF2\u6CE8\u518C");return this._plugins.set(t.name,t),this}has(t){return this._plugins.has(t)}get(t){return this._plugins.get(t)}list(){return Array.from(this._plugins.keys())}initAll(){if(this._phase==="initialized")return qi("[PluginRegistry] initAll \u91CD\u590D\u8C03\u7528\uFF0C\u5DF2\u5FFD\u7565\uFF08\u5DF2\u5904\u4E8E initialized\uFF09"),this._initResult();if(this._phase==="disposed")throw new Error("[PluginRegistry] \u5DF2 dispose \u7684\u6CE8\u518C\u5668\u4E0D\u53EF\u518D initAll");if(this._context==null)throw new Error("[PluginRegistry] \u672A\u6CE8\u5165\u53D7\u63A7\u4E0A\u4E0B\u6587\uFF1A\u8BF7\u5728 initAll() \u4E4B\u524D\u8C03\u7528 useContext(context)\u3002\uFF08host-dev \u7528\u6CD5\uFF1Aconst { context } = createHostDevContext(); reg.useContext(context); reg.initAll();\uFF09");for(let[t,e]of this._plugins){let s=this._missingDeps(e);if(s.length>0){let o=new Error("[PluginRegistry] \u63D2\u4EF6 "+t+" \u4F9D\u8D56\u7F3A\u5931\uFF1A"+s.join(", ")+"\uFF08\u672A\u6CE8\u518C\uFF09");this._initErrors.push({name:t,error:o}),Ye("[PluginRegistry] \u8DF3\u8FC7 init\uFF08\u4F9D\u8D56\u7F3A\u5931\uFF0C\u5DF2\u9694\u79BB\uFF09\uFF1A"+t,o);continue}let i=this._contextFor(t);try{e.init(i),this._initOrder.push(t)}catch(o){let a=o instanceof Error?o:new Error(String(o));this._initErrors.push({name:t,error:a}),Ye("[PluginRegistry] \u63D2\u4EF6 init \u629B\u9519\uFF08\u5DF2\u9694\u79BB\uFF0C\u4E0D\u8FDE\u5750\uFF09\uFF1A"+t,a)}}return this._phase="initialized",this._initResult()}_contextFor(t){let e=this._pluginContexts.get(t);if(e)return e;let s=this._context&&this._context[Wi],i;return s&&typeof s.deriveContextFor=="function"?i=s.deriveContextFor(t,t):i=this._context,this._pluginContexts.set(t,i),i}disposeAll(){if(this._disposed)return{disposed:[],errors:[]};let t=[],e=[],s=this._context&&this._context[Wi],i=s&&s.inputBridge;for(let o=this._initOrder.length-1;o>=0;o--){let a=this._initOrder[o],r=this._plugins.get(a);if(r&&typeof r.dispose=="function")try{r.dispose(),t.push(a)}catch(c){let l=c instanceof Error?c:new Error(String(c));e.push({name:a,error:l}),Ye("[PluginRegistry] \u63D2\u4EF6 dispose \u629B\u9519\uFF08\u5DF2\u9694\u79BB\uFF09\uFF1A"+a,l)}if(i&&typeof i.disposeScope=="function")try{i.disposeScope(a)}catch(c){Ye("[PluginRegistry] \u56DE\u6536\u63D2\u4EF6\u8F93\u5165\u8BA2\u9605\u629B\u9519\uFF08\u5DF2\u9694\u79BB\uFF09\uFF1A"+a,c)}}return this._disposed=!0,this._phase="disposed",{disposed:t,errors:e}}useContext(t){if(this._phase!=="idle")throw new Error("[PluginRegistry] useContext \u5FC5\u987B\u5728 initAll() \u4E4B\u524D\u8C03\u7528\uFF08\u5F53\u524D\u9636\u6BB5\uFF1A"+this._phase+"\uFF09\u3002\u8BF7\u5728\u4EFB\u4F55 initAll/disposeAll \u4E4B\u524D\u6CE8\u5165\u53D7\u63A7\u4E0A\u4E0B\u6587\u3002");if(t==null||typeof t!="object")throw new Error("[PluginRegistry] useContext \u9700\u8981\u4E00\u4E2A\u53D7\u63A7\u4E0A\u4E0B\u6587\u5BF9\u8C61\u3002\uFF08host-dev \u7528\u6CD5\uFF1Aconst { context } = createHostDevContext(); reg.useContext(context);\uFF09");return this._context=t,this}_missingDeps(t){return!Array.isArray(t.dependencies)||t.dependencies.length===0?[]:t.dependencies.filter(e=>!this._plugins.has(e))}_initResult(){return{ok:this._initErrors.length===0,initialized:this._initOrder.slice(),errors:this._initErrors.slice()}}};function zc(n,t){let e=2166136261,s=16777619,i=n>>>0;for(let a=0;a<32;a+=8){let r=i>>>a&255;e^=r,e=Math.imul(e,s)>>>0}let o=String(t);for(let a=0;a>>0,e^=r>>>8&255,e=Math.imul(e,s)>>>0}return e>>>0}function Jc(){if(typeof globalThis!="undefined"&&globalThis.performance&&typeof globalThis.performance.now=="function")return()=>globalThis.performance.now();if(typeof process!="undefined"&&process.hrtime&&typeof process.hrtime.bigint=="function"){let n=process.hrtime.bigint();return()=>Number(process.hrtime.bigint()-n)/1e6}return()=>Date.now()}function Ye(n,t){let e=t&&t.stack?t.stack:t&&t.message?t.message:t;typeof console!="undefined"&&typeof console.error=="function"&&console.error(n+(e?"\uFF1A"+e:""))}function qi(n){typeof console!="undefined"&&typeof console.warn=="function"&&console.warn(n)}var xd=Object.freeze(Array.from(Vi)),Yr="core-protocol-v0";var $r=Object.freeze(["t_boot","t_plugins_ready","t_game_init","t_first_paint","t_input_bound","t_game_start"]),Hi=$r.reduce((n,t,e)=>(n[t]=e,n),Object.create(null)),Uc=new Set($r);function Xi(n){let t=2166136261;for(let e=0;e>>0).toString(16).padStart(8,"0")}var Kr=Xi("runtime-probe::seed::v1");function Bs(n){return n===null||typeof n!="object"?JSON.stringify(n):Array.isArray(n)?"["+n.map(Bs).join(",")+"]":"{"+Object.keys(n).sort().map(e=>JSON.stringify(e)+":"+Bs(n[e])).join(",")+"}"}function Qr(n){let t=Bs(n.extra==null?null:n.extra),e=Bs(Array.isArray(n.pluginSet)?n.pluginSet:[]);return["seq="+n.seq,"anchor="+n.anchor,"tMono="+n.tMono,"buildSha="+(n.buildSha||""),"pluginSet="+e,"extra="+t].join("|")}function Vc(n){return Math.round(n*1e3)/1e3}function Wc(n){if(!Array.isArray(n))return{ok:!1,reason:"records_not_array"};let t=Kr,e=-1;for(let s=0;stypeof C=="string").slice().sort():[],i=typeof t.sink=="function"?t.sink:null,o=t.autoBoot!==!1,a=typeof t.inputAnchorType=="string"?t.inputAnchorType:"pointerdown",r=()=>0,c=!1,l=0,u=Kr,h=[],d=new Set,f=-1,y=null,x=!1,v=!1,w=!1;function _(C,A){let T=null;if(!Uc.has(C))T="unknown_anchor";else{d.has(C)&&(T=T?T+";duplicate_anchor":"duplicate_anchor");let k=Hi[C];kC.time.nowMs(),c=!0,o&&!v&&_("t_boot",{auto:!0}),y=C.getInput().on(a,A=>{x||(x=!0,_("t_input_bound",{firstInput:!0,type:A.type}))}),_("t_input_bound",{stage:"registered",type:a})},dispose(){w||(y&&(y.cancel(),y=null),w=!0)},mark:_,getRecords(){return h.map(C=>({...C}))},toJSONL(){return h.map(C=>JSON.stringify(C)).join(`
+`)},verify(){return Wc(h)}}}function qc(n,t){let e=t&&t.stack?t.stack:t&&t.message?t.message:t;typeof console!="undefined"&&typeof console.error=="function"&&console.error(n+(e?"\uFF1A"+e:""))}function ta(n){let t=n.LJS,e=n.engineMath,s=n.engineMode,i=n.recHook||(()=>{});if(s!=="real")return null;let o=e;return{math:{lerp:(r,c,l)=>(i("math.lerp"),o.lerp(r,c,l)),smoothStep:r=>(i("math.smoothStep"),o.smoothStep(r)),easing:Object.fromEntries(Object.keys(o.easing).map(r=>[r,c=>(i("math.easing."+r),o.easing[r](c))]))},particles:{spawnEmitter(r){i("particles.spawnEmitter");let c=t.screenToWorld(t.vec2(r.pos.x,r.pos.y)),l=t.cameraScale,u=r.emitTime!=null?r.emitTime:r.count!=null?1/60:0,h=r.emitRate!=null?r.emitRate:r.count!=null?r.count*60:100,d=(r.speed!=null?r.speed:0)/l/60,f=r.damping!=null?r.damping:1,y=r.colorStart||{r:1,g:1,b:1,a:1},x=r.colorEnd||{r:1,g:1,b:1,a:0},v=t.rgb(y.r,y.g,y.b,y.a),w=t.rgb(x.r,x.g,x.b,x.a),_=new t.ParticleEmitter(c,r.angle!=null?r.angle:0,(r.emitSize!=null?r.emitSize:0)/l,u,h,r.coneAngle!=null?r.coneAngle:Math.PI,void 0,v,v,w,w,r.particleTime!=null?r.particleTime:.5,(r.sizeStart!=null?r.sizeStart:6)/l,(r.sizeEnd!=null?r.sizeEnd:0)/l,d,0,f,1,r.gravityScale!=null?r.gravityScale:0,Math.PI,.1,0,!1,r.additive!=null?r.additive:!1,!0);return{isActive(){return _.isActive()},stop(){_.destroyed||_.destroy(!0)}}}},audio:{synth:{synthSfx:r=>{i("audio.synth.synthSfx");try{return t.zzfxG(...r)}catch(c){return console.error("[host][engine-audio] zzfxG \u5408\u6210\u5F02\u5E38\uFF0C\u8FD4 null\uFF1A"+(c&&c.message?c.message:c)),null}},synthSong:(r,c,l,u)=>{i("audio.synth.synthSong");try{return t.zzfxM(r,c,l,u)}catch(h){return console.error("[host][engine-audio] zzfxM \u5408\u6210\u5F02\u5E38\uFF0C\u8FD4 null\uFF1A"+(h&&h.message?h.message:h)),null}}}}}}function ue(n){return n<0?0:n>1?1:n}function ea(n){let t=n.Ease,e=t.POWER(2),s=t.POWER(3),i=t.OUT(e),o=t.IN_OUT(e),a=t.OUT(s),r=t.IN_OUT(s),c=t.OUT(t.BACK),l=t.OUT(t.ELASTIC);return{lerp:(u,h,d)=>n.lerp(u,h,d),smoothStep:u=>n.smoothStep(u),easing:{linear:u=>t.LINEAR(ue(u)),quadIn:u=>e(ue(u)),quadOut:u=>i(ue(u)),quadInOut:u=>o(ue(u)),cubicIn:u=>s(ue(u)),cubicOut:u=>a(ue(u)),cubicInOut:u=>r(ue(u)),backIn:u=>t.BACK(ue(u)),backOut:u=>c(ue(u)),elasticIn:u=>t.ELASTIC(ue(u)),elasticOut:u=>l(ue(u))}}}var $e=2,zs=1/60;async function na(n){let t=n.canvas,e=n.statusEl||null,s=n.engine,i=n.seed>>>0,o=n.mode||"play",a=n.engineMode||"real",r=n.viewport.w,c=n.viewport.h,l=n.factory,u=n.buildFactoryOpts||(()=>{}),h=n.plugins||{},d=n.registerOrder||Object.values(h),f=n.onReady||(()=>{}),y=n.recHook||(()=>{});function x(D){e&&(e.textContent=D)}let v=[];window.addEventListener("error",D=>v.push({type:"error",message:String(D&&D.message||D)})),window.addEventListener("unhandledrejection",D=>v.push({type:"unhandledrejection",message:String(D&&D.reason&&D.reason.message||D&&D.reason||D)}));let w=null,_=!1;function S(){if(!_)return null;if(w)return w;let D=window.AudioContext||window.webkitAudioContext;return D?(w=new D,w):null}let C=0,A=null,T=null,P=null,k=null,pt=[],W={},$=null;function gt(D,at){try{P&&P.mark(D,at)}catch(se){v.push({type:"mark",message:String(se&&se.message||se)})}}function zt(){T&&typeof T._refreshChecklist=="function"&&T._refreshChecklist(W)}async function me(D,at){A=Xr({context2d:D,seed:i,audioFactory:S,clock:()=>C,engineFactory:()=>ta({LJS:a==="real"?s:null,engineMath:a==="real"?ea(s):null,engineMode:a,recHook:y})});let se=new Ns;for(let xe of d)se.register(xe);se.useContext(A.context),k=se.initAll(),pt=se.list().concat(["runtime-probe"]),P=Zr({pluginSet:pt,inputAnchorType:"pointerdown",autoBoot:!0});let Ot=A.deriveContextFor("runtime-probe","runtime-probe");gt("t_boot",{by:"game-host",stage:"pre-init",engineMode:a}),gt("t_plugins_ready",{initialized:k.initialized.length,ok:k.ok});let Bi=u(A.context,{bundle:A,plugins:h,getRealAudioCtx:()=>w});T=l(Bi),await T.init({ctx:A.context,mainContext:D,canvas:at(),seed:i}),$=T&&typeof T._forensicsView=="function"?T._forensicsView():null,gt("t_game_init",{hasForensics:!!$}),rt(),gt("t_first_paint",{frame:A.frameCount()});try{P.init(Ot)}catch(xe){v.push({type:"probe-init",message:String(xe&&xe.message||xe)})}gt("t_game_start",{mode:o,engineMode:a}),zt(),f(fn,{bundle:A,game:T,probe:P,checklist:W,uncaught:v,pluginSet:pt,initRes:k,getGameForensics:()=>$,mark:gt,stepOneFrame:rt})}let Jt=null;function rt(D){let at=typeof D=="number"?D:zs;T&&(C+=at*1e3,T.update(at),a==="stub"&&Jt&&T.render(Jt),zt())}function Tt(D){for(let at=0;at{}),T&&typeof T._onAudioUnlock=="function"&&T._onAudioUnlock()}let fn={seed:i,mode:o,engineMode:a,protocol:Yr,frameCount:()=>A?A.frameCount():0,stepFrames:Tt,startRaf:()=>X(),stopRaf:()=>N(),tap(D,at){be(),A&&(A.inputBridge._emit("pointerdown",{x:D,y:at}),A.inputBridge._emit("pointerup",{x:D,y:at}))},do(D){T&&typeof T._handleAction=="function"&&T._handleAction(D)},state:()=>$?$.state():{phase:"booting"}};function pn(D){let at=A.inputBridge;function se(Ot,Bi){let xe=D.getBoundingClientRect();return{x:(Ot-xe.left)/xe.width*r,y:(Bi-xe.top)/xe.height*c}}D.addEventListener("pointerdown",Ot=>{be(),at._emit("pointerdown",se(Ot.clientX,Ot.clientY))}),D.addEventListener("pointermove",Ot=>{at._emit("pointermove",se(Ot.clientX,Ot.clientY))}),D.addEventListener("pointerup",Ot=>{at._emit("pointerup",se(Ot.clientX,Ot.clientY))}),window.addEventListener("keydown",Ot=>{be(),at._emit("keydown",{key:Ot.key})}),window.addEventListener("keyup",Ot=>at._emit("keyup",{key:Ot.key}))}let le=0,De=!1,ne=0;function L(D){if(!De)return;ne===0&&(ne=D);let at=(D-ne)/1e3;ne=D,at>.05&&(at=.05),rt(at),le=window.requestAnimationFrame(L)}function X(){a==="stub"&&(De||(De=!0,ne=0,le=window.requestAnimationFrame(L)))}function N(){De=!1,le&&window.cancelAnimationFrame(le),le=0}function yt(D){D.width=r*$e,D.height=c*$e,D.style.width=r+"px",D.style.height=c+"px";let at=D.getContext("2d",{willReadFrequently:!0});return at.setTransform($e,0,0,$e,0,0),at}async function vt(){let D=yt(t);return Jt=D,await me(D,()=>t),pn(t),o==="evidence"?x(`evidence \u5C31\u7EEA seed=${i} \xB7 \u7528 host \u9A71\u52A8\uFF08stepFrames/tap\uFF09`):(x(`seed=${i} \xB7 \u70B9\u5F00\u59CB\uFF08\u9996\u6B21\u70B9\u51FB\u5F00\u58F0\uFF09`),X()),fn}let Mt=()=>{},M=()=>{};function Z(){window.__gameHostEngineInitFired=!0}function Ct(){Mt()}function kt(){}function ht(){M()}function Ie(){}async function gn(D){await me(D,()=>s.mainCanvas),pn(s.mainCanvas),Mt=()=>{T&&(C+=zs*1e3,T.update(zs))},M=()=>{if(T){D.save(),D.setTransform($e,0,0,$e,0,0);try{D.imageSmoothingEnabled=!1}catch{}T.render(D),D.restore()}},s.mainCanvas&&(s.mainCanvas.id="game-engine"),window.__engine={frame(){return s.frame},time(){return s.time},timeReal(){return s.timeReal},paused(){return s.paused},timeScale(){return s.timeScale},snapshot(){return{frame:s.frame,time:s.time,timeReal:s.timeReal,paused:s.paused,timeScale:s.timeScale}}},x(`engine RAF running \xB7 seed=${i} engine=real`)}if(a!=="real")return await vt();if(!s){let D="real \u901A\u9053\u672A\u6CE8\u5165\u5F15\u64CE\uFF08opts.engine \u7F3A\u5931\uFF09\uFF1A\u8BF7\u7ECF entry \u5305\u88C5\u5C42\u542F\u52A8\uFF08host \u4E0D\u76F4\u63A5 import \u5F15\u64CE\uFF0CQ4/Option C\uFF09";throw x("ENGINE INJECT MISSING: "+D),new Error(D)}s.setGLEnable(!1),s.setShowSplashScreen(!1),s.setDebugWatermark(!1),s.setCanvasClearColor(s.BLACK),s.setCanvasFixedSize(s.vec2(r*$e,c*$e));let Me=document.createElement("div");return Me.id="engine-root",document.body.appendChild(Me),await s.engineInit(Z,Ct,kt,ht,Ie,[],Me).then(()=>gn(s.mainContext)).catch(D=>{throw window.__gameHostBootError=String(D&&D.message||D),x("ENGINE INIT FAILED: "+window.__gameHostBootError),D}),fn}var Yi=class{constructor(t){let e=t||{},s=typeof e.cellSize=="number"&&e.cellSize>0?e.cellSize:64;this._cellSize=s,this._cells=new Map,this._entries=new Map,this._seq=0}get size(){return this._entries.size}_cellRange(t){let e=this._cellSize,s=Math.floor((t.x-t.hw)/e),i=Math.floor((t.x+t.hw)/e),o=Math.floor((t.y-t.hh)/e),a=Math.floor((t.y+t.hh)/e);return{cx0:s,cy0:o,cx1:i,cy1:a}}insert(t,e){this._entries.has(t)&&this.remove(t);let{cx0:s,cy0:i,cx1:o,cy1:a}=this._cellRange(e),r=[];for(let l=i;l<=a;l++)for(let u=s;u<=o;u++){let h=u+","+l,d=this._cells.get(h);d||(d=new Set,this._cells.set(h,d)),d.add(t),r.push(h)}let c={x:e.x,y:e.y,hw:e.hw,hh:e.hh};this._entries.set(t,{id:t,box:c,seq:this._seq++,cells:r})}remove(t){let e=this._entries.get(t);if(!e)return!1;for(let s of e.cells){let i=this._cells.get(s);i&&(i.delete(t),i.size===0&&this._cells.delete(s))}return this._entries.delete(t),!0}query(t){let{cx0:e,cy0:s,cx1:i,cy1:o}=this._cellRange(t),a=new Set;for(let r=s;r<=o;r++)for(let c=e;c<=i;c++){let l=this._cells.get(c+","+r);if(l)for(let u of l)a.add(u)}return this._collect(a)}queryPoint(t,e){let s=this._cellSize,i=Math.floor(t/s),o=Math.floor(e/s),a=this._cells.get(i+","+o);return a?this._collect(new Set(a)):[]}clear(){this._cells.clear(),this._entries.clear(),this._seq=0}_collect(t){let e=[];for(let s of t){let i=this._entries.get(s);i&&e.push(i)}return e.sort((s,i)=>s.seq-i.seq),e.map(s=>({id:s.id,box:s.box}))}};function sa(n){let t=n||{},e=new Yi({cellSize:t.cellSize}),s=!1;return{name:"collision",version:"1.0.0",dependencies:[],spatial:e,init(o){},dispose(){s||(e.clear(),s=!0)}}}function ia(n){let t=!1;return{name:"physics-lite",version:"1.0.0",dependencies:[],init(s){},dispose(){t||(t=!0)}}}var Hc=["pointerdown","pointermove","pointerup","keydown","keyup"];function Ut(n){return n<0?0:n>1?1:n}var Xc=n=>(n=Ut(n),n*n),Yc=n=>(n=Ut(n),1-(1-n)*(1-n)),$c=n=>(n=Ut(n),n<.5?2*n*n:1-Math.pow(-2*n+2,2)/2),Kc=n=>(n=Ut(n),n*n*n),Qc=n=>{n=Ut(n);let t=1-n;return 1-t*t*t},Zc=n=>(n=Ut(n),n<.5?4*n*n*n:1-Math.pow(-2*n+2,3)/2),aa=2*Math.PI/3,oa=2*Math.PI/4.5,tl=n=>(n=Ut(n),n===0?0:n===1?1:-Math.pow(2,10*n-10)*Math.sin((n*10-10.75)*aa)),el=n=>(n=Ut(n),n===0?0:n===1?1:Math.pow(2,-10*n)*Math.sin((n*10-.75)*aa)+1),nl=n=>(n=Ut(n),n===0?0:n===1?1:n<.5?-(Math.pow(2,20*n-10)*Math.sin((20*n-11.125)*oa))/2:Math.pow(2,-20*n+10)*Math.sin((20*n-11.125)*oa)/2+1),Us=1.70158,Js=Us*1.525,ca=Us+1,sl=n=>(n=Ut(n),ca*n*n*n-Us*n*n),il=n=>{n=Ut(n);let t=n-1;return 1+ca*t*t*t+Us*t*t},ol=n=>(n=Ut(n),n<.5?Math.pow(2*n,2)*((Js+1)*2*n-Js)/2:(Math.pow(2*n-2,2)*((Js+1)*(n*2-2)+Js)+2)/2),rl=n=>Ut(n),ra=Object.freeze({linear:rl,quadIn:Xc,quadOut:Yc,quadInOut:$c,cubicIn:Kc,cubicOut:Qc,cubicInOut:Zc,elasticIn:tl,elasticOut:el,elasticInOut:nl,backIn:sl,backOut:il,backInOut:ol});var al=["linear","quadIn","quadOut","quadInOut","cubicIn","cubicOut","cubicInOut","elasticIn","elasticOut","elasticInOut","backIn","backOut","backInOut"];function cl(n){let t=n&&n.easing;if(!t)return ra;let e=i=>typeof t[i]=="function"?o=>t[i](Ut(o)):ra[i],s={};for(let i of al)s[i]=e(i);return Object.freeze(s)}var $i=class{constructor(t,e,s){let i=s||{};this._time=e,this._windowMs=typeof i.windowMs=="number"&&i.windowMs>0?i.windowMs:120;let o=Array.isArray(i.types)&&i.types.length>0?i.types:Hc;this._records=new Map,this._subs=[],this._disposed=!1;for(let a of o){this._records.set(a,null);let r=t.on(a,c=>{this._records.set(a,c.tMs)});this._subs.push(r)}}consume(t,e){let s=typeof e=="number"?e:this._time.nowMs(),i=this._records.get(t);return i==null?!1:s-i<=this._windowMs?(this._records.set(t,null),!0):(this._records.set(t,null),!1)}peek(t,e){let s=typeof e=="number"?e:this._time.nowMs(),i=this._records.get(t);return i==null?!1:s-i<=this._windowMs}clear(){for(let t of this._records.keys())this._records.set(t,null)}dispose(){if(!this._disposed){for(let t of this._subs)try{t.cancel()}catch(e){}this._subs=[],this._disposed=!0}}};function la(n){let t=n||{},e=null,s=null,i=!1;return{name:"gamefeel",version:"1.0.0",dependencies:[],get inputBuffer(){return e},get easing(){return cl(s)},init(a){let r=a.getInput();e=new $i(r,a.time,{windowMs:t.inputBufferMs,types:t.inputTypes});let c=a.getEngine();s=c?c.math:null},dispose(){i||(e&&(e.dispose(),e=null),s=null,i=!0)}}}function Vs(n,t){let e=t<0?0:t>1?1:t;switch(n&&n.kind){case"constant":return n.value;case"linear":return n.from+(n.to-n.from)*e;case"easeInOut":{let s=e*e*(3-2*e);return n.from+(n.to-n.from)*s}case"decay":{let s=n.power==null?2:n.power,i=Math.pow(1-e,s);return n.to+(n.from-n.to)*i}default:return 0}}var ll=Object.freeze({burst:Object.freeze({mode:"burst",count:24,angle:0,spread:Math.PI,speedMin:80,speedMax:160,lifeMin:.4,lifeMax:.8,gravity:0,drag:0,sizeCurve:{kind:"decay",from:6,to:0,power:1.5},alphaCurve:{kind:"linear",from:1,to:0}}),trail:Object.freeze({mode:"continuous",rate:60,angle:Math.PI,spread:.25,speedMin:20,speedMax:50,lifeMin:.2,lifeMax:.5,gravity:0,drag:1.5,sizeCurve:{kind:"easeInOut",from:4,to:0},alphaCurve:{kind:"decay",from:.8,to:0,power:2}}),drift:Object.freeze({mode:"continuous",rate:12,angle:Math.PI/2,spread:.6,speedMin:10,speedMax:30,lifeMin:1.5,lifeMax:3,gravity:8,drag:.5,sizeCurve:{kind:"constant",value:3},alphaCurve:{kind:"decay",from:.7,to:0,power:1}})});function ul(n){let t=ll[n];return t?Ki(t):null}function Ki(n){let t={};for(let e of Object.keys(n)){let s=n[e];t[e]=s&&typeof s=="object"?Ki(s):s}return t}function hl(n,t,e){let s=n.mode==="continuous";return{pos:{x:t,y:e},angle:n.angle,coneAngle:n.spread,emitSize:0,emitTime:s?0:1/60,emitRate:s?n.rate||0:void 0,count:s?void 0:n.count||0,particleTime:(n.lifeMin+n.lifeMax)/2,speed:(n.speedMin+n.speedMax)/2,gravityScale:n.gravity||0,damping:n.drag!=null?1-n.drag/60:1,sizeStart:Vs(n.sizeCurve,0),sizeEnd:Vs(n.sizeCurve,1),colorStart:{r:1,g:1,b:1,a:Vs(n.alphaCurve,0)},colorEnd:{r:1,g:1,b:1,a:Vs(n.alphaCurve,1)},additive:!1}}function ua(n){let t=n||{},e=null,s=null,i=null,o=new Map,a=0,r={isActive(){return!1},stop(){}},c=0,l=1,u=0,h=0,d=0,f={x:0,y:0,remain:0,dur:0,amplitude:0,frequency:0,_phase:0},y={alpha:0,remain:0,dur:0,peak:0},x={scale:1,remain:0,dur:0,amplitude:0,frequency:0},v=!1;function w(A){if(u>0)if(u-=A,u<=0)u=0,l=1;else{let T=h>0?1-u/h:1;l=d+(1-d)*T}if(f.remain>0)if(f.remain-=A,f.remain<=0)f.remain=0,f.x=0,f.y=0;else{let T=f.remain/f.dur,P=f.amplitude*T;f._phase+=f.frequency*A*Math.PI*2,f.x=Math.sin(f._phase)*P,f.y=Math.cos(f._phase*1.3)*P}if(y.remain>0&&(y.remain-=A,y.remain<=0?(y.remain=0,y.alpha=0):y.alpha=y.peak*(y.remain/y.dur)),x.remain>0)if(x.remain-=A,x.remain<=0)x.remain=0,x.scale=1;else{let T=x.remain/x.dur,P=(1-T)*x.frequency*Math.PI*2;x.scale=1+Math.sin(P)*x.amplitude*T}}function _(A){c+=1,w(A)}function S(A){let T=A!==void 0?A:e?e.getContext2d():null;if(T&&y.alpha>0){T.globalAlpha=y.alpha,T.fillStyle="#ffffff";let P=T.canvas?T.canvas.width:0,k=T.canvas?T.canvas.height:0;T.fillRect(0,0,P,k),T.globalAlpha=1}}return{name:"particles-juice",version:"1.0.0",dependencies:[],init(A){var T;e=A,i=((T=A.getEngine())==null?void 0:T.particles)||null,typeof t.seed=="number"&&A.random.reseed(t.seed),t.autoStep!==!1&&(s=A.onFrame(P=>{_(P)}))},dispose(){v||(s&&(s.cancel(),s=null),o.forEach(A=>{try{A.stop()}catch{}}),o.clear(),l=1,u=0,f.remain=0,f.x=0,f.y=0,y.remain=0,y.alpha=0,x.remain=0,x.scale=1,v=!0)},spawnEmitter(A,T,P,k){let pt=typeof A=="string"?ul(A):Ki(A);if(!pt)return-1;k&&(pt=Object.assign(pt,k));let W=a++;if(!i)return o.set(W,r),W;let $=i.spawnEmitter(hl(pt,T,P));return o.set(W,$),W},stopEmitter(A){let T=o.get(A);if(T)try{T.stop()}catch{}},step(A){_(A)},render(A){S(A)},particleCount(){return 0},emitterCount(){let A=0;for(let T of o.values())T.isActive()&&(A+=1);return A},hitStop(A,T){h=Math.max(0,A),u=h,d=T==null?0:Math.max(0,Math.min(1,T)),l=h>0?d:1},getTimeScale(){return l},shakeScreen(A,T,P){f.dur=Math.max(0,A),f.remain=f.dur,f.amplitude=Math.max(0,T),f.frequency=P==null?30:P,f._phase=0,f.x=0,f.y=0},getShakeOffset(){return{x:f.x,y:f.y}},flashScreen(A,T){y.dur=Math.max(0,A),y.remain=y.dur,y.peak=T==null?.8:Math.max(0,Math.min(1,T)),y.alpha=y.dur>0?y.peak:0},getFlashAlpha(){return y.alpha},pulseScale(A,T,P){x.dur=Math.max(0,A),x.remain=x.dur,x.amplitude=T==null?.2:T,x.frequency=P==null?4:P,x.scale=1},getPulseScale(){return x.scale},juiceSnapshot(){return{timeScale:l,shake:{x:f.x,y:f.y},flashAlpha:y.alpha,pulseScale:x.scale}},probe(){return{particles:0,emitters:o.size,dropped:0,steps:c,disposed:v}}}}function ha(n){let t=mt(n.r)/255,e=mt(n.g)/255,s=mt(n.b)/255,i=Math.max(t,e,s),o=Math.min(t,e,s),a=(i+o)/2,r=0,c=0,l=i-o;return l>1e-12&&(c=a>.5?l/(2-i-o):l/(i+o),i===t?r=(e-s)/l%6:i===e?r=(s-t)/l+2:r=(t-e)/l+4,r*=60,r<0&&(r+=360)),{h:r,s:c,l:a}}function da(n){let t=(n.h%360+360)%360,e=Ke(n.s),s=Ke(n.l);if(e<1e-12){let r=Math.round(s*255);return{r,g:r,b:r}}let i=s<.5?s*(1+e):s+e-s*e,o=2*s-i,a=t/360;return{r:Math.round(Qi(o,i,a+1/3)*255),g:Math.round(Qi(o,i,a)*255),b:Math.round(Qi(o,i,a-1/3)*255)}}function Qi(n,t,e){let s=e;return s<0&&(s+=1),s>1&&(s-=1),s<1/6?n+(t-n)*6*s:s<1/2?t:s<2/3?n+(t-n)*(2/3-s)*6:n}function mt(n){return n<0?0:n>255?255:n}function Ke(n){return n<0?0:n>1?1:n}function dl(n,t){let e=pl(n.from,t);if(e>=0&&e({r:mt(r.r),g:mt(r.g),b:mt(r.b)})),to:o}}function Zi(n,t,e){return n+(t-n)*e}function ml(n,t){let e=ha(n),s=e.h+(t.hue||0),i=Ke(e.s*(t.sat==null?1:t.sat)),o=Ke(e.l*(t.light==null?1:t.light));return da({h:s,s:i,l:o})}var bl=Object.freeze([Object.freeze([0,8,2,10]),Object.freeze([12,4,14,6]),Object.freeze([3,11,1,9]),Object.freeze([15,7,13,5])]);function fa(n){let t=n||{},e=null,s=!1,i={vignette:{enabled:to(t.vignette&&t.vignette.enabled,!1),strength:eo(t.vignette&&t.vignette.strength,.5)},dither:{enabled:to(t.dither&&t.dither.enabled,!1),strength:eo(t.dither&&t.dither.strength,.5)},scanline:{enabled:to(t.scanline&&t.scanline.enabled,!1),strength:eo(t.scanline&&t.scanline.strength,.5)}};function o(r){let c=r!==void 0?r:e?e.getContext2d():null;if(!c)return;let l=c.canvas?c.canvas.width:0,u=c.canvas?c.canvas.height:0;if(i.vignette.enabled&&i.vignette.strength>0&&l>0&&u>0){let h=c.createRadialGradient(l/2,u/2,Math.min(l,u)*.25,l/2,u/2,Math.max(l,u)*.75);h.addColorStop(0,"rgba(0,0,0,0)"),h.addColorStop(1,"rgba(0,0,0,"+i.vignette.strength.toFixed(3)+")"),c.fillStyle=h,c.fillRect(0,0,l,u)}if(i.scanline.enabled&&i.scanline.strength>0&&l>0&&u>0){c.fillStyle="rgba(0,0,0,"+(i.scanline.strength*.5).toFixed(3)+")";for(let h=0;h0&&l>0&&u>0&&typeof c.getImageData=="function"&&typeof c.putImageData=="function"){let h=c.getImageData(0,0,l,u);xl(h,i.dither.strength),c.putImageData(h,0,0)}}return{name:"palette-post",version:"1.0.0",dependencies:[],init(r){e=r},dispose(){s||(e=null,s=!0)},applyPaletteMap(r,c){return dl(r,c)},applyPaletteMapToBuffer(r,c){return fl(r,c)},lerpPaletteMap(r,c,l){return yl(r,c,l)},shiftHsl(r,c){return ml(r,c)},rgbToHsl(r){return ha(r)},hslToRgb(r){return da(r)},setPost(r){if(r)for(let c of["vignette","dither","scanline"])r[c]&&(typeof r[c].enabled=="boolean"&&(i[c].enabled=r[c].enabled),typeof r[c].strength=="number"&&(i[c].strength=Ke(r[c].strength)))},getPost(){return{vignette:{enabled:i.vignette.enabled,strength:i.vignette.strength},dither:{enabled:i.dither.enabled,strength:i.dither.strength},scanline:{enabled:i.scanline.enabled,strength:i.scanline.strength}}},renderPost(r){o(r)},probe(){return{disposed:s,post:this.getPost()}}}}function xl(n,t){let e=Ke(t);if(e<=0)return n;let{data:s,width:i}=n,a=255/(Math.max(2,Math.round(16-e*14))-1);for(let r=0;r+3>2)%i,l=Math.floor((r>>2)/i),u=(bl[l&3][c&3]/16-.5)*a;for(let h=0;h<3;h++){let d=s[r+h]+u,f=Math.round(d/a)*a;s[r+h]=f<0?0:f>255?255:f}}return n}function to(n,t){return typeof n=="boolean"?n:t}function eo(n,t){return typeof n=="number"?Ke(n):t}var so=Object.freeze({blip:Object.freeze({name:"blip",params:Object.freeze([.6,0,880,0,.03,.06,1,1.5])}),thud:Object.freeze({name:"thud",params:Object.freeze([.8,0,90,0,.04,.18,0,1,0,0,0,0,0,4])}),chime:Object.freeze({name:"chime",params:Object.freeze([.5,0,660,.02,.12,.3,1,2])})}),pa=Object.keys(so);function vl(n){let t=[];return n==null||typeof n!="object"?{ok:!1,errors:["song \u5FC5\u987B\u662F\u5BF9\u8C61"]}:(!Array.isArray(n.instruments)||n.instruments.length===0?t.push("instruments \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4"):n.instruments.forEach((e,s)=>{(!Array.isArray(e)||e.some(i=>typeof i!="number"||!Number.isFinite(i)))&&t.push(`instruments[${s}] \u5FC5\u987B\u662F\u6709\u9650\u6570\u5B57\u6570\u7EC4\uFF08ZzFX \u53C2\u6570\u5305\uFF09`)}),!Array.isArray(n.patterns)||n.patterns.length===0?t.push("patterns \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4"):n.patterns.forEach((e,s)=>{if(!Array.isArray(e)||e.length===0){t.push(`patterns[${s}] \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4\uFF08\u81F3\u5C11\u4E00\u4E2A\u58F0\u90E8\u901A\u9053\uFF09`);return}e.forEach((i,o)=>{if(!Array.isArray(i)||i.length<2){t.push(`patterns[${s}][${o}] \u901A\u9053\u81F3\u5C11\u542B [\u4E50\u5668\u7D22\u5F15, \u58F0\u50CF]`);return}if(i.some(c=>typeof c!="number"||!Number.isFinite(c))){t.push(`patterns[${s}][${o}] \u901A\u9053\u5FC5\u987B\u5168\u4E3A\u6709\u9650\u6570\u5B57`);return}let a=i[0]|0;Array.isArray(n.instruments)&&(a<0||a>=n.instruments.length)&&t.push(`patterns[${s}][${o}] \u4E50\u5668\u7D22\u5F15 ${a} \u8D8A\u754C\uFF08instruments \u957F\u5EA6 ${n.instruments.length}\uFF09`);let r=i[1];(r<-1||r>1)&&t.push(`patterns[${s}][${o}] \u58F0\u50CF ${r} \u8D8A\u754C\uFF08\u5E94 -1..+1\uFF09`)})}),!Array.isArray(n.sequence)||n.sequence.length===0?t.push("sequence \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4"):n.sequence.forEach((e,s)=>{if(typeof e!="number"||!Number.isInteger(e)){t.push(`sequence[${s}] \u5FC5\u987B\u662F\u6574\u6570 pattern \u7D22\u5F15`);return}Array.isArray(n.patterns)&&(e<0||e>=n.patterns.length)&&t.push(`sequence[${s}] \u7D22\u5F15 ${e} \u8D8A\u754C\uFF08patterns \u957F\u5EA6 ${n.patterns.length}\uFF09`)}),n.bpm!=null&&(typeof n.bpm!="number"||!(n.bpm>0))&&t.push("bpm \u5FC5\u987B\u662F\u6B63\u6570"),{ok:t.length===0,errors:t})}function ve(n){return typeof n!="number"||Number.isNaN(n)||n<0?0:n>1?1:n}function Sl(n,t){switch(n){case"ease-in":return t*t;case"ease-out":return Math.sqrt(t);case"constant":return 1;default:return t}}function ga(n,t){let e=ve(t);return n==null||!Array.isArray(n.voices)?[]:n.voices.map(s=>{let i=String(s&&s.id!=null?s.id:""),o=Array.isArray(s&&s.channelIndices)?s.channelIndices.slice():[],a=typeof s.minIntensity=="number"?ve(s.minIntensity):0,r=typeof s.maxIntensity=="number"?ve(s.maxIntensity):1,c=typeof s.volumeCurve=="string"?s.volumeCurve:"linear",l=typeof s.baseVolume=="number"?ve(s.baseVolume):1;if(er)return{id:i,on:!1,volume:0,channelIndices:o};let u=r-a,h=u<=0?1:(e-a)/u,d=ve(Sl(c,h)*l);return{id:i,on:!0,volume:d,channelIndices:o}})}function ya(n,t,e,s){try{let i=t[0]||[],o=t[1]||i,a=Math.max(i.length,o.length);if(a===0)return null;let c=n.createBuffer(2,a,44100);c.getChannelData(0).set(i),c.getChannelData(1).set(o.length?o:i);let l=n.createBufferSource();l.buffer=c,l.loop=!!s;let u=n.createGain();return u.gain.value=ve(e*.3),l.connect(u),u.connect(n.destination),l.start(),{stop(){try{l.stop()}catch(h){}try{l.disconnect(),u.disconnect()}catch(h){}}}}catch(i){return io("[audio-music] \u53D7\u63A7\u97F3\u9891\u64AD\u653E\u5F02\u5E38\uFF0C\u964D\u7EA7\u4E3A\u9759\u9ED8",i),null}}function ma(n){let t=n||{},e=typeof t.masterVolume=="number"?ve(t.masterVolume):1,s=()=>null,i=null,o=null,a={voices:[]},r=1,c=null,l=!1,u=0,h=!1,d=!1;function f(){let S=s();return S==null?(u+=1,h||(no("[audio-music] \u65E0\u53D7\u63A7\u97F3\u9891\u4E0A\u4E0B\u6587\uFF08getAudioContext \u8FD4\u56DE null\uFF09\uFF0C\u5168\u90E8\u53D1\u58F0\u9759\u9ED8 no-op\uFF08\u8BC4\u4F30\u73AF\u5883\u65E0\u58F0\u5361\u65F6\u7684\u5BB9\u9519\u964D\u7EA7\uFF09"),h=!0),null):S}function y(){if(!o||!i)return null;try{let S=typeof o.bpm=="number"&&o.bpm>0?o.bpm:125;return i.synthSong(o.instruments,o.patterns,o.sequence,S)}catch(S){return io("[audio-music] \u66F2\u8C31\u6E32\u67D3\u5F02\u5E38\uFF0C\u964D\u7EA7\u4E3A\u9759\u9ED8",S),null}}function x(){let S=ga(a,r);if(S.length===0)return 1;let C=0;for(let A of S)A.on&&(C=Math.max(C,A.volume));return C}function v(S,C){typeof C=="number"&&(r=ve(C));let A=f();if(A==null||!o)return;w();let T=y();if(!T)return;let P=ve(e*x());c=ya(A,T,P,S),l=!!S&&c!=null}function w(){c&&(c.stop(),c=null),l=!1}return{name:"audio-music",version:"1.0.0",dependencies:[],init(S){s=()=>S.getAudioContext();let C=S.getEngine&&S.getEngine();i=C?C.audio.synth:null},dispose(){d||(w(),d=!0)},loadSong(S){let C=vl(S);return C.ok?o={instruments:S.instruments,patterns:S.patterns,sequence:S.sequence,bpm:typeof S.bpm=="number"?S.bpm:125}:no("[audio-music] \u66F2\u8C31\u6821\u9A8C\u5931\u8D25\uFF0C\u672A\u8F7D\u5165\uFF1A"+C.errors.join("\uFF1B")),C},play(S){v(!1,S)},stop(){w()},loop(S){v(!0,S)},setIntensityLayering(S){a=S&&Array.isArray(S.voices)?{voices:S.voices}:{voices:[]}},setIntensity(S){r=ve(S)},resolveVoices(S){return ga(a,S)},playSfx(S){let C=so[S];if(!C){no("[audio-music] \u672A\u77E5\u97F3\u6548\u9884\u8BBE\uFF1A"+String(S));return}let A=f();if(A!=null)try{let T=i?i.synthSfx(C.params):null;if(!T)return;ya(A,[T,T],e,!1)}catch(T){io("[audio-music] \u97F3\u6548\u64AD\u653E\u5F02\u5E38\uFF0C\u964D\u7EA7\u4E3A\u9759\u9ED8 name="+S,T)}},getPreset(S){return so[S]},listPresets(){return pa.slice()},probe(){return{hasAudio:s()!=null,hasSong:o!=null,intensity:r,voiceCount:a.voices.length,looping:l,silentNoops:u,presetCount:pa.length}}}}function io(n,t){let e=t&&t.stack?t.stack:t&&t.message?t.message:t;typeof console!="undefined"&&typeof console.error=="function"&&console.error(n+(e?"\uFF1A"+e:""))}function no(n){typeof console!="undefined"&&typeof console.warn=="function"&&console.warn(n)}var wl="zaomeng.save";function Tl(n){if(typeof TextEncoder!="undefined")return new TextEncoder().encode(n).length;if(typeof Buffer!="undefined"&&typeof Buffer.byteLength=="function")return Buffer.byteLength(n,"utf8");let t=0;for(let e=0;e=55296&&s<=56319?(t+=4,e++):t+=3}return t}function ro(){let n=new Map;return{getItem(t){return n.has(t)?n.get(t):null},setItem(t,e){n.set(t,e)},removeItem(t){n.delete(t)},keys(){return Array.from(n.keys())}}}function ba(){if(typeof localStorage=="undefined")throw new Error("[save-progress] createLocalStorageAdapter \u9700\u8981\u5168\u5C40 localStorage\uFF08\u4EC5\u6D4F\u89C8\u5668\u96C6\u6210\u6BB5\u53EF\u7528\uFF09\u3002node/host-dev \u8BF7\u7528\u7F3A\u7701\u5185\u5B58 adapter \u6216 createMemoryAdapter()\u3002");return{getItem(n){return localStorage.getItem(n)},setItem(n,t){localStorage.setItem(n,t)},removeItem(n){localStorage.removeItem(n)},keys(){let n=[];for(let t=0;t0?t.namespace:wl;if(e.indexOf(":")>=0)throw new Error('[save-progress] namespace \u4E0D\u5F97\u542B\u5206\u9694\u7B26 ":"\uFF08\u5F53\u524D="'+e+'"\uFF09');let s=typeof t.maxValueBytes=="number"&&t.maxValueBytes>0?Math.floor(t.maxValueBytes):32768,i=!Al(t.adapter),o=i?ro():t.adapter,a=e+":",r=0,c=0,l=!1;function u(f){return typeof f!="string"||f.length===0?a+String(f):a+f}function h(){try{let f=o.keys();return Array.isArray(f)?f.filter(y=>typeof y=="string"&&y.indexOf(a)===0):[]}catch(f){return es("[save-progress] adapter.keys() \u5F02\u5E38\uFF0C\u964D\u7EA7\u8FD4\u56DE\u7A7A\u96C6",f),[]}}return{name:"save-progress",version:"1.0.0",dependencies:[],init(f){h()},dispose(){},get(f,y){if(!oo(f))return y;let x;try{x=o.getItem(u(f))}catch(v){return es("[save-progress] adapter.getItem \u5F02\u5E38\uFF0C\u8FD4\u56DE\u9ED8\u8BA4\u503C key="+f,v),y}if(x==null)return y;try{return JSON.parse(x)}catch{return r+=1,l||(ns("[save-progress] \u68C0\u6D4B\u5230\u635F\u574F\u5B58\u6863\uFF08\u975E\u6CD5 JSON\uFF09\uFF0C\u5DF2\u5BB9\u9519\u56DE\u9000\u9ED8\u8BA4\u503C key="+f),l=!0),y}},set(f,y){if(!oo(f))return ns("[save-progress] set \u6536\u5230\u975E\u6CD5 key\uFF0C\u62D2\u7EDD\u5199\u5165\uFF1A"+String(f)),!1;let x;try{x=JSON.stringify(y)}catch{return c+=1,ns("[save-progress] \u503C\u4E0D\u53EF JSON \u5E8F\u5217\u5316\uFF08\u5FAA\u73AF\u5F15\u7528?\uFF09\uFF0C\u62D2\u7EDD\u5199\u5165 key="+f),!1}if(x===void 0)return c+=1,ns("[save-progress] \u503C\u5E8F\u5217\u5316\u4E3A undefined\uFF08\u5982\u7EAF undefined/\u51FD\u6570\uFF09\uFF0C\u62D2\u7EDD\u5199\u5165 key="+f),!1;let v=Tl(x);if(v>s)return c+=1,ns("[save-progress] \u503C\u8D85\u5B57\u8282\u4E0A\u9650\u62D2\u7EDD\u5199\u5165 key="+f+"\uFF08"+v+" > "+s+" bytes\uFF09"),!1;try{return o.setItem(u(f),x),!0}catch(w){return c+=1,es("[save-progress] adapter.setItem \u5F02\u5E38\uFF0C\u5199\u5165\u5931\u8D25 key="+f,w),!1}},remove(f){if(oo(f))try{o.removeItem(u(f))}catch(y){es("[save-progress] adapter.removeItem \u5F02\u5E38\uFF08\u5DF2\u5FFD\u7565\uFF09key="+f,y)}},clear(){let f=h(),y=0;for(let x of f)try{o.removeItem(x),y+=1}catch(v){es("[save-progress] clear \u65F6 removeItem \u5F02\u5E38\uFF08\u5DF2\u8DF3\u8FC7\uFF09fullKey="+x,v)}return y},probe(){return{namespace:e,maxValueBytes:s,usingMemoryAdapter:i,size:h().length,corruptRecoveries:r,rejectedWrites:c}}}}function oo(n){return typeof n=="string"&&n.length>0}function Al(n){return!!n&&typeof n.getItem=="function"&&typeof n.setItem=="function"&&typeof n.removeItem=="function"&&typeof n.keys=="function"}function es(n,t){let e=t&&t.stack?t.stack:t&&t.message?t.message:t;typeof console!="undefined"&&typeof console.error=="function"&&console.error(n+(e?"\uFF1A"+e:""))}function ns(n){typeof console!="undefined"&&typeof console.warn=="function"&&console.warn(n)}var El={w:390,h:844};function va(n){let t=((n&&n.seed)!=null?n.seed:0)>>>0,e=sa({cellSize:96}),s=ia(),i=la({inputBufferMs:260,inputTypes:["pointerdown"]}),o=ua({seed:t,maxParticles:600}),a=fa({vignette:{enabled:!0,strength:.22}}),r=ma({masterVolume:.8}),c;try{c=ba()}catch(d){console.warn("[generic] localStorage \u4E0D\u53EF\u7528\uFF0C\u5B58\u6863\u9000\u5185\u5B58 adapter\uFF1A"+(d&&d.message)),c=ro()}let l=xa({namespace:"zaomeng-generic",adapter:c});return{plugins:{collision:e,physics:s,gamefeel:i,juice:o,palettePost:a,audioMusic:r,save:l},registerOrder:[e,s,i,o,a,l,r],viewport:El,buildFactoryOpts:(d,f)=>({runtime:{plugins:f.plugins,bundle:f.bundle,getRealAudioCtx:f.getRealAudioCtx}})}}function ss(n){let t=n||{},e=null,s=0,i=0,o={left:!1,right:!1,up:!1,space:!1},a=[],r="booting",c=null,l=0,u=[],h=[],d={x:195,y:422,angle:-Math.PI/2,vx:0,vy:0},f=300,y=.99,x=3,v=15,w=500,_=2,S=3,C=.15,A=0,T=30,P=15,k=50,pt=120,W=390,$=844,gt=4;function zt(){return{seed:t.seed||null,state:()=>({phase:r,result:c,score:l,asteroidsRemaining:u.filter(L=>L.active).length,ship:{x:d.x,y:d.y,angle:d.angle},asteroids:u.filter(L=>L.active).map(L=>({x:L.x,y:L.y}))})}}function me(L,X){return Math.hypot(L.x-X.x,L.y-X.y)}function Jt(L,X,N,yt){let vt=X.x-L.x,Mt=X.y-L.y,M=L.x-N.x,Z=L.y-N.y,Ct=vt*vt+Mt*Mt;if(Ct===0)return me(L,N)<=yt;let kt=2*(M*vt+Z*Mt),ht=M*M+Z*Z-yt*yt,Ie=kt*kt-4*Ct*ht;if(Ie<0)return!1;Ie=Math.sqrt(Ie);let gn=(-kt-Ie)/(2*Ct),Me=(-kt+Ie)/(2*Ct);return gn>=0&&gn<=1||Me>=0&&Me<=1}function rt(L,X,N,yt){let vt=e.getEngine();if(vt&&vt.particles)try{vt.particles.spawnEmitter({pos:{x:L,y:X},count:N||20,speed:100,particleTime:.6,sizeStart:8,sizeEnd:0,colorStart:yt||{r:1,g:.8,b:.2,a:1},colorEnd:{r:1,g:.3,b:0,a:0}})}catch{}}function Tt(L){let X=e.getEngine();if(X&&X.audio&&X.audio.synth)try{X.audio.synth.synthSfx(L)}catch{}}function be(){r="playing",c=null,l=0,h=[],d={x:195,y:422,angle:-Math.PI/2,vx:0,vy:0},A=0,u=[];for(let L=0;L<6;L++){let X,N;do X=e.random.range(30,W-30),N=e.random.range(30,$-30);while(me({x:X,y:N},d)<150);let yt=e.random.range(0,Math.PI*2),vt=e.random.range(k,pt);u.push({x:X,y:N,vx:Math.cos(yt)*vt,vy:Math.sin(yt)*vt,radius:T,active:!0})}}function fn(){let L=Math.cos(d.angle),X=Math.sin(d.angle),N=d.x+L*(v+5),yt=d.y+X*(v+5);h.push({x:N,y:yt,prevX:N,prevY:yt,vx:L*w,vy:X*w,life:_}),rt(N,yt,12,{r:.5,g:.9,b:1,a:1}),Tt([1,.02,880,,.02,.1,,.4,-.1])}function pn(L){e=L.ctx;let X=t.seed;X!=null&&e.random.reseed(X);let N=ht=>{switch(ht.key){case"ArrowLeft":o.left=!0;break;case"ArrowRight":o.right=!0;break;case"ArrowUp":o.up=!0;break;case" ":o.space=!0;break}},yt=ht=>{switch(ht.key){case"ArrowLeft":o.left=!1;break;case"ArrowRight":o.right=!1;break;case"ArrowUp":o.up=!1;break;case" ":o.space=!1;break}},vt=ht=>{r==="gameover"&&be()},Mt=e.getInput(),M=Mt.on("keydown",N),Z=Mt.on("keyup",yt),Ct=Mt.on("pointerdown",vt);a=[M,Z,Ct],be();let kt=e.getEngine();if(kt&&kt.particles)try{kt.particles.spawnEmitter({pos:{x:195,y:400},emitRate:8,emitTime:0,particleTime:.8,speed:30,sizeStart:4,sizeEnd:0,colorStart:{r:.2,g:.6,b:1,a:.5},colorEnd:{r:.1,g:.3,b:.5,a:0}})}catch{}}function le(L){if(s=e.time.nowMs(),i=s/1e3,r!=="playing")return;o.left&&(d.angle-=x*L),o.right&&(d.angle+=x*L),o.up&&(d.vx+=Math.cos(d.angle)*f*L,d.vy+=Math.sin(d.angle)*f*L),o.space&&A<=0&&(fn(),A=C),A-=L,d.vx*=y,d.vy*=y,d.x+=d.vx*L,d.y+=d.vy*L,d.x<0&&(d.x+=W),d.x>W&&(d.x-=W),d.y<0&&(d.y+=$),d.y>$&&(d.y-=$);let X=L/gt;for(let M=0;MW+100||Z.y<-100||Z.y>$+100){N.push(M);continue}let Ct=!1;for(let kt=0;kt=0;M--)h.splice(N[M],1);for(let M of yt)u.push(M);l+=vt;for(let M of u)M.active&&(M.x+=M.vx*L,M.y+=M.vy*L,M.x<-M.radius&&(M.x+=W+2*M.radius),M.x>W+M.radius&&(M.x-=W+2*M.radius),M.y<-M.radius&&(M.y+=$+2*M.radius),M.y>$+M.radius&&(M.y-=$+2*M.radius));for(let M of u)if(M.active&&me(d,M)M.active)&&u.length>0&&(r="gameover",c="win",rt(d.x,d.y,60,{r:.3,g:1,b:.5,a:1}),Tt([1,.05,523,,.05,.2,,.5]))}function De(L){L.fillStyle="#0a0a1a",L.fillRect(0,0,W,$);for(let N of u)N.active&&(L.fillStyle="#888899",L.beginPath(),L.arc(N.x,N.y,N.radius,0,Math.PI*2),L.fill(),L.strokeStyle="#aabbcc",L.lineWidth=2,L.stroke());for(let N of h)L.fillStyle="#ffff00",L.beginPath(),L.arc(N.x,N.y,S,0,Math.PI*2),L.fill();L.save(),L.translate(d.x,d.y),L.rotate(d.angle),L.fillStyle="#00ddff",L.beginPath(),L.moveTo(0,-v),L.lineTo(-v*.7,v*.8),L.lineTo(v*.7,v*.8),L.closePath(),L.fill(),o.up&&(L.fillStyle="#ff8800",L.beginPath(),L.moveTo(-5,v*.5),L.lineTo(0,v*1.2),L.lineTo(5,v*.5),L.closePath(),L.fill()),L.restore(),L.fillStyle="#ffffff",L.font="18px monospace",L.fillText("Score: "+l,10,30);let X=u.filter(N=>N.active).length;L.fillText("Asteroids: "+X,10,55),r==="gameover"&&(L.font="bold 36px monospace",L.fillStyle=c==="win"?"#66ff88":"#ff6666",L.textAlign="center",L.fillText(c==="win"?"YOU WIN!":"GAME OVER",W/2,$/2-40),L.font="20px monospace",L.fillStyle="#aaaaaa",L.fillText("Click to restart",W/2,$/2+20),L.textAlign="left")}function ne(){for(let L of a)try{L.cancel()}catch{}a=[],h=[],u=[]}return{init:pn,update:le,render:De,destroy:ne,_forensicsView:zt}}var pd=ss,gd=ss;async function yd(n){let t=n||{},e=t.engine||await Promise.resolve().then(()=>(Mc(),Ic)),s=(t.seed!=null?t.seed:305441741)>>>0,i=va({seed:s});return na({canvas:t.canvas,statusEl:t.statusEl||null,engine:e,seed:s,mode:t.mode||"play",engineMode:"real",viewport:i.viewport,factory:ss,plugins:i.plugins,registerOrder:i.registerOrder,buildFactoryOpts:i.buildFactoryOpts,recHook:t.recHook||null,onReady:t.onReady||null})}return Bc(md);})();
diff --git a/game-runtime/games/_wg1-gen/asteroids/bundle.iife.js.meta.json b/game-runtime/games/_wg1-gen/asteroids/bundle.iife.js.meta.json
index 54a7023c..d3e0bf34 100644
--- a/game-runtime/games/_wg1-gen/asteroids/bundle.iife.js.meta.json
+++ b/game-runtime/games/_wg1-gen/asteroids/bundle.iife.js.meta.json
@@ -1 +1 @@
-{"inputs":{"src/core/plugin.js":{"bytes":44317,"imports":[],"format":"esm"},"src/plugins/runtime-probe/impl.js":{"bytes":16639,"imports":[],"format":"esm"},"host-dev/engine-caps.js":{"bytes":13897,"imports":[],"format":"esm"},"host-dev/engine-math.js":{"bytes":6155,"imports":[],"format":"esm"},"src/host/boot-game-host.js":{"bytes":28239,"imports":[{"path":"src/core/plugin.js","kind":"import-statement","original":"../core/plugin.js"},{"path":"src/plugins/runtime-probe/impl.js","kind":"import-statement","original":"../plugins/runtime-probe/impl.js"},{"path":"host-dev/engine-caps.js","kind":"import-statement","original":"../../host-dev/engine-caps.js"},{"path":"host-dev/engine-math.js","kind":"import-statement","original":"../../host-dev/engine-math.js"}],"format":"esm"},"src/plugins/collision/impl.js":{"bytes":24812,"imports":[],"format":"esm"},"src/plugins/physics-lite/impl.js":{"bytes":14507,"imports":[],"format":"esm"},"src/plugins/gamefeel/impl.js":{"bytes":21715,"imports":[],"format":"esm"},"src/plugins/particles-juice/impl.js":{"bytes":31830,"imports":[],"format":"esm"},"src/plugins/palette-post/impl.js":{"bytes":20240,"imports":[],"format":"esm"},"src/plugins/audio-music/impl.js":{"bytes":24659,"imports":[],"format":"esm"},"src/plugins/save-progress/impl.js":{"bytes":14608,"imports":[],"format":"esm"},"src/host/generic-host-config.js":{"bytes":7803,"imports":[{"path":"src/plugins/collision/impl.js","kind":"import-statement","original":"../plugins/collision/impl.js"},{"path":"src/plugins/physics-lite/impl.js","kind":"import-statement","original":"../plugins/physics-lite/impl.js"},{"path":"src/plugins/gamefeel/impl.js","kind":"import-statement","original":"../plugins/gamefeel/impl.js"},{"path":"src/plugins/particles-juice/impl.js","kind":"import-statement","original":"../plugins/particles-juice/impl.js"},{"path":"src/plugins/palette-post/impl.js","kind":"import-statement","original":"../plugins/palette-post/impl.js"},{"path":"src/plugins/audio-music/impl.js","kind":"import-statement","original":"../plugins/audio-music/impl.js"},{"path":"src/plugins/save-progress/impl.js","kind":"import-statement","original":"../plugins/save-progress/impl.js"}],"format":"esm"},"games/_wg1-gen/asteroids/generated-factory.js":{"bytes":9418,"imports":[],"format":"esm"},"node_modules/littlejsengine/dist/littlejs.esm.js":{"bytes":640153,"imports":[],"format":"esm"},"games/_wg1-gen/asteroids/entry-bundle.js":{"bytes":6230,"imports":[{"path":"src/host/boot-game-host.js","kind":"import-statement","original":"../../../src/host/boot-game-host.js"},{"path":"src/host/generic-host-config.js","kind":"import-statement","original":"../../../src/host/generic-host-config.js"},{"path":"games/_wg1-gen/asteroids/generated-factory.js","kind":"import-statement","original":"./generated-factory.js"},{"path":"node_modules/littlejsengine/dist/littlejs.esm.js","kind":"dynamic-import","original":"littlejsengine"}],"format":"esm"}},"outputs":{"games/_wg1-gen/asteroids/bundle.iife.js":{"imports":[],"exports":[],"entryPoint":"games/_wg1-gen/asteroids/entry-bundle.js","inputs":{"node_modules/littlejsengine/dist/littlejs.esm.js":{"bytesInOutput":164254},"games/_wg1-gen/asteroids/entry-bundle.js":{"bytesInOutput":507},"src/core/plugin.js":{"bytesInOutput":8989},"src/plugins/runtime-probe/impl.js":{"bytesInOutput":2794},"host-dev/engine-caps.js":{"bytesInOutput":1597},"host-dev/engine-math.js":{"bytesInOutput":498},"src/host/boot-game-host.js":{"bytesInOutput":5505},"src/plugins/collision/impl.js":{"bytesInOutput":1605},"src/plugins/physics-lite/impl.js":{"bytesInOutput":115},"src/plugins/gamefeel/impl.js":{"bytesInOutput":2533},"src/plugins/particles-juice/impl.js":{"bytesInOutput":4166},"src/plugins/palette-post/impl.js":{"bytesInOutput":4216},"src/plugins/audio-music/impl.js":{"bytesInOutput":6001},"src/plugins/save-progress/impl.js":{"bytesInOutput":3933},"src/host/generic-host-config.js":{"bytesInOutput":697},"games/_wg1-gen/asteroids/generated-factory.js":{"bytesInOutput":4408}},"bytes":212389}}}
\ No newline at end of file
+{"inputs":{"src/core/plugin.js":{"bytes":44317,"imports":[],"format":"esm"},"src/plugins/runtime-probe/impl.js":{"bytes":16639,"imports":[],"format":"esm"},"host-dev/engine-caps.js":{"bytes":13897,"imports":[],"format":"esm"},"host-dev/engine-math.js":{"bytes":6155,"imports":[],"format":"esm"},"src/host/boot-game-host.js":{"bytes":28239,"imports":[{"path":"src/core/plugin.js","kind":"import-statement","original":"../core/plugin.js"},{"path":"src/plugins/runtime-probe/impl.js","kind":"import-statement","original":"../plugins/runtime-probe/impl.js"},{"path":"host-dev/engine-caps.js","kind":"import-statement","original":"../../host-dev/engine-caps.js"},{"path":"host-dev/engine-math.js","kind":"import-statement","original":"../../host-dev/engine-math.js"}],"format":"esm"},"src/plugins/collision/impl.js":{"bytes":24812,"imports":[],"format":"esm"},"src/plugins/physics-lite/impl.js":{"bytes":14507,"imports":[],"format":"esm"},"src/plugins/gamefeel/impl.js":{"bytes":21715,"imports":[],"format":"esm"},"src/plugins/particles-juice/impl.js":{"bytes":31830,"imports":[],"format":"esm"},"src/plugins/palette-post/impl.js":{"bytes":20240,"imports":[],"format":"esm"},"src/plugins/audio-music/impl.js":{"bytes":24659,"imports":[],"format":"esm"},"src/plugins/save-progress/impl.js":{"bytes":14608,"imports":[],"format":"esm"},"src/host/generic-host-config.js":{"bytes":7803,"imports":[{"path":"src/plugins/collision/impl.js","kind":"import-statement","original":"../plugins/collision/impl.js"},{"path":"src/plugins/physics-lite/impl.js","kind":"import-statement","original":"../plugins/physics-lite/impl.js"},{"path":"src/plugins/gamefeel/impl.js","kind":"import-statement","original":"../plugins/gamefeel/impl.js"},{"path":"src/plugins/particles-juice/impl.js","kind":"import-statement","original":"../plugins/particles-juice/impl.js"},{"path":"src/plugins/palette-post/impl.js","kind":"import-statement","original":"../plugins/palette-post/impl.js"},{"path":"src/plugins/audio-music/impl.js","kind":"import-statement","original":"../plugins/audio-music/impl.js"},{"path":"src/plugins/save-progress/impl.js","kind":"import-statement","original":"../plugins/save-progress/impl.js"}],"format":"esm"},"games/_wg1-gen/asteroids/generated-factory.js":{"bytes":12427,"imports":[],"format":"esm"},"node_modules/littlejsengine/dist/littlejs.esm.js":{"bytes":640153,"imports":[],"format":"esm"},"games/_wg1-gen/asteroids/entry-bundle.js":{"bytes":6230,"imports":[{"path":"src/host/boot-game-host.js","kind":"import-statement","original":"../../../src/host/boot-game-host.js"},{"path":"src/host/generic-host-config.js","kind":"import-statement","original":"../../../src/host/generic-host-config.js"},{"path":"games/_wg1-gen/asteroids/generated-factory.js","kind":"import-statement","original":"./generated-factory.js"},{"path":"node_modules/littlejsengine/dist/littlejs.esm.js","kind":"dynamic-import","original":"littlejsengine"}],"format":"esm"}},"outputs":{"games/_wg1-gen/asteroids/bundle.iife.js":{"imports":[],"exports":[],"entryPoint":"games/_wg1-gen/asteroids/entry-bundle.js","inputs":{"node_modules/littlejsengine/dist/littlejs.esm.js":{"bytesInOutput":164259},"games/_wg1-gen/asteroids/entry-bundle.js":{"bytesInOutput":507},"src/core/plugin.js":{"bytesInOutput":8989},"src/plugins/runtime-probe/impl.js":{"bytesInOutput":2794},"host-dev/engine-caps.js":{"bytesInOutput":1597},"host-dev/engine-math.js":{"bytesInOutput":498},"src/host/boot-game-host.js":{"bytesInOutput":5498},"src/plugins/collision/impl.js":{"bytesInOutput":1605},"src/plugins/physics-lite/impl.js":{"bytesInOutput":115},"src/plugins/gamefeel/impl.js":{"bytesInOutput":2533},"src/plugins/particles-juice/impl.js":{"bytesInOutput":4159},"src/plugins/palette-post/impl.js":{"bytesInOutput":4216},"src/plugins/audio-music/impl.js":{"bytesInOutput":6001},"src/plugins/save-progress/impl.js":{"bytesInOutput":3933},"src/host/generic-host-config.js":{"bytesInOutput":697},"games/_wg1-gen/asteroids/generated-factory.js":{"bytesInOutput":5137}},"bytes":213109}}}
\ No newline at end of file
diff --git a/game-runtime/games/_wg1-gen/asteroids/evidence/after-play.png b/game-runtime/games/_wg1-gen/asteroids/evidence/after-play.png
index d20f0470d8dd5ba0703cd2ddd9c0f5ef25023edb..57b619d38927b33783a28400900e85c2c5ee0c93 100644
GIT binary patch
literal 45911
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≤We-+N7Ppv75B!UFR!Rp&SfMX8baWm_m_Fw|@oZ=VH&^6ifg-DP~M5
z{g7-psawvKpP$#lhZBVCfZGr_JzWSlLnL{l$Y^Pkk{JitZoD+s&V?V(#2XEpQA^5!
z*=MJzuHWFXMPnzJBMU$A^wmCL5N02tA^kfG7ZC6}##jI$e+zU6A{=*Slr+xE$`kc)
z8p{jiI2GtF6UWw;!nGliPc9qM(N^CZJ6J=OHmvv9H2c#HdmjtjBgS2@iaGu%3eN)(
zEYE?amXp-Kf5DQ|$6bi(?lh@kYS!T`lp9
z!QdyahP1TxKq_*pJ1wr*p!@~EuYfC}tG%XF0A_l`4S*=2nOWDLcW$C|sE-^fr)K?@
zD6T*r2SwoF{Y>I+%s>1ia4(bx-;&loJ$^V#R@1f^em2%I()0Q?9^@0FE+&i$g3N0w
zErr*+fknI4-7M!f83mvabET70P{ofI#s6IiB6C|_!JVza>h-z)ZMr?o4(h$Q*qP+5
z1FseS2jBVOrK#hl_*?%W)A!rsW8>nWFxX*(ION4W&a09?JL@~KV%}9Vqp4z9^B9u%
z5ycP9mX@pxB25ohF)V5MmouHD6|5pZ-;|8!(RpT2lhr~%U)kHg&`X4~Q`6IdLSB2rV3NKAA_uQ0m?;E5
z{9fdqvuea4V?y+U!XjD;711fJx{ivjSFg}tXUxww0*Egac>v`EQ?F&-MI@fnkk9hu
z$Kt5wF=^J&z4$2P8yyRrC!YQUL*?6=2JDb*zwgdLR=DjyGUyE$EmEeHdQ^Q0BMyIl
z9`q_6lLCi%d=y7==@+El(2}&Yj4R#KM?AS!;{o+ZB+FK_!w9naDx?)8c;Dm-{8jGJ
zpIp2(Q|W#9o-VRPZRpmm$nx@P3W`hu&Ti7QxVW*Jvh$=&+5!%4*ufTvW14;pd2|QJ
zm~`hl{T@oLZwg-rK)r5I2#IUAz^ND7`d?o_0U$RMAq+kV2Mm25Lb$)Lu}9Y1syj)w
zFu3C~{*jL!Kz!1g_U$bZ1^VvnkRnO5y6&bWF1rXl*l4X?L%$`5;+9h)+#Kext75R?
z!s5FS5;zz^9a9zWejSxSWoeuhKef$^(<^X43kp(masrOPcY>n+pr+ppBIkI^WSqZT
zzOwlORB27Kw9N+rc>Vvt-TjGTK*&K4-PV@qTYqdiAe3{kv2j1S8Gnn#Bq~b1vXX(G
z;SisCeFJwm04sh|Aq`$lRurB~)oFdbr$jH`147S$8#XB(i(iUa+VXOQZ3S$6B${-psCcrGAa%%dCFaPF8TwV|QD
zCes={vupZV^72pkegdpJi3t%Xf9$R<3#WLu+f9
zIL2d(SmM*nr|XbGJusK=f^ahs9>{eM)@r()cPWC9dQg+B#vyAPTcO%_b}_84PXH&l
zH!_kmlCn|;D>zI>!BiwWyRELNx`V;r=KjvF0QortwC_uh_NWQVLs;+0Ef4@_KSpcj
z5vBB=Yf9REM}jD8=(zJ7q!qv%msz^O}5Dmr1+I
zJzl@_KYxG81U{LraX8#FQ=sCQh6mZ={doey6P&x`0!bSO0yqxv@V|V
z+J|e@iO*DcA9Z$Z&GND^3&6F)f4~N2FTCBi
zXX=XH&dsJ^P$5U#lw!XFN44zXR$5*XS4qHOQSLk^L`g4
zHSRbLg^F)>i_AJdYd^Hy#m6_1d&;z^X2>Nt9j{Q^)uV7F`N;m}^d~$yF8-JZD#b@1
zsLsf~J%djpY>VD#myKBT$7pOl40TzSo8_vo$QE{P+7|paG3(6HzQW>-)w4l2ez-?}
z3-ag-AXt8V3`mg1UjY~Ke~12m?}gt-RertPsD{CvOU~xe~A|j%r32Vt&DGhR1su;_42m6#AD%3<
z89)B%5^HJs<{sqFy%bPYu8zv^pxb#MX>9y~VN}b953&zyaahEbp8Fa4N-kX_-p_K~
z^3y76iIbM-IBw!-)45bJ+{swktaHb}HBhkRmOqtE|2bx2?j*GuY(MLBKUpOBJZ;Gp
z-xD6T?3{%e(&veNJvN$cW39gC!jlpvE-^8OFk5JM@L5x!PJ2W5){8_Q((vO;Zf;HE
zhC#f6uPd9Y%hFwf&$dP|c#TDR9*f}f^Ydn99)ppmMLFfJ+P=;TqbdV_En@D|yXZ0>
z%+J}zE6RM}J_&@@7ME~K$FSz=5_JClHBg5*1^J;nl8{t-?m6Vj0SOW2H9N8j4^_T6{LB}VQzZ9aV@892C
zTie)tJuyB$J{AjG`>4}g=#0abs5lTg&V!keI`X-!?m)tKo}8bbKZiH#*RQi0d$AwB
z-hM88ieFxcQ}xLa9vzvlZ)E8`kVueY?63Rt(Uh$Y8!3A=`4Q+s4~IJJsXJ`vWzgd9
z%KN8?dN+x~Q8@u>W@wDQ@7b}e)7_GmSmji&)BF3BT(z*7`uOL%*SQ1bu0Cqtm^&Tc
znA@M-<24XH8=ivT%Pi-WxkCLx0q*5qh43;t$B3xDuu6UJ-)O+*anSp2ivR++%CsF)Mv?QYG)1(d
zR7limuTGyYXl!y^U{-#JLkB9`;p>k4-RBf_2SW0~L}P@1!azsln>OfS^lcX8TNRb#
z(v+NEAzY0vyTdtG!U(`P`YzafaeDgY%dQjO=Sqj3xTj(+Xr$Qlr>Y_i*v4%FM}6?Z
zU)Xq`#X5LttUcAU^tK8&NuodN*%|=zs9)C;X>}zx6}%e#WA^4m<-Cp#FdQ1sjy|t3
zCdxlp-D0I}+PFq{^XZ{9nPhcQQCah1MbGQN6ja^<`m2b$E%!q|p{_1=Z7!oawx4&w
z3mDtl+#lec3A6NYbWBIED@tU&e0hP-Y>)9hx=w}n-I)GXIx@w%<#UeH_H5(3dNw1x
z=PRuQ*A$;c;;D|QuN@@r_p{Ryxwr?eu_Z2bgBq3LRGhjz-docU4SB{Zn$;r{#RYw)
z?Hy{L@9trqh7!h!#hId+%5Fc61vjWAim)xQ`;o_@=rA=Kw7ru|&`xr|Gtcf
zeEq&o-%8)m5p>8!8z9;W7gVGs8uq1Nch_3S2=5P
zdBw-zu^N#g%=8RtMGbOnIPAOOAV&Xnt)|_&h@x*|@}JLtSG?6wQ1EAEh=LUAz>JKn
zl3(kzt9&vo%;oDRBD(RN2lSZNp^MV`@7xQyJjWG8Q9jV=eh(S}V(#%%{S1S~AJf6vMx~OVKt9rJ_!d9MATy~%LPAVd#ZT>`PWH5pa
zwaZHwD?1!OAH>QG9(MSB5YRII!wb-JbKL3bc*susYD4#3eW8v01C)WED$HTKon;*V
z`|Ha=Bjzz6mgCejUH7iuIzcRt&o6z``wJ^QXvhGwoQecl97k&>qmzjY&ChJ?Xz(vj
zK~L40Trd#F6QL-%?u@8(%(vz2VjI2b8e|!tElHC>{!$yA8)vBAqnj}0;dIWO$b{yW
zm;3Y_xi=qaQQ@3vz|3h4D}ipGbg8@!EFoBC$sL)gvEbHKe;`rmIZ}^uAikUy5EE=O
z?4*6Qv-3pAK!ewNZTP8JRew@ED}v%=0t=GOXs8Mj6PF>9W7OT|Hr6&OViyOyzZ74-
zEPq3@zD>-cS=CLsq-UkK@c}V$vAUdejfToR3L>;<)U=PbgTiAj@BVo?F=Z~Yk)Q`mY_X2?*~4oXb{*#EKtE-QJ>b2e%GQ>4eMg5&va-LN?p`X!T0P2K7Rl6mE_%Drfg%QL(ii6!ib0i7w8iadM@h){AQmI_S4SGVAw#|
zO-G*~Mo1WZt&3%aQ@_@9s$%z-rFcO>W8=M6r^$|)N#ujR$1*l{IlKe5vj_lesm2mnVKrhQjtQJ<
zvGrd7qmm>mVxSChab#Ii;-ca2==iv}u2C$lhuESr+PkdlG%n7wC!X$bvi5AE@a^SL$j$0Gv`
z4UzktrM@`PIn4T;&+LM%&<8R?!jWC6FAzmKma;dy<#T5+Jw0f+h=d5=^xT;6;23|D
z*z(d37dtx>D3s4N#>!IYG@kZ8<~$8Ib*vyCh8(49X0yKaWZlRjH
zB}RPJHT>1pW)G5#jT{HKw@!}Yn|9eJTX|HAu3|S*j{?uV-Ed(5}r&LWpc7qPDqf#j@BuCzVeY^pl+vCMj`G~e6}-)Wtk{J;7VOLfM@m%2i|vc@XEM*
z8mrW7doE`SVxvDl6mE;W_x1sJRK>*cqp)RN&QK*K&Pu(cL}+3n
zH9kK6nK$_7bpwoAFE7#KZDQ5Oph3xRrVz*<-OEpRBJm(3FM%2I8|Yh*Xa76&zn=Ji
zKPJAJ8uq#H?Mw-pI2LXxQK*y;Yy*
zN`Hcc1O(zZ`G%2+EQr0Vj`{LS#u=l*LE;1`^FSneSDv$^GOpy!eF#Lzay|@YQ6k0-
zelsY|SR$+f1}_Z{sXP!8Q_qW-z)B}GJor;`?QLJ34Y-6FBVoMEF#CX*Ao$A*FH=YQ
zDD70Z2n6yJK0Pk+M#K_m7zIV3GK?0tu*h@G&J~3Yf_M(#tnkp91L%-f+Yy=R_3%pV|zOj5-fL>8qD7r!K#}j*Q_-=>{4M#DCo_KU94!
zNbW&5(RJ{RvSvDtKN=6Bi71zQogFq=AQn^2a@nv+q-N8&fY4J={-kiWMUE{=zQTqY
z^5~naI*%BsJg^(V*@c3X^85)wD-oNM_542%o;v)^{H#F9t@nPol}SNlxwmU{%#0@i
z89;bhx2P(~z`RA>Q
zgP5froz!}trS52DanCi@yoNs;9RX{ehC2uCN>D+NF88;qPerWSt_KVqZe%5Wmm*om
zMDSQ%iZ2$!t|DqT6|9ljmGQJd+0g0rfz#SX>1})m2;6L>J?|mx92lv=AWuJ4My2ZVS-g?Un$2>*5lL7`{b~J}MKY;x!_w)7yWO1M%78s$fki_2
z#{lzl$b8O5cW$Itef`W;{{lA*b*X1xtPTgXd>&&IHxL>|6u$WCi)`Q*X9kmi7ve^p
zRKcH(pPec^esDMQcQ|8If%E}u!s}dh{sg28b98CnsB{`{^-@jElbW}?^T3|f$qWxw
zDQ>H5XE+dD@b5Tj7Lng#`r~^9d^sD(|UqZGZ
zhMM*k#8Gv=XRfijyxR5r&$0t-W7)x%{bzO|Ff-Pb9K0@|Wp>u~VZJSL0;svMSo9k0
z!{pYW-um3!`sKLgqoc(7lN6Oku||m|Oq#>R1dR6nLn4S~<8MJ68hD-hPFm>BVpL8Z2W%ivyuoLzU;wK=Fxx2ReZ2G~u=SP}N_CFM
z+rB4xY5+S-9xi@b-F%Uhf`VU%6pl$V&bak(8exlYq<_q8ENy+xLIn*^>nB*EyY}`m
z`lSvyEGW`?yN+ts!DTvon7?v)z$QVAB|&5l(YIocX(4VtE^#0tPWkiw+MiF~YmZhk
zyti)cRFphNSIwRLh9$XrWT9%$S1tKmM-dJVkJE@p6vYLRbs%o4)Sz;?KZ)O6d2i>s
zQ-S8`x=opZcNbII*+Nok`5i)4U!p$7rB|{Nd+ggZ_uZ_BxnI&dp$P@S&~uMbc|;M?
z_9VRCZR<&x!54uUCXIq4nGn6@URH^Oo+a#>jnUceu>e
zx}q8W5;os_7$|XPN4-RRp;rYrW)x4Qo}s!rU2bxAdPt!u$MoykHPk~`gY!zM<%41u
zp5W{x?0T7sZZ#W3_5ZYY<^NE%@Be6d^bjhgBza__lqE~ZR`#)EPbEu|AxZL+{zbHM^pa4C|nTpI*qo)q;Svk6{`gJRLq~B6cRDqS{|wsrxWhH-o!4
zEa%R*2$KKkD2&o<9aO8I;9FlRw@XH-T4w!iP^vH2Ph7P^)+{S?H#gc%x2FJVC2#D{
zbVS&l5jy9&BZ9`5E$?yT>`
zsV7=qG<|aS?;-9>qIF*v77B0c^3%H;sfd(PM1MQ2Lx~$o1X!+lY~+nNeVwv<*Qxrl
zoYaX^COsT!$r{dY0OMuA&!4fK?$KUjyK2g}u`qfHO1!0ULZT1c>lTT*v#I;|pN=VS
zO%ENRUi8O}tk@4;W%!MahOa0gdez3n8-akO;Dz>f@D2oH(8j>|ZGW4h8BkQ9A
z#CYCR%DJ4$r)MT=&V>s--aMQ|vcHoONT-#J-hX$iEbKs*!-cTZ8w*?kGoM!b;yJlo
zhOhr1^UHrhDnDtW*GJhq&CTfa_b4%bsIvsMCLCR=YOmayXe$U*r+%)<%|%g&wGV+Y
za&4@=Nt~bnWXRFuSB@#*DcKFmYVlZ$Kqu_#M$IzMpRMJq4#QGu+;902{wT%
zuj4Z69XXv!UP~bS0)+4!ySv
zgV|lRu2_35r~ja{uhhdrC4s%_pOJ4mn+xQO`rLwQ@AfJmFe0#+SIZlG6jR@zxo3cV&v=iz^?rED?b)rJ91{r2-RH!1S;?ObLRvyO|n5B
zt}H>iLNSR(*p>&+1|I|R&Z_c&gn37*a>lZAenk!*FANzOYn2Gsgsj-
zg#-PAr_esYUtEf?@o87!h=>4VCm19Dv)97f_$=4@`l%7SoyUN)=3E!32v(DdlS(>d
z1SVT()vuiXxTZaPv~bH!3xt!u`yd_-;Z>s>5`EZt;!~w~@=Dhe_8h0DW)|nKDzA8N
zx0*+gNGw5Yf-z@`XV)y=HVqPqc4@~Fj{>5|{^>;gRA!2g1N2_)6|Cu#ZzDCMkWc4!
zzRTc_&ny*j2on8U$L@RfV`;ehUO;e*bdTI|ca{uH8%h5rErJh$w_;ud&E8VAgVs>xB>F2M1*$H
zi{O^)GV;s$;#Nc@a7tHjjvSJ)+lBUYl$RWQR?odSJMXi45Q@7AJO1mfcGr@TZBfKg
zgR0yqI9si!aLf?^?=MA=U`Xk
z&XDa;u}Jn%ufweFq}r&^FkW|ia%px}iY3U&5N2Mf?=ZpY4Pvr>#L6ZCe+MvW5a{Mf
z+l6d@!iyGj6+H_Ji_=izhK5P$m8f*JulikPm*cC;WMxbL*TEno(T;c~@hrH@(hYF_
zfoQY!*2+tQG5GcdKde6f0MwnTljA*DBr+s?!tKv%<|iJ@{c{yFDh74OgX8s&I|SkQ
z?@#sPRyMr{3=~;JgTYau$A%>a=m$-2;rLdEn3qNWy;$132FwRP&;x%eszT0pa3e58puV5bphAZ_R$-PKr
zqZT2+YUfhL-zK8HJCNUk-kANFE9Uos1~x)E0L9g&!sHRJBe8wypbD%n?JS4M(R3{XHiWAB1UKR%Q>Wd)X|&1(_Z2
zi#c*IAfVFQ1vrdYIQZp)+KZ>turyXKA~Nz12#l89chjgmiHJF@<$>7D{PJ>{z?H)0
z1JEfo*focGdYJ5cy2BN>*zC0Vy^*CYI&?GS7(Co(WjTyD((zZl`iQWeR7$>U;$5Qu
zM5i`5t*%3@X&$V+>Bvu+oYc6`Inc+Gc$7rr&)|S#<&Zxl&pn%VEsJaNA{k_t469c?pbiavA1@`?6{10|zz&&lMmGoo
zjfk)BV>+l
zPP1C)^lh)|PAX#P-Q#I#zZ;wz_oM7O?7xbuHI_0G)_^iLup)1LF}k$7gd_4nSuz*G
zgg^?np60hG#!n#G9FzCXV;3GR^IO>3P6hrIiqnF*mk9Wy?1nxPGY0Lu3ZJ+*lVoJV
zqX3`0S+kn*uU~haIX3N+?(B>pVZUV2
znwcwmWJMJ4cCk7aMpXmXb6UC=nhBKEWp%uQQ=Q4xG!w%DG(P*Xo8*^@WdR
z5{Se{Eiql=bnWv*uonHueuQpV-LAthF`=QM&CM?(B
z!6p)eW>F-#xy~h4&%ZTo;*yTw5K>qFn5yA@x9y!m-jqd20P`1acZLF9N5?ZhiFrVn
z4_}JY4fTi@Ym>SDhgufWO`P(&#HaoxX1CSi03`i931)pa%?LgJmDSp#cdm=-DUUX#
z;t2%DPBC0th-kc%V`9w{^OdDL=`P+&ctigSit=avg<-8XF-$@xjyTp^aGvrdMMs!#
zc<7Ic3bt+kEL~YIFZMfmx)~;up`ANR2{?KWLCg|dE<|Udaj4h>fi=iDDDAk5`$
zg0ZkDG&*7~Y-L$F(_`AUsK!9yc1HG4E5qWu?6_(~C
zkzRW#c8h}B38%V96h@zz>eemD*5Nq(99CNZZ41h6>|Bd?ZfA5G&}aZ3i4Nk-hJSo^
zT%YavT77S_5A5F|N8Ad5YQq7XaM&!UoIB;*R{|hH;F-Ki%@mm)3Jyy(90%iN{dxcK
zRnou3Mk&+Fv2LO~Z&-qOwPEhx*+S~bs?6|tG1Ffdf@#00JI$?VoXXt%OgPr
ztJEbL!2UG}#uC@F-heQH+M~iT=*u6ZzN}`dDm!hjY`@`&z`o9$2AKe*vl8lC=KpoW1{MlHZaBm`8sWi?9vIu&5==j-tO
zA~M_4cRa_Obq85z7`TSSYz}q+L1E$`fXi)rbA2EgG&NMM_QVUvIxWncIe#XR#qw>_
zb-@(hCk9ql+btM6y}xFswBRu0a3i{*t&|ZRidr0528DYutJPDFO-;46J+$>NIfZ57>87Abzo)E4Vi0*ve6Sz)`1IQ@Xvcmh=uCacIkGN%IxhQ$V^9SUVdR=
zcC}ElVa^xwi19edrtm|4cJ}U1U=WNg6l3@ohapJ1U+CC9TLYQ{)2pke#qWD|!82kX
znd;J9lkoU72IKXYar+8__vqzJP^hs`2|ig)i?>ukbsOvj1OVboFeXuE+n*IA?P`^zndu=`ey4rT7q0knuNpaoYjvgPE2-uLoY>^jvau%sq
zAan7~AD<;_(_jCJ9o^((PG@K0+P4yU
zE-`lnaKknG;gJ3chHupbTM$HU5(_|@nzafr6tgxM0MFZK(F|$h^J0#X#QKKLGVj@u
znnf&zxw*-hIL#9DA)q>KbnJv?!Dmg$_{z3M7=X^OO+ttMt
z>5}5r(>L#4{$PQ^oZ6AY>{trbOYdI30x1Ek_!e7f`;`wvt>`B*ygJsOj{}{>LaGb0
zW2x3QQOfv4uWXr2X=z_yziPiTW3pM5{uNa-T#ms&?`HvCk0nG7BK?Pl#j9s?hJ;XB
z32oC_#nk~Xs;iA9r?f@J!vsLUqQ~FkC{6|;HB}jFF7=kgXpX|{e#F-F50m+!vA?1l
z+URV2;G}-}_;}}dbfKac2iLULOZIJlL7PiFuN!A1LL7~BV6kEL
zq6!-dXYn77=Ct(SrIS2e@%a4f^am9+Qy$bsTJ^dOb3I;w@$@}qY7aVh3+8^H$Ki>g
z>fF4C_?M;mQfKV_`*rT%`m42IPmiaYR#7TTw&HSUe-|V~2AmMYXMhr}wj(72c2GgT
zPz-y0KbhttqZUo0lzE^rpD-By4gS}!UPS8lYYU=OEB^4C)1mMpV8W^BwdiI6UwOLH
zKDjy82m+`!sP6!9>WCv>LySHj^qAHX5X;L;s;JNxHpTLqS|()Yk;0Eg@hWUxb8yVc
z1YhkLRo>ZLpj7%H`hySpdDGe>Dq;kJ64dr>V@8I^p
z3oaGUMP;z7AUkA!b$@b0(w$vksr)A^zdo>eUDY%53(-fK9Tyj@xJEq|fnKK?$Yp?y
zLRtI$zdx00Sh@T{KneJ0N!|)Y#eGU|6tIG6caK8m>aefjQh>6}_
z2D)QuG!jrUX?;{`K>#Mdnv}zf
ze*~oG@tkV43txlWHC5TsWj=kh{_(dQ7<9BUBg3ZpD9YD#}xpU
z!{)cNXpIut)dFN?&nOZL^NVxrkn}5^=WN`hiCvo-ChHXo+?^ZJF{B0G+3e^RYdb&j
zMzu6R0RZX35S_jZwuO_Ow)XF=z>!sCJl_#ngC=jnZiV>lR3fiZvXyTrRXy6H*SXiU
zUQI5|xjdH+G(VtD;65zI1h0`T`cT}@x8}Klw2#d460ZtC2>GtG?EYE7iFu!y`LOTP
z+PGI)-wTwPFUUa-)`tIc^kzs_ZUOUKGp5o^r_s*6;}@w@-$dT{bt9SY`cG|bJ(1C8
zdy4U?&vbu-GqZ4K%65CCf`@J>&}}*R`PKg^OL*u%*)%cEN)e82;qqToWewuJ1-te5
z6;E+1uC0&K+gt62O8ny`E9<7~pvjE~MJ|INqMe0AaXQaim)aJIg==Hcphz)#QRD#z
zF>O2eu5TFWZzvka2A#SMyLC9Rx6gao*~an)*mx`R?xnw}u=_h#B8CwiDopc&|F%J|
zpRy36w_wE`3kQV8
zulaJ1gEud7!zIapYYsPgdXg=~F;7fiZ;;3U@L<{fLNuCWE*u-wx={l(Domzv*1ZIv
fod09rCJ#bEEmi$-&-?CyBM@Bkwno01?eqTtaz;1H

literal 49871
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
E-#GUb4gdfE

literal 41045
zcmeFZXH?V8yEYm`K@{OpR6v?Ym!=@SDk36Xn)Hqo={1xDrK$8T9i>Z?UIIi#2)*}E
zrS}$EAjuh?z4uyYop-$-_UH5Wqx>>+&&*w~`nyjdqfJHe1)TvU!OLUX}p-X31Wpn(l|wb`q~&q*XS7<^3GkotE8!I
zm0ly}@+Qdn$+KG!i0Ttt?~PVOP1|sPKj++iwuXwdX2TWEe}8K8_s3|Mmm-%HtHQ&P
z^gc2!tymxxHMD+#MuBHk~Lm4x&JN*4Nnl?XD&L!uV-SkY{foj8`h>s^i3dI;N^
zuQ0=h=*y6R%5XKZ1A!_-JKE?)ax1Hn)||Z-dP$y7|Nd>&soq>RRxo~*{nD4!)#$~!
z83_m^i~D<(Cyfh!K8Tvx!ZV`LwVvxGV``M*s5k!irLp8CB?Rt=ZN0$HMILRnj
zTO$@x_|@YF^@Y%NL^4c)qcu-%#iq3mj^|Y4{BQiX81hYpLNrhx7m4~x?|b@vC569Y
z%;GQR(;QwSvG;{u{6dLZ)?Ve}m<)|e_*iKRSj8fezE+2o%zX8_dFx`QKKmGrMg5v<
zFBj-Pc;aodrGIhUrDdfmY#nkx#TtRQ>;H<|EIxfgW5T3R%0(i@gdBAer`_pL4g7Df`o=EFd8-IL(Rj^gu}Mi|1sW~j-(|y)bM+VDFKx~?nf!J?3uNeMYxjL|F}Jp^0m?pc
z;KeB6;2vMn1cw{j*~Q34T_HVV@ZG#>fG96t`(u!_O5Npll~l`XQOLXXGrxq|%bFH*
z^KVytx`L@QaPy&Mo?1VzU%NKdaL6&i{SfFtji1E^@+H+R&P9nAetrd`#??}@^JI#m
ztgKDv`;`L&F_-w3WeBICp`i*Kr0pp?UHmc};AcnEZH8gOH)R8y)c>h`B`)jdXFqlB
z8K^1#g8rXaRk5YZxV#Qa>=F8o$c#5CnA-So%8kFo2%+IwMTRLA?33)V!Hn(1F#U;B
zlTJ!cFPasz9Te4j4b<-K_wPbw6ES5DZ74SjO|{@qQkyu{HQ+EqC+r@aWgO
zsz9N^&TL*Y&`OwQM%$I^y@?SVnSR3D_W5N_T{7mDg=@VMPSCmcsLPO_$<63!x2Zp(
z1`>RH?z7VQhQp*3{wC;SI=6fG(qBiet^M4pcZ>H^l}$g@uJX(=g~+
z<64gmiUA_p+f~;-pWo%;(o~g(;)m1-D$QT<23;68>>BlC(@`z5X}1h+beop8lxf>S
zIQ4i-!u!`1-G<-lHcU*JgM&|ih>9HPmDW8Z6Vdr1{7zAL)|D0Nyd34b;4JnJj|}mf
zPUn8)H9bA46nE~5c?*rcZ|UlC!=Dcr8}o7;9K9Va#plY3K2<}YKYyN_a^c|bTS@oI
z+i!1dJdeCJ$d;7mwc1}}5tVM66#ZxZH43w)X?bgZzk=T<-F;B<^!r3*{svX7s3dcL
z|JOj>5`7;6&g&CJ`=do1_o-l}=j4YZ6PQkB^t)O8(JGAZVpJ_KmWqdW85nFu?&~-A
z)wyJQZRz_SPuG4{)z-2c9$vJGQc2ahsz4{qqnH_OIa$fZy4E8?u=k3!N>>AJrQ6a`
zzd=|DO)o5|GiSrbCT~l|RaWQOLy^zQI&ctO^|lX&kSass&yfUNj?vs|5Knh|z=OEY
ztC0&)GRu{HGc{ofJ_2l0Zha1FGPr`(OUb_CObhQSJvP)1mV4F~A<1cs-g5-U#=Z64
zr~xPJi74!M_~PPMY|roCiT5S!M=`VK%a({ht41maWX0E^1Lp8MC;A^k0cS`M;|;wR
z_r$9XJs(4LN_6H~rEVxzykb7H$M{-K)~$b6a&tTOBjDavj1Qf5S&gh@68yAIYtkv@
z^&3z02Cj@5`$BcM8#i7(i**vRY`>3VJf-TKZ7MFF+HO~1)El1eUU}m=^jJ$vYx3Ss
z^I65dH+$mc0OM%g*9bqk$Qm&}?=;zCwi^z-ED5^F&4%gBX>CMawYa^g1CQjU(4k;b-RDFvYzfg_T1b=;CSk$
z1hbj)tIowgf6Cof_=-zPhB9IgOWtPs8)6s`(UxZujQ*IunnoLeLsD|4URO3q
zKb^5rMW3AmFT4EnAMpmqG~^j_?p8TtNa=nX7k!2fX6Ch`vP9g948IrV-Sg*Pl*tPV
z4HE7!Ac&L&m~SwMyR?4Ru0ejqV7e8U{9oloi_H4Xn%kzcu8$g&4I$Tmz8`k$J#|n~
zDe)Tt-thc7f8#f}j%W8LmKgrVjZ$R02y`Lh_;Z-j@s65N<4I3^Jl9GF`qmC#^NAsj
z;ZVS`-Be3&LSWf(D6gb;1`EfE82&IVU6mjsbGT)xt*vcteqK^*?1XN_9i6SOPX@6f
zw#6U;aXCvmC6hBgCg{}xiZ>W@Sz2M9Ni-riTua*?ZzG@L%#JF~_dK4aOoJ}7O^zoW
znOkIgZ5!H;8L>_DEV0DBvaraWek_2Sa&E~iZs0?$u5#jt1YWL*FnP~C#{H_uV`KTS
zI^3CHp8Eaql_)4#onHe*1Py5XF`upWRhdwwWBa^AI^`KHMgxh$(
zDgI{wBk
zNT2Vz;qu6}uUrW(FMm9lkt~>R^%g$RLC0r&p13+(puvJk1zt0;x?DB#`0y}6%6*GC
z(+2O=qKxY^dHwn!eaW|PJr21;`D!&0*-mzL;yaC94l)_|fbMP{BFO3;+S8F8c#_Xr
zN6Wj^7KJ~HOG#s6saGN`e+NC)f7jk#hTZjDNsI}~eyEtzCqwYrUt9>K%w+GnV_k_;
zkoH(-#hIH`zEvBO;ckgo{b1G-dpPhN=XJA(iYk6pBwsoCzIe6$SVk|U=-*EFtq2B*
zSM@Ry61tu%wo$RM0`oR{dJfBWgWFI1jwYxb1RZ>QYspZg6r#8ta!3|*t+HuJn>X$b
z9eKt=8{1X-j=5hqnVCxhzc9h9?Bl3NS*o3#UsiPV^dQ#qBwmDnsqxw&Lge>~E@+i(
zEez#l4783YZBl4@>gw@0MB2*WV$;{xQ-CO+=?s_W}$
z8ldm@M{Y``h7f0zS~ww;7K$*kVm{>vh7Yt#R-}Aea;dV>EWgMD2;U
zFy;LiGSklZulA$#HtWICtX_iF?tZ4G8}cTgw9`6%ow8}`W#H$xNo~@IupgVG70i1`
z`SFu&oG$FtDrvN)l>t`?v@7apXKsGp1;qgGkCLmPbH&UBIyfSMhuk=vR;-Y5B;d6M
z1U;duA!2X>#m-fOy4`ra$~-U3W+X$Ah~xQFUmg>Dp>x&#{xuw{+G|_ejqoJo*|a=1
zA9lX?7AU(1P-(B-*@2{#w&~AoHk$t)H*c&7HEqxfvMcH+=oFv)
zMKK{8LCkR&lI&DwsrRN4Bn(hcz5Qap)h~Ym$XhQbLBG4SSe2D$Y3oh2D$H0
zJN+f5d;xcCQomVofH-P1O4&T)9G@=pny{iabpEARVZXnY&!nPgTX|_ujuK}Cfna~z
zD^V1qM;h!}v;OSX)&29{Acxa>k2Mb7t
zLVW{2OcwjFguSkKWh){PVAGuIXndBYr4jSBOgJ}3xyHaSw+RHOM%?gxMSgKk&M*pP
zaJSpibr3eGYYg2;G{CE!N^5KDVFg(bEF8+K@1*LoS*{y_N@5az*>ll}7w!elhvhwf
z#z{t0hOc6&nKvxg7Ka`Fe2wJUld=KN?#C^}m-M$kR6Nmx6UIB!Z6lFvjZ~`j2$c}V
zrKQvP(99pH8+xAPxCJJHBRr>DTtLP{%PK}b9qokdbIi}oG&u{Za$obJC}dTvo%S@*
z)~=pb)x+GA@(C*LxlBSLTFCD1z6b?YQ5NYv&JraF%0vJBhF(9E+r~XQ1IMhGJ0WXB
zam2)Dn|K@Q`L#9XzQDxj=Lf85624;0pE5#OE9=X{6iSVo@EshP_DDjE0)8)(&^R^y
zDSy`gc!8A3ukk>a*Wjq7mD+@b{(0iBoO!u
zjiI}=kpNGvVn)x*gwP7c;?5hS4waG2_7p>TY{4Nly`M27>)l?>TTNeIreuWVfLt>t
z=M#SuMxP_@L8qz93^WN0TF=1X41#0#7ng4i87)WGu6?#7`;Ifh3b=OYPDH5J#27h&
zoN1$e1z(!&d$u(=ax)+DBSyY(Ap0$!KIY@Jx0}?&`$G`lqz;GS&&S49))wCYgStUD
zo84fK>u`j7c=TxN;^x7U?m!^aySTh5WYbJTbYNN8ad&cuw6tnk9x6d4RYf!^)()_J%e9cYy3Mpw%hLk@R!v(@*
zb#*oHz_zw)z$J6>Zf%*H>b9#bf|Qj;+`T`M7wNax`g)=Z95LVWdN7Nl=-cobJw3fz
zTZ@#!Uk^xP_ZDv5B9*sEO+CIleX?jbpg>Ox00&vMDUXSu>#8{N^x#uuDPoObRL0sP`;3d0q}y{8>yyib3j(f?3W
z>u70>^!LAg`qc|$X@b_Q3eT&oW7EE+%*xbMG?engT`u4UzC{!-G|+-r6V{_>Y@9(x
z_BA(G=Iwxi0A*xu7l5b|fbMy3c*8v2PH9ecYpG4@Vjvdr^)3=H(Q
z7Y($uY_}A;5THCzO%r{t6I&%k=Se+t9wl^G`q(i20;=JjjL}bt(UtOYP0N4VW!d`v
zJ*>R^YisL>btQUs-};faYKEluYCk7Vt9!P%3yUPYvvE(>hW$HbLDkgv8;G!F<&TfC
z)!oU93kwNfXdJ(b=<1AIuVovWDc0jMGb5VJc%d}p#mL1dq>g#t$sOUPtJHEY
zFF}6hj)=Tz)=%fE9LSl!slTEn8?ZC?^rq`uD6|9-{`zy+^>lF$8!fFL&0!8*&41}K
zPsA#-^y?Ve<3M#Q)y+taTRj{ij&MlyC@OLouN0}x%6eV*h<2?lN^SVK?9;NmMoAcQ
z>TI9-%usmYUoemECUY~q(Rr${l4N3wpTA7Zy+BlEc1b7w8pV;4>gULaxRGq(u2#nO
z@7|ch5(H(!b?O%vg7zriyIH>aSy9e>i?n-qG-Z(D&XQ%4Q2oyv<{BFB6%_}txpofU
z?dXip-}QygGP&YZpFN9}sK;ZAK>C>HfXD6hEv`^sgZ%tyv5TqOjE}ePrCHk9usV*P
zn0oU@Jt4`&*wAp~tR=y6jgyb>iLme=8;k>CbFf;E-~(6C(`Hi3ot6(`^@>fd7kuzQ
z8Qr)TYmYoJFN8qIwdQ|GBc-fPpa*f23T%bt1FzN9lamaLU+ZsePQHHm5lQ}n!HQ)q
zR7I?eZvx3bv?P96VxH~M&!CWyVxzMX&$mxuuwRYPw^tznbPr43d4sbR@H6x_-e>+nzFj^>-^g)ReTZAYP}SZ{gM<=R;%$LJ(dO`p&^}Btb#*9W;Yf55^AH8YDIl$Pql&JgJDk&jxG(D
zhzhW#!|};ju_r>*#@>+!&jtfrkEh{^s*K+qKFWHtu5{E4X*g&{3P?k!_&kc
zx=t3X#stb$-Es5ftgW*i%J|mf8z!>J^|0{KCm1S*Suuop2@g`jtD?Vscl;mpm;e54
zzJ!mBeN6-*e&a7Ul)@0a&-}-c_Dk&F53zp(Xd_OZ@Y33G{DN&Imv@VLO_Pgw
zm5!l4KD}Qad+aanAw0K?Y8{6(qSC>crAqs|K6_@Uua9kuFnINi%NA3|ci)|UJdsh3*thpc_l@Ec7pJ(cC_r+Bv{n^Y?=<@>hQ%OXs_}e3
zEYth1-qLj|<@)0pv{Ta|_UBIsB7f0}UqZrbZE&e}w)rIz`C~UAN=>P+FiAJnWWKmk
zm7ia2Z0B^AFr!Yf1Us5Q@z>40!}al`tUN3+C^sK*g8TX_*si5INv8oa33P)z67#vUUw3Fzjt*LqT`+6CV@p+zTZ1#yd1hQS!YZ*hy
zjD=biAS8nWSDhZmWqALkEpklh18}Iy>GuGLh28q-+4h;{Sy;KKUvg5+-${G^TC~#>
ztS_O{@pk+a#*tfm65pHmRgRQN^v7C?J?w2#^t+w&)Y-JOgle~6AL_qn>i+rjd}G${
zWH&y68(E|D^7ZS%==qkoL*Ki+4Hk#%PKz*v)(S`>+?K0`hj|4ks|lWFW?yF*;@HFo
zh@j@RP9`4v9S7AxmT2fox(Hz}O5~#|!*rFlx~Agbtj$XFWV5o?D)E-W1LDx|+X|AK9UM%F
z$#P=fr`!7ab{3*$qy3$KKLu5Ob$mSQlBUR%v-V1vM|EmLC4V9v{&ZV
zG~y|H?+%i%$wWBWP~_+V=ovk4XmAdg*lw$$V!xpQyM^|$^Y!!dV^?EzI=-cMHCfo9
z0v5HoHCb+PJZ1vtMkXdEk|{h&MZ0G=W7pxB);lhBE!-j^YM%0IUY*?Ah@EC0dgccY
zHb2(?Sw%vC)0HAY6Sy!TenM_-$jA|^ktG`QbbF(zFS$DA>hmrFy?fs3c
zrwi77($MLKh=_=zz}9DSp&`L+6O2kpuzdJB0IO`(CKv$-$yEK8LzVvRSk%#ems3zE
z2PKmFuwf${r|e
z_ZNzom}<$Z>TG^#>6{W?r-NKsh(h)g_>8(a;kXTdPi=1Kz0ez};vVagw4@U7Ee$wl
zsqIwVz}b;QnhZe{EKdY1Z-Q5TA9pPCsfF4b*L&sq@>(313boFiL(&%rxPIZ=4?V8UC2tyg^qpPVq%#=M8R8AW`ac(QQ9Jwz}w`5BYmL
zvNF{P-!y$zi!*wzo96s1)e-UG!vpBOgZ=%b;}ij_jEN~dkM#nX+eyG^4|^pDm0ci$
z)5lnp(t8rEg4N#+2WqM>o#ol9Kml4$~^FAirgmR_#UP~+_K
z>Q$=J*-9pyH%#OL6uZeZ+xW9pO{Qd&>CwCKo8M%utVV*VA2tk*mQKIX9%+ot^n>F-
zRhM+OLrBH9hcdyQA!%u$i;5ai?T)gwcu(O|P5OMI}X7cc8E_aK0?9RDV3=KKn3I$kc1nBWffL_oA9)
z#L-7T=!*S2*j6T*j*ief8>!-4}jcWif_zkI2_LYk9n_CCXOCL_Q-&
z5t)@VG1WqAA_$h7G$?1H@~!(`dwcut(E(GZfULLoKCskE|Fd2!)@SLuiT6C${8di|
zMQ!bo3PMpF>Sh?9LSu*hY_sq}#S*OzJRIL9t0?2~Tf;_D8HsXyU9h;wtl$?nbFQ9-
z;$w}Vd8`by!b-|0@i{2`gOMyr#yk^a8jZmWorshzlSMKgPuz!41R2*KsNL)1<7|_7>1d`B|>ayN3@S9;Q-pL{c$GxEJ*N
z^DWh>xip()$?Lp@sq_Zr&e{)`WO7WCtpGD_O-*Et()(mym^gsG!nn!k$`U2qMzG{(
z{R-nei%l7V>2sBNYZ9FZK1<4T+mI#gr(*_Y}Z(j^Y|)is2~9mN%Da!fQi$jQlhctpU|6uA3#X5s3{dk$+iOEd=BToemg`oq=+_CrshDn51i~li>i;qtSo&1G{
zu$J#M?J>rSWx0OsGxj|H3Z#yjGW)SHMpk3sDGoVC&DRL}x!Rs6Ep4l{m1`-Yd!i)^
z*?H`!QBEG7M2X|g30(sN5xe1!T$=3bJAz3`wR3a7I_sgT5?eV@(mo|PSjo`(QqpYW
zLZpoS83^-MB4;sv2OmEC{`+_E#}D-hkJXhiak_r4{IuhPz6}hi({zLDpO3d44t|j`
z)hfN;>R70KciQ1dUUx1eB_)NKRf@gID(snaWG{U<%ra(tCINOeme)#^=z#W$ck
zEv3cZCVrT?DNrw1bu}l=XW^P~`WZjy1Uv@hb)6=wo-yey3XKS7<~T><&NP#FPDdRh
zIdRaTDUUG|3^MP$Lt;(!R;WZHhSY|G8TesT^ZEXn*3i`S?O+@8#1t!A1BA_KtZdZxn6d8f
z=hRI{H#gza1Ae21#yH}|KEiH`TH{`u@9(FUcdJxRr)TmrVQfCd2b8V3?Y*eVK70xA
zoT)yyW0$*=b7!kIk_Y`T11s2`oSf0`v5lsnIqP}b#S#)LL^C19apwOV1&W%5n=E;7
z++pqhqlrSxV@J@O=rL!4p9gOy#+pdn%Xu(64;ok~Cc@Zq4|+4BB6YRk>(@$;ehjkx
zbj1YPBUH=Tk}OGFX`PNaM#@;!B5`UnVmSVcm>40?O&-MfL&|8qtx^Qz>Z-Od#i{zH
zYJ6N9afgf;!tAxrl`HaZ(>>Ov>aVM?12+jI7iaHaw#*zjKXr?ZizB)5nUcaWV-Y*|
zOYZE5Av#G`ul%3h+e}Peo8^LeYMFmmRt$7>Vq#*FQ&O5in`x!Qm0w~&RooUI&qZYw
zezJ$kgkx07H2_2$t*eTwGRr*@M-3aL
z!@_QE2Vj(d?9n7<+uk%ie&l&^O})<{_99qj?MR-?Nl}~lmF{yDjfh*ceF9+sDEa$e
zM9j8(e^(-9U^UadAtY{4sFj}H#CzgGQ1#4%Gn+&{VzXM!dP+9AT&y>A89N+KtBJ|{
zm>vLO0Rld97QN33+81Kd(xusNSNddBj{=5=hi80uT0ltP0*je?%0E5L9`;Y4^w|l(
z2(E(v^6D?Lh}~{FK8ljToA1mJU*cOEHQ1pQw9ctH1-a6}?(RR^3uq@eP`>=C9{)26
zz(k8oT#$PWgFV&P2e5*=rRDQ?@2c=z&{oj#oJBGEehyF)_kN@zU8NG%`gdtb^;l+k
zX^F7qM7RxzD<2m4-veoKjS2up(`+~LI(xvx*K@W1se&J=np&S=ujt6w*b3=!x
zI5(wjB)ReGrJ~}iSNAqIHd0elGn12>JT~~h*~i9(Mgn5To69jm&&xwh6LJU1P&)vt$5P9UEH_AKw9D#nB$BFEOUI
zrn0#i4=4C8WcV`Pigdfp)H#dyB&diOWjjp5v=G#wZ;_MhFp{~Y#CM7t%~7c|6Id20}qwKYDzvEYe!$7TE@@XS(u_|uZABdaCW)1k>_MFMp2F62%kiab=zze}bY5qH@Q{K@UfSxkJ0teZye@^X%TPlG*!HiB&n}
zx{9(TIC{c;E0kQ?!V5i7RfMoB5DaneHN}d!XGf`^b&bwXuaQNXS2z{me(n3z*o{oqyHUS*ot4fu?j~Y}H3mnR#
zjAgU&q+L68&hxDxB+jo62)4AuG5KQ(zkjzwR4pzoS?R(-Dev{{_ZMIypFUYE^{E>e
zoKu(*rRfM=A_V~-Kbs;KC!
z;ewN#9;`;00IrBL8wj6``<j_ZyBny&(zn~*T>3cbKpmb2C%Yf
z{)Sb0oTiCidDRx32;A}pQXo~Ldse|6WJ7nTlRDc*bZ4hJW@k1h1TktIuP3%@`D0}Q
z{kC!xQ6j>^*C4X+0VP34bi0-rH9N*~{|%yMDMUc8D`rd;R|z0ftcqStto#+)-=HBL
z2pYiFmYe@Ykc^J1sF1_51O^fxrizI&J3t+`V3Vq&_8W=Wcy&hTA{TBMP{!T`CIY`n
zN~!wJcTpyYYL#%bSk~V$Yiw#7fGZ3fTq0+$O6!0AENR<>&8jMVVevdSBuYgVa@2EOc%@o+W4@xi+9EhOq|r
z^69ipg)NXY0>VLuOcdZMqVtqr>YCutfX3G1s1DW9QT6f3bN&F_@PxFE1CqRsTeoxo
zsh;shm;1pbNMytn|qfZZov
zpfq@t`4|fqwjG6X8zvd5Saa|*(wZ*<3RDWNvV&3(^F4QU-FDk+vYO$2y1mmvKn
zqRp|aMVEk~dFbh#g1iKzwyTz3jx>DdgY)AB_u6-?1cch*vuJsG2`YAa1i%5)r%I$8
zr&fjR6C>!xd{Rd=rV7e3}Kh&gGV@1hg0qi%2gYcJBYpM^gqoRaL(LZD+$ld41lsZXu=*SB~9W=
z0Py%pmy{gZBIqn?--7rL_*LaK
z6B;r}=~Y#jqOxW^`sU$u-|c65ZC`|ndam7in*mL^8*8bkYy#B>l+Q4}27UTFwCtD#
zBg@2!RFwhRyL^)JaFcNtRCRJ#LAL6*5RyvRZw^}S1bg?Zr2d?Q6BP1LDR{N(xWh+!G((wj65A(%FvaQX{E{G3#fBL-A$piM9rl}diOxvzuH^gL{fkgVc7HponzfA`z|{az?ug-F1P>_fMQ*dU4qLQ_Z;)U^_*tHo3)U%|Ckygj?fqE
zDpVKaH?$+-F^dK2YzOH&VP%vKE%16#uACt`|1~s)LqDF(7NFdlj(i3+o4!j$*RG>6
zG{&G>tGNCeYDp<`y9e-h3#SO6623aNJE&B)CIUbbz?nNZS)gphV-NP3fu?;t^QcXT
zk5BHg##!OR1yyn92VP(axKC85X}^P=LlN6r4sO}`d9&jg-!mhxY1cW~$zOrCpy&Sn
z{d>(k<$jVs82G|6>P)fClX8(juE^aO^&yJgH9#J+Pe6-dX4hT!2TP=Po*^^V9VMmT3mD5K9`
zKsur_C=?2iU{{aNK?iiz7Zv%NN==fx%N1)|*Yf)r!l3ao
zr0&Y`b;ZBVM)Ol{2HaHp-;t)jrnY<4SoqP|3Q^Hfkrdv4KfT4If*NNQ5XM=!NwMjG
z1HR8Z6(rEYYkY34fRe$VAT6sZ=*oC!pDRgfXp|rka?-bHUr^G&Od!%i3Q9=SX0OFq
zE^bMFnGCKhD7ZQxD8K?xlvxmm%>c_~XQ~XL(y;zLwVLheWL)me0Sm%uUzcZKd}>Mx
zAccHMPUfA8=&*dHqCKkzkd+KlrgL8f{&?j6R_*Lq>m5sm!>^KO#W;U_Zz|*3swCn3
zZ&4{$?riA6!4O~vO*;bKP8~045NlX&&&W3%xi5pQ&7)d>CMAwkcFhexB>=Xwyif+(
z5qh-4h3I<`nKskmflK$2o~&_r%MnMqyh1(YKE&WPi<3ReKiZahE3%Q{*1GKS*i(7GizQ>~5s&7tc?3|C4
z)w?I6
zDhgN+<*cl%NGbDdD|wa|7s;qW9@_vKPUy)BNL+F4wLz8N#$DFv@%Ixd
z6NXj%^l9(r&3PgsB0%mhEDW`Lqz}r?nI=-eqrka%(E&W-(!~X#|0~k)zXT@!^ZEY`
zviZ->{AXwWw=my-bml)g^BM_XqytIR5|TIN+J4H2;GIfMo9fY#9BY3IPhR
zpI^gaA&Vz-a}XyJr@+jzUwvpmU_2IjQ}V6(*K4PW;Z(XM-MER@8V;&mCB=ezmmy<-
zyc>{lFY}f(&tpz5K5rXC^;hQVS_SZ0V`Fvw)I`mM3|%&2O+WyQta?rK^NKgPR}3&4
z203$L6nk)l5(Ql$xe++lPs=On9?e%7XZcqB!I
zy)w73W6-AhNu{u`zNBQ(FVkHC?|bBo74x>cy9b9yBG`6o-5F1~^=U0#MN(-GAGjwD
zNs9t4IEGjwTU~zoa#J7kmC%Glouv5D;gK(PfML3E@1AnRHwi!g#&cr7aJ=-3Y&Fa0
z>TkSdS5W*0Nx06~rchTd9->}((83FL=`b5hd%QnRR?fhnu4(a*uk<0`_lI01iNO!%
zMJs;XroBl+OM9F4j?EM7!>DrolA@Xw*4L|DvQ3tIzav5!@0Tn2P;zn5>7iMFryT{&9m(xQRIch^UQy8IVcg^
zn;Q7$qe@V+59j6HSz1B7D${vq*#2X2HOus@@QdAgH{sO#Sb=+xf*=f`4~V{Onx&+8
z6}CEA$U+i2zQxZ~sH()v!{^evHvnkS9UTMn^Y1;+yz-NzPWG+YuS4j;+YF|%h|NVa
zxF|ea7oECmZ?A&zT)It-@EQIXPEIc&JYa(v*m)wNpW)+$;*iO^4w16hJ=z|uVuJMd
z(fBtpB5bkp*I!FY8Jy+wB<2kde{etx*xSgaqLvAc0y$mbkuKqD!&q8zTG
zdQ~5%^fX(}2|-M9@1Y`u*4nv
z86Uyx-<=3!lRP>?M3HwBSRur{!!a@ZQ&Jp~b%(-_^<*cTr4D|+|IpUPJ|D6em7Zz<
zsPYQWN$i5lqh&LL-AJ6KOT^MqW%7{vuAJ+SHCcs^Bt$>4Q8nDhE1*CaQMTf#=w2?aco}O#qF0XZ^
zJm&h18xi{=*RJl~Ab*$a_ZnZp(f6{Ow@@ltn+xJj3g(mDJF9##?K$908I?H0X+UkD
zuOCwlzu}mORE5EUJ1iqV+N}A+A@>`(_B`_1OkOKp3E%@%ewu%_8{VDos4{$Y==|Ij
za>JI5PmDBHuDw*`6y4ey;*HlAP8AcLoE`fC^NNA=3jzDX&GxKBHDMObCi6Om>tOzN
z9v(6#f3llr47IfG(9wPK;8&%&JHN&yyu*7J(g4&YD-&V!bU$Jxd_Z_({oZJa#OmFl
z`-f>fU+&!2YEN5S8WB+U?`&_ccsR6;aV4623HsL9${}mE8Lw7Lhsv7XDn|!9fB$Tn
zN8Q#+PoG*Tzx#1qCbkC5%(gxu)V1hxfGS}5V+;gQ&!s$vl>1B+?7AvC8$4{cMRhGH
zg@pAjk>JkTm(d+za3V*FLX-mF7sVKJ?9%*|EtXSV`i?PI82q;Di8rEM~IL1Ce7ONd-T0N+;aqr^pd;3CrX{d0g-^26RN4
zX)lkxZFxC!P1^0di*!u3=PpVakgR7fFZItFdOsVq$|oNarrhl7>*b;nEpC`(rF!k{
zo#o(mk`?{CV$whP&Lvrij7tz~3?OzpA}v4E=)HcOp3;W-f*f?J@Dk?9(ss
z)x~NTJQmvIh%E=(w=3SHJmlW^yCCNf8260We?uh#O<7Sv*G~eh1^3)9XYYG3
zOLY%MPJU^rn|PRc;%0KfM9Sw#MA@D3@uEaP&wrM52n<#?2*ehD1a~>e
z+~X$Rb@bX9)h}Tyx!8$%fDTNJf6}BPX|3XsW4C9vEtYkyqR6{zb4<+6ak(#F{TF3YqFE7m{{$+^(ZhaCQyO2n}VHT>wt#hfPs+xm5%(TOR
z+!+Yqxc0}k#3SWTTHZiwn-OqPdTqGC542D
zw6M6?{@uGZ1UVT-QSs`npRyoi&A~9!vTSVeG4#qN%7eO_0q;Y=j^S42ZuvV<=;{~m
zxUjIA&6z9Tf*cFly(}2bi(Pcaz8Y-*#e9jTpa7h+;EZub%vV^Ar>3T+121?&sQ7zl
z4zFh_4a4dhbHID>Qqa#HR#YtoTWP5Pndnm^BYO<}Z7R+HqJRHF{@Jm~dTbQDi}MU_
zPTG3;s;Mk^lgL>RYwzj6;P0TSp_zSMaX>5fk?dn!b+NP;1Qys
zd}P^E2=Ogo0I6hTn1RW}7Y*pNZz^7?GP>8u)&CtOgC}m@FCwCZt>J!l6oiBo+_0Ln
zR=!cslZO
zfFFT?h=F7L$;qzFJ*gSJ0YgkBw6>g_rEeEE^Oh9Xet8YUixsw(pMy@P|J2gZX*Y@5G(tr_IPImsllZ}5{URrfp!VH1mlg^$$`v*{E;NO-`UwN)N)`zQlt
zGcmm@!ymFYfvR#$U6Kxuo4X7^(H@me}p
z*D!krhrnN&CfA?VvT`UueQL-jdU*=)ie3lzADLbp{Np0+#&UOLjhN-joFr<3!G^Hj
zd%7nD)s_1R{KsSvup8UkVcN7-+Uy4CuC7P!S6g!&JpUB!+(BxY+EfTvY#^=H?kW_m2H)wlf};V);u?E|%@fgo`%TbgHSgdTfjNBKn?>
zPDWaT`{J<@X_EwI2>r!CM|LU^gfqXg8d@gmyS=fsMpO(8IVPct!D`1}x>YXyGy@Xh
ze))E3Qd;ZUq*jQ3<1Kq1>Fwha&XAhru&u}sn5XVUbGjE_J&n^oKTIgmvF|dympvfD
zCiW^zvn3P-IOXG$KriINM6N@`FFyQ}5iT4Y9dGvd7m}~y|7q_ngW_(UaM6t$5=ej~
zSbzl*G}z*jU?I4>Bv_Ee-4g-?4@-a$g1ZM<+}+(5cX!u2%lrPTZq==G@44sGsXG5p
zB)h-;P0vhEPfz#L&wM$2_bxz8ESq!pVoRuKi2krMpz{Qe&DwZ-BpX5NW=RH?ItX
zVP$cbo(E1A7-H@1z%`GK8oLi&j_b*8#L1)QWVDG__`2q}wn)<4Jhy}c6#44Iuzxzq
z>BMcVtJb@?Rw8-DhYc?FDv58_ga9MHZ_RJk8pXjwPL`oRU9@iH7mQ8&Ivo~ydUc%C
zBQw_#`I`BKvGdU8tCAxxOr;ysE$H5GW-6ZleQh|l3^TdY{hwGs3phZ-gV*gtIn(p=
zbBc=I?rSsk*0LBB1`UK4Z7`NzL?Qzv^`LR$=r>f0_}h+_tpj2`-(LCysI+u&Ny(2C
zDic-J>Wa#CE>nl~k-P_EbrgM|h`N}!V2G!tN%sctTX0@^sq#B(DyN%-i163$+A;L`
zOL7X&cY+s>9@1nFUCL|h9GYoGz-2y_@R7L|Fs#K8z*N%6ZcLzmDZ_eH4)4Nzu>U-2
zyzG@I;PBGW_$(%7d-dzx>sKx2Ls=gInc8VI;BC0_Eq23!lz}~1M<=9G3e%uHfGJzt
zx}{J2(ia1wWG6rniweaM6;XlB}!U!{ya@qA>5iEolV
zl-9|~so}a#pM;Vp1HerdS`W1lP$)K;HcGqWkYbr#|>0(NmxFzQ)BnTgz$RLXH
z!^eZG68xm~ppO+H9S1(kKQX~9t={Rk-9iq
z!!HChJnmS$M8obOH4vDQLqlxtZypY+9y50%v4h&eI>fB;j8j5_ryL@&zV7Dwq2atT
z@AmHEgiqTY4-#OaJV4+>!}9cdrW?yU!sI02NJ)y*x3%X!W)K+ipPdy9MI@|mYKN{8
z()m}9oDJoBjxS+zJVeJ4F#NDej{L;>MTC*=8C6we?8W5#xfKcdQu|&#j}rq#EiK7T
z6-QVJkDl@tI*5N%ojNxaa0h;w2TUqD%mF1lSMTW>);**!ytEj$w4gXJ@ax;&o!iGv
z)Zdz#y^oZz2AolGU5IK^pO$!S8tg{ow&YrLaNb
z7Hr<7oXpw$?&$qxMbPRpL*}|i6pY5|bUCe+g8WwCWL+*#?g{gi}osnXUA{M
zeH^gO@3)L3{e4YAA&T)(%nzH0i9>-1PhL>hNy}EvZ178#A8;s+l2{0#Jx5?nr{8-f
z+yW)K-c5H-PaTMNrkz3;WXuNRE86~$7pu}^J>vimfwZq?Su#ML>%@`$&qB}tpOM6W
zUIe=GKNooX@8kbVkpKU!#$9Lo5DOR5GYl|@SD_T;YH?XSosIxP0f2HE*ox$`
zMU1}&d@bmGIuC%%P(vya)I&?7Tem%`(6N-}F8=CdYq)UAF;lx6HDn(Tgcz!R{^7AX
zKV|}gLWdUp201%1#WsIRKY%QwVhb|e5~B_}~!y<5qL7K+w?Qc{+_ZcU|HMVY7L^K{XWRNY
ze*A7i2@}gZWujUUjPWTf9RM=oHZTmGwvznhpwlP
zo;A>nQ&ei|lH(H6J1OWqNxfOJN(dsbHG9PkaY8+yCL+McryJ045o120bV>A5%l(nHD_NL&h5(TIjG(W<^Cs7vC9sQPFM{jCX^i7*x=_(tZVr
zBS1@$0q8f$UcHimJv3>Y?4uy6NG&{hBUUvJ@XU|?3Hn!lh$7ncp$H2xEhJ$#2)o_W
zj+QYvHg@W{;h#??R}M)x#9(R>}
z6TH&=J|-sTN|IyI;nDMi@~X1~%18Je$<3GoTWDVw6A(6))$05RbWKi3ld_3$X}!!}
z^j^2*20RhBAsirI5h5Jt&E$ht!;aj{gB%1y++4ocSM-B$C=uf$Nr`j1h}n
zydrj!4>29RV3a|TF_5xUvsKJo5iHrRrHnMkj7e!WyxSSMiYr2hBYH0m{^tx$P$pzSz>
zBP_y$dv9-Ne~;<-^x3&<{Sm_P40y#%l{K+36~m?xIi
ziWij6m3o3%$^_m7llmRPVXLR-QC)0N1?Y)v%O8g4
zbY3p#q(g}G0C$tg5M3x{sPLb&$j_f~vF7Jq^Kq&llUyp-ua8m#mKBB@kRTEJs7H}Z
zRIBXG7%|+OUCYCP-HoPZg(_M2Cyk%Nw0WW&9iH=G-j!x#^sHTL(cOEJaI-5af{v7#
zo?bn+(gtoI;uZ*T5+PKqU`l;{Whz}^C4=M%RbN3c0H49&IG7nUT
z*1sU6U(iP)ZBxd^?w+J&vJ4OXdO=zODsUR%z?o20m>m>+Y
zuyL*u>el??b8QRecY95UG_c%UqVMPD3a=G(u?qitk;-DfStl7)^blh4%Cp%1hd}Nl
z?8DN__1<6&cKGS?XHxSJc$Nj<2^_bZ=I$se8M1TTlOcn!)kU-M>-)D_~-Y(`eykw#)
zEY*~k-kC)R@phdvQsYaqlvUgs?NQrNu&~&mlacV(-MCBHo0+j`7Mzss9MA$
zAiyUez{O2i4rr&(ah)Hek2=JE6!)mFuc)y>sI`fgwsG<147C4KgKjfBJK!Eegi-?=
z@#>viE=c8GMr2ZB`yz8E*;rW(48oIA2_icyqXWktJ=_(S^7Zq_+}Zw1x?kxccnF+!
zS-Fq60?lAcIRrH;P(nq_+4F9%y~~sZ(q&OY-jlvH$fs-JMUrRn@)wRYRFB@ztDBp`$XH4+tK;@Xn+6y!~MPO{hpW)V)yx$j^ja!
zYQksPRnTX%WDdJX7+x)D-}VC@c#cg)B@lpNZZlz92n)_8a=_7UBF5M0M;@8q-c56PewaJEw}()+0jyw#ZV#LmpmUz!dn+i!B(h
zY)*7XJj5cyS9X?k?>C{o{(|SdU~}WuGc`I7H_tm}(c<_YbGS_gtlhbq7|0fuB68JA
zx29{~DNDVV)2sxXdI7d;awf)OHhGfI@OQcdsav+GJ&L3_W;oQ}(PY{?y+afcu(?x+
zx%HpyMLH3BQ1nhL3dMinyDEbpngay@jI(uFHR?BL8)ac!u$?|
zftE9*b80JC2tIJ2o!kuh3@_U18z@Koa6y}cM_{qGYS=IV!dQ%6&Q
z$zcJD-rKvoZC#UiPoKU*6}vDV9=36@C)PI>P{Y_WGBTb#X@GuW&`u!<_&W9y{G0jK(gUN6T$Rj_T$Ys*kn@3@HkrF+5^=3NSW%ohRHw6`x
z_ye&q`LXj2p}oM!FVxYj+7J)V#|WaWF&2@_gEFI-vZ%VYb`!TtM|WA-Fbj8(ewwN}
zKOpRT@j~sYl3{Mz#65jmk`KJ7*}V;W89BU4iFh(}_luJ8}HcXodBIKFpq@F+^HH4V8iqb)vY<9J#^
z!p~p5z8-yf+4+3Qdx0F;-Y+EKk7t
zTU%e>xz)AOEnJUVZ!AzDF=e)ktt_|)&P8V39WAeLEH$ica{du`o_4I@e`9T39YPaA6w2o
z{8CfgS{M8U?wNX<=YqmaTBpD3OrJyiE
zS~kKZtD>^9vGM%Hn3^<~nVhN8$AjAS4_|I9UY>0cfvO@?7q`DBUFT95kMNWOo*Z?X
z<&fPuE8JvcV93tSW_h9hso3QM$xH5O^1y_&q6MX^pxbA#?nvlwYUADG`OsY8_dJ_`
z2kk^;rqc1){Vf_D`8@iU4A9+5VPL#&m8B4AGKvCm%8l+U&Ef(Xotpa?7%g3sl#e*`
zT^onVi$yF0ic^1arQb~FEK4kehjTqK8NP%lw$@vwH_VkpvX&UPfLSEp>Dk+&T
zMEro;C)tvDPj*LFoph~$J&_&7Qj)7>G~e`<}}@cebB
zKT==WcdW?%R5`NI(wDqL+V1Sd;pPP66mXuqA0wPr$4dpT9A-G+@`w4^+OcYiywg;e
z8ChAOD>Ch3T6eqe^v@~7+Zi*BA3uYTI4w_tQWO2T&|9BU&75RMwe9MKEZ3eg@qIXU
zL~cq;@NSmRt*Eg^XT$T60Z
z1=V!9!XC6W_~J&-$_iz%_Mw|;IZW2}O(9pwWZfRw!6UZ
zx5)v#-F)oLpYl=zi!Q~j>G;|ye&$%dFRZNtSECm{;R9!z$n!&AuRq3)^UhV!-X8p9
zIB(E+BA*geiK$`e><+WPaQ*6DIYnPHjB4EbN30b>7BP{~2S=tfIVuW1wN;!B5BxzlupiMfbF;XR7E8Sa%_0&&
zBF=7~<}y~hY<+tY6dHKi1amcpMZw?~TkhI`KquI1PQ$9z5wJ!L78-?a91g30)3)Xn
zce%P~W9hB{laKuv5!4sUK;oWf_Sfz-K7rSH?>5%n{yxXy$jp~7^qKjrY^vs`&8zfh
zD))-r{rvpiOJ50}41f}?z1{X)bJSv%UssaYTu$YoUuI63!pZs%vN`>e50IMPPpXJS
z%k|@DuJ1C^(k9A-zYTmyN$8B~rw8P+Re)&rlzAK8vOT(BJ3hV^RHmpZ
zDFrQ?c;2PdaF`iAIq@>DzKDl-ki3N2cK-|sxvF#yDvJEA_SfA#f?$To0pymMnlXmW
z>}b=|__rpvKn4Z`w<4OKLI9{?|F}E4`R={K@gWUO&1zed6oFLWw%x@J`YTDPzrVM;
z$CjmEiVI3XbR^{1HBO>%9>`|XmTr!O&|5&+*i!cQht9?rxR^L8$y7i^#_oMFO+4IX
z>&6v|!p`xEe1Plu!oXn>7Z)F&>@OMq)2!Oz4+K)PfP*Mo%@6efd~>F7z@yu3wt2Ee
z<5+gMX+)gMt1GdOPD?`|!y@lj5d!X8kEA7rVEz66g?;zS$f=7fGBUJK6~OQO&m-be
zQcRa+V_&oUlalcs*vPNe4xu0b?UelMHpIg6TN1_I5t~LuoUPkNKmY=Ol)jjOkZ)Q#
zlTnm%ER!4%yY9Z2s9mpb>st|X_40JF@Q@PEi&w-0c%h4uLE?Ufrw>4}4>^>0)NxN;
zlmhVT{qDs7l8A^<)>235m^eE)06+?0r>IfHK?LdaZEydwaEI^pkcm(b^JXgQ85DIz
z+VlkoNn_uDc$k3K)V?mjMcO$!!Zo8+NIdHx~*~}Tc<1Mpk{lh?SvJ10pi;@6n2Z+kxo%hmMaPB73PE+&N
z8j@2(U%zsQ1o%wgcT5V1fxE)RT17}U)fs`oL8@$G0;8YF+&~W6nYJVt2bF+{iD1Bt
zfKn#1s>+tEqTzEQ7~HVOhymP0bwN2eJz48(P`9jIb_;Y2e0sOJFla0%JHEUVd~E%=
z9!w~M_ZO5gU`SOf_x^ye9$4-(OxpYg$f_RR7c;&r|Ea){N
z2lj_e#dXm*17#RCOUiSf+nB*fdrOYrz)E}W(zCgFTXd%g?2abmkL~UK#}-)96Qyuyz)gq-2ANpAlD$b;ZH-G**Qae$-eOy-Cbt_9jYni+
zZ{2GT$e}IW)>zsTa?sN!SfG#-Sy=^8P>=-BczmmvyYNCFeF*E(qsJD1K+Y%Cu$?0p;dfer
z;6lGL9x)Jqp^C?LV4#j_Zl-6j#%x?3BmpdVza?R*W`A0%!iBSNajDe2
z1!=0nqDv^yC$9Tq(I+PnF4@sP9#c)9_fBbS>2_F
zb8T|^a6oPzY(l*-A54E74mCHoNlVM@TZk%E(dTF-0_O8@a#tan_~|^s^XE_t1(1I$
zSf=j*N^q8!HTK}bi<>lnXj?uNYw(?(W7vw9^daC08oxaOp9ojiAjF?%p-NxaEQ)(s
z?d{#<=g0M>Nbem21Z>sq3MVeM4pvS8lM#gdE#=B*o`cCCpsQnx%e_0yG!K@OprW8~
z)p29(V$Gi50eI&e>L$0dFHoHtI)!l>BWh{~#<9z64v!Y2x(ctBapO
zFo;J~eEG&J#odz}2I09Zv^=PwLW
z6AgB@8dIZFGu^I=)*Z4hd_}x(-@3)eH=UpReR;ztM)fZ8$N7b8A#eMT;nl_g9JFFD
z^4-Z_o?`6
zL2#5L0vDfj)T%m)F0Y~4Cp=iBR?Q2K*O{-l!+;{)zbLp-T1;xNoDa(iAX6
zfBP}-ppD^^0t=()7aw4>VuUA{+#
z_j71+e||OlOdPli7ydrI&lsm!Uq7h5D$zH1r{LjcC@ee?M69Z)cu?mG`Wy5D4^Zo7
zPXVsClcVaw^pqS~K-Rb=BW9HYFxC;7%mBFvZN6v1eQ{oK5Az}5DW#*$w7l^B31%%t
ziWu?pX)@!>R)!+?s^YzsBfDROXG?+3fT2uml@c7EtLOT5Wa9xYBgMOEzc3*n>yvmQ
ztpR0XFEu447aw0oe}UxEG(fA7fZJgV-Xa0N*%dkTfFvf26@Gul`*wG^dTI6aX{oqW>@tN#?yOS#4CoOI@tm)Q!^i9HLY@Hxx+@i3
z%hJ~;2u2dqe;6a-if#4Ta$gQL*k!wJN5iHMU4JLJAlPghqI(&of?D)6?Y^;80Ux
z_;2qq-4~^0$eqg1b=a#)2z2%003)~1~#sJH)UI=8k{HpzKrd8In^T&+aoX~
z;-8$A5ua2CZkA%mg@q}zJyjkc_&F4=#9R#)&cr{7@NIBJ0C=+h74p3QtupEV73Tk}
zO1=MrWPok?pC`Kf@ACNX^7wBB{QsZ=zUHdHeyJ8d;q#^0y`~=X@ofPQsDK>qYq_J3
z6ZvzrcAwgPpDc|Pjh2b6n-z(b8TF-v+U1KCNAex;%?mw6NLK7%Lh5tWvv
z&3U#eKDH_eSbj$j5Yt}>v2(j`9za^V^Rd3(CaH?;wQ$=C*%kWLvCUmQwRJ%f=ZWU5
z?Rkp^4lch0K_rOHV{p!faD4|s00^-VI01TKkpqWAz(*MTGdVvcdvXiOnT6>8XgLBc
zm$Vv#`s+y<%qyr#>07MK2=-{pNbhm(z0HbcVl9H`%aXc{Li&ciUx|{^Jl8fO-
z&D)J;4XusgJqb*9D{`N1_4G76HMotB9RkX&F&{a=s|#}1T+PjjQ8|N51qH32ZTLu}
zDW60NF^5VRGzR`v>0pSMSjbOzKj*U-^c2n4Sj*e*uk4?4OgJmmO}y#<1&sOhUDne-
z!Mx)KLEOq?S%^*Sr2f&?))QY}PPSm?$UiDP;6kt^YwxdPj7EWrGd*(o%=-IxdjLZl0X-M}N@Yy~+L+2rLlWt$Q(WR?JsYe2{VG>rj?z_{rk)
zhxCeMy5MGTE_~)Y5GA2(xeN%x>+n@R~KnVtKd3NAO@Xuw?b}!o1Vs{+Lie%&nWD3
zXv?`Au
zlvV9TmJjFdMod;XSk5l@UMj3Mb$!Wt?3W;vX#M1gb^MQEtCRVgQHo>5#cWZX)h=!y
zrVp-X#aOreD$3nSxn*f!Q?DSO>kI1}nFGoYsU>gkl(khNv!gnETH8-XN8XuEY4-n#
z1vI62?43l2a=u?VKzIDRbFokLX)8)IXqH>VzyS9i)_xkTQr+WSM|}s56b6F3H%Z_t
z@Qn{s;axQ>q9XZ<$bb?(uwDhS&uRptV^5}GVl;d#Qz$}SyDa{QP_Mj(Prg7qWzwY7
zolG8-ZdGNUtkl=H7WQ7|6$gQN9Vq0#ELJCRc7U(IHl9%5b#kKm_BL5=G-PH)Cr!$E
zwQ~!}|2K8vB%;}1_W2iFU{>PnT<0~{NGFtCM!%O)B}=_bZWwIZRbsleHrshAmSS*3>=anGZJYwct@67#Gl@~rBU5>
zH2>u-jTl-ewf?c?%cj(=LRHF*F5f4fiHR%;ROx$StJRfxy(R_pMD9I9^MGETF@}hM
zEf_sok24$31Er_%b_t{dcu>53!~Cy}RrqoP0z1Fe^KEE&NM_!exX7#ORr{kxs}CX~
z0|ESwHsa1n9Naxq{EoFH(r4P$HeB}GI?^z89-5Us(n%aM3*RvjV8x9at17d%Don!c
zI5|1pR|kI7Q0_RKF8A^YtBwTB+o@FV@9@IJCGBsv!yz8O|I)0VtWui~2MtQ4762ug
zcMQlBVvb~rl=$M2YB4Iawe1Y=uI8aK#$y3mHOCUwK)_d~j>^jJiXh_bQ!Xp}_SJf+
zDJ5lgY@vM1Xetl($`}s};G3$WiQ%fU#!Sr^UiKIMl(+ZO{LLaIcE&fl`HDK#GX2fy
zif=$L7^aa|3(ZHy)hmVuxXr=X4=b=#yE50zX8z_{tk|M2ziE9xvhE!C3xrQgxf|?;Z^n5Gm?gyBjjZJ$xt0UVdCw)&&3Tp^C
z9j#u)YCHHwb<(8!n*nN>RBk!;x%}LTGVU1kD+x
zC^|c!iJ{2LvY{yJOBW`Ft?{vOob>omPxLEpWNXS++sh}~InMC(zh^hHv7sVi{zhr(N7HD2<$GYokUP=pQNoyLcf&j1RdNT?y5sxYYxoBp!gq%gUXjf5
zGE%Z`87*48sW#z2lYFS<7hz_WsE&pCx)Jio;-MPa59n_#N9Yz0GS9~r2A-yxGN!a5
zx(irE0{zfJH6J1|7u(wfR%{qZy6@A)^hK7!DcgUG2%`sGSG{$=3Cd`qZkkNG5}tFn
z-dr4QwVU$nyrc=Gam4)LW(;AibVQZ#;tv}l?xXZ*l@2NrDTc*FOFpD4Dn&>mDd%y$
z(F%w0PV?ONn_md4_U@(=UARL+NoQtuF9k*?IRx_Nn?+CZ20~WZOE0oGgsw`+2+CIK
z6_2*^p06}bXfHH_gcVM$5JQha0|IQHAK)pw&t@URn(;y!tN^Q@Vto8$PN2AZgf31P
z39sVm7eZV@ux{?o6pD{=gofN{dl{=-7!f*>g~$v3fbIeKh9E+8cYTZ@s;_(KW9T=_
zf7-h6if(@*wm`mw2iM?oHso0s149I)S+Ew8EBzUht;4=Afs5|s{fPREz&$^5K$Kj1
zJX%I1g7pABhmV!SEuSz^i-iaOVKnnAR{aHjA2*v^(D(+?VOmB{AV%X>q$=3VdE1;w(TkrFI`NkE`cJdCb*6w|e3hB8frB2`kk&c#kFkDLJMBQ
z*R7tPPh_??E)*Kgr6aJ%f1uUl?S610GOu0#$t%ykQ@V>9Oy6rcYCelWOC!Z-9z|q2
zWS!KERJ>t@UEP9UeBuf3&?7j+5l4)URx5tI-OJCWplLESkJ
zZ|4ZI5k=q<-i&!F
zB8t{m!7f^AMhT;cFCOALJGWo>g<6Y>Q*8uXEBZrPGyPdRlxdNdCfBOX#7fn#H(ZBk
zy<8Y6ot2Q&ZK3`9{so~w>0r7r$=ll)wO;fwsH>gdEbdsdb>MllB(<>D)_sWW_d)FB#uNxePYv0{v6maX
z;*-A2G=7>_67O)h#8M2m+7m*=ZL}IDZSlJ@Q7X9yz`)V`QP`DFqTAKFRullkz_&P+RC5-QH
zSD~WvoNO&$fV;N$rMr^;eTMZ7zWe4#nq6s`Ug!Pc*Uz%#&w$YWds}W+QUkc?iB@sn
z6Do$8ecrbCJ0GZ4%#alr%gN0AhJ*n54K2seO4W#XDs^GIWR#i&RcOtDkvaCzAZMYt
z?TOq!yM*4=g>!0Qv>0$t3NmGv9WzYs(Zs6@2H=_R9cVSCV_
z$c8GtMtxHt&PLL%5Y5qoJI8Bd^vUB*N%iIBN^7LTM^k`UGB?93NfD@-7}wzWbe4Oy
z5|%#t!YNG>{W1)OkS^Dgt3N#q7j8#wikLTZ>y5*T%rxUQV>Sa_w^m4GL(y}v!)t4?
zoXpZlJiaz0QlXXV5wn3(<{}!ZQ<44I?Y{IkO%bSn9MyTMIdP0QT}8Q;rVT1jH;hZ4
z+#)$A2eh52>2@YM0giA9O2Eu`{CqSAQ*&5MNv1WV^Fc4Gv;c
zr@hZ*>!F!pp&*sO_R)gJETjW9bo)^RLxiMcGVtSWknxb5ZB7u6J%NX^q)(msYbO^V
zcNx?*(PDTLZ3b;>ks6y>;4!SNMN^Tbq!_QgTp51aLSKi++Ww5vKa
z$s4~5Nh4b|M#Z{Z#MzO1WE5nkBL^9ce+|-XjP`#lRxbn>lEg~Ku1Dgt1%s6<02fPH
z@JwwwnwT^$pfepeGu`j%N|^=F(uXak;9@0Yv%Jeii?r7ARpwSSE?T+RJ{!Ya*VpH{
zx70>T;LMTaI8!!sF%o)0^sijylI&7q4j0eZUWtqy&X7E;`bg
zFCKbv&-^uatMXn9rNiHg;my3D#6G_|JzkD=yXaY1x1+|Nfp>wC5}|S8n4bwwn(>=lMhvv
zq|)WzTC_tAyrXgL-I`%}VoauQ^|TKU{jlWP^BC?v;!1bJ24hu+S?t{qVuD=!(`{2B`fZf6tBwB?%e*F=<+HKjcMAefl)jjp^G%$i=
zHq066nl2QnC2N**ljBssi7bqoy6lb2J)a7_nTrljOe+@btb?1Kw#NI`Gu213bYW3-
zA7eYIgcAoZ5X!OLwu2wv`z4%5RP&x)a?ZpBz_n`dL)6KQ?xC;Hi9hnYzTVG1Ek-
zOZ5Q6TUd5FuAFm}!^1i=Z}lxS*ABc*>m__JytLOgu0a{Yxw11doNGQ>!Zd3$CcYKB
z8hP2EtmSgJ{L0Jb0=*|stJPuV@Lx@ApoZ?|mc@S1cXp;eJ)@$X|7l!3HQ3t=EJ%oyyv{X7w#PR|Cn=ZrZD>^#;?6R#rvlH4xjpA;Puk;cBR{}srFHRJ
zIo16?aU!Ltd8^SZrS^k!c5N=+oq^hTZIb7Hoyt>|5n%y9Z*_1?)%z{3y280(>_spq
zp_62mQr)GL7%tZ1j*yU14!8n7dI0>>Ur&!z##=6x^>iK7{^)*bHiO!3dH;BZ
zrFV`X#mY*Uh*w7k{qRB`$xfE$jQXHPaoHe>YT>-1>k*%*bHAZXoAF8Kc$z=IHjiwGee!!Hs4FR{UUK#3s#h7v6`
za|!MO-`vJtJT#`9T5*-18AO)GDl)QL1KAJl>^!Lufv4@dtrP=sm
zM?St_{B?BN+6=mz4r@}du9~pi4Kt4p5X(sP%;>PLj*Yr<*O`w_oSLJQCT-OV`rU4Ygmy0KaWXFL=4Yi*2s<87p+(Dx8HT%FsVf6LQ^Y(7GCBYC
z`)z;!p05y9NJpA>XsZNINVv7%CiWAcOL2a8DvCr&*PXg6H*$-!QeK^?&^-_A5>DJ>
z$@^wCaitH25u%VR61yj8zU4IKN}PLi>pJK*>gziS4oGH1*DVGNesVjXVIy@&TSEqC
zv|4FplOqG0nhoa952OiK(4#59Hd@MXJlb3&{B<*P(~zZf^0KvR@-vLqzY%TyJyxf4
z3tU$()JaDAodz!yX!=ov8(UEojp>P*Xq}IHIG$I!vv*}CTG_1S#6sOp;7kR=F1!A}
zMem?BCGE38=y6LqyUR9QlPWZQ|FY%%ddEtL0vB!Db<8&`Gk)^2F?eHa>^WT}Cx0xL
zrPUi)^y3BevDD)s(p9qF{cL&Dqgc;ZQr3w<>JKk>$}9isDm%RE{wKIPt6!bl+yClp
zq%4x)a$Y~K(X-K_Lwn>9g+KP=rLzU3V@hQYjGSoP=0BTL6>tO}X=7i18$RVE-b`BQ
z?r)d=>ST|AswBvFFOWY&Z|o2inD%i?PF#1qX4U!bG=ezo!W*rz
ze|bn;|5`7d{s2e!x{;Rm5(*gCl6f9vx{x}X?|iueVcO9Gao3bXB>J4DlRj9QrG1KB
zPLC+Hh-{q?B3i-2^G3HWzJYz&nIcl1`9|sK!g6m_vWxYGEqW`iL8ukyUxt(`8%Hd4
z2TMve3NJ7L2%blBqRVF9Z0lG-ffyS?Nca*(6sm0vXk2~
ztZh}>C)#no;Xnp#<+=*~^KtOz+I|__%aVaQmY0Q`<{4V6!@u@3fQuG_@X%+Vj}DNw&nAX(ucv7O^f~#th@L23+Z_GEtwSX^
z4txEo6RjDEe;+Via07w)#ldHXiPDJtU7m2^WYGHqWiN9PpfL
zUoYr|MOG)*a;dVU18ab%@g-))wTMI>KIe$S`fy&){0qc75_l8c61kND6yO^
zORsfUMW+Bi0(HHf1m04qV^D}O`_o)6_r?ebg4mM?XlUBI>&bUX4$*_558e<9F=l!b
zUH@bnigcPQ(ObYWP%ni^*u{qe$wSjmmB#-Oez1xjeYl3`GjYnhq-RfPxpH5pe`N3l
zpIE}z?M8)>Xk#s)iV+kcgg}vHU`m5PhDZLhSH92)6xF{2GV8Yhvp=9OMlXgqx(^Yk
z)wSq^vA>|q5%SaPh1iZ>(VHTbBrfSNNveMyc}f-(9W}t#(
zoOc)YWH+pAMHAB;t|#Q-)TL}O49k19Ldz%3^q-IJNlE_M3^a-$gcW{oqf*Tt%&R8?
z#<%=4-NE$aP~FH%A?0j(=}BRl0{YDFLAiUr)7uvrD-Uiek|j{PLE&)Ct{r*PEN
z*mNHYTe>};oaWZGQEE2j;pV`vb|0?m1?&?~9}Z$-O4B;ZK0vGHUsEUVrLTNvr;3+#
z$rEOn$GpbWz7MaL<3i!p{4rb;GbFCuV#Q``wIV1as@9PPCYF92r*SBK*+`pz%y*ySfKW)baNu%bUc)YpdmL_hxo_=08j
z&Le9@c$*HDU8hb`QJX+jdd8wLk;Q8AYf-J>ihwdh~SM;6`9j~rju$RC&g
zaQzmIRHu}qSfZ)&^xio&hj~dvhos~|yv)SD4Np{<@aVOpk|5b2C(Sc8Op>lXsu6(i
zQ$I9>4|1f&G+`?*DX(3EG6{yO`P%rZ-qLJMOa`B1i+(-klM6Gpuz{U%Q>$M2Yuhq7
zQ`a+&9lLf=mc6EQ3eL0Rg(^upf6W^G?iP%)vd6Y95oCv5niuj~27~LG%-QFrBGLB9SK@=i)RtCU1NK)U*m_`*^U^it78y@5&$8ksb
zdDMSwH?UsW?~LUaL$9CJ#8_`pTUf=~_M8VrP$
zDsVX`Mukf-C<_61S%DrLj1IY#F1rMyL*mX}@Z(4S@|Wt8lx`kuEU{S(?8bTtwBO_H
zx(b2IT26TJy75jKeE70eLrMzD+^R5%pKfVEgD=-D4DUeQ>oql6>SunVP&@Pc
z>FG9Ghb@FdeQfAauK5KmFcK_xA3g<25#O14VHdUFeaVGZmVj;pCi4yB61b$Gp?@*2
zTrtgg6L!wE9^z-4rJG 390) p.x -= 390;
-    if (p.y < 0) p.y += 844;
-    else if (p.y > 844) p.y -= 844;
+  const BULLET_SPEED = 500;
+  const BULLET_LIFETIME = 2;
+  const BULLET_RADIUS = 3;
+  const FIRE_COOLDOWN = 0.15; // seconds
+  let fireTimer = 0;
+
+  const ASTEROID_LARGE_RADIUS = 30;
+  const ASTEROID_SMALL_RADIUS = 15;
+  const ASTEROID_SPEED_MIN = 50;
+  const ASTEROID_SPEED_MAX = 120;
+
+  const SCREEN_W = 390;
+  const SCREEN_H = 844;
+
+  // sub-step for bullet CCD
+  const SUB_STEPS = 4;
+
+  // for forensics
+  function _forensicsView() {
+    return {
+      seed: o.seed || null,
+      state: () => ({
+        phase,
+        result,
+        score,
+        asteroidsRemaining: asteroids.filter(a => a.active).length,
+        ship: { x: ship.x, y: ship.y, angle: ship.angle },
+        asteroids: asteroids.filter(a => a.active).map(a => ({ x: a.x, y: a.y }))
+      })
+    };
+  }
+
+  // --- collision helpers ---
+  function dist(a, b) {
+    return Math.hypot(a.x - b.x, a.y - b.y);
   }
 
   function lineCircleIntersect(p1, p2, c, r) {
     const dx = p2.x - p1.x, dy = p2.y - p1.y;
     const fx = p1.x - c.x, fy = p1.y - c.y;
-    const a = dx*dx + dy*dy;
-    const b = 2*(fx*dx + fy*dy);
-    const c_ = fx*fx + fy*fy - r*r;
-    let disc = b*b - 4*a*c_;
+    const a = dx * dx + dy * dy;
+    if (a === 0) return dist(p1, c) <= r;
+    const b = 2 * (fx * dx + fy * dy);
+    const cVal = fx * fx + fy * fy - r * r;
+    let disc = b * b - 4 * a * cVal;
     if (disc < 0) return false;
     disc = Math.sqrt(disc);
-    const t1 = (-b - disc) / (2*a);
-    const t2 = (-b + disc) / (2*a);
-    return (t1 >= 0 && t1 <= 1) || (t2 >= 0 && t2 <= 1);
+    const t1 = (-b - disc) / (2 * a);
+    const t2 = (-b + disc) / (2 * a);
+    if (t1 >= 0 && t1 <= 1) return true;
+    if (t2 >= 0 && t2 <= 1) return true;
+    return false;
   }
 
-  function distance(ax, ay, bx, by) {
-    const dx = ax - bx, dy = ay - by;
-    return Math.sqrt(dx*dx + dy*dy);
-  }
-
-  function createAsteroid(x, y, radius, vx, vy) {
-    return { x, y, vx, vy, radius, isBig: radius >= BIG_ASTEROID_RADIUS };
-  }
-
-  function spawnInitialAsteroids() {
-    asteroids = [];
-    const rand = ctx.random;
-    for (let i = 0; i < INITIAL_ASTEROIDS; i++) {
-      let x, y;
-      do {
-        x = rand.range(0, 390);
-        y = rand.range(0, 844);
-      } while (distance(x,y,195,422) < 100);
-      const angle = rand.range(0, Math.PI*2);
-      const speed = rand.range(ASTEROID_SPEED_MIN, ASTEROID_SPEED_MAX);
-      const vx = Math.cos(angle)*speed;
-      const vy = Math.sin(angle)*speed;
-      asteroids.push(createAsteroid(x, y, BIG_ASTEROID_RADIUS, vx, vy));
-    }
-  }
-
-  function splitAsteroid(ast) {
-    const rand = ctx.random;
-    const angle1 = rand.range(0, Math.PI*2);
-    const angle2 = angle1 + Math.PI*2/3;
-    const speed = rand.range(ASTEROID_SPEED_MIN, ASTEROID_SPEED_MAX) * 1.2;
-    const vx1 = Math.cos(angle1)*speed;
-    const vy1 = Math.sin(angle1)*speed;
-    const vx2 = Math.cos(angle2)*speed;
-    const vy2 = Math.sin(angle2)*speed;
-    const a1 = createAsteroid(ast.x, ast.y, SMALL_ASTEROID_RADIUS, vx1, vy1);
-    const a2 = createAsteroid(ast.x, ast.y, SMALL_ASTEROID_RADIUS, vx2, vy2);
-    asteroids.push(a1, a2);
-  }
-
-  function spawnParticles(x, y, colorStart, colorEnd, count) {
+  // --- audio & particles ---
+  function emitParticles(x, y, count, color) {
     const eng = ctx.getEngine();
     if (eng && eng.particles) {
       try {
         eng.particles.spawnEmitter({
           pos: { x, y },
           count: count || 20,
-          speed: 80,
-          particleTime: 0.4,
-          sizeStart: 6,
-          sizeEnd: 2,
-          colorStart: colorStart || { r:1, g:1, b:1, a:1 },
-          colorEnd: colorEnd || { r:0.5, g:0.5, b:0.5, a:0 }
+          speed: 100,
+          particleTime: 0.6,
+          sizeStart: 8,
+          sizeEnd: 0,
+          colorStart: color || { r: 1, g: 0.8, b: 0.2, a: 1 },
+          colorEnd: { r: 1, g: 0.3, b: 0, a: 0 }
         });
       } catch (_) {}
     }
@@ -114,170 +102,267 @@ export default function createAsteroidsGame(opts) {
     }
   }
 
-  function fireBullet() {
-    const now = ctx.time.nowMs();
-    if (now - lastFireTime < FIRE_COOLDOWN) return;
-    lastFireTime = now;
-    const bx = ship.x + Math.cos(ship.angle) * (ship.radius + 5);
-    const by = ship.y + Math.sin(ship.angle) * (ship.radius + 5);
-    const bvx = Math.cos(ship.angle) * BULLET_SPEED + ship.vx;
-    const bvy = Math.sin(ship.angle) * BULLET_SPEED + ship.vy;
-    bullets.push({ x: bx, y: by, vx: bvx, vy: bvy, born: now, radius: 3 });
-    playSfx([1,0.02,600,,,0.1,,0.6]);
-  }
-
-  function resetGameState() {
-    ship.x = 195;
-    ship.y = 422;
-    ship.vx = 0;
-    ship.vy = 0;
-    ship.angle = -Math.PI/2;
-    spawnInitialAsteroids();
-    bullets = [];
-    score = 0;
-    lastFireTime = 0;
-    keyState = {};
-  }
-
+  // --- game logic ---
   function resetGame() {
-    resetGameState();
     phase = 'playing';
     result = null;
+    score = 0;
+    bullets = [];
+    ship = { x: 195, y: 422, angle: -Math.PI / 2, vx: 0, vy: 0 };
+    fireTimer = 0;
+
+    // generate asteroids
+    asteroids = [];
+    for (let i = 0; i < 6; i++) {
+      let x, y;
+      do {
+        x = ctx.random.range(30, SCREEN_W - 30);
+        y = ctx.random.range(30, SCREEN_H - 30);
+      } while (dist({ x, y }, ship) < 150);
+      const angle = ctx.random.range(0, Math.PI * 2);
+      const speed = ctx.random.range(ASTEROID_SPEED_MIN, ASTEROID_SPEED_MAX);
+      asteroids.push({
+        x, y,
+        vx: Math.cos(angle) * speed,
+        vy: Math.sin(angle) * speed,
+        radius: ASTEROID_LARGE_RADIUS,
+        active: true
+      });
+    }
   }
 
-  // lifecycle
+  function spawnBullet() {
+    const cos = Math.cos(ship.angle);
+    const sin = Math.sin(ship.angle);
+    const gunX = ship.x + cos * (SHIP_RADIUS + 5);
+    const gunY = ship.y + sin * (SHIP_RADIUS + 5);
+    bullets.push({
+      x: gunX, y: gunY,
+      prevX: gunX, prevY: gunY,
+      vx: cos * BULLET_SPEED,
+      vy: sin * BULLET_SPEED,
+      life: BULLET_LIFETIME
+    });
+    emitParticles(gunX, gunY, 12, { r: 0.5, g: 0.9, b: 1, a: 1 });
+    playSfx([1, 0.02, 880, , 0.02, 0.1, , 0.4, -0.1]); // fire sfx
+  }
+
+  // --- lifecycle ---
   function init(boot) {
     ctx = boot.ctx;
-    const input = ctx.getInput();
+    const seed = o.seed;
+    if (seed != null) ctx.random.reseed(seed);
 
-    const keydownSub = input.on('keydown', (e) => {
-      if (e.key) keyState[e.key] = true;
-    });
-    subHandlers.push(keydownSub);
+    // input subscriptions
+    const onKeyDown = (e) => {
+      switch (e.key) {
+        case 'ArrowLeft': held.left = true; break;
+        case 'ArrowRight': held.right = true; break;
+        case 'ArrowUp': held.up = true; break;
+        case ' ': held.space = true; break;
+      }
+    };
+    const onKeyUp = (e) => {
+      switch (e.key) {
+        case 'ArrowLeft': held.left = false; break;
+        case 'ArrowRight': held.right = false; break;
+        case 'ArrowUp': held.up = false; break;
+        case ' ': held.space = false; break;
+      }
+    };
+    const onPointerDown = (e) => {
+      if (phase === 'gameover') {
+        resetGame();
+      }
+    };
 
-    const keyupSub = input.on('keyup', (e) => {
-      if (e.key) keyState[e.key] = false;
-    });
-    subHandlers.push(keyupSub);
+    const inp = ctx.getInput();
+    const sub1 = inp.on('keydown', onKeyDown);
+    const sub2 = inp.on('keyup', onKeyUp);
+    const sub3 = inp.on('pointerdown', onPointerDown);
+    inputSubs = [sub1, sub2, sub3];
 
-    const pointerSub = input.on('pointerdown', () => {
-      if (phase === 'gameover') resetGame();
-    });
-    subHandlers.push(pointerSub);
-
-    resetGameState();
-    phase = 'playing';
-    result = null;
+    resetGame();
+    // initial particles (ambient)
+    const eng = ctx.getEngine();
+    if (eng && eng.particles) {
+      try {
+        eng.particles.spawnEmitter({
+          pos: { x: 195, y: 400 }, emitRate: 8, emitTime: 0, particleTime: 0.8,
+          speed: 30, sizeStart: 4, sizeEnd: 0,
+          colorStart: { r: 0.2, g: 0.6, b: 1, a: 0.5 }, colorEnd: { r: 0.1, g: 0.3, b: 0.5, a: 0 }
+        });
+      } catch (_) {}
+    }
   }
 
   function update(dt) {
-    if (phase === 'gameover') return;
-    const now = ctx.time.nowMs();
+    nowMs = ctx.time.nowMs();
+    t = nowMs / 1000;
 
-    // ship rotation
-    if (keyState['ArrowLeft']) ship.angle -= ROTATION_SPEED * dt;
-    if (keyState['ArrowRight']) ship.angle += ROTATION_SPEED * dt;
+    if (phase !== 'playing') return;
 
-    // thrust
-    if (keyState['ArrowUp']) {
-      ship.vx += Math.cos(ship.angle) * THRUST * dt;
-      ship.vy += Math.sin(ship.angle) * THRUST * dt;
-      spawnParticles(
-        ship.x - Math.cos(ship.angle)*20,
-        ship.y - Math.sin(ship.angle)*20,
-        { r:1, g:0.8, b:0.2, a:1 },
-        { r:1, g:0.4, b:0, a:0 },
-        5
-      );
+    // --- input handling ---
+    if (held.left) ship.angle -= SHIP_ROTATION_SPEED * dt;
+    if (held.right) ship.angle += SHIP_ROTATION_SPEED * dt;
+    if (held.up) {
+      ship.vx += Math.cos(ship.angle) * SHIP_ACCEL * dt;
+      ship.vy += Math.sin(ship.angle) * SHIP_ACCEL * dt;
     }
+    // held.space for continuous fire with cooldown
+    if (held.space && fireTimer <= 0) {
+      spawnBullet();
+      fireTimer = FIRE_COOLDOWN;
+    }
+    fireTimer -= dt;
 
-    // fire
-    if (keyState['Space']) fireBullet();
+    // --- friction ---
+    ship.vx *= SHIP_FRICTION;
+    ship.vy *= SHIP_FRICTION;
 
-    // friction
-    ship.vx *= FRICTION;
-    ship.vy *= FRICTION;
-
-    // move ship
+    // --- update ship position ---
     ship.x += ship.vx * dt;
     ship.y += ship.vy * dt;
-    wrapPos(ship);
+    // wrap
+    if (ship.x < 0) ship.x += SCREEN_W;
+    if (ship.x > SCREEN_W) ship.x -= SCREEN_W;
+    if (ship.y < 0) ship.y += SCREEN_H;
+    if (ship.y > SCREEN_H) ship.y -= SCREEN_H;
 
-    // move asteroids
-    for (const a of asteroids) {
-      a.x += a.vx * dt;
-      a.y += a.vy * dt;
-      wrapPos(a);
+    // --- update bullets with sub-steps for CCD ---
+    const subDt = dt / SUB_STEPS;
+    for (let bi = 0; bi < bullets.length; bi++) {
+      const b = bullets[bi];
+      b.prevX = b.x;
+      b.prevY = b.y;
+      // move in sub-steps (we only store final position for wrapping & collisions)
+      for (let s = 0; s < SUB_STEPS; s++) {
+        b.x += b.vx * subDt;
+        b.y += b.vy * subDt;
+        // wrap (optional: bullets wrap)
+        // We choose NOT to wrap bullets for simplicity – delete when off screen
+      }
+      b.life -= dt;
     }
 
-    // update bullets & collision with asteroids (CCD)
-    for (let i = bullets.length-1; i >= 0; i--) {
-      const b = bullets[i];
-      const oldX = b.x, oldY = b.y;
-      b.x += b.vx * dt;
-      b.y += b.vy * dt;
+    // --- bullet-asteroid collision (CCD using line segment) ---
+    const bulletsToRemove = [];
+    const newAsteroids = [];
+    let scoreDelta = 0;
 
-      // lifespan
-      if (now - b.born > BULLET_LIFETIME) {
-        bullets.splice(i, 1);
+    for (let bi = 0; bi < bullets.length; bi++) {
+      const b = bullets[bi];
+      if (b.life <= 0) {
+        bulletsToRemove.push(bi);
         continue;
       }
-
-      // off-screen remove (no wrap for simplicity)
-      if (b.x < 0 || b.x > 390 || b.y < 0 || b.y > 844) {
-        bullets.splice(i, 1);
+      // wrap check: if bullet left screen, remove
+      if (b.x < -100 || b.x > SCREEN_W + 100 || b.y < -100 || b.y > SCREEN_H + 100) {
+        bulletsToRemove.push(bi);
         continue;
       }
 
       let hit = false;
-      for (let j = asteroids.length-1; j >= 0; j--) {
-        const a = asteroids[j];
-        if (lineCircleIntersect({x:oldX, y:oldY}, {x:b.x, y:b.y}, {x:a.x, y:a.y}, a.radius)) {
+      for (let ai = 0; ai < asteroids.length; ai++) {
+        const a = asteroids[ai];
+        if (!a.active) continue;
+        if (lineCircleIntersect(
+          { x: b.prevX, y: b.prevY },
+          { x: b.x, y: b.y },
+          { x: a.x, y: a.y },
+          a.radius
+        )) {
+          // hit
           hit = true;
-          score += 1;
-          spawnParticles(b.x, b.y, {r:1,g:0.9,b:0.5,a:1}, {r:1,g:0.3,b:0,a:0}, 30);
-          playSfx([1,0.1,880,,,0.2,,0.4]);
-          if (a.isBig) splitAsteroid(a);
-          asteroids.splice(j, 1);
-          break;
+          // destroy asteroid
+          a.active = false;
+          // particles at hit point (use asteroid center)
+          emitParticles(a.x, a.y, 25, { r: 1, g: 0.6, b: 0.2, a: 1 });
+          playSfx([1, 0.05, 260, , 0.1, 0.15, , 0.7]); // explosion sfx
+          scoreDelta += 1;
+
+          if (a.radius === ASTEROID_LARGE_RADIUS) {
+            // spawn two small asteroids
+            const spd = Math.hypot(a.vx, a.vy) * 1.2;
+            for (let i = 0; i < 2; i++) {
+              const ang = ctx.random.range(0, Math.PI * 2);
+              const speed = spd * (0.8 + 0.4 * ctx.random.next());
+              newAsteroids.push({
+                x: a.x, y: a.y,
+                vx: Math.cos(ang) * speed,
+                vy: Math.sin(ang) * speed,
+                radius: ASTEROID_SMALL_RADIUS,
+                active: true
+              });
+            }
+          }
+          break; // one bullet hits at most one asteroid
         }
       }
-      if (hit) {
-        bullets.splice(i, 1);
-      }
+      if (hit) bulletsToRemove.push(bi);
     }
 
-    // ship vs asteroids
+    // --- apply bullet removal ---
+    for (let i = bulletsToRemove.length - 1; i >= 0; i--) {
+      bullets.splice(bulletsToRemove[i], 1);
+    }
+
+    // --- add new asteroids ---
+    for (const na of newAsteroids) {
+      asteroids.push(na);
+    }
+
+    // --- update score ---
+    score += scoreDelta;
+
+    // --- update asteroids (wrap) ---
     for (const a of asteroids) {
-      const dx = ship.x - a.x, dy = ship.y - a.y;
-      if (dx*dx + dy*dy < (ship.radius + a.radius) * (ship.radius + a.radius)) {
+      if (!a.active) continue;
+      a.x += a.vx * dt;
+      a.y += a.vy * dt;
+      if (a.x < -a.radius) a.x += SCREEN_W + 2 * a.radius;
+      if (a.x > SCREEN_W + a.radius) a.x -= SCREEN_W + 2 * a.radius;
+      if (a.y < -a.radius) a.y += SCREEN_H + 2 * a.radius;
+      if (a.y > SCREEN_H + a.radius) a.y -= SCREEN_H + 2 * a.radius;
+    }
+
+    // --- ship-asteroid collision ---
+    for (const a of asteroids) {
+      if (!a.active) continue;
+      if (dist(ship, a) < SHIP_RADIUS + a.radius) {
+        // game over - lose
         phase = 'gameover';
         result = 'lose';
-        spawnParticles(ship.x, ship.y, {r:1,g:0.2,b:0.2,a:1}, {r:0.5,g:0,b:0,a:0}, 40);
-        playSfx([1,0.2,100,,,0.5,,1.5]);
-        return;
+        emitParticles(ship.x, ship.y, 50, { r: 1, g: 0.2, b: 0.2, a: 1 });
+        playSfx([1, 0.2, 100, , 0.3, 0.3, , 0.8]); // crash sfx
+        // also destroy ship? keep ship visible
+        break;
       }
     }
 
-    // win condition
-    if (asteroids.length === 0) {
+    // --- check win (all asteroids gone) ---
+    const hasActive = asteroids.some(a => a.active);
+    if (!hasActive && asteroids.length > 0) {
       phase = 'gameover';
       result = 'win';
+      emitParticles(ship.x, ship.y, 60, { r: 0.3, g: 1, b: 0.5, a: 1 });
+      playSfx([1, 0.05, 523, , 0.05, 0.2, , 0.5]); // win sound
     }
   }
 
   function render(g) {
     // background
     g.fillStyle = '#0a0a1a';
-    g.fillRect(0, 0, 390, 844);
+    g.fillRect(0, 0, SCREEN_W, SCREEN_H);
 
     // asteroids
     for (const a of asteroids) {
-      g.fillStyle = a.isBig ? '#8b5e3c' : '#a0744a';
+      if (!a.active) continue;
+      g.fillStyle = '#888899';
       g.beginPath();
-      g.arc(a.x, a.y, a.radius, 0, Math.PI*2);
+      g.arc(a.x, a.y, a.radius, 0, Math.PI * 2);
       g.fill();
-      g.strokeStyle = '#d4a76a';
+      g.strokeStyle = '#aabbcc';
       g.lineWidth = 2;
       g.stroke();
     }
@@ -286,69 +371,66 @@ export default function createAsteroidsGame(opts) {
     for (const b of bullets) {
       g.fillStyle = '#ffff00';
       g.beginPath();
-      g.arc(b.x, b.y, b.radius, 0, Math.PI*2);
+      g.arc(b.x, b.y, BULLET_RADIUS, 0, Math.PI * 2);
       g.fill();
     }
 
-    // ship
+    // ship (triangle)
     g.save();
     g.translate(ship.x, ship.y);
     g.rotate(ship.angle);
-    g.fillStyle = phase === 'gameover' ? '#ff4444' : '#44aaff';
+    g.fillStyle = '#00ddff';
     g.beginPath();
-    g.moveTo(20, 0);
-    g.lineTo(-15, -12);
-    g.lineTo(-10, 0);
-    g.lineTo(-15, 12);
+    g.moveTo(0, -SHIP_RADIUS);
+    g.lineTo(-SHIP_RADIUS * 0.7, SHIP_RADIUS * 0.8);
+    g.lineTo(SHIP_RADIUS * 0.7, SHIP_RADIUS * 0.8);
     g.closePath();
     g.fill();
-    g.strokeStyle = '#ffffff';
-    g.lineWidth = 1.5;
-    g.stroke();
+    // engine glow if accelerating
+    if (held.up) {
+      g.fillStyle = '#ff8800';
+      g.beginPath();
+      g.moveTo(-5, SHIP_RADIUS * 0.5);
+      g.lineTo(0, SHIP_RADIUS * 1.2);
+      g.lineTo(5, SHIP_RADIUS * 0.5);
+      g.closePath();
+      g.fill();
+    }
     g.restore();
 
     // HUD
     g.fillStyle = '#ffffff';
-    g.font = 'bold 16px monospace';
+    g.font = '18px monospace';
     g.fillText('Score: ' + score, 10, 30);
-    g.fillText('Asteroids: ' + asteroids.length, 10, 50);
-    g.fillText('Phase: ' + phase, 10, 70);
+    const remaining = asteroids.filter(a => a.active).length;
+    g.fillText('Asteroids: ' + remaining, 10, 55);
 
     if (phase === 'gameover') {
-      g.fillStyle = result === 'win' ? '#00ff00' : '#ff0000';
-      g.font = 'bold 28px monospace';
+      g.font = 'bold 36px monospace';
+      g.fillStyle = result === 'win' ? '#66ff88' : '#ff6666';
       g.textAlign = 'center';
-      g.fillText(result === 'win' ? 'YOU WIN!' : 'GAME OVER', 195, 400);
-      g.font = '16px monospace';
-      g.fillStyle = '#ffffff';
-      g.fillText('Tap to restart', 195, 430);
-      g.textAlign = 'start';
+      g.fillText(result === 'win' ? 'YOU WIN!' : 'GAME OVER', SCREEN_W / 2, SCREEN_H / 2 - 40);
+      g.font = '20px monospace';
+      g.fillStyle = '#aaaaaa';
+      g.fillText('Click to restart', SCREEN_W / 2, SCREEN_H / 2 + 20);
+      g.textAlign = 'left';
     }
   }
 
   function destroy() {
-    for (const sub of subHandlers) {
-      try { sub.cancel(); } catch(_) {}
+    for (const sub of inputSubs) {
+      try { sub.cancel(); } catch (_) {}
     }
-    subHandlers = [];
-    asteroids = [];
+    inputSubs = [];
     bullets = [];
-    phase = 'booting';
-    result = null;
+    asteroids = [];
   }
 
-  function _forensicsView() {
-    return {
-      seed: ctx && ctx.random ? ctx.random.seed : null,
-      state: () => ({
-        phase,
-        result,
-        score,
-        asteroidsRemaining: asteroids.length,
-        ship: { x: ship.x, y: ship.y, angle: ship.angle }
-      })
-    };
-  }
-
-  return { init, update, render, destroy, _forensicsView };
+  return {
+    init,
+    update,
+    render,
+    destroy,
+    _forensicsView
+  };
 }
\ No newline at end of file
diff --git a/game-runtime/games/_wg1-gen/asteroids/play-spec.json b/game-runtime/games/_wg1-gen/asteroids/play-spec.json
index c7bdc25a..95582e56 100644
--- a/game-runtime/games/_wg1-gen/asteroids/play-spec.json
+++ b/game-runtime/games/_wg1-gen/asteroids/play-spec.json
@@ -1,16 +1,12 @@
 {
   "driver": {
-    "type": "key-cycle",
-    "keys": [
-      "ArrowLeft",
-      "ArrowUp",
-      "Space",
-      "ArrowRight",
-      "Space",
-      "Space"
-    ],
-    "steps": 50,
-    "stepMs": 200
+    "type": "aim-fire",
+    "shipPath": "ship",
+    "targetsPath": "asteroids",
+    "fireKey": "Space",
+    "steps": 90,
+    "stepMs": 120,
+    "downMs": 80
   },
   "expectedEngineCallPrefixes": [
     "particles.",
@@ -20,7 +16,7 @@
     {
       "path": "score",
       "op": "increased",
-      "why": "循环旋转+推进+开火→击碎陨石得分上升;若高速子弹穿透(CCD缺)或打不中则不升=暴露 CCD 缺口"
+      "why": "aim-fire 读陨石坐标旋向对齐开火→击碎得分上升;若游戏不暴露陨石坐标致盲射则不升=可测性边界"
     }
   ],
   "expectLatch": true
diff --git a/game-runtime/games/_wg1-gen/flappy/bundle.iife.js b/game-runtime/games/_wg1-gen/flappy/bundle.iife.js
index d7d5b836..f6e7c2f2 100644
--- a/game-runtime/games/_wg1-gen/flappy/bundle.iife.js
+++ b/game-runtime/games/_wg1-gen/flappy/bundle.iife.js
@@ -1,34 +1,34 @@
-"use strict";var __GameBundle=(()=>{var Fi=Object.defineProperty;var kc=Object.getOwnPropertyDescriptor;var Gc=Object.getOwnPropertyNames;var Fc=Object.prototype.hasOwnProperty;var jc=(n,t,e)=>()=>{if(e)throw e[0];try{return n&&(t=n(n=0)),t}catch(s){throw e=[s],s}};var Vr=(n,t)=>{for(var e in t)Fi(n,e,{get:t[e],enumerable:!0})},Nc=(n,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Gc(t))!Fc.call(n,i)&&i!==e&&Fi(n,i,{get:()=>t[i],enumerable:!(s=kc(t,i))||s.enumerable});return n};var Bc=n=>Nc(Fi({},"__esModule",{value:!0}),n);var Lc={};Vr(Lc,{ASSERT:()=>f,BLACK:()=>nt,BLUE:()=>$a,Box2dDistanceJoint:()=>bi,Box2dFrictionJoint:()=>qo,Box2dGearJoint:()=>Jo,Box2dJoint:()=>Vt,Box2dKinematicObject:()=>Go,Box2dMotorJoint:()=>Xo,Box2dObject:()=>Ss,Box2dPinJoint:()=>No,Box2dPlugin:()=>xi,Box2dPrismaticJoint:()=>Uo,Box2dPulleyJoint:()=>Ho,Box2dRaycastResult:()=>mi,Box2dRevoluteJoint:()=>zo,Box2dRopeJoint:()=>Bo,Box2dStaticObject:()=>yi,Box2dTargetJoint:()=>jo,Box2dTileLayer:()=>Fo,Box2dWeldJoint:()=>Wo,Box2dWheelJoint:()=>Vo,CLEAR_BLACK:()=>ue,CLEAR_WHITE:()=>tn,CYAN:()=>ql,CanvasLayer:()=>oi,Color:()=>St,Ease:()=>Si,EngineObject:()=>je,GRAY:()=>Vl,GREEN:()=>Ya,ImageFont:()=>Zs,LOG:()=>bt,Light:()=>_o,LightSystemPlugin:()=>Eo,MAGENTA:()=>Hl,Medal:()=>pi,NewgroundsMedal:()=>To,NewgroundsPlugin:()=>Ao,ORANGE:()=>Wl,PI:()=>q,PURPLE:()=>Ka,Particle:()=>ri,ParticleEmitter:()=>yo,PathFinder:()=>Yo,PathFinderNode:()=>wi,PostProcessPlugin:()=>Co,RED:()=>nr,RandomGenerator:()=>uo,Sound:()=>ds,SoundInstance:()=>si,TextureInfo:()=>Ne,TileCollisionLayer:()=>ps,TileInfo:()=>Ce,TileLayer:()=>fs,TileLayerData:()=>pn,Timer:()=>we,Tween:()=>vi,UIButton:()=>vs,UICheckbox:()=>Do,UILayout:()=>ko,UIObject:()=>se,UISlider:()=>Io,UISystemPlugin:()=>Po,UIText:()=>gi,UITextInput:()=>Lo,UITile:()=>Oo,UIVideo:()=>Mo,Vector2:()=>st,WHITE:()=>U,YELLOW:()=>Xa,ZzFXMusic:()=>Ro,abs:()=>Z,atan2:()=>Zo,audioContext:()=>ft,audioDefaultSampleRate:()=>qn,audioIsRunning:()=>hs,audioMasterGain:()=>Fe,box2d:()=>m,box2dDebug:()=>Jr,box2dInit:()=>ad,box2dSetDebug:()=>rd,cameraAngle:()=>$,cameraFit:()=>rh,cameraPos:()=>At,cameraScale:()=>W,canvasClearColor:()=>Ye,canvasColorTiles:()=>Ai,canvasFixedSize:()=>Ln,canvasMaxAspect:()=>Pn,canvasMaxSize:()=>Rn,canvasMinAspect:()=>Zn,canvasPixelRatio:()=>$e,canvasPixelated:()=>or,ceil:()=>is,clamp:()=>F,combineCanvases:()=>br,cos:()=>ot,debug:()=>It,debugCircle:()=>Nt,debugClear:()=>Ml,debugLine:()=>xe,debugOverlap:()=>co,debugOverlay:()=>Pe,debugPoint:()=>Qo,debugPointSize:()=>Da,debugPoly:()=>Il,debugRect:()=>mt,debugScreenshot:()=>Ma,debugShowErrors:()=>kl,debugText:()=>_n,debugVideoCaptureIsActive:()=>ve,debugVideoCaptureStart:()=>ka,debugVideoCaptureStop:()=>Ga,debugWatermark:()=>Ti,distanceAngle:()=>zl,distanceWrap:()=>tr,drawCanvas2D:()=>vn,drawCircle:()=>Qs,drawCircleGradient:()=>sh,drawContext:()=>wt,drawCount:()=>Te,drawCrescent:()=>ud,drawEllipse:()=>ec,drawEllipseGradient:()=>nc,drawLine:()=>ln,drawLineList:()=>fo,drawNineSlice:()=>Ac,drawNineSliceScreen:()=>cd,drawPoly:()=>Fn,drawRect:()=>Ks,drawRectGradient:()=>th,drawRegularPoly:()=>tc,drawText:()=>ih,drawTextScreen:()=>Ke,drawTextureWrapped:()=>eh,drawThreeSlice:()=>Cc,drawThreeSliceScreen:()=>ld,drawTile:()=>_t,enablePhysicsSolver:()=>Ri,engineAddPlugin:()=>bn,engineImageFont:()=>rc,engineInit:()=>Pl,engineName:()=>Js,engineObjects:()=>xt,engineObjectsCallback:()=>Ol,engineObjectsCollect:()=>Oa,engineObjectsCollide:()=>Ko,engineObjectsDestroy:()=>Ll,engineObjectsRaycast:()=>Dl,engineObjectsUpdate:()=>La,engineVersion:()=>Us,fetchJSON:()=>Xl,floor:()=>vt,fontDefault:()=>ws,formatTime:()=>sr,frame:()=>Ra,frameRate:()=>El,gamepadConnected:()=>go,gamepadDirectionEmulateStick:()=>dr,gamepadDpad:()=>po,gamepadIsDown:()=>Re,gamepadPrimary:()=>yt,gamepadStick:()=>ls,gamepadStickCount:()=>ac,gamepadVibrate:()=>Sh,gamepadVibrateStop:()=>wh,gamepadWasPressed:()=>Ar,gamepadWasReleased:()=>vh,gamepadsEnable:()=>Pi,getCameraSize:()=>ic,getCrescentPoints:()=>Ec,getNoteFrequency:()=>dc,getPaused:()=>_l,glAntialias:()=>Lr,glCanvas:()=>Q,glCircleSides:()=>Ts,glClearCanvas:()=>mc,glClearRect:()=>wc,glCompileShader:()=>wo,glContext:()=>g,glCopyToContext:()=>kr,glCreateProgram:()=>Jn,glCreateTexture:()=>Ii,glDeleteTexture:()=>xc,glDraw:()=>ms,glDrawColoredPoints:()=>jr,glDrawOutlineTransform:()=>Fr,glDrawPoints:()=>Sc,glDrawPointsTransform:()=>Gr,glDrawUntextured:()=>vc,glEnable:()=>k,glFlush:()=>Ct,glSetAntialias:()=>Yh,glSetRenderTarget:()=>Qn,glSetTexture:()=>Ir,glSetTextureData:()=>Mr,glSetTextureWrap:()=>bc,gravity:()=>Bt,headlessMode:()=>j,hsl:()=>Oe,hypot:()=>Fa,inputClear:()=>Ps,inputClearKey:()=>wr,inputMouseMoveThreshold:()=>Sr,inputPreventDefault:()=>On,inputWASDEmulateDirection:()=>ts,isArray:()=>ce,isColor:()=>z,isFullscreen:()=>oc,isIntersecting:()=>za,isNumber:()=>P,isOnScreen:()=>ah,isOverlapping:()=>Hs,isPowerOfTwo:()=>os,isStringLike:()=>J,isTouchDevice:()=>ee,isUsingGamepad:()=>In,isVector2:()=>L,keyDirection:()=>bh,keyIsDown:()=>Et,keyWasPressed:()=>Ot,keyWasReleased:()=>Tr,lastInputDevice:()=>He,lerp:()=>zt,lerpAngle:()=>Jl,lerpWrap:()=>Ba,lightSystem:()=>V,lineTest:()=>Ua,log2:()=>ja,mainCanvas:()=>G,mainCanvasSize:()=>D,mainContext:()=>at,max:()=>X,medalDisplaySize:()=>di,medalDisplaySlideTime:()=>Dn,medalDisplayTime:()=>hi,medals:()=>bs,medalsForEach:()=>Mi,medalsInit:()=>Zh,medalsPreventUnlock:()=>Nr,medalsReset:()=>td,min:()=>K,mod:()=>te,mouseDelta:()=>xr,mouseDeltaScreen:()=>ye,mouseInWindow:()=>ti,mouseIsDown:()=>ns,mousePos:()=>_e,mousePosScreen:()=>jt,mouseWasPressed:()=>cs,mouseWasReleased:()=>xh,mouseWheel:()=>vr,nearestPowerOfTwo:()=>Ul,newgrounds:()=>xs,noise1D:()=>Zl,noise2D:()=>tu,objectDefaultAngleDamping:()=>lr,objectDefaultDamping:()=>cr,objectDefaultFriction:()=>hr,objectDefaultMass:()=>ar,objectDefaultRestitution:()=>ur,objectMaxSpeed:()=>De,oscillate:()=>Ja,particleEmitRateScale:()=>Xs,paused:()=>Se,percent:()=>Mt,percentLerp:()=>Bl,playSamples:()=>Pr,pointerLockExit:()=>Ch,pointerLockIsActive:()=>cc,pointerLockRequest:()=>Ah,postProcess:()=>Lt,primitiveCount:()=>Ae,rand:()=>dt,randBool:()=>Va,randColor:()=>lo,randInCircle:()=>Ha,randInt:()=>er,randSign:()=>Wa,randVec2:()=>qa,readSaveData:()=>Kl,rgb:()=>B,round:()=>Ws,saveCanvas:()=>Qa,saveDataURL:()=>rs,saveText:()=>Yl,screenToWorld:()=>_s,screenToWorldDelta:()=>sc,screenToWorldTransform:()=>Rs,setAdditiveBlendMode:()=>as,setCameraAngle:()=>nu,setCameraPos:()=>eu,setCameraScale:()=>su,setCanvasClearColor:()=>ru,setCanvasColorTiles:()=>ou,setCanvasFixedSize:()=>uu,setCanvasMaxAspect:()=>lu,setCanvasMaxSize:()=>au,setCanvasMinAspect:()=>cu,setCanvasPixelRatio:()=>du,setCanvasPixelated:()=>Za,setCursor:()=>hh,setDebugKey:()=>Zu,setDebugWatermark:()=>Qu,setEnablePhysicsSolver:()=>Su,setFontDefault:()=>fu,setGLCircleSides:()=>mu,setGLEnable:()=>yu,setGamepadDirectionEmulateStick:()=>Ou,setGamepadsEnable:()=>Lu,setGravity:()=>Ru,setHeadlessMode:()=>gu,setInputMouseMoveThreshold:()=>ph,setInputPreventDefault:()=>fh,setInputWASDEmulateDirection:()=>Du,setMedalDisplaySize:()=>sd,setMedalDisplaySlideTime:()=>nd,setMedalDisplayTime:()=>ed,setMedalsPreventUnlock:()=>id,setObjectDefaultAngleDamping:()=>Au,setObjectDefaultDamping:()=>Tu,setObjectDefaultFriction:()=>Eu,setObjectDefaultMass:()=>wu,setObjectDefaultRestitution:()=>Cu,setObjectMaxSpeed:()=>_u,setParticleEmitRateScale:()=>Pu,setPaused:()=>Rl,setShowSplashScreen:()=>pu,setSoundDefaultRange:()=>$u,setSoundDefaultTaper:()=>Ku,setSoundEnable:()=>Xu,setSoundVolume:()=>Yu,setTileDefaultBleed:()=>vu,setTileDefaultPadding:()=>xu,setTileDefaultSize:()=>bu,setTilesPixelated:()=>hu,setTimeScale:()=>iu,setTouchGamepadAlpha:()=>Vu,setTouchGamepadAnalog:()=>zu,setTouchGamepadButtonCount:()=>Fu,setTouchGamepadCenterButtonSize:()=>Gu,setTouchGamepadDisplayTime:()=>Wu,setTouchGamepadEnable:()=>Mu,setTouchGamepadFloating:()=>Ju,setTouchGamepadLeftButtonCount:()=>Nu,setTouchGamepadLeftStick:()=>ju,setTouchGamepadPassthrough:()=>ku,setTouchGamepadRightStick:()=>Bu,setTouchGamepadSize:()=>Uu,setTouchGamepadVibration:()=>qu,setTouchInputEnable:()=>Iu,setVibrateEnable:()=>Hu,shareURL:()=>$l,showSplashScreen:()=>rr,sign:()=>Zt,sin:()=>tt,smoothStep:()=>qs,soundDefaultRange:()=>gr,soundDefaultTaper:()=>yr,soundEnable:()=>Ut,soundVolume:()=>fn,speak:()=>Bh,speakStop:()=>zh,tan:()=>Na,textureInfos:()=>nn,tile:()=>Es,tileCollisionGetData:()=>ii,tileCollisionLayers:()=>Qe,tileCollisionRaycast:()=>fc,tileCollisionTest:()=>We,tileDefaultBleed:()=>_i,tileDefaultPadding:()=>Ei,tileDefaultSize:()=>Ci,tileLayersLoad:()=>Uh,tilesPixelated:()=>gn,time:()=>Ht,timeDelta:()=>$o,timeReal:()=>Ze,timeScale:()=>ir,toggleFullscreen:()=>uh,touchGamepadAlpha:()=>pr,touchGamepadAnalog:()=>As,touchGamepadButtonCount:()=>Un,touchGamepadCenterButtonSize:()=>le,touchGamepadDisplayTime:()=>es,touchGamepadEnable:()=>en,touchGamepadFloating:()=>sn,touchGamepadLeftButtonCount:()=>Vn,touchGamepadLeftStick:()=>xn,touchGamepadPassthrough:()=>fr,touchGamepadRightStick:()=>Wn,touchGamepadSize:()=>Jt,touchGamepadVibration:()=>Ys,touchInputEnable:()=>cn,tweenProperty:()=>hd,tweenStopAll:()=>dd,tweenUpdate:()=>Pc,uiDebug:()=>zr,uiSetDebug:()=>od,uiSystem:()=>C,usingGamepadInput:()=>mh,usingKeyboardInput:()=>yh,usingMouseInput:()=>gh,vec2:()=>x,vibrate:()=>Cr,vibrateEnable:()=>Cs,vibrateStop:()=>Th,workCanvas:()=>ke,workContext:()=>qe,workReadCanvas:()=>be,workReadContext:()=>Ie,worldToScreen:()=>Sn,worldToScreenDelta:()=>oh,writeSaveData:()=>Ql,zzfx:()=>Jh,zzfxG:()=>Oi,zzfxM:()=>Tc});function _l(){return Se}function Rl(n=!0){Se=n}function bn(n,t,e,s){f(!un.find(o=>o.update===n&&o.render===t&&o.glContextLost===e&&o.glContextRestored===s));let i=new ro(n,t,e,s);un.push(i)}async function Pl(n,t,e,s,i,o=[],r){if(Pa&&console.log(`${Js} Engine v${Us}`),f(!at,"engine already initialized"),at)return;f(ce(o),"pass in images as array"),document.body||document.documentElement.appendChild(document.createElement("body")),r||(r=document.body),n||(n=()=>{}),t||(t=()=>{}),e||(e=()=>{}),s||(s=()=>{}),i||(i=()=>{});function a(){D=x(G.width,G.height),at.imageSmoothingEnabled=!gn,So()}function c(y=0){let b=y-so;so||(b=0),so=y,(It||Ti)&&(Vs=zt(Vs,1e3/(b||1),.05));let v=It&&Et("Equal"),S=It&&Et("Minus"),_=v?10:S?.1:1;Ze+=b*_/1e3;let w=ir*_;b*=w,ge+=Se?0:b,w<=1&&(ge=K(ge,50));let E=!1;if(Se){E=!0,l(),wa(),un.forEach(T=>{var R;return(R=T.update)==null?void 0:R.call(T)});for(let T of xt)T.parent||T.updateTransforms();ba(),e(),Ta(),ve()&&A()}else{let T=0;for(ge<0&&ge>-9&&(T=ge,ge=0);ge>=0;ge-=1e3/60)Ht=Ra++/60,E=!0,l(),wa(),t(),un.forEach(R=>{var M;return(M=R.update)==null?void 0:M.call(R)}),La(),ba(),e(),Ta(),ve()&&A();ge+=T}ve()||A(),requestAnimationFrame(c);function A(){if(!j){E||l(),a(),s(),xt.sort((T,R)=>T.renderOrder-R.renderOrder);for(let T of xt)T.destroyed||T.render();i(),un.forEach(T=>{var R;return(R=T.render)==null?void 0:R.call(T)}),_h(),Fl(),Ct(),jl(),Te=0,Ae=0}}}function l(){if(!j){if(Ln.x){D=Ln.copy();let y=innerWidth/innerHeight,b=Ln.x/Ln.y,v=yPn){let E=D.y*Pn|0;D.x=K(E,Rn.x)}else if(S0&&!k&&(at.fillStyle=Ye.toString(),at.fillRect(0,0,D.x,D.y),at.fillStyle=nt.toString()),at.lineJoin="round",at.lineCap="round"}}if(j)return d();qh(r);let u="margin:0;overflow:hidden;background:#000;user-select:none;-webkit-user-select:none;touch-action:none;-webkit-touch-callout:none";r.style.cssText=u,G=r.appendChild(document.createElement("canvas")),wt=at=G.getContext("2d"),Eh(),Nh(),Gl();let h="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)";G.style.cssText=h,Q&&(Q.style.cssText=h),Za(or),l(),So(),ke=new OffscreenCanvas(64,64),qe=ke.getContext("2d"),be=new OffscreenCanvas(64,64),Ie=be.getContext("2d",{willReadFrequently:!0});let p=o.map((y,b)=>va(b,y));return o.length||p.push(va(0)),p.push(dh()),rr&&p.push(new Promise(y=>{let b=0;v();function v(){Ps(),Qh(b+=.01),b>1?y():setTimeout(v,16)}})),await Promise.all(p),d();async function d(){await n(),c()}}function La(){Ko=xt.filter(t=>t.collideSolidObjects);function n(t){if(!t.destroyed){t.update();for(let e of t.children)n(e)}}for(let t of xt)if(!(t.parent||t.destroyed)){t.update(),t.updatePhysics();for(let e of t.children)n(e);t.updateTransforms()}xt=xt.filter(t=>!t.destroyed)}function Ll(n=!0){for(let t of xt)t.parent||t.destroy(n);xt=xt.filter(t=>!t.destroyed)}function Oa(n,t,e=xt){let s=[];if(n)if(t instanceof st)for(let i of e)i.isOverlapping(n,t)&&s.push(i);else{let i=t*t;for(let o of e)n.distanceSquared(o.pos)e(i))}function Dl(n,t,e=xt){let s=[];for(let i of e)i.collideRaycast&&za(n,t,i.pos,i.size)&&(ae&&mt(i.pos,i.size,"#f00"),s.push(i));return ae&&xe(n,t,s.length?"#f00":"#00f",.02),s}function f(n,...t){if(!n)throw console.assert(n,...t),new Error("Assert failed!")}function bt(...n){console.log(...n)}function mt(n,t=x(),e=U,s=0,i=0,o=!1,r=!1){f(L(n),"pos must be a vec2"),f(L(t),"size must be a vec2"),f(J(e)||z(e),"color is invalid"),f(P(s),"time must be a number"),f(P(i),"angle must be a number"),z(e)&&(e=e.toString());let a=new we(s);Xe.push({pos:n.copy(),size:t.copy(),color:e,timer:a,angle:i,fill:o,screenSpace:r})}function Il(n,t,e=U,s=0,i=0,o=!1,r=!1){f(L(n),"pos must be a vec2"),f(ce(t),"points must be an array"),f(J(e)||z(e),"color is invalid"),f(P(s),"time must be a number"),f(P(i),"angle must be a number"),z(e)&&(e=e.toString()),n=n.copy(),t=t.map(c=>c.copy());let a=new we(s);Xe.push({pos:n,points:t,color:e,timer:a,angle:i,fill:o,screenSpace:r})}function Nt(n,t=0,e=U,s=0,i=!1,o=!1){f(L(n),"pos must be a vec2"),f(P(t),"size must be a number"),f(J(e)||z(e),"color is invalid"),f(P(s),"time must be a number"),z(e)&&(e=e.toString()),n=n.copy();let r=new we(s);Xe.push({pos:n,size:t,color:e,timer:r,angle:0,fill:i,screenSpace:o})}function Qo(n,t,e,s,i=!1){mt(n,void 0,t,e,s,!1,i)}function xe(n,t,e,s=.1,i=0,o=!1){f(L(n),"posA must be a vec2"),f(L(t),"posB must be a vec2"),f(P(s),"width must be a number");let r=x((t.x-n.x)/2,(t.y-n.y)/2),a=x(s,r.length()*2);mt(n.add(r),a,e,i,r.angle(),!0,o)}function co(n,t,e,s,i,o,r=!1){f(L(n),"posA must be a vec2"),f(L(e),"posB must be a vec2"),f(L(t),"sizeA must be a vec2"),f(L(s),"sizeB must be a vec2");let a=x(K(n.x-t.x/2,e.x-s.x/2),K(n.y-t.y/2,e.y-s.y/2)),c=x(X(n.x+t.x/2,e.x+s.x/2),X(n.y+t.y/2,e.y+s.y/2));mt(a.lerp(c,.5),c.subtract(a),i,o,0,!1,r)}function _n(n,t,e=1,s=U,i=0,o=0,r="monospace",a=!1){f(J(n),"text must be a string"),f(L(t),"pos must be a vec2"),f(P(e),"size must be a number"),f(J(s)||z(s),"color is invalid"),f(P(i),"time must be a number"),f(P(o),"angle must be a number"),f(J(r),"font must be a string"),z(s)&&(s=s.toString()),t=t.copy();let c=new we(i);Xe.push({text:n,pos:t,size:e,color:s,timer:c,angle:o,font:r,screenSpace:a})}function Ml(){Xe=[]}function Ma(){ao=1}function kl(){let n=e=>{document.body.style="background-color:#111;margin:8px",document.body.innerHTML="
"+e},t=console.assert;console.assert=(e,...s)=>{if(t(e,...s),!e){let i=s.join(" "),o=new Error().stack;throw`Assertion failed!
+"use strict";var __GameBundle=(()=>{var Fi=Object.defineProperty;var kc=Object.getOwnPropertyDescriptor;var Gc=Object.getOwnPropertyNames;var Fc=Object.prototype.hasOwnProperty;var jc=(n,t,e)=>()=>{if(e)throw e[0];try{return n&&(t=n(n=0)),t}catch(s){throw e=[s],s}};var Vr=(n,t)=>{for(var e in t)Fi(n,e,{get:t[e],enumerable:!0})},Bc=(n,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Gc(t))!Fc.call(n,i)&&i!==e&&Fi(n,i,{get:()=>t[i],enumerable:!(s=kc(t,i))||s.enumerable});return n};var Nc=n=>Bc(Fi({},"__esModule",{value:!0}),n);var Lc={};Vr(Lc,{ASSERT:()=>f,BLACK:()=>et,BLUE:()=>$a,Box2dDistanceJoint:()=>bi,Box2dFrictionJoint:()=>qo,Box2dGearJoint:()=>Jo,Box2dJoint:()=>Ut,Box2dKinematicObject:()=>Go,Box2dMotorJoint:()=>Xo,Box2dObject:()=>Ss,Box2dPinJoint:()=>Bo,Box2dPlugin:()=>xi,Box2dPrismaticJoint:()=>Uo,Box2dPulleyJoint:()=>Ho,Box2dRaycastResult:()=>mi,Box2dRevoluteJoint:()=>zo,Box2dRopeJoint:()=>No,Box2dStaticObject:()=>yi,Box2dTargetJoint:()=>jo,Box2dTileLayer:()=>Fo,Box2dWeldJoint:()=>Wo,Box2dWheelJoint:()=>Vo,CLEAR_BLACK:()=>ue,CLEAR_WHITE:()=>Ze,CYAN:()=>ql,CanvasLayer:()=>oi,Color:()=>xt,Ease:()=>Si,EngineObject:()=>Fe,GRAY:()=>Vl,GREEN:()=>Ya,ImageFont:()=>Zs,LOG:()=>yt,Light:()=>Co,LightSystemPlugin:()=>_o,MAGENTA:()=>Hl,Medal:()=>pi,NewgroundsMedal:()=>To,NewgroundsPlugin:()=>Ao,ORANGE:()=>Wl,PI:()=>q,PURPLE:()=>Ka,Particle:()=>ri,ParticleEmitter:()=>yo,PathFinder:()=>Yo,PathFinderNode:()=>wi,PostProcessPlugin:()=>Eo,RED:()=>nr,RandomGenerator:()=>uo,Sound:()=>ds,SoundInstance:()=>si,TextureInfo:()=>je,TileCollisionLayer:()=>ps,TileInfo:()=>Ae,TileLayer:()=>fs,TileLayerData:()=>yn,Timer:()=>Se,Tween:()=>vi,UIButton:()=>vs,UICheckbox:()=>Do,UILayout:()=>ko,UIObject:()=>ee,UISlider:()=>Io,UISystemPlugin:()=>Po,UIText:()=>gi,UITextInput:()=>Lo,UITile:()=>Oo,UIVideo:()=>Mo,Vector2:()=>it,WHITE:()=>U,YELLOW:()=>Xa,ZzFXMusic:()=>Ro,abs:()=>Z,atan2:()=>Zo,audioContext:()=>ht,audioDefaultSampleRate:()=>Wn,audioIsRunning:()=>hs,audioMasterGain:()=>Ge,box2d:()=>m,box2dDebug:()=>Jr,box2dInit:()=>ad,box2dSetDebug:()=>rd,cameraAngle:()=>Y,cameraFit:()=>rh,cameraPos:()=>Tt,cameraScale:()=>W,canvasClearColor:()=>Xe,canvasColorTiles:()=>Ai,canvasFixedSize:()=>Pn,canvasMaxAspect:()=>Rn,canvasMaxSize:()=>Cn,canvasMinAspect:()=>Zn,canvasPixelRatio:()=>Ye,canvasPixelated:()=>or,ceil:()=>is,clamp:()=>j,combineCanvases:()=>br,cos:()=>at,debug:()=>It,debugCircle:()=>jt,debugClear:()=>Ml,debugLine:()=>be,debugOverlap:()=>co,debugOverlay:()=>Re,debugPoint:()=>Qo,debugPointSize:()=>Da,debugPoly:()=>Il,debugRect:()=>pt,debugScreenshot:()=>Ma,debugShowErrors:()=>kl,debugText:()=>_n,debugVideoCaptureIsActive:()=>xe,debugVideoCaptureStart:()=>ka,debugVideoCaptureStop:()=>Ga,debugWatermark:()=>Ti,distanceAngle:()=>zl,distanceWrap:()=>tr,drawCanvas2D:()=>wn,drawCircle:()=>Qs,drawCircleGradient:()=>sh,drawContext:()=>St,drawCount:()=>we,drawCrescent:()=>ud,drawEllipse:()=>ec,drawEllipseGradient:()=>nc,drawLine:()=>hn,drawLineList:()=>fo,drawNineSlice:()=>Ac,drawNineSliceScreen:()=>cd,drawPoly:()=>Gn,drawRect:()=>Ks,drawRectGradient:()=>th,drawRegularPoly:()=>tc,drawText:()=>ih,drawTextScreen:()=>$e,drawTextureWrapped:()=>eh,drawThreeSlice:()=>Ec,drawThreeSliceScreen:()=>ld,drawTile:()=>Rt,enablePhysicsSolver:()=>Ri,engineAddPlugin:()=>vn,engineImageFont:()=>rc,engineInit:()=>Pl,engineName:()=>Js,engineObjects:()=>mt,engineObjectsCallback:()=>Ol,engineObjectsCollect:()=>Oa,engineObjectsCollide:()=>Ko,engineObjectsDestroy:()=>Ll,engineObjectsRaycast:()=>Dl,engineObjectsUpdate:()=>La,engineVersion:()=>Us,fetchJSON:()=>Xl,floor:()=>bt,fontDefault:()=>ws,formatTime:()=>sr,frame:()=>Ra,frameRate:()=>_l,gamepadConnected:()=>go,gamepadDirectionEmulateStick:()=>dr,gamepadDpad:()=>po,gamepadIsDown:()=>Ce,gamepadPrimary:()=>ft,gamepadStick:()=>ls,gamepadStickCount:()=>ac,gamepadVibrate:()=>Sh,gamepadVibrateStop:()=>wh,gamepadWasPressed:()=>Ar,gamepadWasReleased:()=>vh,gamepadsEnable:()=>Pi,getCameraSize:()=>ic,getCrescentPoints:()=>_c,getNoteFrequency:()=>dc,getPaused:()=>Cl,glAntialias:()=>Lr,glCanvas:()=>Q,glCircleSides:()=>Ts,glClearCanvas:()=>mc,glClearRect:()=>wc,glCompileShader:()=>wo,glContext:()=>g,glCopyToContext:()=>kr,glCreateProgram:()=>zn,glCreateTexture:()=>Ii,glDeleteTexture:()=>xc,glDraw:()=>ms,glDrawColoredPoints:()=>jr,glDrawOutlineTransform:()=>Fr,glDrawPoints:()=>Sc,glDrawPointsTransform:()=>Gr,glDrawUntextured:()=>vc,glEnable:()=>G,glFlush:()=>At,glSetAntialias:()=>Yh,glSetRenderTarget:()=>Qn,glSetTexture:()=>Ir,glSetTextureData:()=>Mr,glSetTextureWrap:()=>bc,gravity:()=>Bt,headlessMode:()=>B,hsl:()=>Le,hypot:()=>Fa,inputClear:()=>Ps,inputClearKey:()=>wr,inputMouseMoveThreshold:()=>Sr,inputPreventDefault:()=>Ln,inputWASDEmulateDirection:()=>ts,isArray:()=>ce,isColor:()=>z,isFullscreen:()=>oc,isIntersecting:()=>za,isNumber:()=>P,isOnScreen:()=>ah,isOverlapping:()=>Hs,isPowerOfTwo:()=>os,isStringLike:()=>J,isTouchDevice:()=>Zt,isUsingGamepad:()=>Dn,isVector2:()=>L,keyDirection:()=>bh,keyIsDown:()=>Ct,keyWasPressed:()=>Ot,keyWasReleased:()=>Tr,lastInputDevice:()=>qe,lerp:()=>Nt,lerpAngle:()=>Jl,lerpWrap:()=>Na,lightSystem:()=>V,lineTest:()=>Ua,log2:()=>ja,mainCanvas:()=>F,mainCanvasSize:()=>I,mainContext:()=>ct,max:()=>X,medalDisplaySize:()=>di,medalDisplaySlideTime:()=>On,medalDisplayTime:()=>hi,medals:()=>bs,medalsForEach:()=>Mi,medalsInit:()=>Zh,medalsPreventUnlock:()=>Br,medalsReset:()=>td,min:()=>K,mod:()=>Qt,mouseDelta:()=>xr,mouseDeltaScreen:()=>ge,mouseInWindow:()=>ti,mouseIsDown:()=>ns,mousePos:()=>_e,mousePosScreen:()=>Ft,mouseWasPressed:()=>cs,mouseWasReleased:()=>xh,mouseWheel:()=>vr,nearestPowerOfTwo:()=>Ul,newgrounds:()=>xs,noise1D:()=>Zl,noise2D:()=>tu,objectDefaultAngleDamping:()=>lr,objectDefaultDamping:()=>cr,objectDefaultFriction:()=>hr,objectDefaultMass:()=>ar,objectDefaultRestitution:()=>ur,objectMaxSpeed:()=>Oe,oscillate:()=>Ja,particleEmitRateScale:()=>Xs,paused:()=>ve,percent:()=>Mt,percentLerp:()=>Nl,playSamples:()=>Pr,pointerLockExit:()=>Eh,pointerLockIsActive:()=>cc,pointerLockRequest:()=>Ah,postProcess:()=>Lt,primitiveCount:()=>Te,rand:()=>ut,randBool:()=>Va,randColor:()=>lo,randInCircle:()=>Ha,randInt:()=>er,randSign:()=>Wa,randVec2:()=>qa,readSaveData:()=>Kl,rgb:()=>N,round:()=>Ws,saveCanvas:()=>Qa,saveDataURL:()=>rs,saveText:()=>Yl,screenToWorld:()=>Cs,screenToWorldDelta:()=>sc,screenToWorldTransform:()=>Rs,setAdditiveBlendMode:()=>as,setCameraAngle:()=>nu,setCameraPos:()=>eu,setCameraScale:()=>su,setCanvasClearColor:()=>ru,setCanvasColorTiles:()=>ou,setCanvasFixedSize:()=>uu,setCanvasMaxAspect:()=>lu,setCanvasMaxSize:()=>au,setCanvasMinAspect:()=>cu,setCanvasPixelRatio:()=>du,setCanvasPixelated:()=>Za,setCursor:()=>hh,setDebugKey:()=>Zu,setDebugWatermark:()=>Qu,setEnablePhysicsSolver:()=>Su,setFontDefault:()=>fu,setGLCircleSides:()=>mu,setGLEnable:()=>yu,setGamepadDirectionEmulateStick:()=>Ou,setGamepadsEnable:()=>Lu,setGravity:()=>Ru,setHeadlessMode:()=>gu,setInputMouseMoveThreshold:()=>ph,setInputPreventDefault:()=>fh,setInputWASDEmulateDirection:()=>Du,setMedalDisplaySize:()=>sd,setMedalDisplaySlideTime:()=>nd,setMedalDisplayTime:()=>ed,setMedalsPreventUnlock:()=>id,setObjectDefaultAngleDamping:()=>Au,setObjectDefaultDamping:()=>Tu,setObjectDefaultFriction:()=>_u,setObjectDefaultMass:()=>wu,setObjectDefaultRestitution:()=>Eu,setObjectMaxSpeed:()=>Cu,setParticleEmitRateScale:()=>Pu,setPaused:()=>Rl,setShowSplashScreen:()=>pu,setSoundDefaultRange:()=>$u,setSoundDefaultTaper:()=>Ku,setSoundEnable:()=>Xu,setSoundVolume:()=>Yu,setTileDefaultBleed:()=>vu,setTileDefaultPadding:()=>xu,setTileDefaultSize:()=>bu,setTilesPixelated:()=>hu,setTimeScale:()=>iu,setTouchGamepadAlpha:()=>Vu,setTouchGamepadAnalog:()=>zu,setTouchGamepadButtonCount:()=>Fu,setTouchGamepadCenterButtonSize:()=>Gu,setTouchGamepadDisplayTime:()=>Wu,setTouchGamepadEnable:()=>Mu,setTouchGamepadFloating:()=>Ju,setTouchGamepadLeftButtonCount:()=>Bu,setTouchGamepadLeftStick:()=>ju,setTouchGamepadPassthrough:()=>ku,setTouchGamepadRightStick:()=>Nu,setTouchGamepadSize:()=>Uu,setTouchGamepadVibration:()=>qu,setTouchInputEnable:()=>Iu,setVibrateEnable:()=>Hu,shareURL:()=>$l,showSplashScreen:()=>rr,sign:()=>Kt,sin:()=>tt,smoothStep:()=>qs,soundDefaultRange:()=>gr,soundDefaultTaper:()=>yr,soundEnable:()=>Jt,soundVolume:()=>gn,speak:()=>Nh,speakStop:()=>zh,tan:()=>Ba,textureInfos:()=>en,tile:()=>_s,tileCollisionGetData:()=>ii,tileCollisionLayers:()=>Ke,tileCollisionRaycast:()=>fc,tileCollisionTest:()=>Ve,tileDefaultBleed:()=>Ci,tileDefaultPadding:()=>_i,tileDefaultSize:()=>Ei,tileLayersLoad:()=>Uh,tilesPixelated:()=>mn,time:()=>Ht,timeDelta:()=>$o,timeReal:()=>Qe,timeScale:()=>ir,toggleFullscreen:()=>uh,touchGamepadAlpha:()=>pr,touchGamepadAnalog:()=>As,touchGamepadButtonCount:()=>Jn,touchGamepadCenterButtonSize:()=>le,touchGamepadDisplayTime:()=>es,touchGamepadEnable:()=>tn,touchGamepadFloating:()=>nn,touchGamepadLeftButtonCount:()=>Un,touchGamepadLeftStick:()=>Sn,touchGamepadPassthrough:()=>fr,touchGamepadRightStick:()=>Vn,touchGamepadSize:()=>zt,touchGamepadVibration:()=>Ys,touchInputEnable:()=>un,tweenProperty:()=>hd,tweenStopAll:()=>dd,tweenUpdate:()=>Pc,uiDebug:()=>zr,uiSetDebug:()=>od,uiSystem:()=>E,usingGamepadInput:()=>mh,usingKeyboardInput:()=>yh,usingMouseInput:()=>gh,vec2:()=>b,vibrate:()=>Er,vibrateEnable:()=>Es,vibrateStop:()=>Th,workCanvas:()=>Me,workContext:()=>We,workReadCanvas:()=>me,workReadContext:()=>De,worldToScreen:()=>Tn,worldToScreenDelta:()=>oh,writeSaveData:()=>Ql,zzfx:()=>Jh,zzfxG:()=>Oi,zzfxM:()=>Tc});function Cl(){return ve}function Rl(n=!0){ve=n}function vn(n,t,e,s){f(!dn.find(o=>o.update===n&&o.render===t&&o.glContextLost===e&&o.glContextRestored===s));let i=new ro(n,t,e,s);dn.push(i)}async function Pl(n,t,e,s,i,o=[],r){if(Pa&&console.log(`${Js} Engine v${Us}`),f(!ct,"engine already initialized"),ct)return;f(ce(o),"pass in images as array"),document.body||document.documentElement.appendChild(document.createElement("body")),r||(r=document.body),n||(n=()=>{}),t||(t=()=>{}),e||(e=()=>{}),s||(s=()=>{}),i||(i=()=>{});function a(){I=b(F.width,F.height),ct.imageSmoothingEnabled=!mn,So()}function c(y=0){let x=y-so;so||(x=0),so=y,(It||Ti)&&(Vs=Nt(Vs,1e3/(x||1),.05));let v=It&&Ct("Equal"),T=It&&Ct("Minus"),C=v?10:T?.1:1;Qe+=x*C/1e3;let w=ir*C;x*=w,pe+=ve?0:x,w<=1&&(pe=K(pe,50));let _=!1;if(ve){_=!0,l(),wa(),dn.forEach(S=>{var R;return(R=S.update)==null?void 0:R.call(S)});for(let S of mt)S.parent||S.updateTransforms();ba(),e(),Ta(),xe()&&A()}else{let S=0;for(pe<0&&pe>-9&&(S=pe,pe=0);pe>=0;pe-=1e3/60)Ht=Ra++/60,_=!0,l(),wa(),t(),dn.forEach(R=>{var M;return(M=R.update)==null?void 0:M.call(R)}),La(),ba(),e(),Ta(),xe()&&A();pe+=S}xe()||A(),requestAnimationFrame(c);function A(){if(!B){_||l(),a(),s(),mt.sort((S,R)=>S.renderOrder-R.renderOrder);for(let S of mt)S.destroyed||S.render();i(),dn.forEach(S=>{var R;return(R=S.render)==null?void 0:R.call(S)}),Ch(),Fl(),At(),jl(),we=0,Te=0}}}function l(){if(!B){if(Pn.x){I=Pn.copy();let y=innerWidth/innerHeight,x=Pn.x/Pn.y,v=yRn){let _=I.y*Rn|0;I.x=K(_,Cn.x)}else if(T0&&!G&&(ct.fillStyle=Xe.toString(),ct.fillRect(0,0,I.x,I.y),ct.fillStyle=et.toString()),ct.lineJoin="round",ct.lineCap="round"}}if(B)return d();qh(r);let u="margin:0;overflow:hidden;background:#000;user-select:none;-webkit-user-select:none;touch-action:none;-webkit-touch-callout:none";r.style.cssText=u,F=r.appendChild(document.createElement("canvas")),St=ct=F.getContext("2d"),_h(),Bh(),Gl();let h="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)";F.style.cssText=h,Q&&(Q.style.cssText=h),Za(or),l(),So(),Me=new OffscreenCanvas(64,64),We=Me.getContext("2d"),me=new OffscreenCanvas(64,64),De=me.getContext("2d",{willReadFrequently:!0});let p=o.map((y,x)=>va(x,y));return o.length||p.push(va(0)),p.push(dh()),rr&&p.push(new Promise(y=>{let x=0;v();function v(){Ps(),Qh(x+=.01),x>1?y():setTimeout(v,16)}})),await Promise.all(p),d();async function d(){await n(),c()}}function La(){Ko=mt.filter(t=>t.collideSolidObjects);function n(t){if(!t.destroyed){t.update();for(let e of t.children)n(e)}}for(let t of mt)if(!(t.parent||t.destroyed)){t.update(),t.updatePhysics();for(let e of t.children)n(e);t.updateTransforms()}mt=mt.filter(t=>!t.destroyed)}function Ll(n=!0){for(let t of mt)t.parent||t.destroy(n);mt=mt.filter(t=>!t.destroyed)}function Oa(n,t,e=mt){let s=[];if(n)if(t instanceof it)for(let i of e)i.isOverlapping(n,t)&&s.push(i);else{let i=t*t;for(let o of e)n.distanceSquared(o.pos)e(i))}function Dl(n,t,e=mt){let s=[];for(let i of e)i.collideRaycast&&za(n,t,i.pos,i.size)&&(ae&&pt(i.pos,i.size,"#f00"),s.push(i));return ae&&be(n,t,s.length?"#f00":"#00f",.02),s}function f(n,...t){if(!n)throw console.assert(n,...t),new Error("Assert failed!")}function yt(...n){console.log(...n)}function pt(n,t=b(),e=U,s=0,i=0,o=!1,r=!1){f(L(n),"pos must be a vec2"),f(L(t),"size must be a vec2"),f(J(e)||z(e),"color is invalid"),f(P(s),"time must be a number"),f(P(i),"angle must be a number"),z(e)&&(e=e.toString());let a=new Se(s);He.push({pos:n.copy(),size:t.copy(),color:e,timer:a,angle:i,fill:o,screenSpace:r})}function Il(n,t,e=U,s=0,i=0,o=!1,r=!1){f(L(n),"pos must be a vec2"),f(ce(t),"points must be an array"),f(J(e)||z(e),"color is invalid"),f(P(s),"time must be a number"),f(P(i),"angle must be a number"),z(e)&&(e=e.toString()),n=n.copy(),t=t.map(c=>c.copy());let a=new Se(s);He.push({pos:n,points:t,color:e,timer:a,angle:i,fill:o,screenSpace:r})}function jt(n,t=0,e=U,s=0,i=!1,o=!1){f(L(n),"pos must be a vec2"),f(P(t),"size must be a number"),f(J(e)||z(e),"color is invalid"),f(P(s),"time must be a number"),z(e)&&(e=e.toString()),n=n.copy();let r=new Se(s);He.push({pos:n,size:t,color:e,timer:r,angle:0,fill:i,screenSpace:o})}function Qo(n,t,e,s,i=!1){pt(n,void 0,t,e,s,!1,i)}function be(n,t,e,s=.1,i=0,o=!1){f(L(n),"posA must be a vec2"),f(L(t),"posB must be a vec2"),f(P(s),"width must be a number");let r=b((t.x-n.x)/2,(t.y-n.y)/2),a=b(s,r.length()*2);pt(n.add(r),a,e,i,r.angle(),!0,o)}function co(n,t,e,s,i,o,r=!1){f(L(n),"posA must be a vec2"),f(L(e),"posB must be a vec2"),f(L(t),"sizeA must be a vec2"),f(L(s),"sizeB must be a vec2");let a=b(K(n.x-t.x/2,e.x-s.x/2),K(n.y-t.y/2,e.y-s.y/2)),c=b(X(n.x+t.x/2,e.x+s.x/2),X(n.y+t.y/2,e.y+s.y/2));pt(a.lerp(c,.5),c.subtract(a),i,o,0,!1,r)}function _n(n,t,e=1,s=U,i=0,o=0,r="monospace",a=!1){f(J(n),"text must be a string"),f(L(t),"pos must be a vec2"),f(P(e),"size must be a number"),f(J(s)||z(s),"color is invalid"),f(P(i),"time must be a number"),f(P(o),"angle must be a number"),f(J(r),"font must be a string"),z(s)&&(s=s.toString()),t=t.copy();let c=new Se(i);He.push({text:n,pos:t,size:e,color:s,timer:c,angle:o,font:r,screenSpace:a})}function Ml(){He=[]}function Ma(){ao=1}function kl(){let n=e=>{document.body.style="background-color:#111;margin:8px",document.body.innerHTML="
"+e},t=console.assert;console.assert=(e,...s)=>{if(t(e,...s),!e){let i=s.join(" "),o=new Error().stack;throw`Assertion failed!
 `+i+`
 `+o}},onunhandledrejection=e=>n(e.reason.stack||e.reason),onerror=(e,s,i,o)=>n(`${e}
 ${s}
-Ln ${i}, Col ${o}`)}function Gl(){Pa&&console.warn("LittleJS DEBUG build loaded. Use the release build for production.")}function ba(){It&&(Ot(Ia)&&(Pe=!Pe),Pe&&(Ot("Digit1")&&(re=!re,hn=!1),Ot("Digit2")&&(hn=!hn,re=!1),Ot("Digit3")&&(dn=!dn),Ot("Digit4")&&(ae=!ae),Ot("Digit5")&&Ma(),Ot("Digit7")&&(Gn=!Gn)),ve()?(!Pe||Ot("Digit6"))&&Ga():Pe&&Ot("Digit6")&&ka())}function Fl(){if(ve())return;Ct();let n=Te,t=Ae;ao&&(br(),Qa(G),ao=0);let e=at;if(dn&&Pi){let o=0;for(let r=0;r<8;r++)go(r)&&o++;for(let r=0;r<8;r++){if(!go(r))continue;let a=1,c=.2,l=At.add(x(-a*2,((o-1)/2-r)*a*3));_n(r,l.add(x(-a,a)),1),r===yt&&_n("Main",l.add(x(-a*2,0)),1,"#0f0");let u=me[r].length;for(let p=0;p{e.save();let o=i.pos,r=1,a=i.angle;if(i.screenSpace||(o=Sn(i.pos),r=W,a-=$),e.translate(o.x|0,o.y|0),e.rotate(a),e.scale(1,i.text?1:-1),e.fillStyle=i.color,e.strokeStyle=i.color,i.text!==void 0)e.font=i.size*r+"px "+i.font,e.textAlign="center",e.textBaseline="middle",e.fillText(i.text,0,0);else if(i.points!==void 0){e.beginPath();for(let c of i.points){let l=c.scale(r).floor();e.lineTo(l.x,l.y)}e.closePath(),i.fill&&e.fill(),e.stroke()}else if(i.size===0||i.size.x===0&&i.size.y===0){let c=Da*r;e.fillRect(-c/2,-1,c,3),e.fillRect(-1,-c/2,3,c)}else if(i.size.x!==void 0){let c=i.size.scale(r).floor(),l=c.x,u=c.y;i.fill&&e.fillRect(-l/2|0,-u/2|0,l,u),e.strokeRect(-l/2|0,-u/2|0,l,u)}else e.beginPath(),e.arc(0,0,i.size*r/2,0,9),i.fill&&e.fill(),e.stroke();e.restore()}),Xe=Xe.filter(i=>i.timer<0),s){let i=fc(s.pos,_e);i&&Ks(i.floor().add(x(.5)),x(1),B(0,1,1,.3),0,!1),ln(_e,s.pos,.1,i?B(1,0,0,.5):B(0,1,0,.5),void 0,void 0,!1);let o="mouse pos = "+_e;Qe.length&&(o+=`
+Ln ${i}, Col ${o}`)}function Gl(){Pa&&console.warn("LittleJS DEBUG build loaded. Use the release build for production.")}function ba(){It&&(Ot(Ia)&&(Re=!Re),Re&&(Ot("Digit1")&&(re=!re,fn=!1),Ot("Digit2")&&(fn=!fn,re=!1),Ot("Digit3")&&(pn=!pn),Ot("Digit4")&&(ae=!ae),Ot("Digit5")&&Ma(),Ot("Digit7")&&(kn=!kn)),xe()?(!Re||Ot("Digit6"))&&Ga():Re&&Ot("Digit6")&&ka())}function Fl(){if(xe())return;At();let n=we,t=Te;ao&&(br(),Qa(F),ao=0);let e=ct;if(pn&&Pi){let o=0;for(let r=0;r<8;r++)go(r)&&o++;for(let r=0;r<8;r++){if(!go(r))continue;let a=1,c=.2,l=Tt.add(b(-a*2,((o-1)/2-r)*a*3));_n(r,l.add(b(-a,a)),1),r===ft&&_n("Main",l.add(b(-a*2,0)),1,"#0f0");let u=ye[r].length;for(let p=0;p{e.save();let o=i.pos,r=1,a=i.angle;if(i.screenSpace||(o=Tn(i.pos),r=W,a-=Y),e.translate(o.x|0,o.y|0),e.rotate(a),e.scale(1,i.text?1:-1),e.fillStyle=i.color,e.strokeStyle=i.color,i.text!==void 0)e.font=i.size*r+"px "+i.font,e.textAlign="center",e.textBaseline="middle",e.fillText(i.text,0,0);else if(i.points!==void 0){e.beginPath();for(let c of i.points){let l=c.scale(r).floor();e.lineTo(l.x,l.y)}e.closePath(),i.fill&&e.fill(),e.stroke()}else if(i.size===0||i.size.x===0&&i.size.y===0){let c=Da*r;e.fillRect(-c/2,-1,c,3),e.fillRect(-1,-c/2,3,c)}else if(i.size.x!==void 0){let c=i.size.scale(r).floor(),l=c.x,u=c.y;i.fill&&e.fillRect(-l/2|0,-u/2|0,l,u),e.strokeRect(-l/2|0,-u/2|0,l,u)}else e.beginPath(),e.arc(0,0,i.size*r/2,0,9),i.fill&&e.fill(),e.stroke();e.restore()}),He=He.filter(i=>i.timer<0),s){let i=fc(s.pos,_e);i&&Ks(i.floor().add(b(.5)),b(1),N(0,1,1,.3),0,!1),hn(_e,s.pos,.1,i?N(1,0,0,.5):N(0,1,0,.5),void 0,void 0,!1);let o="mouse pos = "+_e;Ke.length&&(o+=`
 mouse collision = `+ii(_e)),o+=`
 
 --- object info ---
-`,o+=s.toString(),Ke(o,jt,24,B(),.05,void 0,"center","monospace")}{e.save(),e.fillStyle="#fff",e.textAlign="left",e.textBaseline="top",e.font="20px monospace",e.shadowColor="#000",e.shadowBlur=9;let r=9,a=0,c=24;if(Pe){e.fillText(`${Js} v${Us}`,r,a+=c/2),e.fillText("Time: "+sr(Ht),r,a+=c),e.fillText("FPS: "+Vs.toFixed(1)+(k?" WebGL":" Canvas2D"),r,a+=c),e.fillText("Objects: "+xt.length,r,a+=c),e.fillText("Draw Calls: "+Te,r,a+=c),e.fillText("Primitives: "+Ae,r,a+=c),e.fillText("---------",r,a+=c),e.fillStyle="#f00",e.fillText("ESC: Debug Overlay",r,a+=c),e.fillStyle=re?"#f00":"#fff",e.fillText("1: Debug Physics",r,a+=c),e.fillStyle=hn?"#f00":"#fff",e.fillText("2: Debug Particles",r,a+=c),e.fillStyle=dn?"#f00":"#fff",e.fillText("3: Debug Gamepads",r,a+=c),e.fillStyle=ae?"#f00":"#fff",e.fillText("4: Debug Raycasts",r,a+=c),e.fillStyle="#fff",e.fillText("5: Save Screenshot",r,a+=c),e.fillText("6: Toggle Video Capture",r,a+=c),e.fillStyle=Gn?"#f00":"#fff",e.fillText("7: Debug Sound",r,a+=c);let l="",u="";for(let h in H[0])Et(h,0)&&(parseInt(h)<3?u+=h+" ":l+=h+" ");u&&e.fillText("Mouse: "+u,r,a+=c),l&&e.fillText("Keys: "+l,r,a+=c);for(let h=1;hs.push(a.data),i.onstop=()=>{let a=new Blob(s,{type:"video/webm"}),c=URL.createObjectURL(a);rs(c,"capture.webm",1e3)};let o,r;if(Ut){r=new ConstantSourceNode(ft,{offset:0}),r.connect(Fe),r.start(),o=ft.createMediaStreamDestination(),Fe.connect(o);for(let a of o.stream.getAudioTracks())n.addTrack(a)}try{i.start()}catch{bt("Video capture not supported in this browser!"),r==null||r.stop();return}bt("Video capture started."),Le={mediaRecorder:i,captureTimer:e,videoTrack:t,silentAudioSource:r,audioStreamDestination:o}}function Ga(){var n,t,e;f(ve(),"Not capturing video!"),bt(`Video capture ended. ${Le.captureTimer.get().toFixed(2)} seconds recorded.`),oe.style.display="none",(n=Le.silentAudioSource)==null||n.stop(),(t=Le.mediaRecorder)==null||t.stop(),(e=Le.videoTrack)==null||e.stop(),Le=void 0}function Nl(){f(ve(),"Not capturing video!"),br(),Le.videoTrack.requestFrame(),oe.textContent="\u25CF REC "+sr(Le.captureTimer)}function Yt(n){if(It){let t=Object.keys(n),e={};t.forEach(s=>e[s]=n[s]),t.forEach(s=>{Object.defineProperty(n,s,{get:()=>e[s],set:i=>{f(!1,`Cannot modify engine constant. Attempted to set constant (${n}) property '${s}' to '${i}'.`)},enumerable:!0})})}return Object.freeze(n)}function te(n,t=1){return(n%t+t)%t}function F(n,t=0,e=1){return ne?e:n}function Mt(n,t,e){return(e-=t)?F((n-t)/e):0}function zt(n,t,e){return n+F(e)*(t-n)}function Bl(n,t,e,s,i){return zt(s,i,Mt(n,t,e))}function tr(n,t,e=1){f(e>0,"distanceWrap wrapSize must be > 0");let s=(n-t)%e;return s*2%e-s}function Ba(n,t,e,s=1){return n+F(e)*tr(t,n,s)}function zl(n,t){return tr(n,t,2*q)}function Jl(n,t,e){return Ba(n,t,e,2*q)}function qs(n){return n*n*(3-2*n)}function os(n){return!(n&n-1)}function Ul(n){return 2**is(ja(n))}function Hs(n,t,e,s=x()){let i=(n.x-e.x)*2,o=(n.y-e.y)*2,r=t.x+s.x,a=t.y+s.y;return Z(i)p)return!1;h=X(y,h)}else{if(y0?a.x+1:a.x,b=h>0?a.y+1:a.y,v=c?(y-n.x)/c:1/0,S=l?(b-n.y)/l:1/0,_=0,w=v,E=S,A=pa.x&&(T.x=a.x+1-R),M.ya.y&&(T.y=a.y+1-R),s&&(A?s.set(-u,0):s.set(0,-h)),T}(A=wURL.revokeObjectURL(n),e)}function $l(n,t,e){var s;f(J(n),"shareURL requires title string"),f(J(t),"shareURL requires url string"),(s=navigator.share)==null||s.call(navigator,{title:n,url:t}).then(()=>e==null?void 0:e())}function Kl(n,t){f(J(n),"loadData requires saveName string");let e={};try{let s=localStorage[n];if(s)try{e=JSON.parse(s)}catch{bt("readSaveData: corrupt JSON for",n,"\u2014 using defaults")}}catch{bt("readSaveData: localStorage unavailable \u2014 using defaults")}return{...t,...e}}function Ql(n,t){f(J(n),"saveData requires saveName string");try{localStorage[n]=JSON.stringify(t)}catch{bt("writeSaveData: failed to write",n)}}function ho(n){let t=(n|0)^2654435769;return t=Math.imul(t^t>>>16,2246822507),t=Math.imul(t^t>>>13,3266489909),t^=t>>>16,(t>>>0)/2**32}function Zl(n){let t=vt(n);return zt(ho(t),ho(t+1),qs(n-t))}function tu(n,t){let e=vt(n),s=vt(t),i=qs(n-e),o=qs(t-s),r=(a,c)=>ho(a+c*374761393);return zt(zt(r(e,s),r(e+1,s),i),zt(r(e,s+1),r(e+1,s+1),i),o)}function eu(n){At=n.copy()}function nu(n){$=n}function su(n){W=n}function iu(n){ir=n}function ou(n){Ai=n}function ru(n){Ye=n.copy()}function au(n){Rn=n.copy()}function cu(n){Zn=n}function lu(n){Pn=n}function uu(n){Ln=n.copy()}function Za(n){or=n,G&&(G.style.imageRendering=n?"pixelated":""),Q&&(Q.style.imageRendering=n?"pixelated":"")}function hu(n){gn=n}function du(n){$e=n}function fu(n){ws=n}function pu(n){rr=n}function gu(n){j=n}function yu(n){if(n&&!vo){console.warn("Can not enable WebGL if it was disabled on start.");return}k=n,Q&&(Q.style.display=n?"":"none")}function mu(n){Ts=n}function bu(n){Ci=n.copy()}function xu(n){Ei=n}function vu(n){_i=n}function Su(n){Ri=n}function wu(n){ar=n}function Tu(n){cr=n}function Au(n){lr=n}function Cu(n){ur=n}function Eu(n){hr=n}function _u(n){De=n}function Ru(n){Bt=n.copy()}function Pu(n){Xs=n}function Lu(n){Pi=n}function Ou(n){dr=n}function Du(n){ts=n}function Iu(n){cn=n}function Mu(n){en=n}function ku(n){fr=n}function Gu(n){le=n}function Fu(n){Un=n,n>0&&(Wn=!1)}function ju(n){xn=n,n&&(Vn=0)}function Nu(n){Vn=n,n>0&&(xn=!1)}function Bu(n){Wn=n,n&&(Un=0)}function zu(n){As=n}function Ju(n){sn=n}function Uu(n){Jt=n}function Vu(n){pr=n}function Wu(n){es=n}function qu(n){Ys=n}function Hu(n){Cs=n}function Xu(n){Ut=n}function Yu(n){fn=n,Ut&&!j&&Fe&&(Fe.gain.value=n)}function $u(n){gr=n}function Ku(n){yr=n}function Qu(n){Ti=n}function Zu(n){Ia=n}function $s(n){return n.r>=1&&n.g>=1&&n.b>=1}function mr(n){return n.r<=0&&n.g<=0&&n.b<=0&&n.a<=0}function Es(n=0,t=Ci,e=0,s=Ei,i=_i){if(f(L(n)||typeof n=="number","index must be a vec2 or number"),f(L(t)||typeof t=="number","size must be a vec2 or number"),f(P(e)||e instanceof Ne,"texture must be a number or TextureInfo"),f(P(s),"padding must be a number"),j)return new Ce;typeof t=="number"&&(f(t>0),t=new st(t,t));let o=typeof e=="number"?nn[e]:e;f(o instanceof Ne,"tile texture is not loaded"),f(o.size.x>0,"tile texture is not loaded");let r=t.x+s*2,a=t.y+s*2,c,l;if(typeof n=="number"){let h=o.size.x/r|0;c=n%h,l=n/h|0}else c=n.x,l=n.y;let u=new st(c*r+s,l*a+s);return new Ce(u,t,o,s,i)}function _t(n,t=x(1),e,s=U,i=0,o,r,a=k,c=!1,l){var p;f(L(n),"pos must be a vec2"),f(L(t),"size must be a vec2"),f(z(s),"color is invalid"),f(P(i),"angle must be a number"),f(!r||z(r),"additiveColor must be a color"),f(!l||!a,"context only supported in canvas 2D mode");let u=e==null?void 0:e.textureInfo,h=(p=e==null?void 0:e.bleed)!=null?p:0;if(a&&k)if(f(!!g,"WebGL is not enabled!"),c&&([n,t,i]=Rs(n,t,i)),u){let d=u.sizeInverse,y=e.pos.x*d.x,b=e.pos.y*d.y,v=e.size.x*d.x,S=e.size.y*d.y;if(Ir(u.glTexture),h){let _=d.x*h,w=d.y*h;ms(n.x,n.y,o?-t.x:t.x,t.y,i,y+_,b+w,y-_+v,b-w+S,s.rgbaInt(),r&&r.rgbaInt())}else ms(n.x,n.y,o?-t.x:t.x,t.y,i,y,b,y+v,b+S,s.rgbaInt(),r&&r.rgbaInt())}else{let d=r?s.add(r):s;vc(n.x,n.y,t.x,t.y,i,d.rgbaInt())}else++Te,++Ae,vn(n,t,i,o,d=>{if(u){d.scale(1,-1);let y=e.pos.x,b=e.pos.y,v=e.size.x,S=e.size.y;lh(d,u.image,y,b,v,S,-.5,-.5,1,1,s,r,h)}else{let y=r?s.add(r):s;d.fillStyle=y.toString(),d.fillRect(-.5,-.5,1,1)}},c,l)}function Ks(n,t,e,s,i,o,r){_t(n,t,void 0,e,s,!1,void 0,i,o,r)}function th(n,t,e=U,s=tn,i=0,o=k,r=!1,a){if(f(L(n),"pos must be a vec2"),f(L(t),"size must be a vec2"),f(z(e)&&z(s),"color is invalid"),f(P(i),"angle must be a number"),f(!a||!o,"context only supported in canvas 2D mode"),o&&k){f(!!g,"WebGL is not enabled!"),r&&(n=_s(n),t=t.scale(1/W),i+=$);let c=[],l=[],u=t.x/2,h=t.y/2,p=e.rgbaInt(),d=s.rgbaInt(),y=ot(-i),b=tt(-i);for(let v=4;v--;){let S=v&1?u:-u,_=v&2?h:-h,w=S*y-_*b,E=S*b+_*y,A=v&2?p:d;c.push(x(n.x+w,n.y+E)),l.push(A)}jr(c,l)}else++Te,++Ae,vn(n,t,i,!1,c=>{let l=c.createLinearGradient(0,.5,0,-.5);l.addColorStop(0,e.toString()),l.addColorStop(1,s.toString()),c.fillStyle=l,c.fillRect(-.5,-.5,1,1)},r,a)}function eh(n,t,e,s=0,i=U,o=0,r,a=k,c=!1,l){if(f(L(n),"pos must be a vec2"),f(L(t),"size must be a vec2"),f(L(e),"wrapCount must be a vec2"),f(z(i),"color is invalid"),f(P(o),"angle must be a number"),f(!r||z(r),"additiveColor must be a color"),f(!l||!a,"context only supported in canvas 2D mode"),f(!(s instanceof Ce),"pass a TextureInfo or texture index, not a TileInfo \u2014 use tileInfo.textureInfo"),j)return;let u=typeof s=="number"?nn[s]:s;if(f(u instanceof Ne,"texture not loaded"),f(u.size.x>0,"texture not loaded"),f(u.wrap,"drawTextureWrapped requires a wrap-enabled texture; call textureInfo.setWrap(true) first"),a&&k){f(!!g,"WebGL is not enabled!"),c&&([n,t,o]=Rs(n,t,o)),Ir(u.glTexture),ms(n.x,n.y,t.x,t.y,o,0,0,e.x,e.y,i.rgbaInt(),r&&r.rgbaInt());return}++Te,++Ae,c||(n=Sn(n),t=t.scale(W),o-=$);let h=!Ai||(r?$s(i.add(r))&&r.a<=0:$s(i)),p=!h&&r&&!mr(r),d=h?u.image:ch(u.image,i,r);l=l||wt,l.save(),l.translate(n.x+.5,n.y+.5),l.rotate(o),l.globalAlpha=p?1:i.a;let y=l.createPattern(d,"repeat"),b=new DOMMatrix().translate(-t.x/2,-t.y/2).scale(t.x/(e.x*d.width),t.y/(e.y*d.height));y.setTransform(b),l.fillStyle=y,l.fillRect(-t.x/2,-t.y/2,t.x,t.y),l.globalAlpha=1,l.restore()}function fo(n,t=.1,e=U,s=!1,i=x(),o=0,r=k,a=!1,c){if(f(ce(n),"points must be an array"),f(P(t),"width must be a number"),f(z(e),"color is invalid"),f(L(i),"pos must be a vec2"),f(P(o),"angle must be a number"),f(!c||!r,"context only supported in canvas 2D mode"),r&&k){f(!!g,"WebGL is not enabled!");let l=x(1);a&&([i,l,o]=Rs(i,l,o)),Fr(n,e.rgbaInt(),t,i.x,i.y,l.x,l.y,o,s)}else++Te,++Ae,vn(i,x(1),o,!1,l=>{l.strokeStyle=e.toString(),l.lineWidth=t,l.beginPath();for(let u=0;u0&&Fr(n,s.rgbaInt(),e,i.x,i.y,l.x,l.y,o)}else vn(i,x(1),o,!1,l=>{l.fillStyle=t.toString(),l.beginPath();for(let u of n)l.lineTo(u.x,u.y);l.closePath(),l.fill(),e&&(l.strokeStyle=s.toString(),l.lineWidth=e,l.stroke())},a,c)}function ec(n,t=x(1),e=U,s=0,i=0,o=nt,r=k,a=!1,c){f(L(n),"pos must be a vec2"),f(L(t),"size must be a vec2"),f(z(e)&&z(o),"color is invalid"),f(P(s),"angle must be a number"),f(P(i),"lineWidth must be a number"),f(i>=0,"lineWidth must be a positive value or 0"),f(!c||!r,"context only supported in canvas 2D mode"),i=F(i,0,K(t.x,t.y)),r&&k?tc(n,t,Ts,e,i,o,s,r,a,c):vn(n,x(1),s,!1,l=>{l.fillStyle=e.toString(),l.beginPath(),l.ellipse(0,0,t.x/2,t.y/2,0,0,9),l.fill(),i&&(l.strokeStyle=o.toString(),l.lineWidth=i,l.stroke())},a,c)}function Qs(n,t=1,e=U,s=0,i=nt,o=k,r=!1,a){f(P(t),"size must be a number"),ec(n,x(t),e,0,s,i,o,r,a)}function nc(n,t=x(1),e=U,s=tn,i=0,o=k,r=!1,a){if(f(L(n),"pos must be a vec2"),f(L(t),"size must be a vec2"),f(z(e)&&z(s),"color is invalid"),f(P(i),"angle must be a number"),f(!a||!o,"context only supported in canvas 2D mode"),!j)if(o&&k){f(!!g,"WebGL is not enabled!"),r&&(n=_s(n),t=t.scale(1/W),i+=$);let c=Ts,l=t.x/2,u=t.y/2,h=e.rgbaInt(),p=s.rgbaInt(),d=nh++,y=ot(-i),b=tt(-i),v=E=>{let A=tt(E)*l,T=ot(E)*u;return x(n.x+A*y-T*b,n.y+A*b+T*y)},S=d%c/c*q*2,_=[v(S)],w=[p];for(let E=c;E--;){let A=(E+d)%c/c*q*2;_.push(n),w.push(h),_.push(v(A)),w.push(p)}jr(_,w)}else++Te,++Ae,vn(n,t,i,!1,c=>{let l=c.createRadialGradient(0,0,0,0,0,.5);l.addColorStop(0,e.toString()),l.addColorStop(1,s.toString()),c.fillStyle=l,c.beginPath(),c.ellipse(0,0,.5,.5,0,0,9),c.fill()},r,a)}function sh(n,t=1,e=U,s=tn,i=k,o=!1,r){f(P(t),"size must be a number"),nc(n,x(t),e,s,0,i,o,r)}function vn(n,t,e=0,s=!1,i,o=!1,r=wt){f(L(n),"pos must be a vec2"),f(L(t),"size must be a vec2"),f(P(e),"angle must be a number"),f(typeof i=="function","drawFunction must be a function"),o||(n=Sn(n),t=t.scale(W),e-=$),r.save(),r.translate(n.x+.5,n.y+.5),r.rotate(e),r.scale(s?-t.x:t.x,-t.y),i(r),r.restore()}function ih(n,t,e=1,s=U,i=0,o=nt,r="center",a=ws,c="",l,u=0,h=wt){t=Sn(t),e*=W,i*=W,u-=$,u*=-1,Ke(n,t,e,s,i,o,r,a,c,l,u,h)}function Ke(n,t,e,s=U,i=0,o=nt,r="center",a=ws,c="",l,u=0,h=wt){f(J(n),"text must be a string"),f(L(t),"pos must be a vec2"),f(P(e),"size must be a number"),f(z(s),"color must be a color"),f(P(i),"lineWidth must be a number"),f(z(o),"lineColor must be a color"),f(["left","center","right"].includes(r),"align must be left, center, or right"),f(J(a),"font must be a string"),f(J(c),"fontStyle must be a string"),f(P(u),"angle must be a number");let p=(n+"").split(`
-`),d=t.y-(p.length-1)*e/2;h.save(),h.fillStyle=s.toString(),h.strokeStyle=o.toString(),h.lineWidth=i,h.textAlign=r,h.font=c+" "+e+"px "+a,h.textBaseline="middle",h.translate(t.x,d),h.rotate(-u);let y=0;p.forEach(b=>{i&&h.strokeText(b,0,y,l),h.fillText(b,0,y,l),y+=e}),h.restore()}async function va(n,t){f(P(n),"textureIndex must be a number"),f(!nn[n],"textureIndex is already loaded!"),f(!t||J(t),"image src must be a string");let e=new Image;t&&await new Promise(s=>{e.onerror=e.onload=s,e.crossOrigin="anonymous",e.src=t}),nn[n]=new Ne(e)}function _s(n){f(L(n),"screenPos must be a vec2");let t=(n.x-D.x/2+.5)/W,e=(n.y-D.y/2+.5)/-W;if($){let s=ot(-$),i=tt(-$),o=t*s-e*i,r=t*i+e*s;t=o,e=r}return new st(t+At.x,e+At.y)}function Sn(n){f(L(n),"worldPos must be a vec2");let t=n.x-At.x,e=n.y-At.y;if($){let s=ot($),i=tt($),o=t*s-e*i,r=t*i+e*s;t=o,e=r}return new st(t*W+D.x/2-.5,e*-W+D.y/2-.5)}function sc(n){f(L(n),"screenDelta must be a vec2");let t=n.x/W,e=n.y/-W;if($){let s=ot(-$),i=tt(-$),o=t*s-e*i,r=t*i+e*s;t=o,e=r}return new st(t,e)}function oh(n){f(L(n),"worldDelta must be a vec2");let t=n.x,e=n.y;if($){let s=ot($),i=tt($),o=t*s-e*i,r=t*i+e*s;t=o,e=r}return new st(t*W,e*-W)}function Rs(n,t,e=0){return f(L(n),"screenPos must be a vec2"),f(L(t),"screenSize must be a vec2"),f(P(e),"screenAngle must be a number"),[_s(n),t.scale(1/W),e+$]}function ic(){return D.scale(1/W)}function rh(n,t,e,s){f(L(n),"center must be a vec2"),f(L(t),"size must be a vec2");let i=p(e),o=p(s),r=t.x+i.left+i.right,a=t.y+i.top+i.bottom,c=D.x-o.left-o.right,l=D.y-o.top-o.bottom;if(!(r>0&&a>0&&c>0&&l>0))return W;W=K(c/r,l/a);let u=x(i.right-i.left,i.top-i.bottom).scale(.5),h=x(o.right-o.left,o.top-o.bottom).scale(.5/W);return At=n.add(u).add(h),W;function p(d){return(d===void 0||P(d))&&(d=x(d)),L(d)?{top:d.y,right:d.x,bottom:d.y,left:d.x}:{top:d.top||0,right:d.right||0,bottom:d.bottom||0,left:d.left||0}}}function ah(n,t=0){if(f(L(n),"pos must be a vec2"),f(L(t)||P(t),"size must be a vec2 or number"),!W)return!1;let e=n.x-At.x,s=n.y-At.y;if($){let r=ot($),a=tt($),c=e*r-s*a,l=e*a+s*r;e=c,s=l}e*=W*2,s*=-W*2,t instanceof st&&(t=t.length()),t*=W;let i=D.x,o=D.y;return e+t>-i&&e-t-o&&s-t{n.onerror=n.onload=a,n.crossOrigin="anonymous",n.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAAeAQMAAABnrVXaAAAABlBMVEUAAAD///+l2Z/dAAAAAXRSTlMAQObYZgAAAjpJREFUOMu9kzFu2zAUhn+CAROgqrk+B2l0BWYxMjlXeYaAtFtbdA1sGgHqRQfI0CNkSG5AwYB0BQ8d5Bsomwah6CPVeGg6tEPzAxLwyI+P78cP4u9lNO9OoMKnLMOobG5020/yaj/MrRcCGh1gBbyiLTPJEYaIiom5KM9Jq7KgynMGtb6L4GL4MF2H4LQKCXTvDVw2I4MsgZT7QLExdiutH+D08VOP3INXRrWX1/mmpbkNgAPYRVANb4xpcegYvhiNbIXauQICEjBuYLfMakaakWQeXxiZ0VDtuJCKs3ztMV59QtsHJNcRxDzfdL21ty3PrfIcXTN+E+GFAv6T5nbT9jd50/WFxb5ksdAv49qS6ouymG66ji08UMT6moykYLAo+V0j23GN4m829ZySAD5K7QsBfQTvOG8eE+gTeGYRAmnNAubN3hf5Zv9tJWDHp/VTuaSm7SN4fyINQqaNO3RMVxvpSPXnOChnRNvFcGY0gnwiPswYwTKVPE0zVtX3mTEIOoFzaqLrGuJaV+Uqumb71fVk/VoOH3cdLNQP/FHi8hV0CQNoqBZsUPlLPMsdCJro9QAaQQ0woDy9BJm0eTxCFnO9srcYlhNVlfR2EyTrph1uUtbUtAJifwRgrKuYdXVHeb0YI3QpawohQHkloI3J5FuVwI5ORxC9k2Tuz9Ir1IjgeIPGMHYkAZe2RuYkmWFmt3gGbTPOmBUWVTmRmHtGrfpzG/yuQNOKa6gBB/WA9khitPgl6/GP+gl2Af6tCbvaygAAAABJRU5ErkJggg=="});let t=x(),e=x(8),s=1,i=0,o=new Ne(n),r=new Ce(t,e,o,s,i);rc=new Zs(r)}function fh(n=!0){On=n}function ph(n){Sr=n}function gh(){return He==="mouse"}function yh(){return He==="keyboard"}function mh(){return He==="gamepad"}function wr(n,t=0,e=!0,s=!0,i=!0){H[t]&&(H[t][n]&=~((e?1:0)|(s?2:0)|(i?4:0)))}function Ps(){H.length=0,H[0]=[],ne.length=0,yn.length=0,Ls.length=0,me.length=0,rn.length=0}function Et(n,t=0){var e;return f(J(n),"key must be a number or string"),f(t>0||typeof n!="number"||n<3,"use code string for keyboard"),!!(((e=H[t])==null?void 0:e[n])&1)}function Ot(n,t=0){var e;return f(J(n),"key must be a number or string"),f(t>0||typeof n!="number"||n<3,"use code string for keyboard"),!!(((e=H[t])==null?void 0:e[n])&2)}function Tr(n,t=0){var e;return f(J(n),"key must be a number or string"),f(t>0||typeof n!="number"||n<3,"use code string for keyboard"),!!(((e=H[t])==null?void 0:e[n])&4)}function bh(n="ArrowUp",t="ArrowDown",e="ArrowLeft",s="ArrowRight"){f(J(n),"up key must be a string"),f(J(t),"down key must be a string"),f(J(e),"left key must be a string"),f(J(s),"right key must be a string");let i=o=>Et(o)?1:0;return x(i(s)-i(e),i(n)-i(t))}function ns(n){return f(P(n),"mouse button must be a number"),Et(n)}function cs(n){return f(P(n),"mouse button must be a number"),Ot(n)}function xh(n){return f(P(n),"mouse button must be a number"),Tr(n)}function Re(n,t=yt){return f(P(n),"button must be a number"),f(P(t),"gamepad must be a number"),Et(n,t+1)}function Ar(n,t=yt){return f(P(n),"button must be a number"),f(P(t),"gamepad must be a number"),Ot(n,t+1)}function vh(n,t=yt){return f(P(n),"button must be a number"),f(P(t),"gamepad must be a number"),Tr(n,t+1)}function ls(n,t=yt){var e,s;return f(P(n),"stick must be a number"),f(P(t),"gamepad must be a number"),(s=(e=me[t])==null?void 0:e[n])!=null?s:x()}function po(n=yt){var t;return f(P(n),"gamepad must be a number"),(t=rn[n])!=null?t:x()}function go(n=yt){return f(P(n),"gamepad must be a number"),!!H[n+1]}function ac(n=yt){var t,e;return f(P(n),"gamepad must be a number"),(e=(t=me[n])==null?void 0:t.length)!=null?e:0}function Sh(n=yt,t=200,e=1,s=1,i=0){var r,a,c;if(f(P(n),"gamepad must be a number"),!Cs||j)return;let o=(r=navigator==null?void 0:navigator.getGamepads)==null?void 0:r.call(navigator)[n];(c=(a=o==null?void 0:o.vibrationActuator)==null?void 0:a.playEffect)==null||c.call(a,"dual-rumble",{duration:t,strongMagnitude:e,weakMagnitude:s,startDelay:i})}function wh(n=yt){var e,s,i;if(f(P(n),"gamepad must be a number"),!Cs||j)return;let t=(e=navigator==null?void 0:navigator.getGamepads)==null?void 0:e.call(navigator)[n];(i=(s=t==null?void 0:t.vibrationActuator)==null?void 0:s.reset)==null||i.call(s)}function Cr(n=100){var t;f(P(n)||ce(n),"pattern must be a number or array"),Cs&&!j&&((t=navigator==null?void 0:navigator.vibrate)==null||t.call(navigator,n))}function Th(){Cr(0)}function Ah(){var n;!ee&&((n=G.requestPointerLock)==null||n.call(G))}function Ch(){var n;(n=document.exitPointerLock)==null||n.call(document)}function cc(){return document.pointerLockElement===G}function Eh(){if(j)return;document.addEventListener("keydown",n),document.addEventListener("keyup",t),document.addEventListener("mousedown",s),document.addEventListener("mouseup",i),document.addEventListener("mousemove",o),document.addEventListener("mouseleave",r),document.addEventListener("wheel",a,{passive:!1}),document.addEventListener("contextmenu",c),document.addEventListener("blur",l),ee&&cn&&u();function n(p){if(p.repeat||(H[0][p.code]=3,ts&&(H[0][e(p.code)]=3)),!On||!p.cancelable||!document.hasFocus()||p.ctrlKey||p.metaKey||p.altKey||b(p.target)||b(document.activeElement))return;let d=typeof p.key=="string"&&p.key.length===1;(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Space","Tab","Backspace"].includes(p.code)||d)&&p.preventDefault();function b(v){let S=v==null?void 0:v.tagName;return(v==null?void 0:v.isContentEditable)||["INPUT","TEXTAREA","SELECT"].includes(S)}}function t(p){H[0][p.code]=H[0][p.code]&2|4,ts&&(H[0][e(p.code)]=4)}function e(p){return ts?p==="KeyW"?"ArrowUp":p==="KeyS"?"ArrowDown":p==="KeyA"?"ArrowLeft":p==="KeyD"?"ArrowRight":p:p}function s(p){if(ee&&cn)return;Ut&&!j&&ft&&!hs()&&ft.resume(),H[0][p.button]=3;let d=jt;jt=h(x(p.x,p.y)),ye=ye.add(jt.subtract(d)),On&&p.cancelable&&document.hasFocus()&&p.preventDefault()}function i(p){ee&&cn||(H[0][p.button]=H[0][p.button]&2|4)}function o(p){ti=!0;let d=jt;jt=h(x(p.x,p.y));let y=cc()?x(p.movementX,p.movementY):jt.subtract(d);ye=ye.add(y)}function r(){ti=!1}function a(p){p.ctrlKey||(vr+=Zt(p.deltaY)),On&&p.cancelable&&document.hasFocus()&&p.preventDefault()}function c(p){p.preventDefault()}function l(){Ps(),Me.clear(),ne.length=0,yn.length=0,Ls.length=0}function u(){document.addEventListener("touchstart",y=>d(y),{passive:!1}),document.addEventListener("touchmove",y=>d(y),{passive:!1}),document.addEventListener("touchend",y=>d(y),{passive:!1});let p;function d(y){if(cn){if(Ut&&!j&&ft&&!hs()&&ft.resume(),!en||fr){let b=w=>us.includes(w.target)||w.target===an,v=[];for(let w of y.touches)b(w)||v.push(w);let S=v.length,_=0;if(S){let w=x(v[0].clientX,v[0].clientY),E=jt;jt=h(w),p?ye=ye.add(jt.subtract(E)):H[0][_]=3}else p&&(H[0][_]=H[0][_]&2|4);p=S}return On&&y.cancelable&&document.hasFocus()&&y.preventDefault(),!0}}}function h(p){let d=G.getBoundingClientRect(),y=Mt(p.x,d.left,d.right),b=Mt(p.y,d.top,d.bottom);return x(y*G.width,b*G.height)}}function wa(){if(j)return;!(cn&&ee)&&!document.hasFocus()&&Ps(),_e=_s(jt),xr=sc(ye),Rh(),t(),n();function n(){let e=ns(0)||ns(1)||ns(2)||ye.length()>Sr,s=!1;for(let o=ac();o--&&!s;)s=ls(o).lengthSquared()>.04;for(let o=17;o--&&!s;)s=Re(o);let i=!1;for(let o in H[0])if(isNaN(+o)&&H[0][o]&1){i=!0;break}s?He="gamepad":e?He="mouse":i&&(He="keyboard"),In=He==="gamepad"}function t(){var r,a,c,l,u,h,p;let e=d=>{let v=S=>S>.3?Mt(S,.3,.8):S<-.3?-Mt(-S,.3,.8):0;return x(v(d.x),v(-d.y)).clampLength()};if(en&&ee){if(f(!xn||!Vn,"set touchGamepadLeftStick or touchGamepadLeftButtonCount, not both"),f(!Wn||!Un,"set touchGamepadRightStick or touchGamepadButtonCount, not both"),!jn.isSet())return;yt=0;let d=(r=me[0])!=null?r:me[0]=[],y=(a=rn[0])!=null?a:rn[0]=x();d.length=0,y.set();for(let v=0;v<2;v++){if(!Be(v))continue;let S=Rr(v);d[S]=x();let _=(c=yn[v])!=null?c:x();if(As)d[S]=e(_);else if(_.lengthSquared()>.3){let w=F(Ws(_.x),-1,1),E=F(Ws(_.y),-1,1);d[S]=x(w,-E).clampLength(),S||y.set(w,-E)}}let b=(l=H[1])!=null?l:H[1]=[];for(let v=12;v--;){let S=Re(v,0);b[v]=ne[v]?S?1:3:S?4:0,Ys&&b[v]===3&&(v===9||Ph(v))&&Cr(Ys)}return}try{if(!Pi||!(navigator!=null&&navigator.getGamepads))return}catch{return}if(!It&&!document.hasFocus())return;let s=8,i=navigator.getGamepads(),o=K(s,i.length);for(let d=0;d>1]=e(x(y.axes[w],y.axes[w+1]));let _=!1;for(let w=y.buttons.length;w--;){let E=y.buttons[w],A=Re(w,d);b[w]=E.pressed?A?1:3:A?4:0,E.pressed&&(!E.value||E.value>.9)&&(_=!0)}_&&(io[d]=!0,io[yt]||(yt=d)),y.mapping==="standard"&&S.set((Re(15,d)&&1)-(Re(14,d)&&1),(Re(12,d)&&1)-(Re(13,d)&&1)),dr&&(S.x||S.y)&&(v[0]=S.clampLength())}en&&In&&jn.unset()}}function Ta(){if(!j){for(let n of H)for(let t in n)n[t]&=1;vr=0,xr=x(),ye=x()}}function _h(){Ih()}function Rh(){if(Ve||!en||!ee||j||!document.body)return;let n=Ve=document.createElement("div");n.style.cssText="position:fixed;inset:0;z-index:50;pointer-events:none;opacity:0;touch-action:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none;transition:opacity .2s;box-sizing:border-box;padding:env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left)";let t=lc=document.createElement("div");t.style.cssText="position:relative;width:100%;height:100%;pointer-events:none",n.appendChild(t);let e=Er=document.createElementNS(ni,"svg");e.style.cssText="position:absolute;inset:0;width:100%;height:100%;pointer-events:none;overflow:visible;fill:none;stroke:#fff;stroke-width:3",t.appendChild(e);let s=()=>{let i=document.createElement("div");return i.style.cssText="position:absolute;pointer-events:auto;touch-action:none",i.addEventListener("pointerdown",o=>Fh(o,i)),i.addEventListener("pointermove",o=>jh(o)),i.addEventListener("pointerup",o=>Aa(o)),i.addEventListener("pointercancel",o=>Aa(o)),t.appendChild(i),i};us[0]=s(),us[1]=s(),an=s(),addEventListener("resize",()=>Nn=!0),document.body.appendChild(n),Nn=!0}function Li(){return lc.getBoundingClientRect()}function Be(n){return n?Wn:xn}function wn(n){return n?Un:Vn}function _r(n){return n?0:4}function Rr(n){return n&&xn?1:0}function Bn(n){return Be(n)||wn(n)>0}function Ph(n){for(let t=0;t<2;t++){let e=_r(t);if(!Be(t)&&n>=e&&no.style.cssText="position:absolute;pointer-events:auto;touch-action:none;"+r;if(Se){for(let o of us)o.style.display="none";le?(i(an,"inset:0"),an.style.display=""):an.style.display="none"}else{for(let r=0;r<2;r++){let a=us[r],c=r?"right":"left";if(a.style.display=Bn(r)?"":"none",sn){let l=Bn(r?0:1)?"50%":"100%";i(a,`${c}:0;bottom:0;width:${l};height:60%`)}else i(a,`${c}:0;bottom:0;width:${3*s}px;height:${3*s}px`)}an.style.display=le?"":"none";let o=le;i(an,`left:50%;top:50%;width:${2*o}px;height:${2*o}px;transform:translate(-50%,-50%)`)}Oh(t,e),Nn=!1}function Oh(n,t){let e=Er;for(;e.firstChild;)e.removeChild(e.firstChild);let s=uc={face:[],thumb:[]},i=Jt,o=(a,c,l,u)=>{let h=document.createElementNS(ni,"circle");return h.setAttribute("cx",a),h.setAttribute("cy",c),h.setAttribute("r",l),u&&h.setAttribute("fill",u),e.appendChild(h),h},r=a=>{let c=i*.18,l=i*.5,u=a.x,h=a.y,p=document.createElementNS(ni,"path");p.setAttribute("d",`M ${u-c} ${h-l} H ${u+c} V ${h-c} H ${u+l} V ${h+c} H ${u+c} V ${h+l} H ${u-c} V ${h+c} H ${u-l} V ${h-c} H ${u-c} Z`),e.appendChild(p)};for(let a=0;a<2;a++){let c=wn(a),l=_r(a),u=Ge(a,n,t);if(Be(a))As?o(u.x,u.y,i/2):r(u),s.thumb[a]=o(u.x,u.y,i/4,"#fff");else if(c===1)s.face[l]=o(u.x,u.y,i/2,"#000");else for(let h=0;h2?p:K(p,c-1);d=d===3?2:d===2?3:d;let y=x().setDirection(p,i/2);c===2&&(y.x*=-1),a||(y.x*=-1);let b=u.add(y);s.face[l+d]=o(b.x,b.y,i/4,"#000")}}It&&dn&&Dh(n,t)}function Dh(n,t){let e=Jt,s=Er,i=(r,a,c)=>{let l=document.createElementNS(ni,r);for(let u in a)l.setAttribute(u,a[u]);l.setAttribute("stroke",c),l.setAttribute("stroke-width",2),l.setAttribute("fill","none"),s.appendChild(l)},o=(r,a,c)=>i("circle",{cx:r.x,cy:r.y,r:a},c);i("line",{x1:n/2,y1:0,x2:n/2,y2:t},"#0f0");for(let r=0;r<2;r++)if(Be(r))if(sn){let a=t*.4,c=!Bn(r?0:1),l=c?0:r?n/2:0;i("rect",{x:l,y:a,width:c?n:n/2,height:t-a},"#0ff")}else o(Ge(r,n,t),2*e,"#0ff");else wn(r)>=1&&o(Ge(r,n,t),e,"#0ff");if(le){o(x(n/2,t/2),le,"#ff0");for(let r=0;r<2;r++)Bn(r)&&o(Ge(r,n,t),2*e,"#f0f")}}function Ih(){var l;if(!Ve||j)return;if(!en||!ee){Ve.style.display!=="none"&&(Ve.style.display="none",Me.clear(),ne.length=0,yn.length=0,Ls.length=0);return}Ve.style.display="";let n=It&&dn,t=[Un,Vn,xn,Wn,As,Jt,sn,le,Se,n].join();t!==Sa&&(Sa=t,Nn=!0),Nn&&Lh();let e=es?Mt(jn.get(),es+1,es):1,s=n||jn.isSet()&&e>0&&!Se;if(Ve.style.opacity=s?n?1:e*pr:0,!s)return;let i=Li(),o=i.width,r=i.height,a=Jt,c=uc;if(c){for(let u=0;u<2;u++)if(Be(u)&&c.thumb[u]){let p=Ge(u,o,r).add(((l=yn[u])!=null?l:x()).scale(a/2));c.thumb[u].setAttribute("cx",p.x),c.thumb[u].setAttribute("cy",p.y)}for(let u=0;u=Jt)return-1;if(i===1)return o;let a=r.subtract(t);n||(a.x*=-1);let c=i===2?a.xo:a&&Ge(r,t,e).distance(n)<2*s)return{role:"stick",side:r}}else if(wn(r)>=1){let c=kh(r,n,t,e);if(c>=0)return{role:"face",btn:c}}}if(le){for(let r=0;r<2;r++)if(Bn(r)&&Ge(r,t,e).distance(n)<2*s)return;if(x(t/2,e/2).distance(n)h.getChannelData(v).set(b)),p.buffer=h,p.playbackRate.value=e,p.loop=i,r=r||ft.createGain(),r.gain.value=t,r.connect(Fe);let d=new StereoPannerNode(ft,{pan:F(s,-1,1)});p.connect(d).connect(r),p.addEventListener("ended",()=>{r.disconnect(),d.disconnect(),c&&c(p)});let y=a*e;return p.start(0,y),It&&Gn&&bt("sound","vol",t.toFixed(2),"rate",e.toFixed(2),"pan",s.toFixed(2),i?"loop":""),p}function Jh(...n){return Pr([Oi(...n)])}function Oi(n=1,t=.05,e=220,s=0,i=0,o=.1,r=0,a=1,c=0,l=0,u=0,h=0,p=0,d=0,y=0,b=0,v=0,S=1,_=0,w=0,E=0){let A=qn,T=q*2,R=c*=500*T/A/A,M=e*=(1+dt(t,-t))*T/A,ct=0,et=0,lt=0,gt=1,kt,Ee=[],Gt=0,ut=0,Rt=0,I,N=2,Y=T*Z(E)*2/A,ht=ot(Y),it=tt(Y)/2/N,Pt=1+it,he=-2*ht/Pt,An=(1-it)/Pt,Cn=(1+Zt(E)*ht)/2/Pt,En=-(Zt(E)+ht)/Pt,de=Cn,$t=0,Hn=0,Os=0,Ds=0;for(s=s*A||9,_*=A,i*=A,o*=A,v*=A,l*=500*T/A**3,y*=T/A,u*=T/A,h*=A,p=p*A|0,kt=s+_+i+o+v|0;ut1?r>2?r>3?r>4?Gt/T%14?Rt:Zt(Rt)*Z(Rt)**a)*(utut?0:(uth&&(e+=u,M+=u,gt=0),p&&!(++et%p)&&(e=M,c=R,gt||(gt=1));return Ee}function ii(n,t=!0){for(let e of Qe)if((!t||e.isSolid)&&n.arrayCheck(e.size)){let s=e.getCollisionData(n);if(s)return s}return 0}function We(n,t=x(),e,s=!0){for(let i of Qe)if((!s||i.isSolid)&&i.collisionTest(n,t,e))return i}function fc(n,t,e,s,i=!0){let o,r,a,c=s&&x();for(let l of Qe)if(!i||l.isSolid){let u=l.collisionRaycast(n,t,e,c);if(u){let h=n.distanceSquared(u);(o===void 0||h{k=!1,Q.style.display="none",e.preventDefault(),bt("WebGL context lost! Switching to Canvas2d rendering.");for(let s of ss)s.glTexture=void 0;Xt=void 0,Tt=0,mn=!1,un.forEach(s=>{var i;return(i=s.glContextLost)==null?void 0:i.call(s)})}),Q.addEventListener("webglcontextrestored",()=>{k=!0,Q.style.display="",bt("WebGL context restored, reinitializing..."),t();for(let e of ss)e.glTexture=Ii(e.image,e.wrap);un.forEach(e=>{var s;return(s=e.glContextRestored)==null?void 0:s.call(e)})});function t(){ai=Jn(`#version 300 es
+`,o+=s.toString(),$e(o,Ft,24,N(),.05,void 0,"center","monospace")}{e.save(),e.fillStyle="#fff",e.textAlign="left",e.textBaseline="top",e.font="20px monospace",e.shadowColor="#000",e.shadowBlur=9;let r=9,a=0,c=24;if(Re){e.fillText(`${Js} v${Us}`,r,a+=c/2),e.fillText("Time: "+sr(Ht),r,a+=c),e.fillText("FPS: "+Vs.toFixed(1)+(G?" WebGL":" Canvas2D"),r,a+=c),e.fillText("Objects: "+mt.length,r,a+=c),e.fillText("Draw Calls: "+we,r,a+=c),e.fillText("Primitives: "+Te,r,a+=c),e.fillText("---------",r,a+=c),e.fillStyle="#f00",e.fillText("ESC: Debug Overlay",r,a+=c),e.fillStyle=re?"#f00":"#fff",e.fillText("1: Debug Physics",r,a+=c),e.fillStyle=fn?"#f00":"#fff",e.fillText("2: Debug Particles",r,a+=c),e.fillStyle=pn?"#f00":"#fff",e.fillText("3: Debug Gamepads",r,a+=c),e.fillStyle=ae?"#f00":"#fff",e.fillText("4: Debug Raycasts",r,a+=c),e.fillStyle="#fff",e.fillText("5: Save Screenshot",r,a+=c),e.fillText("6: Toggle Video Capture",r,a+=c),e.fillStyle=kn?"#f00":"#fff",e.fillText("7: Debug Sound",r,a+=c);let l="",u="";for(let h in H[0])Ct(h,0)&&(parseInt(h)<3?u+=h+" ":l+=h+" ");u&&e.fillText("Mouse: "+u,r,a+=c),l&&e.fillText("Keys: "+l,r,a+=c);for(let h=1;hs.push(a.data),i.onstop=()=>{let a=new Blob(s,{type:"video/webm"}),c=URL.createObjectURL(a);rs(c,"capture.webm",1e3)};let o,r;if(Jt){r=new ConstantSourceNode(ht,{offset:0}),r.connect(Ge),r.start(),o=ht.createMediaStreamDestination(),Ge.connect(o);for(let a of o.stream.getAudioTracks())n.addTrack(a)}try{i.start()}catch{yt("Video capture not supported in this browser!"),r==null||r.stop();return}yt("Video capture started."),Pe={mediaRecorder:i,captureTimer:e,videoTrack:t,silentAudioSource:r,audioStreamDestination:o}}function Ga(){var n,t,e;f(xe(),"Not capturing video!"),yt(`Video capture ended. ${Pe.captureTimer.get().toFixed(2)} seconds recorded.`),oe.style.display="none",(n=Pe.silentAudioSource)==null||n.stop(),(t=Pe.mediaRecorder)==null||t.stop(),(e=Pe.videoTrack)==null||e.stop(),Pe=void 0}function Bl(){f(xe(),"Not capturing video!"),br(),Pe.videoTrack.requestFrame(),oe.textContent="\u25CF REC "+sr(Pe.captureTimer)}function Yt(n){if(It){let t=Object.keys(n),e={};t.forEach(s=>e[s]=n[s]),t.forEach(s=>{Object.defineProperty(n,s,{get:()=>e[s],set:i=>{f(!1,`Cannot modify engine constant. Attempted to set constant (${n}) property '${s}' to '${i}'.`)},enumerable:!0})})}return Object.freeze(n)}function Qt(n,t=1){return(n%t+t)%t}function j(n,t=0,e=1){return ne?e:n}function Mt(n,t,e){return(e-=t)?j((n-t)/e):0}function Nt(n,t,e){return n+j(e)*(t-n)}function Nl(n,t,e,s,i){return Nt(s,i,Mt(n,t,e))}function tr(n,t,e=1){f(e>0,"distanceWrap wrapSize must be > 0");let s=(n-t)%e;return s*2%e-s}function Na(n,t,e,s=1){return n+j(e)*tr(t,n,s)}function zl(n,t){return tr(n,t,2*q)}function Jl(n,t,e){return Na(n,t,e,2*q)}function qs(n){return n*n*(3-2*n)}function os(n){return!(n&n-1)}function Ul(n){return 2**is(ja(n))}function Hs(n,t,e,s=b()){let i=(n.x-e.x)*2,o=(n.y-e.y)*2,r=t.x+s.x,a=t.y+s.y;return Z(i)p)return!1;h=X(y,h)}else{if(y0?a.x+1:a.x,x=h>0?a.y+1:a.y,v=c?(y-n.x)/c:1/0,T=l?(x-n.y)/l:1/0,C=0,w=v,_=T,A=pa.x&&(S.x=a.x+1-R),M.ya.y&&(S.y=a.y+1-R),s&&(A?s.set(-u,0):s.set(0,-h)),S}(A=w<_)?(a.x+=u,C=w,w+=p):(a.y+=h,C=_,_+=d)}}function ut(n=1,t=0){return t+Math.random()*(n-t)}function er(n,t=0){return bt(ut(n,t))}function Va(n=.5){return ut()URL.revokeObjectURL(n),e)}function $l(n,t,e){var s;f(J(n),"shareURL requires title string"),f(J(t),"shareURL requires url string"),(s=navigator.share)==null||s.call(navigator,{title:n,url:t}).then(()=>e==null?void 0:e())}function Kl(n,t){f(J(n),"loadData requires saveName string");let e={};try{let s=localStorage[n];if(s)try{e=JSON.parse(s)}catch{yt("readSaveData: corrupt JSON for",n,"\u2014 using defaults")}}catch{yt("readSaveData: localStorage unavailable \u2014 using defaults")}return{...t,...e}}function Ql(n,t){f(J(n),"saveData requires saveName string");try{localStorage[n]=JSON.stringify(t)}catch{yt("writeSaveData: failed to write",n)}}function ho(n){let t=(n|0)^2654435769;return t=Math.imul(t^t>>>16,2246822507),t=Math.imul(t^t>>>13,3266489909),t^=t>>>16,(t>>>0)/2**32}function Zl(n){let t=bt(n);return Nt(ho(t),ho(t+1),qs(n-t))}function tu(n,t){let e=bt(n),s=bt(t),i=qs(n-e),o=qs(t-s),r=(a,c)=>ho(a+c*374761393);return Nt(Nt(r(e,s),r(e+1,s),i),Nt(r(e,s+1),r(e+1,s+1),i),o)}function eu(n){Tt=n.copy()}function nu(n){Y=n}function su(n){W=n}function iu(n){ir=n}function ou(n){Ai=n}function ru(n){Xe=n.copy()}function au(n){Cn=n.copy()}function cu(n){Zn=n}function lu(n){Rn=n}function uu(n){Pn=n.copy()}function Za(n){or=n,F&&(F.style.imageRendering=n?"pixelated":""),Q&&(Q.style.imageRendering=n?"pixelated":"")}function hu(n){mn=n}function du(n){Ye=n}function fu(n){ws=n}function pu(n){rr=n}function gu(n){B=n}function yu(n){if(n&&!vo){console.warn("Can not enable WebGL if it was disabled on start.");return}G=n,Q&&(Q.style.display=n?"":"none")}function mu(n){Ts=n}function bu(n){Ei=n.copy()}function xu(n){_i=n}function vu(n){Ci=n}function Su(n){Ri=n}function wu(n){ar=n}function Tu(n){cr=n}function Au(n){lr=n}function Eu(n){ur=n}function _u(n){hr=n}function Cu(n){Oe=n}function Ru(n){Bt=n.copy()}function Pu(n){Xs=n}function Lu(n){Pi=n}function Ou(n){dr=n}function Du(n){ts=n}function Iu(n){un=n}function Mu(n){tn=n}function ku(n){fr=n}function Gu(n){le=n}function Fu(n){Jn=n,n>0&&(Vn=!1)}function ju(n){Sn=n,n&&(Un=0)}function Bu(n){Un=n,n>0&&(Sn=!1)}function Nu(n){Vn=n,n&&(Jn=0)}function zu(n){As=n}function Ju(n){nn=n}function Uu(n){zt=n}function Vu(n){pr=n}function Wu(n){es=n}function qu(n){Ys=n}function Hu(n){Es=n}function Xu(n){Jt=n}function Yu(n){gn=n,Jt&&!B&&Ge&&(Ge.gain.value=n)}function $u(n){gr=n}function Ku(n){yr=n}function Qu(n){Ti=n}function Zu(n){Ia=n}function $s(n){return n.r>=1&&n.g>=1&&n.b>=1}function mr(n){return n.r<=0&&n.g<=0&&n.b<=0&&n.a<=0}function _s(n=0,t=Ei,e=0,s=_i,i=Ci){if(f(L(n)||typeof n=="number","index must be a vec2 or number"),f(L(t)||typeof t=="number","size must be a vec2 or number"),f(P(e)||e instanceof je,"texture must be a number or TextureInfo"),f(P(s),"padding must be a number"),B)return new Ae;typeof t=="number"&&(f(t>0),t=new it(t,t));let o=typeof e=="number"?en[e]:e;f(o instanceof je,"tile texture is not loaded"),f(o.size.x>0,"tile texture is not loaded");let r=t.x+s*2,a=t.y+s*2,c,l;if(typeof n=="number"){let h=o.size.x/r|0;c=n%h,l=n/h|0}else c=n.x,l=n.y;let u=new it(c*r+s,l*a+s);return new Ae(u,t,o,s,i)}function Rt(n,t=b(1),e,s=U,i=0,o,r,a=G,c=!1,l){var p;f(L(n),"pos must be a vec2"),f(L(t),"size must be a vec2"),f(z(s),"color is invalid"),f(P(i),"angle must be a number"),f(!r||z(r),"additiveColor must be a color"),f(!l||!a,"context only supported in canvas 2D mode");let u=e==null?void 0:e.textureInfo,h=(p=e==null?void 0:e.bleed)!=null?p:0;if(a&&G)if(f(!!g,"WebGL is not enabled!"),c&&([n,t,i]=Rs(n,t,i)),u){let d=u.sizeInverse,y=e.pos.x*d.x,x=e.pos.y*d.y,v=e.size.x*d.x,T=e.size.y*d.y;if(Ir(u.glTexture),h){let C=d.x*h,w=d.y*h;ms(n.x,n.y,o?-t.x:t.x,t.y,i,y+C,x+w,y-C+v,x-w+T,s.rgbaInt(),r&&r.rgbaInt())}else ms(n.x,n.y,o?-t.x:t.x,t.y,i,y,x,y+v,x+T,s.rgbaInt(),r&&r.rgbaInt())}else{let d=r?s.add(r):s;vc(n.x,n.y,t.x,t.y,i,d.rgbaInt())}else++we,++Te,wn(n,t,i,o,d=>{if(u){d.scale(1,-1);let y=e.pos.x,x=e.pos.y,v=e.size.x,T=e.size.y;lh(d,u.image,y,x,v,T,-.5,-.5,1,1,s,r,h)}else{let y=r?s.add(r):s;d.fillStyle=y.toString(),d.fillRect(-.5,-.5,1,1)}},c,l)}function Ks(n,t,e,s,i,o,r){Rt(n,t,void 0,e,s,!1,void 0,i,o,r)}function th(n,t,e=U,s=Ze,i=0,o=G,r=!1,a){if(f(L(n),"pos must be a vec2"),f(L(t),"size must be a vec2"),f(z(e)&&z(s),"color is invalid"),f(P(i),"angle must be a number"),f(!a||!o,"context only supported in canvas 2D mode"),o&&G){f(!!g,"WebGL is not enabled!"),r&&(n=Cs(n),t=t.scale(1/W),i+=Y);let c=[],l=[],u=t.x/2,h=t.y/2,p=e.rgbaInt(),d=s.rgbaInt(),y=at(-i),x=tt(-i);for(let v=4;v--;){let T=v&1?u:-u,C=v&2?h:-h,w=T*y-C*x,_=T*x+C*y,A=v&2?p:d;c.push(b(n.x+w,n.y+_)),l.push(A)}jr(c,l)}else++we,++Te,wn(n,t,i,!1,c=>{let l=c.createLinearGradient(0,.5,0,-.5);l.addColorStop(0,e.toString()),l.addColorStop(1,s.toString()),c.fillStyle=l,c.fillRect(-.5,-.5,1,1)},r,a)}function eh(n,t,e,s=0,i=U,o=0,r,a=G,c=!1,l){if(f(L(n),"pos must be a vec2"),f(L(t),"size must be a vec2"),f(L(e),"wrapCount must be a vec2"),f(z(i),"color is invalid"),f(P(o),"angle must be a number"),f(!r||z(r),"additiveColor must be a color"),f(!l||!a,"context only supported in canvas 2D mode"),f(!(s instanceof Ae),"pass a TextureInfo or texture index, not a TileInfo \u2014 use tileInfo.textureInfo"),B)return;let u=typeof s=="number"?en[s]:s;if(f(u instanceof je,"texture not loaded"),f(u.size.x>0,"texture not loaded"),f(u.wrap,"drawTextureWrapped requires a wrap-enabled texture; call textureInfo.setWrap(true) first"),a&&G){f(!!g,"WebGL is not enabled!"),c&&([n,t,o]=Rs(n,t,o)),Ir(u.glTexture),ms(n.x,n.y,t.x,t.y,o,0,0,e.x,e.y,i.rgbaInt(),r&&r.rgbaInt());return}++we,++Te,c||(n=Tn(n),t=t.scale(W),o-=Y);let h=!Ai||(r?$s(i.add(r))&&r.a<=0:$s(i)),p=!h&&r&&!mr(r),d=h?u.image:ch(u.image,i,r);l=l||St,l.save(),l.translate(n.x+.5,n.y+.5),l.rotate(o),l.globalAlpha=p?1:i.a;let y=l.createPattern(d,"repeat"),x=new DOMMatrix().translate(-t.x/2,-t.y/2).scale(t.x/(e.x*d.width),t.y/(e.y*d.height));y.setTransform(x),l.fillStyle=y,l.fillRect(-t.x/2,-t.y/2,t.x,t.y),l.globalAlpha=1,l.restore()}function fo(n,t=.1,e=U,s=!1,i=b(),o=0,r=G,a=!1,c){if(f(ce(n),"points must be an array"),f(P(t),"width must be a number"),f(z(e),"color is invalid"),f(L(i),"pos must be a vec2"),f(P(o),"angle must be a number"),f(!c||!r,"context only supported in canvas 2D mode"),r&&G){f(!!g,"WebGL is not enabled!");let l=b(1);a&&([i,l,o]=Rs(i,l,o)),Fr(n,e.rgbaInt(),t,i.x,i.y,l.x,l.y,o,s)}else++we,++Te,wn(i,b(1),o,!1,l=>{l.strokeStyle=e.toString(),l.lineWidth=t,l.beginPath();for(let u=0;u0&&Fr(n,s.rgbaInt(),e,i.x,i.y,l.x,l.y,o)}else wn(i,b(1),o,!1,l=>{l.fillStyle=t.toString(),l.beginPath();for(let u of n)l.lineTo(u.x,u.y);l.closePath(),l.fill(),e&&(l.strokeStyle=s.toString(),l.lineWidth=e,l.stroke())},a,c)}function ec(n,t=b(1),e=U,s=0,i=0,o=et,r=G,a=!1,c){f(L(n),"pos must be a vec2"),f(L(t),"size must be a vec2"),f(z(e)&&z(o),"color is invalid"),f(P(s),"angle must be a number"),f(P(i),"lineWidth must be a number"),f(i>=0,"lineWidth must be a positive value or 0"),f(!c||!r,"context only supported in canvas 2D mode"),i=j(i,0,K(t.x,t.y)),r&&G?tc(n,t,Ts,e,i,o,s,r,a,c):wn(n,b(1),s,!1,l=>{l.fillStyle=e.toString(),l.beginPath(),l.ellipse(0,0,t.x/2,t.y/2,0,0,9),l.fill(),i&&(l.strokeStyle=o.toString(),l.lineWidth=i,l.stroke())},a,c)}function Qs(n,t=1,e=U,s=0,i=et,o=G,r=!1,a){f(P(t),"size must be a number"),ec(n,b(t),e,0,s,i,o,r,a)}function nc(n,t=b(1),e=U,s=Ze,i=0,o=G,r=!1,a){if(f(L(n),"pos must be a vec2"),f(L(t),"size must be a vec2"),f(z(e)&&z(s),"color is invalid"),f(P(i),"angle must be a number"),f(!a||!o,"context only supported in canvas 2D mode"),!B)if(o&&G){f(!!g,"WebGL is not enabled!"),r&&(n=Cs(n),t=t.scale(1/W),i+=Y);let c=Ts,l=t.x/2,u=t.y/2,h=e.rgbaInt(),p=s.rgbaInt(),d=nh++,y=at(-i),x=tt(-i),v=_=>{let A=tt(_)*l,S=at(_)*u;return b(n.x+A*y-S*x,n.y+A*x+S*y)},T=d%c/c*q*2,C=[v(T)],w=[p];for(let _=c;_--;){let A=(_+d)%c/c*q*2;C.push(n),w.push(h),C.push(v(A)),w.push(p)}jr(C,w)}else++we,++Te,wn(n,t,i,!1,c=>{let l=c.createRadialGradient(0,0,0,0,0,.5);l.addColorStop(0,e.toString()),l.addColorStop(1,s.toString()),c.fillStyle=l,c.beginPath(),c.ellipse(0,0,.5,.5,0,0,9),c.fill()},r,a)}function sh(n,t=1,e=U,s=Ze,i=G,o=!1,r){f(P(t),"size must be a number"),nc(n,b(t),e,s,0,i,o,r)}function wn(n,t,e=0,s=!1,i,o=!1,r=St){f(L(n),"pos must be a vec2"),f(L(t),"size must be a vec2"),f(P(e),"angle must be a number"),f(typeof i=="function","drawFunction must be a function"),o||(n=Tn(n),t=t.scale(W),e-=Y),r.save(),r.translate(n.x+.5,n.y+.5),r.rotate(e),r.scale(s?-t.x:t.x,-t.y),i(r),r.restore()}function ih(n,t,e=1,s=U,i=0,o=et,r="center",a=ws,c="",l,u=0,h=St){t=Tn(t),e*=W,i*=W,u-=Y,u*=-1,$e(n,t,e,s,i,o,r,a,c,l,u,h)}function $e(n,t,e,s=U,i=0,o=et,r="center",a=ws,c="",l,u=0,h=St){f(J(n),"text must be a string"),f(L(t),"pos must be a vec2"),f(P(e),"size must be a number"),f(z(s),"color must be a color"),f(P(i),"lineWidth must be a number"),f(z(o),"lineColor must be a color"),f(["left","center","right"].includes(r),"align must be left, center, or right"),f(J(a),"font must be a string"),f(J(c),"fontStyle must be a string"),f(P(u),"angle must be a number");let p=(n+"").split(`
+`),d=t.y-(p.length-1)*e/2;h.save(),h.fillStyle=s.toString(),h.strokeStyle=o.toString(),h.lineWidth=i,h.textAlign=r,h.font=c+" "+e+"px "+a,h.textBaseline="middle",h.translate(t.x,d),h.rotate(-u);let y=0;p.forEach(x=>{i&&h.strokeText(x,0,y,l),h.fillText(x,0,y,l),y+=e}),h.restore()}async function va(n,t){f(P(n),"textureIndex must be a number"),f(!en[n],"textureIndex is already loaded!"),f(!t||J(t),"image src must be a string");let e=new Image;t&&await new Promise(s=>{e.onerror=e.onload=s,e.crossOrigin="anonymous",e.src=t}),en[n]=new je(e)}function Cs(n){f(L(n),"screenPos must be a vec2");let t=(n.x-I.x/2+.5)/W,e=(n.y-I.y/2+.5)/-W;if(Y){let s=at(-Y),i=tt(-Y),o=t*s-e*i,r=t*i+e*s;t=o,e=r}return new it(t+Tt.x,e+Tt.y)}function Tn(n){f(L(n),"worldPos must be a vec2");let t=n.x-Tt.x,e=n.y-Tt.y;if(Y){let s=at(Y),i=tt(Y),o=t*s-e*i,r=t*i+e*s;t=o,e=r}return new it(t*W+I.x/2-.5,e*-W+I.y/2-.5)}function sc(n){f(L(n),"screenDelta must be a vec2");let t=n.x/W,e=n.y/-W;if(Y){let s=at(-Y),i=tt(-Y),o=t*s-e*i,r=t*i+e*s;t=o,e=r}return new it(t,e)}function oh(n){f(L(n),"worldDelta must be a vec2");let t=n.x,e=n.y;if(Y){let s=at(Y),i=tt(Y),o=t*s-e*i,r=t*i+e*s;t=o,e=r}return new it(t*W,e*-W)}function Rs(n,t,e=0){return f(L(n),"screenPos must be a vec2"),f(L(t),"screenSize must be a vec2"),f(P(e),"screenAngle must be a number"),[Cs(n),t.scale(1/W),e+Y]}function ic(){return I.scale(1/W)}function rh(n,t,e,s){f(L(n),"center must be a vec2"),f(L(t),"size must be a vec2");let i=p(e),o=p(s),r=t.x+i.left+i.right,a=t.y+i.top+i.bottom,c=I.x-o.left-o.right,l=I.y-o.top-o.bottom;if(!(r>0&&a>0&&c>0&&l>0))return W;W=K(c/r,l/a);let u=b(i.right-i.left,i.top-i.bottom).scale(.5),h=b(o.right-o.left,o.top-o.bottom).scale(.5/W);return Tt=n.add(u).add(h),W;function p(d){return(d===void 0||P(d))&&(d=b(d)),L(d)?{top:d.y,right:d.x,bottom:d.y,left:d.x}:{top:d.top||0,right:d.right||0,bottom:d.bottom||0,left:d.left||0}}}function ah(n,t=0){if(f(L(n),"pos must be a vec2"),f(L(t)||P(t),"size must be a vec2 or number"),!W)return!1;let e=n.x-Tt.x,s=n.y-Tt.y;if(Y){let r=at(Y),a=tt(Y),c=e*r-s*a,l=e*a+s*r;e=c,s=l}e*=W*2,s*=-W*2,t instanceof it&&(t=t.length()),t*=W;let i=I.x,o=I.y;return e+t>-i&&e-t-o&&s-t{n.onerror=n.onload=a,n.crossOrigin="anonymous",n.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAAeAQMAAABnrVXaAAAABlBMVEUAAAD///+l2Z/dAAAAAXRSTlMAQObYZgAAAjpJREFUOMu9kzFu2zAUhn+CAROgqrk+B2l0BWYxMjlXeYaAtFtbdA1sGgHqRQfI0CNkSG5AwYB0BQ8d5Bsomwah6CPVeGg6tEPzAxLwyI+P78cP4u9lNO9OoMKnLMOobG5020/yaj/MrRcCGh1gBbyiLTPJEYaIiom5KM9Jq7KgynMGtb6L4GL4MF2H4LQKCXTvDVw2I4MsgZT7QLExdiutH+D08VOP3INXRrWX1/mmpbkNgAPYRVANb4xpcegYvhiNbIXauQICEjBuYLfMakaakWQeXxiZ0VDtuJCKs3ztMV59QtsHJNcRxDzfdL21ty3PrfIcXTN+E+GFAv6T5nbT9jd50/WFxb5ksdAv49qS6ouymG66ji08UMT6moykYLAo+V0j23GN4m829ZySAD5K7QsBfQTvOG8eE+gTeGYRAmnNAubN3hf5Zv9tJWDHp/VTuaSm7SN4fyINQqaNO3RMVxvpSPXnOChnRNvFcGY0gnwiPswYwTKVPE0zVtX3mTEIOoFzaqLrGuJaV+Uqumb71fVk/VoOH3cdLNQP/FHi8hV0CQNoqBZsUPlLPMsdCJro9QAaQQ0woDy9BJm0eTxCFnO9srcYlhNVlfR2EyTrph1uUtbUtAJifwRgrKuYdXVHeb0YI3QpawohQHkloI3J5FuVwI5ORxC9k2Tuz9Ir1IjgeIPGMHYkAZe2RuYkmWFmt3gGbTPOmBUWVTmRmHtGrfpzG/yuQNOKa6gBB/WA9khitPgl6/GP+gl2Af6tCbvaygAAAABJRU5ErkJggg=="});let t=b(),e=b(8),s=1,i=0,o=new je(n),r=new Ae(t,e,o,s,i);rc=new Zs(r)}function fh(n=!0){Ln=n}function ph(n){Sr=n}function gh(){return qe==="mouse"}function yh(){return qe==="keyboard"}function mh(){return qe==="gamepad"}function wr(n,t=0,e=!0,s=!0,i=!0){H[t]&&(H[t][n]&=~((e?1:0)|(s?2:0)|(i?4:0)))}function Ps(){H.length=0,H[0]=[],te.length=0,bn.length=0,Ls.length=0,ye.length=0,cn.length=0}function Ct(n,t=0){var e;return f(J(n),"key must be a number or string"),f(t>0||typeof n!="number"||n<3,"use code string for keyboard"),!!(((e=H[t])==null?void 0:e[n])&1)}function Ot(n,t=0){var e;return f(J(n),"key must be a number or string"),f(t>0||typeof n!="number"||n<3,"use code string for keyboard"),!!(((e=H[t])==null?void 0:e[n])&2)}function Tr(n,t=0){var e;return f(J(n),"key must be a number or string"),f(t>0||typeof n!="number"||n<3,"use code string for keyboard"),!!(((e=H[t])==null?void 0:e[n])&4)}function bh(n="ArrowUp",t="ArrowDown",e="ArrowLeft",s="ArrowRight"){f(J(n),"up key must be a string"),f(J(t),"down key must be a string"),f(J(e),"left key must be a string"),f(J(s),"right key must be a string");let i=o=>Ct(o)?1:0;return b(i(s)-i(e),i(n)-i(t))}function ns(n){return f(P(n),"mouse button must be a number"),Ct(n)}function cs(n){return f(P(n),"mouse button must be a number"),Ot(n)}function xh(n){return f(P(n),"mouse button must be a number"),Tr(n)}function Ce(n,t=ft){return f(P(n),"button must be a number"),f(P(t),"gamepad must be a number"),Ct(n,t+1)}function Ar(n,t=ft){return f(P(n),"button must be a number"),f(P(t),"gamepad must be a number"),Ot(n,t+1)}function vh(n,t=ft){return f(P(n),"button must be a number"),f(P(t),"gamepad must be a number"),Tr(n,t+1)}function ls(n,t=ft){var e,s;return f(P(n),"stick must be a number"),f(P(t),"gamepad must be a number"),(s=(e=ye[t])==null?void 0:e[n])!=null?s:b()}function po(n=ft){var t;return f(P(n),"gamepad must be a number"),(t=cn[n])!=null?t:b()}function go(n=ft){return f(P(n),"gamepad must be a number"),!!H[n+1]}function ac(n=ft){var t,e;return f(P(n),"gamepad must be a number"),(e=(t=ye[n])==null?void 0:t.length)!=null?e:0}function Sh(n=ft,t=200,e=1,s=1,i=0){var r,a,c;if(f(P(n),"gamepad must be a number"),!Es||B)return;let o=(r=navigator==null?void 0:navigator.getGamepads)==null?void 0:r.call(navigator)[n];(c=(a=o==null?void 0:o.vibrationActuator)==null?void 0:a.playEffect)==null||c.call(a,"dual-rumble",{duration:t,strongMagnitude:e,weakMagnitude:s,startDelay:i})}function wh(n=ft){var e,s,i;if(f(P(n),"gamepad must be a number"),!Es||B)return;let t=(e=navigator==null?void 0:navigator.getGamepads)==null?void 0:e.call(navigator)[n];(i=(s=t==null?void 0:t.vibrationActuator)==null?void 0:s.reset)==null||i.call(s)}function Er(n=100){var t;f(P(n)||ce(n),"pattern must be a number or array"),Es&&!B&&((t=navigator==null?void 0:navigator.vibrate)==null||t.call(navigator,n))}function Th(){Er(0)}function Ah(){var n;!Zt&&((n=F.requestPointerLock)==null||n.call(F))}function Eh(){var n;(n=document.exitPointerLock)==null||n.call(document)}function cc(){return document.pointerLockElement===F}function _h(){if(B)return;document.addEventListener("keydown",n),document.addEventListener("keyup",t),document.addEventListener("mousedown",s),document.addEventListener("mouseup",i),document.addEventListener("mousemove",o),document.addEventListener("mouseleave",r),document.addEventListener("wheel",a,{passive:!1}),document.addEventListener("contextmenu",c),document.addEventListener("blur",l),Zt&&un&&u();function n(p){if(p.repeat||(H[0][p.code]=3,ts&&(H[0][e(p.code)]=3)),!Ln||!p.cancelable||!document.hasFocus()||p.ctrlKey||p.metaKey||p.altKey||x(p.target)||x(document.activeElement))return;let d=typeof p.key=="string"&&p.key.length===1;(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Space","Tab","Backspace"].includes(p.code)||d)&&p.preventDefault();function x(v){let T=v==null?void 0:v.tagName;return(v==null?void 0:v.isContentEditable)||["INPUT","TEXTAREA","SELECT"].includes(T)}}function t(p){H[0][p.code]=H[0][p.code]&2|4,ts&&(H[0][e(p.code)]=4)}function e(p){return ts?p==="KeyW"?"ArrowUp":p==="KeyS"?"ArrowDown":p==="KeyA"?"ArrowLeft":p==="KeyD"?"ArrowRight":p:p}function s(p){if(Zt&&un)return;Jt&&!B&&ht&&!hs()&&ht.resume(),H[0][p.button]=3;let d=Ft;Ft=h(b(p.x,p.y)),ge=ge.add(Ft.subtract(d)),Ln&&p.cancelable&&document.hasFocus()&&p.preventDefault()}function i(p){Zt&&un||(H[0][p.button]=H[0][p.button]&2|4)}function o(p){ti=!0;let d=Ft;Ft=h(b(p.x,p.y));let y=cc()?b(p.movementX,p.movementY):Ft.subtract(d);ge=ge.add(y)}function r(){ti=!1}function a(p){p.ctrlKey||(vr+=Kt(p.deltaY)),Ln&&p.cancelable&&document.hasFocus()&&p.preventDefault()}function c(p){p.preventDefault()}function l(){Ps(),Ie.clear(),te.length=0,bn.length=0,Ls.length=0}function u(){document.addEventListener("touchstart",y=>d(y),{passive:!1}),document.addEventListener("touchmove",y=>d(y),{passive:!1}),document.addEventListener("touchend",y=>d(y),{passive:!1});let p;function d(y){if(un){if(Jt&&!B&&ht&&!hs()&&ht.resume(),!tn||fr){let x=w=>us.includes(w.target)||w.target===ln,v=[];for(let w of y.touches)x(w)||v.push(w);let T=v.length,C=0;if(T){let w=b(v[0].clientX,v[0].clientY),_=Ft;Ft=h(w),p?ge=ge.add(Ft.subtract(_)):H[0][C]=3}else p&&(H[0][C]=H[0][C]&2|4);p=T}return Ln&&y.cancelable&&document.hasFocus()&&y.preventDefault(),!0}}}function h(p){let d=F.getBoundingClientRect(),y=Mt(p.x,d.left,d.right),x=Mt(p.y,d.top,d.bottom);return b(y*F.width,x*F.height)}}function wa(){if(B)return;!(un&&Zt)&&!document.hasFocus()&&Ps(),_e=Cs(Ft),xr=sc(ge),Rh(),t(),n();function n(){let e=ns(0)||ns(1)||ns(2)||ge.length()>Sr,s=!1;for(let o=ac();o--&&!s;)s=ls(o).lengthSquared()>.04;for(let o=17;o--&&!s;)s=Ce(o);let i=!1;for(let o in H[0])if(isNaN(+o)&&H[0][o]&1){i=!0;break}s?qe="gamepad":e?qe="mouse":i&&(qe="keyboard"),Dn=qe==="gamepad"}function t(){var r,a,c,l,u,h,p;let e=d=>{let v=T=>T>.3?Mt(T,.3,.8):T<-.3?-Mt(-T,.3,.8):0;return b(v(d.x),v(-d.y)).clampLength()};if(tn&&Zt){if(f(!Sn||!Un,"set touchGamepadLeftStick or touchGamepadLeftButtonCount, not both"),f(!Vn||!Jn,"set touchGamepadRightStick or touchGamepadButtonCount, not both"),!Fn.isSet())return;ft=0;let d=(r=ye[0])!=null?r:ye[0]=[],y=(a=cn[0])!=null?a:cn[0]=b();d.length=0,y.set();for(let v=0;v<2;v++){if(!Be(v))continue;let T=Rr(v);d[T]=b();let C=(c=bn[v])!=null?c:b();if(As)d[T]=e(C);else if(C.lengthSquared()>.3){let w=j(Ws(C.x),-1,1),_=j(Ws(C.y),-1,1);d[T]=b(w,-_).clampLength(),T||y.set(w,-_)}}let x=(l=H[1])!=null?l:H[1]=[];for(let v=12;v--;){let T=Ce(v,0);x[v]=te[v]?T?1:3:T?4:0,Ys&&x[v]===3&&(v===9||Ph(v))&&Er(Ys)}return}try{if(!Pi||!(navigator!=null&&navigator.getGamepads))return}catch{return}if(!It&&!document.hasFocus())return;let s=8,i=navigator.getGamepads(),o=K(s,i.length);for(let d=0;d>1]=e(b(y.axes[w],y.axes[w+1]));let C=!1;for(let w=y.buttons.length;w--;){let _=y.buttons[w],A=Ce(w,d);x[w]=_.pressed?A?1:3:A?4:0,_.pressed&&(!_.value||_.value>.9)&&(C=!0)}C&&(io[d]=!0,io[ft]||(ft=d)),y.mapping==="standard"&&T.set((Ce(15,d)&&1)-(Ce(14,d)&&1),(Ce(12,d)&&1)-(Ce(13,d)&&1)),dr&&(T.x||T.y)&&(v[0]=T.clampLength())}tn&&Dn&&Fn.unset()}}function Ta(){if(!B){for(let n of H)for(let t in n)n[t]&=1;vr=0,xr=b(),ge=b()}}function Ch(){Ih()}function Rh(){if(Ue||!tn||!Zt||B||!document.body)return;let n=Ue=document.createElement("div");n.style.cssText="position:fixed;inset:0;z-index:50;pointer-events:none;opacity:0;touch-action:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none;transition:opacity .2s;box-sizing:border-box;padding:env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left)";let t=lc=document.createElement("div");t.style.cssText="position:relative;width:100%;height:100%;pointer-events:none",n.appendChild(t);let e=_r=document.createElementNS(ni,"svg");e.style.cssText="position:absolute;inset:0;width:100%;height:100%;pointer-events:none;overflow:visible;fill:none;stroke:#fff;stroke-width:3",t.appendChild(e);let s=()=>{let i=document.createElement("div");return i.style.cssText="position:absolute;pointer-events:auto;touch-action:none",i.addEventListener("pointerdown",o=>Fh(o,i)),i.addEventListener("pointermove",o=>jh(o)),i.addEventListener("pointerup",o=>Aa(o)),i.addEventListener("pointercancel",o=>Aa(o)),t.appendChild(i),i};us[0]=s(),us[1]=s(),ln=s(),addEventListener("resize",()=>jn=!0),document.body.appendChild(n),jn=!0}function Li(){return lc.getBoundingClientRect()}function Be(n){return n?Vn:Sn}function An(n){return n?Jn:Un}function Cr(n){return n?0:4}function Rr(n){return n&&Sn?1:0}function Bn(n){return Be(n)||An(n)>0}function Ph(n){for(let t=0;t<2;t++){let e=Cr(t);if(!Be(t)&&n>=e&&no.style.cssText="position:absolute;pointer-events:auto;touch-action:none;"+r;if(ve){for(let o of us)o.style.display="none";le?(i(ln,"inset:0"),ln.style.display=""):ln.style.display="none"}else{for(let r=0;r<2;r++){let a=us[r],c=r?"right":"left";if(a.style.display=Bn(r)?"":"none",nn){let l=Bn(r?0:1)?"50%":"100%";i(a,`${c}:0;bottom:0;width:${l};height:60%`)}else i(a,`${c}:0;bottom:0;width:${3*s}px;height:${3*s}px`)}ln.style.display=le?"":"none";let o=le;i(ln,`left:50%;top:50%;width:${2*o}px;height:${2*o}px;transform:translate(-50%,-50%)`)}Oh(t,e),jn=!1}function Oh(n,t){let e=_r;for(;e.firstChild;)e.removeChild(e.firstChild);let s=uc={face:[],thumb:[]},i=zt,o=(a,c,l,u)=>{let h=document.createElementNS(ni,"circle");return h.setAttribute("cx",a),h.setAttribute("cy",c),h.setAttribute("r",l),u&&h.setAttribute("fill",u),e.appendChild(h),h},r=a=>{let c=i*.18,l=i*.5,u=a.x,h=a.y,p=document.createElementNS(ni,"path");p.setAttribute("d",`M ${u-c} ${h-l} H ${u+c} V ${h-c} H ${u+l} V ${h+c} H ${u+c} V ${h+l} H ${u-c} V ${h+c} H ${u-l} V ${h-c} H ${u-c} Z`),e.appendChild(p)};for(let a=0;a<2;a++){let c=An(a),l=Cr(a),u=ke(a,n,t);if(Be(a))As?o(u.x,u.y,i/2):r(u),s.thumb[a]=o(u.x,u.y,i/4,"#fff");else if(c===1)s.face[l]=o(u.x,u.y,i/2,"#000");else for(let h=0;h2?p:K(p,c-1);d=d===3?2:d===2?3:d;let y=b().setDirection(p,i/2);c===2&&(y.x*=-1),a||(y.x*=-1);let x=u.add(y);s.face[l+d]=o(x.x,x.y,i/4,"#000")}}It&&pn&&Dh(n,t)}function Dh(n,t){let e=zt,s=_r,i=(r,a,c)=>{let l=document.createElementNS(ni,r);for(let u in a)l.setAttribute(u,a[u]);l.setAttribute("stroke",c),l.setAttribute("stroke-width",2),l.setAttribute("fill","none"),s.appendChild(l)},o=(r,a,c)=>i("circle",{cx:r.x,cy:r.y,r:a},c);i("line",{x1:n/2,y1:0,x2:n/2,y2:t},"#0f0");for(let r=0;r<2;r++)if(Be(r))if(nn){let a=t*.4,c=!Bn(r?0:1),l=c?0:r?n/2:0;i("rect",{x:l,y:a,width:c?n:n/2,height:t-a},"#0ff")}else o(ke(r,n,t),2*e,"#0ff");else An(r)>=1&&o(ke(r,n,t),e,"#0ff");if(le){o(b(n/2,t/2),le,"#ff0");for(let r=0;r<2;r++)Bn(r)&&o(ke(r,n,t),2*e,"#f0f")}}function Ih(){var l;if(!Ue||B)return;if(!tn||!Zt){Ue.style.display!=="none"&&(Ue.style.display="none",Ie.clear(),te.length=0,bn.length=0,Ls.length=0);return}Ue.style.display="";let n=It&&pn,t=[Jn,Un,Sn,Vn,As,zt,nn,le,ve,n].join();t!==Sa&&(Sa=t,jn=!0),jn&&Lh();let e=es?Mt(Fn.get(),es+1,es):1,s=n||Fn.isSet()&&e>0&&!ve;if(Ue.style.opacity=s?n?1:e*pr:0,!s)return;let i=Li(),o=i.width,r=i.height,a=zt,c=uc;if(c){for(let u=0;u<2;u++)if(Be(u)&&c.thumb[u]){let p=ke(u,o,r).add(((l=bn[u])!=null?l:b()).scale(a/2));c.thumb[u].setAttribute("cx",p.x),c.thumb[u].setAttribute("cy",p.y)}for(let u=0;u=zt)return-1;if(i===1)return o;let a=r.subtract(t);n||(a.x*=-1);let c=i===2?a.xo:a&&ke(r,t,e).distance(n)<2*s)return{role:"stick",side:r}}else if(An(r)>=1){let c=kh(r,n,t,e);if(c>=0)return{role:"face",btn:c}}}if(le){for(let r=0;r<2;r++)if(Bn(r)&&ke(r,t,e).distance(n)<2*s)return;if(b(t/2,e/2).distance(n)h.getChannelData(v).set(x)),p.buffer=h,p.playbackRate.value=e,p.loop=i,r=r||ht.createGain(),r.gain.value=t,r.connect(Ge);let d=new StereoPannerNode(ht,{pan:j(s,-1,1)});p.connect(d).connect(r),p.addEventListener("ended",()=>{r.disconnect(),d.disconnect(),c&&c(p)});let y=a*e;return p.start(0,y),It&&kn&&yt("sound","vol",t.toFixed(2),"rate",e.toFixed(2),"pan",s.toFixed(2),i?"loop":""),p}function Jh(...n){return Pr([Oi(...n)])}function Oi(n=1,t=.05,e=220,s=0,i=0,o=.1,r=0,a=1,c=0,l=0,u=0,h=0,p=0,d=0,y=0,x=0,v=0,T=1,C=0,w=0,_=0){let A=Wn,S=q*2,R=c*=500*S/A/A,M=e*=(1+ut(t,-t))*S/A,ot=0,$=0,nt=0,rt=1,Et,ne=[],kt=0,lt=0,Pt=0,he,sn=2,on=S*Z(_)*2/A,se=at(on),Ee=tt(on)/2/sn,D=1+Ee,k=-2*se/D,gt=(1-Ee)/D,vt=(1+Kt(_)*se)/2/D,Vt=-(Kt(_)+se)/D,rn=vt,qn=0,Hn=0,Os=0,Ds=0;for(s=s*A||9,C*=A,i*=A,o*=A,v*=A,l*=500*S/A**3,y*=S/A,u*=S/A,h*=A,p=p*A|0,Et=s+C+i+o+v|0;lt1?r>2?r>3?r>4?kt/S%14?Pt:Kt(Pt)*Z(Pt)**a)*(ltlt?0:(lth&&(e+=u,M+=u,rt=0),p&&!(++$%p)&&(e=M,c=R,rt||(rt=1));return ne}function ii(n,t=!0){for(let e of Ke)if((!t||e.isSolid)&&n.arrayCheck(e.size)){let s=e.getCollisionData(n);if(s)return s}return 0}function Ve(n,t=b(),e,s=!0){for(let i of Ke)if((!s||i.isSolid)&&i.collisionTest(n,t,e))return i}function fc(n,t,e,s,i=!0){let o,r,a,c=s&&b();for(let l of Ke)if(!i||l.isSolid){let u=l.collisionRaycast(n,t,e,c);if(u){let h=n.distanceSquared(u);(o===void 0||h{G=!1,Q.style.display="none",e.preventDefault(),yt("WebGL context lost! Switching to Canvas2d rendering.");for(let s of ss)s.glTexture=void 0;Xt=void 0,wt=0,xn=!1,dn.forEach(s=>{var i;return(i=s.glContextLost)==null?void 0:i.call(s)})}),Q.addEventListener("webglcontextrestored",()=>{G=!0,Q.style.display="",yt("WebGL context restored, reinitializing..."),t();for(let e of ss)e.glTexture=Ii(e.image,e.wrap);dn.forEach(e=>{var s;return(s=e.glContextRestored)==null?void 0:s.call(e)})});function t(){ai=zn(`#version 300 es
 precision highp float;uniform mat4 m;in vec2 g;in vec4 p,u,c,a;in float r;out vec2 v;out vec4 d,e;void main(){vec2 s=(g-.5)*p.zw;gl_Position=m*vec4(p.xy+s*cos(r)-vec2(-s.y,s)*sin(r),1,1);v=mix(u.xw,u.zy,g);d=c;e=a;}`,`#version 300 es
-precision highp float;uniform sampler2D s;in vec2 v;in vec4 d,e;out vec4 c;void main(){c=texture(s,v)*d+e;}`),ci=Jn(`#version 300 es
+precision highp float;uniform sampler2D s;in vec2 v;in vec4 d,e;out vec4 c;void main(){c=texture(s,v)*d+e;}`),ci=zn(`#version 300 es
 precision highp float;uniform mat4 m;in vec2 p;in vec4 c;out vec4 d;void main(){gl_Position=m*vec4(p,1,1);d=c;}`,`#version 300 es
-precision highp float;in vec4 d;out vec4 c;void main(){c=d;}`);let e=new ArrayBuffer(ui);Dt=new Float32Array(e),gs=new Uint32Array(e),mo=g.createBuffer(),Mn=g.createBuffer(),Or=g.createFramebuffer(),Tt=0;let s=new Float32Array([0,0,1,0,0,1,1,1]);g.bindBuffer(g.ARRAY_BUFFER,Mn),g.bufferData(g.ARRAY_BUFFER,s,g.STATIC_DRAW);let i,o,r,a=(c,l,u,h,p=0)=>{let d=g.getAttribLocation(o,c),y=u===1,b=u&&r;g.enableVertexAttribArray(d),g.vertexAttribPointer(d,h,l,y,b,i),g.vertexAttribDivisor(d,p),i+=h*u};bo=g.createVertexArray(),g.bindVertexArray(bo),i=0,o=ai,r=pc,g.bindBuffer(g.ARRAY_BUFFER,Mn),a("g",g.FLOAT,0,2),g.bindBuffer(g.ARRAY_BUFFER,mo),g.bufferData(g.ARRAY_BUFFER,ui,g.DYNAMIC_DRAW),a("p",g.FLOAT,4,4,1),a("u",g.FLOAT,4,4,1),a("c",g.UNSIGNED_BYTE,1,4,1),a("a",g.UNSIGNED_BYTE,1,4,1),a("r",g.FLOAT,4,1,1),xo=g.createVertexArray(),g.bindVertexArray(xo),i=0,o=ci,r=gc,a("p",g.FLOAT,4,2),a("c",g.UNSIGNED_BYTE,1,4)}}function ys(n=!1){!n&&!mn||(Ct(),mn=!1,g.useProgram(ai),g.bindVertexArray(bo))}function yc(){mn||(Ct(),mn=!0,g.useProgram(ci),g.bindVertexArray(xo))}function So(n=!0){if(!k||!g)return;f(!Tt,"glPreRender called with unflushed batch."),li||(Q.width=D.x,Q.height=D.y),g.viewport(0,0,D.x,D.y),n&&mc();let t=x(2*W).divide(D);li&&(t.y=-t.y);let e=At.rotate(-$),s=x(-1).subtract(e.multiply(t)),i=ot($),o=tt($),r=[t.x*i,t.y*o,0,0,-t.x*o,t.y*i,0,0,1,1,1,0,s.x,s.y,0,1],a=(c,l,u)=>{g.useProgram(c);let h=g.getUniformLocation(c,l);g.uniformMatrix4fv(h,!1,u)};a(ci,"m",r),a(ai,"m",r),g.activeTexture(g.TEXTURE0),nn[0]&&(Xt=nn[0].glTexture,g.bindTexture(g.TEXTURE_2D,Xt)),g.bindBuffer(g.ARRAY_BUFFER,mo),Tn=zn=!1,ys(!0)}function mc(){if(!g)return;let n=Ye;g.clearColor(n.r,n.g,n.b,n.a),g.clear(g.COLOR_BUFFER_BIT)}function Ir(n){!g||n===Xt||(Ct(),Xt=n,g.bindTexture(g.TEXTURE_2D,Xt))}function bc(n,t=!0){if(!g||!n)return;let e=n===Xt;e?Ct():g.bindTexture(g.TEXTURE_2D,n);let s=t?g.REPEAT:g.CLAMP_TO_EDGE;g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_S,s),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_T,s),!e&&Xt&&g.bindTexture(g.TEXTURE_2D,Xt)}function wo(n,t){if(!g)return;let e=g.createShader(t);if(g.shaderSource(e,n),g.compileShader(e),It&&!g.getShaderParameter(e,g.COMPILE_STATUS))throw g.getShaderInfoLog(e);return e}function Jn(n,t){if(!g)return;let e=g.createProgram();if(g.attachShader(e,wo(n,g.VERTEX_SHADER)),g.attachShader(e,wo(t,g.FRAGMENT_SHADER)),g.linkProgram(e),It&&!g.getProgramParameter(e,g.LINK_STATUS))throw g.getProgramInfoLog(e);return e}function Ii(n,t=!1){if(!g)return;let e=g.createTexture(),s=!1;if(n!=null&&n.width)Mr(e,n),g.bindTexture(g.TEXTURE_2D,e),s=!gn&&os(n.width)&&os(n.height);else{let a=new Uint8Array([255,255,255,255]);g.bindTexture(g.TEXTURE_2D,e),g.texImage2D(g.TEXTURE_2D,0,g.RGBA,1,1,0,g.RGBA,g.UNSIGNED_BYTE,a)}let i=gn?g.NEAREST:g.LINEAR,o=s?g.LINEAR_MIPMAP_LINEAR:i;g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MAG_FILTER,i),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MIN_FILTER,o);let r=t?g.REPEAT:g.CLAMP_TO_EDGE;return g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_S,r),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_T,r),s&&g.generateMipmap(g.TEXTURE_2D),g.bindTexture(g.TEXTURE_2D,Xt),e}function xc(n){g&&g.deleteTexture(n)}function Mr(n,t){g&&(f((t==null?void 0:t.width)>0,"Invalid image data."),g.bindTexture(g.TEXTURE_2D,n),g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,t),!gn&&os(t.width)&&os(t.height)&&g.generateMipmap(g.TEXTURE_2D),g.bindTexture(g.TEXTURE_2D,Xt))}function Hh(n){j||(ss.add(n),g&&(n.glTexture?Mr(n.glTexture,n.image):n.glTexture=Ii(n.image,n.wrap)))}function Xh(n){if(j)return;ss.delete(n);let t=n.glTexture;n.glTexture=void 0,xc(t)}function Ct(){if(k&&g&&Tt){let n=zn?g.ONE:g.ONE_MINUS_SRC_ALPHA;g.blendFuncSeparate(g.SRC_ALPHA,n,g.ONE,n),g.enable(g.BLEND);let t=Tt*(mn?Di:Dr);g.bufferSubData(g.ARRAY_BUFFER,0,Dt,0,t),mn?g.drawArrays(g.TRIANGLE_STRIP,0,Tt):g.drawArraysInstanced(g.TRIANGLE_STRIP,0,4,Tt),++Te,Ae+=Tt,Tt=0}zn=Tn}function kr(n){!k||!g||(Ct(),n.drawImage(Q,0,0))}function Yh(n=!0){f(!Q,"must be called before engineInit"),Lr=n}function ms(n,t,e,s,i=0,o=0,r=0,a=1,c=1,l=-1,u=0){(Tt>=Wh||zn!==Tn)&&Ct(),ys();let h=Tt++*Dr;Dt[h++]=n,Dt[h++]=t,Dt[h++]=e,Dt[h++]=s,Dt[h++]=o,Dt[h++]=r,Dt[h++]=a,Dt[h++]=c,gs[h++]=l,gs[h++]=u,Dt[h++]=i}function vc(n,t,e,s,i,o){ms(n,t,e,s,i,0,0,0,0,0,o)}function Gr(n,t,e,s,i,o,r,a=!0){let c=[],l=tt(-r),u=ot(-r);for(let p of n){let d=p.x*i,y=p.y*o;c.push(x(e+u*d-l*y,s+l*d+u*y))}let h=a?Kh(c):c;Sc(h,t)}function Fr(n,t,e,s,i,o,r,a,c=!0){let l=$h(n,e,c);Gr(l,t,s,i,o,r,a,!1)}function Sc(n,t){if(!k||n.length<3)return;let e=n.length+2;if((Tt+e>=kn||zn!==Tn)&&Ct(),f(e=kn)return;yc();let s=Tt*Di;for(let i=e;i--;){let o=F(i-1,0,e-3),r=n[o];Dt[s++]=r.x,Dt[s++]=r.y,gs[s++]=t}Tt+=e}function jr(n,t){if(!k||n.length<3)return;let e=n.length+2;if((Tt+e>=kn||zn!==Tn)&&Ct(),f(e=kn)return;yc();let s=Tt*Di;for(let i=e;i--;){let o=F(i-1,0,e-3),r=n[o],a=t[o];Dt[s++]=r.x,Dt[s++]=r.y,gs[s++]=a}Tt+=e}function Qn(n,t=!1){n?(li=n,g.bindFramebuffer(g.FRAMEBUFFER,Or),g.framebufferTexture2D(g.FRAMEBUFFER,g.COLOR_ATTACHMENT0,g.TEXTURE_2D,n,0),So(t)):(Ct(),li=void 0,g.bindFramebuffer(g.FRAMEBUFFER,null),g.viewport(0,0,D.x,D.y))}function wc(n,t,e,s){k&&(g.enable(g.SCISSOR_TEST),g.scissor(n,t,e,s),g.clearColor(0,0,0,0),g.clear(g.COLOR_BUFFER_BIT),g.disable(g.SCISSOR_TEST))}function $h(n,t,e=!0){if(n.length<2)return[];let s=t/2,i=[],o=n.length,r=1e-6,a=10;for(let c=0;cr?-d/y:0,w=y>r?p/y:0,E=S>r?-v/S:0,A=S>r?b/S:0,T=_+E,R=w+A,M=(T*T+R*R)**.5;if(Mr){let gt=K(1/lt,a);T*=gt,R*=gt}}let ct=x(u.x-T*s,u.y-R*s),et=x(u.x+T*s,u.y+R*s);i.push(ct),i.push(et)}return i.length>1&&e&&(i.push(i[0]),i.push(i[1])),i}function Kh(n){if(n.length<3)return[];let t=(d,y,b)=>(y.x-d.x)*(b.y-d.y)-(y.y-d.y)*(b.x-d.x);(d=>{let y=0;for(let b=d.length;b--;){let v=(b+1)%d.length;y+=d[b].cross(d[v])}return y})(n)<0&&(n=n.slice().reverse());let s=1e-9,i=(d,y,b,v)=>{let S=t(y,b,d),_=t(b,v,d),w=t(v,y,d),E=(S<-s?1:0)+(_<-s?1:0)+(w<-s?1:0),A=(S>s?1:0)+(_>s?1:0)+(w>s?1:0);return!(E&&A)},o=[];for(let d=0;d3&&a++{if(E>=0){let T=s.fillStyle=s.createLinearGradient(v,S,_,w);T.addColorStop(0,h(E,2)),T.addColorStop(1,h(E,1))}else s.fillStyle="#000";E>=-1?(s.fill(),A&&s.stroke()):s.stroke()},c=(v,S,_,w=0,E=2*q,A,T)=>{s.beginPath(),s.arc(v,S,_,d*w,d*E),a(v,S-_,v,S+_,A,T)},l=(v,S,_,w,E)=>{s.beginPath(),s.rect(v,S,_,w*d),a(v,S+w,v+_,S,E)},u=(v,S,_,w)=>{s.beginPath();for(let E of v)s.lineTo(E.x,E.y);s.closePath(),a(0,_,0,_+w,S)},h=(v,S)=>S?`hsl(${[.95,.56,.13][v%3]*360} 99%${[0,50,75][S]}%)`:"#000",p=Ja(1,1,n),d=Mt(p,.1,.5),y=K(6,K(o,r)/99);s.translate(o/2,r/2),s.scale(y,y),s.translate(-40,-35),d<1&&s.setLineDash([99*d,99]),s.lineJoin=s.lineCap="round",s.lineWidth=.1+d*1.9;{let S="LittleJS";s.font="900 15.5px arial",s.lineWidth=.1+d*3.9,s.textAlign="center",s.textBaseline="top",l(11,55,59,8*d,-1),s.beginPath();let _=0;for(let w=0;w5?1:0),s[w?"strokeText":"fillText"](S[E],R,54+.5,17*d),A+=T}s.lineWidth=.1+d*1.9,l(3,54,73,0)}l(7,15,26,-7,0),l(25,15,8,25,-1),l(10,40,15,-25,1),l(14,21,7,9,2),l(38,20,6,-6,2),l(49,20,10,-6,0);let b=[x(44,8),x(64,8),x(59,8+6*d),x(49,8+6*d)];u(b,2,8,6*d),l(44,8,20,-7,0);for(let v=5;v--;)c(59-v*6*d,30,10,0,2*q,1,0);c(59,30,4,0,7,2),l(35,20,24,0),c(59,30,10),c(47,30,10,q/2,q*3/2),c(35,30,10,q/2,q*3/2),l(7,40,13,7,-1),l(17,40,43,14,-1);for(let v=3;v--;)for(let S=2;S--;)c(17+15*v,47,S?7:1,0,2*q,2);for(let v=2;v--;){let S=6,_=7,w=53+S*d*v,E=[x(w+_,54),x(w,40),x(w+S*d,40),x(w+_+S*d,54)];u(E,0,40,14)}s.restore()}function Zh(n){if(fi=n,!on){let e={};try{e=JSON.parse(localStorage[n]||"{}")}catch{e={}}Mi(s=>{s.unlocked=!!(e[s.id]&&e[s.id].unlocked)}),Br()}bn(void 0,t);function t(){if(!zs.length)return;let e=zs[0],s=Ze-Bs;if(!Bs)Bs=Ze;else if(s>hi)Bs=0,zs.shift();else{let i=hi-Dn,o=si?(s-i)/Dn:0;e.render(o)}}}function Mi(n){Object.values(bs).forEach(t=>n(t))}function td(){Mi(n=>n.unlocked=!1),Br()}function Br(){if(!fi)return;let n={};Mi(t=>{let e={name:t.name,description:t.description,icon:t.icon,unlocked:t.unlocked};t.image&&(e.src=t.image.src),n[t.id]=e}),localStorage[fi]=JSON.stringify(n)}function ed(n){hi=n}function nd(n){Dn=n}function sd(n){di=n.copy()}function id(n){Nr=n}function Tc(n,t,e,s=125){let i,o,r,a,c,l,u,h,p,d,y,b,v,S=0,_,w=[],E=[],A=[],T=0,R=0,M=1,ct={},et=qn/s*60>>2;for(;M;T++)w=[M=h=b=0],e.forEach((lt,gt)=>{for(u=t[lt][T]||[0,0,0],M|=t[lt][T]&&1,_=b+(t[lt][0].length-2-(h?0:1))*et,v=gt===e.length-1,i=2,r=b;iet-99&&p&&y<1?y+=1/99:0)l=(1-y)*w[S++]/2||0,E[r]=(E[r]||0)-l*R+l,A[r]=(A[r++]||0)+l*R+l;c&&(y=c%1,R=u[1]||0,(c|=0)&&(w=ct[[d=u[S=0]||0,c]]=ct[[d,c]]||(a=[...n[d]],a[2]=(a[2]||220)*2**(c/12-1),c>0?Oi(...a):[])))}b=_});return[E,A]}function od(n){zr=typeof n=="boolean"?n?1:0:n}function rd(n){Jr=n}async function ad(){return new xi(await Box2D()),e(),bn(n,t),m;function n(){if(!Se){m.step(),m.objects=m.objects.filter(s=>!s.destroyed);for(let s of m.objects)s.body&&(s.pos=m.vec2From(s.body.GetPosition()),s.angle=-s.body.GetAngle())}}function t(){(Jr||re)&&m.world.DrawDebugData()}function e(){let i=new m.instance.JSDraw,o=l=>new St(l.get_r(),l.get_g(),l.get_b()),r=l=>o(m.instance.wrapPointer(l,m.instance.b2Color)),a=l=>r(l).scale(1,.8),c=(l,u)=>{let h=[];for(let p=u;p--;)h.push(m.vec2FromPointer(l+p*8));return h};i.DrawSegment=function(l,u,h){h=a(h),l=m.vec2FromPointer(l),u=m.vec2FromPointer(u),ln(l,u,.1,h,x(),0,!1)},i.DrawPolygon=function(l,u,h){h=a(h);let p=c(l,u);Fn(p,tn,.1,h,x(),0,!1)},i.DrawSolidPolygon=function(l,u,h){h=a(h);let p=c(l,u);Fn(p,h,0,h,x(),0,!1)},i.DrawCircle=function(l,u,h){h=a(h),l=m.vec2FromPointer(l),Qs(l,u*2,tn,.1,h,!1)},i.DrawSolidCircle=function(l,u,h,p){p=a(p),l=m.vec2FromPointer(l),h=m.vec2FromPointer(h).scale(u),Qs(l,u*2,p,.1,p,!1),ln(x(),h,.1,p,l,0,!1)},i.DrawTransform=function(l){l=m.instance.wrapPointer(l,m.instance.b2Transform);let u=m.vec2From(l.get_p()),h=-l.get_q().GetAngle(),p=x(1,0),d=B(.75,0,0,.8),y=x(0,1),b=B(0,.75,0,.8);ln(x(),p,.1,d,u,h,!1),ln(x(),y,.1,b,u,h,!1)},i.AppendFlags(m.instance.b2Draw.e_shapeBit),i.AppendFlags(m.instance.b2Draw.e_jointBit),m.world.SetDebugDraw(i)}}function cd(n,t,e,s=32,i=2,o=0){Ac(n,t,e,U,s,nt,i,o,!1,!0)}function Ac(n,t,e,s,i=1,o,r=.05,a=0,c=k,l,u){let h=e.offset(e.size),p=t.add(x(r-i*2)),d=x(i),y=t.scale(.5).subtract(d.scale(.5)),b=l?-1:1,v=l?-a:a;_t(n,p,h,s,a,!1,o,c,l,u);for(let S=4;S--;){let _=S%2,w=y.multiply(x(_?S===1?1:-1:0,_?0:S?-1:1)),E=x(_?i:p.x,_?p.y:i),A=h.offset(e.size.multiply(x(S===1?1:S===3?-1:0,S===0?-b:S===2?b:0)));_t(n.add(w.rotate(v)),E,A,s,a,!1,o,c,l,u)}for(let S=4;S--;){let _=S>1,w=S&&S<3,E=y.multiply(x(_?-1:1,w?-1:1)),A=h.offset(e.size.multiply(x(_?-1:1,w?b:-b)));_t(n.add(E.rotate(v)),d,A,s,a,!1,o,c,l,u)}}function ld(n,t,e,s=32,i=2,o=0){Cc(n,t,e,U,s,nt,i,o,!1,!0)}function Cc(n,t,e,s,i=1,o,r=.05,a=0,c=k,l,u){let h=e.frame(0),p=e.frame(1),d=e.frame(2),y=t.add(x(r-i*2)),b=x(i),v=t.scale(.5).subtract(b.scale(.5)),S=l?-1:1,_=l?-a:a;_t(n,y,d,s,a,!1,o,c,l,u);for(let w=4;w--;){let E=a+w*q/2,A=w%2,T=v.multiply(x(A?w===1?1:-1:0,A?0:w?-S:S)),R=x(A?y.y:y.x,i);_t(n.add(T.rotate(_)),R,p,s,E,!1,o,c,l,u)}for(let w=4;w--;){let E=a+w*q/2,A=!w||w>2,T=w>1,R=v.multiply(x(A?-1:1,T?-S:S));_t(n.add(R.rotate(_)),b,h,s,E,!1,o,c,l,u)}}function ud(n,t=1,e=0,s=U,i=0,o=!1,r=0,a=nt,c=k,l=!1,u){let h=Ec(x(),t,e,0,o);Fn(h,s,r,a,n,i,c,l,u)}function Ec(n,t=1,e=0,s=0,i=!1,o=Ts){f(L(n),"pos must be a vec2"),f(P(t)&&P(e),"size and percent must be numbers");let r=te(e*4,4);r>=2&&(s+=q),r=r<=2?r-1:3-r,i&&(r=-r,s+=q);let a=[],c=X(3,o>>1),l=t/2;for(let u=0;u<=c;u++){let h=u/c*q;a.push(x(l*ot(h),l*tt(h)).rotate(s).add(n))}for(let u=c;u>=0;u--){let h=u/c*q;a.push(x(l*ot(h),-l*r*tt(h)).rotate(s).add(n))}return a}function _a(n){return n&&typeof n.lerp=="function"}function hd(n,t,e,s,i=1,o={}){f(n!=null&&typeof n=="object","tweenProperty target must be an object"),f(J(t)&&t.length>0,"tweenProperty propertyPath must be a non-empty string");let r=t.split("."),a=r.pop(),c=l=>{let u=n;for(let h of r)u=u[h];u[a]=l};return new vi(c,e,s,i,o)}function _c(n){n.loopRemaining!==1/0&&n.loopRemaining<=1||(n.loopRemaining!==1/0&&(n.loopRemaining-=1),n.life=n.duration,n.thenCallback=()=>_c(n),qt.push(n),n.callback(n.interp(n.duration)))}function Rc(n){if(n.loopRemaining!==1/0&&n.loopRemaining<=1)return;n.loopRemaining!==1/0&&(n.loopRemaining-=1);let t=n.start;n.start=n.end,n.end=t,n.life=n.duration,n.thenCallback=()=>Rc(n),qt.push(n),n.callback(n.interp(n.duration))}function Pc(n,t){n===void 0?(n=Ht-Ca,t=Ze-Ea,Ca=Ht,Ea=Ze):t===void 0&&(t=n);for(let e=qt.length;e--;){let s=qt[e];if(s.paused)continue;let i=s.useRealTime?t:n;if(!(i<=0))if(s.life-=i,s.life>0)s.callback(s.interp(s.life));else{s.callback(s.interp(0)),qt.splice(e,1);let o=s.thenCallback;s.thenCallback=void 0,o&&o()}}}function dd(){for(let n of qt)n.thenCallback=void 0;qt.length=0}var Js,Us,El,$o,xt,Ko,Ra,Ht,Ze,Se,so,ge,Vs,Pa,un,ro,It,Da,Ti,Ia,Pe,Xe,re,ae,hn,dn,Gn,ao,Le,oe,q,Z,vt,is,Ws,K,X,Zt,Fa,ja,tt,ot,Na,Zo,uo,st,St,U,tn,nt,ue,Vl,nr,Wl,Xa,Ya,ql,$a,Ka,Hl,we,At,$,W,ir,Ai,Ye,Rn,Zn,Pn,Ln,or,gn,$e,ws,rr,j,k,Ts,Ci,Ei,_i,Ri,ar,cr,lr,ur,hr,De,Bt,Xs,Pi,dr,ts,cn,en,fr,le,Un,xn,Vn,Wn,As,sn,Jt,pr,es,Ys,Cs,Ut,fn,gr,yr,je,G,at,wt,ke,qe,be,Ie,D,nn,Te,Ae,Ce,Ne,nh,rc,Zs,_e,jt,xr,ye,vr,ti,In,He,Sr,On,yt,ee,H,me,rn,io,jn,ne,yn,ei,Ls,Me,Ve,lc,Er,uc,us,an,Nn,Sa,ni,ft,Fe,qn,ds,si,Qe,pn,oi,fs,ps,yo,Vh,ri,Q,g,Lr,ai,ci,mn,Tn,zn,Xt,mo,Mn,Dt,gs,Tt,ss,bo,xo,Or,li,vo,ui,Dr,pc,Wh,Di,gc,kn,on,hi,Dn,di,Nr,bs,zs,fi,Bs,pi,xs,To,Ao,Lt,Co,V,Eo,_o,Ro,C,zr,Po,se,gi,Lo,Oo,vs,Do,Io,Mo,ko,m,Jr,Ss,yi,Go,Fo,mi,Vt,jo,bi,No,Bo,zo,Jo,Uo,Vo,Wo,qo,Ho,Xo,xi,qt,Ca,Ea,vi,Si,fd,oo,wi,Yo,Oc=jc(()=>{"use strict";Js="LittleJS",Us="1.18.19",El=60,$o=.016666666666666666,xt=[],Ko=[],Ra=0,Ht=0,Ze=0,Se=!1;so=0,ge=0,Vs=0,Pa=!0,un=[],ro=class{constructor(t,e,s,i){this.update=t,this.render=e,this.glContextLost=s,this.glContextRestored=i}};It=!0,Da=.5,Ti=!0,Ia="Escape",Pe=!1,Xe=[],re=!1,ae=!1,hn=!1,dn=!1,Gn=!1;q=Math.PI,Z=Math.abs,vt=Math.floor,is=Math.ceil,Ws=Math.round,K=Math.min,X=Math.max,Zt=n=>Math.sign(n),Fa=(...n)=>Math.hypot(...n),ja=n=>Math.log2(n),tt=Math.sin,ot=Math.cos,Na=Math.tan,Zo=Math.atan2;uo=class{constructor(t=123456789){f(t!==0,"RandomGenerator seed must be non-zero (xorshift is fixed at 0)"),this.seed=t}float(t=1,e=0){return this.seed^=this.seed<<13,this.seed^=this.seed>>>17,this.seed^=this.seed<<5,e+(t-e)*((this.seed>>>0)/2**32)}int(t,e=0){return vt(this.float(t,e))}bool(t=.5){return this.float().5?1:-1}floatSign(t=1,e=0){let s=K(t,e),o=X(t,e)-s,r=this.float(o*2);return rt?this.scale(t/e):this.copy()}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}reflect(t,e=1){return this.subtract(t.scale((1+e)*this.dot(t)))}angle(){return Zo(this.x,this.y)}setAngle(t=0,e=1){return Wt(t),Wt(e),this.x=e*tt(t),this.y=e*ot(t),this}rotate(t){Wt(t);let e=ot(-t),s=tt(-t);return new n(this.x*e-this.y*s,this.x*s+this.y*e)}setDirection(t,e=1){return Wt(t),Wt(e),t=te(t,4),f(t===0||t===1||t===2||t===3,"Vector2.setDirection() direction must be an integer between 0 and 3."),this.x=t%2?t-1?-e:e:0,this.y=t%2?0:t?-e:e,this}direction(){return Z(this.x)>Z(this.y)?this.x<0?3:1:this.y<0?2:0}abs(){return new n(Z(this.x),Z(this.y))}floor(){return new n(vt(this.x),vt(this.y))}snap(t){return Wt(t),new n(vt(this.x*t)/t,vt(this.y*t)/t)}mod(t=1){return new n(te(this.x,t),te(this.y,t))}area(){return Z(this.x*this.y)}lerp(t,e){xa(t),Wt(e);let s=F(e);return new n(t.x*s+this.x*(1-s),t.y*s+this.y*(1-s))}arrayCheck(t){return this.x>=0&&this.y>=0&&this.x(u=te(u,1))*6<1?c+(l-c)*6*u:u*2<1?l:u*3<2?c+(l-c)*(4-u*6):c;return this.r=a(r,o,t+1/3),this.g=a(r,o,t),this.b=a(r,o,t-1/3),this.a=i,Kn(this),this}HSLA(){let t=F(this.r),e=F(this.g),s=F(this.b),i=F(this.a),o=X(t,e,s),r=K(t,e,s),a=(o+r)/2,c=0,l=0;if(o!==r){let u=o-r;l=a>.5?u/(2-o-r):u/(o+r),t===o?c=(e-s)/u+(e((s=F(s)*255|0)<16?"0":"")+s.toString(16);return"#"+e(this.r)+e(this.g)+e(this.b)+(t?e(this.a):"")}setHex(t){if(f(J(t),"Color hex code must be a string"),f(t[0]==="#","Color hex code must start with #"),f([4,5,7,9].includes(t.length),"Invalid hex"),t.length<6){let e=s=>F(parseInt(t[s],16)/15);this.r=e(1),this.g=e(2),this.b=e(3),this.a=t.length===5?e(4):1}else{let e=s=>F(parseInt(t.slice(s,s+2),16)/255);this.r=e(1),this.g=e(3),this.b=e(5),this.a=t.length===9?e(7):1}return Kn(this),this}rgbaInt(){let t=F(this.r)*255|0,e=F(this.g)*255<<8,s=F(this.b)*255<<16,i=F(this.a)*255<<24;return t+e+s+i}isValid(){return P(this.r)&&P(this.g)&&P(this.b)&&P(this.a)}},U=Yt(B()),tn=Yt(B(1,1,1,0)),nt=Yt(B(0,0,0)),ue=Yt(B(0,0,0,0)),Vl=Yt(B(.5,.5,.5)),nr=Yt(B(1,0,0)),Wl=Yt(B(1,.5,0)),Xa=Yt(B(1,1,0)),Ya=Yt(B(0,1,0)),ql=Yt(B(0,1,1)),$a=Yt(B(0,0,1)),Ka=Yt(B(.5,0,1)),Hl=Yt(B(1,0,1)),we=class{constructor(t,e=!1){f(t===void 0||P(t),"Constructed Timer is invalid.",t),this.useRealTime=e;let s=this.getGlobalTime();this.time=t===void 0?void 0:s+t,this.setTime=t}set(t=0){f(P(t),"Timer is invalid.",t);let e=this.getGlobalTime();this.time=e+t,this.setTime=t}setUseRealTime(t=!0){f(!this.isSet(),"Cannot change global time setting while timer is set."),this.useRealTime=t}unset(){this.time=void 0}isSet(){return this.time!==void 0}active(){return this.getGlobalTime()=this.time}get(){return this.isSet()?this.getGlobalTime()-this.time:0}getPercent(){return this.isSet()?this.setTime?1-Mt(this.time-this.getGlobalTime(),0,this.setTime):1:0}getSetTime(){return this.isSet()?this.setTime:0}getGlobalTime(){return this.useRealTime?Ze:Ht}toString(){return this.isSet()?Z(this.get())+" seconds "+(this.get()<0?"before":"after"):"unset"}valueOf(){return this.get()}};At=x(),$=0,W=32,ir=1,Ai=!0,Ye=ue,Rn=x(1920,1080),Zn=0,Pn=0,Ln=x(),or=!1,gn=!0,$e=1,ws="arial",rr=!1,j=!1,k=!0,Ts=32,Ci=x(16),Ei=0,_i=0,Ri=!0,ar=1,cr=1,lr=1,ur=0,hr=.8,De=1,Bt=x(),Xs=1,Pi=!0,dr=!0,ts=!0,cn=!0,en=!1,fr=!1,le=0,Un=4,xn=!0,Vn=0,Wn=!1,As=!0,sn=!1,Jt=100,pr=.3,es=3,Ys=0,Cs=!0,Ut=!0,fn=.3,gr=40,yr=.7;je=class n{constructor(t=x(),e=x(1),s,i=0,o=U,r=0){f(L(t),"object pos must be a vec2"),f(L(e),"object size must be a vec2"),f(!s||s instanceof Ce,"object tileInfo should be a TileInfo or undefined"),f(typeof i=="number"&&isFinite(i),"object angle should be a number"),f(z(o),"object color should be a valid rgba color"),f(typeof r=="number","object renderOrder should be a number"),this.pos=t.copy(),this.size=e.copy(),this.drawSize=void 0,this.tileInfo=s,this.angle=i,this.color=o.copy(),this.additiveColor=void 0,this.mirror=!1,this.destroyed=!1,this.mass=ar,this.damping=cr,this.angleDamping=lr,this.restitution=ur,this.friction=hr,this.gravityScale=1,this.renderOrder=r,this.velocity=x(),this.angleVelocity=0,this.spawnTime=Ht,this.children=[],this.clampSpeed=!0,this.groundObject=void 0,this.parent=void 0,this.localPos=x(),this.localAngle=0,this.collideTiles=!1,this.collideSolidObjects=!1,this.isSolid=!1,this.collideRaycast=!1,xt.push(this)}updateTransforms(){let t=this.parent;if(t){let e=t.getMirrorSign(),s=this.localPos,i=t.pos,o=s.x*e,r=s.y,a=t.angle;if(a){let c=ot(-a),l=tt(-a);this.pos.set(o*c-r*l+i.x,o*l+r*c+i.y)}else this.pos.set(o+i.x,r+i.y);this.angle=e*this.localAngle+a}for(let e of this.children)e.updateTransforms()}updatePhysics(){if(f(!this.parent),this.destroyed)return;this.clampSpeed&&(this.velocity.x=F(this.velocity.x,-De,De),this.velocity.y=F(this.velocity.y,-De,De));let t=this.pos.copy();if(this.velocity.x*=this.damping,this.velocity.y*=this.damping,this.mass&&(this.velocity.x+=Bt.x*this.gravityScale,this.velocity.y+=Bt.y*this.gravityScale),this.pos.x+=this.velocity.x,this.pos.y+=this.velocity.y,this.angle+=this.angleVelocity*=this.angleDamping,f(this.angleDamping>=0&&this.angleDamping<=1),f(this.damping>=0&&this.damping<=1),!Ri||!this.mass)return;let e=this.velocity.y<0&&Bt.y<0||this.velocity.y>0&&Bt.y>0;if(this.groundObject){let s=X(this.friction,this.groundObject.friction),i=this.groundObject.velocity.x;this.velocity.x=i+(this.velocity.x-i)*s,this.groundObject=void 0}if(this.collideSolidObjects)for(let i of Ko){if(i.destroyed||i.parent||i===this||!this.isSolid&&!i.isSolid||!this.isOverlappingObject(i))continue;let o=this.collideWithObject(i),r=i.collideWithObject(this);if(!o||!r)continue;if(Hs(t,this.size,i.pos,i.size)){let p=t.subtract(i.pos),d=p.length(),b=d<.001?x(0,1):p.scale(.001/d);this.velocity=this.velocity.add(b),i.mass&&(i.velocity=i.velocity.subtract(b)),re&&co(this.pos,this.size,i.pos,i.size,"#f00");continue}let a=this.size.add(i.size),c=(t.y-i.pos.y)*2>a.y+Bt.y,l=Z(t.y-i.pos.y)*20?-1:1)>0?vt(t.y-this.size.y/2+1)+this.size.y/2+.001:is(t.y+this.size.y/2-1)-this.size.y/2-.001;if(Z(u-this.pos.y)<.1&&!We(x(this.pos.x,u),this.size,this)){this.pos.y=u,re&&mt(this.pos,this.size,"#ff0");return}this.pos.x=t.x,this.velocity.x*=-r}if(o||!i){if(e){let c=this.size.y/2+1e-4;this.pos.y=Bt.y<0?vt(t.y-this.size.y/2)+c:is(t.y+this.size.y/2)-c,this.groundObject=s}else this.pos.y=t.y,this.groundObject=void 0;this.velocity.y*=-r}re&&mt(this.pos,this.size,"#f00")}}}update(){}render(){_t(this.pos,this.drawSize||this.size,this.tileInfo,this.color,this.angle,this.mirror,this.additiveColor)}renderLight(){}destroy(t=!1){var e;if(!this.destroyed){this.destroyed=!0,(e=this.parent)==null||e.removeChild(this);for(let s of this.children)s.parent=void 0,s.destroy(t)}}localToWorld(t){return this.pos.add(t.rotate(this.angle))}worldToLocal(t){return t.subtract(this.pos).rotate(-this.angle)}localToWorldVector(t){return t.rotate(this.angle)}worldToLocalVector(t){return t.rotate(-this.angle)}collideWithTile(t,e){return t>0}collideWithObject(t){return!0}getUp(t=1){return x().setAngle(this.angle,t)}getRight(t=1){return x().setAngle(this.angle+q/2,t)}getAliveTime(){return Ht-this.spawnTime}getSpeed(){return this.velocity.length()}applyAcceleration(t){this.mass&&(this.velocity=this.velocity.add(t))}applyAngularAcceleration(t){this.mass&&(this.angleVelocity+=t)}applyForce(t){this.mass&&this.applyAcceleration(t.scale(1/this.mass))}getMirrorSign(){return this.mirror?-1:1}addChild(t,e=x(),s=0){return f(!this.destroyed,"cannot add child to destroyed object"),this.destroyed||(f(!t.parent&&!this.children.includes(t)),f(t instanceof n,"child must be an EngineObject"),f(t!==this,"cannot add self as child"),this.children.push(t),t.parent=this,t.localPos=e.copy(),t.localAngle=s,t.updateTransforms()),t}removeChild(t){f(t.parent===this&&this.children.includes(t)),this.children.splice(this.children.indexOf(t),1),t.parent=void 0}isOverlappingObject(t){return this.isOverlapping(t.pos,t.size)}isOverlapping(t,e=x()){return Hs(this.pos,this.size,t,e)}setCollision(t=!0,e=!0,s=!0,i=!0){f(t||!e,"solid objects must be set to collide"),this.collideSolidObjects=t,this.isSolid=e,this.collideTiles=s,this.collideRaycast=i}toString(){let t="type = "+this.constructor.name;return(this.pos.x||this.pos.y)&&(t+=`
+precision highp float;in vec4 d;out vec4 c;void main(){c=d;}`);let e=new ArrayBuffer(ui);Dt=new Float32Array(e),gs=new Uint32Array(e),mo=g.createBuffer(),In=g.createBuffer(),Or=g.createFramebuffer(),wt=0;let s=new Float32Array([0,0,1,0,0,1,1,1]);g.bindBuffer(g.ARRAY_BUFFER,In),g.bufferData(g.ARRAY_BUFFER,s,g.STATIC_DRAW);let i,o,r,a=(c,l,u,h,p=0)=>{let d=g.getAttribLocation(o,c),y=u===1,x=u&&r;g.enableVertexAttribArray(d),g.vertexAttribPointer(d,h,l,y,x,i),g.vertexAttribDivisor(d,p),i+=h*u};bo=g.createVertexArray(),g.bindVertexArray(bo),i=0,o=ai,r=pc,g.bindBuffer(g.ARRAY_BUFFER,In),a("g",g.FLOAT,0,2),g.bindBuffer(g.ARRAY_BUFFER,mo),g.bufferData(g.ARRAY_BUFFER,ui,g.DYNAMIC_DRAW),a("p",g.FLOAT,4,4,1),a("u",g.FLOAT,4,4,1),a("c",g.UNSIGNED_BYTE,1,4,1),a("a",g.UNSIGNED_BYTE,1,4,1),a("r",g.FLOAT,4,1,1),xo=g.createVertexArray(),g.bindVertexArray(xo),i=0,o=ci,r=gc,a("p",g.FLOAT,4,2),a("c",g.UNSIGNED_BYTE,1,4)}}function ys(n=!1){!n&&!xn||(At(),xn=!1,g.useProgram(ai),g.bindVertexArray(bo))}function yc(){xn||(At(),xn=!0,g.useProgram(ci),g.bindVertexArray(xo))}function So(n=!0){if(!G||!g)return;f(!wt,"glPreRender called with unflushed batch."),li||(Q.width=I.x,Q.height=I.y),g.viewport(0,0,I.x,I.y),n&&mc();let t=b(2*W).divide(I);li&&(t.y=-t.y);let e=Tt.rotate(-Y),s=b(-1).subtract(e.multiply(t)),i=at(Y),o=tt(Y),r=[t.x*i,t.y*o,0,0,-t.x*o,t.y*i,0,0,1,1,1,0,s.x,s.y,0,1],a=(c,l,u)=>{g.useProgram(c);let h=g.getUniformLocation(c,l);g.uniformMatrix4fv(h,!1,u)};a(ci,"m",r),a(ai,"m",r),g.activeTexture(g.TEXTURE0),en[0]&&(Xt=en[0].glTexture,g.bindTexture(g.TEXTURE_2D,Xt)),g.bindBuffer(g.ARRAY_BUFFER,mo),En=Nn=!1,ys(!0)}function mc(){if(!g)return;let n=Xe;g.clearColor(n.r,n.g,n.b,n.a),g.clear(g.COLOR_BUFFER_BIT)}function Ir(n){!g||n===Xt||(At(),Xt=n,g.bindTexture(g.TEXTURE_2D,Xt))}function bc(n,t=!0){if(!g||!n)return;let e=n===Xt;e?At():g.bindTexture(g.TEXTURE_2D,n);let s=t?g.REPEAT:g.CLAMP_TO_EDGE;g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_S,s),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_T,s),!e&&Xt&&g.bindTexture(g.TEXTURE_2D,Xt)}function wo(n,t){if(!g)return;let e=g.createShader(t);if(g.shaderSource(e,n),g.compileShader(e),It&&!g.getShaderParameter(e,g.COMPILE_STATUS))throw g.getShaderInfoLog(e);return e}function zn(n,t){if(!g)return;let e=g.createProgram();if(g.attachShader(e,wo(n,g.VERTEX_SHADER)),g.attachShader(e,wo(t,g.FRAGMENT_SHADER)),g.linkProgram(e),It&&!g.getProgramParameter(e,g.LINK_STATUS))throw g.getProgramInfoLog(e);return e}function Ii(n,t=!1){if(!g)return;let e=g.createTexture(),s=!1;if(n!=null&&n.width)Mr(e,n),g.bindTexture(g.TEXTURE_2D,e),s=!mn&&os(n.width)&&os(n.height);else{let a=new Uint8Array([255,255,255,255]);g.bindTexture(g.TEXTURE_2D,e),g.texImage2D(g.TEXTURE_2D,0,g.RGBA,1,1,0,g.RGBA,g.UNSIGNED_BYTE,a)}let i=mn?g.NEAREST:g.LINEAR,o=s?g.LINEAR_MIPMAP_LINEAR:i;g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MAG_FILTER,i),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MIN_FILTER,o);let r=t?g.REPEAT:g.CLAMP_TO_EDGE;return g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_S,r),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_T,r),s&&g.generateMipmap(g.TEXTURE_2D),g.bindTexture(g.TEXTURE_2D,Xt),e}function xc(n){g&&g.deleteTexture(n)}function Mr(n,t){g&&(f((t==null?void 0:t.width)>0,"Invalid image data."),g.bindTexture(g.TEXTURE_2D,n),g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,t),!mn&&os(t.width)&&os(t.height)&&g.generateMipmap(g.TEXTURE_2D),g.bindTexture(g.TEXTURE_2D,Xt))}function Hh(n){B||(ss.add(n),g&&(n.glTexture?Mr(n.glTexture,n.image):n.glTexture=Ii(n.image,n.wrap)))}function Xh(n){if(B)return;ss.delete(n);let t=n.glTexture;n.glTexture=void 0,xc(t)}function At(){if(G&&g&&wt){let n=Nn?g.ONE:g.ONE_MINUS_SRC_ALPHA;g.blendFuncSeparate(g.SRC_ALPHA,n,g.ONE,n),g.enable(g.BLEND);let t=wt*(xn?Di:Dr);g.bufferSubData(g.ARRAY_BUFFER,0,Dt,0,t),xn?g.drawArrays(g.TRIANGLE_STRIP,0,wt):g.drawArraysInstanced(g.TRIANGLE_STRIP,0,4,wt),++we,Te+=wt,wt=0}Nn=En}function kr(n){!G||!g||(At(),n.drawImage(Q,0,0))}function Yh(n=!0){f(!Q,"must be called before engineInit"),Lr=n}function ms(n,t,e,s,i=0,o=0,r=0,a=1,c=1,l=-1,u=0){(wt>=Wh||Nn!==En)&&At(),ys();let h=wt++*Dr;Dt[h++]=n,Dt[h++]=t,Dt[h++]=e,Dt[h++]=s,Dt[h++]=o,Dt[h++]=r,Dt[h++]=a,Dt[h++]=c,gs[h++]=l,gs[h++]=u,Dt[h++]=i}function vc(n,t,e,s,i,o){ms(n,t,e,s,i,0,0,0,0,0,o)}function Gr(n,t,e,s,i,o,r,a=!0){let c=[],l=tt(-r),u=at(-r);for(let p of n){let d=p.x*i,y=p.y*o;c.push(b(e+u*d-l*y,s+l*d+u*y))}let h=a?Kh(c):c;Sc(h,t)}function Fr(n,t,e,s,i,o,r,a,c=!0){let l=$h(n,e,c);Gr(l,t,s,i,o,r,a,!1)}function Sc(n,t){if(!G||n.length<3)return;let e=n.length+2;if((wt+e>=Mn||Nn!==En)&&At(),f(e=Mn)return;yc();let s=wt*Di;for(let i=e;i--;){let o=j(i-1,0,e-3),r=n[o];Dt[s++]=r.x,Dt[s++]=r.y,gs[s++]=t}wt+=e}function jr(n,t){if(!G||n.length<3)return;let e=n.length+2;if((wt+e>=Mn||Nn!==En)&&At(),f(e=Mn)return;yc();let s=wt*Di;for(let i=e;i--;){let o=j(i-1,0,e-3),r=n[o],a=t[o];Dt[s++]=r.x,Dt[s++]=r.y,gs[s++]=a}wt+=e}function Qn(n,t=!1){n?(li=n,g.bindFramebuffer(g.FRAMEBUFFER,Or),g.framebufferTexture2D(g.FRAMEBUFFER,g.COLOR_ATTACHMENT0,g.TEXTURE_2D,n,0),So(t)):(At(),li=void 0,g.bindFramebuffer(g.FRAMEBUFFER,null),g.viewport(0,0,I.x,I.y))}function wc(n,t,e,s){G&&(g.enable(g.SCISSOR_TEST),g.scissor(n,t,e,s),g.clearColor(0,0,0,0),g.clear(g.COLOR_BUFFER_BIT),g.disable(g.SCISSOR_TEST))}function $h(n,t,e=!0){if(n.length<2)return[];let s=t/2,i=[],o=n.length,r=1e-6,a=10;for(let c=0;cr?-d/y:0,w=y>r?p/y:0,_=T>r?-v/T:0,A=T>r?x/T:0,S=C+_,R=w+A,M=(S*S+R*R)**.5;if(Mr){let rt=K(1/nt,a);S*=rt,R*=rt}}let ot=b(u.x-S*s,u.y-R*s),$=b(u.x+S*s,u.y+R*s);i.push(ot),i.push($)}return i.length>1&&e&&(i.push(i[0]),i.push(i[1])),i}function Kh(n){if(n.length<3)return[];let t=(d,y,x)=>(y.x-d.x)*(x.y-d.y)-(y.y-d.y)*(x.x-d.x);(d=>{let y=0;for(let x=d.length;x--;){let v=(x+1)%d.length;y+=d[x].cross(d[v])}return y})(n)<0&&(n=n.slice().reverse());let s=1e-9,i=(d,y,x,v)=>{let T=t(y,x,d),C=t(x,v,d),w=t(v,y,d),_=(T<-s?1:0)+(C<-s?1:0)+(w<-s?1:0),A=(T>s?1:0)+(C>s?1:0)+(w>s?1:0);return!(_&&A)},o=[];for(let d=0;d3&&a++{if(_>=0){let S=s.fillStyle=s.createLinearGradient(v,T,C,w);S.addColorStop(0,h(_,2)),S.addColorStop(1,h(_,1))}else s.fillStyle="#000";_>=-1?(s.fill(),A&&s.stroke()):s.stroke()},c=(v,T,C,w=0,_=2*q,A,S)=>{s.beginPath(),s.arc(v,T,C,d*w,d*_),a(v,T-C,v,T+C,A,S)},l=(v,T,C,w,_)=>{s.beginPath(),s.rect(v,T,C,w*d),a(v,T+w,v+C,T,_)},u=(v,T,C,w)=>{s.beginPath();for(let _ of v)s.lineTo(_.x,_.y);s.closePath(),a(0,C,0,C+w,T)},h=(v,T)=>T?`hsl(${[.95,.56,.13][v%3]*360} 99%${[0,50,75][T]}%)`:"#000",p=Ja(1,1,n),d=Mt(p,.1,.5),y=K(6,K(o,r)/99);s.translate(o/2,r/2),s.scale(y,y),s.translate(-40,-35),d<1&&s.setLineDash([99*d,99]),s.lineJoin=s.lineCap="round",s.lineWidth=.1+d*1.9;{let T="LittleJS";s.font="900 15.5px arial",s.lineWidth=.1+d*3.9,s.textAlign="center",s.textBaseline="top",l(11,55,59,8*d,-1),s.beginPath();let C=0;for(let w=0;w5?1:0),s[w?"strokeText":"fillText"](T[_],R,54+.5,17*d),A+=S}s.lineWidth=.1+d*1.9,l(3,54,73,0)}l(7,15,26,-7,0),l(25,15,8,25,-1),l(10,40,15,-25,1),l(14,21,7,9,2),l(38,20,6,-6,2),l(49,20,10,-6,0);let x=[b(44,8),b(64,8),b(59,8+6*d),b(49,8+6*d)];u(x,2,8,6*d),l(44,8,20,-7,0);for(let v=5;v--;)c(59-v*6*d,30,10,0,2*q,1,0);c(59,30,4,0,7,2),l(35,20,24,0),c(59,30,10),c(47,30,10,q/2,q*3/2),c(35,30,10,q/2,q*3/2),l(7,40,13,7,-1),l(17,40,43,14,-1);for(let v=3;v--;)for(let T=2;T--;)c(17+15*v,47,T?7:1,0,2*q,2);for(let v=2;v--;){let T=6,C=7,w=53+T*d*v,_=[b(w+C,54),b(w,40),b(w+T*d,40),b(w+C+T*d,54)];u(_,0,40,14)}s.restore()}function Zh(n){if(fi=n,!an){let e={};try{e=JSON.parse(localStorage[n]||"{}")}catch{e={}}Mi(s=>{s.unlocked=!!(e[s.id]&&e[s.id].unlocked)}),Nr()}vn(void 0,t);function t(){if(!zs.length)return;let e=zs[0],s=Qe-Ns;if(!Ns)Ns=Qe;else if(s>hi)Ns=0,zs.shift();else{let i=hi-On,o=si?(s-i)/On:0;e.render(o)}}}function Mi(n){Object.values(bs).forEach(t=>n(t))}function td(){Mi(n=>n.unlocked=!1),Nr()}function Nr(){if(!fi)return;let n={};Mi(t=>{let e={name:t.name,description:t.description,icon:t.icon,unlocked:t.unlocked};t.image&&(e.src=t.image.src),n[t.id]=e}),localStorage[fi]=JSON.stringify(n)}function ed(n){hi=n}function nd(n){On=n}function sd(n){di=n.copy()}function id(n){Br=n}function Tc(n,t,e,s=125){let i,o,r,a,c,l,u,h,p,d,y,x,v,T=0,C,w=[],_=[],A=[],S=0,R=0,M=1,ot={},$=Wn/s*60>>2;for(;M;S++)w=[M=h=x=0],e.forEach((nt,rt)=>{for(u=t[nt][S]||[0,0,0],M|=t[nt][S]&&1,C=x+(t[nt][0].length-2-(h?0:1))*$,v=rt===e.length-1,i=2,r=x;i$-99&&p&&y<1?y+=1/99:0)l=(1-y)*w[T++]/2||0,_[r]=(_[r]||0)-l*R+l,A[r]=(A[r++]||0)+l*R+l;c&&(y=c%1,R=u[1]||0,(c|=0)&&(w=ot[[d=u[T=0]||0,c]]=ot[[d,c]]||(a=[...n[d]],a[2]=(a[2]||220)*2**(c/12-1),c>0?Oi(...a):[])))}x=C});return[_,A]}function od(n){zr=typeof n=="boolean"?n?1:0:n}function rd(n){Jr=n}async function ad(){return new xi(await Box2D()),e(),vn(n,t),m;function n(){if(!ve){m.step(),m.objects=m.objects.filter(s=>!s.destroyed);for(let s of m.objects)s.body&&(s.pos=m.vec2From(s.body.GetPosition()),s.angle=-s.body.GetAngle())}}function t(){(Jr||re)&&m.world.DrawDebugData()}function e(){let i=new m.instance.JSDraw,o=l=>new xt(l.get_r(),l.get_g(),l.get_b()),r=l=>o(m.instance.wrapPointer(l,m.instance.b2Color)),a=l=>r(l).scale(1,.8),c=(l,u)=>{let h=[];for(let p=u;p--;)h.push(m.vec2FromPointer(l+p*8));return h};i.DrawSegment=function(l,u,h){h=a(h),l=m.vec2FromPointer(l),u=m.vec2FromPointer(u),hn(l,u,.1,h,b(),0,!1)},i.DrawPolygon=function(l,u,h){h=a(h);let p=c(l,u);Gn(p,Ze,.1,h,b(),0,!1)},i.DrawSolidPolygon=function(l,u,h){h=a(h);let p=c(l,u);Gn(p,h,0,h,b(),0,!1)},i.DrawCircle=function(l,u,h){h=a(h),l=m.vec2FromPointer(l),Qs(l,u*2,Ze,.1,h,!1)},i.DrawSolidCircle=function(l,u,h,p){p=a(p),l=m.vec2FromPointer(l),h=m.vec2FromPointer(h).scale(u),Qs(l,u*2,p,.1,p,!1),hn(b(),h,.1,p,l,0,!1)},i.DrawTransform=function(l){l=m.instance.wrapPointer(l,m.instance.b2Transform);let u=m.vec2From(l.get_p()),h=-l.get_q().GetAngle(),p=b(1,0),d=N(.75,0,0,.8),y=b(0,1),x=N(0,.75,0,.8);hn(b(),p,.1,d,u,h,!1),hn(b(),y,.1,x,u,h,!1)},i.AppendFlags(m.instance.b2Draw.e_shapeBit),i.AppendFlags(m.instance.b2Draw.e_jointBit),m.world.SetDebugDraw(i)}}function cd(n,t,e,s=32,i=2,o=0){Ac(n,t,e,U,s,et,i,o,!1,!0)}function Ac(n,t,e,s,i=1,o,r=.05,a=0,c=G,l,u){let h=e.offset(e.size),p=t.add(b(r-i*2)),d=b(i),y=t.scale(.5).subtract(d.scale(.5)),x=l?-1:1,v=l?-a:a;Rt(n,p,h,s,a,!1,o,c,l,u);for(let T=4;T--;){let C=T%2,w=y.multiply(b(C?T===1?1:-1:0,C?0:T?-1:1)),_=b(C?i:p.x,C?p.y:i),A=h.offset(e.size.multiply(b(T===1?1:T===3?-1:0,T===0?-x:T===2?x:0)));Rt(n.add(w.rotate(v)),_,A,s,a,!1,o,c,l,u)}for(let T=4;T--;){let C=T>1,w=T&&T<3,_=y.multiply(b(C?-1:1,w?-1:1)),A=h.offset(e.size.multiply(b(C?-1:1,w?x:-x)));Rt(n.add(_.rotate(v)),d,A,s,a,!1,o,c,l,u)}}function ld(n,t,e,s=32,i=2,o=0){Ec(n,t,e,U,s,et,i,o,!1,!0)}function Ec(n,t,e,s,i=1,o,r=.05,a=0,c=G,l,u){let h=e.frame(0),p=e.frame(1),d=e.frame(2),y=t.add(b(r-i*2)),x=b(i),v=t.scale(.5).subtract(x.scale(.5)),T=l?-1:1,C=l?-a:a;Rt(n,y,d,s,a,!1,o,c,l,u);for(let w=4;w--;){let _=a+w*q/2,A=w%2,S=v.multiply(b(A?w===1?1:-1:0,A?0:w?-T:T)),R=b(A?y.y:y.x,i);Rt(n.add(S.rotate(C)),R,p,s,_,!1,o,c,l,u)}for(let w=4;w--;){let _=a+w*q/2,A=!w||w>2,S=w>1,R=v.multiply(b(A?-1:1,S?-T:T));Rt(n.add(R.rotate(C)),x,h,s,_,!1,o,c,l,u)}}function ud(n,t=1,e=0,s=U,i=0,o=!1,r=0,a=et,c=G,l=!1,u){let h=_c(b(),t,e,0,o);Gn(h,s,r,a,n,i,c,l,u)}function _c(n,t=1,e=0,s=0,i=!1,o=Ts){f(L(n),"pos must be a vec2"),f(P(t)&&P(e),"size and percent must be numbers");let r=Qt(e*4,4);r>=2&&(s+=q),r=r<=2?r-1:3-r,i&&(r=-r,s+=q);let a=[],c=X(3,o>>1),l=t/2;for(let u=0;u<=c;u++){let h=u/c*q;a.push(b(l*at(h),l*tt(h)).rotate(s).add(n))}for(let u=c;u>=0;u--){let h=u/c*q;a.push(b(l*at(h),-l*r*tt(h)).rotate(s).add(n))}return a}function Ca(n){return n&&typeof n.lerp=="function"}function hd(n,t,e,s,i=1,o={}){f(n!=null&&typeof n=="object","tweenProperty target must be an object"),f(J(t)&&t.length>0,"tweenProperty propertyPath must be a non-empty string");let r=t.split("."),a=r.pop(),c=l=>{let u=n;for(let h of r)u=u[h];u[a]=l};return new vi(c,e,s,i,o)}function Cc(n){n.loopRemaining!==1/0&&n.loopRemaining<=1||(n.loopRemaining!==1/0&&(n.loopRemaining-=1),n.life=n.duration,n.thenCallback=()=>Cc(n),qt.push(n),n.callback(n.interp(n.duration)))}function Rc(n){if(n.loopRemaining!==1/0&&n.loopRemaining<=1)return;n.loopRemaining!==1/0&&(n.loopRemaining-=1);let t=n.start;n.start=n.end,n.end=t,n.life=n.duration,n.thenCallback=()=>Rc(n),qt.push(n),n.callback(n.interp(n.duration))}function Pc(n,t){n===void 0?(n=Ht-Ea,t=Qe-_a,Ea=Ht,_a=Qe):t===void 0&&(t=n);for(let e=qt.length;e--;){let s=qt[e];if(s.paused)continue;let i=s.useRealTime?t:n;if(!(i<=0))if(s.life-=i,s.life>0)s.callback(s.interp(s.life));else{s.callback(s.interp(0)),qt.splice(e,1);let o=s.thenCallback;s.thenCallback=void 0,o&&o()}}}function dd(){for(let n of qt)n.thenCallback=void 0;qt.length=0}var Js,Us,_l,$o,mt,Ko,Ra,Ht,Qe,ve,so,pe,Vs,Pa,dn,ro,It,Da,Ti,Ia,Re,He,re,ae,fn,pn,kn,ao,Pe,oe,q,Z,bt,is,Ws,K,X,Kt,Fa,ja,tt,at,Ba,Zo,uo,it,xt,U,Ze,et,ue,Vl,nr,Wl,Xa,Ya,ql,$a,Ka,Hl,Se,Tt,Y,W,ir,Ai,Xe,Cn,Zn,Rn,Pn,or,mn,Ye,ws,rr,B,G,Ts,Ei,_i,Ci,Ri,ar,cr,lr,ur,hr,Oe,Bt,Xs,Pi,dr,ts,un,tn,fr,le,Jn,Sn,Un,Vn,As,nn,zt,pr,es,Ys,Es,Jt,gn,gr,yr,Fe,F,ct,St,Me,We,me,De,I,en,we,Te,Ae,je,nh,rc,Zs,_e,Ft,xr,ge,vr,ti,Dn,qe,Sr,Ln,ft,Zt,H,ye,cn,io,Fn,te,bn,ei,Ls,Ie,Ue,lc,_r,uc,us,ln,jn,Sa,ni,ht,Ge,Wn,ds,si,Ke,yn,oi,fs,ps,yo,Vh,ri,Q,g,Lr,ai,ci,xn,En,Nn,Xt,mo,In,Dt,gs,wt,ss,bo,xo,Or,li,vo,ui,Dr,pc,Wh,Di,gc,Mn,an,hi,On,di,Br,bs,zs,fi,Ns,pi,xs,To,Ao,Lt,Eo,V,_o,Co,Ro,E,zr,Po,ee,gi,Lo,Oo,vs,Do,Io,Mo,ko,m,Jr,Ss,yi,Go,Fo,mi,Ut,jo,bi,Bo,No,zo,Jo,Uo,Vo,Wo,qo,Ho,Xo,xi,qt,Ea,_a,vi,Si,fd,oo,wi,Yo,Oc=jc(()=>{"use strict";Js="LittleJS",Us="1.18.19",_l=60,$o=.016666666666666666,mt=[],Ko=[],Ra=0,Ht=0,Qe=0,ve=!1;so=0,pe=0,Vs=0,Pa=!0,dn=[],ro=class{constructor(t,e,s,i){this.update=t,this.render=e,this.glContextLost=s,this.glContextRestored=i}};It=!0,Da=.5,Ti=!0,Ia="Escape",Re=!1,He=[],re=!1,ae=!1,fn=!1,pn=!1,kn=!1;q=Math.PI,Z=Math.abs,bt=Math.floor,is=Math.ceil,Ws=Math.round,K=Math.min,X=Math.max,Kt=n=>Math.sign(n),Fa=(...n)=>Math.hypot(...n),ja=n=>Math.log2(n),tt=Math.sin,at=Math.cos,Ba=Math.tan,Zo=Math.atan2;uo=class{constructor(t=123456789){f(t!==0,"RandomGenerator seed must be non-zero (xorshift is fixed at 0)"),this.seed=t}float(t=1,e=0){return this.seed^=this.seed<<13,this.seed^=this.seed>>>17,this.seed^=this.seed<<5,e+(t-e)*((this.seed>>>0)/2**32)}int(t,e=0){return bt(this.float(t,e))}bool(t=.5){return this.float().5?1:-1}floatSign(t=1,e=0){let s=K(t,e),o=X(t,e)-s,r=this.float(o*2);return rt?this.scale(t/e):this.copy()}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}reflect(t,e=1){return this.subtract(t.scale((1+e)*this.dot(t)))}angle(){return Zo(this.x,this.y)}setAngle(t=0,e=1){return Wt(t),Wt(e),this.x=e*tt(t),this.y=e*at(t),this}rotate(t){Wt(t);let e=at(-t),s=tt(-t);return new n(this.x*e-this.y*s,this.x*s+this.y*e)}setDirection(t,e=1){return Wt(t),Wt(e),t=Qt(t,4),f(t===0||t===1||t===2||t===3,"Vector2.setDirection() direction must be an integer between 0 and 3."),this.x=t%2?t-1?-e:e:0,this.y=t%2?0:t?-e:e,this}direction(){return Z(this.x)>Z(this.y)?this.x<0?3:1:this.y<0?2:0}abs(){return new n(Z(this.x),Z(this.y))}floor(){return new n(bt(this.x),bt(this.y))}snap(t){return Wt(t),new n(bt(this.x*t)/t,bt(this.y*t)/t)}mod(t=1){return new n(Qt(this.x,t),Qt(this.y,t))}area(){return Z(this.x*this.y)}lerp(t,e){xa(t),Wt(e);let s=j(e);return new n(t.x*s+this.x*(1-s),t.y*s+this.y*(1-s))}arrayCheck(t){return this.x>=0&&this.y>=0&&this.x(u=Qt(u,1))*6<1?c+(l-c)*6*u:u*2<1?l:u*3<2?c+(l-c)*(4-u*6):c;return this.r=a(r,o,t+1/3),this.g=a(r,o,t),this.b=a(r,o,t-1/3),this.a=i,Kn(this),this}HSLA(){let t=j(this.r),e=j(this.g),s=j(this.b),i=j(this.a),o=X(t,e,s),r=K(t,e,s),a=(o+r)/2,c=0,l=0;if(o!==r){let u=o-r;l=a>.5?u/(2-o-r):u/(o+r),t===o?c=(e-s)/u+(e((s=j(s)*255|0)<16?"0":"")+s.toString(16);return"#"+e(this.r)+e(this.g)+e(this.b)+(t?e(this.a):"")}setHex(t){if(f(J(t),"Color hex code must be a string"),f(t[0]==="#","Color hex code must start with #"),f([4,5,7,9].includes(t.length),"Invalid hex"),t.length<6){let e=s=>j(parseInt(t[s],16)/15);this.r=e(1),this.g=e(2),this.b=e(3),this.a=t.length===5?e(4):1}else{let e=s=>j(parseInt(t.slice(s,s+2),16)/255);this.r=e(1),this.g=e(3),this.b=e(5),this.a=t.length===9?e(7):1}return Kn(this),this}rgbaInt(){let t=j(this.r)*255|0,e=j(this.g)*255<<8,s=j(this.b)*255<<16,i=j(this.a)*255<<24;return t+e+s+i}isValid(){return P(this.r)&&P(this.g)&&P(this.b)&&P(this.a)}},U=Yt(N()),Ze=Yt(N(1,1,1,0)),et=Yt(N(0,0,0)),ue=Yt(N(0,0,0,0)),Vl=Yt(N(.5,.5,.5)),nr=Yt(N(1,0,0)),Wl=Yt(N(1,.5,0)),Xa=Yt(N(1,1,0)),Ya=Yt(N(0,1,0)),ql=Yt(N(0,1,1)),$a=Yt(N(0,0,1)),Ka=Yt(N(.5,0,1)),Hl=Yt(N(1,0,1)),Se=class{constructor(t,e=!1){f(t===void 0||P(t),"Constructed Timer is invalid.",t),this.useRealTime=e;let s=this.getGlobalTime();this.time=t===void 0?void 0:s+t,this.setTime=t}set(t=0){f(P(t),"Timer is invalid.",t);let e=this.getGlobalTime();this.time=e+t,this.setTime=t}setUseRealTime(t=!0){f(!this.isSet(),"Cannot change global time setting while timer is set."),this.useRealTime=t}unset(){this.time=void 0}isSet(){return this.time!==void 0}active(){return this.getGlobalTime()=this.time}get(){return this.isSet()?this.getGlobalTime()-this.time:0}getPercent(){return this.isSet()?this.setTime?1-Mt(this.time-this.getGlobalTime(),0,this.setTime):1:0}getSetTime(){return this.isSet()?this.setTime:0}getGlobalTime(){return this.useRealTime?Qe:Ht}toString(){return this.isSet()?Z(this.get())+" seconds "+(this.get()<0?"before":"after"):"unset"}valueOf(){return this.get()}};Tt=b(),Y=0,W=32,ir=1,Ai=!0,Xe=ue,Cn=b(1920,1080),Zn=0,Rn=0,Pn=b(),or=!1,mn=!0,Ye=1,ws="arial",rr=!1,B=!1,G=!0,Ts=32,Ei=b(16),_i=0,Ci=0,Ri=!0,ar=1,cr=1,lr=1,ur=0,hr=.8,Oe=1,Bt=b(),Xs=1,Pi=!0,dr=!0,ts=!0,un=!0,tn=!1,fr=!1,le=0,Jn=4,Sn=!0,Un=0,Vn=!1,As=!0,nn=!1,zt=100,pr=.3,es=3,Ys=0,Es=!0,Jt=!0,gn=.3,gr=40,yr=.7;Fe=class n{constructor(t=b(),e=b(1),s,i=0,o=U,r=0){f(L(t),"object pos must be a vec2"),f(L(e),"object size must be a vec2"),f(!s||s instanceof Ae,"object tileInfo should be a TileInfo or undefined"),f(typeof i=="number"&&isFinite(i),"object angle should be a number"),f(z(o),"object color should be a valid rgba color"),f(typeof r=="number","object renderOrder should be a number"),this.pos=t.copy(),this.size=e.copy(),this.drawSize=void 0,this.tileInfo=s,this.angle=i,this.color=o.copy(),this.additiveColor=void 0,this.mirror=!1,this.destroyed=!1,this.mass=ar,this.damping=cr,this.angleDamping=lr,this.restitution=ur,this.friction=hr,this.gravityScale=1,this.renderOrder=r,this.velocity=b(),this.angleVelocity=0,this.spawnTime=Ht,this.children=[],this.clampSpeed=!0,this.groundObject=void 0,this.parent=void 0,this.localPos=b(),this.localAngle=0,this.collideTiles=!1,this.collideSolidObjects=!1,this.isSolid=!1,this.collideRaycast=!1,mt.push(this)}updateTransforms(){let t=this.parent;if(t){let e=t.getMirrorSign(),s=this.localPos,i=t.pos,o=s.x*e,r=s.y,a=t.angle;if(a){let c=at(-a),l=tt(-a);this.pos.set(o*c-r*l+i.x,o*l+r*c+i.y)}else this.pos.set(o+i.x,r+i.y);this.angle=e*this.localAngle+a}for(let e of this.children)e.updateTransforms()}updatePhysics(){if(f(!this.parent),this.destroyed)return;this.clampSpeed&&(this.velocity.x=j(this.velocity.x,-Oe,Oe),this.velocity.y=j(this.velocity.y,-Oe,Oe));let t=this.pos.copy();if(this.velocity.x*=this.damping,this.velocity.y*=this.damping,this.mass&&(this.velocity.x+=Bt.x*this.gravityScale,this.velocity.y+=Bt.y*this.gravityScale),this.pos.x+=this.velocity.x,this.pos.y+=this.velocity.y,this.angle+=this.angleVelocity*=this.angleDamping,f(this.angleDamping>=0&&this.angleDamping<=1),f(this.damping>=0&&this.damping<=1),!Ri||!this.mass)return;let e=this.velocity.y<0&&Bt.y<0||this.velocity.y>0&&Bt.y>0;if(this.groundObject){let s=X(this.friction,this.groundObject.friction),i=this.groundObject.velocity.x;this.velocity.x=i+(this.velocity.x-i)*s,this.groundObject=void 0}if(this.collideSolidObjects)for(let i of Ko){if(i.destroyed||i.parent||i===this||!this.isSolid&&!i.isSolid||!this.isOverlappingObject(i))continue;let o=this.collideWithObject(i),r=i.collideWithObject(this);if(!o||!r)continue;if(Hs(t,this.size,i.pos,i.size)){let p=t.subtract(i.pos),d=p.length(),x=d<.001?b(0,1):p.scale(.001/d);this.velocity=this.velocity.add(x),i.mass&&(i.velocity=i.velocity.subtract(x)),re&&co(this.pos,this.size,i.pos,i.size,"#f00");continue}let a=this.size.add(i.size),c=(t.y-i.pos.y)*2>a.y+Bt.y,l=Z(t.y-i.pos.y)*20?-1:1)>0?bt(t.y-this.size.y/2+1)+this.size.y/2+.001:is(t.y+this.size.y/2-1)-this.size.y/2-.001;if(Z(u-this.pos.y)<.1&&!Ve(b(this.pos.x,u),this.size,this)){this.pos.y=u,re&&pt(this.pos,this.size,"#ff0");return}this.pos.x=t.x,this.velocity.x*=-r}if(o||!i){if(e){let c=this.size.y/2+1e-4;this.pos.y=Bt.y<0?bt(t.y-this.size.y/2)+c:is(t.y+this.size.y/2)-c,this.groundObject=s}else this.pos.y=t.y,this.groundObject=void 0;this.velocity.y*=-r}re&&pt(this.pos,this.size,"#f00")}}}update(){}render(){Rt(this.pos,this.drawSize||this.size,this.tileInfo,this.color,this.angle,this.mirror,this.additiveColor)}renderLight(){}destroy(t=!1){var e;if(!this.destroyed){this.destroyed=!0,(e=this.parent)==null||e.removeChild(this);for(let s of this.children)s.parent=void 0,s.destroy(t)}}localToWorld(t){return this.pos.add(t.rotate(this.angle))}worldToLocal(t){return t.subtract(this.pos).rotate(-this.angle)}localToWorldVector(t){return t.rotate(this.angle)}worldToLocalVector(t){return t.rotate(-this.angle)}collideWithTile(t,e){return t>0}collideWithObject(t){return!0}getUp(t=1){return b().setAngle(this.angle,t)}getRight(t=1){return b().setAngle(this.angle+q/2,t)}getAliveTime(){return Ht-this.spawnTime}getSpeed(){return this.velocity.length()}applyAcceleration(t){this.mass&&(this.velocity=this.velocity.add(t))}applyAngularAcceleration(t){this.mass&&(this.angleVelocity+=t)}applyForce(t){this.mass&&this.applyAcceleration(t.scale(1/this.mass))}getMirrorSign(){return this.mirror?-1:1}addChild(t,e=b(),s=0){return f(!this.destroyed,"cannot add child to destroyed object"),this.destroyed||(f(!t.parent&&!this.children.includes(t)),f(t instanceof n,"child must be an EngineObject"),f(t!==this,"cannot add self as child"),this.children.push(t),t.parent=this,t.localPos=e.copy(),t.localAngle=s,t.updateTransforms()),t}removeChild(t){f(t.parent===this&&this.children.includes(t)),this.children.splice(this.children.indexOf(t),1),t.parent=void 0}isOverlappingObject(t){return this.isOverlapping(t.pos,t.size)}isOverlapping(t,e=b()){return Hs(this.pos,this.size,t,e)}setCollision(t=!0,e=!0,s=!0,i=!0){f(t||!e,"solid objects must be set to collide"),this.collideSolidObjects=t,this.isSolid=e,this.collideTiles=s,this.collideRaycast=i}toString(){let t="type = "+this.constructor.name;return(this.pos.x||this.pos.y)&&(t+=`
 pos = `+this.pos),(this.velocity.x||this.velocity.y)&&(t+=`
 velocity = `+this.velocity),(this.size.x||this.size.y)&&(t+=`
 size = `+this.size),this.angle&&(t+=`
 angle = `+this.angle.toFixed(3)),this.color&&(t+=`
-color = `+this.color),t}renderDebugInfo(){if(!It)return;let t=this.collideTiles||this.collideSolidObjects||this.isSolid;if(!t&&!this.parent)return;let e=x(X(this.size.x,.2),X(this.size.y,.2)),s=B(this.collideTiles?1:0,this.collideSolidObjects?1:0,this.isSolid?1:0,.5);mt(this.pos,e,s,0,this.angle,t),this.parent&&mt(this.pos,e.scale(.8),B(1,1,1,.5),0,this.angle),this.parent&&xe(this.pos,this.parent.pos,B(1,1,1,.5),.5)}},D=x(),nn=[];Ce=class n{constructor(t=x(),e=Ci,s=nn[0],i=Ei,o=_i){this.pos=t.copy(),this.size=e.copy(),this.padding=i,this.textureInfo=s,this.bleed=o}offset(t){return new n(this.pos.add(t),this.size,this.textureInfo,this.padding,this.bleed)}frame(t){f(typeof t=="number");let e=this.size.x+this.padding*2,s=t*e;return f(s+this.size.x<=this.textureInfo.size.x,"frame extends beyond texture width!"),this.offset(new st(s))}setFullImage(t=this.textureInfo){return this.textureInfo=t,this.pos=new st,this.size=t.size.copy(),this.bleed=this.padding=0,this}tile(t){return Es(t,this.size,this.textureInfo,this.padding,this.bleed)}},Ne=class{constructor(t,e=!0,s=!1){this.image=t,this.size=t?x(t.width,t.height):x(),this.sizeInverse=t?x(1/t.width,1/t.height):x(),this.glTexture=void 0,this.wrap=s,e&&this.createWebGLTexture()}createWebGLTexture(){Hh(this)}destroyWebGLTexture(){Xh(this)}hasWebGL(){return!!this.glTexture}setWrap(t=!0){this.wrap=t,bc(this.glTexture,t)}};nh=0;Zs=class{constructor(t){f(!!t,"tileInfo is required for ImageFont"),this.tileInfo=t.frame(0)}drawText(t,e,s=1,i,o,r,a){f(L(s)||typeof s=="number","size must be a vec2 or number"),typeof s=="number"?(f(s>0),s*=W,s=new st(s,s)):s=s.scale(W),this.drawTextScreen(t,Sn(e),s,i,o,r,a)}drawTextScreen(t,e,s,i=!0,o=U,r=k,a){f(J(t),"text must be a string"),f(L(e),"pos must be a vec2"),f(L(s)||typeof s=="number","size must be a vec2 or number"),f(z(o),"color must be a color"),s=typeof s=="number"?new st(s,s):s;let c=new st,l=this.tileInfo,u=l.padding,h=l.size.x+u*2,p=l.size.y+u*2,d=l.textureInfo.size.x/h|0;(t+"").split(`
-`).forEach((y,b)=>{let v=i?(y.length-1)*s.x/2:0;for(let S=y.length;S--;){let _=y.charCodeAt(S),w=_<32||_>127?95:_-32,E=w%d,A=w/d|0;l.pos.x=E*h+u,l.pos.y=A*p+u,c.x=e.x+S*s.x-v|0,c.y=e.y+b*s.y|0,_t(c,s,l,o,0,!1,void 0,r,!0,a)}})}};_e=x(),jt=x(),xr=x(),ye=x(),vr=0,ti=!0,In=!1,He="mouse",Sr=6,On=!0,yt=0,ee=!j&&window.ontouchstart!==void 0;H=[[]],me=[],rn=[],io=[],jn=new we,ne=[],yn=[],ei=[],Ls=[],Me=new Map,us=[],Nn=!0;ni="http://www.w3.org/2000/svg";ft=new AudioContext,qn=44100;ds=class{constructor(t,e,s=gr,i=yr,o){var r;if(!(!Ut||j)){if(f(!t||ce(t)||J(t),"asset must be a file name or zzfx array"),f(e===void 0||P(e),"randomness must be a number"),f(e===void 0||e>=0&&e<=1,"randomness must be between 0 and 1"),f(P(s),"range must be a number"),f(P(i),"taper must be a number"),this.range=s,this.taper=i,this.randomness=e!=null?e:0,this.sampleRate=qn,this.loadedPercent=0,this.onloadCallback=o,ce(t)){let a=t.slice(),c=e!=null?e:.05,l=1;this.randomness=(r=a[l])!=null?r:c,a[l]=0,this.sampleChannels=[Oi(...a)],this.loadedPercent=1,o==null||o(this)}else if(typeof t=="string"){let a=t;this.loadSound(a)}}}play(t,e=1,s=1,i=1,o=!1,r=!1){if(f(!t||L(t),"pos must be a vec2"),f(P(e),"volume must be a number"),f(P(s),"pitch must be a number"),f(P(i),"randomnessScale must be a number"),!Ut||j||!this.sampleChannels)return;let a;if(t){let u=this.range;if(u){let h=At.distanceSquared(t);if(h>u*u)return;e*=Mt(h**.5,u,u*this.taper)}a=Sn(t).x*2/G.width-1}let c=s+s*this.randomness*i*dt(-1,1),l=new si(this,e,c,a,o,r);return It&&Gn&&t&&(Nt(t,.5,"#0ff",.5,!0),this.range&&(Nt(t,2*this.range,"#0ff",.5),Nt(t,2*this.range*this.taper,"#0ff",.5)),_n("vol "+e.toFixed(2)+" pitch "+c.toFixed(2),t,.5,"#0ff",.5)),l}playMusic(t=1,e=!0,s=!1){return this.play(void 0,t,1,0,e,s)}playNote(t=0,e,s){f(P(t),"semitoneOffset must be a number");let i=dc(t,1);return this.play(e,s,i,0)}getDuration(){var t,e;return((e=(t=this.sampleChannels)==null?void 0:t[0])==null?void 0:e.length)/this.sampleRate||0}isLoaded(){return this.loadedPercent===1}async loadSound(t){var c;let e=await fetch(t);if(!e.ok)throw new Error(`Failed to load sound from ${t}: ${e.status} ${e.statusText}`);let s=await e.arrayBuffer(),i=await ft.decodeAudioData(s),o=i.numberOfChannels,r=1e5,a=[];for(let l=0;lsetTimeout(v,0));let d=K(p+r,h);for(;p=0,"Sound volume must be positive or zero"),f(s>=0,"Sound rate must be positive or zero"),f(P(i),"Sound pan must be a number"),this.sound=t,this.volume=e,this.rate=s,this.pan=i,this.loop=o,this.pausedTime=0,this.startTime=void 0,this.gainNode=void 0,this.source=void 0,this.onendedCallback=a=>{a===this.source&&(this.source=void 0)},r||this.start()}start(t=0){f(t>=0,"Sound start offset must be positive or zero"),this.isPlaying()&&this.stop(),this.gainNode=ft.createGain(),this.source=Pr(this.sound.sampleChannels,this.volume,this.rate,this.pan,this.loop,this.sound.sampleRate,this.gainNode,t,this.onendedCallback),this.source?(this.startTime=ft.currentTime-t,this.pausedTime=void 0):(this.startTime=void 0,this.pausedTime=0)}setVolume(t){f(t>=0,"Sound volume must be positive or zero"),this.volume=t,this.gainNode&&(this.gainNode.gain.value=t)}stop(t=0){if(f(t>=0,"Sound fade time must be positive or zero"),this.isPlaying())if(t){let e=ft.currentTime,s=e+t;this.gainNode.gain.cancelScheduledValues(e),this.gainNode.gain.setValueAtTime(this.volume,e),this.gainNode.gain.linearRampToValueAtTime(0,s),this.source.stop(s)}else this.source.stop();this.pausedTime=0,this.source=void 0,this.startTime=void 0}pause(){this.isPaused()||(this.pausedTime=this.getCurrentTime(),this.source.stop(),this.source=void 0,this.startTime=void 0)}resume(){this.isPaused()&&this.start(this.pausedTime)}isPlaying(){return!!this.source}isPaused(){return!this.isPlaying()}getCurrentTime(){if(!this.isPlaying())return this.pausedTime;let t=this.getDuration();return t?te(ft.currentTime-this.startTime,t):0}getDuration(){return this.rate?this.sound.getDuration()/this.rate:0}getSource(){return this.source}};Qe=[];pn=class{constructor(t,e=0,s=!1,i=new St){this.tile=t,this.direction=e,this.mirror=s,this.color=i.copy()}clear(){this.tile=this.direction=0,this.mirror=!1,this.color=new St}},oi=class extends je{constructor(t,e,s=0,i=0,o=x(512),r=!0){var a;f(L(o),"canvasSize must be a Vector2"),super(t,e,void 0,s,U,i),this.canvas=j?void 0:new OffscreenCanvas(o.x,o.y),this.context=(a=this.canvas)==null?void 0:a.getContext("2d"),this.textureInfo=new Ne(this.canvas,r),this.mass=0}destroy(){this.destroyed||(this.textureInfo.destroyWebGLTexture(),super.destroy())}render(){this.draw(this.pos,this.size,this.color,this.angle,this.mirror,this.additiveColor)}draw(t,e,s=U,i=0,o=!1,r,a=!1,c){let l=new Ce().setFullImage(this.textureInfo),u=this.hasWebGL();_t(t,e,l,s,i,o,r,u,a,c)}updateWebGL(){this.textureInfo.createWebGLTexture()}hasWebGL(){return k&&this.textureInfo.hasWebGL()}},fs=class extends oi{constructor(t,e,s=Es(),i=0,o=!0){let r=s?e.multiply(s.size):e;if(super(t,e,0,i,r,o),this.tileInfo=void 0,this.data=[],this.isUsingWebGL=!1,j){this.render=()=>{},this.redraw=()=>{},this.redrawStart=()=>{},this.redrawEnd=()=>{},this.drawTileData=()=>{},this.redrawTileData=()=>{},this.drawLayerTile=()=>{},this.drawLayerRect=()=>{},this.drawTile=()=>{},this.drawRect=()=>{},this.clearLayerRect=()=>{};return}s&&(this.tileInfo=s.frame(0),this.tileInfo.bleed=0);for(let a=this.size.area();a--;)this.data.push(new pn)}setData(t,e,s=!1){if(t=t.floor(),f(L(t),"layerPos must be a Vector2"),f(e instanceof pn,"data must be a TileLayerData"),!t.arrayCheck(this.size)||(this.data[(t.y|0)*this.size.x+(t.x|0)]=e,!s))return;wt===this.context?this.drawTileData(t):this.redrawTileData(t)}clearData(t,e=!1){this.setData(t,new pn,e)}getData(t){return f(L(t),"layerPos must be a Vector2"),t.arrayCheck(this.size)?this.data[(t.y|0)*this.size.x+(t.x|0)]:void 0}update(){!k&&this.isUsingWebGL&&(this.isUsingWebGL=!1,this.redraw())}render(){f(wt!==this.context,"must call redrawEnd() after drawing tiles!");let t=this.drawSize||this.size,e=this.pos.add(t.scale(.5));this.draw(e,this.size,this.color,this.angle,this.mirror,this.additiveColor)}onRedraw(){}redraw(){this.redrawStart(!0);for(let t=this.size.x;t--;)for(let e=this.size.y;e--;)this.drawTileData(x(t,e),!1);this.isUsingWebGL&&Ct(),this.onRedraw(),this.redrawEnd()}redrawStart(t=!1){var s,i;if(!this.context)return;f(wt!==this.context),this.savedRenderSettings=[wt,D,At,W,Ye],wt=this.context;let e=(i=(s=this.tileInfo)==null?void 0:s.size)!=null?i:x(1);D=this.size.multiply(e),Ye=ue,At=this.size.multiply(e).scale(.5),W=1,this.isUsingWebGL=this.hasWebGL(),this.isUsingWebGL?Qn(this.textureInfo.glTexture,t):(this.context.imageSmoothingEnabled=!gn,t&&(this.canvas.width=D.x,this.canvas.height=D.y))}redrawEnd(){this.context&&(f(wt===this.context),this.isUsingWebGL&&Qn(),[wt,D,At,W,Ye]=this.savedRenderSettings)}drawTileData(t,e=!0){var a,c;if(!this.context)return;f(wt===this.context,"must call redrawStart() before drawing tiles");let s=(c=(a=this.tileInfo)==null?void 0:a.size)!=null?c:x(1),i=t.multiply(s);e&&this.clearLayerRect(i,s);let o=this.getData(t);if(!o||!o.tile)return;let r=this.tileInfo&&this.tileInfo.tile(o.tile);this.drawLayerTile(i,s,r,o.color,o.direction*q/2,o.mirror)}redrawTileData(t,e=!0){this.context&&(f(wt!==this.context,"redrawStart() should not be active when calling redrawTileData(), instead use drawTileData()"),this.redrawStart(),this.drawTileData(t,e),this.redrawEnd())}drawLayerTile(t,e=x(1),s,i=U,o=0,r,a){let c=t.add(e.scale(.5));_t(c,e,s,i,o,r,a,this.isUsingWebGL)}drawLayerRect(t,e,s,i=0){this.drawLayerTile(t,e,void 0,s,i)}drawTile(t,e=x(1),s,i=new St,o=0,r=!1){t=t.subtract(this.pos).multiply(this.tileInfo.size),e=e.multiply(this.tileInfo.size),t.y=this.canvas.height-t.y;let a=D;D=x(this.canvas.width,this.canvas.height);let c=this.hasWebGL();c&&Qn(this.textureInfo.glTexture);let l=c?void 0:this.context;_t(t,e,s,i,o,r,void 0,c,!0,l),c&&Qn(),D=a}drawRect(t,e,s,i){this.drawTile(t,e,void 0,s,i)}clearLayerRect(t,e){f(wt===this.context,"must call redrawStart() before clearing tiles");let s=t.x,i=this.canvas.height-t.y-e.y;this.hasWebGL()?wc(s,i,e.x,e.y):this.context.clearRect(s,i,e.x,e.y)}},ps=class extends fs{constructor(t,e,s=Es(),i=0,o=!0){super(t,e.floor(),s,i,o),this.collisionData=[],this.initCollision(this.size),Qe.push(this),this.isSolid=!0}destroy(){if(this.destroyed)return;let t=Qe.indexOf(this);f(t>=0,"tile collision layer not found in array"),t>=0&&Qe.splice(t,1),super.destroy()}initCollision(t){f(L(t),"size must be a Vector2"),this.size=t.floor(),this.collisionData=[],this.collisionData.length=t.area(),this.collisionData.fill(0)}setCollisionData(t,e=1){f(L(t),"layerPos must be a Vector2");let s=(t.y|0)*this.size.x+(t.x|0);t.arrayCheck(this.size)&&(this.collisionData[s]=e)}clearCollisionData(t){this.setCollisionData(t,0)}getCollisionData(t){f(L(t),"layerPos must be a Vector2");let e=(t.y|0)*this.size.x+(t.x|0);return t.arrayCheck(this.size)?this.collisionData[e]:0}collisionTest(t,e=new st,s){f(L(t)&&L(e),"pos and size must be Vector2s"),f(!s||typeof s=="function"||s instanceof je,"callbackObject must be a function or EngineObject");let i=s?typeof s=="function"?(p,d)=>s(p,d):(p,d)=>s.collideWithTile(p,d):()=>!0,o=t.x-this.pos.x,r=t.y-this.pos.y;if(o+e.x/2<0||o-e.x/2>this.size.x||r+e.y/2<0||r-e.y/2>this.size.y)return!1;let a=X(o-e.x/2|0,0),c=X(r-e.y/2|0,0),l=K(X(o+e.x/2,a+1),this.size.x),u=K(X(r+e.y/2,c+1),this.size.y),h=new st;for(let p=c;ps(l,u):(l,u)=>s.collideWithTile(l,u):l=>l>0,r=l=>{let u=this.getCollisionData(a.set(l.x-this.pos.x,l.y-this.pos.y));return u&&o(u,l)},a=new st,c=Ua(t,e,r,i);if(ae&&c){let l=c.floor().add(x(.5));mt(l,x(1),"#f008"),xe(t,e,"#00f",.02),xe(t,c,"#f00",.02),Qo(c,"#0f0"),i&&xe(c,c.add(i),"#ff0",.02)}return c}},yo=class extends je{constructor(t,e,s=0,i=0,o=100,r=q,a,c=U,l=U,u=tn,h=tn,p=.5,d=.1,y=1,b=.1,v=.05,S=1,_=1,w=0,E=q,A=.1,T=.2,R=!1,M=!1,ct=!0,et=M?1e9:0,lt=!1){super(t,x(),a,e,void 0,et),this.emitCircle=typeof s=="number",this.emitSize=typeof s=="number"?x(s):s.copy(),this.emitTime=i,this.emitRate=o,this.emitConeAngle=r,this.colorStartA=c.copy(),this.colorStartB=l.copy(),this.colorEndA=u.copy(),this.colorEndB=h.copy(),this.randomColorLinear=ct,this.particleTime=p,this.sizeStart=d,this.sizeEnd=y,this.speed=b,this.angleSpeed=v,this.damping=S,this.angleDamping=_,this.gravityScale=w,this.particleConeAngle=E,this.fadeRate=A,this.randomness=T,this.collideTiles=R,this.additive=M,this.localSpace=lt,this.trailScale=0,this.particleCreateCallback=void 0,this.particleDestroyCallback=void 0,this.particleCollideCallback=void 0,this.velocityInheritance=0,this.emitTimeBuffer=0,this.particles=[],this.previousAngle=this.angle,this.previousPos=this.pos.copy()}update(){if(f(this.angleDamping>=0&&this.angleDamping<=1),f(this.damping>=0&&this.damping<=1),this.velocityInheritance){let s=this.velocityInheritance;this.velocity.x=s*(this.pos.x-this.previousPos.x),this.velocity.y=s*(this.pos.y-this.previousPos.y),this.angleVelocity=s*(this.angle-this.previousAngle),this.previousAngle=this.angle,this.previousPos.x=this.pos.x,this.previousPos.y=this.pos.y}if(this.isActive()){if(this.emitRate&&Xs){let s=1/this.emitRate/Xs;for(this.emitTimeBuffer+=$o;this.emitTimeBuffer>0;this.emitTimeBuffer-=s)this.emitParticle()}}else this.particles.length===0&&this.destroy(!0);let t=this.particles,e=0;for(let s=0;s_+_*dt(s,-s),o=i(this.particleTime),r=i(this.sizeStart),a=i(this.sizeEnd),c=i(this.speed),l=i(this.angleSpeed)*Wa(),u=dt(this.emitConeAngle,-this.emitConeAngle),h=lo(this.colorStartA,this.colorStartB,this.randomColorLinear),p=lo(this.colorEndA,this.colorEndB,this.randomColorLinear),d=this.localSpace?u:this.angle+u,y=x(c*tt(d),c*ot(d)),b=l;!this.localSpace&&this.velocityInheritance>0&&(y.x+=this.velocity.x,y.y+=this.velocity.y,b+=this.angleVelocity);let v=new ri(this,t,e,h,p,o,r,a,y,b);return this.particles.push(v),(S=this.particleCreateCallback)==null||S.call(this,v),v}updatePhysics(){}render(){for(let t of this.particles)t.render()}isActive(){return!this.emitTime||this.getAliveTime()0&&(this.destroyed=!1,this.emitTime=-1))}},Vh=new st,ri=class{constructor(t,e,s,i,o,r,a,c,l=x(),u=0){this.emitter=t,this.pos=e,this.angle=s,this.size=x(a),this.color=i.copy(),this.colorStart=i,this.colorEnd=o,this.lifeTime=r,this.sizeStart=a,this.sizeEnd=c,this.velocity=l,this.angleVelocity=u,this.spawnTime=Ht,this.mirror=Va(),this.groundObject=void 0,this.destroyed=!1,this.tileInfo=t.tileInfo}update(){let t=this.emitter,e=t.damping,s=t.angleDamping,i=t.restitution,o=t.friction,r=t.gravityScale,a=t.collideTiles,c=t.particleCollideCallback;if(this.lifeTime>0&&Ht-this.spawnTime>this.lifeTime){this.destroy();return}let l=this.pos.copy();if(this.velocity.x*=e,this.velocity.y*=e,this.pos.x+=this.velocity.x+=Bt.x*r,this.pos.y+=this.velocity.y+=Bt.y*r,this.angle+=this.angleVelocity*=s,!Ri||!a)return;let u=this.velocity.lengthSquared();if(u>De*De){let p=De/u**.5;this.velocity.x*=p,this.velocity.y*=p}this.groundObject=void 0;let h=c?p=>{let d=ii(p);return d&&c(this,d,p)}:p=>ii(p)>0;if(h(this.pos)){let p=We(this.pos);if(!h(l)){let d=h(x(this.pos.x,l.y)),y=h(x(l.x,this.pos.y)),b=X(i,p.restitution),v=X(o,p.friction);d&&(this.pos.x=l.x,this.velocity.x*=-b,this.velocity.y*=v),(y||!d)&&((this.velocity.y<0&&Bt.y<0||this.velocity.y>0&&Bt.y>0)&&(this.groundObject=p),this.pos.y=l.y,this.velocity.y*=-b,this.velocity.x*=v),re&&mt(this.pos,this.size,"#f00")}}}destroy(){let t=this.emitter.particleDestroyCallback,e=this.colorEnd;this.color.set(e.r,e.g,e.b,e.a),this.size.set(this.sizeEnd,this.sizeEnd),this.destroyed=!0,t==null||t(this)}render(){let t=this.emitter,e=t.localSpace,s=t.additive,i=t.trailScale,o=t.fadeRate/2,r=this.lifeTime>0?K((Ht-this.spawnTime)/this.lifeTime,1):1,a=1-r,c=a*this.sizeStart+r*this.sizeEnd,l=x(c),u=r1-o?(1-r)/o:1;this.color.r=a*this.colorStart.r+r*this.colorEnd.r,this.color.g=a*this.colorStart.g+r*this.colorEnd.g,this.color.b=a*this.colorStart.b+r*this.colorEnd.b,this.color.a=(a*this.colorStart.a+r*this.colorEnd.a)*u;let h=Vh.set(this.pos.x,this.pos.y),p=this.angle;if(e){let d=t.angle,y=ot(-d),b=tt(-d);h.set(t.pos.x+h.x*y-h.y*b,t.pos.y+h.x*b+h.y*y),p+=d}if(s&&as(),i){let d=e?this.velocity.rotate(t.angle):this.velocity,y=d.length();if(y){let b=y*i;l.y=X(l.x,b),p=Zo(d.x,d.y),_t(h,l,this.tileInfo,this.color,p,this.mirror)}}else _t(h,l,this.tileInfo,this.color,p,this.mirror);s&&as(!1),hn&&mt(h,l,"#f005",0,p)}},Lr=!0,vo=!0,ui=5e5,Dr=11,pc=Dr*4,Wh=ui/pc|0,Di=3,gc=Di*4,kn=ui/gc|0;on=!1,hi=5,Dn=.5,di=x(640,80),Nr=!1,bs={},zs=[];pi=class{constructor(t,e,s="",i="\u{1F3C6}",o){f(t>=0&&!bs[t]),this.id=t,this.name=e,this.description=s,this.icon=i,this.unlocked=!1,this.image=void 0,o&&((this.image=new Image).src=o),bs[t]=this}unlock(){Nr||this.unlocked||(f(fi,"save name must be set"),this.unlocked=!0,Br(),zs.push(this))}render(t=0){let e=at,s=K(di.x,G.width),i=di.y,o=G.width-s,r=-i*t,a=Oe(0,0,.9);e.save(),e.beginPath(),e.fillStyle=a.toString(),e.strokeStyle=nt.toString(),e.lineWidth=3,e.rect(o,r,s,i),e.fill(),e.stroke(),e.clip();let c=x(.1,.05).scale(i),l=i-2*c.x;this.renderIcon(x(o+c.x+l/2,r+i/2),l);let u=i*.5,h=i*.3,p=x(o+l+2*c.x,r+c.y*2+u/2),d=s-l-3*c.x;Ke(this.name,p,u,nt,0,void 0,"left",void 0,void 0,d),p.y=r+i-c.y*2-h/2,Ke(this.description,p,h,nt,0,void 0,"left",void 0,void 0,d),e.restore()}renderIcon(t,e){this.image?at.drawImage(this.image,t.x-e/2,t.y-e/2,e,e):Ke(this.icon,t,e*.7,nt)}};To=class extends pi{constructor(t,e,s,i,o){super(t,e,s,i,o)}unlock(){super.unlock(),xs&&xs.unlockMedal(this.id)}},Ao=class{constructor(t,e,s){var c,l,u;f(!xs,"there can only be one newgrounds object"),f(!e||s,"must provide cryptojs if there is a cipher"),xs=this,this.app_id=t,this.cipher=e,this.cryptoJS=s,this.host=location?location.hostname:"";let i=new URL(location.href);if(this.session_id=i.searchParams.get("ngio_session_id"),!this.session_id)return;let o=this.call("Medal.getList");if(!o||!o.result||o.result.error){on&&bt("Newgrounds session unavailable; skipping plugin init"),this.medals=[],this.scoreboards=[];return}this.medals=((c=o.result.data)==null?void 0:c.medals)||[],on&&bt(this.medals);for(let h of this.medals){let p=bs[h.id];p&&(p.image=new Image,p.image.src=h.icon,p.name=h.name,p.description=h.description,p.unlocked=h.unlocked,p.difficulty=h.difficulty,p.value=h.value,p.value&&(p.description=p.description+` (${p.value})`))}let r=this.call("ScoreBoard.getBoards");this.scoreboards=((u=(l=r==null?void 0:r.result)==null?void 0:l.data)==null?void 0:u.scoreboards)||[],on&&bt(this.scoreboards);let a=60*1e3;setInterval(()=>this.call("Gateway.ping",0,!0),a)}unlockMedal(t){return this.call("Medal.unlock",{id:t},!0)}postScore(t,e){return this.call("ScoreBoard.postScore",{id:t,value:e},!0)}getScores(t,e,s=0,i=0,o=10){return this.call("ScoreBoard.getScores",{id:t,user:e,social:s,skip:i,limit:o})}logView(){return this.call("App.logView",{host:this.host},!0)}call(t,e,s=!1){let i={component:t,parameters:e};if(this.cipher){let l=this.cryptoJS,u=l.enc.Base64.parse(this.cipher),h=l.lib.WordArray.random(16),p=l.AES.encrypt(JSON.stringify(i),u,{iv:h});i.secure=l.enc.Base64.stringify(h.concat(p.ciphertext)),i.parameters=0}let o={app_id:this.app_id,session_id:this.session_id,call:i},r=new FormData;r.append("input",JSON.stringify(o));let a=new XMLHttpRequest;a.open("POST","https://newgrounds.io/gateway_v3.php",!on&&s);try{a.send(r)}catch(l){on&&bt("newgrounds call failed",l);return}return on&&bt(a.responseText),a.responseText&&JSON.parse(a.responseText)}},Co=class{constructor(t,e=!1,s=!1){f(!Lt,"Post process already initialized"),f(!(e&&s),"Post process cannot both include main canvas and use feedback texture"),Lt=this,t||(t="void mainImage(out vec4 c,vec2 p){c=texture(iChannel0,p/iResolution.xy);}"),this.shader=void 0,this.texture=void 0,this.vao=void 0,i(),bn(void 0,a,o,r);function i(){if(j)return;if(!k){console.warn("PostProcessPlugin: WebGL not enabled!");return}Lt.texture=Ii(),Lt.shader=Jn(`#version 300 es
+color = `+this.color),t}renderDebugInfo(){if(!It)return;let t=this.collideTiles||this.collideSolidObjects||this.isSolid;if(!t&&!this.parent)return;let e=b(X(this.size.x,.2),X(this.size.y,.2)),s=N(this.collideTiles?1:0,this.collideSolidObjects?1:0,this.isSolid?1:0,.5);pt(this.pos,e,s,0,this.angle,t),this.parent&&pt(this.pos,e.scale(.8),N(1,1,1,.5),0,this.angle),this.parent&&be(this.pos,this.parent.pos,N(1,1,1,.5),.5)}},I=b(),en=[];Ae=class n{constructor(t=b(),e=Ei,s=en[0],i=_i,o=Ci){this.pos=t.copy(),this.size=e.copy(),this.padding=i,this.textureInfo=s,this.bleed=o}offset(t){return new n(this.pos.add(t),this.size,this.textureInfo,this.padding,this.bleed)}frame(t){f(typeof t=="number");let e=this.size.x+this.padding*2,s=t*e;return f(s+this.size.x<=this.textureInfo.size.x,"frame extends beyond texture width!"),this.offset(new it(s))}setFullImage(t=this.textureInfo){return this.textureInfo=t,this.pos=new it,this.size=t.size.copy(),this.bleed=this.padding=0,this}tile(t){return _s(t,this.size,this.textureInfo,this.padding,this.bleed)}},je=class{constructor(t,e=!0,s=!1){this.image=t,this.size=t?b(t.width,t.height):b(),this.sizeInverse=t?b(1/t.width,1/t.height):b(),this.glTexture=void 0,this.wrap=s,e&&this.createWebGLTexture()}createWebGLTexture(){Hh(this)}destroyWebGLTexture(){Xh(this)}hasWebGL(){return!!this.glTexture}setWrap(t=!0){this.wrap=t,bc(this.glTexture,t)}};nh=0;Zs=class{constructor(t){f(!!t,"tileInfo is required for ImageFont"),this.tileInfo=t.frame(0)}drawText(t,e,s=1,i,o,r,a){f(L(s)||typeof s=="number","size must be a vec2 or number"),typeof s=="number"?(f(s>0),s*=W,s=new it(s,s)):s=s.scale(W),this.drawTextScreen(t,Tn(e),s,i,o,r,a)}drawTextScreen(t,e,s,i=!0,o=U,r=G,a){f(J(t),"text must be a string"),f(L(e),"pos must be a vec2"),f(L(s)||typeof s=="number","size must be a vec2 or number"),f(z(o),"color must be a color"),s=typeof s=="number"?new it(s,s):s;let c=new it,l=this.tileInfo,u=l.padding,h=l.size.x+u*2,p=l.size.y+u*2,d=l.textureInfo.size.x/h|0;(t+"").split(`
+`).forEach((y,x)=>{let v=i?(y.length-1)*s.x/2:0;for(let T=y.length;T--;){let C=y.charCodeAt(T),w=C<32||C>127?95:C-32,_=w%d,A=w/d|0;l.pos.x=_*h+u,l.pos.y=A*p+u,c.x=e.x+T*s.x-v|0,c.y=e.y+x*s.y|0,Rt(c,s,l,o,0,!1,void 0,r,!0,a)}})}};_e=b(),Ft=b(),xr=b(),ge=b(),vr=0,ti=!0,Dn=!1,qe="mouse",Sr=6,Ln=!0,ft=0,Zt=!B&&window.ontouchstart!==void 0;H=[[]],ye=[],cn=[],io=[],Fn=new Se,te=[],bn=[],ei=[],Ls=[],Ie=new Map,us=[],jn=!0;ni="http://www.w3.org/2000/svg";ht=new AudioContext,Wn=44100;ds=class{constructor(t,e,s=gr,i=yr,o){var r;if(!(!Jt||B)){if(f(!t||ce(t)||J(t),"asset must be a file name or zzfx array"),f(e===void 0||P(e),"randomness must be a number"),f(e===void 0||e>=0&&e<=1,"randomness must be between 0 and 1"),f(P(s),"range must be a number"),f(P(i),"taper must be a number"),this.range=s,this.taper=i,this.randomness=e!=null?e:0,this.sampleRate=Wn,this.loadedPercent=0,this.onloadCallback=o,ce(t)){let a=t.slice(),c=e!=null?e:.05,l=1;this.randomness=(r=a[l])!=null?r:c,a[l]=0,this.sampleChannels=[Oi(...a)],this.loadedPercent=1,o==null||o(this)}else if(typeof t=="string"){let a=t;this.loadSound(a)}}}play(t,e=1,s=1,i=1,o=!1,r=!1){if(f(!t||L(t),"pos must be a vec2"),f(P(e),"volume must be a number"),f(P(s),"pitch must be a number"),f(P(i),"randomnessScale must be a number"),!Jt||B||!this.sampleChannels)return;let a;if(t){let u=this.range;if(u){let h=Tt.distanceSquared(t);if(h>u*u)return;e*=Mt(h**.5,u,u*this.taper)}a=Tn(t).x*2/F.width-1}let c=s+s*this.randomness*i*ut(-1,1),l=new si(this,e,c,a,o,r);return It&&kn&&t&&(jt(t,.5,"#0ff",.5,!0),this.range&&(jt(t,2*this.range,"#0ff",.5),jt(t,2*this.range*this.taper,"#0ff",.5)),_n("vol "+e.toFixed(2)+" pitch "+c.toFixed(2),t,.5,"#0ff",.5)),l}playMusic(t=1,e=!0,s=!1){return this.play(void 0,t,1,0,e,s)}playNote(t=0,e,s){f(P(t),"semitoneOffset must be a number");let i=dc(t,1);return this.play(e,s,i,0)}getDuration(){var t,e;return((e=(t=this.sampleChannels)==null?void 0:t[0])==null?void 0:e.length)/this.sampleRate||0}isLoaded(){return this.loadedPercent===1}async loadSound(t){var c;let e=await fetch(t);if(!e.ok)throw new Error(`Failed to load sound from ${t}: ${e.status} ${e.statusText}`);let s=await e.arrayBuffer(),i=await ht.decodeAudioData(s),o=i.numberOfChannels,r=1e5,a=[];for(let l=0;lsetTimeout(v,0));let d=K(p+r,h);for(;p=0,"Sound volume must be positive or zero"),f(s>=0,"Sound rate must be positive or zero"),f(P(i),"Sound pan must be a number"),this.sound=t,this.volume=e,this.rate=s,this.pan=i,this.loop=o,this.pausedTime=0,this.startTime=void 0,this.gainNode=void 0,this.source=void 0,this.onendedCallback=a=>{a===this.source&&(this.source=void 0)},r||this.start()}start(t=0){f(t>=0,"Sound start offset must be positive or zero"),this.isPlaying()&&this.stop(),this.gainNode=ht.createGain(),this.source=Pr(this.sound.sampleChannels,this.volume,this.rate,this.pan,this.loop,this.sound.sampleRate,this.gainNode,t,this.onendedCallback),this.source?(this.startTime=ht.currentTime-t,this.pausedTime=void 0):(this.startTime=void 0,this.pausedTime=0)}setVolume(t){f(t>=0,"Sound volume must be positive or zero"),this.volume=t,this.gainNode&&(this.gainNode.gain.value=t)}stop(t=0){if(f(t>=0,"Sound fade time must be positive or zero"),this.isPlaying())if(t){let e=ht.currentTime,s=e+t;this.gainNode.gain.cancelScheduledValues(e),this.gainNode.gain.setValueAtTime(this.volume,e),this.gainNode.gain.linearRampToValueAtTime(0,s),this.source.stop(s)}else this.source.stop();this.pausedTime=0,this.source=void 0,this.startTime=void 0}pause(){this.isPaused()||(this.pausedTime=this.getCurrentTime(),this.source.stop(),this.source=void 0,this.startTime=void 0)}resume(){this.isPaused()&&this.start(this.pausedTime)}isPlaying(){return!!this.source}isPaused(){return!this.isPlaying()}getCurrentTime(){if(!this.isPlaying())return this.pausedTime;let t=this.getDuration();return t?Qt(ht.currentTime-this.startTime,t):0}getDuration(){return this.rate?this.sound.getDuration()/this.rate:0}getSource(){return this.source}};Ke=[];yn=class{constructor(t,e=0,s=!1,i=new xt){this.tile=t,this.direction=e,this.mirror=s,this.color=i.copy()}clear(){this.tile=this.direction=0,this.mirror=!1,this.color=new xt}},oi=class extends Fe{constructor(t,e,s=0,i=0,o=b(512),r=!0){var a;f(L(o),"canvasSize must be a Vector2"),super(t,e,void 0,s,U,i),this.canvas=B?void 0:new OffscreenCanvas(o.x,o.y),this.context=(a=this.canvas)==null?void 0:a.getContext("2d"),this.textureInfo=new je(this.canvas,r),this.mass=0}destroy(){this.destroyed||(this.textureInfo.destroyWebGLTexture(),super.destroy())}render(){this.draw(this.pos,this.size,this.color,this.angle,this.mirror,this.additiveColor)}draw(t,e,s=U,i=0,o=!1,r,a=!1,c){let l=new Ae().setFullImage(this.textureInfo),u=this.hasWebGL();Rt(t,e,l,s,i,o,r,u,a,c)}updateWebGL(){this.textureInfo.createWebGLTexture()}hasWebGL(){return G&&this.textureInfo.hasWebGL()}},fs=class extends oi{constructor(t,e,s=_s(),i=0,o=!0){let r=s?e.multiply(s.size):e;if(super(t,e,0,i,r,o),this.tileInfo=void 0,this.data=[],this.isUsingWebGL=!1,B){this.render=()=>{},this.redraw=()=>{},this.redrawStart=()=>{},this.redrawEnd=()=>{},this.drawTileData=()=>{},this.redrawTileData=()=>{},this.drawLayerTile=()=>{},this.drawLayerRect=()=>{},this.drawTile=()=>{},this.drawRect=()=>{},this.clearLayerRect=()=>{};return}s&&(this.tileInfo=s.frame(0),this.tileInfo.bleed=0);for(let a=this.size.area();a--;)this.data.push(new yn)}setData(t,e,s=!1){if(t=t.floor(),f(L(t),"layerPos must be a Vector2"),f(e instanceof yn,"data must be a TileLayerData"),!t.arrayCheck(this.size)||(this.data[(t.y|0)*this.size.x+(t.x|0)]=e,!s))return;St===this.context?this.drawTileData(t):this.redrawTileData(t)}clearData(t,e=!1){this.setData(t,new yn,e)}getData(t){return f(L(t),"layerPos must be a Vector2"),t.arrayCheck(this.size)?this.data[(t.y|0)*this.size.x+(t.x|0)]:void 0}update(){!G&&this.isUsingWebGL&&(this.isUsingWebGL=!1,this.redraw())}render(){f(St!==this.context,"must call redrawEnd() after drawing tiles!");let t=this.drawSize||this.size,e=this.pos.add(t.scale(.5));this.draw(e,this.size,this.color,this.angle,this.mirror,this.additiveColor)}onRedraw(){}redraw(){this.redrawStart(!0);for(let t=this.size.x;t--;)for(let e=this.size.y;e--;)this.drawTileData(b(t,e),!1);this.isUsingWebGL&&At(),this.onRedraw(),this.redrawEnd()}redrawStart(t=!1){var s,i;if(!this.context)return;f(St!==this.context),this.savedRenderSettings=[St,I,Tt,W,Xe],St=this.context;let e=(i=(s=this.tileInfo)==null?void 0:s.size)!=null?i:b(1);I=this.size.multiply(e),Xe=ue,Tt=this.size.multiply(e).scale(.5),W=1,this.isUsingWebGL=this.hasWebGL(),this.isUsingWebGL?Qn(this.textureInfo.glTexture,t):(this.context.imageSmoothingEnabled=!mn,t&&(this.canvas.width=I.x,this.canvas.height=I.y))}redrawEnd(){this.context&&(f(St===this.context),this.isUsingWebGL&&Qn(),[St,I,Tt,W,Xe]=this.savedRenderSettings)}drawTileData(t,e=!0){var a,c;if(!this.context)return;f(St===this.context,"must call redrawStart() before drawing tiles");let s=(c=(a=this.tileInfo)==null?void 0:a.size)!=null?c:b(1),i=t.multiply(s);e&&this.clearLayerRect(i,s);let o=this.getData(t);if(!o||!o.tile)return;let r=this.tileInfo&&this.tileInfo.tile(o.tile);this.drawLayerTile(i,s,r,o.color,o.direction*q/2,o.mirror)}redrawTileData(t,e=!0){this.context&&(f(St!==this.context,"redrawStart() should not be active when calling redrawTileData(), instead use drawTileData()"),this.redrawStart(),this.drawTileData(t,e),this.redrawEnd())}drawLayerTile(t,e=b(1),s,i=U,o=0,r,a){let c=t.add(e.scale(.5));Rt(c,e,s,i,o,r,a,this.isUsingWebGL)}drawLayerRect(t,e,s,i=0){this.drawLayerTile(t,e,void 0,s,i)}drawTile(t,e=b(1),s,i=new xt,o=0,r=!1){t=t.subtract(this.pos).multiply(this.tileInfo.size),e=e.multiply(this.tileInfo.size),t.y=this.canvas.height-t.y;let a=I;I=b(this.canvas.width,this.canvas.height);let c=this.hasWebGL();c&&Qn(this.textureInfo.glTexture);let l=c?void 0:this.context;Rt(t,e,s,i,o,r,void 0,c,!0,l),c&&Qn(),I=a}drawRect(t,e,s,i){this.drawTile(t,e,void 0,s,i)}clearLayerRect(t,e){f(St===this.context,"must call redrawStart() before clearing tiles");let s=t.x,i=this.canvas.height-t.y-e.y;this.hasWebGL()?wc(s,i,e.x,e.y):this.context.clearRect(s,i,e.x,e.y)}},ps=class extends fs{constructor(t,e,s=_s(),i=0,o=!0){super(t,e.floor(),s,i,o),this.collisionData=[],this.initCollision(this.size),Ke.push(this),this.isSolid=!0}destroy(){if(this.destroyed)return;let t=Ke.indexOf(this);f(t>=0,"tile collision layer not found in array"),t>=0&&Ke.splice(t,1),super.destroy()}initCollision(t){f(L(t),"size must be a Vector2"),this.size=t.floor(),this.collisionData=[],this.collisionData.length=t.area(),this.collisionData.fill(0)}setCollisionData(t,e=1){f(L(t),"layerPos must be a Vector2");let s=(t.y|0)*this.size.x+(t.x|0);t.arrayCheck(this.size)&&(this.collisionData[s]=e)}clearCollisionData(t){this.setCollisionData(t,0)}getCollisionData(t){f(L(t),"layerPos must be a Vector2");let e=(t.y|0)*this.size.x+(t.x|0);return t.arrayCheck(this.size)?this.collisionData[e]:0}collisionTest(t,e=new it,s){f(L(t)&&L(e),"pos and size must be Vector2s"),f(!s||typeof s=="function"||s instanceof Fe,"callbackObject must be a function or EngineObject");let i=s?typeof s=="function"?(p,d)=>s(p,d):(p,d)=>s.collideWithTile(p,d):()=>!0,o=t.x-this.pos.x,r=t.y-this.pos.y;if(o+e.x/2<0||o-e.x/2>this.size.x||r+e.y/2<0||r-e.y/2>this.size.y)return!1;let a=X(o-e.x/2|0,0),c=X(r-e.y/2|0,0),l=K(X(o+e.x/2,a+1),this.size.x),u=K(X(r+e.y/2,c+1),this.size.y),h=new it;for(let p=c;ps(l,u):(l,u)=>s.collideWithTile(l,u):l=>l>0,r=l=>{let u=this.getCollisionData(a.set(l.x-this.pos.x,l.y-this.pos.y));return u&&o(u,l)},a=new it,c=Ua(t,e,r,i);if(ae&&c){let l=c.floor().add(b(.5));pt(l,b(1),"#f008"),be(t,e,"#00f",.02),be(t,c,"#f00",.02),Qo(c,"#0f0"),i&&be(c,c.add(i),"#ff0",.02)}return c}},yo=class extends Fe{constructor(t,e,s=0,i=0,o=100,r=q,a,c=U,l=U,u=Ze,h=Ze,p=.5,d=.1,y=1,x=.1,v=.05,T=1,C=1,w=0,_=q,A=.1,S=.2,R=!1,M=!1,ot=!0,$=M?1e9:0,nt=!1){super(t,b(),a,e,void 0,$),this.emitCircle=typeof s=="number",this.emitSize=typeof s=="number"?b(s):s.copy(),this.emitTime=i,this.emitRate=o,this.emitConeAngle=r,this.colorStartA=c.copy(),this.colorStartB=l.copy(),this.colorEndA=u.copy(),this.colorEndB=h.copy(),this.randomColorLinear=ot,this.particleTime=p,this.sizeStart=d,this.sizeEnd=y,this.speed=x,this.angleSpeed=v,this.damping=T,this.angleDamping=C,this.gravityScale=w,this.particleConeAngle=_,this.fadeRate=A,this.randomness=S,this.collideTiles=R,this.additive=M,this.localSpace=nt,this.trailScale=0,this.particleCreateCallback=void 0,this.particleDestroyCallback=void 0,this.particleCollideCallback=void 0,this.velocityInheritance=0,this.emitTimeBuffer=0,this.particles=[],this.previousAngle=this.angle,this.previousPos=this.pos.copy()}update(){if(f(this.angleDamping>=0&&this.angleDamping<=1),f(this.damping>=0&&this.damping<=1),this.velocityInheritance){let s=this.velocityInheritance;this.velocity.x=s*(this.pos.x-this.previousPos.x),this.velocity.y=s*(this.pos.y-this.previousPos.y),this.angleVelocity=s*(this.angle-this.previousAngle),this.previousAngle=this.angle,this.previousPos.x=this.pos.x,this.previousPos.y=this.pos.y}if(this.isActive()){if(this.emitRate&&Xs){let s=1/this.emitRate/Xs;for(this.emitTimeBuffer+=$o;this.emitTimeBuffer>0;this.emitTimeBuffer-=s)this.emitParticle()}}else this.particles.length===0&&this.destroy(!0);let t=this.particles,e=0;for(let s=0;sC+C*ut(s,-s),o=i(this.particleTime),r=i(this.sizeStart),a=i(this.sizeEnd),c=i(this.speed),l=i(this.angleSpeed)*Wa(),u=ut(this.emitConeAngle,-this.emitConeAngle),h=lo(this.colorStartA,this.colorStartB,this.randomColorLinear),p=lo(this.colorEndA,this.colorEndB,this.randomColorLinear),d=this.localSpace?u:this.angle+u,y=b(c*tt(d),c*at(d)),x=l;!this.localSpace&&this.velocityInheritance>0&&(y.x+=this.velocity.x,y.y+=this.velocity.y,x+=this.angleVelocity);let v=new ri(this,t,e,h,p,o,r,a,y,x);return this.particles.push(v),(T=this.particleCreateCallback)==null||T.call(this,v),v}updatePhysics(){}render(){for(let t of this.particles)t.render()}isActive(){return!this.emitTime||this.getAliveTime()0&&(this.destroyed=!1,this.emitTime=-1))}},Vh=new it,ri=class{constructor(t,e,s,i,o,r,a,c,l=b(),u=0){this.emitter=t,this.pos=e,this.angle=s,this.size=b(a),this.color=i.copy(),this.colorStart=i,this.colorEnd=o,this.lifeTime=r,this.sizeStart=a,this.sizeEnd=c,this.velocity=l,this.angleVelocity=u,this.spawnTime=Ht,this.mirror=Va(),this.groundObject=void 0,this.destroyed=!1,this.tileInfo=t.tileInfo}update(){let t=this.emitter,e=t.damping,s=t.angleDamping,i=t.restitution,o=t.friction,r=t.gravityScale,a=t.collideTiles,c=t.particleCollideCallback;if(this.lifeTime>0&&Ht-this.spawnTime>this.lifeTime){this.destroy();return}let l=this.pos.copy();if(this.velocity.x*=e,this.velocity.y*=e,this.pos.x+=this.velocity.x+=Bt.x*r,this.pos.y+=this.velocity.y+=Bt.y*r,this.angle+=this.angleVelocity*=s,!Ri||!a)return;let u=this.velocity.lengthSquared();if(u>Oe*Oe){let p=Oe/u**.5;this.velocity.x*=p,this.velocity.y*=p}this.groundObject=void 0;let h=c?p=>{let d=ii(p);return d&&c(this,d,p)}:p=>ii(p)>0;if(h(this.pos)){let p=Ve(this.pos);if(!h(l)){let d=h(b(this.pos.x,l.y)),y=h(b(l.x,this.pos.y)),x=X(i,p.restitution),v=X(o,p.friction);d&&(this.pos.x=l.x,this.velocity.x*=-x,this.velocity.y*=v),(y||!d)&&((this.velocity.y<0&&Bt.y<0||this.velocity.y>0&&Bt.y>0)&&(this.groundObject=p),this.pos.y=l.y,this.velocity.y*=-x,this.velocity.x*=v),re&&pt(this.pos,this.size,"#f00")}}}destroy(){let t=this.emitter.particleDestroyCallback,e=this.colorEnd;this.color.set(e.r,e.g,e.b,e.a),this.size.set(this.sizeEnd,this.sizeEnd),this.destroyed=!0,t==null||t(this)}render(){let t=this.emitter,e=t.localSpace,s=t.additive,i=t.trailScale,o=t.fadeRate/2,r=this.lifeTime>0?K((Ht-this.spawnTime)/this.lifeTime,1):1,a=1-r,c=a*this.sizeStart+r*this.sizeEnd,l=b(c),u=r1-o?(1-r)/o:1;this.color.r=a*this.colorStart.r+r*this.colorEnd.r,this.color.g=a*this.colorStart.g+r*this.colorEnd.g,this.color.b=a*this.colorStart.b+r*this.colorEnd.b,this.color.a=(a*this.colorStart.a+r*this.colorEnd.a)*u;let h=Vh.set(this.pos.x,this.pos.y),p=this.angle;if(e){let d=t.angle,y=at(-d),x=tt(-d);h.set(t.pos.x+h.x*y-h.y*x,t.pos.y+h.x*x+h.y*y),p+=d}if(s&&as(),i){let d=e?this.velocity.rotate(t.angle):this.velocity,y=d.length();if(y){let x=y*i;l.y=X(l.x,x),p=Zo(d.x,d.y),Rt(h,l,this.tileInfo,this.color,p,this.mirror)}}else Rt(h,l,this.tileInfo,this.color,p,this.mirror);s&&as(!1),fn&&pt(h,l,"#f005",0,p)}},Lr=!0,vo=!0,ui=5e5,Dr=11,pc=Dr*4,Wh=ui/pc|0,Di=3,gc=Di*4,Mn=ui/gc|0;an=!1,hi=5,On=.5,di=b(640,80),Br=!1,bs={},zs=[];pi=class{constructor(t,e,s="",i="\u{1F3C6}",o){f(t>=0&&!bs[t]),this.id=t,this.name=e,this.description=s,this.icon=i,this.unlocked=!1,this.image=void 0,o&&((this.image=new Image).src=o),bs[t]=this}unlock(){Br||this.unlocked||(f(fi,"save name must be set"),this.unlocked=!0,Nr(),zs.push(this))}render(t=0){let e=ct,s=K(di.x,F.width),i=di.y,o=F.width-s,r=-i*t,a=Le(0,0,.9);e.save(),e.beginPath(),e.fillStyle=a.toString(),e.strokeStyle=et.toString(),e.lineWidth=3,e.rect(o,r,s,i),e.fill(),e.stroke(),e.clip();let c=b(.1,.05).scale(i),l=i-2*c.x;this.renderIcon(b(o+c.x+l/2,r+i/2),l);let u=i*.5,h=i*.3,p=b(o+l+2*c.x,r+c.y*2+u/2),d=s-l-3*c.x;$e(this.name,p,u,et,0,void 0,"left",void 0,void 0,d),p.y=r+i-c.y*2-h/2,$e(this.description,p,h,et,0,void 0,"left",void 0,void 0,d),e.restore()}renderIcon(t,e){this.image?ct.drawImage(this.image,t.x-e/2,t.y-e/2,e,e):$e(this.icon,t,e*.7,et)}};To=class extends pi{constructor(t,e,s,i,o){super(t,e,s,i,o)}unlock(){super.unlock(),xs&&xs.unlockMedal(this.id)}},Ao=class{constructor(t,e,s){var c,l,u;f(!xs,"there can only be one newgrounds object"),f(!e||s,"must provide cryptojs if there is a cipher"),xs=this,this.app_id=t,this.cipher=e,this.cryptoJS=s,this.host=location?location.hostname:"";let i=new URL(location.href);if(this.session_id=i.searchParams.get("ngio_session_id"),!this.session_id)return;let o=this.call("Medal.getList");if(!o||!o.result||o.result.error){an&&yt("Newgrounds session unavailable; skipping plugin init"),this.medals=[],this.scoreboards=[];return}this.medals=((c=o.result.data)==null?void 0:c.medals)||[],an&&yt(this.medals);for(let h of this.medals){let p=bs[h.id];p&&(p.image=new Image,p.image.src=h.icon,p.name=h.name,p.description=h.description,p.unlocked=h.unlocked,p.difficulty=h.difficulty,p.value=h.value,p.value&&(p.description=p.description+` (${p.value})`))}let r=this.call("ScoreBoard.getBoards");this.scoreboards=((u=(l=r==null?void 0:r.result)==null?void 0:l.data)==null?void 0:u.scoreboards)||[],an&&yt(this.scoreboards);let a=60*1e3;setInterval(()=>this.call("Gateway.ping",0,!0),a)}unlockMedal(t){return this.call("Medal.unlock",{id:t},!0)}postScore(t,e){return this.call("ScoreBoard.postScore",{id:t,value:e},!0)}getScores(t,e,s=0,i=0,o=10){return this.call("ScoreBoard.getScores",{id:t,user:e,social:s,skip:i,limit:o})}logView(){return this.call("App.logView",{host:this.host},!0)}call(t,e,s=!1){let i={component:t,parameters:e};if(this.cipher){let l=this.cryptoJS,u=l.enc.Base64.parse(this.cipher),h=l.lib.WordArray.random(16),p=l.AES.encrypt(JSON.stringify(i),u,{iv:h});i.secure=l.enc.Base64.stringify(h.concat(p.ciphertext)),i.parameters=0}let o={app_id:this.app_id,session_id:this.session_id,call:i},r=new FormData;r.append("input",JSON.stringify(o));let a=new XMLHttpRequest;a.open("POST","https://newgrounds.io/gateway_v3.php",!an&&s);try{a.send(r)}catch(l){an&&yt("newgrounds call failed",l);return}return an&&yt(a.responseText),a.responseText&&JSON.parse(a.responseText)}},Eo=class{constructor(t,e=!1,s=!1){f(!Lt,"Post process already initialized"),f(!(e&&s),"Post process cannot both include main canvas and use feedback texture"),Lt=this,t||(t="void mainImage(out vec4 c,vec2 p){c=texture(iChannel0,p/iResolution.xy);}"),this.shader=void 0,this.texture=void 0,this.vao=void 0,i(),vn(void 0,a,o,r);function i(){if(B)return;if(!G){console.warn("PostProcessPlugin: WebGL not enabled!");return}Lt.texture=Ii(),Lt.shader=zn(`#version 300 es
 precision highp float;in vec2 p;void main(){gl_Position=vec4(p+p-1.,1,1);}`,`#version 300 es
 precision highp float;uniform sampler2D iChannel0;uniform vec3 iResolution;uniform float iTime;out vec4 c;
 `+t+`
-void main(){mainImage(c,gl_FragCoord.xy);c.a=1.;}`),Lt.vao=g.createVertexArray(),g.bindVertexArray(Lt.vao),g.bindBuffer(g.ARRAY_BUFFER,Mn);let c=8,l=g.getAttribLocation(Lt.shader,"p");g.enableVertexAttribArray(l),g.vertexAttribPointer(l,2,g.FLOAT,!1,c,0)}function o(){Lt.shader=void 0,Lt.texture=void 0,bt("PostProcessPlugin: WebGL context lost")}function r(){i(),bt("PostProcessPlugin: WebGL context restored")}function a(){if(j||!k)return;Ct(),g.bindFramebuffer(g.FRAMEBUFFER,null),g.useProgram(Lt.shader),g.bindVertexArray(Lt.vao),g.pixelStorei(g.UNPACK_FLIP_Y_WEBGL,!0),g.disable(g.BLEND),g.activeTexture(g.TEXTURE0),g.bindTexture(g.TEXTURE_2D,Lt.texture),e?(ke.width=D.x,ke.height=D.y,kr(qe),qe.drawImage(G,0,0),G.width|=0,g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,ke)):s||g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,Q);let c=l=>g.getUniformLocation(Lt.shader,l);g.uniform1i(c("iChannel0"),0),g.uniform1f(c("iTime"),Ht),g.uniform3f(c("iResolution"),G.width,G.height,1),g.drawArrays(g.TRIANGLE_STRIP,0,4),s&&g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,Q),g.pixelStorei(g.UNPACK_FLIP_Y_WEBGL,!1),ys(!0)}}},Eo=class{constructor(t,e){f(!V,"LightSystemPlugin already initialized"),f(!Lt,"LightSystemPlugin must be created before PostProcessPlugin"),V=this,this.enabled=!0,this.ambientColor=(e||nt).copy(),this.textureSize=t?t.copy():void 0,this.texture=void 0,this.lightShader=void 0,this.compositeShader=void 0,this.lightVAO=void 0,this.compositeVAO=void 0,s(),bn(void 0,i,o,r);function s(){if(j)return;if(!k){console.warn("LightSystemPlugin: WebGL not enabled!");return}V.textureSize||(V.textureSize=D.copy()),V.texture=g.createTexture(),g.bindTexture(g.TEXTURE_2D,V.texture),g.texImage2D(g.TEXTURE_2D,0,g.RGBA,V.textureSize.x,V.textureSize.y,0,g.RGBA,g.UNSIGNED_BYTE,null),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MAG_FILTER,g.LINEAR),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MIN_FILTER,g.LINEAR),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_S,g.CLAMP_TO_EDGE),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_T,g.CLAMP_TO_EDGE),V.lightShader=Jn(`#version 300 es
+void main(){mainImage(c,gl_FragCoord.xy);c.a=1.;}`),Lt.vao=g.createVertexArray(),g.bindVertexArray(Lt.vao),g.bindBuffer(g.ARRAY_BUFFER,In);let c=8,l=g.getAttribLocation(Lt.shader,"p");g.enableVertexAttribArray(l),g.vertexAttribPointer(l,2,g.FLOAT,!1,c,0)}function o(){Lt.shader=void 0,Lt.texture=void 0,yt("PostProcessPlugin: WebGL context lost")}function r(){i(),yt("PostProcessPlugin: WebGL context restored")}function a(){if(B||!G)return;At(),g.bindFramebuffer(g.FRAMEBUFFER,null),g.useProgram(Lt.shader),g.bindVertexArray(Lt.vao),g.pixelStorei(g.UNPACK_FLIP_Y_WEBGL,!0),g.disable(g.BLEND),g.activeTexture(g.TEXTURE0),g.bindTexture(g.TEXTURE_2D,Lt.texture),e?(Me.width=I.x,Me.height=I.y,kr(We),We.drawImage(F,0,0),F.width|=0,g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,Me)):s||g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,Q);let c=l=>g.getUniformLocation(Lt.shader,l);g.uniform1i(c("iChannel0"),0),g.uniform1f(c("iTime"),Ht),g.uniform3f(c("iResolution"),F.width,F.height,1),g.drawArrays(g.TRIANGLE_STRIP,0,4),s&&g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,Q),g.pixelStorei(g.UNPACK_FLIP_Y_WEBGL,!1),ys(!0)}}},_o=class{constructor(t,e){f(!V,"LightSystemPlugin already initialized"),f(!Lt,"LightSystemPlugin must be created before PostProcessPlugin"),V=this,this.enabled=!0,this.ambientColor=(e||et).copy(),this.textureSize=t?t.copy():void 0,this.texture=void 0,this.lightShader=void 0,this.compositeShader=void 0,this.lightVAO=void 0,this.compositeVAO=void 0,s(),vn(void 0,i,o,r);function s(){if(B)return;if(!G){console.warn("LightSystemPlugin: WebGL not enabled!");return}V.textureSize||(V.textureSize=I.copy()),V.texture=g.createTexture(),g.bindTexture(g.TEXTURE_2D,V.texture),g.texImage2D(g.TEXTURE_2D,0,g.RGBA,V.textureSize.x,V.textureSize.y,0,g.RGBA,g.UNSIGNED_BYTE,null),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MAG_FILTER,g.LINEAR),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MIN_FILTER,g.LINEAR),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_S,g.CLAMP_TO_EDGE),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_WRAP_T,g.CLAMP_TO_EDGE),V.lightShader=zn(`#version 300 es
 precision highp float;uniform mat4 m;uniform vec2 lightPos;uniform float radius;in vec2 g;out vec2 vWorldPos;void main(){vec2 worldP=lightPos+(g-.5)*2.*radius;gl_Position=m*vec4(worldP,1,1);vWorldPos=worldP;}`,`#version 300 es
-precision highp float;uniform vec2 lightPos;uniform float radius;uniform float fadeRange;uniform vec4 color;in vec2 vWorldPos;out vec4 c;void main(){float dist=distance(vWorldPos,lightPos);float t=clamp((radius-dist)/max(fadeRange,1e-6),0.,1.);c=vec4(color.rgb*t*color.a,1.);}`),V.compositeShader=Jn(`#version 300 es
+precision highp float;uniform vec2 lightPos;uniform float radius;uniform float fadeRange;uniform vec4 color;in vec2 vWorldPos;out vec4 c;void main(){float dist=distance(vWorldPos,lightPos);float t=clamp((radius-dist)/max(fadeRange,1e-6),0.,1.);c=vec4(color.rgb*t*color.a,1.);}`),V.compositeShader=zn(`#version 300 es
 precision highp float;in vec2 p;void main(){gl_Position=vec4(p+p-1.,1,1);}`,`#version 300 es
-precision highp float;uniform sampler2D s;uniform vec3 iResolution;out vec4 c;void main(){vec2 uv=gl_FragCoord.xy/iResolution.xy;c=vec4(texture(s,uv).rgb,1.);}`),V.lightVAO=g.createVertexArray(),g.bindVertexArray(V.lightVAO),g.bindBuffer(g.ARRAY_BUFFER,Mn);let a=g.getAttribLocation(V.lightShader,"g");g.enableVertexAttribArray(a),g.vertexAttribPointer(a,2,g.FLOAT,!1,8,0),V.compositeVAO=g.createVertexArray(),g.bindVertexArray(V.compositeVAO),g.bindBuffer(g.ARRAY_BUFFER,Mn);let c=g.getAttribLocation(V.compositeShader,"p");g.enableVertexAttribArray(c),g.vertexAttribPointer(c,2,g.FLOAT,!1,8,0)}function i(){if(j||!k||!V.enabled||!V.texture)return;Ct();let a=Tn,c=V.ambientColor;g.bindFramebuffer(g.FRAMEBUFFER,Or),g.framebufferTexture2D(g.FRAMEBUFFER,g.COLOR_ATTACHMENT0,g.TEXTURE_2D,V.texture,0),g.viewport(0,0,V.textureSize.x,V.textureSize.y),g.clearColor(c.r,c.g,c.b,c.a),g.clear(g.COLOR_BUFFER_BIT),as(),g.enable(g.BLEND),g.blendFunc(g.ONE,g.ONE);for(let u of xt)u.destroyed||u.renderLight();Ct(),g.bindFramebuffer(g.FRAMEBUFFER,null),g.viewport(0,0,D.x,D.y),g.useProgram(V.compositeShader),g.bindVertexArray(V.compositeVAO),g.activeTexture(g.TEXTURE0),g.bindTexture(g.TEXTURE_2D,V.texture);let l=V.compositeShader;g.uniform1i(g.getUniformLocation(l,"s"),0),g.uniform3f(g.getUniformLocation(l,"iResolution"),G.width,G.height,1),g.blendFunc(g.DST_COLOR,g.ZERO),g.drawArrays(g.TRIANGLE_STRIP,0,4),Xt&&g.bindTexture(g.TEXTURE_2D,Xt),as(a),ys(!0)}function o(){V.texture=void 0,V.lightShader=void 0,V.compositeShader=void 0,V.lightVAO=void 0,V.compositeVAO=void 0,bt("LightSystemPlugin: WebGL context lost")}function r(){s(),bt("LightSystemPlugin: WebGL context restored")}}drawLight(t){if(j||!k||!this.lightShader)return;Ct(),g.useProgram(this.lightShader),g.bindVertexArray(this.lightVAO);let e=x(2*W).divide(D),s=At.rotate(-$),i=x(-1).subtract(s.multiply(e)),o=ot($),r=tt($),a=[e.x*o,e.y*r,0,0,-e.x*r,e.y*o,0,0,1,1,1,0,i.x,i.y,0,1],c=this.lightShader;g.uniformMatrix4fv(g.getUniformLocation(c,"m"),!1,a),g.uniform2f(g.getUniformLocation(c,"lightPos"),t.pos.x,t.pos.y),g.uniform1f(g.getUniformLocation(c,"radius"),t.radius),g.uniform1f(g.getUniformLocation(c,"fadeRange"),t.fadeRange);let l=t.color;g.uniform4f(g.getUniformLocation(c,"color"),l.r,l.g,l.b,l.a),g.drawArrays(g.TRIANGLE_STRIP,0,4),ys(!0)}},_o=class extends je{constructor(t,e,s,i){super(t,x(1),void 0,0,s),f(P(e)&&e>=0,"Light radius must be a non-negative number"),f(i===void 0||P(i)&&i>=0,"Light fadeRange must be a non-negative number when provided"),this.radius=e,this.fadeRange=i===void 0?e:i}render(){}renderLight(){V&&V.drawLight(this)}},Ro=class extends ds{constructor(t){super(void 0),!(!Ut||j)&&(this.randomness=0,this.sampleChannels=Tc(...t),this.sampleRate=qn)}playMusic(t=1,e=!0){return super.play(void 0,t,1,0,e)}};zr=0;Po=class{constructor(t=at){f(!C,"UI system already initialized"),C=this,this.activateOnPress=!1,this.defaultColor=U,this.defaultLineColor=nt,this.defaultTextColor=nt,this.defaultButtonColor=Oe(0,0,.7),this.defaultHoverColor=Oe(0,0,.9),this.defaultDisabledColor=Oe(0,0,.3),this.defaultGradientColor=void 0,this.defaultLineWidth=4,this.defaultCornerRadius=0,this.defaultTextFitScale=.8,this.defaultFont=ws,this.defaultSoundPress=void 0,this.defaultSoundRelease=void 0,this.defaultSoundClick=void 0,this.defaultShadowColor=ue,this.defaultShadowBlur=5,this.defaultShadowOffset=x(5),this.nativeHeight=0,this.navigationObject=void 0,this.navigationTimer=new we(void 0,!0),this.navigationDelay=.2,this.navigationDirection=1,this.navigationMode=!1,this.uiObjects=[],this.uiContext=t,this.activeObject=void 0,this.hoverObject=void 0,this.lastHoverObject=void 0,this.confirmDialog=void 0,this._keyInputObject=void 0,this._onKeyDown=o=>{var r;return(r=this._keyInputObject)==null?void 0:r.onKeyDown(o)},bn(s,i);function e(o){let r,a;o.parent?(r=o.parent.nativePos,a=o.parent.size):(r=C.screenToNative(D.scale(.5)),a=C.nativeHeight?x(D.x*C.nativeHeight/D.y,C.nativeHeight):D);let c=o.anchor;o.nativePos=r.add(a.multiply(c).scale(.5)).subtract(o.size.multiply(c).scale(.5)).add(o.localPos)}function s(){C.activeObject&&!C.activeObject.visible&&(C.activeObject=void 0),C.lastHoverObject=C.hoverObject,C.hoverObject=void 0,cs(0)&&(C.navigationMode=!1,C.navigationObject=void 0),C.keyInputObject&&(C.activeObject=C.keyInputObject,C.hoverObject=C.keyInputObject,C.navigationMode=!1,C.navigationObject=void 0);let o=C.getNavigableObjects();if(!o.length)C.navigationObject=void 0;else if(!C.keyInputObject){if(o.includes(C.navigationObject)||(C.navigationObject=void 0),ee||C.navigationMode&&!C.navigationObject&&(C.navigationObject=o.find(a=>a.navigationAutoSelect)),!C.navigationTimer.active()){let a=Zt(C.getNavigationDirection());if(a){let c;if(C.navigationObject){let l=o.indexOf(C.navigationObject),u=te(l+a,o.length);c=o[u]}else if(c=o.find(l=>l.navigationAutoSelect),!c){let l=a>0?0:o.length-1;c=o[l]}C.navigationObject!==c&&(C.navigationMode=!0,C.hoverObject=void 0,C.navigationObject=c,C.navigationTimer.set(C.navigationDelay),c.soundPress&&c.soundPress.play())}}C.navigationObject&&C.getNavigationWasPressed()&&C.navigationObject.navigatePressed()}for(let a=C.uiObjects.length;a--;){let c=C.uiObjects[a];c.parent||r(c)}C.uiObjects=C.uiObjects.filter(a=>!a.destroyed);function r(a){if(!(a.destroyed||!a.visible)){e(a);for(let c=a.children.length;c--;){let l=a.children[c];l&&r(l)}a.destroyed||a.update()}}}function i(){let o=C.uiContext;if(o.save(),C.nativeHeight){let a=D.y/C.nativeHeight;o.translate(-a*D.x/2,0),o.scale(a,a),o.translate(D.x/2/a,0)}function r(a){if(a.visible){e(a),a.render();for(let c of a.children)r(c)}}if(C.uiObjects.forEach(a=>a.parent||r(a)),zr>0){let a=function(c,l=!0){l&&(l=!!c.visible),e(c),c.renderDebug(l);for(let u of c.children)a(u,l)};C.uiObjects.forEach(c=>c.parent||a(c))}o.restore()}}drawRect(t,e,s=U,i=0,o=nt,r=0,a,c=nt,l=0,u=x()){f(L(t),"pos must be a vec2"),f(L(e),"size must be a vec2"),f(z(s),"color must be a color"),f(P(i),"lineWidth must be a number"),f(z(o),"lineColor must be a color"),f(P(r),"cornerRadius must be a number");let h=C.uiContext;if(a){let p=h.createLinearGradient(t.x,t.y-e.y/2,t.x,t.y+e.y/2),d=s.toString();p.addColorStop(0,d),p.addColorStop(.5,a.toString()),p.addColorStop(1,d),h.fillStyle=p}else h.fillStyle=s.toString();(l||u.x||u.y)&&c.a>0&&(h.shadowColor=c.toString(),h.shadowBlur=l,h.shadowOffsetX=u.x,h.shadowOffsetY=u.y),h.beginPath(),r&&h.roundRect?h.roundRect(t.x-e.x/2,t.y-e.y/2,e.x,e.y,r):h.rect(t.x-e.x/2,t.y-e.y/2,e.x,e.y),h.fill(),h.shadowColor="#0000",i&&o.a>0&&(h.strokeStyle=o.toString(),h.lineWidth=i,h.stroke())}drawLine(t,e,s=C.defaultLineWidth,i=C.defaultLineColor){f(L(t),"posA must be a vec2"),f(L(e),"posB must be a vec2"),f(P(s),"lineWidth must be a number"),f(z(i),"lineColor must be a color");let o=C.uiContext;o.strokeStyle=i.toString(),o.lineWidth=s,o.beginPath(),o.lineTo(t.x,t.y),o.lineTo(e.x,e.y),o.stroke()}drawTile(t,e,s,i=C.defaultColor,o=0,r=!1,a=nt,c=0,l=x()){let u=C.uiContext;(c||l.x||l.y)&&a.a>0&&(u.shadowColor=a.toString(),u.shadowBlur=c,u.shadowOffsetX=l.x,u.shadowOffsetY=l.y),_t(t,e,s,i,o,r,ue,!1,!0,u),u.shadowColor="#0000"}drawText(t,e,s,i=C.defaultColor,o=C.defaultLineWidth,r=C.defaultLineColor,a="center",c=C.defaultFont,l="",u=!0,h=void 0,p=nt,d=0,y=x()){let b=C.uiContext;p.a>0&&(h&&Ke(t,e.add(h),s.y,p,o,r,a,c,l,u?s.x:void 0,0,b),(d||y.x||y.y)&&(b.shadowColor=p.toString(),b.shadowBlur=d,b.shadowOffsetX=y.x,b.shadowOffsetY=y.y)),Ke(t,e,s.y,i,o,r,a,c,l,u?s.x:void 0,0,b),b.shadowColor="#0000"}setupDragAndDrop(t,e,s,i){if(this._dragListeners)for(let[r,a]of this._dragListeners)document.removeEventListener(r,a);this._dragListeners=[];let o=(r,a)=>{let c=l=>{l.preventDefault(),r&&r(l)};document.addEventListener(a,c),this._dragListeners.push([a,c])};o(t,"drop"),o(e,"dragenter"),o(s,"dragleave"),o(i,"dragover")}screenToNative(t){if(!C.nativeHeight)return t;let e=D.y/C.nativeHeight,s=1/e,i=t.copy();return i.x+=e*D.x/2,i.x*=s,i.y*=s,i.x-=s*D.x/2,i}get keyInputObject(){return this._keyInputObject}set keyInputObject(t){let e=!!this._keyInputObject;this._keyInputObject=t,!e&&t?document.addEventListener("keydown",this._onKeyDown):e&&!t&&document.removeEventListener("keydown",this._onKeyDown)}destroyObjects(){for(let t of this.uiObjects)t.parent||t.destroy();this.uiObjects=this.uiObjects.filter(t=>!t.destroyed),this.activeObject=void 0,this.hoverObject=void 0,this.lastHoverObject=void 0,this.keyInputObject=void 0}getNavigableObjects(){function t(s){if(!(!s.visible||s.disabled)){s.isInteractive()&&s.navigationIndex!==void 0&&e.push(s);for(let i=s.children.length;i--;)t(s.children[i])}}let e=[];for(let s=C.uiObjects.length;s--;){let i=C.uiObjects[s];C.confirmDialog&&i!==C.confirmDialog||i.parent||t(i)}return e.sort((s,i)=>s.navigationIndex-i.navigationIndex),e}getNavigationDirection(){let t=C.navigationDirection===1,e=C.navigationDirection===2;if(In){let l=ls(0,yt),u=po(yt);return e?-(l.y||u.y)||l.x||u.x:t?-(l.y||u.y):l.x||u.x}let s="ArrowUp",i="ArrowDown",o="ArrowLeft",r="ArrowRight";if(e)return Et(s)||Et(o)?-1:Et(i)||Et(r)?1:0;let a=t?s:o,c=t?i:r;return Et(a)?-1:Et(c)?1:0}getNavigationOtherDirection(){if(C.navigationDirection===2)return 0;let t=C.navigationDirection===1;if(In){let i=ls(0,yt),o=po(yt);return t?i.x||o.x:i.y||o.y}let e=t?"ArrowLeft":"ArrowUp",s=t?"ArrowRight":"ArrowDown";return Et(e)?-1:Et(s)?1:0}getNavigationWasPressed(){return In?Ar(0,yt):Ot("Space")||Ot("Enter")}showConfirmDialog(t="Are you sure?",e,s,i=x(500,250),o="Escape"){f(!C.confirmDialog);let r=C.navigationDirection;C.navigationDirection=2;let a=new se(x(),i);C.confirmDialog=a,a.onRender=()=>{let d=Oe(0,0,0,.7);C.drawRect(x(),x(1e9),d)},a.onUpdate=()=>{Ot(o)&&p()},a.isMouseOverlapping=()=>!0;let c=50,l=new gi(x(0,-50),x(i.x-c,70),t);a.addChild(l);let u=new vs(x(-80,50),x(120,70),"Yes");u.textHeight=40,u.navigationIndex=1,u.hoverColor=Oe(0,1,.5),u.onClick=()=>{p(),e&&e()},a.addChild(u);let h=new vs(x(80,50),x(120,70),"No");h.textHeight=40,h.navigationIndex=2,h.navigationAutoSelect=!0,h.onClick=()=>{p(),s&&s()},a.addChild(h);function p(){f(C.confirmDialog===a),a.destroy(),C.confirmDialog=void 0,C.navigationDirection=r,Ps()}}},se=class{constructor(t=x(),e=x()){var s,i;f(L(t),"ui object pos must be a vec2"),f(L(e),"ui object size must be a vec2"),this.localPos=t.copy(),this.nativePos=t.copy(),this.size=e.copy(),this.color=C.defaultColor.copy(),this.activeColor=void 0,this.text=void 0,this.disabledColor=C.defaultDisabledColor.copy(),this.disabled=!1,this.textColor=C.defaultTextColor.copy(),this.hoverColor=C.defaultHoverColor.copy(),this.lineColor=C.defaultLineColor.copy(),this.gradientColor=C.defaultGradientColor?C.defaultGradientColor.copy():void 0,this.lineWidth=C.defaultLineWidth,this.cornerRadius=C.defaultCornerRadius,this.font=C.defaultFont,this.fontStyle=void 0,this.textWidth=void 0,this.textHeight=void 0,this.textFitScale=C.defaultTextFitScale,this.textShadow=void 0,this.textLineColor=C.defaultLineColor.copy(),this.textLineWidth=0,this.visible=!0,this.children=[],this.parent=void 0,this.extraTouchSize=0,this.soundPress=C.defaultSoundPress,this.soundRelease=C.defaultSoundRelease,this.soundClick=C.defaultSoundClick,this.interactive=!1,this.dragActivate=!1,this.canBeHover=!0,this.shadowColor=(s=C.defaultShadowColor)==null?void 0:s.copy(),this.shadowBlur=C.defaultShadowBlur,this.shadowOffset=(i=C.defaultShadowOffset)==null?void 0:i.copy(),this.navigationIndex=void 0,this.navigationAutoSelect=!1,this.anchor=x(),C.uiObjects.push(this)}addChild(t){return f(!t.parent&&!this.children.includes(t)),this.children.push(t),t.parent=this,t}removeChild(t){f(t.parent===this&&this.children.includes(t)),this.children.splice(this.children.indexOf(t),1),t.parent=void 0}destroy(){var t;if(!this.destroyed){C.activeObject===this&&(C.activeObject=void 0),C.hoverObject===this&&(C.hoverObject=void 0),C.lastHoverObject===this&&(C.lastHoverObject=void 0),C.navigationObject===this&&(C.navigationObject=void 0),C.keyInputObject===this&&(C.keyInputObject=void 0),this.destroyed=1,(t=this.parent)==null||t.removeChild(this);for(let e of this.children)e.parent=void 0,e.destroy();this.children.length=0}}isMouseOverlapping(){if(!ti)return!1;let t=ee?this.size.add(x(this.extraTouchSize||0)):this.size,e=C.screenToNative(jt);return Hs(this.nativePos,t,e)}update(){if(this.onUpdate(),this.disabled&&(this===C.activeObject&&(C.activeObject=void 0),this===C.keyInputObject&&(C.keyInputObject=void 0)),C.keyInputObject)return;let t=C.lastHoverObject===this,e=this.isActiveObject(),s=ns(0),i=this.dragActivate?s:cs(0);this.canBeHover&&(C.navigationMode||(i||e||!s&&!ee)&&!C.hoverObject&&this.isMouseOverlapping()&&(C.hoverObject=this)),this.isHoverObject()&&(this.disabled||(i&&this.interactive&&((!this.dragActivate||!t||cs(0))&&this.onPress(),this.soundPress&&this.soundPress.play(),C.activeObject&&!e&&C.activeObject.onRelease(),C.activeObject=this,C.activateOnPress&&this.click(!this.soundPress)),C.activateOnPress||!s&&this.isActiveObject()&&this.interactive&&this.click()),i&&wr(0,0,0,1,0)),e&&(!s||this.dragActivate&&!this.isHoverObject())&&(this.onRelease(),this.soundRelease&&this.soundRelease.play(),C.activeObject=void 0),this.isHoverObject()!==t&&(this.isHoverObject()?this.onEnter():this.onLeave())}render(){if(this.onRender(),!this.size.x||!this.size.y)return;let t=this.isNavigationObject(),e=t?this.color:this.interactive&&this.isActiveObject()&&!this.disabled?this.color:this.lineColor,s=t?this.hoverColor:this.disabled?this.disabledColor:this.interactive?this.isActiveObject()?this.activeColor||this.hoverColor:this.isHoverObject()?this.hoverColor:this.color:this.color,i=this.lineWidth*(t?1.5:1);C.drawRect(this.nativePos,this.size,s,i,e,this.cornerRadius,this.gradientColor,this.shadowColor,this.shadowBlur,this.shadowOffset)}getTextSize(){return x(this.textWidth||this.textFitScale*this.size.x,this.textHeight||this.textFitScale*this.size.y)}navigatePressed(){this.click()}isHoverObject(){return C.hoverObject===this}isActiveObject(){return C.activeObject===this}isNavigationObject(){return C.navigationObject===this}isKeyInputObject(){return C.keyInputObject===this}isInteractive(){return this.interactive&&this.visible&&!this.disabled}toString(){let t="type = "+this.constructor.name;return this.text&&(t+=`
+precision highp float;uniform sampler2D s;uniform vec3 iResolution;out vec4 c;void main(){vec2 uv=gl_FragCoord.xy/iResolution.xy;c=vec4(texture(s,uv).rgb,1.);}`),V.lightVAO=g.createVertexArray(),g.bindVertexArray(V.lightVAO),g.bindBuffer(g.ARRAY_BUFFER,In);let a=g.getAttribLocation(V.lightShader,"g");g.enableVertexAttribArray(a),g.vertexAttribPointer(a,2,g.FLOAT,!1,8,0),V.compositeVAO=g.createVertexArray(),g.bindVertexArray(V.compositeVAO),g.bindBuffer(g.ARRAY_BUFFER,In);let c=g.getAttribLocation(V.compositeShader,"p");g.enableVertexAttribArray(c),g.vertexAttribPointer(c,2,g.FLOAT,!1,8,0)}function i(){if(B||!G||!V.enabled||!V.texture)return;At();let a=En,c=V.ambientColor;g.bindFramebuffer(g.FRAMEBUFFER,Or),g.framebufferTexture2D(g.FRAMEBUFFER,g.COLOR_ATTACHMENT0,g.TEXTURE_2D,V.texture,0),g.viewport(0,0,V.textureSize.x,V.textureSize.y),g.clearColor(c.r,c.g,c.b,c.a),g.clear(g.COLOR_BUFFER_BIT),as(),g.enable(g.BLEND),g.blendFunc(g.ONE,g.ONE);for(let u of mt)u.destroyed||u.renderLight();At(),g.bindFramebuffer(g.FRAMEBUFFER,null),g.viewport(0,0,I.x,I.y),g.useProgram(V.compositeShader),g.bindVertexArray(V.compositeVAO),g.activeTexture(g.TEXTURE0),g.bindTexture(g.TEXTURE_2D,V.texture);let l=V.compositeShader;g.uniform1i(g.getUniformLocation(l,"s"),0),g.uniform3f(g.getUniformLocation(l,"iResolution"),F.width,F.height,1),g.blendFunc(g.DST_COLOR,g.ZERO),g.drawArrays(g.TRIANGLE_STRIP,0,4),Xt&&g.bindTexture(g.TEXTURE_2D,Xt),as(a),ys(!0)}function o(){V.texture=void 0,V.lightShader=void 0,V.compositeShader=void 0,V.lightVAO=void 0,V.compositeVAO=void 0,yt("LightSystemPlugin: WebGL context lost")}function r(){s(),yt("LightSystemPlugin: WebGL context restored")}}drawLight(t){if(B||!G||!this.lightShader)return;At(),g.useProgram(this.lightShader),g.bindVertexArray(this.lightVAO);let e=b(2*W).divide(I),s=Tt.rotate(-Y),i=b(-1).subtract(s.multiply(e)),o=at(Y),r=tt(Y),a=[e.x*o,e.y*r,0,0,-e.x*r,e.y*o,0,0,1,1,1,0,i.x,i.y,0,1],c=this.lightShader;g.uniformMatrix4fv(g.getUniformLocation(c,"m"),!1,a),g.uniform2f(g.getUniformLocation(c,"lightPos"),t.pos.x,t.pos.y),g.uniform1f(g.getUniformLocation(c,"radius"),t.radius),g.uniform1f(g.getUniformLocation(c,"fadeRange"),t.fadeRange);let l=t.color;g.uniform4f(g.getUniformLocation(c,"color"),l.r,l.g,l.b,l.a),g.drawArrays(g.TRIANGLE_STRIP,0,4),ys(!0)}},Co=class extends Fe{constructor(t,e,s,i){super(t,b(1),void 0,0,s),f(P(e)&&e>=0,"Light radius must be a non-negative number"),f(i===void 0||P(i)&&i>=0,"Light fadeRange must be a non-negative number when provided"),this.radius=e,this.fadeRange=i===void 0?e:i}render(){}renderLight(){V&&V.drawLight(this)}},Ro=class extends ds{constructor(t){super(void 0),!(!Jt||B)&&(this.randomness=0,this.sampleChannels=Tc(...t),this.sampleRate=Wn)}playMusic(t=1,e=!0){return super.play(void 0,t,1,0,e)}};zr=0;Po=class{constructor(t=ct){f(!E,"UI system already initialized"),E=this,this.activateOnPress=!1,this.defaultColor=U,this.defaultLineColor=et,this.defaultTextColor=et,this.defaultButtonColor=Le(0,0,.7),this.defaultHoverColor=Le(0,0,.9),this.defaultDisabledColor=Le(0,0,.3),this.defaultGradientColor=void 0,this.defaultLineWidth=4,this.defaultCornerRadius=0,this.defaultTextFitScale=.8,this.defaultFont=ws,this.defaultSoundPress=void 0,this.defaultSoundRelease=void 0,this.defaultSoundClick=void 0,this.defaultShadowColor=ue,this.defaultShadowBlur=5,this.defaultShadowOffset=b(5),this.nativeHeight=0,this.navigationObject=void 0,this.navigationTimer=new Se(void 0,!0),this.navigationDelay=.2,this.navigationDirection=1,this.navigationMode=!1,this.uiObjects=[],this.uiContext=t,this.activeObject=void 0,this.hoverObject=void 0,this.lastHoverObject=void 0,this.confirmDialog=void 0,this._keyInputObject=void 0,this._onKeyDown=o=>{var r;return(r=this._keyInputObject)==null?void 0:r.onKeyDown(o)},vn(s,i);function e(o){let r,a;o.parent?(r=o.parent.nativePos,a=o.parent.size):(r=E.screenToNative(I.scale(.5)),a=E.nativeHeight?b(I.x*E.nativeHeight/I.y,E.nativeHeight):I);let c=o.anchor;o.nativePos=r.add(a.multiply(c).scale(.5)).subtract(o.size.multiply(c).scale(.5)).add(o.localPos)}function s(){E.activeObject&&!E.activeObject.visible&&(E.activeObject=void 0),E.lastHoverObject=E.hoverObject,E.hoverObject=void 0,cs(0)&&(E.navigationMode=!1,E.navigationObject=void 0),E.keyInputObject&&(E.activeObject=E.keyInputObject,E.hoverObject=E.keyInputObject,E.navigationMode=!1,E.navigationObject=void 0);let o=E.getNavigableObjects();if(!o.length)E.navigationObject=void 0;else if(!E.keyInputObject){if(o.includes(E.navigationObject)||(E.navigationObject=void 0),Zt||E.navigationMode&&!E.navigationObject&&(E.navigationObject=o.find(a=>a.navigationAutoSelect)),!E.navigationTimer.active()){let a=Kt(E.getNavigationDirection());if(a){let c;if(E.navigationObject){let l=o.indexOf(E.navigationObject),u=Qt(l+a,o.length);c=o[u]}else if(c=o.find(l=>l.navigationAutoSelect),!c){let l=a>0?0:o.length-1;c=o[l]}E.navigationObject!==c&&(E.navigationMode=!0,E.hoverObject=void 0,E.navigationObject=c,E.navigationTimer.set(E.navigationDelay),c.soundPress&&c.soundPress.play())}}E.navigationObject&&E.getNavigationWasPressed()&&E.navigationObject.navigatePressed()}for(let a=E.uiObjects.length;a--;){let c=E.uiObjects[a];c.parent||r(c)}E.uiObjects=E.uiObjects.filter(a=>!a.destroyed);function r(a){if(!(a.destroyed||!a.visible)){e(a);for(let c=a.children.length;c--;){let l=a.children[c];l&&r(l)}a.destroyed||a.update()}}}function i(){let o=E.uiContext;if(o.save(),E.nativeHeight){let a=I.y/E.nativeHeight;o.translate(-a*I.x/2,0),o.scale(a,a),o.translate(I.x/2/a,0)}function r(a){if(a.visible){e(a),a.render();for(let c of a.children)r(c)}}if(E.uiObjects.forEach(a=>a.parent||r(a)),zr>0){let a=function(c,l=!0){l&&(l=!!c.visible),e(c),c.renderDebug(l);for(let u of c.children)a(u,l)};E.uiObjects.forEach(c=>c.parent||a(c))}o.restore()}}drawRect(t,e,s=U,i=0,o=et,r=0,a,c=et,l=0,u=b()){f(L(t),"pos must be a vec2"),f(L(e),"size must be a vec2"),f(z(s),"color must be a color"),f(P(i),"lineWidth must be a number"),f(z(o),"lineColor must be a color"),f(P(r),"cornerRadius must be a number");let h=E.uiContext;if(a){let p=h.createLinearGradient(t.x,t.y-e.y/2,t.x,t.y+e.y/2),d=s.toString();p.addColorStop(0,d),p.addColorStop(.5,a.toString()),p.addColorStop(1,d),h.fillStyle=p}else h.fillStyle=s.toString();(l||u.x||u.y)&&c.a>0&&(h.shadowColor=c.toString(),h.shadowBlur=l,h.shadowOffsetX=u.x,h.shadowOffsetY=u.y),h.beginPath(),r&&h.roundRect?h.roundRect(t.x-e.x/2,t.y-e.y/2,e.x,e.y,r):h.rect(t.x-e.x/2,t.y-e.y/2,e.x,e.y),h.fill(),h.shadowColor="#0000",i&&o.a>0&&(h.strokeStyle=o.toString(),h.lineWidth=i,h.stroke())}drawLine(t,e,s=E.defaultLineWidth,i=E.defaultLineColor){f(L(t),"posA must be a vec2"),f(L(e),"posB must be a vec2"),f(P(s),"lineWidth must be a number"),f(z(i),"lineColor must be a color");let o=E.uiContext;o.strokeStyle=i.toString(),o.lineWidth=s,o.beginPath(),o.lineTo(t.x,t.y),o.lineTo(e.x,e.y),o.stroke()}drawTile(t,e,s,i=E.defaultColor,o=0,r=!1,a=et,c=0,l=b()){let u=E.uiContext;(c||l.x||l.y)&&a.a>0&&(u.shadowColor=a.toString(),u.shadowBlur=c,u.shadowOffsetX=l.x,u.shadowOffsetY=l.y),Rt(t,e,s,i,o,r,ue,!1,!0,u),u.shadowColor="#0000"}drawText(t,e,s,i=E.defaultColor,o=E.defaultLineWidth,r=E.defaultLineColor,a="center",c=E.defaultFont,l="",u=!0,h=void 0,p=et,d=0,y=b()){let x=E.uiContext;p.a>0&&(h&&$e(t,e.add(h),s.y,p,o,r,a,c,l,u?s.x:void 0,0,x),(d||y.x||y.y)&&(x.shadowColor=p.toString(),x.shadowBlur=d,x.shadowOffsetX=y.x,x.shadowOffsetY=y.y)),$e(t,e,s.y,i,o,r,a,c,l,u?s.x:void 0,0,x),x.shadowColor="#0000"}setupDragAndDrop(t,e,s,i){if(this._dragListeners)for(let[r,a]of this._dragListeners)document.removeEventListener(r,a);this._dragListeners=[];let o=(r,a)=>{let c=l=>{l.preventDefault(),r&&r(l)};document.addEventListener(a,c),this._dragListeners.push([a,c])};o(t,"drop"),o(e,"dragenter"),o(s,"dragleave"),o(i,"dragover")}screenToNative(t){if(!E.nativeHeight)return t;let e=I.y/E.nativeHeight,s=1/e,i=t.copy();return i.x+=e*I.x/2,i.x*=s,i.y*=s,i.x-=s*I.x/2,i}get keyInputObject(){return this._keyInputObject}set keyInputObject(t){let e=!!this._keyInputObject;this._keyInputObject=t,!e&&t?document.addEventListener("keydown",this._onKeyDown):e&&!t&&document.removeEventListener("keydown",this._onKeyDown)}destroyObjects(){for(let t of this.uiObjects)t.parent||t.destroy();this.uiObjects=this.uiObjects.filter(t=>!t.destroyed),this.activeObject=void 0,this.hoverObject=void 0,this.lastHoverObject=void 0,this.keyInputObject=void 0}getNavigableObjects(){function t(s){if(!(!s.visible||s.disabled)){s.isInteractive()&&s.navigationIndex!==void 0&&e.push(s);for(let i=s.children.length;i--;)t(s.children[i])}}let e=[];for(let s=E.uiObjects.length;s--;){let i=E.uiObjects[s];E.confirmDialog&&i!==E.confirmDialog||i.parent||t(i)}return e.sort((s,i)=>s.navigationIndex-i.navigationIndex),e}getNavigationDirection(){let t=E.navigationDirection===1,e=E.navigationDirection===2;if(Dn){let l=ls(0,ft),u=po(ft);return e?-(l.y||u.y)||l.x||u.x:t?-(l.y||u.y):l.x||u.x}let s="ArrowUp",i="ArrowDown",o="ArrowLeft",r="ArrowRight";if(e)return Ct(s)||Ct(o)?-1:Ct(i)||Ct(r)?1:0;let a=t?s:o,c=t?i:r;return Ct(a)?-1:Ct(c)?1:0}getNavigationOtherDirection(){if(E.navigationDirection===2)return 0;let t=E.navigationDirection===1;if(Dn){let i=ls(0,ft),o=po(ft);return t?i.x||o.x:i.y||o.y}let e=t?"ArrowLeft":"ArrowUp",s=t?"ArrowRight":"ArrowDown";return Ct(e)?-1:Ct(s)?1:0}getNavigationWasPressed(){return Dn?Ar(0,ft):Ot("Space")||Ot("Enter")}showConfirmDialog(t="Are you sure?",e,s,i=b(500,250),o="Escape"){f(!E.confirmDialog);let r=E.navigationDirection;E.navigationDirection=2;let a=new ee(b(),i);E.confirmDialog=a,a.onRender=()=>{let d=Le(0,0,0,.7);E.drawRect(b(),b(1e9),d)},a.onUpdate=()=>{Ot(o)&&p()},a.isMouseOverlapping=()=>!0;let c=50,l=new gi(b(0,-50),b(i.x-c,70),t);a.addChild(l);let u=new vs(b(-80,50),b(120,70),"Yes");u.textHeight=40,u.navigationIndex=1,u.hoverColor=Le(0,1,.5),u.onClick=()=>{p(),e&&e()},a.addChild(u);let h=new vs(b(80,50),b(120,70),"No");h.textHeight=40,h.navigationIndex=2,h.navigationAutoSelect=!0,h.onClick=()=>{p(),s&&s()},a.addChild(h);function p(){f(E.confirmDialog===a),a.destroy(),E.confirmDialog=void 0,E.navigationDirection=r,Ps()}}},ee=class{constructor(t=b(),e=b()){var s,i;f(L(t),"ui object pos must be a vec2"),f(L(e),"ui object size must be a vec2"),this.localPos=t.copy(),this.nativePos=t.copy(),this.size=e.copy(),this.color=E.defaultColor.copy(),this.activeColor=void 0,this.text=void 0,this.disabledColor=E.defaultDisabledColor.copy(),this.disabled=!1,this.textColor=E.defaultTextColor.copy(),this.hoverColor=E.defaultHoverColor.copy(),this.lineColor=E.defaultLineColor.copy(),this.gradientColor=E.defaultGradientColor?E.defaultGradientColor.copy():void 0,this.lineWidth=E.defaultLineWidth,this.cornerRadius=E.defaultCornerRadius,this.font=E.defaultFont,this.fontStyle=void 0,this.textWidth=void 0,this.textHeight=void 0,this.textFitScale=E.defaultTextFitScale,this.textShadow=void 0,this.textLineColor=E.defaultLineColor.copy(),this.textLineWidth=0,this.visible=!0,this.children=[],this.parent=void 0,this.extraTouchSize=0,this.soundPress=E.defaultSoundPress,this.soundRelease=E.defaultSoundRelease,this.soundClick=E.defaultSoundClick,this.interactive=!1,this.dragActivate=!1,this.canBeHover=!0,this.shadowColor=(s=E.defaultShadowColor)==null?void 0:s.copy(),this.shadowBlur=E.defaultShadowBlur,this.shadowOffset=(i=E.defaultShadowOffset)==null?void 0:i.copy(),this.navigationIndex=void 0,this.navigationAutoSelect=!1,this.anchor=b(),E.uiObjects.push(this)}addChild(t){return f(!t.parent&&!this.children.includes(t)),this.children.push(t),t.parent=this,t}removeChild(t){f(t.parent===this&&this.children.includes(t)),this.children.splice(this.children.indexOf(t),1),t.parent=void 0}destroy(){var t;if(!this.destroyed){E.activeObject===this&&(E.activeObject=void 0),E.hoverObject===this&&(E.hoverObject=void 0),E.lastHoverObject===this&&(E.lastHoverObject=void 0),E.navigationObject===this&&(E.navigationObject=void 0),E.keyInputObject===this&&(E.keyInputObject=void 0),this.destroyed=1,(t=this.parent)==null||t.removeChild(this);for(let e of this.children)e.parent=void 0,e.destroy();this.children.length=0}}isMouseOverlapping(){if(!ti)return!1;let t=Zt?this.size.add(b(this.extraTouchSize||0)):this.size,e=E.screenToNative(Ft);return Hs(this.nativePos,t,e)}update(){if(this.onUpdate(),this.disabled&&(this===E.activeObject&&(E.activeObject=void 0),this===E.keyInputObject&&(E.keyInputObject=void 0)),E.keyInputObject)return;let t=E.lastHoverObject===this,e=this.isActiveObject(),s=ns(0),i=this.dragActivate?s:cs(0);this.canBeHover&&(E.navigationMode||(i||e||!s&&!Zt)&&!E.hoverObject&&this.isMouseOverlapping()&&(E.hoverObject=this)),this.isHoverObject()&&(this.disabled||(i&&this.interactive&&((!this.dragActivate||!t||cs(0))&&this.onPress(),this.soundPress&&this.soundPress.play(),E.activeObject&&!e&&E.activeObject.onRelease(),E.activeObject=this,E.activateOnPress&&this.click(!this.soundPress)),E.activateOnPress||!s&&this.isActiveObject()&&this.interactive&&this.click()),i&&wr(0,0,0,1,0)),e&&(!s||this.dragActivate&&!this.isHoverObject())&&(this.onRelease(),this.soundRelease&&this.soundRelease.play(),E.activeObject=void 0),this.isHoverObject()!==t&&(this.isHoverObject()?this.onEnter():this.onLeave())}render(){if(this.onRender(),!this.size.x||!this.size.y)return;let t=this.isNavigationObject(),e=t?this.color:this.interactive&&this.isActiveObject()&&!this.disabled?this.color:this.lineColor,s=t?this.hoverColor:this.disabled?this.disabledColor:this.interactive?this.isActiveObject()?this.activeColor||this.hoverColor:this.isHoverObject()?this.hoverColor:this.color:this.color,i=this.lineWidth*(t?1.5:1);E.drawRect(this.nativePos,this.size,s,i,e,this.cornerRadius,this.gradientColor,this.shadowColor,this.shadowBlur,this.shadowOffset)}getTextSize(){return b(this.textWidth||this.textFitScale*this.size.x,this.textHeight||this.textFitScale*this.size.y)}navigatePressed(){this.click()}isHoverObject(){return E.hoverObject===this}isActiveObject(){return E.activeObject===this}isNavigationObject(){return E.navigationObject===this}isKeyInputObject(){return E.keyInputObject===this}isInteractive(){return this.interactive&&this.visible&&!this.disabled}toString(){let t="type = "+this.constructor.name;return this.text&&(t+=`
 text = `+this.text),(this.nativePos.x||this.nativePos.y)&&(t+=`
 nativePos = `+this.nativePos),(this.localPos.x||this.localPos.y)&&(t+=`
 localPos = `+this.localPos),(this.size.x||this.size.y)&&(t+=`
 size = `+this.size),this.color&&(t+=`
-color = `+this.color),t}renderDebug(t=!0){let e=t?this.isHoverObject()?Xa:this.disabled?Ka:this.interactive?nr:$a:Ya;C.drawRect(this.nativePos,this.size,ue,4,e)}click(t=!0){this.onClick(),t&&this.soundClick&&this.soundClick.play()}onUpdate(){}onRender(){}onEnter(){}onLeave(){}onPress(){}onRelease(){}onClick(){}onChange(){}},gi=class extends se{constructor(t,e,s="",i="center",o=C.defaultFont){super(t,e),f(J(s),"ui text must be a string"),f(["left","center","right"].includes(i),"ui text align must be left, center, or right"),f(J(o),"ui text font must be a string"),this.text=s,this.align=i,this.font=o,this.canBeHover=!1,this.color=ue,this.shadowColor=ue,this.gradientColor=void 0,this.lineWidth=0,this.textFitScale=1}render(){super.render();let t=this.getTextSize();C.drawText(this.text,this.nativePos,t,this.textColor,this.textLineWidth,this.textLineColor,this.align,this.font,this.fontStyle,!0,this.textShadow,this.shadowColor,this.shadowBlur,this.shadowOffset)}},Lo=class extends se{constructor(t,e,s=""){super(t,e),f(J(s),"ui text must be a string"),this.maxLength=0,this.text=s,this.interactive=!0,this.canBeHover=!0}click(){C.keyInputObject=this,this.onClick()}stopEditing(){this.isKeyInputObject()&&(this.soundRelease&&this.soundRelease.play(),C.activeObject=void 0,C.keyInputObject=void 0,this.onChange())}onKeyDown(t){let e=t.code,s=t.key;e==="Backspace"?this.text=this.text.slice(0,-1):e==="Enter"||e==="Escape"?this.stopEditing():s.length===1&&(!this.maxLength||this.text.lengththis.size.y,s=e?this.size.y:this.size.x,i=e?this.size.x:this.size.y,o=e?this.nativePos.x:this.nativePos.y,r=i-s,a=o-r/2,c=o+r/2,l=C.screenToNative(jt);this.value=e?Mt(l.x,a,c):Mt(l.y,c,a)}else if(this.isNavigationObject()){let e=C.getNavigationOtherDirection();C.navigationTimer.active()||(this.value=F(this.value+e*.01))}this.value===t||this.onChange()}render(){super.render();let t=this.size.x>this.size.y,e=t?this.size.x:this.size.y,s=t?this.size.y:this.size.x;if(this.fillMode){let o=K(s,this.cornerRadius*2),r=zt(o,e,this.value),a=(r-e)*(t?.5:-.5),c=this.nativePos.add(t?x(a,0):x(0,a)),l=this.disabled?this.disabledColor:this.handleColor,u=t?x(r,this.size.y):x(this.size.x,r);C.drawRect(c,u,l,this.lineWidth,this.lineColor,this.cornerRadius,this.gradientColor)}else{let o=F(t?this.value:1-this.value),r=(e-s)*(o-.5),a=this.nativePos.add(t?x(r,0):x(0,r)),c=this.disabled?this.disabledColor:this.handleColor,l=x(s);C.drawRect(a,l,c,this.lineWidth,this.lineColor,this.cornerRadius,this.gradientColor)}let i=this.getTextSize();C.drawText(this.text,this.nativePos,i,this.textColor,this.textLineWidth,this.textLineColor,this.align,this.font,this.fontStyle,!0,this.textShadow)}navigatePressed(){this.value=this.value?0:1,this.onChange(),this.onRelease(),super.navigatePressed()}},Mo=class extends se{constructor(t,e,s,i=!1,o=!1,r=1){super(t,e||x()),f(J(s),"video src must be a string"),f(P(r),"video volume must be a number"),this.color=nt,this.cornerRadius=0,this.volume=r,this.video=document.createElement("video"),this.video.loop=o,this.video.volume=F(r*fn),this.video.muted=!Ut,this.video.style.display="none",this.video.src=s,document.body.appendChild(this.video),i&&this.play()}async play(){try{await this.video.play()}catch{}}pause(){this.video.pause()}stop(){this.video.pause(),this.video.currentTime=0}isLoading(){return this.video.readyState=1,"ui layout columns must be a number >= 1"),f(P(s),"ui layout gap must be a number"),f(P(i),"ui layout padding must be a number"),this.columns=e,this.gap=s,this.padding=i,o&&(this.color=ue,this.gradientColor=void 0,this.lineWidth=0,this.shadowColor=ue),this.relayout()}addChild(t){return super.addChild(t),this.relayout(),t}removeChild(t){super.removeChild(t),this.relayout()}relayout(){let t=this.children.length;if(!t){this.size=x(this.padding*2);return}let e=this.columns,s=is(t/e),i=new Array(e).fill(0),o=new Array(s).fill(0);for(let p=0;p=0&&m.objects.splice(t,1),super.destroy()}updatePhysics(){}render(){this.tileInfo?super.render():this.drawFixtures(this.color,this.lineColor,this.lineWidth)}renderDebugInfo(){let t=!this.getIsAwake(),e=this.getBodyType()===m.bodyTypeStatic,s=B(t?1:0,t?1:0,e?1:0,.5);this.drawFixtures(s)}drawFixtures(t=U,e=nt,s=.1,i,o){this.getFixtureList().forEach(r=>{m.castShapeObject(r.GetShape()).GetType()!==m.instance.b2Shape.e_edge&&m.drawFixture(r,this.pos,this.angle,t,e,s,i,o)}),this.edgeLists.forEach(r=>fo(r,s,e,!1,this.pos,this.angle)),this.edgeLoops.forEach(r=>fo(r,s,e,!0,this.pos,this.angle))}beginContact(t){}endContact(t){}addShape(t,e=1,s=.2,i=0,o=!1){f(P(e),"density must be a number"),f(P(s),"friction must be a number"),f(P(i),"restitution must be a number");let r=new m.instance.b2FixtureDef;return r.set_shape(t),r.set_density(e),r.set_friction(s),r.set_restitution(i),r.set_isSensor(o),this.body.CreateFixture(r)}addBox(t=x(1),e=x(),s=0,i,o,r,a){f(L(t),"size must be a Vector2"),f(t.x>0&&t.y>0,"size must be positive"),f(L(e),"offset must be a Vector2"),f(P(s),"angle must be a number");let c=new m.instance.b2PolygonShape;return c.SetAsBox(t.x/2,t.y/2,m.vec2dTo(e),-s),this.addShape(c,i,o,r,a)}addPoly(t,e,s,i,o){f(ce(t),"points must be an array");function r(c){f(3<=c.length&&c.length<=8);let l=m.instance._malloc(c.length*8);for(let p=0,d=0;p>2]=c[p].x,d+=4,m.instance.HEAPF32[l+d>>2]=c[p].y,d+=4;let u=m.instance.wrapPointer(l,m.instance.b2Vec2),h=new m.instance.b2PolygonShape;return h.Set(u,c.length),m.instance._free(l),h}let a=r(t);return this.addShape(a,e,s,i,o)}addRegularPoly(t=1,e=8,s,i,o,r){f(P(t)&&t>0,"diameter must be a positive number"),f(P(e)&&e>2,"sides must be a positive number greater than 2");let a=[],c=t/2;for(let l=e;l--;)a.push(x(c,0).rotate((l+.5)/e*q*2));return this.addPoly(a,s,i,o,r)}addRandomPoly(t=1,e,s,i,o){f(P(t)&&t>0,"diameter must be a positive number");let r=er(3,9),a=[],c=t/2;for(let l=r;l--;)a.push(x(dt(c/2,c*1.5),0).rotate(l/r*q*2));return this.addPoly(a,e,s,i,o)}addCircle(t=1,e=x(),s,i,o,r){f(P(t)&&t>0,"diameter must be a positive number"),f(L(e),"offset must be a Vector2");let a=new m.instance.b2CircleShape;return a.set_m_p(m.vec2dTo(e)),a.set_m_radius(t/2),this.addShape(a,s,i,o,r)}addEdge(t,e,s,i,o,r){f(L(t),"point1 must be a Vector2"),f(L(e),"point2 must be a Vector2");let a=new m.instance.b2EdgeShape;return a.Set(m.vec2dTo(t),m.vec2dTo(e)),this.addShape(a,s,i,o,r)}addEdgeList(t,e,s,i,o){f(ce(t),"points must be an array");let r=[],a=[];for(let c=0;ct[te(l,t.length)];for(let l=0;lthis.destroyFixture(t))}getCenterOfMass(){return m.vec2From(this.body.GetWorldCenter())}getLinearVelocity(){return m.vec2From(this.body.GetLinearVelocity())}getAngularVelocity(){return this.body.GetAngularVelocity()}getMass(){return this.body.GetMass()}getInertia(){return this.body.GetInertia()}getIsAwake(){return this.body.IsAwake()}getBodyType(){return this.body.GetType()}getSpeed(){return this.getLinearVelocity().length()}setTransform(t,e){this.pos=t,this.angle=e,this.body.SetTransform(m.vec2dTo(t),-e)}setPosition(t){this.setTransform(t,this.body.GetAngle())}setAngle(t){this.setTransform(m.vec2From(this.body.GetPosition()),t)}setLinearVelocity(t){this.body.SetLinearVelocity(m.vec2dTo(t))}setAngularVelocity(t){this.body.SetAngularVelocity(t)}setLinearDamping(t){this.body.SetLinearDamping(t)}setAngularDamping(t){this.body.SetAngularDamping(t)}setGravityScale(t=1){this.body.SetGravityScale(this.gravityScale=t)}setBullet(t=!0){this.body.SetBullet(t)}setAwake(t=!0){this.body.SetAwake(t)}setBodyType(t){this.body.SetType(t)}setSleepingAllowed(t=!0){this.body.SetSleepingAllowed(t)}setFixedRotation(t=!0){this.body.SetFixedRotation(t)}setCenterOfMass(t){this.setMassData(t)}setMass(t){this.setMassData(void 0,t)}setMomentOfInertia(t){this.setMassData(void 0,void 0,t)}resetMassData(){this.body.ResetMassData()}setMassData(t,e,s){let i=new m.instance.b2MassData;this.body.GetMassData(i),t!==void 0&&i.set_center(m.vec2dTo(t)),e!==void 0&&i.set_mass(e),s!==void 0&&i.set_I(s),this.body.SetMassData(i)}setFilterData(t=0,e=0,s=0){this.getFixtureList().forEach(i=>{let o=i.GetFilterData();o.set_categoryBits(t),o.set_maskBits(65535&~e),o.set_groupIndex(s)})}setSensor(t=!0){this.getFixtureList().forEach(e=>e.SetSensor(t))}applyForce(t,e){e||(e=this.getCenterOfMass()),this.setAwake(),this.body.ApplyForce(m.vec2dTo(t),m.vec2dTo(e))}applyAcceleration(t,e){e||(e=this.getCenterOfMass()),this.setAwake();let s=t.scale(this.getMass());this.body.ApplyLinearImpulse(m.vec2dTo(s),m.vec2dTo(e))}applyImpulse(t,e){e||(e=this.getCenterOfMass()),this.setAwake(),this.body.ApplyLinearImpulse(m.vec2dTo(t),m.vec2dTo(e))}applyTorque(t){this.setAwake(),this.body.ApplyTorque(t)}applyAngularAcceleration(t){this.setAwake(),this.body.ApplyAngularImpulse(t*this.getInertia())}applyAngularImpulse(t){this.setAwake(),this.body.ApplyAngularImpulse(t)}hasFixtures(){return!m.isNull(this.body.GetFixtureList())}getFixtureList(){let t=[];for(let e=this.body.GetFixtureList();!m.isNull(e);)t.push(e),e=e.GetNext();return t}hasJoints(){return!m.isNull(this.body.GetJointList())}getJointList(){let t=[];for(let e=this.body.GetJointList();!m.isNull(e);)t.push(e),e=e.get_next();return t}},yi=class extends Ss{constructor(t,e,s,i=0,o,r=0){let a=m.bodyTypeStatic;super(t,e,s,i,o,a,r)}},Go=class extends Ss{constructor(t,e,s,i=0,o,r=0){let a=m.bodyTypeKinematic;super(t,e,s,i,o,a,r)}},Fo=class extends yi{constructor(t){f(t instanceof ps,"tileLayer must be a TileCollisionLayer"),super(t.pos,t.size),this.tileLayer=t,this.addChild(t)}render(){}buildCollision(t=.2,e=0){this.destroyAllFixtures(),this.pos=this.tileLayer.pos.copy(),this.size=this.tileLayer.size.copy();let s=[],i=(r,a)=>r+a*this.size.x,o=(r,a)=>!s[i(r,a)]&&this.tileLayer.getCollisionData(x(r,a))>0;for(let r=0;ri.fractiono.pos.distanceSquared(t)0,"Tween duration must be > 0"),this.callback=t,this.start=e,this.end=s,this.duration=i,this.life=i,this.ease=o.ease||Si.LINEAR,this.useRealTime=!!o.useRealTime,this.paused=!!o.paused,this.thenCallback=void 0,this.loopRemaining=0,qt.push(this),t(this.interp(i))}setEase(t){return this.ease=t,this}then(t){return this.thenCallback=t,this.loopRemaining=0,this}loop(t=1/0){return this.loopRemaining=t,this.thenCallback=()=>_c(this),this}pingPong(t=1/0){return this.loopRemaining=t,this.thenCallback=()=>Rc(this),this}pause(){this.paused=!0}resume(){this.paused=!1}restart(){this.life=this.duration,this.paused=!1,qt.indexOf(this)<0&&qt.push(this),this.callback(this.interp(this.duration))}isActive(){return!this.paused&&qt.indexOf(this)>=0}getPercent(){return Mt(this.duration-this.life,0,this.duration)}getValue(){return this.interp(this.life)}interp(t){let e=this.ease((this.duration-t)/this.duration);return _a(this.start)?this.start.lerp(this.end,e):this.start+(this.end-this.start)*e}stop(){let t=qt.indexOf(this);t>=0&&qt.splice(t,1),this.thenCallback=void 0}},Si={LINEAR:n=>n,POWER:n=>t=>t**n,SINE:n=>1-ot(n*(q/2)),CIRC:n=>1-(1-n*n)**.5,EXPO:n=>n===0?0:2**(10*n-10),BACK:n=>n*n*(2.70158*n-1.70158),ELASTIC:n=>n===0?0:n===1?1:-(2**(10*n-10))*tt((37-40*n)*q/6),SPRING:n=>1-(tt(q*(1-n)*(.2+2.5*(1-n)**3))*n**2.2+(1-n))*(1+1.2*n),BOUNCE:n=>{let t=1-n,e;return t<4/11?e=7.5625*t*t:t<8/11?e=7.5625*(t-=6/11)*t+.75:t<10/11?e=7.5625*(t-=9/11)*t+.9375:e=7.5625*(t-=10.5/11)*t+.984375,1-e},IN:n=>n,OUT:n=>t=>1-n(1-t),IN_OUT:n=>Si.PIECEWISE(n,Si.OUT(n)),PIECEWISE:(...n)=>{let t=n.length;return e=>{let s=e*t-1e-9>>0;return(n[s]((e-s/t)*t)+s)/t}},BEZIER:(n,t,e,s)=>{let i=o=>{let r=1-o,a=3*r*r*o,c=3*r*o*o,l=o**3;return[a*n+c*e+l,a*t+c*s+l]};return o=>{let r=0,a=1;for(let c=0;c<128;c++){let l=(r+a)/2,[u,h]=i(l);if(Z(u-o)<1e-5)return h;u=this.size.x||e>=this.size.y?null:this.nodes[t+e*this.size.x]}worldToTile(t){let e=this.tileLayer?this.tileLayer.pos.x:0,s=this.tileLayer?this.tileLayer.pos.y:0;return x(vt(t.x-e),vt(t.y-s))}tileToWorld(t,e){let s=this.tileLayer?this.tileLayer.pos.x:0,i=this.tileLayer?this.tileLayer.pos.y:0;return x(t+.5+s,e+.5+i)}buildNodeData(){let t=this.size.x,e=this.size.y,s=this.tileLayer?this.tileLayer.pos.x:0,i=this.tileLayer?this.tileLayer.pos.y:0;for(let o=0;o0&&(c?l>0&&mt(a.posWorld,oo,B(1,0,0,K(.2,l*.05)),this.debugTime):mt(a.posWorld,oo,B(1,0,0,.25),this.debugTime))}}aStarSearch(t,e){f(t&&e,"aStarSearch needs both endpoints"),f(t!==e,"aStarSearch: start and end must differ \u2014 caller should handle trivial case"),f(t.walkable&&e.walkable,"aStarSearch: endpoints must be walkable");let s=[t];t.isOpen=!0;let i=0;for(;s.length>0;){let o=0,r=s[0].f;for(let c=1;cthis.maxLoop)break;a.isOpen=!1,s.splice(o,1),a.isClosed=!0,this.debug&&this.debugTime>0&&mt(a.posWorld,oo,B(1,1,1,.05),this.debugTime);for(let c=-1;c<=1;++c)for(let l=-1;l<=1;++l){if(l===0&&c===0)continue;let u=this.getNode(a.pos.x+l,a.pos.y+c);if(!u||!u.walkable||u.isClosed)continue;let h=1;if(l!==0&&c!==0){let v=this.getNode(a.pos.x+l,a.pos.y);if(!v||!v.walkable)continue;let S=this.getNode(a.pos.x,a.pos.y+c);if(!S||!S.walkable)continue;h=fd}let p=a.g+h+u.cost;if(!u.isOpen)u.isOpen=!0,s.push(u);else if(p>=u.g)continue;u.parent=a,u.g=p;let d=Z(e.pos.x-u.pos.x),y=Z(e.pos.y-u.pos.y),b=X(d,y)+(Math.SQRT2-1)*K(d,y);u.f=u.g+b*this.heuristicWeight}}return e.parent!==null}getNearestClearNode(t,e=10,s=!0){f(L(t),"worldPos must be a Vector2"),s&&this.buildNodeData();let i=this.tileLayer?this.tileLayer.pos.x:0,o=this.tileLayer?this.tileLayer.pos.y:0,r=vt(t.x-i),a=vt(t.y-o);for(let c=0;c<=e;++c){let l=null,u=0;for(let h=-c;h<=c;++h)for(let p=-c;p<=c;++p){if(c>0&&Z(p)!==c&&Z(h)!==c)continue;let d=this.getNode(r+p,a+h);if(!d||!d.isClear())continue;let y=d.posWorld.x-t.x,b=d.posWorld.y-t.y,v=y*y+b*b;(!l||v0&&Nt(i.posWorld,.3,B(.5,0,.5,.5),this.debugTime),t.splice(e,1),e=X(1,e-1);continue}else if(c===2){this.debug&&this.debugTime>0&&Nt(i.posWorld,.3,B(1,0,0,.5),this.debugTime);let d,y;s.pos.y===i.pos.y&&o.pos.x===i.pos.x?(d=s.pos.x,y=o.pos.y):(d=o.pos.x,y=s.pos.y);let b=this.getNode(d,y);if(b&&b.isClear()){t.splice(e,1),e=X(1,e-1);continue}}else if(c===5){this.debug&&this.debugTime>0&&Nt(i.posWorld,.3,B(1,1,0,.5),this.debugTime);let d=e>=2?t[e-2]:s,y,b,v,S;l===0||h===0?(y=o.pos.x,b=i.pos.y,v=s.pos.x,S=i.pos.y):(y=i.pos.x,b=o.pos.y,v=i.pos.x,S=s.pos.y);let _=y-d.pos.x,w=b-d.pos.y,E=v-d.pos.x,A=S-d.pos.y,T=_*_+w*w,R=E*E+A*A,M=T0&&Nt(i.posWorld,.3,B(0,1,0,.5),this.debugTime),l===h&&u===p){++e;continue}else{let d,y;s.pos.y===o.pos.y?(d=i.pos.x,y=s.pos.y):(d=s.pos.x,y=i.pos.y);let b=this.getNode(d,y);if(b&&b.isClear()){t[e]=b,e=X(1,e-1);continue}}++e}}smoothPathStringPull(t){if(t.length<=2)return;for(let i of t)if(!i.isClear())return;let e=t.slice();t.length=0,t.push(e[0]);let s=0;for(let i=1;i0&&xe(o.posWorld,t[t.length-1].posWorld,B(0,0,1,.3),.02,this.debugTime);continue}for(;s=1;--e){let s=t[e-1],i=t[e],o=t[e+1];(i.pos.x-s.pos.x)*(o.pos.y-s.pos.y)===(i.pos.y-s.pos.y)*(o.pos.x-s.pos.x)&&t.splice(e,1)}}isNodeClear(t,e){let s=this.getNode(t,e);return s!==null&&s.isClear()}isLineClear(t,e){f(L(t)&&L(e),"isLineClear needs Vector2 endpoints"),f(this.isNodeClear(t.x,t.y)&&this.isNodeClear(e.x,e.y),"isLineClear endpoints must be in-bounds and clear");let s=e.x-t.x,i=e.y-t.y,o=Z(s),r=Z(i),a=Zt(s),c=Zt(i),l=t.x,u=t.y;if(r===o){for(;l!==e.x;){if(l!==t.x&&(!this.isNodeClear(l,u)||!this.isNodeClear(l,u-c))||!this.isNodeClear(l,u+c))return!1;l+=a,u+=c}if(!this.isNodeClear(e.x,e.y-c))return!1}else if(ra.posWorld.copy());if(this.debug&&this.debugTime>0&&r.length>0){for(let a=1;apd,bootGameHost:()=>yd,default:()=>gd});var Is=class{constructor(t){this._state=(t==null?2654435769:t)>>>0}next(){this._state=this._state+1831565813>>>0;let t=this._state;return t=Math.imul(t^t>>>15,t|1),t^=t+Math.imul(t^t>>>7,t|61),((t^t>>>14)>>>0)/4294967296}range(t,e){return t+this.next()*(e-t)}reseed(t){this._state=(t==null?2654435769:t)>>>0}},ji=class{constructor(t){this._clock=t||Jc(),this._origin=this._clock()}nowMs(){return this._clock()}elapsedMs(){return this._clock()-this._origin}},Ni=class{constructor(t){this._time=t,this._subs=new Map}sourceFor(t){let e=this,s=t==null?null:t;return{on(i,o){if(e._assertType(i),typeof o!="function")throw new Error("[HostDevInputBridge] on \u7684 handler \u5FC5\u987B\u662F\u51FD\u6570");let r=e._subs.get(i)||[],a={handler:o,scope:s};return r.push(a),e._subs.set(i,r),{cancel(){let c=e._subs.get(i);if(!c)return;let l=c.indexOf(a);l>=0&&c.splice(l,1)}}},off(i,o){e._assertType(i);let r=e._subs.get(i);if(!r)return;let a=r.findIndex(c=>c.handler===o&&c.scope===s);a>=0&&r.splice(a,1)}}}_emit(t,e){this._assertType(t);let s=e||{},i={type:t,x:typeof s.x=="number"?s.x:0,y:typeof s.y=="number"?s.y:0,key:typeof s.key=="string"?s.key:"",tMs:this._time.nowMs()},o=this._subs.get(t);if(!o||o.length===0)return;let r=o.slice();for(let a of r)try{a.handler(i)}catch(c){ze("[host-dev input] \u8F93\u5165 handler \u629B\u9519\uFF08\u5DF2\u9694\u79BB\uFF09type="+t,c)}}disposeScope(t){if(t==null)return 0;let e=0;for(let[s,i]of this._subs){let o=i.filter(r=>r.scope!==t);e+=i.length-o.length,o.length===0?this._subs.delete(s):this._subs.set(s,o)}return e}_subscriptionCount(){let t=0;for(let e of this._subs.values())t+=e.length;return t}_assertType(t){if(!Bi.has(t))throw new Error("[HostDevInputBridge] \u975E\u6CD5\u8F93\u5165\u4E8B\u4EF6\u7C7B\u578B\uFF1A"+String(t)+"\uFF08\u4EC5\u652F\u6301 "+Array.from(Bi).join("/")+"\uFF09")}},Bi=new Set(["pointerdown","pointermove","pointerup","keydown","keyup"]);function Wr(n){let t=n||{},e=new ji(t.clock),s=new Is(t.seed),i=t.seed==null?2654435769:t.seed>>>0,o=new Ni(e),r=typeof t.audioFactory=="function"?t.audioFactory:null,a=null,c=!1,l=typeof t.engineFactory=="function"?t.engineFactory:null,u=null,h=!1,p=new Map,d=0,y=0;function b(){if(a)return a;if(!r)return c||(Ji("[host-dev audio] \u672A\u6CE8\u5165 audioFactory\uFF0CgetAudioContext \u8FD4\u56DE null\uFF08P6 \u987B\u5BB9\u9519\u964D\u7EA7\uFF1B\u96C6\u6210\u6BB5\u6CE8\u5165\u771F\u5B9E\u5DE5\u5382\uFF09"),c=!0),null;try{a=r()}catch(E){ze("[host-dev audio] audioFactory \u629B\u9519\uFF0CgetAudioContext \u964D\u7EA7\u8FD4\u56DE null",E),a=null}return a}function v(){if(u)return u;if(!l)return h||(Ji("[host-dev engine] \u672A\u6CE8\u5165 engineFactory\uFF0CgetEngine \u8FD4\u56DE null\uFF08\u63D2\u4EF6\u987B\u5BB9\u9519\u964D\u7EA7\uFF1A\u7C92\u5B50\u9000\u53D7\u63A7\u9762\u81EA\u7BA1/\u5408\u6210\u6838\u9000 vendored/\u6570\u5B66\u9000\u5185\u7F6E\uFF1B\u96C6\u6210\u6BB5\u6CE8\u5165\u771F\u5B9E\u80CC\u4E66\uFF09"),h=!0),null;try{u=l()}catch(E){ze("[host-dev engine] engineFactory \u629B\u9519\uFF0CgetEngine \u964D\u7EA7\u8FD4\u56DE null",E),u=null}return u}function S(E,A){return{getContext2d(){return t.context2d==null?null:t.context2d},onFrame(R){let M=d++;return p.set(M,R),{cancel(){p.delete(M)}}},getInput(){return o.sourceFor(E)},getAudioContext(){return b()},getEngine(){return v()},time:e,random:A}}let _=S(null,s),w={context:_,tick(E){y+=1;let A=Array.from(p.values());for(let T of A)try{T(E,y)}catch(R){ze("[host-dev tick] \u5E27\u56DE\u8C03\u629B\u9519\uFF08\u5DF2\u9694\u79BB\uFF09frame="+y,R)}},frameCount(){return y},inputBridge:o,deriveContextFor(E,A){let T=zc(i,E),R=new Is(T);return S(A==null?E:A,R)}};return Object.defineProperty(_,zi,{value:w,enumerable:!1,writable:!1,configurable:!1}),w}var zi=Symbol("zaomeng.coreProtocol.contextBundle"),Ms=class{constructor(){this._plugins=new Map,this._initOrder=[],this._initErrors=[],this._phase="idle",this._disposed=!1,this._context=void 0,this._pluginContexts=new Map}register(t){if(!t||typeof t!="object")throw new Error("[PluginRegistry] register \u9700\u8981\u4E00\u4E2A\u63D2\u4EF6\u5BF9\u8C61");if(typeof t.name!="string"||t.name.length===0)throw new Error("[PluginRegistry] \u63D2\u4EF6\u7F3A\u5C11\u5408\u6CD5 name");if(typeof t.version!="string"||t.version.length===0)throw new Error("[PluginRegistry] \u63D2\u4EF6 "+t.name+" \u7F3A\u5C11\u5408\u6CD5 version");if(typeof t.init!="function")throw new Error("[PluginRegistry] \u63D2\u4EF6 "+t.name+" \u7F3A\u5C11 init \u51FD\u6570");if(t.dispose!=null&&typeof t.dispose!="function")throw new Error("[PluginRegistry] \u63D2\u4EF6 "+t.name+" \u7684 dispose \u5FC5\u987B\u662F\u51FD\u6570\u6216\u7701\u7565");if(this._plugins.has(t.name))throw new Error("[PluginRegistry] \u63D2\u4EF6\u91CD\u540D\u62D2\u7EDD\uFF1A"+t.name+" \u5DF2\u6CE8\u518C");return this._plugins.set(t.name,t),this}has(t){return this._plugins.has(t)}get(t){return this._plugins.get(t)}list(){return Array.from(this._plugins.keys())}initAll(){if(this._phase==="initialized")return Ji("[PluginRegistry] initAll \u91CD\u590D\u8C03\u7528\uFF0C\u5DF2\u5FFD\u7565\uFF08\u5DF2\u5904\u4E8E initialized\uFF09"),this._initResult();if(this._phase==="disposed")throw new Error("[PluginRegistry] \u5DF2 dispose \u7684\u6CE8\u518C\u5668\u4E0D\u53EF\u518D initAll");if(this._context==null)throw new Error("[PluginRegistry] \u672A\u6CE8\u5165\u53D7\u63A7\u4E0A\u4E0B\u6587\uFF1A\u8BF7\u5728 initAll() \u4E4B\u524D\u8C03\u7528 useContext(context)\u3002\uFF08host-dev \u7528\u6CD5\uFF1Aconst { context } = createHostDevContext(); reg.useContext(context); reg.initAll();\uFF09");for(let[t,e]of this._plugins){let s=this._missingDeps(e);if(s.length>0){let o=new Error("[PluginRegistry] \u63D2\u4EF6 "+t+" \u4F9D\u8D56\u7F3A\u5931\uFF1A"+s.join(", ")+"\uFF08\u672A\u6CE8\u518C\uFF09");this._initErrors.push({name:t,error:o}),ze("[PluginRegistry] \u8DF3\u8FC7 init\uFF08\u4F9D\u8D56\u7F3A\u5931\uFF0C\u5DF2\u9694\u79BB\uFF09\uFF1A"+t,o);continue}let i=this._contextFor(t);try{e.init(i),this._initOrder.push(t)}catch(o){let r=o instanceof Error?o:new Error(String(o));this._initErrors.push({name:t,error:r}),ze("[PluginRegistry] \u63D2\u4EF6 init \u629B\u9519\uFF08\u5DF2\u9694\u79BB\uFF0C\u4E0D\u8FDE\u5750\uFF09\uFF1A"+t,r)}}return this._phase="initialized",this._initResult()}_contextFor(t){let e=this._pluginContexts.get(t);if(e)return e;let s=this._context&&this._context[zi],i;return s&&typeof s.deriveContextFor=="function"?i=s.deriveContextFor(t,t):i=this._context,this._pluginContexts.set(t,i),i}disposeAll(){if(this._disposed)return{disposed:[],errors:[]};let t=[],e=[],s=this._context&&this._context[zi],i=s&&s.inputBridge;for(let o=this._initOrder.length-1;o>=0;o--){let r=this._initOrder[o],a=this._plugins.get(r);if(a&&typeof a.dispose=="function")try{a.dispose(),t.push(r)}catch(c){let l=c instanceof Error?c:new Error(String(c));e.push({name:r,error:l}),ze("[PluginRegistry] \u63D2\u4EF6 dispose \u629B\u9519\uFF08\u5DF2\u9694\u79BB\uFF09\uFF1A"+r,l)}if(i&&typeof i.disposeScope=="function")try{i.disposeScope(r)}catch(c){ze("[PluginRegistry] \u56DE\u6536\u63D2\u4EF6\u8F93\u5165\u8BA2\u9605\u629B\u9519\uFF08\u5DF2\u9694\u79BB\uFF09\uFF1A"+r,c)}}return this._disposed=!0,this._phase="disposed",{disposed:t,errors:e}}useContext(t){if(this._phase!=="idle")throw new Error("[PluginRegistry] useContext \u5FC5\u987B\u5728 initAll() \u4E4B\u524D\u8C03\u7528\uFF08\u5F53\u524D\u9636\u6BB5\uFF1A"+this._phase+"\uFF09\u3002\u8BF7\u5728\u4EFB\u4F55 initAll/disposeAll \u4E4B\u524D\u6CE8\u5165\u53D7\u63A7\u4E0A\u4E0B\u6587\u3002");if(t==null||typeof t!="object")throw new Error("[PluginRegistry] useContext \u9700\u8981\u4E00\u4E2A\u53D7\u63A7\u4E0A\u4E0B\u6587\u5BF9\u8C61\u3002\uFF08host-dev \u7528\u6CD5\uFF1Aconst { context } = createHostDevContext(); reg.useContext(context);\uFF09");return this._context=t,this}_missingDeps(t){return!Array.isArray(t.dependencies)||t.dependencies.length===0?[]:t.dependencies.filter(e=>!this._plugins.has(e))}_initResult(){return{ok:this._initErrors.length===0,initialized:this._initOrder.slice(),errors:this._initErrors.slice()}}};function zc(n,t){let e=2166136261,s=16777619,i=n>>>0;for(let r=0;r<32;r+=8){let a=i>>>r&255;e^=a,e=Math.imul(e,s)>>>0}let o=String(t);for(let r=0;r>>0,e^=a>>>8&255,e=Math.imul(e,s)>>>0}return e>>>0}function Jc(){if(typeof globalThis!="undefined"&&globalThis.performance&&typeof globalThis.performance.now=="function")return()=>globalThis.performance.now();if(typeof process!="undefined"&&process.hrtime&&typeof process.hrtime.bigint=="function"){let n=process.hrtime.bigint();return()=>Number(process.hrtime.bigint()-n)/1e6}return()=>Date.now()}function ze(n,t){let e=t&&t.stack?t.stack:t&&t.message?t.message:t;typeof console!="undefined"&&typeof console.error=="function"&&console.error(n+(e?"\uFF1A"+e:""))}function Ji(n){typeof console!="undefined"&&typeof console.warn=="function"&&console.warn(n)}var xd=Object.freeze(Array.from(Bi)),qr="core-protocol-v0";var Hr=Object.freeze(["t_boot","t_plugins_ready","t_game_init","t_first_paint","t_input_bound","t_game_start"]),Ui=Hr.reduce((n,t,e)=>(n[t]=e,n),Object.create(null)),Uc=new Set(Hr);function Vi(n){let t=2166136261;for(let e=0;e>>0).toString(16).padStart(8,"0")}var Xr=Vi("runtime-probe::seed::v1");function ks(n){return n===null||typeof n!="object"?JSON.stringify(n):Array.isArray(n)?"["+n.map(ks).join(",")+"]":"{"+Object.keys(n).sort().map(e=>JSON.stringify(e)+":"+ks(n[e])).join(",")+"}"}function Yr(n){let t=ks(n.extra==null?null:n.extra),e=ks(Array.isArray(n.pluginSet)?n.pluginSet:[]);return["seq="+n.seq,"anchor="+n.anchor,"tMono="+n.tMono,"buildSha="+(n.buildSha||""),"pluginSet="+e,"extra="+t].join("|")}function Vc(n){return Math.round(n*1e3)/1e3}function Wc(n){if(!Array.isArray(n))return{ok:!1,reason:"records_not_array"};let t=Xr,e=-1;for(let s=0;stypeof E=="string").slice().sort():[],i=typeof t.sink=="function"?t.sink:null,o=t.autoBoot!==!1,r=typeof t.inputAnchorType=="string"?t.inputAnchorType:"pointerdown",a=()=>0,c=!1,l=0,u=Xr,h=[],p=new Set,d=-1,y=null,b=!1,v=!1,S=!1;function _(E,A){let T=null;if(!Uc.has(E))T="unknown_anchor";else{p.has(E)&&(T=T?T+";duplicate_anchor":"duplicate_anchor");let M=Ui[E];ME.time.nowMs(),c=!0,o&&!v&&_("t_boot",{auto:!0}),y=E.getInput().on(r,A=>{b||(b=!0,_("t_input_bound",{firstInput:!0,type:A.type}))}),_("t_input_bound",{stage:"registered",type:r})},dispose(){S||(y&&(y.cancel(),y=null),S=!0)},mark:_,getRecords(){return h.map(E=>({...E}))},toJSONL(){return h.map(E=>JSON.stringify(E)).join(`
-`)},verify(){return Wc(h)}}}function qc(n,t){let e=t&&t.stack?t.stack:t&&t.message?t.message:t;typeof console!="undefined"&&typeof console.error=="function"&&console.error(n+(e?"\uFF1A"+e:""))}function Kr(n){let t=n.LJS,e=n.engineMath,s=n.engineMode,i=n.recHook||(()=>{});if(s!=="real")return null;let o=e;return{math:{lerp:(a,c,l)=>(i("math.lerp"),o.lerp(a,c,l)),smoothStep:a=>(i("math.smoothStep"),o.smoothStep(a)),easing:Object.fromEntries(Object.keys(o.easing).map(a=>[a,c=>(i("math.easing."+a),o.easing[a](c))]))},particles:{spawnEmitter(a){i("particles.spawnEmitter");let c=t.screenToWorld(t.vec2(a.pos.x,a.pos.y)),l=t.cameraScale,u=a.emitTime!=null?a.emitTime:a.count!=null?1/60:0,h=a.emitRate!=null?a.emitRate:a.count!=null?a.count*60:100,p=(a.speed!=null?a.speed:0)/l/60,d=a.damping!=null?a.damping:1,y=a.colorStart||{r:1,g:1,b:1,a:1},b=a.colorEnd||{r:1,g:1,b:1,a:0},v=t.rgb(y.r,y.g,y.b,y.a),S=t.rgb(b.r,b.g,b.b,b.a),_=new t.ParticleEmitter(c,a.angle!=null?a.angle:0,(a.emitSize!=null?a.emitSize:0)/l,u,h,a.coneAngle!=null?a.coneAngle:Math.PI,void 0,v,v,S,S,a.particleTime!=null?a.particleTime:.5,(a.sizeStart!=null?a.sizeStart:6)/l,(a.sizeEnd!=null?a.sizeEnd:0)/l,p,0,d,1,a.gravityScale!=null?a.gravityScale:0,Math.PI,.1,0,!1,a.additive!=null?a.additive:!1,!0);return{isActive(){return _.isActive()},stop(){_.destroyed||_.destroy(!0)}}}},audio:{synth:{synthSfx:a=>{i("audio.synth.synthSfx");try{return t.zzfxG(...a)}catch(c){return console.error("[host][engine-audio] zzfxG \u5408\u6210\u5F02\u5E38\uFF0C\u8FD4 null\uFF1A"+(c&&c.message?c.message:c)),null}},synthSong:(a,c,l,u)=>{i("audio.synth.synthSong");try{return t.zzfxM(a,c,l,u)}catch(h){return console.error("[host][engine-audio] zzfxM \u5408\u6210\u5F02\u5E38\uFF0C\u8FD4 null\uFF1A"+(h&&h.message?h.message:h)),null}}}}}}function ie(n){return n<0?0:n>1?1:n}function Qr(n){let t=n.Ease,e=t.POWER(2),s=t.POWER(3),i=t.OUT(e),o=t.IN_OUT(e),r=t.OUT(s),a=t.IN_OUT(s),c=t.OUT(t.BACK),l=t.OUT(t.ELASTIC);return{lerp:(u,h,p)=>n.lerp(u,h,p),smoothStep:u=>n.smoothStep(u),easing:{linear:u=>t.LINEAR(ie(u)),quadIn:u=>e(ie(u)),quadOut:u=>i(ie(u)),quadInOut:u=>o(ie(u)),cubicIn:u=>s(ie(u)),cubicOut:u=>r(ie(u)),cubicInOut:u=>a(ie(u)),backIn:u=>t.BACK(ie(u)),backOut:u=>c(ie(u)),elasticIn:u=>t.ELASTIC(ie(u)),elasticOut:u=>l(ie(u))}}}var Je=2,Gs=1/60;async function Zr(n){let t=n.canvas,e=n.statusEl||null,s=n.engine,i=n.seed>>>0,o=n.mode||"play",r=n.engineMode||"real",a=n.viewport.w,c=n.viewport.h,l=n.factory,u=n.buildFactoryOpts||(()=>{}),h=n.plugins||{},p=n.registerOrder||Object.values(h),d=n.onReady||(()=>{}),y=n.recHook||(()=>{});function b(O){e&&(e.textContent=O)}let v=[];window.addEventListener("error",O=>v.push({type:"error",message:String(O&&O.message||O)})),window.addEventListener("unhandledrejection",O=>v.push({type:"unhandledrejection",message:String(O&&O.reason&&O.reason.message||O&&O.reason||O)}));let S=null,_=!1;function w(){if(!_)return null;if(S)return S;let O=window.AudioContext||window.webkitAudioContext;return O?(S=new O,S):null}let E=0,A=null,T=null,R=null,M=null,ct=[],et={},lt=null;function gt(O,rt){try{R&&R.mark(O,rt)}catch(Kt){v.push({type:"mark",message:String(Kt&&Kt.message||Kt)})}}function kt(){T&&typeof T._refreshChecklist=="function"&&T._refreshChecklist(et)}async function Ee(O,rt){A=Wr({context2d:O,seed:i,audioFactory:w,clock:()=>E,engineFactory:()=>Kr({LJS:r==="real"?s:null,engineMath:r==="real"?Qr(s):null,engineMode:r,recHook:y})});let Kt=new Ms;for(let fe of p)Kt.register(fe);Kt.useContext(A.context),M=Kt.initAll(),ct=Kt.list().concat(["runtime-probe"]),R=$r({pluginSet:ct,inputAnchorType:"pointerdown",autoBoot:!0});let Qt=A.deriveContextFor("runtime-probe","runtime-probe");gt("t_boot",{by:"game-host",stage:"pre-init",engineMode:r}),gt("t_plugins_ready",{initialized:M.initialized.length,ok:M.ok});let Gi=u(A.context,{bundle:A,plugins:h,getRealAudioCtx:()=>S});T=l(Gi),await T.init({ctx:A.context,mainContext:O,canvas:rt(),seed:i}),lt=T&&typeof T._forensicsView=="function"?T._forensicsView():null,gt("t_game_init",{hasForensics:!!lt}),ut(),gt("t_first_paint",{frame:A.frameCount()});try{R.init(Qt)}catch(fe){v.push({type:"probe-init",message:String(fe&&fe.message||fe)})}gt("t_game_start",{mode:o,engineMode:r}),kt(),d(N,{bundle:A,game:T,probe:R,checklist:et,uncaught:v,pluginSet:ct,initRes:M,getGameForensics:()=>lt,mark:gt,stepOneFrame:ut})}let Gt=null;function ut(O){let rt=typeof O=="number"?O:Gs;T&&(E+=rt*1e3,T.update(rt),r==="stub"&&Gt&&T.render(Gt),kt())}function Rt(O){for(let rt=0;rt{}),T&&typeof T._onAudioUnlock=="function"&&T._onAudioUnlock()}let N={seed:i,mode:o,engineMode:r,protocol:qr,frameCount:()=>A?A.frameCount():0,stepFrames:Rt,startRaf:()=>An(),stopRaf:()=>Cn(),tap(O,rt){I(),A&&(A.inputBridge._emit("pointerdown",{x:O,y:rt}),A.inputBridge._emit("pointerup",{x:O,y:rt}))},do(O){T&&typeof T._handleAction=="function"&&T._handleAction(O)},state:()=>lt?lt.state():{phase:"booting"}};function Y(O){let rt=A.inputBridge;function Kt(Qt,Gi){let fe=O.getBoundingClientRect();return{x:(Qt-fe.left)/fe.width*a,y:(Gi-fe.top)/fe.height*c}}O.addEventListener("pointerdown",Qt=>{I(),rt._emit("pointerdown",Kt(Qt.clientX,Qt.clientY))}),O.addEventListener("pointermove",Qt=>{rt._emit("pointermove",Kt(Qt.clientX,Qt.clientY))}),O.addEventListener("pointerup",Qt=>{rt._emit("pointerup",Kt(Qt.clientX,Qt.clientY))})}let ht=0,it=!1,Pt=0;function he(O){if(!it)return;Pt===0&&(Pt=O);let rt=(O-Pt)/1e3;Pt=O,rt>.05&&(rt=.05),ut(rt),ht=window.requestAnimationFrame(he)}function An(){r==="stub"&&(it||(it=!0,Pt=0,ht=window.requestAnimationFrame(he)))}function Cn(){it=!1,ht&&window.cancelAnimationFrame(ht),ht=0}function En(O){O.width=a*Je,O.height=c*Je,O.style.width=a+"px",O.style.height=c+"px";let rt=O.getContext("2d",{willReadFrequently:!0});return rt.setTransform(Je,0,0,Je,0,0),rt}async function de(){let O=En(t);return Gt=O,await Ee(O,()=>t),Y(t),o==="evidence"?b(`evidence \u5C31\u7EEA seed=${i} \xB7 \u7528 host \u9A71\u52A8\uFF08stepFrames/tap\uFF09`):(b(`seed=${i} \xB7 \u70B9\u5F00\u59CB\uFF08\u9996\u6B21\u70B9\u51FB\u5F00\u58F0\uFF09`),An()),N}let $t=()=>{},Hn=()=>{};function Os(){window.__gameHostEngineInitFired=!0}function Ds(){$t()}function Ur(){}function Dc(){Hn()}function Ic(){}async function Mc(O){await Ee(O,()=>s.mainCanvas),Y(s.mainCanvas),$t=()=>{T&&(E+=Gs*1e3,T.update(Gs))},Hn=()=>{if(T){O.save(),O.setTransform(Je,0,0,Je,0,0);try{O.imageSmoothingEnabled=!1}catch{}T.render(O),O.restore()}},s.mainCanvas&&(s.mainCanvas.id="game-engine"),window.__engine={frame(){return s.frame},time(){return s.time},timeReal(){return s.timeReal},paused(){return s.paused},timeScale(){return s.timeScale},snapshot(){return{frame:s.frame,time:s.time,timeReal:s.timeReal,paused:s.paused,timeScale:s.timeScale}}},b(`engine RAF running \xB7 seed=${i} engine=real`)}if(r!=="real")return await de();if(!s){let O="real \u901A\u9053\u672A\u6CE8\u5165\u5F15\u64CE\uFF08opts.engine \u7F3A\u5931\uFF09\uFF1A\u8BF7\u7ECF entry \u5305\u88C5\u5C42\u542F\u52A8\uFF08host \u4E0D\u76F4\u63A5 import \u5F15\u64CE\uFF0CQ4/Option C\uFF09";throw b("ENGINE INJECT MISSING: "+O),new Error(O)}s.setGLEnable(!1),s.setShowSplashScreen(!1),s.setDebugWatermark(!1),s.setCanvasClearColor(s.BLACK),s.setCanvasFixedSize(s.vec2(a*Je,c*Je));let ki=document.createElement("div");return ki.id="engine-root",document.body.appendChild(ki),await s.engineInit(Os,Ds,Ur,Dc,Ic,[],ki).then(()=>Mc(s.mainContext)).catch(O=>{throw window.__gameHostBootError=String(O&&O.message||O),b("ENGINE INIT FAILED: "+window.__gameHostBootError),O}),N}var Wi=class{constructor(t){let e=t||{},s=typeof e.cellSize=="number"&&e.cellSize>0?e.cellSize:64;this._cellSize=s,this._cells=new Map,this._entries=new Map,this._seq=0}get size(){return this._entries.size}_cellRange(t){let e=this._cellSize,s=Math.floor((t.x-t.hw)/e),i=Math.floor((t.x+t.hw)/e),o=Math.floor((t.y-t.hh)/e),r=Math.floor((t.y+t.hh)/e);return{cx0:s,cy0:o,cx1:i,cy1:r}}insert(t,e){this._entries.has(t)&&this.remove(t);let{cx0:s,cy0:i,cx1:o,cy1:r}=this._cellRange(e),a=[];for(let l=i;l<=r;l++)for(let u=s;u<=o;u++){let h=u+","+l,p=this._cells.get(h);p||(p=new Set,this._cells.set(h,p)),p.add(t),a.push(h)}let c={x:e.x,y:e.y,hw:e.hw,hh:e.hh};this._entries.set(t,{id:t,box:c,seq:this._seq++,cells:a})}remove(t){let e=this._entries.get(t);if(!e)return!1;for(let s of e.cells){let i=this._cells.get(s);i&&(i.delete(t),i.size===0&&this._cells.delete(s))}return this._entries.delete(t),!0}query(t){let{cx0:e,cy0:s,cx1:i,cy1:o}=this._cellRange(t),r=new Set;for(let a=s;a<=o;a++)for(let c=e;c<=i;c++){let l=this._cells.get(c+","+a);if(l)for(let u of l)r.add(u)}return this._collect(r)}queryPoint(t,e){let s=this._cellSize,i=Math.floor(t/s),o=Math.floor(e/s),r=this._cells.get(i+","+o);return r?this._collect(new Set(r)):[]}clear(){this._cells.clear(),this._entries.clear(),this._seq=0}_collect(t){let e=[];for(let s of t){let i=this._entries.get(s);i&&e.push(i)}return e.sort((s,i)=>s.seq-i.seq),e.map(s=>({id:s.id,box:s.box}))}};function ta(n){let t=n||{},e=new Wi({cellSize:t.cellSize}),s=!1;return{name:"collision",version:"1.0.0",dependencies:[],spatial:e,init(o){},dispose(){s||(e.clear(),s=!0)}}}function ea(n){let t=!1;return{name:"physics-lite",version:"1.0.0",dependencies:[],init(s){},dispose(){t||(t=!0)}}}var Hc=["pointerdown","pointermove","pointerup","keydown","keyup"];function Ft(n){return n<0?0:n>1?1:n}var Xc=n=>(n=Ft(n),n*n),Yc=n=>(n=Ft(n),1-(1-n)*(1-n)),$c=n=>(n=Ft(n),n<.5?2*n*n:1-Math.pow(-2*n+2,2)/2),Kc=n=>(n=Ft(n),n*n*n),Qc=n=>{n=Ft(n);let t=1-n;return 1-t*t*t},Zc=n=>(n=Ft(n),n<.5?4*n*n*n:1-Math.pow(-2*n+2,3)/2),ia=2*Math.PI/3,na=2*Math.PI/4.5,tl=n=>(n=Ft(n),n===0?0:n===1?1:-Math.pow(2,10*n-10)*Math.sin((n*10-10.75)*ia)),el=n=>(n=Ft(n),n===0?0:n===1?1:Math.pow(2,-10*n)*Math.sin((n*10-.75)*ia)+1),nl=n=>(n=Ft(n),n===0?0:n===1?1:n<.5?-(Math.pow(2,20*n-10)*Math.sin((20*n-11.125)*na))/2:Math.pow(2,-20*n+10)*Math.sin((20*n-11.125)*na)/2+1),js=1.70158,Fs=js*1.525,oa=js+1,sl=n=>(n=Ft(n),oa*n*n*n-js*n*n),il=n=>{n=Ft(n);let t=n-1;return 1+oa*t*t*t+js*t*t},ol=n=>(n=Ft(n),n<.5?Math.pow(2*n,2)*((Fs+1)*2*n-Fs)/2:(Math.pow(2*n-2,2)*((Fs+1)*(n*2-2)+Fs)+2)/2),rl=n=>Ft(n),sa=Object.freeze({linear:rl,quadIn:Xc,quadOut:Yc,quadInOut:$c,cubicIn:Kc,cubicOut:Qc,cubicInOut:Zc,elasticIn:tl,elasticOut:el,elasticInOut:nl,backIn:sl,backOut:il,backInOut:ol});var al=["linear","quadIn","quadOut","quadInOut","cubicIn","cubicOut","cubicInOut","elasticIn","elasticOut","elasticInOut","backIn","backOut","backInOut"];function cl(n){let t=n&&n.easing;if(!t)return sa;let e=i=>typeof t[i]=="function"?o=>t[i](Ft(o)):sa[i],s={};for(let i of al)s[i]=e(i);return Object.freeze(s)}var qi=class{constructor(t,e,s){let i=s||{};this._time=e,this._windowMs=typeof i.windowMs=="number"&&i.windowMs>0?i.windowMs:120;let o=Array.isArray(i.types)&&i.types.length>0?i.types:Hc;this._records=new Map,this._subs=[],this._disposed=!1;for(let r of o){this._records.set(r,null);let a=t.on(r,c=>{this._records.set(r,c.tMs)});this._subs.push(a)}}consume(t,e){let s=typeof e=="number"?e:this._time.nowMs(),i=this._records.get(t);return i==null?!1:s-i<=this._windowMs?(this._records.set(t,null),!0):(this._records.set(t,null),!1)}peek(t,e){let s=typeof e=="number"?e:this._time.nowMs(),i=this._records.get(t);return i==null?!1:s-i<=this._windowMs}clear(){for(let t of this._records.keys())this._records.set(t,null)}dispose(){if(!this._disposed){for(let t of this._subs)try{t.cancel()}catch(e){}this._subs=[],this._disposed=!0}}};function ra(n){let t=n||{},e=null,s=null,i=!1;return{name:"gamefeel",version:"1.0.0",dependencies:[],get inputBuffer(){return e},get easing(){return cl(s)},init(r){let a=r.getInput();e=new qi(a,r.time,{windowMs:t.inputBufferMs,types:t.inputTypes});let c=r.getEngine();s=c?c.math:null},dispose(){i||(e&&(e.dispose(),e=null),s=null,i=!0)}}}function Ns(n,t){let e=t<0?0:t>1?1:t;switch(n&&n.kind){case"constant":return n.value;case"linear":return n.from+(n.to-n.from)*e;case"easeInOut":{let s=e*e*(3-2*e);return n.from+(n.to-n.from)*s}case"decay":{let s=n.power==null?2:n.power,i=Math.pow(1-e,s);return n.to+(n.from-n.to)*i}default:return 0}}var ll=Object.freeze({burst:Object.freeze({mode:"burst",count:24,angle:0,spread:Math.PI,speedMin:80,speedMax:160,lifeMin:.4,lifeMax:.8,gravity:0,drag:0,sizeCurve:{kind:"decay",from:6,to:0,power:1.5},alphaCurve:{kind:"linear",from:1,to:0}}),trail:Object.freeze({mode:"continuous",rate:60,angle:Math.PI,spread:.25,speedMin:20,speedMax:50,lifeMin:.2,lifeMax:.5,gravity:0,drag:1.5,sizeCurve:{kind:"easeInOut",from:4,to:0},alphaCurve:{kind:"decay",from:.8,to:0,power:2}}),drift:Object.freeze({mode:"continuous",rate:12,angle:Math.PI/2,spread:.6,speedMin:10,speedMax:30,lifeMin:1.5,lifeMax:3,gravity:8,drag:.5,sizeCurve:{kind:"constant",value:3},alphaCurve:{kind:"decay",from:.7,to:0,power:1}})});function ul(n){let t=ll[n];return t?Hi(t):null}function Hi(n){let t={};for(let e of Object.keys(n)){let s=n[e];t[e]=s&&typeof s=="object"?Hi(s):s}return t}function hl(n,t,e){let s=n.mode==="continuous";return{pos:{x:t,y:e},angle:n.angle,coneAngle:n.spread,emitSize:0,emitTime:s?0:1/60,emitRate:s?n.rate||0:void 0,count:s?void 0:n.count||0,particleTime:(n.lifeMin+n.lifeMax)/2,speed:(n.speedMin+n.speedMax)/2,gravityScale:n.gravity||0,damping:n.drag!=null?1-n.drag/60:1,sizeStart:Ns(n.sizeCurve,0),sizeEnd:Ns(n.sizeCurve,1),colorStart:{r:1,g:1,b:1,a:Ns(n.alphaCurve,0)},colorEnd:{r:1,g:1,b:1,a:Ns(n.alphaCurve,1)},additive:!1}}function aa(n){let t=n||{},e=null,s=null,i=null,o=new Map,r=0,a={isActive(){return!1},stop(){}},c=0,l=1,u=0,h=0,p=0,d={x:0,y:0,remain:0,dur:0,amplitude:0,frequency:0,_phase:0},y={alpha:0,remain:0,dur:0,peak:0},b={scale:1,remain:0,dur:0,amplitude:0,frequency:0},v=!1;function S(A){if(u>0)if(u-=A,u<=0)u=0,l=1;else{let T=h>0?1-u/h:1;l=p+(1-p)*T}if(d.remain>0)if(d.remain-=A,d.remain<=0)d.remain=0,d.x=0,d.y=0;else{let T=d.remain/d.dur,R=d.amplitude*T;d._phase+=d.frequency*A*Math.PI*2,d.x=Math.sin(d._phase)*R,d.y=Math.cos(d._phase*1.3)*R}if(y.remain>0&&(y.remain-=A,y.remain<=0?(y.remain=0,y.alpha=0):y.alpha=y.peak*(y.remain/y.dur)),b.remain>0)if(b.remain-=A,b.remain<=0)b.remain=0,b.scale=1;else{let T=b.remain/b.dur,R=(1-T)*b.frequency*Math.PI*2;b.scale=1+Math.sin(R)*b.amplitude*T}}function _(A){c+=1,S(A)}function w(A){let T=A!==void 0?A:e?e.getContext2d():null;if(T&&y.alpha>0){T.globalAlpha=y.alpha,T.fillStyle="#ffffff";let R=T.canvas?T.canvas.width:0,M=T.canvas?T.canvas.height:0;T.fillRect(0,0,R,M),T.globalAlpha=1}}return{name:"particles-juice",version:"1.0.0",dependencies:[],init(A){var T;e=A,i=((T=A.getEngine())==null?void 0:T.particles)||null,typeof t.seed=="number"&&A.random.reseed(t.seed),t.autoStep!==!1&&(s=A.onFrame(R=>{_(R)}))},dispose(){v||(s&&(s.cancel(),s=null),o.forEach(A=>{try{A.stop()}catch{}}),o.clear(),l=1,u=0,d.remain=0,d.x=0,d.y=0,y.remain=0,y.alpha=0,b.remain=0,b.scale=1,v=!0)},spawnEmitter(A,T,R,M){let ct=typeof A=="string"?ul(A):Hi(A);if(!ct)return-1;M&&(ct=Object.assign(ct,M));let et=r++;if(!i)return o.set(et,a),et;let lt=i.spawnEmitter(hl(ct,T,R));return o.set(et,lt),et},stopEmitter(A){let T=o.get(A);if(T)try{T.stop()}catch{}},step(A){_(A)},render(A){w(A)},particleCount(){return 0},emitterCount(){let A=0;for(let T of o.values())T.isActive()&&(A+=1);return A},hitStop(A,T){h=Math.max(0,A),u=h,p=T==null?0:Math.max(0,Math.min(1,T)),l=h>0?p:1},getTimeScale(){return l},shakeScreen(A,T,R){d.dur=Math.max(0,A),d.remain=d.dur,d.amplitude=Math.max(0,T),d.frequency=R==null?30:R,d._phase=0,d.x=0,d.y=0},getShakeOffset(){return{x:d.x,y:d.y}},flashScreen(A,T){y.dur=Math.max(0,A),y.remain=y.dur,y.peak=T==null?.8:Math.max(0,Math.min(1,T)),y.alpha=y.dur>0?y.peak:0},getFlashAlpha(){return y.alpha},pulseScale(A,T,R){b.dur=Math.max(0,A),b.remain=b.dur,b.amplitude=T==null?.2:T,b.frequency=R==null?4:R,b.scale=1},getPulseScale(){return b.scale},juiceSnapshot(){return{timeScale:l,shake:{x:d.x,y:d.y},flashAlpha:y.alpha,pulseScale:b.scale}},probe(){return{particles:0,emitters:o.size,dropped:0,steps:c,disposed:v}}}}function ca(n){let t=pt(n.r)/255,e=pt(n.g)/255,s=pt(n.b)/255,i=Math.max(t,e,s),o=Math.min(t,e,s),r=(i+o)/2,a=0,c=0,l=i-o;return l>1e-12&&(c=r>.5?l/(2-i-o):l/(i+o),i===t?a=(e-s)/l%6:i===e?a=(s-t)/l+2:a=(t-e)/l+4,a*=60,a<0&&(a+=360)),{h:a,s:c,l:r}}function la(n){let t=(n.h%360+360)%360,e=Ue(n.s),s=Ue(n.l);if(e<1e-12){let a=Math.round(s*255);return{r:a,g:a,b:a}}let i=s<.5?s*(1+e):s+e-s*e,o=2*s-i,r=t/360;return{r:Math.round(Xi(o,i,r+1/3)*255),g:Math.round(Xi(o,i,r)*255),b:Math.round(Xi(o,i,r-1/3)*255)}}function Xi(n,t,e){let s=e;return s<0&&(s+=1),s>1&&(s-=1),s<1/6?n+(t-n)*6*s:s<1/2?t:s<2/3?n+(t-n)*(2/3-s)*6:n}function pt(n){return n<0?0:n>255?255:n}function Ue(n){return n<0?0:n>1?1:n}function dl(n,t){let e=pl(n.from,t);if(e>=0&&e({r:pt(a.r),g:pt(a.g),b:pt(a.b)})),to:o}}function Yi(n,t,e){return n+(t-n)*e}function ml(n,t){let e=ca(n),s=e.h+(t.hue||0),i=Ue(e.s*(t.sat==null?1:t.sat)),o=Ue(e.l*(t.light==null?1:t.light));return la({h:s,s:i,l:o})}var bl=Object.freeze([Object.freeze([0,8,2,10]),Object.freeze([12,4,14,6]),Object.freeze([3,11,1,9]),Object.freeze([15,7,13,5])]);function ua(n){let t=n||{},e=null,s=!1,i={vignette:{enabled:$i(t.vignette&&t.vignette.enabled,!1),strength:Ki(t.vignette&&t.vignette.strength,.5)},dither:{enabled:$i(t.dither&&t.dither.enabled,!1),strength:Ki(t.dither&&t.dither.strength,.5)},scanline:{enabled:$i(t.scanline&&t.scanline.enabled,!1),strength:Ki(t.scanline&&t.scanline.strength,.5)}};function o(a){let c=a!==void 0?a:e?e.getContext2d():null;if(!c)return;let l=c.canvas?c.canvas.width:0,u=c.canvas?c.canvas.height:0;if(i.vignette.enabled&&i.vignette.strength>0&&l>0&&u>0){let h=c.createRadialGradient(l/2,u/2,Math.min(l,u)*.25,l/2,u/2,Math.max(l,u)*.75);h.addColorStop(0,"rgba(0,0,0,0)"),h.addColorStop(1,"rgba(0,0,0,"+i.vignette.strength.toFixed(3)+")"),c.fillStyle=h,c.fillRect(0,0,l,u)}if(i.scanline.enabled&&i.scanline.strength>0&&l>0&&u>0){c.fillStyle="rgba(0,0,0,"+(i.scanline.strength*.5).toFixed(3)+")";for(let h=0;h0&&l>0&&u>0&&typeof c.getImageData=="function"&&typeof c.putImageData=="function"){let h=c.getImageData(0,0,l,u);xl(h,i.dither.strength),c.putImageData(h,0,0)}}return{name:"palette-post",version:"1.0.0",dependencies:[],init(a){e=a},dispose(){s||(e=null,s=!0)},applyPaletteMap(a,c){return dl(a,c)},applyPaletteMapToBuffer(a,c){return fl(a,c)},lerpPaletteMap(a,c,l){return yl(a,c,l)},shiftHsl(a,c){return ml(a,c)},rgbToHsl(a){return ca(a)},hslToRgb(a){return la(a)},setPost(a){if(a)for(let c of["vignette","dither","scanline"])a[c]&&(typeof a[c].enabled=="boolean"&&(i[c].enabled=a[c].enabled),typeof a[c].strength=="number"&&(i[c].strength=Ue(a[c].strength)))},getPost(){return{vignette:{enabled:i.vignette.enabled,strength:i.vignette.strength},dither:{enabled:i.dither.enabled,strength:i.dither.strength},scanline:{enabled:i.scanline.enabled,strength:i.scanline.strength}}},renderPost(a){o(a)},probe(){return{disposed:s,post:this.getPost()}}}}function xl(n,t){let e=Ue(t);if(e<=0)return n;let{data:s,width:i}=n,r=255/(Math.max(2,Math.round(16-e*14))-1);for(let a=0;a+3>2)%i,l=Math.floor((a>>2)/i),u=(bl[l&3][c&3]/16-.5)*r;for(let h=0;h<3;h++){let p=s[a+h]+u,d=Math.round(p/r)*r;s[a+h]=d<0?0:d>255?255:d}}return n}function $i(n,t){return typeof n=="boolean"?n:t}function Ki(n,t){return typeof n=="number"?Ue(n):t}var Zi=Object.freeze({blip:Object.freeze({name:"blip",params:Object.freeze([.6,0,880,0,.03,.06,1,1.5])}),thud:Object.freeze({name:"thud",params:Object.freeze([.8,0,90,0,.04,.18,0,1,0,0,0,0,0,4])}),chime:Object.freeze({name:"chime",params:Object.freeze([.5,0,660,.02,.12,.3,1,2])})}),ha=Object.keys(Zi);function vl(n){let t=[];return n==null||typeof n!="object"?{ok:!1,errors:["song \u5FC5\u987B\u662F\u5BF9\u8C61"]}:(!Array.isArray(n.instruments)||n.instruments.length===0?t.push("instruments \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4"):n.instruments.forEach((e,s)=>{(!Array.isArray(e)||e.some(i=>typeof i!="number"||!Number.isFinite(i)))&&t.push(`instruments[${s}] \u5FC5\u987B\u662F\u6709\u9650\u6570\u5B57\u6570\u7EC4\uFF08ZzFX \u53C2\u6570\u5305\uFF09`)}),!Array.isArray(n.patterns)||n.patterns.length===0?t.push("patterns \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4"):n.patterns.forEach((e,s)=>{if(!Array.isArray(e)||e.length===0){t.push(`patterns[${s}] \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4\uFF08\u81F3\u5C11\u4E00\u4E2A\u58F0\u90E8\u901A\u9053\uFF09`);return}e.forEach((i,o)=>{if(!Array.isArray(i)||i.length<2){t.push(`patterns[${s}][${o}] \u901A\u9053\u81F3\u5C11\u542B [\u4E50\u5668\u7D22\u5F15, \u58F0\u50CF]`);return}if(i.some(c=>typeof c!="number"||!Number.isFinite(c))){t.push(`patterns[${s}][${o}] \u901A\u9053\u5FC5\u987B\u5168\u4E3A\u6709\u9650\u6570\u5B57`);return}let r=i[0]|0;Array.isArray(n.instruments)&&(r<0||r>=n.instruments.length)&&t.push(`patterns[${s}][${o}] \u4E50\u5668\u7D22\u5F15 ${r} \u8D8A\u754C\uFF08instruments \u957F\u5EA6 ${n.instruments.length}\uFF09`);let a=i[1];(a<-1||a>1)&&t.push(`patterns[${s}][${o}] \u58F0\u50CF ${a} \u8D8A\u754C\uFF08\u5E94 -1..+1\uFF09`)})}),!Array.isArray(n.sequence)||n.sequence.length===0?t.push("sequence \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4"):n.sequence.forEach((e,s)=>{if(typeof e!="number"||!Number.isInteger(e)){t.push(`sequence[${s}] \u5FC5\u987B\u662F\u6574\u6570 pattern \u7D22\u5F15`);return}Array.isArray(n.patterns)&&(e<0||e>=n.patterns.length)&&t.push(`sequence[${s}] \u7D22\u5F15 ${e} \u8D8A\u754C\uFF08patterns \u957F\u5EA6 ${n.patterns.length}\uFF09`)}),n.bpm!=null&&(typeof n.bpm!="number"||!(n.bpm>0))&&t.push("bpm \u5FC5\u987B\u662F\u6B63\u6570"),{ok:t.length===0,errors:t})}function pe(n){return typeof n!="number"||Number.isNaN(n)||n<0?0:n>1?1:n}function Sl(n,t){switch(n){case"ease-in":return t*t;case"ease-out":return Math.sqrt(t);case"constant":return 1;default:return t}}function da(n,t){let e=pe(t);return n==null||!Array.isArray(n.voices)?[]:n.voices.map(s=>{let i=String(s&&s.id!=null?s.id:""),o=Array.isArray(s&&s.channelIndices)?s.channelIndices.slice():[],r=typeof s.minIntensity=="number"?pe(s.minIntensity):0,a=typeof s.maxIntensity=="number"?pe(s.maxIntensity):1,c=typeof s.volumeCurve=="string"?s.volumeCurve:"linear",l=typeof s.baseVolume=="number"?pe(s.baseVolume):1;if(ea)return{id:i,on:!1,volume:0,channelIndices:o};let u=a-r,h=u<=0?1:(e-r)/u,p=pe(Sl(c,h)*l);return{id:i,on:!0,volume:p,channelIndices:o}})}function fa(n,t,e,s){try{let i=t[0]||[],o=t[1]||i,r=Math.max(i.length,o.length);if(r===0)return null;let c=n.createBuffer(2,r,44100);c.getChannelData(0).set(i),c.getChannelData(1).set(o.length?o:i);let l=n.createBufferSource();l.buffer=c,l.loop=!!s;let u=n.createGain();return u.gain.value=pe(e*.3),l.connect(u),u.connect(n.destination),l.start(),{stop(){try{l.stop()}catch(h){}try{l.disconnect(),u.disconnect()}catch(h){}}}}catch(i){return to("[audio-music] \u53D7\u63A7\u97F3\u9891\u64AD\u653E\u5F02\u5E38\uFF0C\u964D\u7EA7\u4E3A\u9759\u9ED8",i),null}}function pa(n){let t=n||{},e=typeof t.masterVolume=="number"?pe(t.masterVolume):1,s=()=>null,i=null,o=null,r={voices:[]},a=1,c=null,l=!1,u=0,h=!1,p=!1;function d(){let w=s();return w==null?(u+=1,h||(Qi("[audio-music] \u65E0\u53D7\u63A7\u97F3\u9891\u4E0A\u4E0B\u6587\uFF08getAudioContext \u8FD4\u56DE null\uFF09\uFF0C\u5168\u90E8\u53D1\u58F0\u9759\u9ED8 no-op\uFF08\u8BC4\u4F30\u73AF\u5883\u65E0\u58F0\u5361\u65F6\u7684\u5BB9\u9519\u964D\u7EA7\uFF09"),h=!0),null):w}function y(){if(!o||!i)return null;try{let w=typeof o.bpm=="number"&&o.bpm>0?o.bpm:125;return i.synthSong(o.instruments,o.patterns,o.sequence,w)}catch(w){return to("[audio-music] \u66F2\u8C31\u6E32\u67D3\u5F02\u5E38\uFF0C\u964D\u7EA7\u4E3A\u9759\u9ED8",w),null}}function b(){let w=da(r,a);if(w.length===0)return 1;let E=0;for(let A of w)A.on&&(E=Math.max(E,A.volume));return E}function v(w,E){typeof E=="number"&&(a=pe(E));let A=d();if(A==null||!o)return;S();let T=y();if(!T)return;let R=pe(e*b());c=fa(A,T,R,w),l=!!w&&c!=null}function S(){c&&(c.stop(),c=null),l=!1}return{name:"audio-music",version:"1.0.0",dependencies:[],init(w){s=()=>w.getAudioContext();let E=w.getEngine&&w.getEngine();i=E?E.audio.synth:null},dispose(){p||(S(),p=!0)},loadSong(w){let E=vl(w);return E.ok?o={instruments:w.instruments,patterns:w.patterns,sequence:w.sequence,bpm:typeof w.bpm=="number"?w.bpm:125}:Qi("[audio-music] \u66F2\u8C31\u6821\u9A8C\u5931\u8D25\uFF0C\u672A\u8F7D\u5165\uFF1A"+E.errors.join("\uFF1B")),E},play(w){v(!1,w)},stop(){S()},loop(w){v(!0,w)},setIntensityLayering(w){r=w&&Array.isArray(w.voices)?{voices:w.voices}:{voices:[]}},setIntensity(w){a=pe(w)},resolveVoices(w){return da(r,w)},playSfx(w){let E=Zi[w];if(!E){Qi("[audio-music] \u672A\u77E5\u97F3\u6548\u9884\u8BBE\uFF1A"+String(w));return}let A=d();if(A!=null)try{let T=i?i.synthSfx(E.params):null;if(!T)return;fa(A,[T,T],e,!1)}catch(T){to("[audio-music] \u97F3\u6548\u64AD\u653E\u5F02\u5E38\uFF0C\u964D\u7EA7\u4E3A\u9759\u9ED8 name="+w,T)}},getPreset(w){return Zi[w]},listPresets(){return ha.slice()},probe(){return{hasAudio:s()!=null,hasSong:o!=null,intensity:a,voiceCount:r.voices.length,looping:l,silentNoops:u,presetCount:ha.length}}}}function to(n,t){let e=t&&t.stack?t.stack:t&&t.message?t.message:t;typeof console!="undefined"&&typeof console.error=="function"&&console.error(n+(e?"\uFF1A"+e:""))}function Qi(n){typeof console!="undefined"&&typeof console.warn=="function"&&console.warn(n)}var wl="zaomeng.save";function Tl(n){if(typeof TextEncoder!="undefined")return new TextEncoder().encode(n).length;if(typeof Buffer!="undefined"&&typeof Buffer.byteLength=="function")return Buffer.byteLength(n,"utf8");let t=0;for(let e=0;e=55296&&s<=56319?(t+=4,e++):t+=3}return t}function no(){let n=new Map;return{getItem(t){return n.has(t)?n.get(t):null},setItem(t,e){n.set(t,e)},removeItem(t){n.delete(t)},keys(){return Array.from(n.keys())}}}function ga(){if(typeof localStorage=="undefined")throw new Error("[save-progress] createLocalStorageAdapter \u9700\u8981\u5168\u5C40 localStorage\uFF08\u4EC5\u6D4F\u89C8\u5668\u96C6\u6210\u6BB5\u53EF\u7528\uFF09\u3002node/host-dev \u8BF7\u7528\u7F3A\u7701\u5185\u5B58 adapter \u6216 createMemoryAdapter()\u3002");return{getItem(n){return localStorage.getItem(n)},setItem(n,t){localStorage.setItem(n,t)},removeItem(n){localStorage.removeItem(n)},keys(){let n=[];for(let t=0;t0?t.namespace:wl;if(e.indexOf(":")>=0)throw new Error('[save-progress] namespace \u4E0D\u5F97\u542B\u5206\u9694\u7B26 ":"\uFF08\u5F53\u524D="'+e+'"\uFF09');let s=typeof t.maxValueBytes=="number"&&t.maxValueBytes>0?Math.floor(t.maxValueBytes):32768,i=!Al(t.adapter),o=i?no():t.adapter,r=e+":",a=0,c=0,l=!1;function u(d){return typeof d!="string"||d.length===0?r+String(d):r+d}function h(){try{let d=o.keys();return Array.isArray(d)?d.filter(y=>typeof y=="string"&&y.indexOf(r)===0):[]}catch(d){return Xn("[save-progress] adapter.keys() \u5F02\u5E38\uFF0C\u964D\u7EA7\u8FD4\u56DE\u7A7A\u96C6",d),[]}}return{name:"save-progress",version:"1.0.0",dependencies:[],init(d){h()},dispose(){},get(d,y){if(!eo(d))return y;let b;try{b=o.getItem(u(d))}catch(v){return Xn("[save-progress] adapter.getItem \u5F02\u5E38\uFF0C\u8FD4\u56DE\u9ED8\u8BA4\u503C key="+d,v),y}if(b==null)return y;try{return JSON.parse(b)}catch{return a+=1,l||(Yn("[save-progress] \u68C0\u6D4B\u5230\u635F\u574F\u5B58\u6863\uFF08\u975E\u6CD5 JSON\uFF09\uFF0C\u5DF2\u5BB9\u9519\u56DE\u9000\u9ED8\u8BA4\u503C key="+d),l=!0),y}},set(d,y){if(!eo(d))return Yn("[save-progress] set \u6536\u5230\u975E\u6CD5 key\uFF0C\u62D2\u7EDD\u5199\u5165\uFF1A"+String(d)),!1;let b;try{b=JSON.stringify(y)}catch{return c+=1,Yn("[save-progress] \u503C\u4E0D\u53EF JSON \u5E8F\u5217\u5316\uFF08\u5FAA\u73AF\u5F15\u7528?\uFF09\uFF0C\u62D2\u7EDD\u5199\u5165 key="+d),!1}if(b===void 0)return c+=1,Yn("[save-progress] \u503C\u5E8F\u5217\u5316\u4E3A undefined\uFF08\u5982\u7EAF undefined/\u51FD\u6570\uFF09\uFF0C\u62D2\u7EDD\u5199\u5165 key="+d),!1;let v=Tl(b);if(v>s)return c+=1,Yn("[save-progress] \u503C\u8D85\u5B57\u8282\u4E0A\u9650\u62D2\u7EDD\u5199\u5165 key="+d+"\uFF08"+v+" > "+s+" bytes\uFF09"),!1;try{return o.setItem(u(d),b),!0}catch(S){return c+=1,Xn("[save-progress] adapter.setItem \u5F02\u5E38\uFF0C\u5199\u5165\u5931\u8D25 key="+d,S),!1}},remove(d){if(eo(d))try{o.removeItem(u(d))}catch(y){Xn("[save-progress] adapter.removeItem \u5F02\u5E38\uFF08\u5DF2\u5FFD\u7565\uFF09key="+d,y)}},clear(){let d=h(),y=0;for(let b of d)try{o.removeItem(b),y+=1}catch(v){Xn("[save-progress] clear \u65F6 removeItem \u5F02\u5E38\uFF08\u5DF2\u8DF3\u8FC7\uFF09fullKey="+b,v)}return y},probe(){return{namespace:e,maxValueBytes:s,usingMemoryAdapter:i,size:h().length,corruptRecoveries:a,rejectedWrites:c}}}}function eo(n){return typeof n=="string"&&n.length>0}function Al(n){return!!n&&typeof n.getItem=="function"&&typeof n.setItem=="function"&&typeof n.removeItem=="function"&&typeof n.keys=="function"}function Xn(n,t){let e=t&&t.stack?t.stack:t&&t.message?t.message:t;typeof console!="undefined"&&typeof console.error=="function"&&console.error(n+(e?"\uFF1A"+e:""))}function Yn(n){typeof console!="undefined"&&typeof console.warn=="function"&&console.warn(n)}var Cl={w:390,h:844};function ma(n){let t=((n&&n.seed)!=null?n.seed:0)>>>0,e=ta({cellSize:96}),s=ea(),i=ra({inputBufferMs:260,inputTypes:["pointerdown"]}),o=aa({seed:t,maxParticles:600}),r=ua({vignette:{enabled:!0,strength:.22}}),a=pa({masterVolume:.8}),c;try{c=ga()}catch(p){console.warn("[generic] localStorage \u4E0D\u53EF\u7528\uFF0C\u5B58\u6863\u9000\u5185\u5B58 adapter\uFF1A"+(p&&p.message)),c=no()}let l=ya({namespace:"zaomeng-generic",adapter:c});return{plugins:{collision:e,physics:s,gamefeel:i,juice:o,palettePost:r,audioMusic:a,save:l},registerOrder:[e,s,i,o,r,l,a],viewport:Cl,buildFactoryOpts:(p,d)=>({runtime:{plugins:d.plugins,bundle:d.bundle,getRealAudioCtx:d.getRealAudioCtx}})}}function $n(n){let t=n||{},e=null,s=0,i=null,o={x:110,y:422,vy:0,r:12},r=420,a=-260,c=150,l=60,u=220,h=280,p=u/2,d=844-u/2,y=12,b=[],v=0,S="booting",_="",w=null,E=!1,A=!1,T=!1,R={x:0,y:0};function M(){o.y=422,o.vy=0,b=[],v=0,S="playing",_="",w=null,E=!1,A=!1,T=!1;let I=390+l/2+180;b.push({x:I,centerY:ct(),scored:!1})}function ct(){return e&&e.random&&e.random.range?e.random.range(p,d):422}function et(I,N){let Y=e.getEngine();if(Y){if(Y.particles)try{let ht=Y.particles.spawnEmitter({pos:{x:I.x,y:I.y},count:N==="crash"?35:22,emitRate:0,particleTime:.6,speed:N==="crash"?160:110,coneAngle:N==="crash"?Math.PI:.5,sizeStart:N==="crash"?16:12,sizeEnd:2,colorStart:N==="crash"?{r:1,g:.1,b:.1,a:1}:N==="score"?{r:.2,g:1,b:.3,a:1}:{r:.3,g:.7,b:1,a:1},colorEnd:N==="crash"?{r:1,g:.3,b:0,a:0}:{r:.1,g:.5,b:1,a:0}})}catch{}if(Y.audio&&Y.audio.synth)try{N==="flap"?Y.audio.synth.synthSfx([1,.05,340,,,.12,,1.2,,,,,,,,.1]):N==="score"?Y.audio.synth.synthSfx([1,.05,880,,,.22,,1.9,,,,,,,,.4]):N==="crash"&&Y.audio.synth.synthSfx([2,.5,90,,,.5,,.3,,,,,,,,.1])}catch{}}}function lt(I){if(S==="playing")o.vy=a,E=!0;else if(S==="gameover"){let Pt=I.x||0,he=I.y||0;Pt>=115&&Pt<=275&&he>=620&&he<=680&&M()}}function gt(I){e=I.ctx,i=e.getInput().on("pointerdown",lt),M(),S="playing"}function kt(I){if(s=e.time.nowMs(),S!=="playing")return;let N=r;if(o.vy+=N*I,o.y+=o.vy*I,o.y-y<=0||o.y+y>=844){Ee("boundary");return}for(let it of b)it.x-=c*I;b=b.filter(it=>it.x>-l/2-10);let Y=b.length>0?b[b.length-1]:null;if(!Y||Y.x<=390+l/2-h){let it=Y?Y.x+h:390+l/2+180;b.push({x:it,centerY:ct(),scored:!1})}let ht={x:o.x-y,y:o.y-y,w:y*2,h:y*2};for(let it of b){let Pt=it.centerY-u/2,he=it.centerY+u/2,An={x:it.x-l/2,y:0,w:l,h:Pt},Cn={x:it.x-l/2,y:he,w:l,h:844-he},En=(de,$t)=>de.x<$t.x+$t.w&&de.x+de.w>$t.x&&de.y<$t.y+$t.h&&de.y+de.h>$t.y;if(En(ht,An)||En(ht,Cn)){Ee("pipe_collision");return}!it.scored&&it.x+l/2{if(S!=="playing")return null;let N=null;for(let Y of b)Y.x>o.x-y&&(!N||Y.x({phase:S,result:w,score:v,bird:{x:o.x,y:o.y,vy:o.vy},nextGap:I,gameoverReason:_})}}return{init:gt,update:kt,render:Gt,destroy:ut,_forensicsView:Rt}}var pd=$n,gd=$n;async function yd(n){let t=n||{},e=t.engine||await Promise.resolve().then(()=>(Oc(),Lc)),s=(t.seed!=null?t.seed:305441741)>>>0,i=ma({seed:s});return Zr({canvas:t.canvas,statusEl:t.statusEl||null,engine:e,seed:s,mode:t.mode||"play",engineMode:"real",viewport:i.viewport,factory:$n,plugins:i.plugins,registerOrder:i.registerOrder,buildFactoryOpts:i.buildFactoryOpts,recHook:t.recHook||null,onReady:t.onReady||null})}return Bc(md);})();
+color = `+this.color),t}renderDebug(t=!0){let e=t?this.isHoverObject()?Xa:this.disabled?Ka:this.interactive?nr:$a:Ya;E.drawRect(this.nativePos,this.size,ue,4,e)}click(t=!0){this.onClick(),t&&this.soundClick&&this.soundClick.play()}onUpdate(){}onRender(){}onEnter(){}onLeave(){}onPress(){}onRelease(){}onClick(){}onChange(){}},gi=class extends ee{constructor(t,e,s="",i="center",o=E.defaultFont){super(t,e),f(J(s),"ui text must be a string"),f(["left","center","right"].includes(i),"ui text align must be left, center, or right"),f(J(o),"ui text font must be a string"),this.text=s,this.align=i,this.font=o,this.canBeHover=!1,this.color=ue,this.shadowColor=ue,this.gradientColor=void 0,this.lineWidth=0,this.textFitScale=1}render(){super.render();let t=this.getTextSize();E.drawText(this.text,this.nativePos,t,this.textColor,this.textLineWidth,this.textLineColor,this.align,this.font,this.fontStyle,!0,this.textShadow,this.shadowColor,this.shadowBlur,this.shadowOffset)}},Lo=class extends ee{constructor(t,e,s=""){super(t,e),f(J(s),"ui text must be a string"),this.maxLength=0,this.text=s,this.interactive=!0,this.canBeHover=!0}click(){E.keyInputObject=this,this.onClick()}stopEditing(){this.isKeyInputObject()&&(this.soundRelease&&this.soundRelease.play(),E.activeObject=void 0,E.keyInputObject=void 0,this.onChange())}onKeyDown(t){let e=t.code,s=t.key;e==="Backspace"?this.text=this.text.slice(0,-1):e==="Enter"||e==="Escape"?this.stopEditing():s.length===1&&(!this.maxLength||this.text.lengththis.size.y,s=e?this.size.y:this.size.x,i=e?this.size.x:this.size.y,o=e?this.nativePos.x:this.nativePos.y,r=i-s,a=o-r/2,c=o+r/2,l=E.screenToNative(Ft);this.value=e?Mt(l.x,a,c):Mt(l.y,c,a)}else if(this.isNavigationObject()){let e=E.getNavigationOtherDirection();E.navigationTimer.active()||(this.value=j(this.value+e*.01))}this.value===t||this.onChange()}render(){super.render();let t=this.size.x>this.size.y,e=t?this.size.x:this.size.y,s=t?this.size.y:this.size.x;if(this.fillMode){let o=K(s,this.cornerRadius*2),r=Nt(o,e,this.value),a=(r-e)*(t?.5:-.5),c=this.nativePos.add(t?b(a,0):b(0,a)),l=this.disabled?this.disabledColor:this.handleColor,u=t?b(r,this.size.y):b(this.size.x,r);E.drawRect(c,u,l,this.lineWidth,this.lineColor,this.cornerRadius,this.gradientColor)}else{let o=j(t?this.value:1-this.value),r=(e-s)*(o-.5),a=this.nativePos.add(t?b(r,0):b(0,r)),c=this.disabled?this.disabledColor:this.handleColor,l=b(s);E.drawRect(a,l,c,this.lineWidth,this.lineColor,this.cornerRadius,this.gradientColor)}let i=this.getTextSize();E.drawText(this.text,this.nativePos,i,this.textColor,this.textLineWidth,this.textLineColor,this.align,this.font,this.fontStyle,!0,this.textShadow)}navigatePressed(){this.value=this.value?0:1,this.onChange(),this.onRelease(),super.navigatePressed()}},Mo=class extends ee{constructor(t,e,s,i=!1,o=!1,r=1){super(t,e||b()),f(J(s),"video src must be a string"),f(P(r),"video volume must be a number"),this.color=et,this.cornerRadius=0,this.volume=r,this.video=document.createElement("video"),this.video.loop=o,this.video.volume=j(r*gn),this.video.muted=!Jt,this.video.style.display="none",this.video.src=s,document.body.appendChild(this.video),i&&this.play()}async play(){try{await this.video.play()}catch{}}pause(){this.video.pause()}stop(){this.video.pause(),this.video.currentTime=0}isLoading(){return this.video.readyState=1,"ui layout columns must be a number >= 1"),f(P(s),"ui layout gap must be a number"),f(P(i),"ui layout padding must be a number"),this.columns=e,this.gap=s,this.padding=i,o&&(this.color=ue,this.gradientColor=void 0,this.lineWidth=0,this.shadowColor=ue),this.relayout()}addChild(t){return super.addChild(t),this.relayout(),t}removeChild(t){super.removeChild(t),this.relayout()}relayout(){let t=this.children.length;if(!t){this.size=b(this.padding*2);return}let e=this.columns,s=is(t/e),i=new Array(e).fill(0),o=new Array(s).fill(0);for(let p=0;p=0&&m.objects.splice(t,1),super.destroy()}updatePhysics(){}render(){this.tileInfo?super.render():this.drawFixtures(this.color,this.lineColor,this.lineWidth)}renderDebugInfo(){let t=!this.getIsAwake(),e=this.getBodyType()===m.bodyTypeStatic,s=N(t?1:0,t?1:0,e?1:0,.5);this.drawFixtures(s)}drawFixtures(t=U,e=et,s=.1,i,o){this.getFixtureList().forEach(r=>{m.castShapeObject(r.GetShape()).GetType()!==m.instance.b2Shape.e_edge&&m.drawFixture(r,this.pos,this.angle,t,e,s,i,o)}),this.edgeLists.forEach(r=>fo(r,s,e,!1,this.pos,this.angle)),this.edgeLoops.forEach(r=>fo(r,s,e,!0,this.pos,this.angle))}beginContact(t){}endContact(t){}addShape(t,e=1,s=.2,i=0,o=!1){f(P(e),"density must be a number"),f(P(s),"friction must be a number"),f(P(i),"restitution must be a number");let r=new m.instance.b2FixtureDef;return r.set_shape(t),r.set_density(e),r.set_friction(s),r.set_restitution(i),r.set_isSensor(o),this.body.CreateFixture(r)}addBox(t=b(1),e=b(),s=0,i,o,r,a){f(L(t),"size must be a Vector2"),f(t.x>0&&t.y>0,"size must be positive"),f(L(e),"offset must be a Vector2"),f(P(s),"angle must be a number");let c=new m.instance.b2PolygonShape;return c.SetAsBox(t.x/2,t.y/2,m.vec2dTo(e),-s),this.addShape(c,i,o,r,a)}addPoly(t,e,s,i,o){f(ce(t),"points must be an array");function r(c){f(3<=c.length&&c.length<=8);let l=m.instance._malloc(c.length*8);for(let p=0,d=0;p>2]=c[p].x,d+=4,m.instance.HEAPF32[l+d>>2]=c[p].y,d+=4;let u=m.instance.wrapPointer(l,m.instance.b2Vec2),h=new m.instance.b2PolygonShape;return h.Set(u,c.length),m.instance._free(l),h}let a=r(t);return this.addShape(a,e,s,i,o)}addRegularPoly(t=1,e=8,s,i,o,r){f(P(t)&&t>0,"diameter must be a positive number"),f(P(e)&&e>2,"sides must be a positive number greater than 2");let a=[],c=t/2;for(let l=e;l--;)a.push(b(c,0).rotate((l+.5)/e*q*2));return this.addPoly(a,s,i,o,r)}addRandomPoly(t=1,e,s,i,o){f(P(t)&&t>0,"diameter must be a positive number");let r=er(3,9),a=[],c=t/2;for(let l=r;l--;)a.push(b(ut(c/2,c*1.5),0).rotate(l/r*q*2));return this.addPoly(a,e,s,i,o)}addCircle(t=1,e=b(),s,i,o,r){f(P(t)&&t>0,"diameter must be a positive number"),f(L(e),"offset must be a Vector2");let a=new m.instance.b2CircleShape;return a.set_m_p(m.vec2dTo(e)),a.set_m_radius(t/2),this.addShape(a,s,i,o,r)}addEdge(t,e,s,i,o,r){f(L(t),"point1 must be a Vector2"),f(L(e),"point2 must be a Vector2");let a=new m.instance.b2EdgeShape;return a.Set(m.vec2dTo(t),m.vec2dTo(e)),this.addShape(a,s,i,o,r)}addEdgeList(t,e,s,i,o){f(ce(t),"points must be an array");let r=[],a=[];for(let c=0;ct[Qt(l,t.length)];for(let l=0;lthis.destroyFixture(t))}getCenterOfMass(){return m.vec2From(this.body.GetWorldCenter())}getLinearVelocity(){return m.vec2From(this.body.GetLinearVelocity())}getAngularVelocity(){return this.body.GetAngularVelocity()}getMass(){return this.body.GetMass()}getInertia(){return this.body.GetInertia()}getIsAwake(){return this.body.IsAwake()}getBodyType(){return this.body.GetType()}getSpeed(){return this.getLinearVelocity().length()}setTransform(t,e){this.pos=t,this.angle=e,this.body.SetTransform(m.vec2dTo(t),-e)}setPosition(t){this.setTransform(t,this.body.GetAngle())}setAngle(t){this.setTransform(m.vec2From(this.body.GetPosition()),t)}setLinearVelocity(t){this.body.SetLinearVelocity(m.vec2dTo(t))}setAngularVelocity(t){this.body.SetAngularVelocity(t)}setLinearDamping(t){this.body.SetLinearDamping(t)}setAngularDamping(t){this.body.SetAngularDamping(t)}setGravityScale(t=1){this.body.SetGravityScale(this.gravityScale=t)}setBullet(t=!0){this.body.SetBullet(t)}setAwake(t=!0){this.body.SetAwake(t)}setBodyType(t){this.body.SetType(t)}setSleepingAllowed(t=!0){this.body.SetSleepingAllowed(t)}setFixedRotation(t=!0){this.body.SetFixedRotation(t)}setCenterOfMass(t){this.setMassData(t)}setMass(t){this.setMassData(void 0,t)}setMomentOfInertia(t){this.setMassData(void 0,void 0,t)}resetMassData(){this.body.ResetMassData()}setMassData(t,e,s){let i=new m.instance.b2MassData;this.body.GetMassData(i),t!==void 0&&i.set_center(m.vec2dTo(t)),e!==void 0&&i.set_mass(e),s!==void 0&&i.set_I(s),this.body.SetMassData(i)}setFilterData(t=0,e=0,s=0){this.getFixtureList().forEach(i=>{let o=i.GetFilterData();o.set_categoryBits(t),o.set_maskBits(65535&~e),o.set_groupIndex(s)})}setSensor(t=!0){this.getFixtureList().forEach(e=>e.SetSensor(t))}applyForce(t,e){e||(e=this.getCenterOfMass()),this.setAwake(),this.body.ApplyForce(m.vec2dTo(t),m.vec2dTo(e))}applyAcceleration(t,e){e||(e=this.getCenterOfMass()),this.setAwake();let s=t.scale(this.getMass());this.body.ApplyLinearImpulse(m.vec2dTo(s),m.vec2dTo(e))}applyImpulse(t,e){e||(e=this.getCenterOfMass()),this.setAwake(),this.body.ApplyLinearImpulse(m.vec2dTo(t),m.vec2dTo(e))}applyTorque(t){this.setAwake(),this.body.ApplyTorque(t)}applyAngularAcceleration(t){this.setAwake(),this.body.ApplyAngularImpulse(t*this.getInertia())}applyAngularImpulse(t){this.setAwake(),this.body.ApplyAngularImpulse(t)}hasFixtures(){return!m.isNull(this.body.GetFixtureList())}getFixtureList(){let t=[];for(let e=this.body.GetFixtureList();!m.isNull(e);)t.push(e),e=e.GetNext();return t}hasJoints(){return!m.isNull(this.body.GetJointList())}getJointList(){let t=[];for(let e=this.body.GetJointList();!m.isNull(e);)t.push(e),e=e.get_next();return t}},yi=class extends Ss{constructor(t,e,s,i=0,o,r=0){let a=m.bodyTypeStatic;super(t,e,s,i,o,a,r)}},Go=class extends Ss{constructor(t,e,s,i=0,o,r=0){let a=m.bodyTypeKinematic;super(t,e,s,i,o,a,r)}},Fo=class extends yi{constructor(t){f(t instanceof ps,"tileLayer must be a TileCollisionLayer"),super(t.pos,t.size),this.tileLayer=t,this.addChild(t)}render(){}buildCollision(t=.2,e=0){this.destroyAllFixtures(),this.pos=this.tileLayer.pos.copy(),this.size=this.tileLayer.size.copy();let s=[],i=(r,a)=>r+a*this.size.x,o=(r,a)=>!s[i(r,a)]&&this.tileLayer.getCollisionData(b(r,a))>0;for(let r=0;ri.fractiono.pos.distanceSquared(t)0,"Tween duration must be > 0"),this.callback=t,this.start=e,this.end=s,this.duration=i,this.life=i,this.ease=o.ease||Si.LINEAR,this.useRealTime=!!o.useRealTime,this.paused=!!o.paused,this.thenCallback=void 0,this.loopRemaining=0,qt.push(this),t(this.interp(i))}setEase(t){return this.ease=t,this}then(t){return this.thenCallback=t,this.loopRemaining=0,this}loop(t=1/0){return this.loopRemaining=t,this.thenCallback=()=>Cc(this),this}pingPong(t=1/0){return this.loopRemaining=t,this.thenCallback=()=>Rc(this),this}pause(){this.paused=!0}resume(){this.paused=!1}restart(){this.life=this.duration,this.paused=!1,qt.indexOf(this)<0&&qt.push(this),this.callback(this.interp(this.duration))}isActive(){return!this.paused&&qt.indexOf(this)>=0}getPercent(){return Mt(this.duration-this.life,0,this.duration)}getValue(){return this.interp(this.life)}interp(t){let e=this.ease((this.duration-t)/this.duration);return Ca(this.start)?this.start.lerp(this.end,e):this.start+(this.end-this.start)*e}stop(){let t=qt.indexOf(this);t>=0&&qt.splice(t,1),this.thenCallback=void 0}},Si={LINEAR:n=>n,POWER:n=>t=>t**n,SINE:n=>1-at(n*(q/2)),CIRC:n=>1-(1-n*n)**.5,EXPO:n=>n===0?0:2**(10*n-10),BACK:n=>n*n*(2.70158*n-1.70158),ELASTIC:n=>n===0?0:n===1?1:-(2**(10*n-10))*tt((37-40*n)*q/6),SPRING:n=>1-(tt(q*(1-n)*(.2+2.5*(1-n)**3))*n**2.2+(1-n))*(1+1.2*n),BOUNCE:n=>{let t=1-n,e;return t<4/11?e=7.5625*t*t:t<8/11?e=7.5625*(t-=6/11)*t+.75:t<10/11?e=7.5625*(t-=9/11)*t+.9375:e=7.5625*(t-=10.5/11)*t+.984375,1-e},IN:n=>n,OUT:n=>t=>1-n(1-t),IN_OUT:n=>Si.PIECEWISE(n,Si.OUT(n)),PIECEWISE:(...n)=>{let t=n.length;return e=>{let s=e*t-1e-9>>0;return(n[s]((e-s/t)*t)+s)/t}},BEZIER:(n,t,e,s)=>{let i=o=>{let r=1-o,a=3*r*r*o,c=3*r*o*o,l=o**3;return[a*n+c*e+l,a*t+c*s+l]};return o=>{let r=0,a=1;for(let c=0;c<128;c++){let l=(r+a)/2,[u,h]=i(l);if(Z(u-o)<1e-5)return h;u=this.size.x||e>=this.size.y?null:this.nodes[t+e*this.size.x]}worldToTile(t){let e=this.tileLayer?this.tileLayer.pos.x:0,s=this.tileLayer?this.tileLayer.pos.y:0;return b(bt(t.x-e),bt(t.y-s))}tileToWorld(t,e){let s=this.tileLayer?this.tileLayer.pos.x:0,i=this.tileLayer?this.tileLayer.pos.y:0;return b(t+.5+s,e+.5+i)}buildNodeData(){let t=this.size.x,e=this.size.y,s=this.tileLayer?this.tileLayer.pos.x:0,i=this.tileLayer?this.tileLayer.pos.y:0;for(let o=0;o0&&(c?l>0&&pt(a.posWorld,oo,N(1,0,0,K(.2,l*.05)),this.debugTime):pt(a.posWorld,oo,N(1,0,0,.25),this.debugTime))}}aStarSearch(t,e){f(t&&e,"aStarSearch needs both endpoints"),f(t!==e,"aStarSearch: start and end must differ \u2014 caller should handle trivial case"),f(t.walkable&&e.walkable,"aStarSearch: endpoints must be walkable");let s=[t];t.isOpen=!0;let i=0;for(;s.length>0;){let o=0,r=s[0].f;for(let c=1;cthis.maxLoop)break;a.isOpen=!1,s.splice(o,1),a.isClosed=!0,this.debug&&this.debugTime>0&&pt(a.posWorld,oo,N(1,1,1,.05),this.debugTime);for(let c=-1;c<=1;++c)for(let l=-1;l<=1;++l){if(l===0&&c===0)continue;let u=this.getNode(a.pos.x+l,a.pos.y+c);if(!u||!u.walkable||u.isClosed)continue;let h=1;if(l!==0&&c!==0){let v=this.getNode(a.pos.x+l,a.pos.y);if(!v||!v.walkable)continue;let T=this.getNode(a.pos.x,a.pos.y+c);if(!T||!T.walkable)continue;h=fd}let p=a.g+h+u.cost;if(!u.isOpen)u.isOpen=!0,s.push(u);else if(p>=u.g)continue;u.parent=a,u.g=p;let d=Z(e.pos.x-u.pos.x),y=Z(e.pos.y-u.pos.y),x=X(d,y)+(Math.SQRT2-1)*K(d,y);u.f=u.g+x*this.heuristicWeight}}return e.parent!==null}getNearestClearNode(t,e=10,s=!0){f(L(t),"worldPos must be a Vector2"),s&&this.buildNodeData();let i=this.tileLayer?this.tileLayer.pos.x:0,o=this.tileLayer?this.tileLayer.pos.y:0,r=bt(t.x-i),a=bt(t.y-o);for(let c=0;c<=e;++c){let l=null,u=0;for(let h=-c;h<=c;++h)for(let p=-c;p<=c;++p){if(c>0&&Z(p)!==c&&Z(h)!==c)continue;let d=this.getNode(r+p,a+h);if(!d||!d.isClear())continue;let y=d.posWorld.x-t.x,x=d.posWorld.y-t.y,v=y*y+x*x;(!l||v0&&jt(i.posWorld,.3,N(.5,0,.5,.5),this.debugTime),t.splice(e,1),e=X(1,e-1);continue}else if(c===2){this.debug&&this.debugTime>0&&jt(i.posWorld,.3,N(1,0,0,.5),this.debugTime);let d,y;s.pos.y===i.pos.y&&o.pos.x===i.pos.x?(d=s.pos.x,y=o.pos.y):(d=o.pos.x,y=s.pos.y);let x=this.getNode(d,y);if(x&&x.isClear()){t.splice(e,1),e=X(1,e-1);continue}}else if(c===5){this.debug&&this.debugTime>0&&jt(i.posWorld,.3,N(1,1,0,.5),this.debugTime);let d=e>=2?t[e-2]:s,y,x,v,T;l===0||h===0?(y=o.pos.x,x=i.pos.y,v=s.pos.x,T=i.pos.y):(y=i.pos.x,x=o.pos.y,v=i.pos.x,T=s.pos.y);let C=y-d.pos.x,w=x-d.pos.y,_=v-d.pos.x,A=T-d.pos.y,S=C*C+w*w,R=_*_+A*A,M=S0&&jt(i.posWorld,.3,N(0,1,0,.5),this.debugTime),l===h&&u===p){++e;continue}else{let d,y;s.pos.y===o.pos.y?(d=i.pos.x,y=s.pos.y):(d=s.pos.x,y=i.pos.y);let x=this.getNode(d,y);if(x&&x.isClear()){t[e]=x,e=X(1,e-1);continue}}++e}}smoothPathStringPull(t){if(t.length<=2)return;for(let i of t)if(!i.isClear())return;let e=t.slice();t.length=0,t.push(e[0]);let s=0;for(let i=1;i0&&be(o.posWorld,t[t.length-1].posWorld,N(0,0,1,.3),.02,this.debugTime);continue}for(;s=1;--e){let s=t[e-1],i=t[e],o=t[e+1];(i.pos.x-s.pos.x)*(o.pos.y-s.pos.y)===(i.pos.y-s.pos.y)*(o.pos.x-s.pos.x)&&t.splice(e,1)}}isNodeClear(t,e){let s=this.getNode(t,e);return s!==null&&s.isClear()}isLineClear(t,e){f(L(t)&&L(e),"isLineClear needs Vector2 endpoints"),f(this.isNodeClear(t.x,t.y)&&this.isNodeClear(e.x,e.y),"isLineClear endpoints must be in-bounds and clear");let s=e.x-t.x,i=e.y-t.y,o=Z(s),r=Z(i),a=Kt(s),c=Kt(i),l=t.x,u=t.y;if(r===o){for(;l!==e.x;){if(l!==t.x&&(!this.isNodeClear(l,u)||!this.isNodeClear(l,u-c))||!this.isNodeClear(l,u+c))return!1;l+=a,u+=c}if(!this.isNodeClear(e.x,e.y-c))return!1}else if(ra.posWorld.copy());if(this.debug&&this.debugTime>0&&r.length>0){for(let a=1;apd,bootGameHost:()=>yd,default:()=>gd});var Is=class{constructor(t){this._state=(t==null?2654435769:t)>>>0}next(){this._state=this._state+1831565813>>>0;let t=this._state;return t=Math.imul(t^t>>>15,t|1),t^=t+Math.imul(t^t>>>7,t|61),((t^t>>>14)>>>0)/4294967296}range(t,e){return t+this.next()*(e-t)}reseed(t){this._state=(t==null?2654435769:t)>>>0}},ji=class{constructor(t){this._clock=t||Jc(),this._origin=this._clock()}nowMs(){return this._clock()}elapsedMs(){return this._clock()-this._origin}},Bi=class{constructor(t){this._time=t,this._subs=new Map}sourceFor(t){let e=this,s=t==null?null:t;return{on(i,o){if(e._assertType(i),typeof o!="function")throw new Error("[HostDevInputBridge] on \u7684 handler \u5FC5\u987B\u662F\u51FD\u6570");let r=e._subs.get(i)||[],a={handler:o,scope:s};return r.push(a),e._subs.set(i,r),{cancel(){let c=e._subs.get(i);if(!c)return;let l=c.indexOf(a);l>=0&&c.splice(l,1)}}},off(i,o){e._assertType(i);let r=e._subs.get(i);if(!r)return;let a=r.findIndex(c=>c.handler===o&&c.scope===s);a>=0&&r.splice(a,1)}}}_emit(t,e){this._assertType(t);let s=e||{},i={type:t,x:typeof s.x=="number"?s.x:0,y:typeof s.y=="number"?s.y:0,key:typeof s.key=="string"?s.key:"",tMs:this._time.nowMs()},o=this._subs.get(t);if(!o||o.length===0)return;let r=o.slice();for(let a of r)try{a.handler(i)}catch(c){Ne("[host-dev input] \u8F93\u5165 handler \u629B\u9519\uFF08\u5DF2\u9694\u79BB\uFF09type="+t,c)}}disposeScope(t){if(t==null)return 0;let e=0;for(let[s,i]of this._subs){let o=i.filter(r=>r.scope!==t);e+=i.length-o.length,o.length===0?this._subs.delete(s):this._subs.set(s,o)}return e}_subscriptionCount(){let t=0;for(let e of this._subs.values())t+=e.length;return t}_assertType(t){if(!Ni.has(t))throw new Error("[HostDevInputBridge] \u975E\u6CD5\u8F93\u5165\u4E8B\u4EF6\u7C7B\u578B\uFF1A"+String(t)+"\uFF08\u4EC5\u652F\u6301 "+Array.from(Ni).join("/")+"\uFF09")}},Ni=new Set(["pointerdown","pointermove","pointerup","keydown","keyup"]);function Wr(n){let t=n||{},e=new ji(t.clock),s=new Is(t.seed),i=t.seed==null?2654435769:t.seed>>>0,o=new Bi(e),r=typeof t.audioFactory=="function"?t.audioFactory:null,a=null,c=!1,l=typeof t.engineFactory=="function"?t.engineFactory:null,u=null,h=!1,p=new Map,d=0,y=0;function x(){if(a)return a;if(!r)return c||(Ji("[host-dev audio] \u672A\u6CE8\u5165 audioFactory\uFF0CgetAudioContext \u8FD4\u56DE null\uFF08P6 \u987B\u5BB9\u9519\u964D\u7EA7\uFF1B\u96C6\u6210\u6BB5\u6CE8\u5165\u771F\u5B9E\u5DE5\u5382\uFF09"),c=!0),null;try{a=r()}catch(_){Ne("[host-dev audio] audioFactory \u629B\u9519\uFF0CgetAudioContext \u964D\u7EA7\u8FD4\u56DE null",_),a=null}return a}function v(){if(u)return u;if(!l)return h||(Ji("[host-dev engine] \u672A\u6CE8\u5165 engineFactory\uFF0CgetEngine \u8FD4\u56DE null\uFF08\u63D2\u4EF6\u987B\u5BB9\u9519\u964D\u7EA7\uFF1A\u7C92\u5B50\u9000\u53D7\u63A7\u9762\u81EA\u7BA1/\u5408\u6210\u6838\u9000 vendored/\u6570\u5B66\u9000\u5185\u7F6E\uFF1B\u96C6\u6210\u6BB5\u6CE8\u5165\u771F\u5B9E\u80CC\u4E66\uFF09"),h=!0),null;try{u=l()}catch(_){Ne("[host-dev engine] engineFactory \u629B\u9519\uFF0CgetEngine \u964D\u7EA7\u8FD4\u56DE null",_),u=null}return u}function T(_,A){return{getContext2d(){return t.context2d==null?null:t.context2d},onFrame(R){let M=d++;return p.set(M,R),{cancel(){p.delete(M)}}},getInput(){return o.sourceFor(_)},getAudioContext(){return x()},getEngine(){return v()},time:e,random:A}}let C=T(null,s),w={context:C,tick(_){y+=1;let A=Array.from(p.values());for(let S of A)try{S(_,y)}catch(R){Ne("[host-dev tick] \u5E27\u56DE\u8C03\u629B\u9519\uFF08\u5DF2\u9694\u79BB\uFF09frame="+y,R)}},frameCount(){return y},inputBridge:o,deriveContextFor(_,A){let S=zc(i,_),R=new Is(S);return T(A==null?_:A,R)}};return Object.defineProperty(C,zi,{value:w,enumerable:!1,writable:!1,configurable:!1}),w}var zi=Symbol("zaomeng.coreProtocol.contextBundle"),Ms=class{constructor(){this._plugins=new Map,this._initOrder=[],this._initErrors=[],this._phase="idle",this._disposed=!1,this._context=void 0,this._pluginContexts=new Map}register(t){if(!t||typeof t!="object")throw new Error("[PluginRegistry] register \u9700\u8981\u4E00\u4E2A\u63D2\u4EF6\u5BF9\u8C61");if(typeof t.name!="string"||t.name.length===0)throw new Error("[PluginRegistry] \u63D2\u4EF6\u7F3A\u5C11\u5408\u6CD5 name");if(typeof t.version!="string"||t.version.length===0)throw new Error("[PluginRegistry] \u63D2\u4EF6 "+t.name+" \u7F3A\u5C11\u5408\u6CD5 version");if(typeof t.init!="function")throw new Error("[PluginRegistry] \u63D2\u4EF6 "+t.name+" \u7F3A\u5C11 init \u51FD\u6570");if(t.dispose!=null&&typeof t.dispose!="function")throw new Error("[PluginRegistry] \u63D2\u4EF6 "+t.name+" \u7684 dispose \u5FC5\u987B\u662F\u51FD\u6570\u6216\u7701\u7565");if(this._plugins.has(t.name))throw new Error("[PluginRegistry] \u63D2\u4EF6\u91CD\u540D\u62D2\u7EDD\uFF1A"+t.name+" \u5DF2\u6CE8\u518C");return this._plugins.set(t.name,t),this}has(t){return this._plugins.has(t)}get(t){return this._plugins.get(t)}list(){return Array.from(this._plugins.keys())}initAll(){if(this._phase==="initialized")return Ji("[PluginRegistry] initAll \u91CD\u590D\u8C03\u7528\uFF0C\u5DF2\u5FFD\u7565\uFF08\u5DF2\u5904\u4E8E initialized\uFF09"),this._initResult();if(this._phase==="disposed")throw new Error("[PluginRegistry] \u5DF2 dispose \u7684\u6CE8\u518C\u5668\u4E0D\u53EF\u518D initAll");if(this._context==null)throw new Error("[PluginRegistry] \u672A\u6CE8\u5165\u53D7\u63A7\u4E0A\u4E0B\u6587\uFF1A\u8BF7\u5728 initAll() \u4E4B\u524D\u8C03\u7528 useContext(context)\u3002\uFF08host-dev \u7528\u6CD5\uFF1Aconst { context } = createHostDevContext(); reg.useContext(context); reg.initAll();\uFF09");for(let[t,e]of this._plugins){let s=this._missingDeps(e);if(s.length>0){let o=new Error("[PluginRegistry] \u63D2\u4EF6 "+t+" \u4F9D\u8D56\u7F3A\u5931\uFF1A"+s.join(", ")+"\uFF08\u672A\u6CE8\u518C\uFF09");this._initErrors.push({name:t,error:o}),Ne("[PluginRegistry] \u8DF3\u8FC7 init\uFF08\u4F9D\u8D56\u7F3A\u5931\uFF0C\u5DF2\u9694\u79BB\uFF09\uFF1A"+t,o);continue}let i=this._contextFor(t);try{e.init(i),this._initOrder.push(t)}catch(o){let r=o instanceof Error?o:new Error(String(o));this._initErrors.push({name:t,error:r}),Ne("[PluginRegistry] \u63D2\u4EF6 init \u629B\u9519\uFF08\u5DF2\u9694\u79BB\uFF0C\u4E0D\u8FDE\u5750\uFF09\uFF1A"+t,r)}}return this._phase="initialized",this._initResult()}_contextFor(t){let e=this._pluginContexts.get(t);if(e)return e;let s=this._context&&this._context[zi],i;return s&&typeof s.deriveContextFor=="function"?i=s.deriveContextFor(t,t):i=this._context,this._pluginContexts.set(t,i),i}disposeAll(){if(this._disposed)return{disposed:[],errors:[]};let t=[],e=[],s=this._context&&this._context[zi],i=s&&s.inputBridge;for(let o=this._initOrder.length-1;o>=0;o--){let r=this._initOrder[o],a=this._plugins.get(r);if(a&&typeof a.dispose=="function")try{a.dispose(),t.push(r)}catch(c){let l=c instanceof Error?c:new Error(String(c));e.push({name:r,error:l}),Ne("[PluginRegistry] \u63D2\u4EF6 dispose \u629B\u9519\uFF08\u5DF2\u9694\u79BB\uFF09\uFF1A"+r,l)}if(i&&typeof i.disposeScope=="function")try{i.disposeScope(r)}catch(c){Ne("[PluginRegistry] \u56DE\u6536\u63D2\u4EF6\u8F93\u5165\u8BA2\u9605\u629B\u9519\uFF08\u5DF2\u9694\u79BB\uFF09\uFF1A"+r,c)}}return this._disposed=!0,this._phase="disposed",{disposed:t,errors:e}}useContext(t){if(this._phase!=="idle")throw new Error("[PluginRegistry] useContext \u5FC5\u987B\u5728 initAll() \u4E4B\u524D\u8C03\u7528\uFF08\u5F53\u524D\u9636\u6BB5\uFF1A"+this._phase+"\uFF09\u3002\u8BF7\u5728\u4EFB\u4F55 initAll/disposeAll \u4E4B\u524D\u6CE8\u5165\u53D7\u63A7\u4E0A\u4E0B\u6587\u3002");if(t==null||typeof t!="object")throw new Error("[PluginRegistry] useContext \u9700\u8981\u4E00\u4E2A\u53D7\u63A7\u4E0A\u4E0B\u6587\u5BF9\u8C61\u3002\uFF08host-dev \u7528\u6CD5\uFF1Aconst { context } = createHostDevContext(); reg.useContext(context);\uFF09");return this._context=t,this}_missingDeps(t){return!Array.isArray(t.dependencies)||t.dependencies.length===0?[]:t.dependencies.filter(e=>!this._plugins.has(e))}_initResult(){return{ok:this._initErrors.length===0,initialized:this._initOrder.slice(),errors:this._initErrors.slice()}}};function zc(n,t){let e=2166136261,s=16777619,i=n>>>0;for(let r=0;r<32;r+=8){let a=i>>>r&255;e^=a,e=Math.imul(e,s)>>>0}let o=String(t);for(let r=0;r>>0,e^=a>>>8&255,e=Math.imul(e,s)>>>0}return e>>>0}function Jc(){if(typeof globalThis!="undefined"&&globalThis.performance&&typeof globalThis.performance.now=="function")return()=>globalThis.performance.now();if(typeof process!="undefined"&&process.hrtime&&typeof process.hrtime.bigint=="function"){let n=process.hrtime.bigint();return()=>Number(process.hrtime.bigint()-n)/1e6}return()=>Date.now()}function Ne(n,t){let e=t&&t.stack?t.stack:t&&t.message?t.message:t;typeof console!="undefined"&&typeof console.error=="function"&&console.error(n+(e?"\uFF1A"+e:""))}function Ji(n){typeof console!="undefined"&&typeof console.warn=="function"&&console.warn(n)}var xd=Object.freeze(Array.from(Ni)),qr="core-protocol-v0";var Hr=Object.freeze(["t_boot","t_plugins_ready","t_game_init","t_first_paint","t_input_bound","t_game_start"]),Ui=Hr.reduce((n,t,e)=>(n[t]=e,n),Object.create(null)),Uc=new Set(Hr);function Vi(n){let t=2166136261;for(let e=0;e>>0).toString(16).padStart(8,"0")}var Xr=Vi("runtime-probe::seed::v1");function ks(n){return n===null||typeof n!="object"?JSON.stringify(n):Array.isArray(n)?"["+n.map(ks).join(",")+"]":"{"+Object.keys(n).sort().map(e=>JSON.stringify(e)+":"+ks(n[e])).join(",")+"}"}function Yr(n){let t=ks(n.extra==null?null:n.extra),e=ks(Array.isArray(n.pluginSet)?n.pluginSet:[]);return["seq="+n.seq,"anchor="+n.anchor,"tMono="+n.tMono,"buildSha="+(n.buildSha||""),"pluginSet="+e,"extra="+t].join("|")}function Vc(n){return Math.round(n*1e3)/1e3}function Wc(n){if(!Array.isArray(n))return{ok:!1,reason:"records_not_array"};let t=Xr,e=-1;for(let s=0;stypeof _=="string").slice().sort():[],i=typeof t.sink=="function"?t.sink:null,o=t.autoBoot!==!1,r=typeof t.inputAnchorType=="string"?t.inputAnchorType:"pointerdown",a=()=>0,c=!1,l=0,u=Xr,h=[],p=new Set,d=-1,y=null,x=!1,v=!1,T=!1;function C(_,A){let S=null;if(!Uc.has(_))S="unknown_anchor";else{p.has(_)&&(S=S?S+";duplicate_anchor":"duplicate_anchor");let M=Ui[_];M_.time.nowMs(),c=!0,o&&!v&&C("t_boot",{auto:!0}),y=_.getInput().on(r,A=>{x||(x=!0,C("t_input_bound",{firstInput:!0,type:A.type}))}),C("t_input_bound",{stage:"registered",type:r})},dispose(){T||(y&&(y.cancel(),y=null),T=!0)},mark:C,getRecords(){return h.map(_=>({..._}))},toJSONL(){return h.map(_=>JSON.stringify(_)).join(`
+`)},verify(){return Wc(h)}}}function qc(n,t){let e=t&&t.stack?t.stack:t&&t.message?t.message:t;typeof console!="undefined"&&typeof console.error=="function"&&console.error(n+(e?"\uFF1A"+e:""))}function Kr(n){let t=n.LJS,e=n.engineMath,s=n.engineMode,i=n.recHook||(()=>{});if(s!=="real")return null;let o=e;return{math:{lerp:(a,c,l)=>(i("math.lerp"),o.lerp(a,c,l)),smoothStep:a=>(i("math.smoothStep"),o.smoothStep(a)),easing:Object.fromEntries(Object.keys(o.easing).map(a=>[a,c=>(i("math.easing."+a),o.easing[a](c))]))},particles:{spawnEmitter(a){i("particles.spawnEmitter");let c=t.screenToWorld(t.vec2(a.pos.x,a.pos.y)),l=t.cameraScale,u=a.emitTime!=null?a.emitTime:a.count!=null?1/60:0,h=a.emitRate!=null?a.emitRate:a.count!=null?a.count*60:100,p=(a.speed!=null?a.speed:0)/l/60,d=a.damping!=null?a.damping:1,y=a.colorStart||{r:1,g:1,b:1,a:1},x=a.colorEnd||{r:1,g:1,b:1,a:0},v=t.rgb(y.r,y.g,y.b,y.a),T=t.rgb(x.r,x.g,x.b,x.a),C=new t.ParticleEmitter(c,a.angle!=null?a.angle:0,(a.emitSize!=null?a.emitSize:0)/l,u,h,a.coneAngle!=null?a.coneAngle:Math.PI,void 0,v,v,T,T,a.particleTime!=null?a.particleTime:.5,(a.sizeStart!=null?a.sizeStart:6)/l,(a.sizeEnd!=null?a.sizeEnd:0)/l,p,0,d,1,a.gravityScale!=null?a.gravityScale:0,Math.PI,.1,0,!1,a.additive!=null?a.additive:!1,!0);return{isActive(){return C.isActive()},stop(){C.destroyed||C.destroy(!0)}}}},audio:{synth:{synthSfx:a=>{i("audio.synth.synthSfx");try{return t.zzfxG(...a)}catch(c){return console.error("[host][engine-audio] zzfxG \u5408\u6210\u5F02\u5E38\uFF0C\u8FD4 null\uFF1A"+(c&&c.message?c.message:c)),null}},synthSong:(a,c,l,u)=>{i("audio.synth.synthSong");try{return t.zzfxM(a,c,l,u)}catch(h){return console.error("[host][engine-audio] zzfxM \u5408\u6210\u5F02\u5E38\uFF0C\u8FD4 null\uFF1A"+(h&&h.message?h.message:h)),null}}}}}}function ie(n){return n<0?0:n>1?1:n}function Qr(n){let t=n.Ease,e=t.POWER(2),s=t.POWER(3),i=t.OUT(e),o=t.IN_OUT(e),r=t.OUT(s),a=t.IN_OUT(s),c=t.OUT(t.BACK),l=t.OUT(t.ELASTIC);return{lerp:(u,h,p)=>n.lerp(u,h,p),smoothStep:u=>n.smoothStep(u),easing:{linear:u=>t.LINEAR(ie(u)),quadIn:u=>e(ie(u)),quadOut:u=>i(ie(u)),quadInOut:u=>o(ie(u)),cubicIn:u=>s(ie(u)),cubicOut:u=>r(ie(u)),cubicInOut:u=>a(ie(u)),backIn:u=>t.BACK(ie(u)),backOut:u=>c(ie(u)),elasticIn:u=>t.ELASTIC(ie(u)),elasticOut:u=>l(ie(u))}}}var ze=2,Gs=1/60;async function Zr(n){let t=n.canvas,e=n.statusEl||null,s=n.engine,i=n.seed>>>0,o=n.mode||"play",r=n.engineMode||"real",a=n.viewport.w,c=n.viewport.h,l=n.factory,u=n.buildFactoryOpts||(()=>{}),h=n.plugins||{},p=n.registerOrder||Object.values(h),d=n.onReady||(()=>{}),y=n.recHook||(()=>{});function x(O){e&&(e.textContent=O)}let v=[];window.addEventListener("error",O=>v.push({type:"error",message:String(O&&O.message||O)})),window.addEventListener("unhandledrejection",O=>v.push({type:"unhandledrejection",message:String(O&&O.reason&&O.reason.message||O&&O.reason||O)}));let T=null,C=!1;function w(){if(!C)return null;if(T)return T;let O=window.AudioContext||window.webkitAudioContext;return O?(T=new O,T):null}let _=0,A=null,S=null,R=null,M=null,ot=[],$={},nt=null;function rt(O,st){try{R&&R.mark(O,st)}catch($t){v.push({type:"mark",message:String($t&&$t.message||$t)})}}function Et(){S&&typeof S._refreshChecklist=="function"&&S._refreshChecklist($)}async function ne(O,st){A=Wr({context2d:O,seed:i,audioFactory:w,clock:()=>_,engineFactory:()=>Kr({LJS:r==="real"?s:null,engineMath:r==="real"?Qr(s):null,engineMode:r,recHook:y})});let $t=new Ms;for(let de of p)$t.register(de);$t.useContext(A.context),M=$t.initAll(),ot=$t.list().concat(["runtime-probe"]),R=$r({pluginSet:ot,inputAnchorType:"pointerdown",autoBoot:!0});let _t=A.deriveContextFor("runtime-probe","runtime-probe");rt("t_boot",{by:"game-host",stage:"pre-init",engineMode:r}),rt("t_plugins_ready",{initialized:M.initialized.length,ok:M.ok});let Gi=u(A.context,{bundle:A,plugins:h,getRealAudioCtx:()=>T});S=l(Gi),await S.init({ctx:A.context,mainContext:O,canvas:st(),seed:i}),nt=S&&typeof S._forensicsView=="function"?S._forensicsView():null,rt("t_game_init",{hasForensics:!!nt}),lt(),rt("t_first_paint",{frame:A.frameCount()});try{R.init(_t)}catch(de){v.push({type:"probe-init",message:String(de&&de.message||de)})}rt("t_game_start",{mode:o,engineMode:r}),Et(),d(sn,{bundle:A,game:S,probe:R,checklist:$,uncaught:v,pluginSet:ot,initRes:M,getGameForensics:()=>nt,mark:rt,stepOneFrame:lt})}let kt=null;function lt(O){let st=typeof O=="number"?O:Gs;S&&(_+=st*1e3,S.update(st),r==="stub"&&kt&&S.render(kt),Et())}function Pt(O){for(let st=0;st{}),S&&typeof S._onAudioUnlock=="function"&&S._onAudioUnlock()}let sn={seed:i,mode:o,engineMode:r,protocol:qr,frameCount:()=>A?A.frameCount():0,stepFrames:Pt,startRaf:()=>gt(),stopRaf:()=>vt(),tap(O,st){he(),A&&(A.inputBridge._emit("pointerdown",{x:O,y:st}),A.inputBridge._emit("pointerup",{x:O,y:st}))},do(O){S&&typeof S._handleAction=="function"&&S._handleAction(O)},state:()=>nt?nt.state():{phase:"booting"}};function on(O){let st=A.inputBridge;function $t(_t,Gi){let de=O.getBoundingClientRect();return{x:(_t-de.left)/de.width*a,y:(Gi-de.top)/de.height*c}}O.addEventListener("pointerdown",_t=>{he(),st._emit("pointerdown",$t(_t.clientX,_t.clientY))}),O.addEventListener("pointermove",_t=>{st._emit("pointermove",$t(_t.clientX,_t.clientY))}),O.addEventListener("pointerup",_t=>{st._emit("pointerup",$t(_t.clientX,_t.clientY))}),window.addEventListener("keydown",_t=>{he(),st._emit("keydown",{key:_t.key})}),window.addEventListener("keyup",_t=>st._emit("keyup",{key:_t.key}))}let se=0,Ee=!1,D=0;function k(O){if(!Ee)return;D===0&&(D=O);let st=(O-D)/1e3;D=O,st>.05&&(st=.05),lt(st),se=window.requestAnimationFrame(k)}function gt(){r==="stub"&&(Ee||(Ee=!0,D=0,se=window.requestAnimationFrame(k)))}function vt(){Ee=!1,se&&window.cancelAnimationFrame(se),se=0}function Vt(O){O.width=a*ze,O.height=c*ze,O.style.width=a+"px",O.style.height=c+"px";let st=O.getContext("2d",{willReadFrequently:!0});return st.setTransform(ze,0,0,ze,0,0),st}async function rn(){let O=Vt(t);return kt=O,await ne(O,()=>t),on(t),o==="evidence"?x(`evidence \u5C31\u7EEA seed=${i} \xB7 \u7528 host \u9A71\u52A8\uFF08stepFrames/tap\uFF09`):(x(`seed=${i} \xB7 \u70B9\u5F00\u59CB\uFF08\u9996\u6B21\u70B9\u51FB\u5F00\u58F0\uFF09`),gt()),sn}let qn=()=>{},Hn=()=>{};function Os(){window.__gameHostEngineInitFired=!0}function Ds(){qn()}function Ur(){}function Dc(){Hn()}function Ic(){}async function Mc(O){await ne(O,()=>s.mainCanvas),on(s.mainCanvas),qn=()=>{S&&(_+=Gs*1e3,S.update(Gs))},Hn=()=>{if(S){O.save(),O.setTransform(ze,0,0,ze,0,0);try{O.imageSmoothingEnabled=!1}catch{}S.render(O),O.restore()}},s.mainCanvas&&(s.mainCanvas.id="game-engine"),window.__engine={frame(){return s.frame},time(){return s.time},timeReal(){return s.timeReal},paused(){return s.paused},timeScale(){return s.timeScale},snapshot(){return{frame:s.frame,time:s.time,timeReal:s.timeReal,paused:s.paused,timeScale:s.timeScale}}},x(`engine RAF running \xB7 seed=${i} engine=real`)}if(r!=="real")return await rn();if(!s){let O="real \u901A\u9053\u672A\u6CE8\u5165\u5F15\u64CE\uFF08opts.engine \u7F3A\u5931\uFF09\uFF1A\u8BF7\u7ECF entry \u5305\u88C5\u5C42\u542F\u52A8\uFF08host \u4E0D\u76F4\u63A5 import \u5F15\u64CE\uFF0CQ4/Option C\uFF09";throw x("ENGINE INJECT MISSING: "+O),new Error(O)}s.setGLEnable(!1),s.setShowSplashScreen(!1),s.setDebugWatermark(!1),s.setCanvasClearColor(s.BLACK),s.setCanvasFixedSize(s.vec2(a*ze,c*ze));let ki=document.createElement("div");return ki.id="engine-root",document.body.appendChild(ki),await s.engineInit(Os,Ds,Ur,Dc,Ic,[],ki).then(()=>Mc(s.mainContext)).catch(O=>{throw window.__gameHostBootError=String(O&&O.message||O),x("ENGINE INIT FAILED: "+window.__gameHostBootError),O}),sn}var Wi=class{constructor(t){let e=t||{},s=typeof e.cellSize=="number"&&e.cellSize>0?e.cellSize:64;this._cellSize=s,this._cells=new Map,this._entries=new Map,this._seq=0}get size(){return this._entries.size}_cellRange(t){let e=this._cellSize,s=Math.floor((t.x-t.hw)/e),i=Math.floor((t.x+t.hw)/e),o=Math.floor((t.y-t.hh)/e),r=Math.floor((t.y+t.hh)/e);return{cx0:s,cy0:o,cx1:i,cy1:r}}insert(t,e){this._entries.has(t)&&this.remove(t);let{cx0:s,cy0:i,cx1:o,cy1:r}=this._cellRange(e),a=[];for(let l=i;l<=r;l++)for(let u=s;u<=o;u++){let h=u+","+l,p=this._cells.get(h);p||(p=new Set,this._cells.set(h,p)),p.add(t),a.push(h)}let c={x:e.x,y:e.y,hw:e.hw,hh:e.hh};this._entries.set(t,{id:t,box:c,seq:this._seq++,cells:a})}remove(t){let e=this._entries.get(t);if(!e)return!1;for(let s of e.cells){let i=this._cells.get(s);i&&(i.delete(t),i.size===0&&this._cells.delete(s))}return this._entries.delete(t),!0}query(t){let{cx0:e,cy0:s,cx1:i,cy1:o}=this._cellRange(t),r=new Set;for(let a=s;a<=o;a++)for(let c=e;c<=i;c++){let l=this._cells.get(c+","+a);if(l)for(let u of l)r.add(u)}return this._collect(r)}queryPoint(t,e){let s=this._cellSize,i=Math.floor(t/s),o=Math.floor(e/s),r=this._cells.get(i+","+o);return r?this._collect(new Set(r)):[]}clear(){this._cells.clear(),this._entries.clear(),this._seq=0}_collect(t){let e=[];for(let s of t){let i=this._entries.get(s);i&&e.push(i)}return e.sort((s,i)=>s.seq-i.seq),e.map(s=>({id:s.id,box:s.box}))}};function ta(n){let t=n||{},e=new Wi({cellSize:t.cellSize}),s=!1;return{name:"collision",version:"1.0.0",dependencies:[],spatial:e,init(o){},dispose(){s||(e.clear(),s=!0)}}}function ea(n){let t=!1;return{name:"physics-lite",version:"1.0.0",dependencies:[],init(s){},dispose(){t||(t=!0)}}}var Hc=["pointerdown","pointermove","pointerup","keydown","keyup"];function Gt(n){return n<0?0:n>1?1:n}var Xc=n=>(n=Gt(n),n*n),Yc=n=>(n=Gt(n),1-(1-n)*(1-n)),$c=n=>(n=Gt(n),n<.5?2*n*n:1-Math.pow(-2*n+2,2)/2),Kc=n=>(n=Gt(n),n*n*n),Qc=n=>{n=Gt(n);let t=1-n;return 1-t*t*t},Zc=n=>(n=Gt(n),n<.5?4*n*n*n:1-Math.pow(-2*n+2,3)/2),ia=2*Math.PI/3,na=2*Math.PI/4.5,tl=n=>(n=Gt(n),n===0?0:n===1?1:-Math.pow(2,10*n-10)*Math.sin((n*10-10.75)*ia)),el=n=>(n=Gt(n),n===0?0:n===1?1:Math.pow(2,-10*n)*Math.sin((n*10-.75)*ia)+1),nl=n=>(n=Gt(n),n===0?0:n===1?1:n<.5?-(Math.pow(2,20*n-10)*Math.sin((20*n-11.125)*na))/2:Math.pow(2,-20*n+10)*Math.sin((20*n-11.125)*na)/2+1),js=1.70158,Fs=js*1.525,oa=js+1,sl=n=>(n=Gt(n),oa*n*n*n-js*n*n),il=n=>{n=Gt(n);let t=n-1;return 1+oa*t*t*t+js*t*t},ol=n=>(n=Gt(n),n<.5?Math.pow(2*n,2)*((Fs+1)*2*n-Fs)/2:(Math.pow(2*n-2,2)*((Fs+1)*(n*2-2)+Fs)+2)/2),rl=n=>Gt(n),sa=Object.freeze({linear:rl,quadIn:Xc,quadOut:Yc,quadInOut:$c,cubicIn:Kc,cubicOut:Qc,cubicInOut:Zc,elasticIn:tl,elasticOut:el,elasticInOut:nl,backIn:sl,backOut:il,backInOut:ol});var al=["linear","quadIn","quadOut","quadInOut","cubicIn","cubicOut","cubicInOut","elasticIn","elasticOut","elasticInOut","backIn","backOut","backInOut"];function cl(n){let t=n&&n.easing;if(!t)return sa;let e=i=>typeof t[i]=="function"?o=>t[i](Gt(o)):sa[i],s={};for(let i of al)s[i]=e(i);return Object.freeze(s)}var qi=class{constructor(t,e,s){let i=s||{};this._time=e,this._windowMs=typeof i.windowMs=="number"&&i.windowMs>0?i.windowMs:120;let o=Array.isArray(i.types)&&i.types.length>0?i.types:Hc;this._records=new Map,this._subs=[],this._disposed=!1;for(let r of o){this._records.set(r,null);let a=t.on(r,c=>{this._records.set(r,c.tMs)});this._subs.push(a)}}consume(t,e){let s=typeof e=="number"?e:this._time.nowMs(),i=this._records.get(t);return i==null?!1:s-i<=this._windowMs?(this._records.set(t,null),!0):(this._records.set(t,null),!1)}peek(t,e){let s=typeof e=="number"?e:this._time.nowMs(),i=this._records.get(t);return i==null?!1:s-i<=this._windowMs}clear(){for(let t of this._records.keys())this._records.set(t,null)}dispose(){if(!this._disposed){for(let t of this._subs)try{t.cancel()}catch(e){}this._subs=[],this._disposed=!0}}};function ra(n){let t=n||{},e=null,s=null,i=!1;return{name:"gamefeel",version:"1.0.0",dependencies:[],get inputBuffer(){return e},get easing(){return cl(s)},init(r){let a=r.getInput();e=new qi(a,r.time,{windowMs:t.inputBufferMs,types:t.inputTypes});let c=r.getEngine();s=c?c.math:null},dispose(){i||(e&&(e.dispose(),e=null),s=null,i=!0)}}}function Bs(n,t){let e=t<0?0:t>1?1:t;switch(n&&n.kind){case"constant":return n.value;case"linear":return n.from+(n.to-n.from)*e;case"easeInOut":{let s=e*e*(3-2*e);return n.from+(n.to-n.from)*s}case"decay":{let s=n.power==null?2:n.power,i=Math.pow(1-e,s);return n.to+(n.from-n.to)*i}default:return 0}}var ll=Object.freeze({burst:Object.freeze({mode:"burst",count:24,angle:0,spread:Math.PI,speedMin:80,speedMax:160,lifeMin:.4,lifeMax:.8,gravity:0,drag:0,sizeCurve:{kind:"decay",from:6,to:0,power:1.5},alphaCurve:{kind:"linear",from:1,to:0}}),trail:Object.freeze({mode:"continuous",rate:60,angle:Math.PI,spread:.25,speedMin:20,speedMax:50,lifeMin:.2,lifeMax:.5,gravity:0,drag:1.5,sizeCurve:{kind:"easeInOut",from:4,to:0},alphaCurve:{kind:"decay",from:.8,to:0,power:2}}),drift:Object.freeze({mode:"continuous",rate:12,angle:Math.PI/2,spread:.6,speedMin:10,speedMax:30,lifeMin:1.5,lifeMax:3,gravity:8,drag:.5,sizeCurve:{kind:"constant",value:3},alphaCurve:{kind:"decay",from:.7,to:0,power:1}})});function ul(n){let t=ll[n];return t?Hi(t):null}function Hi(n){let t={};for(let e of Object.keys(n)){let s=n[e];t[e]=s&&typeof s=="object"?Hi(s):s}return t}function hl(n,t,e){let s=n.mode==="continuous";return{pos:{x:t,y:e},angle:n.angle,coneAngle:n.spread,emitSize:0,emitTime:s?0:1/60,emitRate:s?n.rate||0:void 0,count:s?void 0:n.count||0,particleTime:(n.lifeMin+n.lifeMax)/2,speed:(n.speedMin+n.speedMax)/2,gravityScale:n.gravity||0,damping:n.drag!=null?1-n.drag/60:1,sizeStart:Bs(n.sizeCurve,0),sizeEnd:Bs(n.sizeCurve,1),colorStart:{r:1,g:1,b:1,a:Bs(n.alphaCurve,0)},colorEnd:{r:1,g:1,b:1,a:Bs(n.alphaCurve,1)},additive:!1}}function aa(n){let t=n||{},e=null,s=null,i=null,o=new Map,r=0,a={isActive(){return!1},stop(){}},c=0,l=1,u=0,h=0,p=0,d={x:0,y:0,remain:0,dur:0,amplitude:0,frequency:0,_phase:0},y={alpha:0,remain:0,dur:0,peak:0},x={scale:1,remain:0,dur:0,amplitude:0,frequency:0},v=!1;function T(A){if(u>0)if(u-=A,u<=0)u=0,l=1;else{let S=h>0?1-u/h:1;l=p+(1-p)*S}if(d.remain>0)if(d.remain-=A,d.remain<=0)d.remain=0,d.x=0,d.y=0;else{let S=d.remain/d.dur,R=d.amplitude*S;d._phase+=d.frequency*A*Math.PI*2,d.x=Math.sin(d._phase)*R,d.y=Math.cos(d._phase*1.3)*R}if(y.remain>0&&(y.remain-=A,y.remain<=0?(y.remain=0,y.alpha=0):y.alpha=y.peak*(y.remain/y.dur)),x.remain>0)if(x.remain-=A,x.remain<=0)x.remain=0,x.scale=1;else{let S=x.remain/x.dur,R=(1-S)*x.frequency*Math.PI*2;x.scale=1+Math.sin(R)*x.amplitude*S}}function C(A){c+=1,T(A)}function w(A){let S=A!==void 0?A:e?e.getContext2d():null;if(S&&y.alpha>0){S.globalAlpha=y.alpha,S.fillStyle="#ffffff";let R=S.canvas?S.canvas.width:0,M=S.canvas?S.canvas.height:0;S.fillRect(0,0,R,M),S.globalAlpha=1}}return{name:"particles-juice",version:"1.0.0",dependencies:[],init(A){var S;e=A,i=((S=A.getEngine())==null?void 0:S.particles)||null,typeof t.seed=="number"&&A.random.reseed(t.seed),t.autoStep!==!1&&(s=A.onFrame(R=>{C(R)}))},dispose(){v||(s&&(s.cancel(),s=null),o.forEach(A=>{try{A.stop()}catch{}}),o.clear(),l=1,u=0,d.remain=0,d.x=0,d.y=0,y.remain=0,y.alpha=0,x.remain=0,x.scale=1,v=!0)},spawnEmitter(A,S,R,M){let ot=typeof A=="string"?ul(A):Hi(A);if(!ot)return-1;M&&(ot=Object.assign(ot,M));let $=r++;if(!i)return o.set($,a),$;let nt=i.spawnEmitter(hl(ot,S,R));return o.set($,nt),$},stopEmitter(A){let S=o.get(A);if(S)try{S.stop()}catch{}},step(A){C(A)},render(A){w(A)},particleCount(){return 0},emitterCount(){let A=0;for(let S of o.values())S.isActive()&&(A+=1);return A},hitStop(A,S){h=Math.max(0,A),u=h,p=S==null?0:Math.max(0,Math.min(1,S)),l=h>0?p:1},getTimeScale(){return l},shakeScreen(A,S,R){d.dur=Math.max(0,A),d.remain=d.dur,d.amplitude=Math.max(0,S),d.frequency=R==null?30:R,d._phase=0,d.x=0,d.y=0},getShakeOffset(){return{x:d.x,y:d.y}},flashScreen(A,S){y.dur=Math.max(0,A),y.remain=y.dur,y.peak=S==null?.8:Math.max(0,Math.min(1,S)),y.alpha=y.dur>0?y.peak:0},getFlashAlpha(){return y.alpha},pulseScale(A,S,R){x.dur=Math.max(0,A),x.remain=x.dur,x.amplitude=S==null?.2:S,x.frequency=R==null?4:R,x.scale=1},getPulseScale(){return x.scale},juiceSnapshot(){return{timeScale:l,shake:{x:d.x,y:d.y},flashAlpha:y.alpha,pulseScale:x.scale}},probe(){return{particles:0,emitters:o.size,dropped:0,steps:c,disposed:v}}}}function ca(n){let t=dt(n.r)/255,e=dt(n.g)/255,s=dt(n.b)/255,i=Math.max(t,e,s),o=Math.min(t,e,s),r=(i+o)/2,a=0,c=0,l=i-o;return l>1e-12&&(c=r>.5?l/(2-i-o):l/(i+o),i===t?a=(e-s)/l%6:i===e?a=(s-t)/l+2:a=(t-e)/l+4,a*=60,a<0&&(a+=360)),{h:a,s:c,l:r}}function la(n){let t=(n.h%360+360)%360,e=Je(n.s),s=Je(n.l);if(e<1e-12){let a=Math.round(s*255);return{r:a,g:a,b:a}}let i=s<.5?s*(1+e):s+e-s*e,o=2*s-i,r=t/360;return{r:Math.round(Xi(o,i,r+1/3)*255),g:Math.round(Xi(o,i,r)*255),b:Math.round(Xi(o,i,r-1/3)*255)}}function Xi(n,t,e){let s=e;return s<0&&(s+=1),s>1&&(s-=1),s<1/6?n+(t-n)*6*s:s<1/2?t:s<2/3?n+(t-n)*(2/3-s)*6:n}function dt(n){return n<0?0:n>255?255:n}function Je(n){return n<0?0:n>1?1:n}function dl(n,t){let e=pl(n.from,t);if(e>=0&&e({r:dt(a.r),g:dt(a.g),b:dt(a.b)})),to:o}}function Yi(n,t,e){return n+(t-n)*e}function ml(n,t){let e=ca(n),s=e.h+(t.hue||0),i=Je(e.s*(t.sat==null?1:t.sat)),o=Je(e.l*(t.light==null?1:t.light));return la({h:s,s:i,l:o})}var bl=Object.freeze([Object.freeze([0,8,2,10]),Object.freeze([12,4,14,6]),Object.freeze([3,11,1,9]),Object.freeze([15,7,13,5])]);function ua(n){let t=n||{},e=null,s=!1,i={vignette:{enabled:$i(t.vignette&&t.vignette.enabled,!1),strength:Ki(t.vignette&&t.vignette.strength,.5)},dither:{enabled:$i(t.dither&&t.dither.enabled,!1),strength:Ki(t.dither&&t.dither.strength,.5)},scanline:{enabled:$i(t.scanline&&t.scanline.enabled,!1),strength:Ki(t.scanline&&t.scanline.strength,.5)}};function o(a){let c=a!==void 0?a:e?e.getContext2d():null;if(!c)return;let l=c.canvas?c.canvas.width:0,u=c.canvas?c.canvas.height:0;if(i.vignette.enabled&&i.vignette.strength>0&&l>0&&u>0){let h=c.createRadialGradient(l/2,u/2,Math.min(l,u)*.25,l/2,u/2,Math.max(l,u)*.75);h.addColorStop(0,"rgba(0,0,0,0)"),h.addColorStop(1,"rgba(0,0,0,"+i.vignette.strength.toFixed(3)+")"),c.fillStyle=h,c.fillRect(0,0,l,u)}if(i.scanline.enabled&&i.scanline.strength>0&&l>0&&u>0){c.fillStyle="rgba(0,0,0,"+(i.scanline.strength*.5).toFixed(3)+")";for(let h=0;h0&&l>0&&u>0&&typeof c.getImageData=="function"&&typeof c.putImageData=="function"){let h=c.getImageData(0,0,l,u);xl(h,i.dither.strength),c.putImageData(h,0,0)}}return{name:"palette-post",version:"1.0.0",dependencies:[],init(a){e=a},dispose(){s||(e=null,s=!0)},applyPaletteMap(a,c){return dl(a,c)},applyPaletteMapToBuffer(a,c){return fl(a,c)},lerpPaletteMap(a,c,l){return yl(a,c,l)},shiftHsl(a,c){return ml(a,c)},rgbToHsl(a){return ca(a)},hslToRgb(a){return la(a)},setPost(a){if(a)for(let c of["vignette","dither","scanline"])a[c]&&(typeof a[c].enabled=="boolean"&&(i[c].enabled=a[c].enabled),typeof a[c].strength=="number"&&(i[c].strength=Je(a[c].strength)))},getPost(){return{vignette:{enabled:i.vignette.enabled,strength:i.vignette.strength},dither:{enabled:i.dither.enabled,strength:i.dither.strength},scanline:{enabled:i.scanline.enabled,strength:i.scanline.strength}}},renderPost(a){o(a)},probe(){return{disposed:s,post:this.getPost()}}}}function xl(n,t){let e=Je(t);if(e<=0)return n;let{data:s,width:i}=n,r=255/(Math.max(2,Math.round(16-e*14))-1);for(let a=0;a+3>2)%i,l=Math.floor((a>>2)/i),u=(bl[l&3][c&3]/16-.5)*r;for(let h=0;h<3;h++){let p=s[a+h]+u,d=Math.round(p/r)*r;s[a+h]=d<0?0:d>255?255:d}}return n}function $i(n,t){return typeof n=="boolean"?n:t}function Ki(n,t){return typeof n=="number"?Je(n):t}var Zi=Object.freeze({blip:Object.freeze({name:"blip",params:Object.freeze([.6,0,880,0,.03,.06,1,1.5])}),thud:Object.freeze({name:"thud",params:Object.freeze([.8,0,90,0,.04,.18,0,1,0,0,0,0,0,4])}),chime:Object.freeze({name:"chime",params:Object.freeze([.5,0,660,.02,.12,.3,1,2])})}),ha=Object.keys(Zi);function vl(n){let t=[];return n==null||typeof n!="object"?{ok:!1,errors:["song \u5FC5\u987B\u662F\u5BF9\u8C61"]}:(!Array.isArray(n.instruments)||n.instruments.length===0?t.push("instruments \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4"):n.instruments.forEach((e,s)=>{(!Array.isArray(e)||e.some(i=>typeof i!="number"||!Number.isFinite(i)))&&t.push(`instruments[${s}] \u5FC5\u987B\u662F\u6709\u9650\u6570\u5B57\u6570\u7EC4\uFF08ZzFX \u53C2\u6570\u5305\uFF09`)}),!Array.isArray(n.patterns)||n.patterns.length===0?t.push("patterns \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4"):n.patterns.forEach((e,s)=>{if(!Array.isArray(e)||e.length===0){t.push(`patterns[${s}] \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4\uFF08\u81F3\u5C11\u4E00\u4E2A\u58F0\u90E8\u901A\u9053\uFF09`);return}e.forEach((i,o)=>{if(!Array.isArray(i)||i.length<2){t.push(`patterns[${s}][${o}] \u901A\u9053\u81F3\u5C11\u542B [\u4E50\u5668\u7D22\u5F15, \u58F0\u50CF]`);return}if(i.some(c=>typeof c!="number"||!Number.isFinite(c))){t.push(`patterns[${s}][${o}] \u901A\u9053\u5FC5\u987B\u5168\u4E3A\u6709\u9650\u6570\u5B57`);return}let r=i[0]|0;Array.isArray(n.instruments)&&(r<0||r>=n.instruments.length)&&t.push(`patterns[${s}][${o}] \u4E50\u5668\u7D22\u5F15 ${r} \u8D8A\u754C\uFF08instruments \u957F\u5EA6 ${n.instruments.length}\uFF09`);let a=i[1];(a<-1||a>1)&&t.push(`patterns[${s}][${o}] \u58F0\u50CF ${a} \u8D8A\u754C\uFF08\u5E94 -1..+1\uFF09`)})}),!Array.isArray(n.sequence)||n.sequence.length===0?t.push("sequence \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4"):n.sequence.forEach((e,s)=>{if(typeof e!="number"||!Number.isInteger(e)){t.push(`sequence[${s}] \u5FC5\u987B\u662F\u6574\u6570 pattern \u7D22\u5F15`);return}Array.isArray(n.patterns)&&(e<0||e>=n.patterns.length)&&t.push(`sequence[${s}] \u7D22\u5F15 ${e} \u8D8A\u754C\uFF08patterns \u957F\u5EA6 ${n.patterns.length}\uFF09`)}),n.bpm!=null&&(typeof n.bpm!="number"||!(n.bpm>0))&&t.push("bpm \u5FC5\u987B\u662F\u6B63\u6570"),{ok:t.length===0,errors:t})}function fe(n){return typeof n!="number"||Number.isNaN(n)||n<0?0:n>1?1:n}function Sl(n,t){switch(n){case"ease-in":return t*t;case"ease-out":return Math.sqrt(t);case"constant":return 1;default:return t}}function da(n,t){let e=fe(t);return n==null||!Array.isArray(n.voices)?[]:n.voices.map(s=>{let i=String(s&&s.id!=null?s.id:""),o=Array.isArray(s&&s.channelIndices)?s.channelIndices.slice():[],r=typeof s.minIntensity=="number"?fe(s.minIntensity):0,a=typeof s.maxIntensity=="number"?fe(s.maxIntensity):1,c=typeof s.volumeCurve=="string"?s.volumeCurve:"linear",l=typeof s.baseVolume=="number"?fe(s.baseVolume):1;if(ea)return{id:i,on:!1,volume:0,channelIndices:o};let u=a-r,h=u<=0?1:(e-r)/u,p=fe(Sl(c,h)*l);return{id:i,on:!0,volume:p,channelIndices:o}})}function fa(n,t,e,s){try{let i=t[0]||[],o=t[1]||i,r=Math.max(i.length,o.length);if(r===0)return null;let c=n.createBuffer(2,r,44100);c.getChannelData(0).set(i),c.getChannelData(1).set(o.length?o:i);let l=n.createBufferSource();l.buffer=c,l.loop=!!s;let u=n.createGain();return u.gain.value=fe(e*.3),l.connect(u),u.connect(n.destination),l.start(),{stop(){try{l.stop()}catch(h){}try{l.disconnect(),u.disconnect()}catch(h){}}}}catch(i){return to("[audio-music] \u53D7\u63A7\u97F3\u9891\u64AD\u653E\u5F02\u5E38\uFF0C\u964D\u7EA7\u4E3A\u9759\u9ED8",i),null}}function pa(n){let t=n||{},e=typeof t.masterVolume=="number"?fe(t.masterVolume):1,s=()=>null,i=null,o=null,r={voices:[]},a=1,c=null,l=!1,u=0,h=!1,p=!1;function d(){let w=s();return w==null?(u+=1,h||(Qi("[audio-music] \u65E0\u53D7\u63A7\u97F3\u9891\u4E0A\u4E0B\u6587\uFF08getAudioContext \u8FD4\u56DE null\uFF09\uFF0C\u5168\u90E8\u53D1\u58F0\u9759\u9ED8 no-op\uFF08\u8BC4\u4F30\u73AF\u5883\u65E0\u58F0\u5361\u65F6\u7684\u5BB9\u9519\u964D\u7EA7\uFF09"),h=!0),null):w}function y(){if(!o||!i)return null;try{let w=typeof o.bpm=="number"&&o.bpm>0?o.bpm:125;return i.synthSong(o.instruments,o.patterns,o.sequence,w)}catch(w){return to("[audio-music] \u66F2\u8C31\u6E32\u67D3\u5F02\u5E38\uFF0C\u964D\u7EA7\u4E3A\u9759\u9ED8",w),null}}function x(){let w=da(r,a);if(w.length===0)return 1;let _=0;for(let A of w)A.on&&(_=Math.max(_,A.volume));return _}function v(w,_){typeof _=="number"&&(a=fe(_));let A=d();if(A==null||!o)return;T();let S=y();if(!S)return;let R=fe(e*x());c=fa(A,S,R,w),l=!!w&&c!=null}function T(){c&&(c.stop(),c=null),l=!1}return{name:"audio-music",version:"1.0.0",dependencies:[],init(w){s=()=>w.getAudioContext();let _=w.getEngine&&w.getEngine();i=_?_.audio.synth:null},dispose(){p||(T(),p=!0)},loadSong(w){let _=vl(w);return _.ok?o={instruments:w.instruments,patterns:w.patterns,sequence:w.sequence,bpm:typeof w.bpm=="number"?w.bpm:125}:Qi("[audio-music] \u66F2\u8C31\u6821\u9A8C\u5931\u8D25\uFF0C\u672A\u8F7D\u5165\uFF1A"+_.errors.join("\uFF1B")),_},play(w){v(!1,w)},stop(){T()},loop(w){v(!0,w)},setIntensityLayering(w){r=w&&Array.isArray(w.voices)?{voices:w.voices}:{voices:[]}},setIntensity(w){a=fe(w)},resolveVoices(w){return da(r,w)},playSfx(w){let _=Zi[w];if(!_){Qi("[audio-music] \u672A\u77E5\u97F3\u6548\u9884\u8BBE\uFF1A"+String(w));return}let A=d();if(A!=null)try{let S=i?i.synthSfx(_.params):null;if(!S)return;fa(A,[S,S],e,!1)}catch(S){to("[audio-music] \u97F3\u6548\u64AD\u653E\u5F02\u5E38\uFF0C\u964D\u7EA7\u4E3A\u9759\u9ED8 name="+w,S)}},getPreset(w){return Zi[w]},listPresets(){return ha.slice()},probe(){return{hasAudio:s()!=null,hasSong:o!=null,intensity:a,voiceCount:r.voices.length,looping:l,silentNoops:u,presetCount:ha.length}}}}function to(n,t){let e=t&&t.stack?t.stack:t&&t.message?t.message:t;typeof console!="undefined"&&typeof console.error=="function"&&console.error(n+(e?"\uFF1A"+e:""))}function Qi(n){typeof console!="undefined"&&typeof console.warn=="function"&&console.warn(n)}var wl="zaomeng.save";function Tl(n){if(typeof TextEncoder!="undefined")return new TextEncoder().encode(n).length;if(typeof Buffer!="undefined"&&typeof Buffer.byteLength=="function")return Buffer.byteLength(n,"utf8");let t=0;for(let e=0;e=55296&&s<=56319?(t+=4,e++):t+=3}return t}function no(){let n=new Map;return{getItem(t){return n.has(t)?n.get(t):null},setItem(t,e){n.set(t,e)},removeItem(t){n.delete(t)},keys(){return Array.from(n.keys())}}}function ga(){if(typeof localStorage=="undefined")throw new Error("[save-progress] createLocalStorageAdapter \u9700\u8981\u5168\u5C40 localStorage\uFF08\u4EC5\u6D4F\u89C8\u5668\u96C6\u6210\u6BB5\u53EF\u7528\uFF09\u3002node/host-dev \u8BF7\u7528\u7F3A\u7701\u5185\u5B58 adapter \u6216 createMemoryAdapter()\u3002");return{getItem(n){return localStorage.getItem(n)},setItem(n,t){localStorage.setItem(n,t)},removeItem(n){localStorage.removeItem(n)},keys(){let n=[];for(let t=0;t0?t.namespace:wl;if(e.indexOf(":")>=0)throw new Error('[save-progress] namespace \u4E0D\u5F97\u542B\u5206\u9694\u7B26 ":"\uFF08\u5F53\u524D="'+e+'"\uFF09');let s=typeof t.maxValueBytes=="number"&&t.maxValueBytes>0?Math.floor(t.maxValueBytes):32768,i=!Al(t.adapter),o=i?no():t.adapter,r=e+":",a=0,c=0,l=!1;function u(d){return typeof d!="string"||d.length===0?r+String(d):r+d}function h(){try{let d=o.keys();return Array.isArray(d)?d.filter(y=>typeof y=="string"&&y.indexOf(r)===0):[]}catch(d){return Xn("[save-progress] adapter.keys() \u5F02\u5E38\uFF0C\u964D\u7EA7\u8FD4\u56DE\u7A7A\u96C6",d),[]}}return{name:"save-progress",version:"1.0.0",dependencies:[],init(d){h()},dispose(){},get(d,y){if(!eo(d))return y;let x;try{x=o.getItem(u(d))}catch(v){return Xn("[save-progress] adapter.getItem \u5F02\u5E38\uFF0C\u8FD4\u56DE\u9ED8\u8BA4\u503C key="+d,v),y}if(x==null)return y;try{return JSON.parse(x)}catch{return a+=1,l||(Yn("[save-progress] \u68C0\u6D4B\u5230\u635F\u574F\u5B58\u6863\uFF08\u975E\u6CD5 JSON\uFF09\uFF0C\u5DF2\u5BB9\u9519\u56DE\u9000\u9ED8\u8BA4\u503C key="+d),l=!0),y}},set(d,y){if(!eo(d))return Yn("[save-progress] set \u6536\u5230\u975E\u6CD5 key\uFF0C\u62D2\u7EDD\u5199\u5165\uFF1A"+String(d)),!1;let x;try{x=JSON.stringify(y)}catch{return c+=1,Yn("[save-progress] \u503C\u4E0D\u53EF JSON \u5E8F\u5217\u5316\uFF08\u5FAA\u73AF\u5F15\u7528?\uFF09\uFF0C\u62D2\u7EDD\u5199\u5165 key="+d),!1}if(x===void 0)return c+=1,Yn("[save-progress] \u503C\u5E8F\u5217\u5316\u4E3A undefined\uFF08\u5982\u7EAF undefined/\u51FD\u6570\uFF09\uFF0C\u62D2\u7EDD\u5199\u5165 key="+d),!1;let v=Tl(x);if(v>s)return c+=1,Yn("[save-progress] \u503C\u8D85\u5B57\u8282\u4E0A\u9650\u62D2\u7EDD\u5199\u5165 key="+d+"\uFF08"+v+" > "+s+" bytes\uFF09"),!1;try{return o.setItem(u(d),x),!0}catch(T){return c+=1,Xn("[save-progress] adapter.setItem \u5F02\u5E38\uFF0C\u5199\u5165\u5931\u8D25 key="+d,T),!1}},remove(d){if(eo(d))try{o.removeItem(u(d))}catch(y){Xn("[save-progress] adapter.removeItem \u5F02\u5E38\uFF08\u5DF2\u5FFD\u7565\uFF09key="+d,y)}},clear(){let d=h(),y=0;for(let x of d)try{o.removeItem(x),y+=1}catch(v){Xn("[save-progress] clear \u65F6 removeItem \u5F02\u5E38\uFF08\u5DF2\u8DF3\u8FC7\uFF09fullKey="+x,v)}return y},probe(){return{namespace:e,maxValueBytes:s,usingMemoryAdapter:i,size:h().length,corruptRecoveries:a,rejectedWrites:c}}}}function eo(n){return typeof n=="string"&&n.length>0}function Al(n){return!!n&&typeof n.getItem=="function"&&typeof n.setItem=="function"&&typeof n.removeItem=="function"&&typeof n.keys=="function"}function Xn(n,t){let e=t&&t.stack?t.stack:t&&t.message?t.message:t;typeof console!="undefined"&&typeof console.error=="function"&&console.error(n+(e?"\uFF1A"+e:""))}function Yn(n){typeof console!="undefined"&&typeof console.warn=="function"&&console.warn(n)}var El={w:390,h:844};function ma(n){let t=((n&&n.seed)!=null?n.seed:0)>>>0,e=ta({cellSize:96}),s=ea(),i=ra({inputBufferMs:260,inputTypes:["pointerdown"]}),o=aa({seed:t,maxParticles:600}),r=ua({vignette:{enabled:!0,strength:.22}}),a=pa({masterVolume:.8}),c;try{c=ga()}catch(p){console.warn("[generic] localStorage \u4E0D\u53EF\u7528\uFF0C\u5B58\u6863\u9000\u5185\u5B58 adapter\uFF1A"+(p&&p.message)),c=no()}let l=ya({namespace:"zaomeng-generic",adapter:c});return{plugins:{collision:e,physics:s,gamefeel:i,juice:o,palettePost:r,audioMusic:a,save:l},registerOrder:[e,s,i,o,r,l,a],viewport:El,buildFactoryOpts:(p,d)=>({runtime:{plugins:d.plugins,bundle:d.bundle,getRealAudioCtx:d.getRealAudioCtx}})}}function $n(n){let t=n||{},e=null,s=0,i=null,o=null,r=390,a=844,c=110,l=12,u=700,h=-280,p=180,d=60,y=a*.24,x=270,v=300,T=560,C=x/p,w="booting",_=!1,A=0,S={x:c,y:422,vy:0},R=[],M="",ot=null,$=0,nt=(r-160)/2,rt=a/2+50,Et=160,ne=50;function kt(D){e=D.ctx,o=D.seed||0,i=e.getInput().on("pointerdown",lt),w="playing",_=!1,A=0,S.y=422,S.vy=0,R=[],M="",ot=null,$=0}function lt(D){if(s=e.time.nowMs(),w==="gameover"){D.x>=nt&&D.x<=nt+Et&&D.y>=rt&&D.y<=rt+ne&&Pt();return}if(_){S.vy=h;let k=e.getEngine();if(k&&k.particles)try{k.particles.spawnEmitter({pos:{x:S.x,y:S.y},count:10,speed:80,particleTime:.3,colorStart:{r:1,g:1,b:.6,a:1},colorEnd:{r:1,g:.5,b:0,a:0}})}catch{}if(k&&k.audio&&k.audio.synth)try{k.audio.synth.synthSfx([1,.05,300,,,.1,,1])}catch{}}else{_=!0,S.vy=h,$=0;let k=e.getEngine();if(k&&k.particles)try{k.particles.spawnEmitter({pos:{x:S.x,y:S.y},count:10,speed:80,particleTime:.3,colorStart:{r:1,g:1,b:.6,a:1},colorEnd:{r:1,g:.5,b:0,a:0}})}catch{}if(k&&k.audio&&k.audio.synth)try{k.audio.synth.synthSfx([1,.05,400,,,.1,,1.2])}catch{}}}function Pt(){w="playing",_=!1,A=0,S.y=422,S.vy=0,R=[],M="",ot=null,$=0}function he(D){w="gameover",M=D,ot="lose";let k=e.getEngine();if(k&&k.particles)try{k.particles.spawnEmitter({pos:{x:S.x,y:S.y},count:40,speed:150,particleTime:.6,colorStart:{r:1,g:.2,b:.2,a:1},colorEnd:{r:.5,g:0,b:0,a:0}})}catch{}if(k&&k.audio&&k.audio.synth)try{k.audio.synth.synthSfx([1,.05,150,.5,.3,.1,,1.3])}catch{}}function sn(D){if(s=e.time.nowMs(),w!=="playing"||!_)return;if(S.vy+=u*D,S.y+=S.vy*D,S.y-l<0||S.y+l>a){he("boundary");return}let k=p*D;for(let gt=R.length-1;gt>=0;gt--){let vt=R[gt];if(vt.x-=k,vt.x+d<0){R.splice(gt,1);continue}if(S.x+l>vt.x&&S.x-lvt.gapBottom)){he("pipe");return}if(!vt.scored&&S.x-l>vt.x+d){vt.scored=!0,A++;let Vt=e.getEngine();if(Vt&&Vt.particles)try{Vt.particles.spawnEmitter({pos:{x:S.x,y:S.y},count:25,speed:120,particleTime:.4,colorStart:{r:.2,g:1,b:.2,a:1},colorEnd:{r:0,g:.5,b:0,a:0}})}catch{}if(Vt&&Vt.audio&&Vt.audio.synth)try{Vt.audio.synth.synthSfx([1,.05,800,,,.15,,.5])}catch{}}}if($+=D,$>=C){$=0;let gt=e.random.range(v,T),vt=y/2,Vt=gt-vt,rn=gt+vt;R.push({x:r,centerY:gt,gapTop:Vt,gapBottom:rn,passed:!1,scored:!1})}}function on(D){D.fillStyle="#1a1a2e",D.fillRect(0,0,r,a),D.fillStyle="#4caf50";for(let k of R)D.fillRect(k.x,0,d,k.gapTop),D.fillRect(k.x,k.gapBottom,d,a-k.gapBottom),D.strokeStyle="#2e7d32",D.lineWidth=2,D.strokeRect(k.x,0,d,k.gapTop),D.strokeRect(k.x,k.gapBottom,d,a-k.gapBottom);D.fillStyle="#ffcc00",D.beginPath(),D.arc(S.x,S.y,l,0,Math.PI*2),D.fill(),D.strokeStyle="#cc8800",D.lineWidth=2,D.stroke(),D.fillStyle="#ffffff",D.font="24px monospace",D.textAlign="center",w==="playing"?(D.fillText("Score: "+A,r/2,40),_||(D.font="20px monospace",D.fillText("Tap to Start",r/2,80))):w==="gameover"&&(D.fillStyle="#ff4444",D.font="36px monospace",D.fillText("GAME OVER",r/2,200),D.fillStyle="#ffffff",D.font="24px monospace",D.fillText("Score: "+A,r/2,260),D.fillStyle="#3366ff",D.fillRect(nt,rt,Et,ne),D.strokeStyle="#ffffff",D.lineWidth=2,D.strokeRect(nt,rt,Et,ne),D.fillStyle="#ffffff",D.font="20px monospace",D.fillText("Restart",r/2,rt+ne/2+7))}function se(){try{i&&i.cancel()}catch{}i=null,R=[]}function Ee(){return{seed:o,state:()=>{let D=null;for(let k of R)if(S.x-l!k.scored).length,progress:null,gameoverReason:M}}}}return{init:kt,update:sn,render:on,destroy:se,_forensicsView:Ee}}var pd=$n,gd=$n;async function yd(n){let t=n||{},e=t.engine||await Promise.resolve().then(()=>(Oc(),Lc)),s=(t.seed!=null?t.seed:305441741)>>>0,i=ma({seed:s});return Zr({canvas:t.canvas,statusEl:t.statusEl||null,engine:e,seed:s,mode:t.mode||"play",engineMode:"real",viewport:i.viewport,factory:$n,plugins:i.plugins,registerOrder:i.registerOrder,buildFactoryOpts:i.buildFactoryOpts,recHook:t.recHook||null,onReady:t.onReady||null})}return Nc(md);})();
diff --git a/game-runtime/games/_wg1-gen/flappy/bundle.iife.js.meta.json b/game-runtime/games/_wg1-gen/flappy/bundle.iife.js.meta.json
index 9ab398c3..f694e9a3 100644
--- a/game-runtime/games/_wg1-gen/flappy/bundle.iife.js.meta.json
+++ b/game-runtime/games/_wg1-gen/flappy/bundle.iife.js.meta.json
@@ -1 +1 @@
-{"inputs":{"src/core/plugin.js":{"bytes":44317,"imports":[],"format":"esm"},"src/plugins/runtime-probe/impl.js":{"bytes":16639,"imports":[],"format":"esm"},"host-dev/engine-caps.js":{"bytes":13897,"imports":[],"format":"esm"},"host-dev/engine-math.js":{"bytes":6155,"imports":[],"format":"esm"},"src/host/boot-game-host.js":{"bytes":27676,"imports":[{"path":"src/core/plugin.js","kind":"import-statement","original":"../core/plugin.js"},{"path":"src/plugins/runtime-probe/impl.js","kind":"import-statement","original":"../plugins/runtime-probe/impl.js"},{"path":"host-dev/engine-caps.js","kind":"import-statement","original":"../../host-dev/engine-caps.js"},{"path":"host-dev/engine-math.js","kind":"import-statement","original":"../../host-dev/engine-math.js"}],"format":"esm"},"src/plugins/collision/impl.js":{"bytes":24812,"imports":[],"format":"esm"},"src/plugins/physics-lite/impl.js":{"bytes":14507,"imports":[],"format":"esm"},"src/plugins/gamefeel/impl.js":{"bytes":21715,"imports":[],"format":"esm"},"src/plugins/particles-juice/impl.js":{"bytes":31830,"imports":[],"format":"esm"},"src/plugins/palette-post/impl.js":{"bytes":20240,"imports":[],"format":"esm"},"src/plugins/audio-music/impl.js":{"bytes":24659,"imports":[],"format":"esm"},"src/plugins/save-progress/impl.js":{"bytes":14608,"imports":[],"format":"esm"},"src/host/generic-host-config.js":{"bytes":7803,"imports":[{"path":"src/plugins/collision/impl.js","kind":"import-statement","original":"../plugins/collision/impl.js"},{"path":"src/plugins/physics-lite/impl.js","kind":"import-statement","original":"../plugins/physics-lite/impl.js"},{"path":"src/plugins/gamefeel/impl.js","kind":"import-statement","original":"../plugins/gamefeel/impl.js"},{"path":"src/plugins/particles-juice/impl.js","kind":"import-statement","original":"../plugins/particles-juice/impl.js"},{"path":"src/plugins/palette-post/impl.js","kind":"import-statement","original":"../plugins/palette-post/impl.js"},{"path":"src/plugins/audio-music/impl.js","kind":"import-statement","original":"../plugins/audio-music/impl.js"},{"path":"src/plugins/save-progress/impl.js","kind":"import-statement","original":"../plugins/save-progress/impl.js"}],"format":"esm"},"games/_wg1-gen/flappy/generated-factory.js":{"bytes":9192,"imports":[],"format":"esm"},"node_modules/littlejsengine/dist/littlejs.esm.js":{"bytes":640153,"imports":[],"format":"esm"},"games/_wg1-gen/flappy/entry-bundle.js":{"bytes":6230,"imports":[{"path":"src/host/boot-game-host.js","kind":"import-statement","original":"../../../src/host/boot-game-host.js"},{"path":"src/host/generic-host-config.js","kind":"import-statement","original":"../../../src/host/generic-host-config.js"},{"path":"games/_wg1-gen/flappy/generated-factory.js","kind":"import-statement","original":"./generated-factory.js"},{"path":"node_modules/littlejsengine/dist/littlejs.esm.js","kind":"dynamic-import","original":"littlejsengine"}],"format":"esm"}},"outputs":{"games/_wg1-gen/flappy/bundle.iife.js":{"imports":[],"exports":[],"entryPoint":"games/_wg1-gen/flappy/entry-bundle.js","inputs":{"node_modules/littlejsengine/dist/littlejs.esm.js":{"bytesInOutput":164173},"games/_wg1-gen/flappy/entry-bundle.js":{"bytesInOutput":507},"src/core/plugin.js":{"bytesInOutput":8989},"src/plugins/runtime-probe/impl.js":{"bytesInOutput":2794},"host-dev/engine-caps.js":{"bytesInOutput":1597},"host-dev/engine-math.js":{"bytesInOutput":498},"src/host/boot-game-host.js":{"bytesInOutput":5363},"src/plugins/collision/impl.js":{"bytesInOutput":1605},"src/plugins/physics-lite/impl.js":{"bytesInOutput":115},"src/plugins/gamefeel/impl.js":{"bytesInOutput":2533},"src/plugins/particles-juice/impl.js":{"bytesInOutput":4166},"src/plugins/palette-post/impl.js":{"bytesInOutput":4218},"src/plugins/audio-music/impl.js":{"bytesInOutput":6001},"src/plugins/save-progress/impl.js":{"bytesInOutput":3933},"src/host/generic-host-config.js":{"bytesInOutput":697},"games/_wg1-gen/flappy/generated-factory.js":{"bytesInOutput":3299}},"bytes":211059}}}
\ No newline at end of file
+{"inputs":{"src/core/plugin.js":{"bytes":44317,"imports":[],"format":"esm"},"src/plugins/runtime-probe/impl.js":{"bytes":16639,"imports":[],"format":"esm"},"host-dev/engine-caps.js":{"bytes":13897,"imports":[],"format":"esm"},"host-dev/engine-math.js":{"bytes":6155,"imports":[],"format":"esm"},"src/host/boot-game-host.js":{"bytes":28239,"imports":[{"path":"src/core/plugin.js","kind":"import-statement","original":"../core/plugin.js"},{"path":"src/plugins/runtime-probe/impl.js","kind":"import-statement","original":"../plugins/runtime-probe/impl.js"},{"path":"host-dev/engine-caps.js","kind":"import-statement","original":"../../host-dev/engine-caps.js"},{"path":"host-dev/engine-math.js","kind":"import-statement","original":"../../host-dev/engine-math.js"}],"format":"esm"},"src/plugins/collision/impl.js":{"bytes":24812,"imports":[],"format":"esm"},"src/plugins/physics-lite/impl.js":{"bytes":14507,"imports":[],"format":"esm"},"src/plugins/gamefeel/impl.js":{"bytes":21715,"imports":[],"format":"esm"},"src/plugins/particles-juice/impl.js":{"bytes":31830,"imports":[],"format":"esm"},"src/plugins/palette-post/impl.js":{"bytes":20240,"imports":[],"format":"esm"},"src/plugins/audio-music/impl.js":{"bytes":24659,"imports":[],"format":"esm"},"src/plugins/save-progress/impl.js":{"bytes":14608,"imports":[],"format":"esm"},"src/host/generic-host-config.js":{"bytes":7803,"imports":[{"path":"src/plugins/collision/impl.js","kind":"import-statement","original":"../plugins/collision/impl.js"},{"path":"src/plugins/physics-lite/impl.js","kind":"import-statement","original":"../plugins/physics-lite/impl.js"},{"path":"src/plugins/gamefeel/impl.js","kind":"import-statement","original":"../plugins/gamefeel/impl.js"},{"path":"src/plugins/particles-juice/impl.js","kind":"import-statement","original":"../plugins/particles-juice/impl.js"},{"path":"src/plugins/palette-post/impl.js","kind":"import-statement","original":"../plugins/palette-post/impl.js"},{"path":"src/plugins/audio-music/impl.js","kind":"import-statement","original":"../plugins/audio-music/impl.js"},{"path":"src/plugins/save-progress/impl.js","kind":"import-statement","original":"../plugins/save-progress/impl.js"}],"format":"esm"},"games/_wg1-gen/flappy/generated-factory.js":{"bytes":7665,"imports":[],"format":"esm"},"node_modules/littlejsengine/dist/littlejs.esm.js":{"bytes":640153,"imports":[],"format":"esm"},"games/_wg1-gen/flappy/entry-bundle.js":{"bytes":6230,"imports":[{"path":"src/host/boot-game-host.js","kind":"import-statement","original":"../../../src/host/boot-game-host.js"},{"path":"src/host/generic-host-config.js","kind":"import-statement","original":"../../../src/host/generic-host-config.js"},{"path":"games/_wg1-gen/flappy/generated-factory.js","kind":"import-statement","original":"./generated-factory.js"},{"path":"node_modules/littlejsengine/dist/littlejs.esm.js","kind":"dynamic-import","original":"littlejsengine"}],"format":"esm"}},"outputs":{"games/_wg1-gen/flappy/bundle.iife.js":{"imports":[],"exports":[],"entryPoint":"games/_wg1-gen/flappy/entry-bundle.js","inputs":{"node_modules/littlejsengine/dist/littlejs.esm.js":{"bytesInOutput":164160},"games/_wg1-gen/flappy/entry-bundle.js":{"bytesInOutput":507},"src/core/plugin.js":{"bytesInOutput":8989},"src/plugins/runtime-probe/impl.js":{"bytesInOutput":2794},"host-dev/engine-caps.js":{"bytesInOutput":1597},"host-dev/engine-math.js":{"bytesInOutput":498},"src/host/boot-game-host.js":{"bytesInOutput":5508},"src/plugins/collision/impl.js":{"bytesInOutput":1605},"src/plugins/physics-lite/impl.js":{"bytesInOutput":115},"src/plugins/gamefeel/impl.js":{"bytesInOutput":2533},"src/plugins/particles-juice/impl.js":{"bytesInOutput":4161},"src/plugins/palette-post/impl.js":{"bytesInOutput":4218},"src/plugins/audio-music/impl.js":{"bytesInOutput":6001},"src/plugins/save-progress/impl.js":{"bytesInOutput":3933},"src/host/generic-host-config.js":{"bytesInOutput":697},"games/_wg1-gen/flappy/generated-factory.js":{"bytesInOutput":3555}},"bytes":211442}}}
\ No newline at end of file
diff --git a/game-runtime/games/_wg1-gen/flappy/evidence/after-play.png b/game-runtime/games/_wg1-gen/flappy/evidence/after-play.png
index 44557d94fd8e3f7a2fe5d3126d6ca44ec7ee5f58..5225ef5ab7a4107db9ca763d2c3323fd7351894e 100644
GIT binary patch
literal 24996
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

literal 19160
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

diff --git a/game-runtime/games/_wg1-gen/flappy/evidence/first-paint.png b/game-runtime/games/_wg1-gen/flappy/evidence/first-paint.png
index 8c4a617972b1e1679a11ce8a26e5785450f12353..00df0bfd248701e9ba513b6c2d8e7a02fc2c321f 100644
GIT binary patch
literal 18725
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