{"version":3,"sources":["../../src/math/vec3.ts","../../src/math/angles.ts","../../src/math/anorms.ts","../../src/math/color.ts","../../src/math/random.ts","../../src/math/mat4.ts","../../src/bsp/contents.ts","../../src/bsp/spatial.ts","../../src/bsp/collision.ts","../../src/protocol/cvar.ts","../../src/protocol/configstrings.ts","../../src/replay/index.ts","../../src/replay/io.ts","../../src/protocol/contracts.ts","../../src/pmove/constants.ts","../../src/pmove/jump.ts","../../src/pmove/currents.ts","../../src/pmove/slide.ts","../../src/pmove/move.ts","../../src/pmove/water.ts","../../src/pmove/categorize.ts","../../src/pmove/dimensions.ts","../../src/pmove/duck.ts","../../src/pmove/pmove.ts","../../src/pmove/stuck.ts","../../src/pmove/fly.ts","../../src/pmove/special.ts","../../src/pmove/snap.ts","../../src/pmove/view.ts","../../src/protocol/usercmd.ts","../../src/protocol/ops.ts","../../src/protocol/tempEntity.ts","../../src/protocol/constants.ts","../../src/protocol/layout.ts","../../src/protocol/bitpack.ts","../../src/items/powerups.ts","../../src/protocol/stats.ts","../../src/protocol/writeUserCmd.ts","../../src/protocol/renderFx.ts","../../src/protocol/crc.ts","../../src/protocol/effects.ts","../../src/protocol/entityEvent.ts","../../src/protocol/entity.ts","../../src/protocol/player.ts","../../src/pmove/apply.ts","../../src/io/binaryStream.ts","../../src/io/binaryWriter.ts","../../src/io/messageBuilder.ts","../../src/net/netchan.ts","../../src/items/weapons.ts","../../src/items/ammo.ts","../../src/items/weaponInfo.ts","../../src/audio/constants.ts","../../src/inventory-helpers.ts","../../src/testing.ts"],"names":["distance","PlaneSide","traceDebugInfo","CvarFlags","ConfigStringIndex","WaterLevel","PmFlag","PmType","PlayerButton","velocity","velocityOut","hasButton","pointContents","dims","LADDER_TRACE_DISTANCE","DEFAULT_OVERBOUNCE","ladderTrace","clampPitch","ServerCommand","ClientCommand","TempEntity","LayoutFlags","PowerupId","PlayerStat","RenderFx","EntityEffects","EntityEvent","FRAMETIME","categorizePosition","WeaponId","AmmoType","AmmoItemId","SoundChannel"],"mappings":"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,EAC1F,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAC1F,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAC1F,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAC1F,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,CAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,CAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAC1F,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAC1F,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAC1F,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAC1F,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,CAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,CAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAC1F,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAC1F,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAC1F,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAC1F,GAAA;AAAA,EAAM,CAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,CAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,CAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAC1F,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAC1F,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAC1F,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM;AAC9F,CAAA;AAKO,SAAS,KAAK,IAAA,EAA0B;AAC3C,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,IAAA,GAAA,GAAM,SAAA,CAAA,CAAW,GAAA,GAAM,IAAA,CAAK,CAAC,KAAK,GAAI,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,GAAA;AACX;;;AC9BO,IAAK,aAAA,qBAAAC,cAAAA,KAAL;AACL,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,YAAS,CAAA,CAAA,GAAT,QAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,SAAM,CAAA,CAAA,GAAN,KAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,kBAAe,EAAA,CAAA,GAAf,cAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,aAAU,EAAA,CAAA,GAAV,SAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,YAAS,EAAA,CAAA,GAAT,QAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,aAAU,GAAA,CAAA,GAAV,SAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,kBAAe,GAAA,CAAA,GAAf,cAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,SAAM,GAAA,CAAA,GAAN,KAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,gBAAa,IAAA,CAAA,GAAb,YAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,iBAAc,IAAA,CAAA,GAAd,aAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,YAAS,IAAA,CAAA,GAAT,QAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,YAAS,IAAA,CAAA,GAAT,QAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,aAAU,KAAA,CAAA,GAAV,SAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,iBAAc,KAAA,CAAA,GAAd,aAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,UAAO,KAAA,CAAA,GAAP,MAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,UAAO,MAAA,CAAA,GAAP,MAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,eAAY,MAAA,CAAA,GAAZ,WAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,cAAW,MAAA,CAAA,GAAX,UAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,WAAQ,OAAA,CAAA,GAAR,OAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,WAAQ,OAAA,CAAA,GAAR,OAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,eAAY,OAAA,CAAA,GAAZ,WAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,eAAY,OAAA,CAAA,GAAZ,WAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,sBAAmB,QAAA,CAAA,GAAnB,kBAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,cAAW,QAAA,CAAA,GAAX,UAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,YAAS,QAAA,CAAA,GAAT,QAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,UAAO,SAAA,CAAA,GAAP,MAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,aAAU,SAAA,CAAA,GAAV,SAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,YAAS,SAAA,CAAA,GAAT,QAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,YAAS,UAAA,CAAA,GAAT,QAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,cAAW,UAAA,CAAA,GAAX,UAAA;AA9BU,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;;;ACDL,IAAK,WAAA,qBAAAC,YAAAA,KAAL;AACL,EAAAA,YAAAA,CAAAA,YAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AACA,EAAAA,YAAAA,CAAAA,YAAAA,CAAA,iBAAc,CAAA,CAAA,GAAd,aAAA;AACA,EAAAA,YAAAA,CAAAA,YAAAA,CAAA,cAAW,CAAA,CAAA,GAAX,UAAA;AACA,EAAAA,YAAAA,CAAAA,YAAAA,CAAA,eAAY,CAAA,CAAA,GAAZ,WAAA;AACA,EAAAA,YAAAA,CAAAA,YAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AACA,EAAAA,YAAAA,CAAAA,YAAAA,CAAA,aAAU,CAAA,CAAA,GAAV,SAAA;AACA,EAAAA,YAAAA,CAAAA,YAAAA,CAAA,oBAAiB,CAAA,CAAA,GAAjB,gBAAA;AACA,EAAAA,YAAAA,CAAAA,YAAAA,CAAA,mBAAgB,CAAA,CAAA,GAAhB,eAAA;AAGA,EAAAA,YAAAA,CAAAA,YAAAA,CAAA,mBAAgB,CAAA,CAAA,GAAhB,eAAA;AACA,EAAAA,YAAAA,CAAAA,YAAAA,CAAA,gBAAa,CAAA,CAAA,GAAb,YAAA;AAZU,EAAA,OAAAA,YAAAA;AAAA,CAAA,EAAA,WAAA,IAAA,EAAA;;;ACIL,IAAM,YAAe,CAAA,IAAK;AAC1B,IAAM,YAAe,CAAA,IAAK;AAC1B,IAAM,WAAe,CAAA,IAAK;AAC1B,IAAM,WAAe,CAAA,IAAK;AAC1B,IAAM,WAAe,CAAA,IAAK;AAC1B,IAAM,UAAe,CAAA,IAAK;AAC1B,IAAM,WAAe,CAAA,IAAK;AAC1B,IAAM,cAAe,CAAA,IAAK;AAE1B,IAAM,aAAe,CAAA,IAAK;AAC1B,IAAM,YAAe,CAAA,IAAK;AAC1B,IAAM,WAAe,CAAA,IAAK;AAC1B,IAAM,UAAe,CAAA,IAAK;AAC1B,IAAM,cAAe,CAAA,IAAK;AAC1B,IAAM,UAAe,CAAA,IAAK;AAC1B,IAAM,aAAe,CAAA,IAAK;AAC1B,IAAM,cAAe,CAAA,IAAK;AAE1B,IAAM,UAAe,CAAA,IAAK;AAC1B,IAAM,YAAe,CAAA,IAAK;AAC1B,IAAM,eAAgB,CAAA,IAAK;AAC3B,IAAM,cAAe,CAAA,IAAK;AAC1B,IAAM,WAAe,CAAA,IAAK;AAC1B,IAAM,WAAe,CAAA,IAAK;AAC1B,IAAM,WAAe,CAAA,IAAK;AAC1B,IAAM,cAAe,CAAA,IAAK;AAE1B,IAAM,cAAe,CAAA,IAAK;AAC1B,IAAM,WAAe,CAAA,IAAK;AAC1B,IAAM,UAAe,CAAA,IAAK;AAC1B,IAAM,UAAe,CAAA,IAAK;AAC1B,IAAM,UAAe,CAAA,IAAK;AAC1B,IAAM,kBAAmB,CAAA,IAAK;AAC9B,IAAM,gBAAmB,CAAA,IAAK;AAC9B,IAAM,cAAkB,UAAA,GAAa;AAGrC,IAAM,0BAA2B,CAAA,IAAK;AACtC,IAAM,eAA2B,CAAA,IAAK;AACtC,IAAM,mBAA2B,CAAA,IAAK;AAI7C,IAAM,UAAA,GAA0B;AAAA,EAC9B,MAAA,EAAQ,CAAA;AAAA,EACR,QAAQ,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,EAC3B,QAAQ,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,EAC3B,UAAA,EAAY,CAAA;AAAA,EACZ,KAAA,EAAO,CAAA;AAAA,EACP,OAAA,EAAS,CAAA;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,QAAA,EAAU,CAAA;AAAA,EACV,KAAA,EAAO,CAAA;AAAA,EACP,KAAA,EAAO,CAAA;AAAA,EACP,KAAA,EAAO,CAAA;AAAA,EACP,KAAA,EAAO,CAAA;AAAA,EACP,KAAA,EAAO,CAAA;AAAA,EACP,YAAA,EAAc,CAAA;AAAA,EACd,UAAA,EAAY,CAAA;AAAA,EACZ,eAAA,EAAiB,CAAA;AAAA,EACjB,KAAA,EAAO,CAAA;AAAA,EACP,QAAA,EAAU,CAAA;AAAA,EACV,WAAA,EAAa,CAAA;AAAA,EACb,WAAA,EAAa,CAAA;AAAA,EACb,WAAA,EAAa;AACf,CAAA;AAKO,SAAS,iBAAA,CACZ,QACA,MAAA,EACI;AACJ,EAAA,IAAI,IAAA,GAAO,QAAA;AAEX,EAAA,IAAI,UAAU,GAAA,EAAK;AACf,IAAA,IAAA,IAAQ,UAAA;AAAA,EACZ;AAGA,EAAA,IAAI,OAAO,KAAA,EAAQ;AACf,IAAA,IAAA,IAAQ,WAAA;AAAA,EACZ;AAGA,EAAA,MAAA,CAAO,SAAA,CAAU,OAAO,GAAI,CAAA;AAC5B,EAAA,IAAI,OAAO,WAAA,EAAa;AACpB,IAAA,MAAA,CAAO,SAAA,CAAW,IAAA,IAAQ,CAAA,GAAK,GAAI,CAAA;AAAA,EACvC;AAGA,EAAA,IAAI,OAAO,UAAA,EAAY;AACnB,IAAA,MAAA,CAAO,WAAW,MAAM,CAAA;AAAA,EAC5B,CAAA,MAAO;AACH,IAAA,MAAA,CAAO,UAAU,MAAM,CAAA;AAAA,EAC3B;AACJ;AAKO,SAAS,gBAAA,CACd,IAAA,EACA,EAAA,EACA,MAAA,EACA,OACA,SAAA,EACM;AACN,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,QAAA,GAAW,CAAA;AAGf,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAA,GAAO,UAAA;AAAA,EACT;AAGA,EAAA,IAAI,EAAA,CAAG,UAAA,KAAe,IAAA,CAAK,UAAA,IAAc,KAAA,EAAO;AAC9C,IAAA,IAAA,IAAQ,OAAA;AAAA,EACV;AACA,EAAA,IAAI,EAAA,CAAG,WAAA,KAAgB,IAAA,CAAK,WAAA,IAAe,KAAA,EAAO;AAC9C,IAAA,IAAA,IAAQ,QAAA;AAAA,EACZ;AACA,EAAA,IAAI,EAAA,CAAG,WAAA,KAAgB,IAAA,CAAK,WAAA,IAAe,KAAA,EAAO;AAC9C,IAAA,IAAA,IAAQ,QAAA;AAAA,EACZ;AACA,EAAA,IAAI,EAAA,CAAG,WAAA,KAAgB,IAAA,CAAK,WAAA,IAAe,KAAA,EAAO;AAC9C,IAAA,IAAA,IAAQ,QAAA;AAAA,EACZ;AAEA,EAAA,IAAI,GAAG,MAAA,CAAO,CAAA,KAAM,IAAA,CAAK,MAAA,CAAO,KAAK,KAAA,EAAO;AAC1C,IAAA,IAAA,IAAQ,SAAA;AAAA,EACV;AACA,EAAA,IAAI,GAAG,MAAA,CAAO,CAAA,KAAM,IAAA,CAAK,MAAA,CAAO,KAAK,KAAA,EAAO;AAC1C,IAAA,IAAA,IAAQ,SAAA;AAAA,EACV;AACA,EAAA,IAAI,GAAG,MAAA,CAAO,CAAA,KAAM,IAAA,CAAK,MAAA,CAAO,KAAK,KAAA,EAAO;AAC1C,IAAA,IAAA,IAAQ,SAAA;AAAA,EACV;AACA,EAAA,IAAI,GAAG,MAAA,CAAO,CAAA,KAAM,IAAA,CAAK,MAAA,CAAO,KAAK,KAAA,EAAO;AAC1C,IAAA,IAAA,IAAQ,QAAA;AAAA,EACV;AACA,EAAA,IAAI,GAAG,MAAA,CAAO,CAAA,KAAM,IAAA,CAAK,MAAA,CAAO,KAAK,KAAA,EAAO;AAC1C,IAAA,IAAA,IAAQ,QAAA;AAAA,EACV;AACA,EAAA,IAAI,GAAG,MAAA,CAAO,CAAA,KAAM,IAAA,CAAK,MAAA,CAAO,KAAK,KAAA,EAAO;AAC1C,IAAA,IAAA,IAAQ,QAAA;AAAA,EACV;AAEA,EAAA,IAAI,EAAA,CAAG,KAAA,KAAU,IAAA,CAAK,KAAA,IAAS,KAAA,EAAO;AAClC,IAAA,IAAI,EAAA,CAAG,KAAA,IAAS,GAAA,EAAK,IAAA,IAAQ,SAAA;AAAA,SACxB,IAAA,IAAQ,QAAA;AAAA,EACjB;AAEA,EAAA,IAAI,EAAA,CAAG,OAAA,KAAY,IAAA,CAAK,OAAA,IAAW,KAAA,EAAO;AACtC,IAAA,IAAI,EAAA,CAAG,OAAA,IAAW,GAAA,EAAK,IAAA,IAAQ,QAAA;AAAA,SAC1B,IAAA,IAAQ,OAAA;AAAA,EACjB;AAEA,EAAA,IAAI,EAAA,CAAG,OAAA,KAAY,IAAA,CAAK,OAAA,IAAW,KAAA,EAAO;AACtC,IAAA,IAAI,EAAA,CAAG,OAAA,IAAW,GAAA,EAAK,IAAA,IAAQ,WAAA;AAAA,SAC1B,IAAA,IAAQ,UAAA;AAAA,EACjB;AAEA,EAAA,IAAI,EAAA,CAAG,QAAA,KAAa,IAAA,CAAK,QAAA,IAAY,KAAA,EAAO;AACxC,IAAA,IAAI,EAAA,CAAG,QAAA,IAAY,GAAA,EAAK,IAAA,IAAQ,YAAA;AAAA,SAC3B,IAAA,IAAQ,WAAA;AAAA,EACjB;AAEA,EAAA,IAAI,EAAA,CAAG,KAAA,KAAU,IAAA,CAAK,KAAA,IAAS,KAAA,EAAO;AACpC,IAAA,IAAA,IAAQ,OAAA;AAAA,EACV;AACA,EAAA,IAAI,EAAA,CAAG,KAAA,KAAU,IAAA,CAAK,KAAA,IAAS,KAAA,EAAO;AACpC,IAAA,IAAA,IAAQ,OAAA;AAAA,EACV;AACA,EAAA,IAAI,EAAA,CAAG,KAAA,KAAU,IAAA,CAAK,KAAA,IAAS,KAAA,EAAO;AACpC,IAAA,IAAA,IAAQ,OAAA;AAAA,EACV;AAGA,EAAA,IAAA,CAAK,GAAG,KAAA,KAAU,IAAA,CAAK,SAAS,KAAA,KAAU,EAAA,CAAG,UAAU,MAAA,EAAW;AAC9D,IAAA,IAAA,IAAQ,OAAA;AAAA,EACZ;AACA,EAAA,IAAA,CAAK,GAAG,KAAA,KAAU,IAAA,CAAK,SAAS,KAAA,KAAU,EAAA,CAAG,UAAU,MAAA,EAAW;AAC9D,IAAA,IAAA,IAAQ,OAAA;AAAA,EACZ;AACA,EAAA,IAAA,CAAK,GAAG,YAAA,KAAiB,IAAA,CAAK,gBAAgB,KAAA,KAAU,EAAA,CAAG,iBAAiB,MAAA,EAAW;AACnF,IAAA,IAAA,IAAQ,eAAA;AAAA,EACZ;AACA,EAAA,IAAA,CAAK,GAAG,UAAA,KAAe,IAAA,CAAK,cAAc,KAAA,KAAU,EAAA,CAAG,eAAe,MAAA,EAAW;AAC7E,IAAA,IAAA,IAAQ,aAAA;AAAA,EACZ;AAGA,EAAA,IAAA,CAAK,GAAG,eAAA,KAAoB,IAAA,CAAK,mBAAmB,KAAA,KAAU,EAAA,CAAG,oBAAoB,MAAA,EAAW;AAC5F,IAAA,QAAA,IAAY,uBAAA;AAAA,EAChB;AACA,EAAA,IAAA,CAAK,GAAG,KAAA,KAAU,IAAA,CAAK,SAAS,KAAA,KAAU,EAAA,CAAG,UAAU,MAAA,EAAW;AAC9D,IAAA,QAAA,IAAY,YAAA;AAAA,EAChB;AACA,EAAA,IAAA,CAAK,GAAG,QAAA,KAAa,IAAA,CAAK,YAAY,KAAA,KAAU,EAAA,CAAG,aAAa,MAAA,EAAW;AACvE,IAAA,QAAA,IAAY,gBAAA;AAAA,EAChB;AAIA,EAAA,IAAI,EAAA,CAAG,UAAU,GAAA,EAAK;AAClB,IAAA,IAAA,IAAQ,UAAA;AAAA,EACZ;AAKA,EAAA,IAAI,WAAW,CAAA,EAAG;AACd,IAAA,IAAA,IAAQ,WAAA;AAAA,EACZ;AAGA,EAAA,IAAI,OAAO,UAAA,EAAY;AACnB,IAAA,IAAA,IAAQ,WAAA;AAAA,EACZ;AACA,EAAA,IAAI,OAAO,UAAA,EAAY;AACnB,IAAA,IAAA,IAAQ,WAAA;AAAA,EACZ;AACA,EAAA,IAAI,OAAO,UAAA,EAAY;AACnB,IAAA,IAAA,IAAQ,WAAA;AAAA,EACZ;AAGA,EAAA,MAAA,CAAO,SAAA,CAAU,OAAO,GAAI,CAAA;AAE5B,EAAA,IAAI,OAAO,WAAA,EAAa;AACpB,IAAA,MAAA,CAAO,SAAA,CAAW,IAAA,IAAQ,CAAA,GAAK,GAAI,CAAA;AAAA,EACvC;AACA,EAAA,IAAI,OAAO,WAAA,EAAa;AACpB,IAAA,MAAA,CAAO,SAAA,CAAW,IAAA,IAAQ,EAAA,GAAM,GAAI,CAAA;AAAA,EACxC;AACA,EAAA,IAAI,OAAO,WAAA,EAAa;AACpB,IAAA,MAAA,CAAO,SAAA,CAAW,IAAA,IAAQ,EAAA,GAAM,GAAI,CAAA;AAAA,EACxC;AACA,EAAA,IAAI,OAAO,WAAA,EAAa;AACpB,IAAA,MAAA,CAAO,SAAA,CAAU,WAAW,GAAI,CAAA;AAAA,EACpC;AAGA,EAAA,IAAI,OAAO,UAAA,EAAY;AACnB,IAAA,MAAA,CAAO,UAAA,CAAW,GAAG,MAAM,CAAA;AAAA,EAC/B,CAAA,MAAO;AACH,IAAA,MAAA,CAAO,SAAA,CAAU,GAAG,MAAM,CAAA;AAAA,EAC9B;AAGA,EAAA,IAAI,IAAA,GAAO,OAAA,EAAS,MAAA,CAAO,SAAA,CAAU,GAAG,UAAU,CAAA;AAClD,EAAA,IAAI,OAAO,QAAA,EAAU,MAAA,CAAO,SAAA,CAAU,EAAA,CAAG,eAAe,CAAC,CAAA;AACzD,EAAA,IAAI,OAAO,QAAA,EAAU,MAAA,CAAO,SAAA,CAAU,EAAA,CAAG,eAAe,CAAC,CAAA;AACzD,EAAA,IAAI,OAAO,QAAA,EAAU,MAAA,CAAO,SAAA,CAAU,EAAA,CAAG,eAAe,CAAC,CAAA;AAEzD,EAAA,IAAI,IAAA,GAAO,QAAA,EAAU,MAAA,CAAO,SAAA,CAAU,GAAG,KAAK,CAAA;AAC9C,EAAA,IAAI,IAAA,GAAO,SAAA,EAAW,MAAA,CAAO,UAAA,CAAW,GAAG,KAAK,CAAA;AAEhD,EAAA,IAAI,IAAA,GAAO,OAAA,EAAS,MAAA,CAAO,SAAA,CAAU,GAAG,OAAO,CAAA;AAC/C,EAAA,IAAI,IAAA,GAAO,QAAA,EAAU,MAAA,CAAO,UAAA,CAAW,GAAG,OAAO,CAAA;AAEjD,EAAA,IAAI,IAAA,GAAO,UAAA,EAAY,MAAA,CAAO,SAAA,CAAU,GAAG,OAAO,CAAA;AAClD,EAAA,IAAI,IAAA,GAAO,WAAA,EAAa,MAAA,CAAO,UAAA,CAAW,GAAG,OAAO,CAAA;AAEpD,EAAA,IAAI,IAAA,GAAO,WAAA,EAAa,MAAA,CAAO,SAAA,CAAU,GAAG,QAAQ,CAAA;AACpD,EAAA,IAAI,IAAA,GAAO,YAAA,EAAc,MAAA,CAAO,UAAA,CAAW,GAAG,QAAQ,CAAA;AAEtD,EAAA,IAAI,OAAO,SAAA,EAAW,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,OAAO,CAAC,CAAA;AACnD,EAAA,IAAI,OAAO,SAAA,EAAW,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,OAAO,CAAC,CAAA;AACnD,EAAA,IAAI,OAAO,SAAA,EAAW,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,OAAO,CAAC,CAAA;AAEnD,EAAA,IAAI,OAAO,QAAA,EAAU,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,OAAO,CAAC,CAAA;AAClD,EAAA,IAAI,OAAO,QAAA,EAAU,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,OAAO,CAAC,CAAA;AAClD,EAAA,IAAI,OAAO,QAAA,EAAU,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,OAAO,CAAC,CAAA;AAOlD,EAAA,IAAI,OAAO,OAAA,EAAS,MAAA,CAAO,SAAA,CAAU,EAAA,CAAG,SAAS,CAAC,CAAA;AAElD,EAAA,IAAI,OAAO,OAAA,EAAS,MAAA,CAAO,SAAA,CAAU,EAAA,CAAG,SAAS,CAAC,CAAA;AAElD,EAAA,IAAI,IAAA,GAAO,OAAA,EAAS,MAAA,CAAO,UAAA,CAAW,GAAG,KAAK,CAAA;AAG9C,EAAA,IAAI,IAAA,GAAO,OAAA,EAAS,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,OAAO,EAAA,CAAG,KAAA,IAAS,CAAA,IAAK,GAAG,CAAC,CAAA;AACtE,EAAA,IAAI,OAAO,OAAA,EAAS,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,SAAS,CAAC,CAAA;AACnD,EAAA,IAAI,OAAO,eAAA,EAAiB,MAAA,CAAO,SAAA,CAAU,EAAA,CAAG,gBAAgB,CAAC,CAAA;AACjE,EAAA,IAAI,IAAA,GAAO,aAAA,EAAe,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,OAAO,EAAA,CAAG,UAAA,IAAc,CAAA,IAAK,GAAG,CAAC,CAAA;AAGjF,EAAA,IAAI,QAAA,GAAW,uBAAA,EAAyB,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,OAAO,EAAA,CAAG,eAAA,IAAmB,CAAA,IAAK,GAAG,CAAC,CAAA;AACpG,EAAA,IAAI,WAAW,YAAA,EAAc,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,SAAS,CAAC,CAAA;AAC5D,EAAA,IAAI,WAAW,gBAAA,EAAkB,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,YAAY,CAAC,CAAA;AACrE;;;AChRA,IAAM,YAAa,CAAA,IAAK,CAAA;AACxB,IAAM,cAAe,CAAA,IAAK,CAAA;AAC1B,IAAM,gBAAiB,CAAA,IAAK,CAAA;AAC5B,IAAM,YAAa,CAAA,IAAK,CAAA;AACxB,IAAM,aAAc,CAAA,IAAK,CAAA;AACzB,IAAM,eAAgB,CAAA,IAAK,CAAA;AAC3B,IAAM,oBAAqB,CAAA,IAAK,CAAA;AAChC,IAAM,gBAAiB,CAAA,IAAK,CAAA;AAC5B,IAAM,gBAAiB,CAAA,IAAK,CAAA;AAC5B,IAAM,gBAAiB,CAAA,IAAK,CAAA;AAC5B,IAAM,WAAY,CAAA,IAAK,EAAA;AACvB,IAAM,SAAU,CAAA,IAAK,EAAA;AACrB,IAAM,iBAAkB,CAAA,IAAK,EAAA;AAC7B,IAAM,iBAAkB,CAAA,IAAK,EAAA;AAC7B,IAAM,aAAc,CAAA,IAAK,EAAA;AACzB,IAAM,eAAgB,CAAA,IAAK,EAAA;AAEpB,SAAS,gBAAA,CAAiB,QAAsB,EAAA,EAA+B;AAEpF,EAAA,IAAI,IAAA,GAAO,CAAA;AAEX,EAAA,IAAI,EAAA,CAAG,OAAA,KAAY,CAAA,EAAG,IAAA,IAAQ,SAAA;AAC9B,EAAA,IAAI,EAAA,CAAG,MAAA,CAAO,CAAA,KAAM,CAAA,IAAK,EAAA,CAAG,MAAA,CAAO,CAAA,KAAM,CAAA,IAAK,EAAA,CAAG,MAAA,CAAO,CAAA,KAAM,CAAA,EAAG,IAAA,IAAQ,WAAA;AACzE,EAAA,IAAI,EAAA,CAAG,QAAA,CAAS,CAAA,KAAM,CAAA,IAAK,EAAA,CAAG,QAAA,CAAS,CAAA,KAAM,CAAA,IAAK,EAAA,CAAG,QAAA,CAAS,CAAA,KAAM,CAAA,EAAG,IAAA,IAAQ,aAAA;AAC/E,EAAA,IAAI,EAAA,CAAG,OAAA,KAAY,CAAA,EAAG,IAAA,IAAQ,SAAA;AAC9B,EAAA,IAAI,EAAA,CAAG,QAAA,KAAa,CAAA,EAAG,IAAA,IAAQ,UAAA;AAC/B,EAAA,IAAI,EAAA,CAAG,OAAA,KAAY,CAAA,EAAG,IAAA,IAAQ,YAAA;AAC9B,EAAA,IAAI,EAAA,CAAG,YAAA,CAAa,CAAA,KAAM,CAAA,IAAK,EAAA,CAAG,YAAA,CAAa,CAAA,KAAM,CAAA,IAAK,EAAA,CAAG,YAAA,CAAa,CAAA,KAAM,CAAA,EAAG,IAAA,IAAQ,iBAAA;AAC3F,EAAA,IAAI,EAAA,CAAG,UAAA,CAAW,CAAA,KAAM,CAAA,IAAK,EAAA,CAAG,UAAA,CAAW,CAAA,KAAM,CAAA,IAAK,EAAA,CAAG,UAAA,CAAW,CAAA,KAAM,CAAA,EAAG,IAAA,IAAQ,aAAA;AACrF,EAAA,IAAI,EAAA,CAAG,UAAA,CAAW,CAAA,KAAM,CAAA,IAAK,EAAA,CAAG,UAAA,CAAW,CAAA,KAAM,CAAA,IAAK,EAAA,CAAG,UAAA,CAAW,CAAA,KAAM,CAAA,EAAG,IAAA,IAAQ,aAAA;AACrF,EAAA,IAAI,EAAA,CAAG,WAAA,CAAY,CAAA,KAAM,CAAA,IAAK,EAAA,CAAG,WAAA,CAAY,CAAA,KAAM,CAAA,IAAK,EAAA,CAAG,WAAA,CAAY,CAAA,KAAM,CAAA,EAAG,IAAA,IAAQ,aAAA;AACxF,EAAA,IAAI,EAAA,CAAG,SAAA,KAAc,CAAA,EAAG,IAAA,IAAQ,cAAA;AAGhC,EAAA,IAAI,EAAA,CAAG,SAAA,KAAc,CAAA,IACjB,EAAA,CAAG,UAAA,CAAW,CAAA,KAAM,CAAA,IAAK,EAAA,CAAG,UAAA,CAAW,CAAA,KAAM,CAAA,IAAK,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA,IACtE,EAAA,CAAG,UAAA,CAAW,CAAA,KAAM,CAAA,IAAK,EAAA,CAAG,UAAA,CAAW,CAAA,KAAM,CAAA,IAAK,EAAA,CAAG,UAAA,CAAW,CAAA,KAAM,CAAA,EAAG;AACzE,IAAA,IAAA,IAAQ,cAAA;AAAA,EACZ;AAEA,EAAA,IAAI,EAAA,CAAG,UAAU,EAAA,CAAG,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,IAAK,GAAG,KAAA,CAAM,CAAC,MAAM,CAAA,IAAK,EAAA,CAAG,MAAM,CAAC,CAAA,KAAM,KAAK,EAAA,CAAG,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI;AAChG,IAAA,IAAA,IAAQ,QAAA;AAAA,EACZ;AAEA,EAAA,IAAI,EAAA,CAAG,GAAA,KAAQ,CAAA,EAAG,IAAA,IAAQ,MAAA;AAC1B,EAAA,IAAI,EAAA,CAAG,OAAA,KAAY,CAAA,EAAG,IAAA,IAAQ,UAAA;AAC9B,EAAA,IAAI,EAAA,CAAG,SAAA,KAAc,CAAA,EAAG,IAAA,IAAQ,YAAA;AAGhC,EAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AACzB,IAAA,IAAI,EAAA,CAAG,MAAM,CAAC,CAAA,IAAK,GAAG,KAAA,CAAM,CAAC,MAAM,CAAA,EAAG;AAClC,MAAA,SAAA,IAAc,CAAA,IAAK,CAAA;AAAA,IACvB;AAAA,EACJ;AAGA,EAAA,MAAA,CAAO,WAAW,IAAI,CAAA;AAGtB,EAAA,IAAI,IAAA,GAAO,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,GAAG,OAAO,CAAA;AAEjD,EAAA,IAAI,OAAO,WAAA,EAAa;AACpB,IAAA,MAAA,CAAO,WAAW,IAAA,CAAK,KAAA,CAAM,GAAG,MAAA,CAAO,CAAA,GAAI,CAAC,CAAC,CAAA;AAC7C,IAAA,MAAA,CAAO,WAAW,IAAA,CAAK,KAAA,CAAM,GAAG,MAAA,CAAO,CAAA,GAAI,CAAC,CAAC,CAAA;AAC7C,IAAA,MAAA,CAAO,WAAW,IAAA,CAAK,KAAA,CAAM,GAAG,MAAA,CAAO,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI,OAAO,aAAA,EAAe;AACtB,IAAA,MAAA,CAAO,WAAW,IAAA,CAAK,KAAA,CAAM,GAAG,QAAA,CAAS,CAAA,GAAI,CAAC,CAAC,CAAA;AAC/C,IAAA,MAAA,CAAO,WAAW,IAAA,CAAK,KAAA,CAAM,GAAG,QAAA,CAAS,CAAA,GAAI,CAAC,CAAC,CAAA;AAC/C,IAAA,MAAA,CAAO,WAAW,IAAA,CAAK,KAAA,CAAM,GAAG,QAAA,CAAS,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,EACnD;AAEA,EAAA,IAAI,IAAA,GAAO,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,GAAG,OAAO,CAAA;AACjD,EAAA,IAAI,IAAA,GAAO,UAAA,EAAY,MAAA,CAAO,SAAA,CAAU,GAAG,QAAQ,CAAA;AACnD,EAAA,IAAI,IAAA,GAAO,YAAA,EAAc,MAAA,CAAO,UAAA,CAAW,GAAG,OAAO,CAAA;AAErD,EAAA,IAAI,OAAO,iBAAA,EAAmB;AAC1B,IAAA,MAAA,CAAO,UAAA,CAAW,KAAK,KAAA,CAAM,EAAA,CAAG,aAAa,CAAA,IAAK,KAAA,GAAQ,IAAI,CAAC,CAAA;AAC/D,IAAA,MAAA,CAAO,UAAA,CAAW,KAAK,KAAA,CAAM,EAAA,CAAG,aAAa,CAAA,IAAK,KAAA,GAAQ,IAAI,CAAC,CAAA;AAC/D,IAAA,MAAA,CAAO,UAAA,CAAW,KAAK,KAAA,CAAM,EAAA,CAAG,aAAa,CAAA,IAAK,KAAA,GAAQ,IAAI,CAAC,CAAA;AAAA,EACnE;AAEA,EAAA,IAAI,OAAO,aAAA,EAAe;AACtB,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,KAAA,CAAM,GAAG,UAAA,CAAW,CAAA,GAAI,CAAC,CAAC,CAAA;AAChD,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,KAAA,CAAM,GAAG,UAAA,CAAW,CAAA,GAAI,CAAC,CAAC,CAAA;AAChD,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,KAAA,CAAM,GAAG,UAAA,CAAW,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,EACpD;AAEA,EAAA,IAAI,OAAO,aAAA,EAAe;AACtB,IAAA,MAAA,CAAO,YAAA,CAAa,EAAA,CAAG,UAAA,CAAW,CAAC,CAAA;AACnC,IAAA,MAAA,CAAO,YAAA,CAAa,EAAA,CAAG,UAAA,CAAW,CAAC,CAAA;AACnC,IAAA,MAAA,CAAO,YAAA,CAAa,EAAA,CAAG,UAAA,CAAW,CAAC,CAAA;AAAA,EACvC;AAEA,EAAA,IAAI,OAAO,aAAA,EAAe;AACtB,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,KAAA,CAAM,GAAG,WAAA,CAAY,CAAA,GAAI,CAAC,CAAC,CAAA;AACjD,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,KAAA,CAAM,GAAG,WAAA,CAAY,CAAA,GAAI,CAAC,CAAC,CAAA;AACjD,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,KAAA,CAAM,GAAG,WAAA,CAAY,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,EACrD;AAEA,EAAA,IAAI,IAAA,GAAO,cAAA,EAAgB,MAAA,CAAO,SAAA,CAAU,GAAG,SAAS,CAAA;AAExD,EAAA,IAAI,OAAO,cAAA,EAAgB;AACvB,IAAA,MAAA,CAAO,SAAA,CAAU,GAAG,SAAS,CAAA;AAC7B,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,KAAA,CAAM,GAAG,UAAA,CAAW,CAAA,GAAI,CAAC,CAAC,CAAA;AAChD,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,KAAA,CAAM,GAAG,UAAA,CAAW,CAAA,GAAI,CAAC,CAAC,CAAA;AAChD,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,KAAA,CAAM,GAAG,UAAA,CAAW,CAAA,GAAI,CAAC,CAAC,CAAA;AAChD,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,KAAA,CAAM,GAAG,UAAA,CAAW,CAAA,GAAI,CAAC,CAAC,CAAA;AAChD,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,KAAA,CAAM,GAAG,UAAA,CAAW,CAAA,GAAI,CAAC,CAAC,CAAA;AAChD,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,KAAA,CAAM,GAAG,UAAA,CAAW,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,EACpD;AAEA,EAAA,IAAI,OAAO,QAAA,EAAU;AACjB,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,KAAA,CAAM,GAAG,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AACxC,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,KAAA,CAAM,GAAG,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AACxC,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,KAAA,CAAM,GAAG,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AACxC,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,KAAA,CAAM,GAAG,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AAAA,EAC5C;AAEA,EAAA,IAAI,IAAA,GAAO,MAAA,EAAQ,MAAA,CAAO,SAAA,CAAU,GAAG,GAAG,CAAA;AAC1C,EAAA,IAAI,IAAA,GAAO,UAAA,EAAY,MAAA,CAAO,SAAA,CAAU,GAAG,OAAO,CAAA;AAClD,EAAA,IAAI,IAAA,GAAO,YAAA,EAAc,MAAA,CAAO,SAAA,CAAU,GAAG,SAAS,CAAA;AAGtD,EAAA,MAAA,CAAO,UAAU,SAAS,CAAA;AAC1B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AACzB,IAAA,IAAI,SAAA,GAAa,KAAK,CAAA,EAAI;AACtB,MAAA,MAAA,CAAO,UAAA,CAAW,EAAA,CAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IACjC;AAAA,EACJ;AACF;;;AC3JA,IAAMC,UAAAA,GAAY,KAAA;AAIlB,IAAMtB,WAAAA,GAAa;AAAA,EACjB,IAAA,EAAM,CAAA;AAAA,EACN,IAAA,EAAM,CAAA;AAAA,EACN,KAAA,EAAO,CAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAA;AAEA,IAAMuB,mBAAAA,GAAqB,CAAC,KAAA,EAAoB,KAAA,KAAqC;AACnF,EAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,KAAA,CAAM,MAAA,EAAO;AAChC,EAAA,KAAA,CAAM,CAAA,IAAK,IAAA;AACX,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA;AAE7C,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,QAAA,EAAU,YAAY,QAAA,GAAW;AAAA,GACnC;AACF,CAAA;AAEA,IAAM,UAAA,GAAa,CAAC,KAAA,EAAoBhB,cAAAA,KAAwD;AAC9F,EAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,KAAA,CAAM,MAAA,EAAO;AAChC,EAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAK,GAAI,KAAA;AAGvB,EAAA,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA;AAEpC,EAAA,MAAM,YAAA,GAAeA,eAAc,KAAK,CAAA;AAExC,EAAA,IAAI,EAAE,eAAe,UAAA,CAAA,EAAa;AAChC,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,YAAYP,WAAAA,CAAW,IAAA,EAAM,WAAW,CAAA,EAAE;AAAA,EAC/D;AAEA,EAAA,IAAI,aAAqBA,WAAAA,CAAW,IAAA;AACpC,EAAA,IAAI,SAAA,GAAY,YAAA;AAGhB,EAAA,MAAM,QAAQ,KAAA,CAAM,MAAA,CAAO,KAAK,IAAA,CAAK,CAAA,GAAI,KAAK,CAAA,IAAK,GAAA;AACnD,EAAA,KAAA,CAAM,CAAA,GAAI,KAAA;AACV,EAAA,MAAM,aAAA,GAAgBO,eAAc,KAAK,CAAA;AAEzC,EAAA,IAAI,gBAAgB,UAAA,EAAY;AAC9B,IAAA,UAAA,GAAaP,WAAAA,CAAW,KAAA;AACxB,IAAA,SAAA,GAAY,aAAA;AAOZ,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,CAAA,GAAI,EAAA;AAC9B,IAAA,KAAA,CAAM,CAAA,GAAI,IAAA;AACV,IAAA,MAAM,YAAA,GAAeO,eAAc,KAAK,CAAA;AAExC,IAAA,IAAI,eAAe,UAAA,EAAY;AAC7B,MAAA,UAAA,GAAaP,WAAAA,CAAW,KAAA;AACxB,MAAA,SAAA,GAAY,YAAA;AAAA,IACd;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,UAAA,EAAY,SAAA,EAAU;AAC3C,CAAA;AAGO,IAAM,UAAA,GAAa,CACxB,KAAA,EACA,GAAA,EACA,OACAO,cAAAA,KACgB;AAChB,EAAA,IAAI,QAAA,GAAW,EAAE,GAAG,KAAA,EAAM;AAC1B,EAAA,QAAA,GAAWgB,mBAAAA,CAAmB,UAAU,KAAK,CAAA;AAC7C,EAAA,QAAA,GAAW,UAAA,CAAW,UAAUhB,cAAa,CAAA;AAE7C,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAU,QAAA,EAAU,UAAA,EAAY,YAAW,GAAI,QAAA;AAM/D,EAAA,MAAM,cAAA,GAAiB,UAAA,IAAc,CAAA,GACjC,UAAA,GACA;AAAA;AAAA,IAEE,CAAA,EAAG,WAAW,CAAA,GAAI,GAAA,GAAA,CAAO,WAAW,CAAA,GAAI,GAAA,IAAO,CAAA,GAAI,UAAA,CAAW,CAAA,GAAI,CAAA;AAAA,IAClE,GAAG,UAAA,CAAW,CAAA;AAAA,IACd,GAAG,UAAA,CAAW;AAAA,GAChB;AAEJ,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAI,aAAa,cAAc,CAAA;AAItD,EAAA,MAAM,qBAAqB,kBAAA,CAAmB;AAAA,IAC5C,QAAA;AAAA,IACA,SAAA,EAAWe,UAAAA;AAAA,IACX,QAAA;AAAA,IACA,aAAA,EAAe,KAAA;AAAA,IACf,QAAA,EAAU,KAAA;AAAA,IACV,UAAA,EAAY,UAAA;AAAA,IACZ,UAAA,EAAY,CAAA;AAAA,IACZ,WAAA,EAAa,GAAA;AAAA,IACb,eAAA,EAAiB;AAAA,GAClB,CAAA;AAED,EAAA,MAAM,IAAA,GAAO,UAAA,IAAc,CAAA,GACvB,cAAA,CAAe;AAAA,IACb,OAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAA;AAAA,IACA,QAAA,EAAU;AAAA,GACX,IACD,kBAAA,CAAmB;AAAA,IACjB,OAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAA;AAAA,IACA,QAAA,EAAU;AAAA,GACX,CAAA;AAEL,EAAA,MAAM,gBAAgB,oBAAA,CAAqB;AAAA,IACzC,QAAA,EAAU,kBAAA;AAAA,IACV,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,WAAW,IAAA,CAAK,SAAA;AAAA;AAAA,IAEhB,KAAA,EAAQ,QAAA,IAAY,UAAA,IAAc,CAAA,GAAK,EAAA,GAAK,CAAA;AAAA,IAC5C,SAAA,EAAWA;AAAA,GACZ,CAAA;AAED,EAAA,MAAM,WAAA,GAAc,MAAM,MAAA,EAAQ;AAAA,IAChC,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,aAAA,CAAc,CAAA,GAAIA,UAAAA;AAAA,IAChC,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,aAAA,CAAc,CAAA,GAAIA,UAAAA;AAAA,IAChC,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,aAAA,CAAc,CAAA,GAAIA;AAAA,GACjC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,GAAG,QAAA;AAAA,IACH,QAAQ,WAAA,CAAY,MAAA;AAAA,IACpB,QAAA,EAAU;AAAA,GACZ;AACF;;;ACnJO,IAAM,eAAN,MAAmB;AAAA,EAKxB,YAAY,MAAA,EAAkC;AAJ9C,IAAA,aAAA,CAAA,IAAA,EAAQ,MAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,QAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,QAAA,CAAA;AAGN,IAAA,IAAI,kBAAkB,UAAA,EAAY;AAChC,MAAA,IAAA,CAAK,IAAA,GAAO,IAAI,QAAA,CAAS,MAAA,CAAO,QAAQ,MAAA,CAAO,UAAA,EAAY,OAAO,UAAU,CAAA;AAAA,IAC9E,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,IAAA,GAAO,IAAI,QAAA,CAAS,MAAM,CAAA;AAAA,IACjC;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,IAAA,CAAK,UAAA;AAAA,EAC1B;AAAA,EAEO,WAAA,GAAsB;AAC3B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEO,eAAA,GAA0B;AAC/B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEO,SAAA,GAAoB;AACzB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEO,YAAA,GAAuB;AAC5B,IAAA,OAAO,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AAAA,EAC5B;AAAA,EAEO,KAAK,QAAA,EAAwB;AAClC,IAAA,IAAI,QAAA,GAAW,CAAA,IAAK,QAAA,GAAW,IAAA,CAAK,MAAA,EAAQ;AAC1C,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,QAAQ,CAAA,UAAA,EAAa,IAAA,CAAK,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IAC5E;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AAAA,EAChB;AAAA,EAEO,gBAAgB,QAAA,EAAwB;AAC7C,IAAA,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,EACpB;AAAA,EAEO,OAAA,GAAmB;AACxB,IAAA,OAAO,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AAAA,EAC5B;AAAA,EAEO,SAAS,KAAA,EAAwB;AACtC,IAAA,OAAO,IAAA,CAAK,MAAA,GAAS,KAAA,IAAS,IAAA,CAAK,MAAA;AAAA,EACrC;AAAA,EAEO,QAAA,GAAmB;AACxB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,KAAK,MAAM,CAAA;AAC3C,IAAA,IAAA,CAAK,MAAA,IAAU,CAAA;AACf,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEO,QAAA,GAAmB;AACxB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,KAAK,MAAM,CAAA;AAC5C,IAAA,IAAA,CAAK,MAAA,IAAU,CAAA;AACf,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEO,SAAA,GAAoB;AACzB,IAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,QAAQ,IAAI,CAAA;AAClD,IAAA,IAAA,CAAK,MAAA,IAAU,CAAA;AACf,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEO,UAAA,GAAqB;AAC1B,IAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,QAAQ,IAAI,CAAA;AACnD,IAAA,IAAA,CAAK,MAAA,IAAU,CAAA;AACf,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEO,QAAA,GAAmB;AACxB,IAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,QAAQ,IAAI,CAAA;AAClD,IAAA,IAAA,CAAK,MAAA,IAAU,CAAA;AACf,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEO,SAAA,GAAoB;AACzB,IAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,QAAQ,IAAI,CAAA;AACnD,IAAA,IAAA,CAAK,MAAA,IAAU,CAAA;AACf,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEO,SAAA,GAAoB;AACzB,IAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,QAAQ,IAAI,CAAA;AACpD,IAAA,IAAA,CAAK,MAAA,IAAU,CAAA;AACf,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEO,UAAA,GAAqB;AAC1B,IAAA,IAAI,GAAA,GAAM,EAAA;AACV,IAAA,OAAO,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ;AAChC,MAAA,MAAM,QAAA,GAAW,KAAK,QAAA,EAAS;AAC/B,MAAA,IAAI,QAAA,KAAa,EAAA,IAAM,QAAA,KAAa,CAAA,EAAG;AACrC,QAAA;AAAA,MACF;AACA,MAAA,GAAA,IAAO,MAAA,CAAO,aAAa,QAAQ,CAAA;AAAA,IACrC;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEO,cAAA,GAAyB;AAC9B,IAAA,IAAI,GAAA,GAAM,EAAA;AACV,IAAA,OAAO,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ;AAChC,MAAA,MAAM,QAAA,GAAW,KAAK,QAAA,EAAS;AAC/B,MAAA,IAAI,QAAA,KAAa,EAAA,IAAM,QAAA,KAAa,CAAA,IAAK,aAAa,EAAA,EAAI;AACxD,QAAA;AAAA,MACF;AACA,MAAA,GAAA,IAAO,MAAA,CAAO,aAAa,QAAQ,CAAA;AAAA,IACrC;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEO,SAAA,GAAoB;AACzB,IAAA,OAAO,IAAA,CAAK,SAAA,EAAU,IAAK,CAAA,GAAM,CAAA,CAAA;AAAA,EACnC;AAAA,EAEO,SAAA,GAAoB;AACzB,IAAA,OAAO,IAAA,CAAK,QAAA,EAAS,IAAK,GAAA,GAAQ,GAAA,CAAA;AAAA,EACpC;AAAA,EAEO,WAAA,GAAsB;AAC3B,IAAA,OAAQ,IAAA,CAAK,SAAA,EAAU,GAAI,GAAA,GAAS,KAAA;AAAA,EACtC;AAAA,EAEO,SAAS,MAAA,EAA4B;AAC1C,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ;AACrC,MAAA,MAAM,IAAI,MAAM,CAAA,oBAAA,EAAuB,IAAA,CAAK,SAAS,MAAM,CAAA,UAAA,EAAa,IAAA,CAAK,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IACzF;AACA,IAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,MAAA,EAAQ,MAAM,CAAA;AACxF,IAAA,IAAA,CAAK,MAAA,IAAU,MAAA;AAEf,IAAA,OAAO,IAAI,WAAW,IAAI,CAAA;AAAA,EAC5B;AAAA,EAEO,QAAQ,GAAA,EAAgD;AAC7D,IAAA,GAAA,CAAI,CAAA,GAAI,KAAK,SAAA,EAAU;AACvB,IAAA,GAAA,CAAI,CAAA,GAAI,KAAK,SAAA,EAAU;AACvB,IAAA,GAAA,CAAI,CAAA,GAAI,KAAK,SAAA,EAAU;AAAA,EACzB;AAAA,EAEO,QAAQ,GAAA,EAAgD;AAC7D,IAAA,MAAM,CAAA,GAAI,KAAK,QAAA,EAAS;AACxB,IAAA,IAAI,KAAK,GAAA,EAAK;AACZ,MAAA,GAAA,CAAI,CAAA,GAAI,CAAA;AAAG,MAAA,GAAA,CAAI,CAAA,GAAI,CAAA;AAAG,MAAA,GAAA,CAAI,CAAA,GAAI,CAAA;AAC9B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AACrB,IAAA,GAAA,CAAI,CAAA,GAAI,KAAK,CAAC,CAAA;AACd,IAAA,GAAA,CAAI,CAAA,GAAI,KAAK,CAAC,CAAA;AACd,IAAA,GAAA,CAAI,CAAA,GAAI,KAAK,CAAC,CAAA;AAAA,EAChB;AACF;;;AC3JO,IAAM,eAAN,MAAmB;AAAA,EAMxB,WAAA,CAAY,eAAoC,IAAA,EAAM;AALtD,IAAA,aAAA,CAAA,IAAA,EAAQ,QAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,MAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,QAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAiB,OAAA,CAAA;AAGf,IAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,MAAA,IAAA,CAAK,MAAA,GAAS,IAAI,UAAA,CAAW,YAAY,CAAA;AACzC,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,IACf,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,MAAA,GAAS,YAAA;AACd,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,IACf;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA;AAC3F,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AAAA,EAChB;AAAA,EAEQ,YAAY,KAAA,EAAe;AACjC,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,KAAA,GAAQ,IAAA,CAAK,OAAO,UAAA,EAAY;AAChD,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA,SAAA,EAAY,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA,CAAE,CAAA;AAAA,MACtG;AAEA,MAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,IAAA,CAAK,OAAO,UAAA,GAAa,CAAA,EAAG,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AACxE,MAAA,MAAM,SAAA,GAAY,IAAI,UAAA,CAAW,OAAO,CAAA;AACxC,MAAA,SAAA,CAAU,GAAA,CAAI,KAAK,MAAM,CAAA;AACzB,MAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,MAAA,IAAA,CAAK,IAAA,GAAO,IAAI,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA;AAAA,IAC7F;AAAA,EACF;AAAA,EAEO,UAAU,KAAA,EAAqB;AACpC,IAAA,IAAA,CAAK,YAAY,CAAC,CAAA;AAClB,IAAA,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AACrC,IAAA,IAAA,CAAK,MAAA,IAAU,CAAA;AAAA,EACjB;AAAA,EAEO,WAAW,IAAA,EAAwB;AACtC,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,UAAU,CAAA;AAChC,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AACjC,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,UAAA;AAAA,EACxB;AAAA,EAEO,UAAU,KAAA,EAAqB;AACpC,IAAA,IAAA,CAAK,YAAY,CAAC,CAAA;AAClB,IAAA,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AACpC,IAAA,IAAA,CAAK,MAAA,IAAU,CAAA;AAAA,EACjB;AAAA,EAEO,WAAW,KAAA,EAAqB;AACrC,IAAA,IAAA,CAAK,YAAY,CAAC,CAAA;AAMlB,IAAA,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAI,CAAA;AAC3C,IAAA,IAAA,CAAK,MAAA,IAAU,CAAA;AAAA,EACjB;AAAA,EAEO,UAAU,KAAA,EAAqB;AACpC,IAAA,IAAA,CAAK,YAAY,CAAC,CAAA;AAClB,IAAA,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAI,CAAA;AAC3C,IAAA,IAAA,CAAK,MAAA,IAAU,CAAA;AAAA,EACjB;AAAA,EAEO,WAAW,KAAA,EAAqB;AACrC,IAAA,IAAA,CAAK,YAAY,CAAC,CAAA;AAClB,IAAA,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAI,CAAA;AAC7C,IAAA,IAAA,CAAK,MAAA,IAAU,CAAA;AAAA,EACjB;AAAA,EAEO,YAAY,KAAA,EAAqB;AAItC,IAAA,MAAM,MAAM,KAAA,CAAM,MAAA;AAClB,IAAA,IAAA,CAAK,WAAA,CAAY,MAAM,CAAC,CAAA;AACxB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA,GAAS,GAAG,KAAA,CAAM,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,IACzD;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAA,GAAS,KAAK,CAAC,CAAA;AACvC,IAAA,IAAA,CAAK,UAAU,GAAA,GAAM,CAAA;AAAA,EACvB;AAAA,EAEO,WAAW,KAAA,EAAqB;AACrC,IAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,EACvC;AAAA,EAEO,WAAW,KAAA,EAAqB;AACrC,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,KAAA,CAAM,QAAQ,GAAA,GAAQ,GAAK,IAAI,GAAG,CAAA;AAAA,EACxD;AAAA,EAEO,aAAa,KAAA,EAAqB;AACvC,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,KAAA,CAAM,QAAQ,KAAA,GAAU,GAAK,IAAI,KAAK,CAAA;AAAA,EAC7D;AAAA,EAEO,SAAS,GAAA,EAAiB;AAC/B,IAAA,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC,CAAA;AACrB,IAAA,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC,CAAA;AACrB,IAAA,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,EACvB;AAAA,EAEO,SAAS,GAAA,EAAiB;AAE7B,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,SAAA,GAAY,CAAA;AAGhB,IAAA,IAAI,GAAA,CAAI,MAAM,CAAA,IAAK,GAAA,CAAI,MAAM,CAAA,IAAK,GAAA,CAAI,MAAM,CAAA,EAAG;AAC7C,MAAA,IAAA,CAAK,UAAU,CAAC,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,MAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AACrB,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,GAAI,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,GAAI,GAAA,CAAI,CAAA,GAAI,KAAK,CAAC,CAAA;AAC9D,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,MAAA,GAAS,GAAA;AACT,QAAA,SAAA,GAAY,CAAA;AAAA,MACd;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAU,SAAS,CAAA;AAAA,EAC5B;AAAA,EAEO,OAAA,GAAsB;AACzB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAK,MAAM,CAAA;AAAA,EAC3C;AAAA,EAEO,SAAA,GAAwB;AAC3B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAChB;AAAA,EAEO,SAAA,GAAoB;AACvB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAChB;AAAA,EAEO,KAAA,GAAc;AACjB,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AAAA,EAClB;AACF;;;AC/IO,IAAM,wBAAN,MAA4B;AAAA,EAKjC,WAAA,CAAY,cAAsB,IAAA,EAAM;AAJxC,IAAA,aAAA,CAAA,IAAA,EAAQ,QAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,MAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,QAAA,CAAA;AAGN,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,UAAA,CAAW,WAAW,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,QAAA,CAAS,IAAA,CAAK,OAAO,MAAM,CAAA;AAC3C,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AAAA,EAChB;AAAA,EAEQ,eAAe,MAAA,EAAsB;AAC3C,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,MAAA,GAAS,IAAA,CAAK,OAAO,MAAA,EAAQ;AAC7C,MAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,IAAA,CAAK,OAAO,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,MAAA,GAAS,MAAM,CAAA;AACrE,MAAA,MAAM,SAAA,GAAY,IAAI,UAAA,CAAW,OAAO,CAAA;AACxC,MAAA,SAAA,CAAU,GAAA,CAAI,KAAK,MAAM,CAAA;AACzB,MAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,MAAA,IAAA,CAAK,IAAA,GAAO,IAAI,QAAA,CAAS,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,IAC7C;AAAA,EACF;AAAA,EAEO,OAAA,GAAsB;AAC3B,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAK,MAAM,CAAA;AAAA,EACzC;AAAA,EAEO,UAAU,KAAA,EAAqB;AACpC,IAAA,IAAA,CAAK,eAAe,CAAC,CAAA;AACrB,IAAA,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AACrC,IAAA,IAAA,CAAK,MAAA,IAAU,CAAA;AAAA,EACjB;AAAA,EAEO,UAAU,KAAA,EAAqB;AACpC,IAAA,IAAA,CAAK,eAAe,CAAC,CAAA;AACrB,IAAA,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AACpC,IAAA,IAAA,CAAK,MAAA,IAAU,CAAA;AAAA,EACjB;AAAA,EAEO,WAAW,KAAA,EAAqB;AACrC,IAAA,IAAA,CAAK,eAAe,CAAC,CAAA;AACrB,IAAA,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAI,CAAA;AAC3C,IAAA,IAAA,CAAK,MAAA,IAAU,CAAA;AAAA,EACjB;AAAA,EAEO,YAAY,KAAA,EAAqB;AACpC,IAAA,IAAA,CAAK,eAAe,CAAC,CAAA;AACrB,IAAA,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAI,CAAA;AAC5C,IAAA,IAAA,CAAK,MAAA,IAAU,CAAA;AAAA,EACnB;AAAA,EAEO,UAAU,KAAA,EAAqB;AACpC,IAAA,IAAA,CAAK,eAAe,CAAC,CAAA;AACrB,IAAA,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAI,CAAA;AAC3C,IAAA,IAAA,CAAK,MAAA,IAAU,CAAA;AAAA,EACjB;AAAA,EAEO,WAAW,KAAA,EAAqB;AACrC,IAAA,IAAA,CAAK,eAAe,CAAC,CAAA;AACrB,IAAA,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAI,CAAA;AAC7C,IAAA,IAAA,CAAK,MAAA,IAAU,CAAA;AAAA,EACjB;AAAA,EAEO,YAAY,KAAA,EAAqB;AACtC,IAAA,MAAM,GAAA,GAAM,MAAM,MAAA,GAAS,CAAA;AAC3B,IAAA,IAAA,CAAK,eAAe,GAAG,CAAA;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA,GAAS,GAAG,KAAA,CAAM,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,IACzD;AACA,IAAA,IAAA,CAAK,KAAK,QAAA,CAAS,IAAA,CAAK,MAAA,GAAS,KAAA,CAAM,QAAQ,CAAC,CAAA;AAChD,IAAA,IAAA,CAAK,MAAA,IAAU,GAAA;AAAA,EACjB;AAAA,EAEO,UAAU,IAAA,EAAwB;AACrC,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,MAAM,CAAA;AAC/B,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AACjC,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA;AAAA,EACxB;AAAA,EAEO,WAAW,KAAA,EAAqB;AACrC,IAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAG,CAAC,CAAA;AAAA,EACzC;AAAA,EAEO,WAAW,KAAA,EAAqB;AACrC,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,KAAA,CAAM,QAAQ,GAAA,GAAQ,GAAK,IAAI,GAAG,CAAA;AAAA,EACxD;AAAA,EAEO,aAAa,KAAA,EAAqB;AACvC,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,KAAA,GAAU,GAAK,CAAC,CAAA;AAAA,EACrD;AAAA,EAEO,QAAA,CAAS,CAAA,EAAW,CAAA,EAAW,CAAA,EAAiB;AAOnD,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,OAAA,GAAU,OAAA;AAEd,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,CAAK,CAAA,GAAE,IAAI,CAAA,GAAE,CAAA,GAAI,IAAE,CAAC,CAAA;AACrC,IAAA,IAAI,MAAM,CAAA,EAAG;AACT,MAAA,CAAA,IAAK,GAAA;AAAK,MAAA,CAAA,IAAK,GAAA;AAAK,MAAA,CAAA,IAAK,GAAA;AAEzB,MAAA,KAAA,IAAS,CAAA,GAAE,CAAA,EAAG,CAAA,GAAE,GAAA,EAAK,CAAA,EAAA,EAAK;AACtB,QAAA,MAAM,MAAM,CAAA,GAAE,MAAA,CAAO,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,GAAE,MAAA,CAAO,CAAC,EAAE,CAAC,CAAA,GAAI,IAAE,MAAA,CAAO,CAAC,EAAE,CAAC,CAAA;AAC3D,QAAA,IAAI,MAAM,OAAA,EAAS;AACf,UAAA,OAAA,GAAU,GAAA;AACV,UAAA,IAAA,GAAO,CAAA;AAAA,QACX;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,EACvB;AACF;;;ACvGO,IAAM,QAAA,GAAN,MAAM,QAAA,CAAQ;AAAA,EAyCnB,WAAA,GAAc;AA5Bd;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,OAAA,EAAQ,CAAA,CAAA;AAGR;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,kBAAA,EAAmB,CAAA,CAAA;AACnB,IAAA,aAAA,CAAA,IAAA,EAAA,kBAAA,EAAmB,CAAA,CAAA;AACnB,IAAA,aAAA,CAAA,IAAA,EAAA,sBAAA,EAAuB,CAAA,CAAA;AAGvB;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,8BAAA,EAA+B,KAAA,CAAA;AAC/B;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,0BAAA,EAA2B,CAAA,CAAA;AAC3B;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,0BAAA,EAA2B,CAAA,CAAA;AAC3B;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,iBAAA,CAAA;AACA,IAAA,aAAA,CAAA,IAAA,EAAA,gBAAA,EAAiB,CAAA,CAAA;AAGjB;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,oBAAA,EAAqB,CAAA,CAAA;AAGrB;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,gBAAA,EAAoC,IAAA,CAAA;AACpC,IAAA,aAAA,CAAA,IAAA,EAAA,gBAAA,EAAiB,CAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAA,kBAAA,EAAmB,CAAA,CAAA;AAGnB;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,cAAA,EAAe,CAAA,CAAA;AACf,IAAA,aAAA,CAAA,IAAA,EAAA,UAAA,EAAW,CAAA,CAAA;AAEX,IAAA,aAAA,CAAA,IAAA,EAAA,eAAA,EAAmC,IAAA,CAAA;AAIjC,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,YAAA,CAAa,QAAA,CAAQ,mBAAmB,CAAA;AAGnE,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAA,CAAK,YAAA,GAAe,GAAA;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,GAAA;AAIhB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,KAAK,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAM,KAAA,EAAe,OAAA,GAA6B,IAAA,EAAY;AAC5D,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAA;AACrB,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AACxB,IAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AACxB,IAAA,IAAA,CAAK,oBAAA,GAAuB,CAAA;AAC5B,IAAA,IAAA,CAAK,4BAAA,GAA+B,KAAA;AACpC,IAAA,IAAA,CAAK,wBAAA,GAA2B,CAAA;AAChC,IAAA,IAAA,CAAK,wBAAA,GAA2B,CAAA;AAChC,IAAA,IAAA,CAAK,cAAA,GAAiB,CAAA;AACtB,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAE3B,IAAA,IAAA,CAAK,kBAAA,GAAqB,CAAA;AAC1B,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,IAAA,CAAK,cAAA,GAAiB,CAAA;AACtB,IAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AAExB,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,GAAA,EAAI;AAC7B,IAAA,IAAA,CAAK,QAAA,GAAW,KAAK,GAAA,EAAI;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,cAAA,EAAyC;AAChD,IAAA,IAAA,CAAK,gBAAA,EAAA;AACL,IAAA,IAAA,CAAK,QAAA,GAAW,KAAK,GAAA,EAAI;AAGzB,IAAA,IAAI,kBAAA,GAAqB,CAAA;AACzB,IAAA,IAAI,UAAA,GAAa,KAAA;AACjB,IAAA,IAAI,aAAA,GAAgB,CAAA;AAEpB,IAAA,IAAI,IAAA,CAAK,iBAAiB,CAAA,EAAG;AAE3B,MAAA,IAAI,IAAA,CAAK,cAAA,GAAiB,QAAA,CAAQ,aAAA,EAAe;AAE/C,QAAA,UAAA,GAAa,IAAA;AAIb,QAAA,IAAI,IAAA,CAAK,kBAAA,IAAsB,IAAA,CAAK,cAAA,EAAgB;AAClD,UAAA,IAAA,CAAK,kBAAA,GAAqB,CAAA;AAAA,QAC5B;AAGA,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,kBAAA;AAC7C,QAAA,kBAAA,GAAqB,SAAA;AACrB,QAAA,IAAI,kBAAA,GAAqB,SAAQ,aAAA,EAAe;AAC9C,UAAA,kBAAA,GAAqB,QAAA,CAAQ,aAAA;AAAA,QAC/B;AAEA,QAAA,aAAA,GAAgB,IAAA,CAAK,kBAAA;AAGrB,QAAA,IAAA,CAAK,kBAAA,IAAsB,kBAAA;AAAA,MAC7B,CAAA,MAAO;AAEL,QAAA,kBAAA,GAAqB,IAAA,CAAK,cAAA;AAAA,MAC5B;AAAA,IACF;AAIA,IAAA,MAAM,aAAa,QAAA,CAAQ,aAAA;AAC3B,IAAA,MAAM,qBAAqB,kBAAA,GAAqB,CAAA,GAAI,CAAA,IAAK,UAAA,GAAa,IAAI,CAAA,CAAA,GAAK,CAAA;AAE/E,IAAA,IAAI,cAAA,GAAiB,cAAA,GAAiB,cAAA,CAAe,MAAA,GAAS,CAAA;AAG9D,IAAA,IAAI,UAAA,GAAa,kBAAA,GAAqB,kBAAA,GAAqB,cAAA,GAAiB,SAAQ,UAAA,EAAY;AAC9F,MAAA,cAAA,GAAiB,QAAA,CAAQ,UAAA,GAAa,UAAA,GAAa,kBAAA,GAAqB,kBAAA;AAExE,MAAA,IAAI,cAAA,GAAiB,GAAG,cAAA,GAAiB,CAAA;AAAA,IAC3C;AAEA,IAAA,MAAM,SAAS,IAAI,WAAA,CAAY,UAAA,GAAa,kBAAA,GAAqB,qBAAqB,cAAc,CAAA;AACpG,IAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,MAAM,CAAA;AAChC,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,MAAM,CAAA;AAIpC,IAAA,IAAI,WAAW,IAAA,CAAK,gBAAA;AAGpB,IAAA,IAAI,qBAAqB,CAAA,EAAG;AAC1B,MAAA,QAAA,IAAY,UAAA;AAEZ,MAAA,IAAA,CAAK,IAAA,CAAK,wBAAA,GAA2B,CAAA,MAAO,CAAA,EAAG;AAC7C,QAAA,QAAA,IAAY,UAAA;AAAA,MACd;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,QAAA,EAAU,IAAI,CAAA;AAIhC,IAAA,IAAI,MAAM,IAAA,CAAK,gBAAA;AACf,IAAA,IAAA,CAAK,IAAA,CAAK,wBAAA,GAA2B,CAAA,MAAO,CAAA,EAAG;AAC7C,MAAA,GAAA,IAAO,UAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,GAAA,EAAK,IAAI,CAAA;AAE3B,IAAA,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,IAAA,CAAK,KAAA,EAAO,IAAI,CAAA;AAGlC,IAAA,IAAI,MAAA,GAAS,UAAA;AACb,IAAA,IAAI,qBAAqB,CAAA,EAAG;AAG1B,MAAA,IAAI,WAAA,GAAc,kBAAA;AAClB,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,WAAA,IAAe,KAAA;AAAA,MACjB;AAEA,MAAA,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,WAAA,EAAa,IAAI,CAAA;AACxC,MAAA,MAAA,IAAU,CAAA;AAEV,MAAA,IAAI,UAAA,EAAY;AAEd,QAAA,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,aAAA,EAAe,IAAI,CAAA;AAC1C,QAAA,MAAA,IAAU,CAAA;AACV,QAAA,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,CAAK,cAAA,EAAgB,IAAI,CAAA;AAChD,QAAA,MAAA,IAAU,CAAA;AAAA,MACZ;AAGA,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAU;AACtD,MAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,QAAA,CAAS,aAAA,EAAe,gBAAgB,kBAAkB,CAAA;AAC/F,MAAA,MAAA,CAAO,GAAA,CAAI,eAAe,MAAM,CAAA;AAChC,MAAA,MAAA,IAAU,kBAAA;AAAA,IACZ;AAGA,IAAA,IAAI,cAAA,IAAkB,iBAAiB,CAAA,EAAG;AACxC,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA;AACpD,MAAA,MAAA,CAAO,GAAA,CAAI,OAAO,MAAM,CAAA;AAAA,IAC1B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,MAAA,EAAuC;AAC7C,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,GAAA,EAAI;AAE7B,IAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,MAAA,CAAO,QAAQ,MAAA,CAAO,UAAA,EAAY,OAAO,UAAU,CAAA;AAC7E,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,IAAI,CAAA;AAGvC,IAAA,IAAI,aAAa,UAAA,EAAY;AACzB,MAAA,OAAO,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,IAC5B;AAEA,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,QAAA,CAAQ,aAAA,EAAe;AACvC,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,IAAI,CAAA;AAClC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,IAAI,CAAA;AAEpC,IAAA,IAAI,IAAA,CAAK,UAAU,KAAA,EAAO;AACxB,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,cAAA,GAAiB,QAAA,GAAW,UAAe;AAGjD,IAAA,IAAA,CAAM,cAAA,GAAiB,IAAA,CAAK,gBAAA,GAAoB,CAAA,KAAM,CAAA,EAAG;AACvD,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAA,CAAK,gBAAA,GAAmB,cAAA;AAGxB,IAAA,MAAM,SAAA,GAAY,MAAM,UAAC;AACzB,IAAA,MAAM,WAAA,GAAA,CAAe,MAAM,UAAA,MAAgB,CAAA;AAE3C,IAAA,IAAI,SAAA,GAAY,KAAK,oBAAA,EAAsB;AACzC,MAAA,IAAA,CAAK,oBAAA,GAAuB,SAAA;AAAA,IAC9B;AAIA,IAAA,IAAI,IAAA,CAAK,iBAAiB,CAAA,EAAG;AAC1B,MAAA,MAAM,cAAA,GAAiB,cAAc,CAAA,GAAI,CAAA;AACzC,MAAA,MAAM,kBAAA,GAAqB,KAAK,wBAAA,GAA2B,CAAA;AAE3D,MAAA,IAAI,mBAAmB,kBAAA,EAAoB;AAEzC,QAAA,IAAA,CAAK,cAAA,GAAiB,CAAA;AACtB,QAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,QAAA,IAAA,CAAK,wBAAA,IAA4B,CAAA;AACjC,QAAA,IAAA,CAAK,kBAAA,GAAqB,CAAA;AAAA,MAC5B;AAAA,IACH;AAGA,IAAA,MAAM,eAAA,GAAA,CAAmB,WAAW,UAAA,MAAgB,CAAA;AACpD,IAAA,MAAM,cAAA,GAAA,CAAkB,QAAA,GAAW,UAAA,MAAgB,CAAA,GAAI,CAAA,GAAI,CAAA;AAE3D,IAAA,IAAI,gBAAgB,QAAA,CAAQ,aAAA;AAC5B,IAAA,IAAI,YAAA,GAAkC,IAAA;AAEtC,IAAA,IAAI,eAAA,EAAiB;AAClB,MAAA,IAAI,aAAA,GAAgB,CAAA,GAAI,MAAA,CAAO,UAAA,EAAY,OAAO,IAAA;AAElD,MAAA,IAAI,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,aAAA,EAAe,IAAI,CAAA;AACpD,MAAA,aAAA,IAAiB,CAAA;AAEjB,MAAA,MAAM,UAAA,GAAA,CAAc,cAAc,KAAA,MAAY,CAAA;AAC9C,MAAA,WAAA,IAAe,KAAA;AAGf,MAAA,MAAM,WAAA,GAAc,KAAK,wBAAA,GAA2B,CAAA;AAEpD,MAAA,IAAI,mBAAmB,WAAA,EAAa;AAGjC,QAAA,IAAI,UAAA,EAAY;AAEb,UAAA,IAAI,aAAA,GAAgB,CAAA,GAAI,MAAA,CAAO,UAAA,EAAY,OAAO,IAAA;AAClD,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,aAAA,EAAe,IAAI,CAAA;AACpD,UAAA,aAAA,IAAiB,CAAA;AACjB,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,aAAA,EAAe,IAAI,CAAA;AACpD,UAAA,aAAA,IAAiB,CAAA;AAGjB,UAAA,IAAI,SAAA,GAAY,SAAQ,mBAAA,EAAqB;AAC3C,YAAA,OAAA,CAAQ,KAAK,CAAA,yCAAA,EAA4C,SAAS,CAAA,GAAA,EAAM,QAAA,CAAQ,mBAAmB,CAAA,CAAE,CAAA;AACrG,YAAA,OAAO,IAAA;AAAA,UACT;AAGA,UAAA,IAAI,CAAC,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,cAAA,CAAe,WAAW,SAAA,EAAW;AACnE,YAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,UAAA,CAAW,SAAS,CAAA;AAC9C,YAAA,IAAA,CAAK,cAAA,GAAiB,SAAA;AACtB,YAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AAAA,UAC3B;AAGA,UAAA,IAAI,aAAA,GAAgB,WAAA,GAAc,MAAA,CAAO,UAAA,EAAY,OAAO,IAAA;AAC5D,UAAA,MAAM,IAAA,GAAO,MAAA,CAAO,QAAA,CAAS,aAAA,EAAe,gBAAgB,WAAW,CAAA;AAUvE,UAAA,IAAI,SAAA,KAAc,IAAA,CAAK,gBAAA,IAAoB,SAAA,GAAY,eAAe,SAAA,EAAW;AAC/E,YAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,IAAA,EAAM,SAAS,CAAA;AACvC,YAAA,IAAA,CAAK,gBAAA,IAAoB,WAAA;AAGzB,YAAA,IAAI,IAAA,CAAK,oBAAoB,SAAA,EAAW;AACtC,cAAA,YAAA,GAAe,IAAA,CAAK,cAAA;AACpB,cAAA,IAAA,CAAK,wBAAA,EAAA;AACL,cAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,cAAA,IAAA,CAAK,cAAA,GAAiB,CAAA;AACtB,cAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AAAA,YAC1B;AAAA,UACF;AAAA,QAEH,CAAA,MAAO;AAEJ,UAAA,IAAA,CAAK,wBAAA,EAAA;AACL,UAAA,IAAI,aAAA,GAAgB,WAAA,GAAc,MAAA,CAAO,UAAA,EAAY,OAAO,IAAA;AAC5D,UAAA,YAAA,GAAe,MAAA,CAAO,KAAA,CAAM,aAAA,EAAe,aAAA,GAAgB,WAAW,CAAA;AAAA,QACzE;AAAA,MACH;AAGA,MAAA,aAAA,IAAiB,WAAA;AAAA,IACpB;AAGA,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,KAAA,CAAM,aAAa,CAAA;AAGjD,IAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AACzC,MAAA,MAAM,QAAA,GAAW,YAAA,CAAa,MAAA,GAAS,cAAA,CAAe,MAAA;AACtD,MAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,QAAQ,CAAA;AACtC,MAAA,MAAA,CAAO,GAAA,CAAI,cAAc,CAAC,CAAA;AAC1B,MAAA,MAAA,CAAO,GAAA,CAAI,cAAA,EAAgB,YAAA,CAAa,MAAM,CAAA;AAC9C,MAAA,OAAO,MAAA;AAAA,IACX;AAEA,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,OAAO,cAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAI,WAAW,CAAC,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAA2B;AACzB,IAAA,OAAO,KAAK,cAAA,KAAmB,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,KAAA,EAAqB;AACrC,IAAA,IAAI,IAAA,CAAK,cAAA,GAAiB,CAAA,GAAI,QAAA,CAAQ,mBAAA,EAAqB;AACzD,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACpD;AACA,IAAA,IAAA,CAAK,eAAA,CAAgB,UAAU,KAAK,CAAA;AACpC,IAAA,IAAA,CAAK,cAAA,EAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,KAAA,EAAqB;AACtC,IAAA,IAAI,IAAA,CAAK,cAAA,GAAiB,CAAA,GAAI,QAAA,CAAQ,mBAAA,EAAqB;AACzD,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACpD;AACA,IAAA,IAAA,CAAK,eAAA,CAAgB,WAAW,KAAK,CAAA;AACrC,IAAA,IAAA,CAAK,cAAA,IAAkB,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,KAAA,EAAqB;AACrC,IAAA,IAAI,IAAA,CAAK,cAAA,GAAiB,CAAA,GAAI,QAAA,CAAQ,mBAAA,EAAqB;AACzD,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACpD;AACA,IAAA,IAAA,CAAK,eAAA,CAAgB,UAAU,KAAK,CAAA;AACpC,IAAA,IAAA,CAAK,cAAA,IAAkB,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,KAAA,EAAqB;AACvC,IAAA,MAAM,GAAA,GAAM,MAAM,MAAA,GAAS,CAAA;AAC3B,IAAA,IAAI,IAAA,CAAK,cAAA,GAAiB,GAAA,GAAM,QAAA,CAAQ,mBAAA,EAAqB;AAC3D,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACpD;AACA,IAAA,IAAA,CAAK,eAAA,CAAgB,YAAY,KAAK,CAAA;AACtC,IAAA,IAAA,CAAK,cAAA,IAAkB,GAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAA8B;AAC5B,IAAA,IAAI,IAAA,CAAK,mBAAmB,CAAA,EAAG;AAC7B,MAAA,OAAO,IAAI,WAAW,CAAC,CAAA;AAAA,IACzB;AACA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAU;AAC9C,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,IAAA,CAAK,cAAc,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,WAAA,EAA8B;AAC3C,IAAA,OAAQ,WAAA,GAAc,KAAK,QAAA,GAAY,GAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,WAAA,EAAqB,SAAA,GAAoB,GAAA,EAAgB;AAClE,IAAA,OAAQ,WAAA,GAAc,KAAK,YAAA,GAAgB,SAAA;AAAA,EAC7C;AACF,CAAA;AAAA;AA7bE,aAAA,CAFW,UAEK,YAAA,EAAa,IAAA,CAAA;AAC7B,aAAA,CAHW,UAGK,eAAA,EAAgB,IAAA,CAAA;AAChC,aAAA,CAJW,UAIK,eAAA,EAAgB,EAAA,CAAA;AAAA;AAChC,aAAA,CALW,QAAA,EAKK,iBAAA,EAAkB,QAAA,CAAQ,aAAA,GAAgB,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAK1D,aAAA,CAVW,UAUK,qBAAA,EAAsB,MAAA,CAAA;AAVjC,IAAM,OAAA,GAAN;;;ACRA,IAAK,QAAA,qBAAAE,SAAAA,KAAL;AACL,EAAAA,UAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,UAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,UAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,UAAA,YAAA,CAAA,GAAa,YAAA;AACb,EAAAA,UAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,UAAA,aAAA,CAAA,GAAc,UAAA;AACd,EAAAA,UAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,UAAA,gBAAA,CAAA,GAAiB,gBAAA;AACjB,EAAAA,UAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,UAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,UAAA,QAAA,CAAA,GAAS,QAAA;AAET,EAAAA,UAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,UAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,UAAA,UAAA,CAAA,GAAW,WAAA;AACX,EAAAA,UAAA,cAAA,CAAA,GAAe,eAAA;AACf,EAAAA,UAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,UAAA,YAAA,CAAA,GAAa,YAAA;AACb,EAAAA,UAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,UAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,UAAA,MAAA,CAAA,GAAO,MAAA;AArBG,EAAA,OAAAA,SAAAA;AAAA,CAAA,EAAA,QAAA,IAAA,EAAA;;;ACAL,IAAK,QAAA,qBAAAC,SAAAA,KAAL;AACL,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,aAAU,CAAA,CAAA,GAAV,SAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,UAAA,CAAA,GAAA,CAAA,CAAA,GAAA,UAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AAEA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,UAAA,CAAA,GAAA,CAAA,CAAA,GAAA,UAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA;AAGA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,YAAA,CAAA,GAAA,CAAA,CAAA,GAAA,YAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,WAAA,CAAA,GAAA,EAAA,CAAA,GAAA,WAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,MAAA,CAAA,GAAA,EAAA,CAAA,GAAA,MAAA;AAGA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,MAAA,CAAA,GAAA,EAAA,CAAA,GAAA,MAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,QAAA,CAAA,GAAA,EAAA,CAAA,GAAA,QAAA;AAnBU,EAAA,OAAAA,SAAAA;AAAA,CAAA,EAAA,QAAA,IAAA,EAAA;AAsBL,IAAM,eAAA,GAAkB,MAAA,CAAO,IAAA,CAAK,QAAQ,EAAE,MAAA,GAAS;AAMvD,IAAK,UAAA,qBAAAC,WAAAA,KAAL;AACL,EAAAA,YAAA,QAAA,CAAA,GAAS,aAAA;AACT,EAAAA,YAAA,SAAA,CAAA,GAAU,cAAA;AACV,EAAAA,YAAA,SAAA,CAAA,GAAU,cAAA;AACV,EAAAA,YAAA,UAAA,CAAA,GAAW,eAAA;AACX,EAAAA,YAAA,OAAA,CAAA,GAAQ,YAAA;AACR,EAAAA,YAAA,OAAA,CAAA,GAAQ,YAAA;AACR,EAAAA,YAAA,UAAA,CAAA,GAAW,cAAA;AACX,EAAAA,YAAA,YAAA,CAAA,GAAa,iBAAA;AACb,EAAAA,YAAA,WAAA,CAAA,GAAY,gBAAA;AACZ,EAAAA,YAAA,OAAA,CAAA,GAAQ,YAAA;AACR,EAAAA,YAAA,MAAA,CAAA,GAAO,WAAA;AACP,EAAAA,YAAA,MAAA,CAAA,GAAO,WAAA;AAZG,EAAA,OAAAA,WAAAA;AAAA,CAAA,EAAA,UAAA,IAAA,EAAA;;;AC5BL,IAAM,kBAAA,GAAiC;AAAA,EAAA,SAAA;AAAA,EAAA,SAAA;AAAA,EAAA,cAAA;AAAA,EAAA,YAAA;AAAA,EAAA,UAAA;AAAA,EAAA,iBAAA;AAAA,EAAA,gBAAA;AAAA,EAAA,UAAA;AAAA,EAAA,cAAA;AAAA,EAAA,SAAA;AAAA,EAAA,QAAA;AAY9C;AAIO,IAAM,eAAA,GAAqD;AAAA,EAC9D,2BAAoB,IAAA;AAAA,EACpB,CAAA,SAAA,iBAAiB,CAAA;AAAA,EACjB,CAAA,cAAA,sBAAsB,CAAA;AAAA,EACtB,CAAA,YAAA,oBAAoB,CAAA;AAAA,EACpB,CAAA,UAAA,kBAAkB,CAAA;AAAA,EAClB,CAAA,UAAA,qBAAqB,CAAA;AAAA,EACrB,CAAA,iBAAA,yBAAyB,CAAA;AAAA,EACzB,CAAA,gBAAA,wBAAwB,CAAA;AAAA,EACxB,CAAA,cAAA,sBAAsB,CAAA;AAAA,EACtB,CAAA,SAAA,iBAAiB,CAAA;AAAA,EACjB,CAAA,QAAA,gBAAgB,CAAA;AAAA;AAAA,EAGhB,2BAAoB,IAAA;AAAA,EACpB,+BAAsB,IAAA;AAAA,EACtB,CAAA,WAAA,kBAAkB,CAAA;AAAA,EAClB,CAAA,eAAA,sBAAsB,EAAA;AAAA,EACtB,CAAA,WAAA,mBAAmB,CAAA;AAAA,EACnB,CAAA,YAAA,oBAAoB,CAAA;AAAA,EACpB,CAAA,SAAA,iBAAiB,CAAA;AAAA,EACjB,CAAA,WAAA,mBAAmB,EAAA;AAAA,EACnB,CAAA,MAAA,cAAc,CAAA;AAClB;;;AC5CO,IAAM,kBAAA,GAAqB;AAG3B,IAAK,YAAA,qBAAAC,aAAAA,KAAL;AACL,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,YAAS,CAAA,CAAA,GAAT,QAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,SAAM,CAAA,CAAA,GAAN,KAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,cAAW,CAAA,CAAA,GAAX,UAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AAEA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,cAAW,CAAA,CAAA,GAAX,UAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,cAAW,EAAA,CAAA,GAAX,UAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,cAAW,EAAA,CAAA,GAAX,UAAA;AAZU,EAAA,OAAAA,aAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA;AAeL,IAAM,cAAA,GAAiB;AACvB,IAAM,SAAA,GAAY;AAClB,IAAM,SAAA,GAAY;AAClB,IAAM,SAAA,GAAY;AAClB,IAAM,WAAA,GAAc;AAEpB,IAAM,gBAAA,GAAmB;AACzB,IAAM,oBAAA,GAAuB;AAE7B,SAAS,gCAAgC,WAAA,EAA6B;AAC3E,EAAA,OAAO,WAAA,GAAc,IAAA;AACvB;AAEO,SAAS,4BAA4B,WAAA,EAA6B;AACvE,EAAA,MAAM,QAAA,GAAW,gCAAgC,WAAW,CAAA;AAC5D,EAAA,OAAO,QAAA,IAAY,CAAA,GAAI,MAAA,CAAO,iBAAA,GAAoB,mBAAmB,CAAA,GAAI,QAAA;AAC3E;;;AC1BO,IAAM,aAAA,GAA8C;AAAA,EACzD,CAAA,aAAA,gBAAkB,CAAA;AAAA,EAClB,CAAA,cAAA,iBAAmB,CAAA;AAAA,EACnB,CAAA,cAAA,iBAAmB,CAAA;AAAA,EACnB,CAAA,eAAA,kBAAoB,CAAA;AAAA,EACpB,CAAA,YAAA,eAAiB,CAAA;AAAA,EACjB,CAAA,YAAA,eAAiB,CAAA;AAAA,EACjB,CAAA,cAAA,kBAAoB,CAAA;AAAA,EACpB,CAAA,iBAAA,oBAAsB,CAAA;AAAA,EACtB,CAAA,gBAAA,mBAAqB,EAAA;AAAA,EACrB,CAAA,YAAA,eAAiB,CAAA;AAAA,EACjB,CAAA,WAAA,cAAgB,CAAA;AAAA,EAChB,CAAA,WAAA,cAAgB,EAAA;AAClB;AAQO,SAAS,YAAA,CAAa,aAA0B,IAAA,EAAqC;AAC1F,EAAA,IAAI,QAAA;AAGJ,EAAA,IAAI,OAAO,MAAA,CAAO,UAAU,CAAA,CAAE,QAAA,CAAS,IAAkB,CAAA,EAAG;AAC1D,IAAA,QAAA,GAAW,cAAc,IAAkB,CAAA;AAAA,EAC7C,WAES,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA,CAAE,QAAA,CAAS,IAAgB,CAAA,EAAG;AAC3D,IAAA,QAAA,GAAW,gBAAgB,IAAgB,CAAA;AAG3C,IAAA,IAAI,aAAa,IAAA,EAAM;AACnB,MAAA,OAAO,EAAA;AAAA,IACX;AAAA,EACF;AAEA,EAAA,IAAI,QAAA,KAAa,MAAA,IAAa,QAAA,KAAa,IAAA,EAAM;AAC/C,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,OAAO,aAAA,CAAc,WAAA,CAAY,KAAA,EAAO,QAAQ,CAAA;AAClD;AASO,SAAS,WAAA,CACd,SAAA,EACA,WAAA,EACA,aAAA,EACoB;AACpB,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,KAAA,CAAM,SAAS,CAAA;AAG7C,EAAA,IAAI,SAAA,KAAc,MAAA,IAAa,SAAA,IAAa,CAAA,EAAG;AAC7C,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,MAAM,WAAA,GAAc,kBAAkB,MAAA,GAAS,SAAA;AAE/C,EAAA,IAAI,WAAA,GAAc,CAAA,IAAK,WAAA,IAAe,aAAA,CAAc,MAAA,EAAQ;AAC1D,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,cAAc,WAAW,CAAA;AAClC;;;AC5EO,IAAM,aAAa,CAAC,GAAA,EAAW,IAAA,EAAY,IAAA,EAAY,SAAe,OAAA,KAA2B;AACtG,EAAA,OACE,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,QAAQ,CAAA,IACzB,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,IAAI,OAAA,CAAQ,CAAA,IACzB,GAAA,CAAI,CAAA,GAAI,KAAK,CAAA,GAAI,OAAA,CAAQ,CAAA,IACzB,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,OAAA,CAAQ,KACzB,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,QAAQ,CAAA,IACzB,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,IAAI,OAAA,CAAQ,CAAA;AAE7B;AAEO,IAAM,UAAA,GAA2B,CAAC,KAAA,EAAa,GAAA,EAAW,MAAa,IAAA,KAAkC;AAE9G,EAAA,MAAM,OAAA,GAAU,QAAQ,EAAkB,GAAG,GAAA,EAAI;AACjD,EAAA,MAAM,OAAA,GAAU,QAAQ,EAAE,CAAA,EAAG,EAAiB,CAAA;AAG9C,EAAA,MAAM,WAAA,GAAc,CAAA;AACpB,EAAA,MAAM,YAAA,GAAe,CAAA;AAErB,EAAA,MAAM,eAAe,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AACjD,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,CAAA,GAAI,KAAA,CAAM,CAAA;AAGnC,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,CAAA,GAAI,OAAA,CAAQ,CAAA;AAChC,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,CAAA,GAAI,OAAA,CAAQ,CAAA;AACpC,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,CAAA,GAAI,OAAA,CAAQ,CAAA;AAIhC,EAAA,IAAI,YAAA,IAAgB,GAAA,CAAI,CAAA,GAAI,WAAA,IAAe,UAAU,YAAA,EAAc;AAEjE,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,CAAA,GAAI,OAAA,CAAQ,CAAA;AACpC,IAAA,IAAI,aAAa,YAAA,EAAc;AAE7B,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,KAAA;AAAA,QACV,UAAA,EAAY,KAAA;AAAA,QACZ,QAAA,EAAU,CAAA;AAAA,QACV,MAAA,EAAQ,KAAA;AAAA,QACR,aAAa,EAAE,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,QACjC,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,YAAA,IAAgB,GAAA,CAAI,CAAA,IAAK,YAAA,EAAc;AAIzC,IAAc,cAAc,OAAA,CAAQ;AAIpC,IAAA,IAAI,SAAA,GAAY,WAAA,IAAe,OAAA,GAAU,WAAA,EAAa;AAIpD,MAAA,MAAM,QAAA,GAAA,CAAY,WAAA,GAAc,SAAA,KAAc,OAAA,GAAU,SAAA,CAAA;AAGxD,MAAA,MAAM,eAAA,GAAkB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AAGzD,MAAA,MAAM,SAAS,KAAA,CAAM,CAAA,GAAI,eAAA,IAAmB,GAAA,CAAI,IAAI,KAAA,CAAM,CAAA,CAAA;AAC1D,MAAA,MAAM,SAAS,KAAA,CAAM,CAAA,GAAI,eAAA,IAAmB,GAAA,CAAI,IAAI,KAAA,CAAM,CAAA,CAAA;AAC1D,MAAA,MAAM,SAAS,KAAA,CAAM,CAAA,GAAI,eAAA,IAAmB,GAAA,CAAI,IAAI,KAAA,CAAM,CAAA,CAAA;AAE1D,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,KAAA;AAAA,QACV,UAAA,EAAY,KAAA;AAAA,QACZ,QAAA,EAAU,eAAA;AAAA,QACV,QAAQ,EAAE,CAAA,EAAG,QAAQ,CAAA,EAAG,MAAA,EAAQ,GAAG,MAAA,EAAO;AAAA,QAC1C,aAAa,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,QAChC,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,YAAA,IAAgB,UAAU,CAAA,EAAG;AAE/B,IAAc,CAAC,OAAA,CAAQ;AAGvB,IAAA,IAAI,aAAa,CAAA,EAAG;AAElB,MAAA,MAAM,QAAA,GAAA,CAAY,CAAA,GAAI,SAAA,KAAc,OAAA,GAAU,SAAA,CAAA;AAC9C,MAAA,MAAM,eAAA,GAAkB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AAEzD,MAAA,MAAM,SAAS,KAAA,CAAM,CAAA,GAAI,eAAA,IAAmB,GAAA,CAAI,IAAI,KAAA,CAAM,CAAA,CAAA;AAC1D,MAAA,MAAM,SAAS,KAAA,CAAM,CAAA,GAAI,eAAA,IAAmB,GAAA,CAAI,IAAI,KAAA,CAAM,CAAA,CAAA;AAC1D,MAAA,MAAM,SAAS,KAAA,CAAM,CAAA,GAAI,eAAA,IAAmB,GAAA,CAAI,IAAI,KAAA,CAAM,CAAA,CAAA;AAE1D,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,KAAA;AAAA,QACV,UAAA,EAAY,KAAA;AAAA,QACZ,QAAA,EAAU,eAAA;AAAA,QACV,QAAQ,EAAE,CAAA,EAAG,QAAQ,CAAA,EAAG,MAAA,EAAQ,GAAG,MAAA,EAAO;AAAA,QAC1C,aAAa,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,QAChC,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AAGA,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,KAAA;AAAA,MACV,UAAA,EAAY,KAAA;AAAA,MACZ,QAAA,EAAU,CAAA;AAAA,MACV,MAAA,EAAQ,KAAA;AAAA,MACR,aAAa,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAChC,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,KAAA;AAAA,IACV,UAAA,EAAY,KAAA;AAAA,IACZ,QAAA,EAAU,CAAA;AAAA,IACV,MAAA,EAAQ,GAAA;AAAA,IACR,QAAA,EAAU;AAAA,GACZ;AACF;AAEO,IAAM,WAAA,GAA4B,CAAC,KAAA,EAAa,GAAA,EAAW,MAAa,IAAA,KAAkC;AAE/G,EAAA,MAAM,OAAA,GAAU,QAAQ,EAAE,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAI;AACjD,EAAA,MAAM,OAAA,GAAU,QAAQ,EAAE,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAG9C,EAAA,MAAM,YAAA,GAAe,CAAA;AACrB,EAAA,MAAM,YAAA,GAAe,CAAA;AACrB,EAAA,MAAM,YAAA,GAAe,GAAA;AACrB,EAAA,MAAM,YAAA,GAAe,EAAA;AACrB,EAAA,MAAM,YAAA,GAAe,CAAA;AACrB,EAAA,MAAM,YAAA,GAAe,GAAA;AAGrB,EAAA,MAAM,WAAA,GACJ,GAAA,CAAI,CAAA,GAAI,OAAA,CAAQ,CAAA,GAAI,YAAA,IACpB,GAAA,CAAI,CAAA,GAAI,OAAA,CAAQ,CAAA,GAAI,YAAA,IACpB,GAAA,CAAI,CAAA,GAAI,OAAA,CAAQ,CAAA,GAAI,YAAA,IACpB,GAAA,CAAI,CAAA,GAAI,OAAA,CAAQ,CAAA,GAAI,YAAA,IACpB,GAAA,CAAI,CAAA,GAAI,OAAA,CAAQ,CAAA,GAAI,YAAA,IACpB,GAAA,CAAI,CAAA,GAAI,QAAQ,CAAA,GAAI,YAAA;AAGtB,EAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,CAAA,GAAI,YAAA,IAAgB,IAAI,CAAA,IAAK,YAAA;AAG5D,EAAA,IAAI,gBAAA,IAAoB,KAAK,GAAA,CAAI,GAAA,CAAI,IAAI,KAAA,CAAM,CAAC,IAAI,GAAA,EAAK;AACvD,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,KAAA;AAAA,MACV,UAAA,EAAY,KAAA;AAAA,MACZ,QAAA,EAAU,CAAA;AAAA,MACV,MAAA,EAAQ,KAAA;AAAA,MACR,aAAa,EAAE,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACjC,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAIA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,KAAA;AAAA,MACV,UAAA,EAAY,KAAA;AAAA,MACZ,QAAA,EAAU,CAAA;AAAA,MACV,MAAA,EAAQ,GAAA;AAAA,MACR,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,CAAI,CAAA,GAAI,OAAA,CAAQ,CAAA,IAAK,CAAA,EAAG;AAC1B,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,KAAA;AAAA,MACV,UAAA,EAAY,KAAA;AAAA,MACZ,QAAA,EAAU,CAAA;AAAA,MACV,MAAA,EAAQ,KAAA;AAAA,MACR,aAAa,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAChC,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,KAAA;AAAA,IACV,UAAA,EAAY,KAAA;AAAA,IACZ,QAAA,EAAU,CAAA;AAAA,IACV,MAAA,EAAQ,GAAA;AAAA,IACR,QAAA,EAAU;AAAA,GACZ;AACF","file":"index.cjs","sourcesContent":["export interface Vec3 {\n  readonly x: number;\n  readonly y: number;\n  readonly z: number;\n  readonly [index: number]: number;\n}\n\nexport const ZERO_VEC3: Vec3 = { x: 0, y: 0, z: 0 };\n\n// Matches STOP_EPSILON from rerelease q_vec3.h\nexport const STOP_EPSILON = 0.1;\n\nconst DEG_TO_RAD = Math.PI / 180;\n\nexport interface Bounds3 {\n  readonly mins: Vec3;\n  readonly maxs: Vec3;\n}\n\nexport type Mat3Row = readonly [number, number, number];\nexport type Mat3 = readonly [Mat3Row, Mat3Row, Mat3Row];\n\nexport function copyVec3(a: Vec3): Vec3 {\n  return { x: a.x, y: a.y, z: a.z };\n}\n\nexport function addVec3(a: Vec3, b: Vec3): Vec3 {\n  return { x: a.x + b.x, y: a.y + b.y, z: a.z + b.z };\n}\n\nexport function subtractVec3(a: Vec3, b: Vec3): Vec3 {\n  return { x: a.x - b.x, y: a.y - b.y, z: a.z - b.z };\n}\n\nexport function multiplyVec3(a: Vec3, b: Vec3): Vec3 {\n  return { x: a.x * b.x, y: a.y * b.y, z: a.z * b.z };\n}\n\nexport function scaleVec3(a: Vec3, scalar: number): Vec3 {\n  return { x: a.x * scalar, y: a.y * scalar, z: a.z * scalar };\n}\n\nexport function negateVec3(a: Vec3): Vec3 {\n  return scaleVec3(a, -1);\n}\n\nexport function dotVec3(a: Vec3, b: Vec3): number {\n  return a.x * b.x + a.y * b.y + a.z * b.z;\n}\n\nexport function crossVec3(a: Vec3, b: Vec3): Vec3 {\n  return {\n    x: a.y * b.z - a.z * b.y,\n    y: a.z * b.x - a.x * b.z,\n    z: a.x * b.y - a.y * b.x,\n  };\n}\n\nexport function lengthSquaredVec3(a: Vec3): number {\n  return dotVec3(a, a);\n}\n\nexport function lengthVec3(a: Vec3): number {\n  return Math.sqrt(lengthSquaredVec3(a));\n}\n\nexport function distance(a: Vec3, b: Vec3): number {\n  return lengthVec3(subtractVec3(a, b));\n}\n\nexport function vec3Equals(a: Vec3, b: Vec3): boolean {\n  return a.x === b.x && a.y === b.y && a.z === b.z;\n}\n\n/**\n * Returns the normalized vector. If the vector is zero-length, the\n * input is returned to mirror the rerelease q_vec3 semantics.\n */\nexport function normalizeVec3(a: Vec3): Vec3 {\n  const len = lengthVec3(a);\n  return len === 0 ? a : scaleVec3(a, 1 / len);\n}\n\n/**\n * Projects a point onto a plane defined by the given normal.\n * Based on ProjectPointOnPlane in the rerelease q_vec3 helpers.\n */\nexport function projectPointOnPlane(point: Vec3, normal: Vec3): Vec3 {\n  const invDenom = 1 / dotVec3(normal, normal);\n  const d = dotVec3(normal, point) * invDenom;\n  return subtractVec3(point, scaleVec3(normal, invDenom * d));\n}\n\n/**\n * Computes a perpendicular vector to the provided direction using the\n * smallest axial component heuristic used by the rerelease.\n * Assumes the input is normalized.\n */\nexport function perpendicularVec3(src: Vec3): Vec3 {\n  let pos = 0;\n  let minElement = Math.abs(src.x);\n\n  if (Math.abs(src.y) < minElement) {\n    pos = 1;\n    minElement = Math.abs(src.y);\n  }\n\n  if (Math.abs(src.z) < minElement) {\n    pos = 2;\n  }\n\n  const axis = pos === 0 ? { x: 1, y: 0, z: 0 } : pos === 1 ? { x: 0, y: 1, z: 0 } : { x: 0, y: 0, z: 1 };\n  return normalizeVec3(projectPointOnPlane(axis, src));\n}\n\nexport function closestPointToBox(point: Vec3, mins: Vec3, maxs: Vec3): Vec3 {\n  return {\n    x: point.x < mins.x ? mins.x : point.x > maxs.x ? maxs.x : point.x,\n    y: point.y < mins.y ? mins.y : point.y > maxs.y ? maxs.y : point.y,\n    z: point.z < mins.z ? mins.z : point.z > maxs.z ? maxs.z : point.z,\n  };\n}\n\nexport function distanceBetweenBoxesSquared(aMins: Vec3, aMaxs: Vec3, bMins: Vec3, bMaxs: Vec3): number {\n  let lengthSq = 0;\n\n  if (aMaxs.x < bMins.x) {\n    const d = aMaxs.x - bMins.x;\n    lengthSq += d * d;\n  } else if (aMins.x > bMaxs.x) {\n    const d = aMins.x - bMaxs.x;\n    lengthSq += d * d;\n  }\n\n  if (aMaxs.y < bMins.y) {\n    const d = aMaxs.y - bMins.y;\n    lengthSq += d * d;\n  } else if (aMins.y > bMaxs.y) {\n    const d = aMins.y - bMaxs.y;\n    lengthSq += d * d;\n  }\n\n  if (aMaxs.z < bMins.z) {\n    const d = aMaxs.z - bMins.z;\n    lengthSq += d * d;\n  } else if (aMins.z > bMaxs.z) {\n    const d = aMins.z - bMaxs.z;\n    lengthSq += d * d;\n  }\n\n  return lengthSq;\n}\n\nexport function createEmptyBounds3(): Bounds3 {\n  return {\n    mins: { x: Number.POSITIVE_INFINITY, y: Number.POSITIVE_INFINITY, z: Number.POSITIVE_INFINITY },\n    maxs: { x: Number.NEGATIVE_INFINITY, y: Number.NEGATIVE_INFINITY, z: Number.NEGATIVE_INFINITY },\n  };\n}\n\nexport function addPointToBounds(point: Vec3, bounds: Bounds3): Bounds3 {\n  return {\n    mins: {\n      x: Math.min(bounds.mins.x, point.x),\n      y: Math.min(bounds.mins.y, point.y),\n      z: Math.min(bounds.mins.z, point.z),\n    },\n    maxs: {\n      x: Math.max(bounds.maxs.x, point.x),\n      y: Math.max(bounds.maxs.y, point.y),\n      z: Math.max(bounds.maxs.z, point.z),\n    },\n  };\n}\n\nexport function boxesIntersect(a: Bounds3, b: Bounds3): boolean {\n  return (\n    a.mins.x <= b.maxs.x &&\n    a.maxs.x >= b.mins.x &&\n    a.mins.y <= b.maxs.y &&\n    a.maxs.y >= b.mins.y &&\n    a.mins.z <= b.maxs.z &&\n    a.maxs.z >= b.mins.z\n  );\n}\n\n/**\n * Mirrors PM_ClipVelocity from `rerelease/p_move.cpp`: slide the incoming velocity off\n * a plane normal, applying an overbounce scale and zeroing tiny components so callers can\n * detect blocked axes using STOP_EPSILON.\n */\nexport function clipVelocityVec3(inVel: Vec3, normal: Vec3, overbounce: number): Vec3 {\n  const backoff = dotVec3(inVel, normal) * overbounce;\n\n  let outX = inVel.x - normal.x * backoff;\n  let outY = inVel.y - normal.y * backoff;\n  let outZ = inVel.z - normal.z * backoff;\n\n  if (outX > -STOP_EPSILON && outX < STOP_EPSILON) {\n    outX = 0;\n  }\n\n  if (outY > -STOP_EPSILON && outY < STOP_EPSILON) {\n    outY = 0;\n  }\n\n  if (outZ > -STOP_EPSILON && outZ < STOP_EPSILON) {\n    outZ = 0;\n  }\n\n  return { x: outX, y: outY, z: outZ };\n}\n\n/**\n * Slide a velocity across one or more clip planes using the same plane set resolution logic\n * seen in the inner loop of `PM_StepSlideMove_Generic` (rerelease `p_move.cpp`). When a single\n * plane is provided this devolves to PM_ClipVelocity; with two planes it projects onto the\n * crease defined by their cross product; with more planes it zeroes the velocity to avoid\n * oscillations.\n */\nexport function clipVelocityAgainstPlanes(\n  velocity: Vec3,\n  planes: readonly Vec3[],\n  overbounce: number,\n  primalVelocity?: Vec3,\n): Vec3 {\n  if (planes.length === 0) {\n    return velocity;\n  }\n\n  let working = velocity;\n\n  for (let i = 0; i < planes.length; i++) {\n    working = clipVelocityVec3(working, planes[i], overbounce);\n\n    let j = 0;\n    for (; j < planes.length; j++) {\n      if (j === i) {\n        continue;\n      }\n\n      if (dotVec3(working, planes[j]) < 0) {\n        break;\n      }\n    }\n\n    if (j === planes.length) {\n      if (primalVelocity && dotVec3(working, primalVelocity) <= 0) {\n        return ZERO_VEC3;\n      }\n\n      return working;\n    }\n  }\n\n  if (planes.length === 2) {\n    const dir = crossVec3(planes[0], planes[1]);\n    const d = dotVec3(dir, velocity);\n    const creaseVelocity = scaleVec3(dir, d);\n\n    if (primalVelocity && dotVec3(creaseVelocity, primalVelocity) <= 0) {\n      return ZERO_VEC3;\n    }\n\n    return creaseVelocity;\n  }\n\n  if (primalVelocity && dotVec3(working, primalVelocity) <= 0) {\n    return ZERO_VEC3;\n  }\n\n  return ZERO_VEC3;\n}\n\n/**\n * Alias retained for ergonomics; mirrors PM_ClipVelocity semantics.\n */\nexport function slideClipVelocityVec3(inVel: Vec3, normal: Vec3, overbounce: number): Vec3 {\n  return clipVelocityVec3(inVel, normal, overbounce);\n}\n\n/**\n * Project an offset from a point in forward/right(/up) space into world space.\n * Mirrors G_ProjectSource and G_ProjectSource2 in rerelease q_vec3.\n */\nexport function projectSourceVec3(point: Vec3, distance: Vec3, forward: Vec3, right: Vec3): Vec3 {\n  return {\n    x: point.x + forward.x * distance.x + right.x * distance.y,\n    y: point.y + forward.y * distance.x + right.y * distance.y,\n    z: point.z + forward.z * distance.x + right.z * distance.y + distance.z,\n  };\n}\n\nexport function projectSourceVec3WithUp(point: Vec3, distance: Vec3, forward: Vec3, right: Vec3, up: Vec3): Vec3 {\n  return {\n    x: point.x + forward.x * distance.x + right.x * distance.y + up.x * distance.z,\n    y: point.y + forward.y * distance.x + right.y * distance.y + up.y * distance.z,\n    z: point.z + forward.z * distance.x + right.z * distance.y + up.z * distance.z,\n  };\n}\n\n/**\n * Spherical linear interpolation between two vectors, mirroring q_vec3::slerp.\n * This is intended for direction vectors; callers should pre-normalize if needed.\n */\nexport function slerpVec3(from: Vec3, to: Vec3, t: number): Vec3 {\n  const dot = dotVec3(from, to);\n  let aFactor: number;\n  let bFactor: number;\n\n  if (Math.abs(dot) > 0.9995) {\n    aFactor = 1 - t;\n    bFactor = t;\n  } else {\n    const ang = Math.acos(dot);\n    const sinOmega = Math.sin(ang);\n    const sinAOmega = Math.sin((1 - t) * ang);\n    const sinBOmega = Math.sin(t * ang);\n    aFactor = sinAOmega / sinOmega;\n    bFactor = sinBOmega / sinOmega;\n  }\n\n  return {\n    x: from.x * aFactor + to.x * bFactor,\n    y: from.y * aFactor + to.y * bFactor,\n    z: from.z * aFactor + to.z * bFactor,\n  };\n}\n\nexport function concatRotationMatrices(a: Mat3, b: Mat3): Mat3 {\n  const row = (rowIndex: number): Mat3Row => [\n    a[rowIndex][0] * b[0][0] + a[rowIndex][1] * b[1][0] + a[rowIndex][2] * b[2][0],\n    a[rowIndex][0] * b[0][1] + a[rowIndex][1] * b[1][1] + a[rowIndex][2] * b[2][1],\n    a[rowIndex][0] * b[0][2] + a[rowIndex][1] * b[1][2] + a[rowIndex][2] * b[2][2],\n  ];\n\n  const result = [row(0), row(1), row(2)] as Mat3;\n  return result;\n}\n\nexport function rotatePointAroundVector(dir: Vec3, point: Vec3, degrees: number): Vec3 {\n  const axisLength = lengthVec3(dir);\n  if (axisLength === 0) {\n    return point;\n  }\n\n  const vf = normalizeVec3(dir);\n  const vr = perpendicularVec3(vf);\n  const vup = crossVec3(vr, vf);\n\n  const m: Mat3 = [\n    [vr.x, vup.x, vf.x],\n    [vr.y, vup.y, vf.y],\n    [vr.z, vup.z, vf.z],\n  ];\n\n  const im: Mat3 = [\n    [m[0][0], m[1][0], m[2][0]],\n    [m[0][1], m[1][1], m[2][1]],\n    [m[0][2], m[1][2], m[2][2]],\n  ];\n\n  const radians = degrees * DEG_TO_RAD;\n  const cos = Math.cos(radians);\n  const sin = Math.sin(radians);\n  const zrot: Mat3 = [\n    [cos, sin, 0],\n    [-sin, cos, 0],\n    [0, 0, 1],\n  ];\n\n  const rot = concatRotationMatrices(concatRotationMatrices(m, zrot), im);\n\n  return {\n    x: rot[0][0] * point.x + rot[0][1] * point.y + rot[0][2] * point.z,\n    y: rot[1][0] * point.x + rot[1][1] * point.y + rot[1][2] * point.z,\n    z: rot[2][0] * point.x + rot[2][1] * point.y + rot[2][2] * point.z,\n  };\n}\n","import { Vec3 } from './vec3.js';\n\nexport const PITCH = 0;\nexport const YAW = 1;\nexport const ROLL = 2;\n\nconst DEG2RAD_FACTOR = Math.PI / 180;\nconst RAD2DEG_FACTOR = 180 / Math.PI;\n\n// Export constants for direct use in matrix operations\nexport const DEG2RAD = DEG2RAD_FACTOR;\nexport const RAD2DEG = RAD2DEG_FACTOR;\n\nfunction axisComponent(vec: Vec3, axis: number): number {\n  switch (axis) {\n    case PITCH:\n      return vec.x;\n    case YAW:\n      return vec.y;\n    case ROLL:\n    default:\n      return vec.z;\n  }\n}\n\nexport interface AngleVectorsResult {\n  readonly forward: Vec3;\n  readonly right: Vec3;\n  readonly up: Vec3;\n}\n\nexport function degToRad(degrees: number): number {\n  return degrees * DEG2RAD_FACTOR;\n}\n\nexport function radToDeg(radians: number): number {\n  return radians * RAD2DEG_FACTOR;\n}\n\nexport function lerpAngle(from: number, to: number, frac: number): number {\n  let target = to;\n\n  if (target - from > 180) {\n    target -= 360;\n  } else if (target - from < -180) {\n    target += 360;\n  }\n\n  return from + frac * (target - from);\n}\n\nexport function angleMod(angle: number): number {\n  const value = angle % 360;\n  return value < 0 ? 360 + value : value;\n}\n\nexport function angleVectors(angles: Vec3): AngleVectorsResult {\n  const yaw = degToRad(axisComponent(angles, YAW));\n  const pitch = degToRad(axisComponent(angles, PITCH));\n  const roll = degToRad(axisComponent(angles, ROLL));\n\n  const sy = Math.sin(yaw);\n  const cy = Math.cos(yaw);\n  const sp = Math.sin(pitch);\n  const cp = Math.cos(pitch);\n  const sr = Math.sin(roll);\n  const cr = Math.cos(roll);\n\n  const forward: Vec3 = {\n    x: cp * cy,\n    y: cp * sy,\n    z: -sp,\n  };\n\n  const right: Vec3 = {\n    x: -sr * sp * cy - cr * -sy,\n    y: -sr * sp * sy - cr * cy,\n    z: -sr * cp,\n  };\n\n  const up: Vec3 = {\n    x: cr * sp * cy - sr * -sy,\n    y: cr * sp * sy - sr * cy,\n    z: cr * cp,\n  };\n\n  return { forward, right, up };\n}\n\nexport function vectorToYaw(vec: Vec3): number {\n  const pitch = axisComponent(vec, PITCH);\n  const yawAxis = axisComponent(vec, YAW);\n\n  if (pitch === 0) {\n    if (yawAxis === 0) {\n      return 0;\n    }\n\n    return yawAxis > 0 ? 90 : 270;\n  }\n\n  const yaw = radToDeg(Math.atan2(yawAxis, pitch));\n  return yaw < 0 ? yaw + 360 : yaw;\n}\n\nexport function vectorToAngles(vec: Vec3): Vec3 {\n  const x = vec.x;\n  const y = vec.y;\n  const z = vec.z;\n\n  if (y === 0 && x === 0) {\n    return { x: z > 0 ? -90 : -270, y: 0, z: 0 };\n  }\n\n  let yaw: number;\n  if (x) {\n    yaw = radToDeg(Math.atan2(y, x));\n  } else if (y > 0) {\n    yaw = 90;\n  } else {\n    yaw = 270;\n  }\n\n  if (yaw < 0) {\n    yaw += 360;\n  }\n\n  const forward = Math.sqrt(x * x + y * y);\n  let pitch = radToDeg(Math.atan2(z, forward));\n  if (pitch < 0) {\n    pitch += 360;\n  }\n\n  return { x: -pitch, y: yaw, z: 0 };\n}\n","// Extracted from full/client/anorms.h\nexport const ANORMS: [number, number, number][] = [\n  [-0.525731, 0.000000, 0.850651],\n  [-0.442863, 0.238856, 0.864188],\n  [-0.295242, 0.000000, 0.955423],\n  [-0.309017, 0.500000, 0.809017],\n  [-0.162460, 0.262866, 0.951056],\n  [0.000000, 0.000000, 1.000000],\n  [0.000000, 0.850651, 0.525731],\n  [-0.147621, 0.716567, 0.681718],\n  [0.147621, 0.716567, 0.681718],\n  [0.000000, 0.525731, 0.850651],\n  [0.309017, 0.500000, 0.809017],\n  [0.525731, 0.000000, 0.850651],\n  [0.295242, 0.000000, 0.955423],\n  [0.442863, 0.238856, 0.864188],\n  [0.162460, 0.262866, 0.951056],\n  [-0.681718, 0.147621, 0.716567],\n  [-0.809017, 0.309017, 0.500000],\n  [-0.587785, 0.425325, 0.688191],\n  [-0.850651, 0.525731, 0.000000],\n  [-0.864188, 0.442863, 0.238856],\n  [-0.716567, 0.681718, 0.147621],\n  [-0.688191, 0.587785, 0.425325],\n  [-0.500000, 0.809017, 0.309017],\n  [-0.238856, 0.864188, 0.442863],\n  [-0.425325, 0.688191, 0.587785],\n  [-0.716567, 0.681718, -0.147621],\n  [-0.500000, 0.809017, -0.309017],\n  [-0.525731, 0.850651, 0.000000],\n  [0.000000, 0.850651, -0.525731],\n  [-0.238856, 0.864188, -0.442863],\n  [0.000000, 0.955423, -0.295242],\n  [-0.262866, 0.951056, -0.162460],\n  [0.000000, 1.000000, 0.000000],\n  [0.000000, 0.955423, 0.295242],\n  [-0.262866, 0.951056, 0.162460],\n  [0.238856, 0.864188, 0.442863],\n  [0.262866, 0.951056, 0.162460],\n  [0.500000, 0.809017, 0.309017],\n  [0.238856, 0.864188, -0.442863],\n  [0.262866, 0.951056, -0.162460],\n  [0.500000, 0.809017, -0.309017],\n  [0.850651, 0.525731, 0.000000],\n  [0.716567, 0.681718, 0.147621],\n  [0.716567, 0.681718, -0.147621],\n  [0.525731, 0.850651, 0.000000],\n  [0.425325, 0.688191, 0.587785],\n  [0.864188, 0.442863, 0.238856],\n  [0.688191, 0.587785, 0.425325],\n  [0.809017, 0.309017, 0.500000],\n  [0.681718, 0.147621, 0.716567],\n  [0.587785, 0.425325, 0.688191],\n  [0.955423, 0.295242, 0.000000],\n  [1.000000, 0.000000, 0.000000],\n  [0.951056, 0.162460, 0.262866],\n  [0.850651, -0.525731, 0.000000],\n  [0.955423, -0.295242, 0.000000],\n  [0.864188, -0.442863, 0.238856],\n  [0.951056, -0.162460, 0.262866],\n  [0.809017, -0.309017, 0.500000],\n  [0.681718, -0.147621, 0.716567],\n  [0.850651, 0.000000, 0.525731],\n  [0.864188, 0.442863, -0.238856],\n  [0.809017, 0.309017, -0.500000],\n  [0.951056, 0.162460, -0.262866],\n  [0.525731, 0.000000, -0.850651],\n  [0.681718, 0.147621, -0.716567],\n  [0.681718, -0.147621, -0.716567],\n  [0.850651, 0.000000, -0.525731],\n  [0.809017, -0.309017, -0.500000],\n  [0.864188, -0.442863, -0.238856],\n  [0.951056, -0.162460, -0.262866],\n  [0.147621, 0.716567, -0.681718],\n  [0.309017, 0.500000, -0.809017],\n  [0.425325, 0.688191, -0.587785],\n  [0.442863, 0.238856, -0.864188],\n  [0.587785, 0.425325, -0.688191],\n  [0.688191, 0.587785, -0.425325],\n  [-0.147621, 0.716567, -0.681718],\n  [-0.309017, 0.500000, -0.809017],\n  [0.000000, 0.525731, -0.850651],\n  [-0.525731, 0.000000, -0.850651],\n  [-0.442863, 0.238856, -0.864188],\n  [-0.295242, 0.000000, -0.955423],\n  [-0.162460, 0.262866, -0.951056],\n  [0.000000, 0.000000, -1.000000],\n  [0.295242, 0.000000, -0.955423],\n  [0.162460, 0.262866, -0.951056],\n  [-0.442863, -0.238856, -0.864188],\n  [-0.309017, -0.500000, -0.809017],\n  [-0.162460, -0.262866, -0.951056],\n  [0.000000, -0.850651, -0.525731],\n  [-0.147621, -0.716567, -0.681718],\n  [0.147621, -0.716567, -0.681718],\n  [0.000000, -0.525731, -0.850651],\n  [0.309017, -0.500000, -0.809017],\n  [0.442863, -0.238856, -0.864188],\n  [0.162460, -0.262866, -0.951056],\n  [0.238856, -0.864188, -0.442863],\n  [0.500000, -0.809017, -0.309017],\n  [0.425325, -0.688191, -0.587785],\n  [0.716567, -0.681718, -0.147621],\n  [0.688191, -0.587785, -0.425325],\n  [0.587785, -0.425325, -0.688191],\n  [0.000000, -0.955423, -0.295242],\n  [0.000000, -1.000000, 0.000000],\n  [0.262866, -0.951056, -0.162460],\n  [0.000000, -0.850651, 0.525731],\n  [0.000000, -0.955423, 0.295242],\n  [0.238856, -0.864188, 0.442863],\n  [0.262866, -0.951056, 0.162460],\n  [0.500000, -0.809017, 0.309017],\n  [0.716567, -0.681718, 0.147621],\n  [0.525731, -0.850651, 0.000000],\n  [-0.238856, -0.864188, -0.442863],\n  [-0.500000, -0.809017, -0.309017],\n  [-0.262866, -0.951056, -0.162460],\n  [-0.850651, -0.525731, 0.000000],\n  [-0.716567, -0.681718, -0.147621],\n  [-0.716567, -0.681718, 0.147621],\n  [-0.525731, -0.850651, 0.000000],\n  [-0.500000, -0.809017, 0.309017],\n  [-0.238856, -0.864188, 0.442863],\n  [-0.262866, -0.951056, 0.162460],\n  [-0.864188, -0.442863, 0.238856],\n  [-0.809017, -0.309017, 0.500000],\n  [-0.688191, -0.587785, 0.425325],\n  [-0.681718, -0.147621, 0.716567],\n  [-0.442863, -0.238856, 0.864188],\n  [-0.587785, -0.425325, 0.688191],\n  [-0.309017, -0.500000, 0.809017],\n  [-0.147621, -0.716567, 0.681718],\n  [-0.425325, -0.688191, 0.587785],\n  [-0.162460, -0.262866, 0.951056],\n  [0.442863, -0.238856, 0.864188],\n  [0.162460, -0.262866, 0.951056],\n  [0.309017, -0.500000, 0.809017],\n  [0.147621, -0.716567, 0.681718],\n  [0.000000, -0.525731, 0.850651],\n  [0.425325, -0.688191, 0.587785],\n  [0.587785, -0.425325, 0.688191],\n  [0.688191, -0.587785, 0.425325],\n  [-0.955423, 0.295242, 0.000000],\n  [-0.951056, 0.162460, 0.262866],\n  [-1.000000, 0.000000, 0.000000],\n  [-0.850651, 0.000000, 0.525731],\n  [-0.955423, -0.295242, 0.000000],\n  [-0.951056, -0.162460, 0.262866],\n  [-0.864188, 0.442863, -0.238856],\n  [-0.951056, 0.162460, -0.262866],\n  [-0.809017, 0.309017, -0.500000],\n  [-0.864188, -0.442863, -0.238856],\n  [-0.951056, -0.162460, -0.262866],\n  [-0.809017, -0.309017, -0.500000],\n  [-0.681718, 0.147621, -0.716567],\n  [-0.681718, -0.147621, -0.716567],\n  [-0.850651, 0.000000, -0.525731],\n  [-0.688191, 0.587785, -0.425325],\n  [-0.587785, 0.425325, -0.688191],\n  [-0.425325, 0.688191, -0.587785],\n  [-0.425325, -0.688191, -0.587785],\n  [-0.587785, -0.425325, -0.688191],\n  [-0.688191, -0.587785, -0.425325]\n];\n","export type Color4 = [number, number, number, number];\n\n/**\n * TypeScript port of G_AddBlend from rerelease q_std.h.\n *\n * Given an incoming RGBA color and an existing blend color, computes the new\n * blended color where alpha is accumulated and RGB is mixed proportionally\n * to the previous vs. new alpha contribution.\n *\n * This function is pure and does not mutate its inputs.\n */\nexport function addBlendColor(\n  r: number,\n  g: number,\n  b: number,\n  a: number,\n  current: Color4,\n): Color4 {\n  if (a <= 0) {\n    return current;\n  }\n\n  const oldR = current[0];\n  const oldG = current[1];\n  const oldB = current[2];\n  const oldA = current[3];\n\n  const a2 = oldA + (1 - oldA) * a;\n\n  if (a2 <= 0) {\n    return [0, 0, 0, 0];\n  }\n\n  const a3 = oldA / a2;\n\n  const newR = oldR * a3 + r * (1 - a3);\n  const newG = oldG * a3 + g * (1 - a3);\n  const newB = oldB * a3 + b * (1 - a3);\n\n  return [newR, newG, newB, a2];\n}\n\n","const STATE_SIZE = 624;\nconst MIDDLE_WORD = 397;\nconst MATRIX_A = 0x9908b0df;\nconst UPPER_MASK = 0x80000000;\nconst LOWER_MASK = 0x7fffffff;\nconst TWO_POW_32 = 0x100000000;\n\nexport interface MersenneTwisterState {\n  readonly index: number;\n  readonly state: readonly number[];\n}\n\n/**\n * Minimal MT19937 implementation mirroring the rerelease's std::mt19937 usage in g_local.h.\n * The generator outputs deterministic unsigned 32-bit integers which drive the\n * higher-level helpers such as frandom/crandom/irandom.\n */\nexport class MersenneTwister19937 {\n  private state = new Uint32Array(STATE_SIZE);\n  private index = STATE_SIZE;\n\n  constructor(seed = 5489) {\n    this.seed(seed);\n  }\n\n  seed(seed: number): void {\n    this.state[0] = seed >>> 0;\n    for (let i = 1; i < STATE_SIZE; i++) {\n      const prev = this.state[i - 1] ^ (this.state[i - 1] >>> 30);\n      const next = Math.imul(prev >>> 0, 1812433253) + i;\n      this.state[i] = next >>> 0;\n    }\n    this.index = STATE_SIZE;\n  }\n\n  nextUint32(): number {\n    if (this.index >= STATE_SIZE) {\n      this.twist();\n    }\n\n    let y = this.state[this.index++];\n    y ^= y >>> 11;\n    y ^= (y << 7) & 0x9d2c5680;\n    y ^= (y << 15) & 0xefc60000;\n    y ^= y >>> 18;\n    return y >>> 0;\n  }\n\n  private twist(): void {\n    for (let i = 0; i < STATE_SIZE; i++) {\n      const y = (this.state[i] & UPPER_MASK) | (this.state[(i + 1) % STATE_SIZE] & LOWER_MASK);\n      let next = this.state[(i + MIDDLE_WORD) % STATE_SIZE] ^ (y >>> 1);\n      if ((y & 1) !== 0) {\n        next ^= MATRIX_A;\n      }\n      this.state[i] = next >>> 0;\n    }\n    this.index = 0;\n  }\n\n  getState(): MersenneTwisterState {\n    return {\n      index: this.index,\n      state: Array.from(this.state),\n    };\n  }\n\n  setState(snapshot: MersenneTwisterState): void {\n    if (snapshot.state.length !== STATE_SIZE) {\n      throw new Error(`Expected ${STATE_SIZE} MT state values, received ${snapshot.state.length}`);\n    }\n\n    this.index = snapshot.index;\n    this.state = Uint32Array.from(snapshot.state, (value) => value >>> 0);\n  }\n}\n\nexport interface RandomGeneratorOptions {\n  readonly seed?: number;\n}\n\nexport interface RandomGeneratorState {\n  readonly mt: MersenneTwisterState;\n}\n\n/**\n * Deterministic helper mirroring the random helpers defined in rerelease g_local.h.\n */\nexport class RandomGenerator {\n  private readonly mt: MersenneTwister19937;\n\n  constructor(options: RandomGeneratorOptions = {}) {\n    this.mt = new MersenneTwister19937(options.seed);\n  }\n\n  seed(seed: number): void {\n    this.mt.seed(seed);\n  }\n\n  /** Uniform float in [0, 1). */\n  frandom(): number {\n    return this.mt.nextUint32() / TWO_POW_32;\n  }\n\n  /** Uniform float in [min, max). */\n  frandomRange(minInclusive: number, maxExclusive: number): number {\n    return minInclusive + (maxExclusive - minInclusive) * this.frandom();\n  }\n\n  /** Uniform float in [0, max). */\n  frandomMax(maxExclusive: number): number {\n    return this.frandomRange(0, maxExclusive);\n  }\n\n  /** Uniform float in [-1, 1). */\n  crandom(): number {\n    return this.frandomRange(-1, 1);\n  }\n\n  /** Uniform float in (-1, 1). */\n  crandomOpen(): number {\n    const epsilon = Number.EPSILON;\n    return this.frandomRange(-1 + epsilon, 1);\n  }\n\n  /** Raw uint32 sample. */\n  irandomUint32(): number {\n    return this.mt.nextUint32();\n  }\n\n  /** Uniform integer in [min, max). */\n  irandomRange(minInclusive: number, maxExclusive: number): number {\n    if (maxExclusive - minInclusive <= 1) {\n      return minInclusive;\n    }\n\n    const span = maxExclusive - minInclusive;\n    const limit = TWO_POW_32 - (TWO_POW_32 % span);\n    let sample: number;\n    do {\n      sample = this.mt.nextUint32();\n    } while (sample >= limit);\n    return minInclusive + (sample % span);\n  }\n\n  /** Uniform integer in [0, max). */\n  irandom(maxExclusive: number): number {\n    if (maxExclusive <= 0) {\n      return 0;\n    }\n    return this.irandomRange(0, maxExclusive);\n  }\n\n  /** Uniform time in milliseconds [min, max). */\n  randomTimeRange(minMs: number, maxMs: number): number {\n    if (maxMs <= minMs) {\n      return minMs;\n    }\n    return this.irandomRange(minMs, maxMs);\n  }\n\n  /** Uniform time in milliseconds [0, max). */\n  randomTime(maxMs: number): number {\n    return this.irandom(maxMs);\n  }\n\n  randomIndex<T extends { length: number }>(container: T): number {\n    return this.irandom(container.length);\n  }\n\n  getState(): RandomGeneratorState {\n    return { mt: this.mt.getState() };\n  }\n\n  setState(snapshot: RandomGeneratorState): void {\n    this.mt.setState(snapshot.mt);\n  }\n}\n\nexport function createRandomGenerator(options?: RandomGeneratorOptions): RandomGenerator {\n  return new RandomGenerator(options);\n}\n","import { Vec3 } from './vec3.js';\n\nexport type Mat4 = Float32Array;\n\nexport function createMat4Identity(): Mat4 {\n  return new Float32Array([\n    1, 0, 0, 0,\n    0, 1, 0, 0,\n    0, 0, 1, 0,\n    0, 0, 0, 1,\n  ]);\n}\n\nexport function mat4Identity(out: Mat4 = new Float32Array(16)): Mat4 {\n  out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0;\n  out[4] = 0; out[5] = 1; out[6] = 0; out[7] = 0;\n  out[8] = 0; out[9] = 0; out[10] = 1; out[11] = 0;\n  out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1;\n  return out;\n}\n\nexport function multiplyMat4(a: Float32Array, b: Float32Array): Mat4 {\n  const out = new Float32Array(16);\n  for (let row = 0; row < 4; row += 1) {\n    for (let col = 0; col < 4; col += 1) {\n      out[col * 4 + row] =\n        a[0 * 4 + row] * b[col * 4 + 0] +\n        a[1 * 4 + row] * b[col * 4 + 1] +\n        a[2 * 4 + row] * b[col * 4 + 2] +\n        a[3 * 4 + row] * b[col * 4 + 3];\n    }\n  }\n  return out;\n}\n\nexport function mat4Ortho(out: Mat4, left: number, right: number, bottom: number, top: number, near: number, far: number): Mat4 {\n  const lr = 1 / (left - right);\n  const bt = 1 / (bottom - top);\n  const nf = 1 / (near - far);\n\n  out[0] = -2 * lr;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = -2 * bt;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = nf;\n  out[11] = 0;\n  out[12] = (left + right) * lr;\n  out[13] = (top + bottom) * bt;\n  out[14] = near * nf;\n  out[15] = 1;\n\n  return out;\n}\n\nexport function transformPointMat4(mat: Float32Array, point: Vec3): Vec3 {\n  const x = point.x;\n  const y = point.y;\n  const z = point.z;\n  return {\n    x: mat[0] * x + mat[4] * y + mat[8] * z + mat[12],\n    y: mat[1] * x + mat[5] * y + mat[9] * z + mat[13],\n    z: mat[2] * x + mat[6] * y + mat[10] * z + mat[14],\n  };\n}\n\nexport function mat4FromBasis(origin: Vec3, axis: readonly [Vec3, Vec3, Vec3]): Mat4 {\n  const out = createMat4Identity();\n  out[0] = axis[0].x;\n  out[1] = axis[0].y;\n  out[2] = axis[0].z;\n\n  out[4] = axis[1].x;\n  out[5] = axis[1].y;\n  out[6] = axis[1].z;\n\n  out[8] = axis[2].x;\n  out[9] = axis[2].y;\n  out[10] = axis[2].z;\n\n  out[12] = origin.x;\n  out[13] = origin.y;\n  out[14] = origin.z;\n\n  return out;\n}\n\nexport function mat4Translate(out: Mat4, v: Vec3): Mat4 {\n  const x = v.x, y = v.y, z = v.z;\n  out[12] = out[0] * x + out[4] * y + out[8] * z + out[12];\n  out[13] = out[1] * x + out[5] * y + out[9] * z + out[13];\n  out[14] = out[2] * x + out[6] * y + out[10] * z + out[14];\n  out[15] = out[3] * x + out[7] * y + out[11] * z + out[15];\n  return out;\n}\n\nexport function mat4Perspective(out: Mat4, fovy: number, aspect: number, near: number, far: number): Mat4 {\n  const f = 1.0 / Math.tan(fovy / 2);\n  out[0] = f / aspect;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = f;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[11] = -1;\n  out[15] = 0;\n  if (far != null && far !== Infinity) {\n    const nf = 1 / (near - far);\n    out[10] = (far + near) * nf;\n    out[14] = 2 * far * near * nf;\n  } else {\n    out[10] = -1;\n    out[14] = -2 * near;\n  }\n  return out;\n}\n","/**\n * Bitflag constants mirroring the Quake II rerelease `contents_t` and\n * `surfflags_t` enumerations from `game.h`. The helpers here operate purely on\n * numeric bitmasks so both the authoritative game simulation and the client can\n * share the same semantic checks.\n */\nexport type ContentsFlag = number;\nexport type SurfaceFlag = number;\n\nexport const CONTENTS_NONE: ContentsFlag = 0;\nexport const CONTENTS_SOLID: ContentsFlag = 1 << 0;\nexport const CONTENTS_WINDOW: ContentsFlag = 1 << 1;\nexport const CONTENTS_AUX: ContentsFlag = 1 << 2;\nexport const CONTENTS_LAVA: ContentsFlag = 1 << 3;\nexport const CONTENTS_SLIME: ContentsFlag = 1 << 4;\nexport const CONTENTS_WATER: ContentsFlag = 1 << 5;\nexport const CONTENTS_MIST: ContentsFlag = 1 << 6;\nexport const CONTENTS_TRIGGER: ContentsFlag = 0x40000000;\nexport const CONTENTS_NO_WATERJUMP: ContentsFlag = 1 << 13;\nexport const CONTENTS_PROJECTILECLIP: ContentsFlag = 1 << 14;\nexport const CONTENTS_AREAPORTAL: ContentsFlag = 1 << 15;\nexport const CONTENTS_PLAYERCLIP: ContentsFlag = 1 << 16;\nexport const CONTENTS_MONSTERCLIP: ContentsFlag = 1 << 17;\nexport const CONTENTS_CURRENT_0: ContentsFlag = 1 << 18;\nexport const CONTENTS_CURRENT_90: ContentsFlag = 1 << 19;\nexport const CONTENTS_CURRENT_180: ContentsFlag = 1 << 20;\nexport const CONTENTS_CURRENT_270: ContentsFlag = 1 << 21;\nexport const CONTENTS_CURRENT_UP: ContentsFlag = 1 << 22;\nexport const CONTENTS_CURRENT_DOWN: ContentsFlag = 1 << 23;\nexport const CONTENTS_ORIGIN: ContentsFlag = 1 << 24;\nexport const CONTENTS_MONSTER: ContentsFlag = 1 << 25;\nexport const CONTENTS_DEADMONSTER: ContentsFlag = 1 << 26;\nexport const CONTENTS_DETAIL: ContentsFlag = 1 << 27;\nexport const CONTENTS_TRANSLUCENT: ContentsFlag = 1 << 28;\nexport const CONTENTS_LADDER: ContentsFlag = 1 << 29;\nexport const CONTENTS_PLAYER: ContentsFlag = 1 << 30;\nexport const CONTENTS_PROJECTILE: ContentsFlag = 1 << 31;\n\nexport const LAST_VISIBLE_CONTENTS: ContentsFlag = CONTENTS_MIST;\n\nexport const SURF_NONE: SurfaceFlag = 0;\nexport const SURF_LIGHT: SurfaceFlag = 1 << 0;\nexport const SURF_SLICK: SurfaceFlag = 1 << 1;\nexport const SURF_SKY: SurfaceFlag = 1 << 2;\nexport const SURF_WARP: SurfaceFlag = 1 << 3;\nexport const SURF_TRANS33: SurfaceFlag = 1 << 4;\nexport const SURF_TRANS66: SurfaceFlag = 1 << 5;\nexport const SURF_FLOWING: SurfaceFlag = 1 << 6;\nexport const SURF_NODRAW: SurfaceFlag = 1 << 7;\nexport const SURF_ALPHATEST: SurfaceFlag = 1 << 25;\nexport const SURF_N64_UV: SurfaceFlag = 1 << 28;\nexport const SURF_N64_SCROLL_X: SurfaceFlag = 1 << 29;\nexport const SURF_N64_SCROLL_Y: SurfaceFlag = 1 << 30;\nexport const SURF_N64_SCROLL_FLIP: SurfaceFlag = 1 << 31;\n\nexport const MASK_ALL: ContentsFlag = 0xffffffff;\nexport const MASK_SOLID: ContentsFlag = CONTENTS_SOLID | CONTENTS_WINDOW;\nexport const MASK_PLAYERSOLID: ContentsFlag =\n  CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_PLAYER;\nexport const MASK_DEADSOLID: ContentsFlag = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW;\nexport const MASK_MONSTERSOLID: ContentsFlag =\n  CONTENTS_SOLID | CONTENTS_MONSTERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_PLAYER;\nexport const MASK_WATER: ContentsFlag = CONTENTS_WATER | CONTENTS_LAVA | CONTENTS_SLIME;\nexport const MASK_OPAQUE: ContentsFlag = CONTENTS_SOLID | CONTENTS_SLIME | CONTENTS_LAVA;\nexport const MASK_SHOT: ContentsFlag =\n  CONTENTS_SOLID | CONTENTS_MONSTER | CONTENTS_PLAYER | CONTENTS_WINDOW | CONTENTS_DEADMONSTER;\nexport const MASK_CURRENT: ContentsFlag =\n  CONTENTS_CURRENT_0 |\n  CONTENTS_CURRENT_90 |\n  CONTENTS_CURRENT_180 |\n  CONTENTS_CURRENT_270 |\n  CONTENTS_CURRENT_UP |\n  CONTENTS_CURRENT_DOWN;\nexport const MASK_BLOCK_SIGHT: ContentsFlag =\n  CONTENTS_SOLID | CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_MONSTER | CONTENTS_PLAYER;\nexport const MASK_NAV_SOLID: ContentsFlag = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW;\nexport const MASK_LADDER_NAV_SOLID: ContentsFlag = CONTENTS_SOLID | CONTENTS_WINDOW;\nexport const MASK_WALK_NAV_SOLID: ContentsFlag =\n  CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTERCLIP;\nexport const MASK_PROJECTILE: ContentsFlag = MASK_SHOT | CONTENTS_PROJECTILECLIP;\n\nexport function hasAllContents(mask: ContentsFlag, flags: ContentsFlag): boolean {\n  return (mask & flags) === flags;\n}\n\nexport function hasAnyContents(mask: ContentsFlag, flags: ContentsFlag): boolean {\n  return (mask & flags) !== 0;\n}\n\nexport function addContents(mask: ContentsFlag, flags: ContentsFlag): ContentsFlag {\n  return mask | flags;\n}\n\nexport function removeContents(mask: ContentsFlag, flags: ContentsFlag): ContentsFlag {\n  return mask & ~flags;\n}\n\nexport function hasSurfaceFlags(surface: SurfaceFlag, flags: SurfaceFlag): boolean {\n  return (surface & flags) === flags;\n}\n\nexport function combineSurfaceFlags(...flags: SurfaceFlag[]): SurfaceFlag {\n  let mask = SURF_NONE;\n  for (const flag of flags) {\n    mask |= flag;\n  }\n  return mask;\n}\n","import type { Vec3 } from '../math/vec3.js';\n\nexport const AREA_DEPTH = 4;\nexport const WORLD_SIZE = 8192; // Standard Q2 world extent\n\nexport interface SpatialNode {\n  axis: number; // 0=X, 1=Y, -1=Leaf\n  dist: number;\n  children: [SpatialNode, SpatialNode] | null;\n  items: Set<number>;\n}\n\nexport function createSpatialTree(\n  depth = 0,\n  mins: Vec3 = { x: -WORLD_SIZE, y: -WORLD_SIZE, z: -WORLD_SIZE },\n  maxs: Vec3 = { x: WORLD_SIZE, y: WORLD_SIZE, z: WORLD_SIZE }\n): SpatialNode {\n  if (depth >= AREA_DEPTH) {\n    return {\n      axis: -1,\n      dist: 0,\n      children: null,\n      items: new Set(),\n    };\n  }\n\n  const axis = depth % 2; // Alternates X (0) and Y (1)\n  const dist = 0.5 * (axis === 0 ? mins.x + maxs.x : mins.y + maxs.y);\n\n  const mins1 = { ...mins };\n  const maxs1 = { ...maxs };\n  const mins2 = { ...mins };\n  const maxs2 = { ...maxs };\n\n  if (axis === 0) {\n    maxs1.x = dist;\n    mins2.x = dist;\n  } else {\n    maxs1.y = dist;\n    mins2.y = dist;\n  }\n\n  const child1 = createSpatialTree(depth + 1, mins1, maxs1);\n  const child2 = createSpatialTree(depth + 1, mins2, maxs2);\n\n  return {\n    axis,\n    dist,\n    children: [child1, child2],\n    items: new Set(),\n  };\n}\n\nexport function linkEntityToSpatialTree(\n  node: SpatialNode,\n  id: number,\n  absmin: Vec3,\n  absmax: Vec3\n): SpatialNode {\n  let current = node;\n\n  while (current.axis !== -1 && current.children) {\n    const axis = current.axis;\n    const dist = current.dist;\n\n    const min = axis === 0 ? absmin.x : absmin.y;\n    const max = axis === 0 ? absmax.x : absmax.y;\n\n    if (min > dist) {\n      current = current.children[1];\n    } else if (max < dist) {\n      current = current.children[0];\n    } else {\n      break; // Straddles the plane, resides in this node\n    }\n  }\n\n  current.items.add(id);\n  return current;\n}\n\nexport function querySpatialTree(\n  node: SpatialNode,\n  absmin: Vec3,\n  absmax: Vec3,\n  results: Set<number>\n): void {\n  // Add all items in the current node (because if we are here, we overlap this node's space\n  // and straddling items definitely overlap us or are at least in the parent region)\n  // Actually, strictly speaking, items in this node straddle the split plane.\n  // Since we are traversing down, we are within the node's volume.\n  // The items in this node are those that couldn't be pushed further down.\n  // So we must check them.\n\n  // NOTE: This collects candidates. Precise collision check still needed.\n  for (const id of node.items) {\n    results.add(id);\n  }\n\n  if (node.axis === -1 || !node.children) {\n    return;\n  }\n\n  const axis = node.axis;\n  const dist = node.dist;\n\n  const min = axis === 0 ? absmin.x : absmin.y;\n  const max = axis === 0 ? absmax.x : absmax.y;\n\n  if (max > dist) {\n    querySpatialTree(node.children[1], absmin, absmax, results);\n  }\n  if (min < dist) {\n    querySpatialTree(node.children[0], absmin, absmax, results);\n  }\n}\n","import { CONTENTS_TRIGGER } from './contents.js';\nimport type { Vec3 } from '../math/vec3.js';\nimport { ZERO_VEC3, addVec3, scaleVec3, subtractVec3 } from '../math/vec3.js';\nimport { createSpatialTree, linkEntityToSpatialTree, querySpatialTree, SpatialNode } from './spatial.js';\n\nexport interface CollisionPlane {\n  normal: Vec3;\n  dist: number;\n  type: number;\n  signbits: number;\n}\n\nexport interface CollisionBrushSide {\n  plane: CollisionPlane;\n  surfaceFlags: number;\n}\n\nexport interface CollisionBrush {\n  contents: number;\n  sides: CollisionBrushSide[];\n  checkcount?: number;\n}\n\nexport interface CollisionLeaf {\n  contents: number;\n  cluster: number;\n  area: number;\n  firstLeafBrush: number;\n  numLeafBrushes: number;\n}\n\nexport interface CollisionNode {\n  plane: CollisionPlane;\n  children: [number, number];\n}\n\nexport interface CollisionBmodel {\n  mins: Vec3;\n  maxs: Vec3;\n  origin: Vec3;\n  headnode: number;\n}\n\nexport interface CollisionModel {\n  planes: CollisionPlane[];\n  nodes: CollisionNode[];\n  leaves: CollisionLeaf[];\n  brushes: CollisionBrush[];\n  leafBrushes: number[];\n  bmodels: CollisionBmodel[];\n  visibility?: CollisionVisibility;\n}\n\nexport interface CollisionVisibilityCluster {\n  pvs: Uint8Array;\n  phs: Uint8Array;\n}\n\nexport interface CollisionVisibility {\n  numClusters: number;\n  clusters: readonly CollisionVisibilityCluster[];\n}\n\nexport interface CollisionLumpData {\n  planes: Array<{ normal: Vec3; dist: number; type: number }>;\n  nodes: Array<{ planenum: number; children: [number, number] }>;\n  leaves: Array<{ contents: number; cluster: number; area: number; firstLeafBrush: number; numLeafBrushes: number }>;\n  brushes: Array<{ firstSide: number; numSides: number; contents: number }>;\n  brushSides: Array<{ planenum: number; surfaceFlags: number }>;\n  leafBrushes: number[];\n  bmodels: Array<{ mins: Vec3; maxs: Vec3; origin: Vec3; headnode: number }>;\n  visibility?: CollisionVisibility;\n}\n\nexport interface TraceResult {\n  fraction: number;\n  plane: CollisionPlane | null;\n  contents: number;\n  surfaceFlags: number;\n  startsolid: boolean;\n  allsolid: boolean;\n}\n\nexport interface CollisionTraceResult {\n  fraction: number;\n  endpos: Vec3;\n  plane: CollisionPlane | null;\n  planeNormal?: Vec3;\n  contents?: number;\n  surfaceFlags?: number;\n  startsolid: boolean;\n  allsolid: boolean;\n}\n\nexport enum PlaneSide {\n  FRONT = 1,\n  BACK = 2,\n  CROSS = 3,\n}\n\nexport interface TraceDebugInfo {\n  nodesTraversed: number;\n  leafsReached: number;\n  brushesTested: number;\n}\n\nexport let traceDebugInfo: TraceDebugInfo | null = null;\n\nexport function enableTraceDebug(): void {\n  traceDebugInfo = { nodesTraversed: 0, leafsReached: 0, brushesTested: 0 };\n  // console.log('DEBUG: Trace debug enabled');\n}\n\nexport function disableTraceDebug(): void {\n  traceDebugInfo = null;\n}\n\nexport const DIST_EPSILON = 0.03125;\n\nconst MAX_CHECKCOUNT = Number.MAX_SAFE_INTEGER - 1;\nlet globalBrushCheckCount = 1;\n\nexport function buildCollisionModel(lumps: CollisionLumpData): CollisionModel {\n  const planes: CollisionPlane[] = lumps.planes.map((plane) => ({\n    ...plane,\n    signbits: computePlaneSignBits(plane.normal),\n  }));\n\n  const nodes: CollisionNode[] = lumps.nodes.map((node) => ({\n    plane: planes[node.planenum],\n    children: node.children,\n  }));\n\n  const brushes: CollisionBrush[] = lumps.brushes.map((brush) => {\n    const sides = lumps.brushSides.slice(brush.firstSide, brush.firstSide + brush.numSides).map((side) => ({\n      plane: planes[side.planenum],\n      surfaceFlags: side.surfaceFlags,\n    }));\n\n    return {\n      contents: brush.contents,\n      sides,\n      checkcount: 0,\n    };\n  });\n\n  const leaves: CollisionLeaf[] = lumps.leaves.map((leaf) => ({\n    contents: leaf.contents,\n    cluster: leaf.cluster,\n    area: leaf.area,\n    firstLeafBrush: leaf.firstLeafBrush,\n    numLeafBrushes: leaf.numLeafBrushes,\n  }));\n\n  const bmodels: CollisionBmodel[] = lumps.bmodels.map((model) => ({\n    mins: model.mins,\n    maxs: model.maxs,\n    origin: model.origin,\n    headnode: model.headnode,\n  }));\n\n  return {\n    planes,\n    nodes,\n    leaves,\n    brushes,\n    leafBrushes: lumps.leafBrushes,\n    bmodels,\n    visibility: lumps.visibility,\n  };\n}\n\nexport function computePlaneSignBits(normal: Vec3): number {\n  let bits = 0;\n  if (normal.x < 0) bits |= 1;\n  if (normal.y < 0) bits |= 2;\n  if (normal.z < 0) bits |= 4;\n  return bits;\n}\n\nexport function planeDistanceToPoint(plane: CollisionPlane, point: Vec3): number {\n  return plane.normal.x * point.x + plane.normal.y * point.y + plane.normal.z * point.z - plane.dist;\n}\n\nexport function pointOnPlaneSide(plane: CollisionPlane, point: Vec3, epsilon = 0): PlaneSide.FRONT | PlaneSide.BACK | PlaneSide.CROSS {\n  const dist = planeDistanceToPoint(plane, point);\n  if (dist > epsilon) {\n    return PlaneSide.FRONT;\n  }\n  if (dist < -epsilon) {\n    return PlaneSide.BACK;\n  }\n  return PlaneSide.CROSS;\n}\n\nexport function boxOnPlaneSide(mins: Vec3, maxs: Vec3, plane: CollisionPlane, epsilon = 0): PlaneSide {\n  let dist1: number;\n  let dist2: number;\n\n  switch (plane.signbits) {\n    case 0:\n      dist1 = plane.normal.x * maxs.x + plane.normal.y * maxs.y + plane.normal.z * maxs.z;\n      dist2 = plane.normal.x * mins.x + plane.normal.y * mins.y + plane.normal.z * mins.z;\n      break;\n    case 1:\n      dist1 = plane.normal.x * mins.x + plane.normal.y * maxs.y + plane.normal.z * maxs.z;\n      dist2 = plane.normal.x * maxs.x + plane.normal.y * mins.y + plane.normal.z * mins.z;\n      break;\n    case 2:\n      dist1 = plane.normal.x * maxs.x + plane.normal.y * mins.y + plane.normal.z * maxs.z;\n      dist2 = plane.normal.x * mins.x + plane.normal.y * maxs.y + plane.normal.z * mins.z;\n      break;\n    case 3:\n      dist1 = plane.normal.x * mins.x + plane.normal.y * mins.y + plane.normal.z * maxs.z;\n      dist2 = plane.normal.x * maxs.x + plane.normal.y * maxs.y + plane.normal.z * mins.z;\n      break;\n    case 4:\n      dist1 = plane.normal.x * maxs.x + plane.normal.y * maxs.y + plane.normal.z * mins.z;\n      dist2 = plane.normal.x * mins.x + plane.normal.y * mins.y + plane.normal.z * maxs.z;\n      break;\n    case 5:\n      dist1 = plane.normal.x * mins.x + plane.normal.y * maxs.y + plane.normal.z * mins.z;\n      dist2 = plane.normal.x * maxs.x + plane.normal.y * mins.y + plane.normal.z * maxs.z;\n      break;\n    case 6:\n      dist1 = plane.normal.x * maxs.x + plane.normal.y * mins.y + plane.normal.z * mins.z;\n      dist2 = plane.normal.x * mins.x + plane.normal.y * maxs.y + plane.normal.z * maxs.z;\n      break;\n    default:\n      dist1 = plane.normal.x * mins.x + plane.normal.y * mins.y + plane.normal.z * mins.z;\n      dist2 = plane.normal.x * maxs.x + plane.normal.y * maxs.y + plane.normal.z * maxs.z;\n      break;\n  }\n\n  let sides = 0;\n  if (dist1 - plane.dist >= -epsilon) sides = PlaneSide.FRONT;\n  if (dist2 - plane.dist <= epsilon) sides |= PlaneSide.BACK;\n  return sides as PlaneSide;\n}\n\nexport function pointInsideBrush(point: Vec3, brush: CollisionBrush, epsilon = DIST_EPSILON): boolean {\n  for (const side of brush.sides) {\n    const dist = planeDistanceToPoint(side.plane, point);\n    if (dist > epsilon) {\n      return false;\n    }\n  }\n  return true;\n}\n\nexport interface BoxBrushTestResult {\n  startsolid: boolean;\n  allsolid: boolean;\n  contents: number;\n}\n\nexport function testBoxInBrush(origin: Vec3, mins: Vec3, maxs: Vec3, brush: CollisionBrush): BoxBrushTestResult {\n  for (const side of brush.sides) {\n    const offset = side.plane.normal.x * (side.plane.normal.x < 0 ? maxs.x : mins.x) +\n      side.plane.normal.y * (side.plane.normal.y < 0 ? maxs.y : mins.y) +\n      side.plane.normal.z * (side.plane.normal.z < 0 ? maxs.z : mins.z);\n\n    const dist = side.plane.dist - offset;\n    const d1 = origin.x * side.plane.normal.x + origin.y * side.plane.normal.y + origin.z * side.plane.normal.z - dist;\n\n    if (d1 > 0) {\n      return { startsolid: false, allsolid: false, contents: 0 };\n    }\n  }\n\n  return { startsolid: true, allsolid: true, contents: brush.contents };\n}\n\nexport interface ClipBoxParams {\n  start: Vec3;\n  end: Vec3;\n  mins: Vec3;\n  maxs: Vec3;\n  brush: CollisionBrush;\n  trace: TraceResult;\n}\n\n/**\n * Clips a movement box against a brush using the Liang-Barsky algorithm.\n *\n * This function determines if and where the swept box (from start to end) intersects the brush.\n * It works by clipping the movement line segment against the infinite planes defined by the brush sides.\n *\n * Algorithm Overview (Liang-Barsky):\n * The movement is treated as a parameterized line P(t) = Start + t * (End - Start), for t in [0, 1].\n * We maintain an interval [enterfrac, leavefrac] (initially [-1, 1]) representing the portion of the\n * line that is potentially inside the brush.\n * For each plane:\n * 1. We determine the distance of Start (d1) and End (d2) from the plane.\n *    - For box traces, planes are expanded by the box extents, effectively treating the box as a point.\n * 2. If both points are in front (outside), the line is outside the brush.\n * 3. If the line crosses the plane:\n *    - If entering (d1 > d2), we update `enterfrac` (max of entry times).\n *    - If leaving (d1 < d2), we update `leavefrac` (min of exit times).\n * 4. If at any point enterfrac > leavefrac, the line misses the brush.\n *\n * @see CM_ClipBoxToBrush in qcommon/cm_trace.c:145-220\n *\n * @param params ClipBoxParams containing start/end vectors, box mins/maxs, target brush, and trace result to update.\n */\nexport function clipBoxToBrush({ start, end, mins, maxs, brush, trace }: ClipBoxParams): void {\n  if (brush.sides.length === 0) return;\n\n  const isPoint = mins.x === 0 && mins.y === 0 && mins.z === 0 && maxs.x === 0 && maxs.y === 0 && maxs.z === 0;\n\n  // enterfrac: The fraction of movement where the box FIRST fully enters the brush volume (intersection start).\n  // leavefrac: The fraction of movement where the box STARTS to leave the brush volume (intersection end).\n  // Initialized to -1 and 1 to cover the full potential range + buffers.\n  let enterfrac = -1;\n  let leavefrac = 1;\n  let clipplane: CollisionPlane | null = null;\n  let leadside: CollisionBrushSide | null = null;\n\n  let getout = false; // True if the end point is outside at least one plane (not trapped in brush)\n  let startout = false; // True if the start point is outside at least one plane (not starting stuck)\n\n  for (const side of brush.sides) {\n    const { plane } = side;\n    let dist = plane.dist;\n\n    // Expand the plane by the box extents to perform a point-plane test.\n    // This reduces the AABB sweep vs convex brush problem to a line segment vs expanded planes problem.\n    if (!isPoint) {\n      const ofsX = plane.normal.x < 0 ? maxs.x : mins.x;\n      const ofsY = plane.normal.y < 0 ? maxs.y : mins.y;\n      const ofsZ = plane.normal.z < 0 ? maxs.z : mins.z;\n      dist -= plane.normal.x * ofsX + plane.normal.y * ofsY + plane.normal.z * ofsZ;\n    }\n\n    // d1: Distance of start point from the (expanded) plane. Positive = in front (outside).\n    // d2: Distance of end point from the (expanded) plane.\n    const d1 = start.x * plane.normal.x + start.y * plane.normal.y + start.z * plane.normal.z - dist;\n    const d2 = end.x * plane.normal.x + end.y * plane.normal.y + end.z * plane.normal.z - dist;\n\n    if (d2 > 0) getout = true;\n    if (d1 > 0) startout = true;\n\n    // Case 1: Entirely outside this plane.\n    // Since brushes are convex intersections of half-spaces (defined by planes pointing OUT),\n    // being in front of ANY plane means being outside the brush.\n    // The d2 >= d1 check handles the case where the line is parallel or moving away from the plane.\n    if (d1 > 0 && d2 >= d1) {\n      return;\n    }\n\n    // Case 2: Entirely inside this plane (back side).\n    // Does not restrict the entry/exit interval further than other planes might.\n    if (d1 <= 0 && d2 <= 0) {\n      continue;\n    }\n\n    // Case 3: Line intersects the plane.\n    // d1 > d2 means we are moving from Front (outside) to Back (inside) -> Entering.\n    if (d1 > d2) {\n      // Calculate intersection fraction f.\n      // DIST_EPSILON is subtracted to ensure we stop slightly *before* the plane,\n      // preventing the object from getting stuck in the next frame due to float precision.\n      const f = (d1 - DIST_EPSILON) / (d1 - d2);\n      if (f > enterfrac) {\n        enterfrac = f;\n        clipplane = plane;\n        leadside = side;\n      }\n    } else {\n      // Moving from Back (inside) to Front (outside) -> Leaving.\n      // DIST_EPSILON is added to push the exit point slightly further out (or in depending on perspective),\n      // effectively narrowing the \"inside\" interval.\n      const f = (d1 + DIST_EPSILON) / (d1 - d2);\n      if (f < leavefrac) leavefrac = f;\n    }\n  }\n\n  // If we never started outside any plane, we started inside the brush.\n  if (!startout) {\n    trace.startsolid = true;\n    // If we also never got out of any plane (meaning we stayed behind all planes),\n    // then the entire movement is inside the brush (allsolid).\n    if (!getout) {\n      trace.allsolid = true;\n    }\n    trace.fraction = 0;\n    return;\n  }\n\n  // If the entry fraction is less than the exit fraction, we have a valid intersection interval.\n  if (enterfrac < leavefrac && enterfrac > -1 && enterfrac < trace.fraction) {\n    if (enterfrac < 0) enterfrac = 0;\n    trace.fraction = enterfrac;\n    trace.plane = clipplane;\n    trace.contents = brush.contents;\n    trace.surfaceFlags = leadside?.surfaceFlags ?? 0;\n  }\n}\n\nexport function createDefaultTrace(): TraceResult {\n  return {\n    fraction: 1,\n    plane: null,\n    contents: 0,\n    surfaceFlags: 0,\n    startsolid: false,\n    allsolid: false,\n  };\n}\n\nfunction findLeafIndex(point: Vec3, model: CollisionModel, headnode: number): number {\n  let nodeIndex = headnode;\n\n  while (nodeIndex >= 0) {\n    const node = model.nodes[nodeIndex];\n    const dist = planeDistanceToPoint(node.plane, point);\n    nodeIndex = dist >= 0 ? node.children[0] : node.children[1];\n  }\n\n  return -1 - nodeIndex;\n}\n\nfunction computeLeafContents(model: CollisionModel, leafIndex: number, point: Vec3): number {\n  const leaf = model.leaves[leafIndex];\n  let contents = leaf.contents;\n\n  const brushCheckCount = nextBrushCheckCount();\n  const start = leaf.firstLeafBrush;\n  const end = start + leaf.numLeafBrushes;\n\n  for (let i = start; i < end; i += 1) {\n    const brushIndex = model.leafBrushes[i];\n    const brush = model.brushes[brushIndex];\n\n    if (brush.checkcount === brushCheckCount) continue;\n    brush.checkcount = brushCheckCount;\n\n    if (brush.sides.length === 0) continue;\n    if (pointInsideBrush(point, brush)) {\n      contents |= brush.contents;\n    }\n  }\n\n  return contents;\n}\n\nfunction nextBrushCheckCount(): number {\n  const count = globalBrushCheckCount;\n  globalBrushCheckCount += 1;\n  if (globalBrushCheckCount >= MAX_CHECKCOUNT) {\n    globalBrushCheckCount = 1;\n  }\n  return count;\n}\n\nfunction isPointBounds(mins: Vec3, maxs: Vec3): boolean {\n  return mins.x === 0 && mins.y === 0 && mins.z === 0 && maxs.x === 0 && maxs.y === 0 && maxs.z === 0;\n}\n\nfunction planeOffsetForBounds(plane: CollisionPlane, mins: Vec3, maxs: Vec3): number {\n  if (isPointBounds(mins, maxs)) return 0;\n\n  const offset =\n    plane.normal.x * (plane.normal.x < 0 ? maxs.x : mins.x) +\n    plane.normal.y * (plane.normal.y < 0 ? maxs.y : mins.y) +\n    plane.normal.z * (plane.normal.z < 0 ? maxs.z : mins.z);\n\n  return offset;\n}\n\nfunction planeOffsetMagnitude(plane: CollisionPlane, mins: Vec3, maxs: Vec3): number {\n  return Math.abs(planeOffsetForBounds(plane, mins, maxs));\n}\n\nfunction lerpPoint(start: Vec3, end: Vec3, t: number): Vec3 {\n  return addVec3(start, scaleVec3(subtractVec3(end, start), t));\n}\n\nfunction finalizeTrace(trace: TraceResult, start: Vec3, end: Vec3): CollisionTraceResult {\n  const clampedFraction = trace.allsolid ? 0 : trace.fraction;\n  const endpos = lerpPoint(start, end, clampedFraction);\n\n  return {\n    fraction: clampedFraction,\n    endpos,\n    plane: trace.plane,\n    planeNormal: trace.startsolid ? undefined : trace.plane?.normal,\n    contents: trace.contents,\n    surfaceFlags: trace.surfaceFlags,\n    startsolid: trace.startsolid,\n    allsolid: trace.allsolid,\n  };\n}\n\nfunction clusterForPoint(point: Vec3, model: CollisionModel, headnode: number): number {\n  const leafIndex = findLeafIndex(point, model, headnode);\n  return model.leaves[leafIndex]?.cluster ?? -1;\n}\n\nfunction clusterVisible(\n  visibility: CollisionVisibility,\n  from: number,\n  to: number,\n  usePhs: boolean,\n): boolean {\n  if (!visibility || visibility.numClusters === 0) return true;\n  if (from < 0 || to < 0) return false;\n  if (from >= visibility.clusters.length || to >= visibility.numClusters) return false;\n\n  const cluster = visibility.clusters[from];\n  const set = usePhs ? cluster.phs : cluster.pvs;\n  const byte = set[to >> 3];\n  if (byte === undefined) return false;\n\n  return (byte & (1 << (to & 7))) !== 0;\n}\n\n/**\n * Recursively checks a hull sweep against a BSP tree.\n * Implements a Liang-Barsky like clipping algorithm against the BSP planes.\n *\n * Based on CM_RecursiveHullCheck in qcommon/cm_trace.c.\n */\nfunction recursiveHullCheck(params: {\n  readonly model: CollisionModel;\n  readonly nodeIndex: number;\n  readonly startFraction: number;\n  readonly endFraction: number;\n  readonly start: Vec3;\n  readonly end: Vec3;\n  readonly traceStart: Vec3;\n  readonly traceEnd: Vec3;\n  readonly mins: Vec3;\n  readonly maxs: Vec3;\n  readonly contentMask: number;\n  readonly trace: TraceResult;\n  readonly brushCheckCount: number;\n}): void {\n  const {\n    model,\n    nodeIndex,\n    startFraction,\n    endFraction,\n    start,\n    end,\n    traceStart,\n    traceEnd,\n    mins,\n    maxs,\n    contentMask,\n    trace,\n    brushCheckCount,\n  } = params;\n\n  // If we've already hit something earlier in the trace than where we are starting this check,\n  // we can stop.\n  if (trace.fraction <= startFraction) {\n    return;\n  }\n\n  // If we reached a leaf, check the brushes in it.\n  if (nodeIndex < 0) {\n    if (traceDebugInfo) {\n      traceDebugInfo.leafsReached++;\n    }\n\n    const leafIndex = -1 - nodeIndex;\n    const leaf = model.leaves[leafIndex];\n\n    const brushStart = leaf.firstLeafBrush;\n    const brushEnd = brushStart + leaf.numLeafBrushes;\n\n    for (let i = brushStart; i < brushEnd; i += 1) {\n      const brushIndex = model.leafBrushes[i];\n      const brush = model.brushes[brushIndex];\n\n      if ((brush.contents & contentMask) === 0) continue;\n      if (!brush.sides.length) continue;\n      // Optimization: Avoid checking the same brush multiple times in a single trace.\n      if (brush.checkcount === brushCheckCount) continue;\n\n      brush.checkcount = brushCheckCount;\n\n      if (traceDebugInfo) {\n        traceDebugInfo.brushesTested++;\n      }\n\n      clipBoxToBrush({ start: traceStart, end: traceEnd, mins, maxs, brush, trace });\n      if (trace.allsolid) {\n        return;\n      }\n    }\n    return;\n  }\n\n  if (traceDebugInfo) {\n    traceDebugInfo.nodesTraversed++;\n  }\n\n  const node = model.nodes[nodeIndex];\n  const plane = node.plane;\n\n  // Calculate the distance from the plane to the box's nearest corner.\n  // This effectively expands the plane by the box extents.\n  // Use absolute value of offset like original C code (full/qcommon/cmodel.c:1269-1271).\n  const offset = planeOffsetMagnitude(plane, mins, maxs);\n\n  const startDist = planeDistanceToPoint(plane, start);\n  const endDist = planeDistanceToPoint(plane, end);\n\n  // If both start and end points are in front of the plane (including offset),\n  // we only need to check the front child.\n  if (startDist >= offset && endDist >= offset) {\n    recursiveHullCheck({\n      model,\n      nodeIndex: node.children[0],\n      startFraction,\n      endFraction,\n      start,\n      end,\n      traceStart,\n      traceEnd,\n      mins,\n      maxs,\n      contentMask,\n      trace,\n      brushCheckCount,\n    });\n    return;\n  }\n\n  // If both start and end points are behind the plane (including offset),\n  // we only need to check the back child.\n  if (startDist < -offset && endDist < -offset) {\n    recursiveHullCheck({\n      model,\n      nodeIndex: node.children[1],\n      startFraction,\n      endFraction,\n      start,\n      end,\n      traceStart,\n      traceEnd,\n      mins,\n      maxs,\n      contentMask,\n      trace,\n      brushCheckCount,\n    });\n    return;\n  }\n\n  // The segment straddles the plane. We need to split the segment and recurse down both sides.\n  // Put the crosspoint DIST_EPSILON pixels on the near side to avoid precision issues.\n  // See full/qcommon/cmodel.c:1293-1313 (CM_RecursiveHullCheck)\n  // fraction1 (frac) is used for \"move up to node\" - the near-side recursion\n  // fraction2 (frac2) is used for \"go past the node\" - the far-side recursion\n  let side = 0;\n  let idist = 1 / (startDist - endDist);\n  let fraction1, fraction2;\n\n  if (startDist < endDist) {\n    side = 1;\n    fraction2 = (startDist + offset + DIST_EPSILON) * idist;\n    fraction1 = (startDist - offset + DIST_EPSILON) * idist;\n  } else {\n    side = 0;\n    fraction2 = (startDist - offset - DIST_EPSILON) * idist;\n    fraction1 = (startDist + offset + DIST_EPSILON) * idist;\n  }\n\n  if (fraction1 < 0) fraction1 = 0;\n  else if (fraction1 > 1) fraction1 = 1;\n\n  if (fraction2 < 0) fraction2 = 0;\n  else if (fraction2 > 1) fraction2 = 1;\n\n  const midFraction = startFraction + (endFraction - startFraction) * fraction1;\n  const midPoint = lerpPoint(start, end, fraction1);\n\n  // Recurse down the near side\n  recursiveHullCheck({\n    model,\n    nodeIndex: node.children[side],\n    startFraction,\n    endFraction: midFraction,\n    start,\n    end: midPoint,\n    traceStart,\n    traceEnd,\n    mins,\n    maxs,\n    contentMask,\n    trace,\n    brushCheckCount,\n  });\n\n  const updatedFraction = trace.fraction;\n\n  // Optimisation: if we hit something closer than the split point, we don't need to check the far side\n  if (updatedFraction <= midFraction) {\n    return;\n  }\n\n  const midFraction2 = startFraction + (endFraction - startFraction) * fraction2;\n  const midPoint2 = lerpPoint(start, end, fraction2);\n\n  // Recurse down the far side\n  recursiveHullCheck({\n    model,\n    nodeIndex: node.children[1 - side],\n    startFraction: midFraction2,\n    endFraction,\n    start: midPoint2,\n    end,\n    traceStart,\n    traceEnd,\n    mins,\n    maxs,\n    contentMask,\n    trace,\n    brushCheckCount,\n  });\n}\n\nexport interface CollisionTraceParams {\n  readonly model: CollisionModel;\n  readonly start: Vec3;\n  readonly end: Vec3;\n  readonly mins?: Vec3;\n  readonly maxs?: Vec3;\n  readonly headnode?: number;\n  readonly contentMask?: number;\n}\n\nexport function traceBox(params: CollisionTraceParams): CollisionTraceResult {\n  const { model, start, end } = params;\n  const mins = params.mins ?? ZERO_VEC3;\n  const maxs = params.maxs ?? ZERO_VEC3;\n  const contentMask = params.contentMask ?? 0xffffffff;\n  const headnode = params.headnode ?? 0;\n\n  const trace = createDefaultTrace();\n  const brushCheckCount = nextBrushCheckCount();\n\n  recursiveHullCheck({\n    model,\n    nodeIndex: headnode,\n    startFraction: 0,\n    endFraction: 1,\n    start,\n    end,\n    traceStart: start,\n    traceEnd: end,\n    mins,\n    maxs,\n    contentMask,\n    trace,\n    brushCheckCount,\n  });\n\n  return finalizeTrace(trace, start, end);\n}\n\nexport function pointContents(point: Vec3, model: CollisionModel, headnode = 0): number {\n  const leafIndex = findLeafIndex(point, model, headnode);\n  return computeLeafContents(model, leafIndex, point);\n}\n\nexport function pointContentsMany(points: readonly Vec3[], model: CollisionModel, headnode = 0): number[] {\n  const leafCache = new Map<number, number>();\n\n  return points.map((point) => {\n    const leafIndex = findLeafIndex(point, model, headnode);\n    const leaf = model.leaves[leafIndex];\n\n    if (leaf.numLeafBrushes === 0) {\n      const cached = leafCache.get(leafIndex);\n      if (cached !== undefined) {\n        return cached;\n      }\n\n      leafCache.set(leafIndex, leaf.contents);\n      return leaf.contents;\n    }\n\n    return computeLeafContents(model, leafIndex, point);\n  });\n}\n\nexport function boxContents(origin: Vec3, mins: Vec3, maxs: Vec3, model: CollisionModel, headnode = 0): number {\n  const brushCheckCount = nextBrushCheckCount();\n  let contents = 0;\n\n  function traverse(nodeIndex: number) {\n    if (nodeIndex < 0) {\n    if (traceDebugInfo) {\n      traceDebugInfo.leafsReached++;\n    }\n      const leafIndex = -1 - nodeIndex;\n      const leaf = model.leaves[leafIndex];\n\n      contents |= leaf.contents;\n\n      const brushStart = leaf.firstLeafBrush;\n      const brushEnd = brushStart + leaf.numLeafBrushes;\n\n      for (let i = brushStart; i < brushEnd; i += 1) {\n        const brushIndex = model.leafBrushes[i];\n        const brush = model.brushes[brushIndex];\n\n        if (brush.checkcount === brushCheckCount) continue;\n        brush.checkcount = brushCheckCount;\n\n        if (brush.sides.length === 0) continue;\n\n        const result = testBoxInBrush(origin, mins, maxs, brush);\n        if (result.startsolid) {\n          contents |= result.contents;\n        }\n      }\n      return;\n    }\n\n    const node = model.nodes[nodeIndex];\n    const plane = node.plane;\n    const offset = planeOffsetMagnitude(plane, mins, maxs);\n    const dist = planeDistanceToPoint(plane, origin);\n\n    if (offset === 0) {\n      traverse(dist >= 0 ? node.children[0] : node.children[1]);\n      return;\n    }\n\n    if (dist > offset) {\n      traverse(node.children[0]);\n      return;\n    }\n\n    if (dist < -offset) {\n      traverse(node.children[1]);\n      return;\n    }\n\n    traverse(node.children[0]);\n    traverse(node.children[1]);\n  }\n\n  traverse(headnode);\n\n  return contents;\n}\n\nexport function inPVS(p1: Vec3, p2: Vec3, model: CollisionModel, headnode = 0): boolean {\n  const { visibility } = model;\n  if (!visibility) return true;\n\n  const cluster1 = clusterForPoint(p1, model, headnode);\n  const cluster2 = clusterForPoint(p2, model, headnode);\n\n  return clusterVisible(visibility, cluster1, cluster2, false);\n}\n\nexport function inPHS(p1: Vec3, p2: Vec3, model: CollisionModel, headnode = 0): boolean {\n  const { visibility } = model;\n  if (!visibility) return true;\n\n  const cluster1 = clusterForPoint(p1, model, headnode);\n  const cluster2 = clusterForPoint(p2, model, headnode);\n\n  return clusterVisible(visibility, cluster1, cluster2, true);\n}\n\nexport interface CollisionEntityLink {\n  readonly id: number;\n  readonly origin: Vec3;\n  readonly mins: Vec3;\n  readonly maxs: Vec3;\n  readonly contents: number;\n  readonly surfaceFlags?: number;\n}\n\ninterface CollisionEntityState extends CollisionEntityLink {\n  readonly brush: CollisionBrush;\n  readonly bounds: { readonly mins: Vec3; readonly maxs: Vec3 };\n}\n\nfunction axisAlignedPlane(normal: Vec3, dist: number, type: number): CollisionPlane {\n  return { normal, dist, type, signbits: computePlaneSignBits(normal) };\n}\n\nfunction makeEntityBrush(link: CollisionEntityLink): CollisionBrush {\n  const sx = link.surfaceFlags ?? 0;\n  const xMax = link.origin.x + link.maxs.x;\n  const xMin = link.origin.x + link.mins.x;\n  const yMax = link.origin.y + link.maxs.y;\n  const yMin = link.origin.y + link.mins.y;\n  const zMax = link.origin.z + link.maxs.z;\n  const zMin = link.origin.z + link.mins.z;\n\n  const planes: CollisionPlane[] = [\n    axisAlignedPlane({ x: 1, y: 0, z: 0 }, xMax, 0),\n    axisAlignedPlane({ x: -1, y: 0, z: 0 }, -xMin, 0),\n    axisAlignedPlane({ x: 0, y: 1, z: 0 }, yMax, 1),\n    axisAlignedPlane({ x: 0, y: -1, z: 0 }, -yMin, 1),\n    axisAlignedPlane({ x: 0, y: 0, z: 1 }, zMax, 2),\n    axisAlignedPlane({ x: 0, y: 0, z: -1 }, -zMin, 2),\n  ];\n\n  const sides: CollisionBrushSide[] = planes.map((plane) => ({ plane, surfaceFlags: sx }));\n\n  return { contents: link.contents, sides, checkcount: 0 };\n}\n\nfunction makeEntityState(link: CollisionEntityLink): CollisionEntityState {\n  const brush = makeEntityBrush(link);\n  return {\n    ...link,\n    brush,\n    bounds: {\n      mins: {\n        x: link.origin.x + link.mins.x,\n        y: link.origin.y + link.mins.y,\n        z: link.origin.z + link.mins.z,\n      },\n      maxs: {\n        x: link.origin.x + link.maxs.x,\n        y: link.origin.y + link.maxs.y,\n        z: link.origin.z + link.maxs.z,\n      },\n    },\n  };\n}\n\nfunction boundsIntersect(a: { mins: Vec3; maxs: Vec3 }, b: { mins: Vec3; maxs: Vec3 }): boolean {\n  return !(\n    a.mins.x > b.maxs.x ||\n    a.maxs.x < b.mins.x ||\n    a.mins.y > b.maxs.y ||\n    a.maxs.y < b.mins.y ||\n    a.mins.z > b.maxs.z ||\n    a.maxs.z < b.mins.z\n  );\n}\n\nfunction pickBetterTrace(\n  best: CollisionTraceResult,\n  candidate: CollisionTraceResult,\n): boolean {\n  if (candidate.allsolid && !best.allsolid) return true;\n  if (candidate.startsolid && !best.startsolid) return true;\n  return candidate.fraction < best.fraction;\n}\n\nexport interface CollisionEntityTraceParams extends CollisionTraceParams {\n  readonly passId?: number;\n}\n\nexport interface CollisionEntityTraceResult extends CollisionTraceResult {\n  readonly entityId: number | null;\n}\n\nexport class CollisionEntityIndex {\n  private readonly entities = new Map<number, CollisionEntityState>();\n  private readonly entityNodes = new Map<number, SpatialNode>();\n  private readonly rootNode = createSpatialTree();\n\n  link(entity: CollisionEntityLink): void {\n    const state = makeEntityState(entity);\n    this.entities.set(entity.id, state);\n\n    // Update spatial index\n    const existingNode = this.entityNodes.get(entity.id);\n    if (existingNode) {\n      existingNode.items.delete(entity.id);\n    }\n\n    const newNode = linkEntityToSpatialTree(\n      this.rootNode,\n      entity.id,\n      state.bounds.mins,\n      state.bounds.maxs\n    );\n    this.entityNodes.set(entity.id, newNode);\n  }\n\n  unlink(entityId: number): void {\n    this.entities.delete(entityId);\n\n    const node = this.entityNodes.get(entityId);\n    if (node) {\n      node.items.delete(entityId);\n      this.entityNodes.delete(entityId);\n    }\n  }\n\n  trace(params: CollisionEntityTraceParams): CollisionEntityTraceResult {\n    const { passId } = params;\n    const mins = params.mins ?? ZERO_VEC3;\n    const maxs = params.maxs ?? ZERO_VEC3;\n    const contentMask = params.contentMask ?? 0xffffffff;\n\n    let bestTrace: CollisionTraceResult;\n    let bestEntity: number | null = null;\n\n    if (params.model) {\n      bestTrace = traceBox(params);\n    } else {\n      bestTrace = finalizeTrace(createDefaultTrace(), params.start, params.end);\n    }\n\n    // Determine query bounds for spatial lookup\n    const traceAbsMin = {\n      x: Math.min(params.start.x, params.end.x) + mins.x,\n      y: Math.min(params.start.y, params.end.y) + mins.y,\n      z: Math.min(params.start.z, params.end.z) + mins.z,\n    };\n    const traceAbsMax = {\n      x: Math.max(params.start.x, params.end.x) + maxs.x,\n      y: Math.max(params.start.y, params.end.y) + maxs.y,\n      z: Math.max(params.start.z, params.end.z) + maxs.z,\n    };\n\n    const candidates = new Set<number>();\n    querySpatialTree(this.rootNode, traceAbsMin, traceAbsMax, candidates);\n\n    for (const entityId of candidates) {\n      if (entityId === passId) continue;\n\n      const entity = this.entities.get(entityId);\n      if (!entity) continue;\n      if ((entity.contents & contentMask) === 0) continue;\n\n      const trace = createDefaultTrace();\n      clipBoxToBrush({ start: params.start, end: params.end, mins, maxs, brush: entity.brush, trace });\n\n      if (trace.contents === 0) {\n        trace.contents = entity.contents;\n      }\n\n      if (trace.startsolid || trace.allsolid || trace.fraction < bestTrace.fraction) {\n         const candidate = finalizeTrace(trace, params.start, params.end);\n         if (pickBetterTrace(bestTrace, candidate)) {\n           bestTrace = candidate;\n           bestEntity = entity.id;\n         }\n      }\n    }\n\n    return { ...bestTrace, entityId: bestEntity };\n  }\n\n  gatherTriggerTouches(origin: Vec3, mins: Vec3, maxs: Vec3, mask = CONTENTS_TRIGGER): number[] {\n    const results: number[] = [];\n    const queryBounds = {\n      mins: addVec3(origin, mins),\n      maxs: addVec3(origin, maxs),\n    };\n\n    const candidates = new Set<number>();\n    querySpatialTree(this.rootNode, queryBounds.mins, queryBounds.maxs, candidates);\n\n    for (const entityId of candidates) {\n      const entity = this.entities.get(entityId);\n      if (!entity) continue;\n\n      if ((entity.contents & mask) === 0) continue;\n      if (boundsIntersect(queryBounds, entity.bounds)) {\n        results.push(entity.id);\n      }\n    }\n\n    return results;\n  }\n}\n","export const enum CvarFlags {\n  None = 0,\n  Archive = 1 << 0,\n  UserInfo = 1 << 1,\n  ServerInfo = 1 << 2,\n  Latch = 1 << 3,\n  Cheat = 1 << 4,\n}\n\nexport interface CvarDefinition {\n  readonly name: string;\n  readonly defaultValue: string;\n  readonly description?: string;\n  readonly flags?: CvarFlags;\n}\n","// Mirrors the Quake II rerelease configstring/index layout from `game.h`.\n// These constants intentionally track the numeric values used in the C++\n// game and client modules so the TypeScript engine/game/client layers can\n// share deterministic indices for precaches and HUD parsing.\n\nexport const MAX_STRING_CHARS = 1024;\nexport const MAX_STRING_TOKENS = 80;\nexport const MAX_TOKEN_CHARS = 512;\n\nexport const MAX_QPATH = 64;\nexport const MAX_OSPATH = 128;\n\nexport const MAX_CLIENTS = 256;\nexport const MAX_EDICTS = 8192;\nexport const MAX_LIGHTSTYLES = 256;\nexport const MAX_MODELS = 8192;\nexport const MAX_SOUNDS = 2048;\nexport const MAX_IMAGES = 512;\nexport const MAX_ITEMS = 256;\nexport const MAX_GENERAL = MAX_CLIENTS * 2;\nexport const MAX_SHADOW_LIGHTS = 256;\nexport const MAX_WHEEL_ITEMS = 32;\n\nexport const CS_MAX_STRING_LENGTH = 96;\nexport const CS_MAX_STRING_LENGTH_OLD = 64;\n\n// Enum-style numeric constants that mirror the C++ `configstrings` enum. Only\n// the explicitly numbered entries are re-stated here; everything else follows\n// sequentially to keep the arithmetic (e.g., CS_SOUNDS = CS_MODELS +\n// MAX_MODELS) intact.\nexport enum ConfigStringIndex {\n  Name = 0,\n  CdTrack = 1,\n  Sky = 2,\n  SkyAxis = 3,\n  SkyRotate = 4,\n  StatusBar = 5,\n\n  // Matching bg_local.h:55-76\n  HealthBarName = 55,\n  CONFIG_N64_PHYSICS = 56,\n  CONFIG_CTF_TEAMS = 57,\n  CONFIG_COOP_RESPAWN_STRING = 58,\n  Story = 54, // Arbitrarily placed in the gap for now\n\n  AirAccel = 59,\n  MaxClients = 60,\n  MapChecksum = 61,\n\n  Models = 62,\n  Sounds = Models + MAX_MODELS,\n  Images = Sounds + MAX_SOUNDS,\n  Lights = Images + MAX_IMAGES,\n  ShadowLights = Lights + MAX_LIGHTSTYLES,\n  Items = ShadowLights + MAX_SHADOW_LIGHTS,\n  Players = Items + MAX_ITEMS, // CS_PLAYERS (contains userinfo with name, skin, etc.)\n  PlayerSkins = Players, // Alias for legacy code compatibility\n  General = Players + MAX_CLIENTS,\n  WheelWeapons = General + MAX_GENERAL,\n  WheelAmmo = WheelWeapons + MAX_WHEEL_ITEMS,\n  WheelPowerups = WheelAmmo + MAX_WHEEL_ITEMS,\n  CdLoopCount = WheelPowerups + MAX_WHEEL_ITEMS,\n  GameStyle = CdLoopCount + 1,\n  MaxConfigStrings = GameStyle + 1,\n}\n\n// Mirror the C++ MAX_CONFIGSTRINGS value for consumers that prefer a standalone constant.\nexport const MAX_CONFIGSTRINGS = ConfigStringIndex.MaxConfigStrings;\n\n/**\n * Returns the maximum string length permitted for the given configstring index,\n * mirroring the `CS_SIZE` helper in the rerelease. Statusbar and general ranges\n * can legally occupy multiple 96-character slots; everything else is capped at\n * `CS_MAX_STRING_LENGTH`.\n */\nexport function configStringSize(index: number): number {\n  if (index >= ConfigStringIndex.StatusBar && index < ConfigStringIndex.AirAccel) {\n    return CS_MAX_STRING_LENGTH * (ConfigStringIndex.AirAccel - index);\n  }\n\n  if (index >= ConfigStringIndex.General && index < ConfigStringIndex.WheelWeapons) {\n    return CS_MAX_STRING_LENGTH * (ConfigStringIndex.MaxConfigStrings - index);\n  }\n\n  return CS_MAX_STRING_LENGTH;\n}\n\n// Legacy constants\nexport const CS_NAME = ConfigStringIndex.Name;\nexport const CS_CDTRACK = ConfigStringIndex.CdTrack;\nexport const CS_SKY = ConfigStringIndex.Sky;\nexport const CS_SKYAXIS = ConfigStringIndex.SkyAxis;\nexport const CS_SKYROTATE = ConfigStringIndex.SkyRotate;\nexport const CS_STATUSBAR = ConfigStringIndex.StatusBar;\nexport const CS_AIRACCEL = ConfigStringIndex.AirAccel;\nexport const CS_MAXCLIENTS = ConfigStringIndex.MaxClients;\nexport const CS_MAPCHECKSUM = ConfigStringIndex.MapChecksum;\nexport const CS_MODELS = ConfigStringIndex.Models;\nexport const CS_SOUNDS = ConfigStringIndex.Sounds;\nexport const CS_IMAGES = ConfigStringIndex.Images;\nexport const CS_LIGHTS = ConfigStringIndex.Lights;\nexport const CS_ITEMS = ConfigStringIndex.Items;\nexport const CS_PLAYERS = ConfigStringIndex.Players;\nexport const CS_GENERAL = ConfigStringIndex.General;\n","export * from './schema.js';\nexport * from './io.js';\n","import { ReplaySession, ReplayFrame } from './schema.js';\nimport { UserCommand } from '../protocol/usercmd.js';\n\nexport function serializeReplay(session: ReplaySession): string {\n    return JSON.stringify(session, null, 2);\n}\n\nexport function deserializeReplay(json: string): ReplaySession {\n    const session = JSON.parse(json);\n\n    // Validate structure lightly\n    if (!session.metadata || !Array.isArray(session.frames)) {\n        throw new Error('Invalid replay format: missing metadata or frames');\n    }\n\n    return session as ReplaySession;\n}\n\nexport function createReplaySession(map: string, seed?: number): ReplaySession {\n    return {\n        metadata: {\n            map,\n            date: new Date().toISOString(),\n            version: '1.0',\n            seed\n        },\n        frames: []\n    };\n}\n\nexport function addReplayFrame(session: ReplaySession, cmd: UserCommand, serverFrame: number, startTime: number) {\n    session.frames.push({\n        serverFrame,\n        cmd,\n        timestamp: Date.now() - startTime\n    });\n}\n","export interface ContractValidationResult {\n  missing: string[];\n  nonFunctions: string[];\n  extras: string[];\n}\n\nexport interface ContractValidationOptions {\n  readonly name?: string;\n  readonly allowExtra?: boolean;\n}\n\nexport type ContractFunctionMap<Keys extends readonly string[]> = Record<Keys[number], (...args: unknown[]) => unknown>;\n\nfunction normalize(object: Record<string, unknown> | undefined): Record<string, unknown> {\n  return object ?? {};\n}\n\nexport function validateContract<Keys extends readonly string[]>(\n  table: Record<string, unknown> | undefined,\n  requiredKeys: Keys,\n  options: ContractValidationOptions = {},\n): ContractValidationResult {\n  const normalized = normalize(table);\n  const missing: string[] = [];\n  const nonFunctions: string[] = [];\n\n  for (const key of requiredKeys) {\n    if (!(key in normalized)) {\n      missing.push(key);\n      continue;\n    }\n\n    if (typeof normalized[key] !== 'function') {\n      nonFunctions.push(key);\n    }\n  }\n\n  const extras = options.allowExtra === false ? Object.keys(normalized).filter((key) => !requiredKeys.includes(key)) : [];\n\n  return { missing, nonFunctions, extras } satisfies ContractValidationResult;\n}\n\nexport function assertContract<Keys extends readonly string[]>(\n  table: Record<string, unknown> | undefined,\n  requiredKeys: Keys,\n  options: ContractValidationOptions = {},\n): asserts table is ContractFunctionMap<Keys> {\n  const { missing, nonFunctions, extras } = validateContract(table, requiredKeys, options);\n  if (missing.length === 0 && nonFunctions.length === 0 && extras.length === 0) {\n    return;\n  }\n\n  const pieces: string[] = [];\n  if (missing.length > 0) {\n    pieces.push(`missing: ${missing.join(', ')}`);\n  }\n  if (nonFunctions.length > 0) {\n    pieces.push(`non-functions: ${nonFunctions.join(', ')}`);\n  }\n  if (extras.length > 0) {\n    pieces.push(`extras: ${extras.join(', ')}`);\n  }\n\n  const label = options.name ?? 'contract';\n  throw new Error(`${label} validation failed (${pieces.join('; ')})`);\n}\n\nexport const GAME_IMPORT_KEYS = [\n  'Broadcast_Print',\n  'Com_Print',\n  'Client_Print',\n  'Center_Print',\n  'sound',\n  'positioned_sound',\n  'local_sound',\n  'configstring',\n  'get_configstring',\n  'Com_Error',\n  'modelindex',\n  'soundindex',\n  'imageindex',\n  'setmodel',\n  'trace',\n  'clip',\n  'pointcontents',\n  'inPVS',\n  'inPHS',\n  'SetAreaPortalState',\n  'AreasConnected',\n  'linkentity',\n  'unlinkentity',\n  'BoxEdicts',\n  'multicast',\n  'unicast',\n] as const;\n\nexport const GAME_EXPORT_KEYS = [\n  'PreInit',\n  'Init',\n  'Shutdown',\n  'SpawnEntities',\n  'WriteGameJson',\n  'ReadGameJson',\n  'WriteLevelJson',\n  'ReadLevelJson',\n  'CanSave',\n  'ClientConnect',\n  'ClientThink',\n  'RunFrame',\n  'Pmove',\n] as const;\n\nexport const CGAME_IMPORT_KEYS = [\n  'Com_Print',\n  'get_configstring',\n  'Com_Error',\n  'TagMalloc',\n  'TagFree',\n  'AddCommandString',\n  'CL_FrameValid',\n  'CL_FrameTime',\n  'CL_ClientTime',\n  'CL_ServerFrame',\n  'Draw_RegisterPic',\n  'Draw_GetPicSize',\n  'SCR_DrawChar',\n  'SCR_DrawPic',\n  'SCR_DrawColorPic',\n] as const;\n\nexport const CGAME_EXPORT_KEYS = [\n  'Init',\n  'Shutdown',\n  'DrawHUD',\n  'TouchPics',\n  'LayoutFlags',\n  'GetActiveWeaponWheelWeapon',\n  'GetOwnedWeaponWheelWeapons',\n  'GetWeaponWheelAmmoCount',\n  'GetPowerupWheelCount',\n  'GetHitMarkerDamage',\n  'Pmove',\n  'ParseConfigString',\n  'ParseCenterPrint',\n  'ClearNotify',\n  'ClearCenterprint',\n  'NotifyMessage',\n  'GetMonsterFlashOffset',\n] as const;\n","/**\n * Mirrors the Quake II rerelease `water_level_t` enumeration from `game.h`\n * (lines 443-449). These numeric values are relied upon throughout the\n * movement code when checking how submerged a player is, so we keep the same\n * ordering to make future porting work straightforward.\n */\nexport enum WaterLevel {\n  None = 0,\n  Feet = 1,\n  Waist = 2,\n  Under = 3,\n}\n\n/**\n * Utility that matches the common rerelease checks that treat any level at or\n * above the `WATER_WAIST` constant as \"significantly submerged\" for friction\n * and current calculations.\n */\nexport function isAtLeastWaistDeep(level: WaterLevel): boolean {\n  return level >= WaterLevel.Waist;\n}\n\n/**\n * Returns true when the player is considered underwater (the `WATER_UNDER`\n * case in the rerelease). This mirrors the places in `p_move.cpp` that gate\n * effects such as breath timers and screen warping.\n */\nexport function isUnderwater(level: WaterLevel): boolean {\n  return level === WaterLevel.Under;\n}\n\n/**\n * Matches the Quake II rerelease `pmflags_t` bit layout from `game.h` so the\n * shared helpers can manipulate the same flag words as the authoritative game\n * and the client prediction layer.\n */\nexport const enum PmFlag {\n  Ducked = 1 << 0,\n  JumpHeld = 1 << 1,\n  OnGround = 1 << 2,\n  TimeWaterJump = 1 << 3,\n  TimeLand = 1 << 4,\n  TimeTeleport = 1 << 5,\n  NoPositionalPrediction = 1 << 6,\n  OnLadder = 1 << 7,\n  NoAngularPrediction = 1 << 8,\n  IgnorePlayerCollision = 1 << 9,\n  TimeTrick = 1 << 10,\n}\n\nexport type PmFlags = number;\n\nexport function hasPmFlag(flags: PmFlags, flag: PmFlag): boolean {\n  return (flags & flag) !== 0;\n}\n\nexport function addPmFlag(flags: PmFlags, flag: PmFlag): PmFlags {\n  return flags | flag;\n}\n\nexport function removePmFlag(flags: PmFlags, flag: PmFlag): PmFlags {\n  return flags & ~flag;\n}\n\n/**\n * Player movement types mirrored from the rerelease `pmtype_t` enumeration.\n * The exact numeric values matter when syncing pmove state across the network\n * so we keep the same order as the C++ definition.\n */\nexport enum PmType {\n  Normal = 0,\n  Grapple = 1,\n  NoClip = 2,\n  Spectator = 3,\n  Dead = 4,\n  Gib = 5,\n  Freeze = 6,\n}\n\n/**\n * Bitmask constants for the `buttons` field on the Quake II player command\n * structure. These mirror the rerelease `BUTTON_*` definitions so logic such as\n * jump/crouch checks can be shared between the server and client.\n */\nexport const enum PlayerButton {\n  None = 0,\n  Attack = 1 << 0,\n  Use = 1 << 1,\n  Holster = 1 << 2,\n  Jump = 1 << 3,\n  Crouch = 1 << 4,\n  Attack2 = 1 << 5,\n  Any = 1 << 7,\n}\n","import type { Vec3 } from '../math/vec3.js';\nimport { WaterLevel, type PmFlags, PmFlag, PmType, PlayerButton, addPmFlag, removePmFlag } from './constants.js';\n\nconst DEFAULT_JUMP_HEIGHT = 270;\n\nexport interface CheckJumpParams {\n  readonly pmFlags: PmFlags;\n  readonly pmType: PmType;\n  readonly buttons: number;\n  readonly waterlevel: WaterLevel;\n  readonly onGround: boolean;\n  readonly velocity: Vec3;\n  readonly origin: Vec3;\n  readonly jumpHeight?: number;\n}\n\nexport interface CheckJumpResult {\n  readonly pmFlags: PmFlags;\n  readonly onGround: boolean;\n  readonly velocity: Vec3;\n  readonly origin: Vec3;\n  readonly jumpSound: boolean;\n  readonly jumped: boolean;\n}\n\nfunction hasButton(buttons: number, button: PlayerButton): boolean {\n  return (buttons & button) !== 0;\n}\n\n/**\n * Pure translation of the rerelease `PM_CheckJump` helper from `p_move.cpp`.\n * The function takes in the minimal pmove state that the original C++ logic\n * touches and returns the updated flag/origin/velocity tuple so callers can\n * apply the same semantics on both the server and client.\n */\nexport function checkJump(params: CheckJumpParams): CheckJumpResult {\n  const { pmFlags, pmType, buttons, waterlevel, onGround, velocity, origin, jumpHeight = DEFAULT_JUMP_HEIGHT } = params;\n\n  // PM_CheckJump immediately bails while the landing timer is active.\n  if (pmFlags & PmFlag.TimeLand) {\n    return { pmFlags, onGround, velocity, origin, jumpSound: false, jumped: false };\n  }\n\n  const holdingJump = hasButton(buttons, PlayerButton.Jump);\n  let nextFlags = pmFlags;\n  let nextOnGround = onGround;\n  let jumpSound = false;\n  let jumped = false;\n  let nextVelocity = velocity;\n  let nextOrigin = origin;\n\n  if (!holdingJump) {\n    nextFlags = removePmFlag(nextFlags, PmFlag.JumpHeld);\n    return { pmFlags: nextFlags, onGround: nextOnGround, velocity: nextVelocity, origin: nextOrigin, jumpSound, jumped };\n  }\n\n  if (hasPmJumpHold(nextFlags)) {\n    return { pmFlags: nextFlags, onGround: nextOnGround, velocity: nextVelocity, origin: nextOrigin, jumpSound, jumped };\n  }\n\n  if (pmType === PmType.Dead) {\n    return { pmFlags: nextFlags, onGround: nextOnGround, velocity: nextVelocity, origin: nextOrigin, jumpSound, jumped };\n  }\n\n  if (waterlevel >= WaterLevel.Waist) {\n    nextOnGround = false;\n    return { pmFlags: nextFlags, onGround: nextOnGround, velocity: nextVelocity, origin: nextOrigin, jumpSound, jumped };\n  }\n\n  if (!nextOnGround) {\n    return { pmFlags: nextFlags, onGround: nextOnGround, velocity: nextVelocity, origin: nextOrigin, jumpSound, jumped };\n  }\n\n  nextFlags = addPmFlag(nextFlags, PmFlag.JumpHeld);\n  nextFlags = removePmFlag(nextFlags, PmFlag.OnGround);\n  nextOnGround = false;\n  jumpSound = true;\n  jumped = true;\n\n  const z = velocity.z + jumpHeight;\n  const finalZ = z < jumpHeight ? jumpHeight : z;\n  nextVelocity = { ...velocity, z: finalZ };\n\n  // Unstuck from ground: pm->s.origin[2] += 1;\n  nextOrigin = { ...origin, z: origin.z + 1 };\n\n  return { pmFlags: nextFlags, onGround: nextOnGround, velocity: nextVelocity, origin: nextOrigin, jumpSound, jumped };\n}\n\nfunction hasPmJumpHold(flags: PmFlags): boolean {\n  return (flags & PmFlag.JumpHeld) !== 0;\n}\n","import type { ContentsFlag } from '../bsp/contents.js';\nimport {\n  CONTENTS_CURRENT_0,\n  CONTENTS_CURRENT_180,\n  CONTENTS_CURRENT_270,\n  CONTENTS_CURRENT_90,\n  CONTENTS_CURRENT_DOWN,\n  CONTENTS_CURRENT_UP,\n  CONTENTS_LADDER,\n  MASK_CURRENT,\n} from '../bsp/contents.js';\nimport { addVec3, crossVec3, normalizeVec3, scaleVec3, ZERO_VEC3, type Vec3 } from '../math/vec3.js';\nimport { PlayerButton, WaterLevel, isAtLeastWaistDeep } from './constants.js';\nimport type { PmoveCmd, PmoveTraceFn } from './types.js';\n\nexport interface WaterCurrentParams {\n  readonly watertype: ContentsFlag;\n  readonly waterlevel: WaterLevel;\n  readonly onGround: boolean;\n  readonly waterSpeed: number;\n}\n\nexport interface GroundCurrentParams {\n  readonly groundContents: ContentsFlag;\n  readonly scale?: number;\n}\n\nexport interface AddCurrentsParams {\n  readonly wishVelocity: Vec3;\n  readonly onLadder: boolean;\n  readonly onGround: boolean;\n  readonly waterlevel: WaterLevel;\n  readonly watertype: ContentsFlag;\n  readonly groundContents: ContentsFlag;\n  readonly cmd: PmoveCmd;\n  readonly viewPitch: number;\n  readonly maxSpeed: number;\n  readonly ladderMod: number;\n  readonly waterSpeed: number;\n  readonly forward: Vec3;\n  readonly origin: Vec3;\n  readonly mins: Vec3;\n  readonly maxs: Vec3;\n  readonly trace?: PmoveTraceFn;\n}\n\nconst DEFAULT_GROUND_CURRENT_SCALE = 100;\nconst DEFAULT_FORWARD_LADDER_CLAMP = 200;\nconst DEFAULT_SIDE_LADDER_CLAMP = 150;\nconst LADDER_HORIZONTAL_CAP = 25;\nconst LADDER_ASCEND_PITCH_THRESHOLD = 15;\nconst LADDER_TRACE_DISTANCE = 1;\nconst UP_VECTOR: Vec3 = { x: 0, y: 0, z: 1 };\n\nconst DEFAULT_TRACE: PmoveTraceFn = (_, end) => ({\n  fraction: 1,\n  endpos: end,\n  allsolid: false,\n  startsolid: false,\n});\n\n/**\n * Mirrors the rerelease pattern in `p_move.cpp` (lines 730-765) that turns the\n * directional CONTENTS_CURRENT_* flags into a unit-ish direction vector.\n */\nexport function currentVectorFromContents(contents: ContentsFlag): Vec3 {\n  let x = 0;\n  let y = 0;\n  let z = 0;\n\n  if (contents & CONTENTS_CURRENT_0) {\n    x += 1;\n  }\n  if (contents & CONTENTS_CURRENT_90) {\n    y += 1;\n  }\n  if (contents & CONTENTS_CURRENT_180) {\n    x -= 1;\n  }\n  if (contents & CONTENTS_CURRENT_270) {\n    y -= 1;\n  }\n  if (contents & CONTENTS_CURRENT_UP) {\n    z += 1;\n  }\n  if (contents & CONTENTS_CURRENT_DOWN) {\n    z -= 1;\n  }\n\n  if (x === 0 && y === 0 && z === 0) {\n    return ZERO_VEC3;\n  }\n\n  return { x, y, z };\n}\n\n/**\n * Computes the velocity contribution from water currents using the same rules\n * as `PM_WaterMove`: the CONTENTS_CURRENT_* bits are turned into a direction\n * vector, scaled by `pm_waterspeed`, and halved when the player only has their\n * feet submerged while standing on solid ground.\n */\nexport function waterCurrentVelocity(params: WaterCurrentParams): Vec3 {\n  const { watertype, waterlevel, onGround, waterSpeed } = params;\n\n  if ((watertype & MASK_CURRENT) === 0) {\n    return ZERO_VEC3;\n  }\n\n  const direction = currentVectorFromContents(watertype);\n  if (direction === ZERO_VEC3) {\n    return ZERO_VEC3;\n  }\n\n  let scale = waterSpeed;\n  if (waterlevel === WaterLevel.Feet && onGround) {\n    scale *= 0.5;\n  }\n\n  return scaleVec3(direction, scale);\n}\n\n/**\n * Computes the conveyor-style velocity that should be applied while touching a\n * ground plane that carries CONTENTS_CURRENT_* bits. The rerelease multiplies\n * the direction vector by 100 units per second, so we expose the same default\n * while allowing callers to override the scalar for tests.\n */\nexport function groundCurrentVelocity(params: GroundCurrentParams): Vec3 {\n  const { groundContents, scale = DEFAULT_GROUND_CURRENT_SCALE } = params;\n\n  const direction = currentVectorFromContents(groundContents);\n  if (direction === ZERO_VEC3) {\n    return ZERO_VEC3;\n  }\n\n  return scaleVec3(direction, scale);\n}\n\n/**\n * Pure mirror of PM_AddCurrents from rerelease `p_move.cpp`: handles ladder\n * specific motion tweaks, water currents, and conveyor-style ground currents\n * before pmove acceleration is applied.\n */\nexport function applyPmoveAddCurrents(params: AddCurrentsParams): Vec3 {\n  const {\n    wishVelocity,\n    onLadder,\n    onGround,\n    waterlevel,\n    watertype,\n    groundContents,\n    cmd,\n    viewPitch,\n    maxSpeed,\n    ladderMod,\n    waterSpeed,\n    forward,\n    origin,\n    mins,\n    maxs,\n    trace = DEFAULT_TRACE,\n  } = params;\n\n  let adjusted = wishVelocity;\n\n  if (onLadder) {\n    adjusted = applyLadderAdjustments({\n      wishVelocity: adjusted,\n      cmd,\n      waterlevel,\n      viewPitch,\n      maxSpeed,\n      ladderMod,\n      onGround,\n      forward,\n      origin,\n      mins,\n      maxs,\n      trace,\n    });\n  }\n\n  const waterVelocity = waterCurrentVelocity({ watertype, waterlevel, onGround, waterSpeed });\n  if (waterVelocity !== ZERO_VEC3) {\n    adjusted = addVec3(adjusted, waterVelocity);\n  }\n\n  if (onGround) {\n    const groundVelocity = groundCurrentVelocity({ groundContents });\n    if (groundVelocity !== ZERO_VEC3) {\n      adjusted = addVec3(adjusted, groundVelocity);\n    }\n  }\n\n  return adjusted;\n}\n\ninterface LadderAdjustParams {\n  readonly wishVelocity: Vec3;\n  readonly cmd: PmoveCmd;\n  readonly waterlevel: WaterLevel;\n  readonly viewPitch: number;\n  readonly maxSpeed: number;\n  readonly ladderMod: number;\n  readonly onGround: boolean;\n  readonly forward: Vec3;\n  readonly origin: Vec3;\n  readonly mins: Vec3;\n  readonly maxs: Vec3;\n  readonly trace: PmoveTraceFn;\n}\n\nfunction applyLadderAdjustments(params: LadderAdjustParams): Vec3 {\n  const { wishVelocity, cmd, waterlevel, viewPitch, maxSpeed, ladderMod, onGround, forward, origin, mins, maxs, trace } = params;\n  const buttons = cmd.buttons ?? 0;\n  let adjusted = { ...wishVelocity };\n\n  if ((buttons & (PlayerButton.Jump | PlayerButton.Crouch)) !== 0) {\n    const ladderSpeed = isAtLeastWaistDeep(waterlevel) ? maxSpeed : DEFAULT_FORWARD_LADDER_CLAMP;\n    adjusted = {\n      ...adjusted,\n      z: buttons & PlayerButton.Jump ? ladderSpeed : -ladderSpeed,\n    };\n  } else if (cmd.forwardmove) {\n    const clamped = clamp(cmd.forwardmove, -DEFAULT_FORWARD_LADDER_CLAMP, DEFAULT_FORWARD_LADDER_CLAMP);\n    if (cmd.forwardmove > 0) {\n      const climb = viewPitch < LADDER_ASCEND_PITCH_THRESHOLD ? clamped : -clamped;\n      adjusted = { ...adjusted, z: climb };\n    } else {\n      if (!onGround) {\n        adjusted = { ...adjusted, x: 0, y: 0 };\n      }\n      adjusted = { ...adjusted, z: clamped };\n    }\n  } else {\n    adjusted = { ...adjusted, z: 0 };\n  }\n\n  if (!onGround) {\n    if (cmd.sidemove) {\n      let sideSpeed = clamp(cmd.sidemove, -DEFAULT_SIDE_LADDER_CLAMP, DEFAULT_SIDE_LADDER_CLAMP);\n      if (waterlevel < WaterLevel.Waist) {\n        sideSpeed *= ladderMod;\n      }\n\n      const flatForward = normalizeVec3({ x: forward.x, y: forward.y, z: 0 });\n      if (flatForward.x !== 0 || flatForward.y !== 0) {\n        const spot = addVec3(origin, scaleVec3(flatForward, LADDER_TRACE_DISTANCE));\n        const tr = trace(origin, spot, mins, maxs);\n        if (\n          tr.fraction !== 1 &&\n          !tr.allsolid &&\n          tr.contents !== undefined &&\n          (tr.contents & CONTENTS_LADDER) !== 0 &&\n          tr.planeNormal\n        ) {\n          const right = crossVec3(tr.planeNormal, UP_VECTOR);\n          adjusted = { ...adjusted, x: 0, y: 0 };\n          adjusted = addVec3(adjusted, scaleVec3(right, -sideSpeed));\n        }\n      }\n    } else {\n      adjusted = {\n        ...adjusted,\n        x: clampHorizontal(adjusted.x),\n        y: clampHorizontal(adjusted.y),\n      };\n    }\n  }\n\n  return adjusted;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n  return Math.max(min, Math.min(max, value));\n}\n\nfunction clampHorizontal(value: number): number {\n  if (value < -LADDER_HORIZONTAL_CAP) {\n    return -LADDER_HORIZONTAL_CAP;\n  }\n  if (value > LADDER_HORIZONTAL_CAP) {\n    return LADDER_HORIZONTAL_CAP;\n  }\n  return value;\n}\n","import { addVec3, ZERO_VEC3, clipVelocityVec3, crossVec3, dotVec3, scaleVec3, type Vec3 } from '../math/vec3.js';\nimport type { PmoveTraceFn } from './types.js';\n\nconst DEFAULT_MAX_CLIP_PLANES = 5;\nconst DEFAULT_MAX_BUMPS = 4;\nconst DEFAULT_STEP_SIZE = 18;\nconst MIN_STEP_NORMAL = 0.7;\n\nexport const SLIDEMOVE_BLOCKED_FLOOR = 1;\nexport const SLIDEMOVE_BLOCKED_WALL = 2;\n\nexport interface SlideMoveResult {\n  readonly velocity: Vec3;\n  readonly planes: readonly Vec3[];\n  readonly stopped: boolean;\n}\n\nexport interface SlideMoveParams {\n  readonly origin: Vec3;\n  readonly velocity: Vec3;\n  readonly frametime: number;\n  readonly overbounce: number;\n  readonly trace: PmoveTraceFn;\n  readonly maxBumps?: number;\n  readonly maxClipPlanes?: number;\n  readonly mins?: Vec3;\n  readonly maxs?: Vec3;\n  /**\n   * Mirrors the pm->s.pm_time check in PM_StepSlideMove_Generic: if true, the\n   * returned velocity is reset to the primal velocity after collision\n   * resolution so time-based effects (like knockbacks) don't dampen.\n   */\n  readonly hasTime?: boolean;\n}\n\nexport interface SlideMoveOutcome extends SlideMoveResult {\n  readonly origin: Vec3;\n  readonly blocked: number;\n}\n\nexport interface StepSlideMoveParams extends SlideMoveParams {\n  readonly mins: Vec3;\n  readonly maxs: Vec3;\n  readonly stepSize?: number;\n}\n\nexport interface StepSlideMoveOutcome extends SlideMoveOutcome {\n  readonly stepped: boolean;\n  readonly stepHeight: number;\n  readonly stepNormal?: Vec3;\n}\n\n/**\n * Resolves a sequence of collision planes against a primal velocity using the same\n * plane iteration logic seen in PM_StepSlideMove_Generic (rerelease p_move.cpp).\n * The incoming planes should be ordered as they were encountered during traces;\n * the function will accumulate them, clip the velocity to be parallel to all planes,\n * and return zero velocity when three planes form an unresolvable corner or when\n * the adjusted velocity would oppose the primal direction.\n */\nexport function resolveSlideMove(\n  initialVelocity: Vec3,\n  planesEncountered: readonly Vec3[],\n  overbounce: number,\n  maxClipPlanes = DEFAULT_MAX_CLIP_PLANES,\n  primalVelocity: Vec3 = initialVelocity,\n): SlideMoveResult {\n  if (planesEncountered.length === 0) {\n    return { velocity: initialVelocity, planes: [], stopped: false };\n  }\n\n  const planes: Vec3[] = [];\n  let velocity: Vec3 = initialVelocity;\n\n  for (const plane of planesEncountered) {\n    if (planes.length >= maxClipPlanes) {\n      return { velocity: ZERO_VEC3, planes, stopped: true };\n    }\n\n    // Skip near-duplicate planes to mirror the epsilon guard in PM_StepSlideMove_Generic.\n    const duplicate = planes.find((existing) => dotVec3(existing, plane) > 0.99);\n    if (duplicate) {\n      continue;\n    }\n\n    planes.push(plane);\n\n    let clipped: Vec3 | undefined;\n    let i = 0;\n    for (; i < planes.length; i++) {\n      const candidate = clipVelocityVec3(velocity, planes[i], overbounce);\n\n      let j = 0;\n      for (; j < planes.length; j++) {\n        if (j === i) continue;\n        if (dotVec3(candidate, planes[j]) < 0) break;\n      }\n\n      if (j === planes.length) {\n        clipped = candidate;\n        break;\n      }\n    }\n\n    if (clipped) {\n      velocity = clipped;\n    } else {\n      if (planes.length !== 2) {\n        return { velocity: ZERO_VEC3, planes, stopped: true };\n      }\n\n      const dir = crossVec3(planes[0], planes[1]);\n      const d = dotVec3(dir, velocity);\n      velocity = scaleVec3(dir, d);\n    }\n\n    // If velocity reversed relative to the primal direction, stop to avoid oscillations.\n    if (dotVec3(velocity, primalVelocity) <= 0) {\n      return { velocity: ZERO_VEC3, planes, stopped: true };\n    }\n  }\n\n  const stopped = velocity.x === 0 && velocity.y === 0 && velocity.z === 0;\n  return { velocity, planes, stopped };\n}\n\n/**\n * Pure mirror of PM_SlideMoveGeneric from rerelease `p_move.cpp` (minus gravity/step handling).\n * Uses a caller-provided trace to collect collision planes, accumulates them through\n * `resolveSlideMove`, and returns the resulting origin/velocity/blocking state.\n */\nexport function slideMove(params: SlideMoveParams): SlideMoveOutcome {\n  const {\n    origin: initialOrigin,\n    velocity: initialVelocity,\n    frametime,\n    overbounce,\n    trace,\n    maxBumps = DEFAULT_MAX_BUMPS,\n    maxClipPlanes = DEFAULT_MAX_CLIP_PLANES,\n    mins,\n    maxs,\n    hasTime = false,\n  } = params;\n\n  let origin = initialOrigin;\n  let velocity = initialVelocity;\n  const planes: Vec3[] = [];\n  const primalVelocity = initialVelocity;\n  let timeLeft = frametime;\n  let blocked = 0;\n\n  for (let bump = 0; bump < maxBumps; bump++) {\n    if (velocity.x === 0 && velocity.y === 0 && velocity.z === 0) {\n      break;\n    }\n\n    const end = addVec3(origin, scaleVec3(velocity, timeLeft));\n    const tr = trace(origin, end, mins, maxs);\n\n    if (tr.allsolid) {\n      const velocity = hasTime ? primalVelocity : ZERO_VEC3;\n      return { origin: tr.endpos, velocity, planes, stopped: true, blocked };\n    }\n\n    if (tr.startsolid) {\n      const velocity = hasTime ? primalVelocity : ZERO_VEC3;\n      return { origin: tr.endpos, velocity, planes, stopped: true, blocked };\n    }\n\n    if (tr.fraction > 0) {\n      origin = tr.endpos;\n    }\n\n    if (tr.fraction === 1) {\n      break;\n    }\n\n    if (!tr.planeNormal) {\n      const velocity = hasTime ? primalVelocity : ZERO_VEC3;\n      return { origin, velocity, planes, stopped: true, blocked };\n    }\n\n    if (tr.planeNormal.z > 0.7) {\n      blocked |= SLIDEMOVE_BLOCKED_FLOOR;\n    }\n    if (tr.planeNormal.z === 0) {\n      blocked |= SLIDEMOVE_BLOCKED_WALL;\n    }\n\n    planes.push(tr.planeNormal);\n    timeLeft -= timeLeft * tr.fraction;\n\n    const resolved = resolveSlideMove(velocity, planes, overbounce, maxClipPlanes, primalVelocity);\n    velocity = resolved.velocity;\n    planes.splice(0, planes.length, ...resolved.planes);\n\n    if (primalVelocity.z > 0 && velocity.z < 0) {\n      velocity = { ...velocity, z: 0 };\n    }\n\n    if (resolved.stopped) {\n      const velocityOut = hasTime ? primalVelocity : velocity;\n      return { origin, velocity: velocityOut, planes, stopped: true, blocked };\n    }\n  }\n\n  const velocityOut = hasTime ? primalVelocity : velocity;\n  return { origin, velocity: velocityOut, planes, stopped: velocityOut.x === 0 && velocityOut.y === 0 && velocityOut.z === 0, blocked };\n}\n\n/**\n * Mirrors PM_StepSlideMove (rerelease p_move.cpp) in a pure form: attempts a\n * regular slide move, then retries from a stepped-up position when the first\n * attempt was blocked. The function compares planar distance traveled and the\n * steepness of the landing plane to decide whether to keep the step.\n */\nexport function stepSlideMove(params: StepSlideMoveParams): StepSlideMoveOutcome {\n  const { mins, maxs, stepSize = DEFAULT_STEP_SIZE, ...rest } = params;\n\n  const startOrigin = params.origin;\n  const startVelocity = params.velocity;\n\n  const downResult = slideMove({ ...rest, mins, maxs });\n\n  const upTarget = addVec3(startOrigin, { x: 0, y: 0, z: stepSize });\n  const upTrace = rest.trace(startOrigin, upTarget, mins, maxs);\n  if (upTrace.allsolid) {\n    return { ...downResult, stepped: false, stepHeight: 0 };\n  }\n\n  const actualStep = upTrace.endpos.z - startOrigin.z;\n  const steppedResult = slideMove({ ...rest, origin: upTrace.endpos, velocity: startVelocity, mins, maxs });\n\n  const pushDownTarget = addVec3(steppedResult.origin, { x: 0, y: 0, z: -actualStep });\n  const downTrace = rest.trace(steppedResult.origin, pushDownTarget, mins, maxs);\n\n  let steppedOrigin = steppedResult.origin;\n  let stepNormal = downTrace.planeNormal;\n\n  if (!downTrace.allsolid) {\n    steppedOrigin = downTrace.endpos;\n  }\n\n  const planarDistanceSquared = (a: Vec3, b: Vec3) => (a.x - b.x) ** 2 + (a.y - b.y) ** 2;\n  const downDist = planarDistanceSquared(downResult.origin, startOrigin);\n  const upDist = planarDistanceSquared(steppedOrigin, startOrigin);\n\n  if (downDist > upDist || (stepNormal && stepNormal.z < MIN_STEP_NORMAL)) {\n    return { ...downResult, stepped: false, stepHeight: 0 };\n  }\n\n  const steppedVelocity = { ...steppedResult.velocity, z: downResult.velocity.z };\n  const steppedBlocked = steppedResult.blocked;\n  const stopped = steppedVelocity.x === 0 && steppedVelocity.y === 0 && steppedVelocity.z === 0;\n\n  return {\n    origin: steppedOrigin,\n    velocity: steppedVelocity,\n    planes: steppedResult.planes,\n    blocked: steppedBlocked,\n    stopped,\n    stepped: true,\n    stepHeight: actualStep,\n    stepNormal,\n  };\n}\n","import type { Vec3 } from '../math/vec3.js';\nimport { addVec3, lengthVec3, normalizeVec3, scaleVec3 } from '../math/vec3.js';\nimport { applyPmoveAccelerate, applyPmoveAirAccelerate } from './pmove.js';\nimport { applyPmoveAddCurrents } from './currents.js';\nimport { stepSlideMove, type StepSlideMoveOutcome } from './slide.js';\nimport type { PmoveCmd, PmoveTraceFn } from './types.js';\nimport {\n  PmFlag,\n  type PmFlags,\n  PmType,\n  PlayerButton,\n  WaterLevel,\n  hasPmFlag,\n} from './constants.js';\n\ninterface BaseMoveParams {\n  readonly origin: Vec3;\n  readonly velocity: Vec3;\n  readonly frametime: number;\n  readonly mins: Vec3;\n  readonly maxs: Vec3;\n  readonly trace: PmoveTraceFn;\n  readonly overbounce?: number;\n  readonly stepSize?: number;\n  readonly maxBumps?: number;\n  readonly maxClipPlanes?: number;\n  readonly hasTime?: boolean;\n}\n\nexport interface AirMoveParams extends BaseMoveParams {\n  readonly cmd: PmoveCmd;\n  readonly forward: Vec3;\n  readonly right: Vec3;\n  readonly pmFlags: PmFlags;\n  readonly onGround: boolean;\n  readonly gravity: number;\n  readonly pmType: PmType;\n  readonly pmAccelerate: number;\n  readonly pmAirAccelerate?: number;\n  readonly pmMaxSpeed: number;\n  readonly pmDuckSpeed: number;\n  readonly onLadder: boolean;\n  readonly waterlevel: WaterLevel;\n  readonly watertype: number;\n  readonly groundContents: number;\n  readonly viewPitch: number;\n  readonly ladderMod: number;\n  readonly pmWaterSpeed: number;\n}\n\nexport interface WaterMoveParams extends BaseMoveParams {\n  readonly cmd: PmoveCmd;\n  readonly forward: Vec3;\n  readonly right: Vec3;\n  readonly pmFlags: PmFlags;\n  readonly onGround: boolean;\n  readonly pmMaxSpeed: number;\n  readonly pmDuckSpeed: number;\n  readonly pmWaterAccelerate: number;\n  readonly pmWaterSpeed: number;\n  readonly onLadder: boolean;\n  readonly watertype: number;\n  readonly groundContents: number;\n  readonly waterlevel: WaterLevel;\n  readonly viewPitch: number;\n  readonly ladderMod: number;\n}\n\nexport interface WalkMoveParams extends BaseMoveParams {\n  readonly cmd: PmoveCmd;\n  readonly forward: Vec3;\n  readonly right: Vec3;\n  readonly pmFlags: PmFlags;\n  readonly onGround: boolean;\n  readonly gravity: number;\n  readonly pmType: PmType;\n  readonly pmAccelerate: number;\n  readonly pmMaxSpeed: number;\n  readonly pmDuckSpeed: number;\n  readonly onLadder: boolean;\n  readonly waterlevel: WaterLevel;\n  readonly watertype: number;\n  readonly groundContents: number;\n  readonly viewPitch: number;\n  readonly ladderMod: number;\n  readonly pmWaterSpeed: number;\n}\n\nconst DEFAULT_AIR_ACCELERATE = 1;\nconst WATER_DRIFT_SPEED = 60;\nconst DEFAULT_STEP_OVERBOUNCE = 1.01;\n\nexport function applyPmoveAirMove(params: AirMoveParams): StepSlideMoveOutcome {\n  const {\n    origin,\n    frametime,\n    mins,\n    maxs,\n    trace,\n    overbounce = DEFAULT_STEP_OVERBOUNCE,\n    stepSize,\n    maxBumps,\n    maxClipPlanes,\n    hasTime,\n    forward,\n    right,\n    cmd,\n    pmFlags,\n    onGround,\n    gravity,\n    pmType,\n    pmAccelerate,\n    pmAirAccelerate = DEFAULT_AIR_ACCELERATE,\n    pmMaxSpeed,\n    pmDuckSpeed,\n    onLadder,\n    waterlevel,\n    watertype,\n    groundContents,\n    viewPitch,\n    ladderMod,\n    pmWaterSpeed,\n  } = params;\n\n  let velocity = { ...params.velocity };\n  let wishvel = buildPlanarWishVelocity(forward, right, cmd);\n\n  wishvel = applyPmoveAddCurrents({\n    wishVelocity: wishvel,\n    onLadder,\n    onGround,\n    waterlevel,\n    watertype,\n    groundContents,\n    cmd,\n    viewPitch,\n    maxSpeed: hasPmFlag(pmFlags, PmFlag.Ducked) ? pmDuckSpeed : pmMaxSpeed,\n    ladderMod,\n    waterSpeed: pmWaterSpeed,\n    forward,\n    origin,\n    mins,\n    maxs,\n    trace,\n  });\n\n  const ducked = hasPmFlag(pmFlags, PmFlag.Ducked);\n  const maxSpeed = ducked ? pmDuckSpeed : pmMaxSpeed;\n\n  let wishdir = wishvel;\n  let wishspeed = lengthVec3(wishdir);\n  if (wishspeed !== 0) {\n    wishdir = normalizeVec3(wishdir);\n  }\n\n  if (wishspeed > maxSpeed) {\n    const scale = maxSpeed / wishspeed;\n    wishvel = scaleVec3(wishvel, scale);\n    wishspeed = maxSpeed;\n    if (wishspeed !== 0) {\n      wishdir = normalizeVec3(wishvel);\n    }\n  }\n\n  if (onLadder) {\n    velocity = applyPmoveAccelerate({ velocity, wishdir, wishspeed, accel: pmAccelerate, frametime });\n    if (Math.abs(wishvel.z) < Number.EPSILON) {\n      velocity = dampVerticalVelocity(velocity, gravity, frametime);\n    }\n    return runStepSlideMove({\n      origin,\n      velocity,\n      frametime,\n      mins,\n      maxs,\n      trace,\n      overbounce,\n      stepSize,\n      maxBumps,\n      maxClipPlanes,\n      hasTime,\n    });\n  }\n\n  if (onGround) {\n    velocity = { ...velocity, z: 0 };\n    velocity = applyPmoveAccelerate({ velocity, wishdir, wishspeed, accel: pmAccelerate, frametime });\n    if (gravity > 0) {\n      velocity = { ...velocity, z: 0 };\n    } else {\n      velocity = { ...velocity, z: velocity.z - gravity * frametime };\n    }\n\n    if (velocity.x === 0 && velocity.y === 0) {\n      return {\n        origin,\n        velocity,\n        planes: [],\n        blocked: 0,\n        stopped: true,\n        stepped: false,\n        stepHeight: 0,\n      };\n    }\n\n    return runStepSlideMove({\n      origin,\n      velocity,\n      frametime,\n      mins,\n      maxs,\n      trace,\n      overbounce,\n      stepSize,\n      maxBumps,\n      maxClipPlanes,\n      hasTime,\n    });\n  }\n\n  if (pmAirAccelerate > 0) {\n    velocity = applyPmoveAirAccelerate({\n      velocity,\n      wishdir,\n      wishspeed,\n      accel: pmAirAccelerate,\n      frametime,\n    });\n  } else {\n    velocity = applyPmoveAccelerate({ velocity, wishdir, wishspeed, accel: DEFAULT_AIR_ACCELERATE, frametime });\n  }\n\n  if (pmType !== PmType.Grapple) {\n    velocity = { ...velocity, z: velocity.z - gravity * frametime };\n  }\n\n  return runStepSlideMove({\n    origin,\n    velocity,\n    frametime,\n    mins,\n    maxs,\n    trace,\n    overbounce,\n    stepSize,\n    maxBumps,\n    maxClipPlanes,\n    hasTime,\n  });\n}\n\nexport function applyPmoveWaterMove(params: WaterMoveParams): StepSlideMoveOutcome {\n  const {\n    origin,\n    frametime,\n    mins,\n    maxs,\n    trace,\n    overbounce = DEFAULT_STEP_OVERBOUNCE,\n    stepSize,\n    maxBumps,\n    maxClipPlanes,\n    hasTime,\n    forward,\n    right,\n    cmd,\n    pmFlags,\n    onGround,\n    pmMaxSpeed,\n    pmDuckSpeed,\n    pmWaterAccelerate,\n    pmWaterSpeed,\n    onLadder,\n    watertype,\n    groundContents,\n    waterlevel,\n    viewPitch,\n    ladderMod,\n  } = params;\n\n  let velocity = { ...params.velocity };\n  let wishvel = buildFullWishVelocity(forward, right, cmd);\n\n  if (isIdleInWater(cmd, onGround)) {\n    wishvel = { ...wishvel, z: wishvel.z - WATER_DRIFT_SPEED };\n  } else {\n    if (hasButton(cmd, PlayerButton.Crouch)) {\n      wishvel = addVec3(wishvel, { x: 0, y: 0, z: -pmWaterSpeed * 0.5 });\n    } else if (hasButton(cmd, PlayerButton.Jump)) {\n      wishvel = addVec3(wishvel, { x: 0, y: 0, z: pmWaterSpeed * 0.5 });\n    }\n  }\n\n  wishvel = applyPmoveAddCurrents({\n    wishVelocity: wishvel,\n    onLadder,\n    onGround,\n    waterlevel,\n    watertype,\n    groundContents,\n    cmd,\n    viewPitch,\n    maxSpeed: hasPmFlag(pmFlags, PmFlag.Ducked) ? pmDuckSpeed : pmMaxSpeed,\n    ladderMod,\n    waterSpeed: pmWaterSpeed,\n    forward,\n    origin,\n    mins,\n    maxs,\n    trace,\n  });\n\n  let wishdir = wishvel;\n  let wishspeed = lengthVec3(wishdir);\n  if (wishspeed !== 0) {\n    wishdir = normalizeVec3(wishdir);\n  }\n\n  if (wishspeed > pmMaxSpeed) {\n    const scale = pmMaxSpeed / wishspeed;\n    wishvel = scaleVec3(wishvel, scale);\n    wishspeed = pmMaxSpeed;\n    if (wishspeed !== 0) {\n      wishdir = normalizeVec3(wishvel);\n    }\n  }\n\n  wishspeed *= 0.5;\n\n  const ducked = hasPmFlag(pmFlags, PmFlag.Ducked);\n  if (ducked && wishspeed > pmDuckSpeed) {\n    const scale = pmDuckSpeed / wishspeed;\n    wishvel = scaleVec3(wishvel, scale);\n    wishspeed = pmDuckSpeed;\n    if (wishspeed !== 0) {\n      wishdir = normalizeVec3(wishvel);\n    }\n  }\n\n  velocity = applyPmoveAccelerate({ velocity, wishdir, wishspeed, accel: pmWaterAccelerate, frametime });\n\n  return runStepSlideMove({\n    origin,\n    velocity,\n    frametime,\n    mins,\n    maxs,\n    trace,\n    overbounce,\n    stepSize,\n    maxBumps,\n    maxClipPlanes,\n    hasTime,\n  });\n}\n\nexport function applyPmoveWalkMove(params: WalkMoveParams): StepSlideMoveOutcome {\n  const {\n    origin,\n    frametime,\n    mins,\n    maxs,\n    trace,\n    overbounce = DEFAULT_STEP_OVERBOUNCE,\n    stepSize,\n    maxBumps,\n    maxClipPlanes,\n    hasTime,\n    forward,\n    right,\n    cmd,\n    pmFlags,\n    onGround,\n    gravity,\n    pmAccelerate,\n    pmMaxSpeed,\n    pmDuckSpeed,\n    onLadder,\n    waterlevel,\n    watertype,\n    groundContents,\n    viewPitch,\n    ladderMod,\n    pmWaterSpeed,\n  } = params;\n\n  let velocity = { ...params.velocity };\n  let wishvel = buildPlanarWishVelocity(forward, right, cmd);\n\n  wishvel = applyPmoveAddCurrents({\n    wishVelocity: wishvel,\n    onLadder,\n    onGround,\n    waterlevel,\n    watertype,\n    groundContents,\n    cmd,\n    viewPitch,\n    maxSpeed: hasPmFlag(pmFlags, PmFlag.Ducked) ? pmDuckSpeed : pmMaxSpeed,\n    ladderMod,\n    waterSpeed: pmWaterSpeed,\n    forward,\n    origin,\n    mins,\n    maxs,\n    trace,\n  });\n\n  const ducked = hasPmFlag(pmFlags, PmFlag.Ducked);\n  const maxSpeed = ducked ? pmDuckSpeed : pmMaxSpeed;\n\n  let wishdir = wishvel;\n  let wishspeed = lengthVec3(wishdir);\n  if (wishspeed !== 0) {\n    wishdir = normalizeVec3(wishdir);\n  }\n\n  if (wishspeed > maxSpeed) {\n    const scale = maxSpeed / wishspeed;\n    wishvel = scaleVec3(wishvel, scale);\n    wishspeed = maxSpeed;\n    if (wishspeed !== 0) {\n      wishdir = normalizeVec3(wishvel);\n    }\n  }\n\n  // Ground friction handled by caller (applyPmoveFriction)\n\n  velocity = { ...velocity, z: 0 };\n  velocity = applyPmoveAccelerate({ velocity, wishdir, wishspeed, accel: pmAccelerate, frametime });\n\n  if (gravity > 0) {\n    velocity = { ...velocity, z: 0 };\n  } else {\n    velocity = { ...velocity, z: velocity.z - gravity * frametime };\n  }\n\n  if (velocity.x === 0 && velocity.y === 0) {\n    return {\n      origin,\n      velocity,\n      planes: [],\n      blocked: 0,\n      stopped: true,\n      stepped: false,\n      stepHeight: 0,\n    };\n  }\n\n  return runStepSlideMove({\n    origin,\n    velocity,\n    frametime,\n    mins,\n    maxs,\n    trace,\n    overbounce,\n    stepSize,\n    maxBumps,\n    maxClipPlanes,\n    hasTime,\n  });\n}\n\nfunction buildPlanarWishVelocity(forward: Vec3, right: Vec3, cmd: PmoveCmd): Vec3 {\n  return {\n    x: forward.x * cmd.forwardmove + right.x * cmd.sidemove,\n    y: forward.y * cmd.forwardmove + right.y * cmd.sidemove,\n    z: 0,\n  } satisfies Vec3;\n}\n\nfunction buildFullWishVelocity(forward: Vec3, right: Vec3, cmd: PmoveCmd): Vec3 {\n  return {\n    x: forward.x * cmd.forwardmove + right.x * cmd.sidemove,\n    y: forward.y * cmd.forwardmove + right.y * cmd.sidemove,\n    z: forward.z * cmd.forwardmove + right.z * cmd.sidemove,\n  } satisfies Vec3;\n}\n\nfunction hasButton(cmd: PmoveCmd, button: PlayerButton): boolean {\n  return (cmd.buttons ?? 0) & button ? true : false;\n}\n\nfunction isIdleInWater(cmd: PmoveCmd, onGround: boolean): boolean {\n  const noMove = cmd.forwardmove === 0 && cmd.sidemove === 0;\n  const noButtons = (cmd.buttons ?? 0) & (PlayerButton.Jump | PlayerButton.Crouch) ? false : true;\n  return noMove && noButtons && !onGround;\n}\n\nfunction dampVerticalVelocity(velocity: Vec3, gravity: number, frametime: number): Vec3 {\n  let z = velocity.z;\n  const delta = gravity * frametime;\n  if (z > 0) {\n    z -= delta;\n    if (z < 0) {\n      z = 0;\n    }\n  } else {\n    z += delta;\n    if (z > 0) {\n      z = 0;\n    }\n  }\n  return { ...velocity, z };\n}\n\ninterface StepParams extends BaseMoveParams {\n  readonly velocity: Vec3;\n}\n\nfunction runStepSlideMove(params: StepParams): StepSlideMoveOutcome {\n  const { origin, velocity, frametime, mins, maxs, trace, overbounce = DEFAULT_STEP_OVERBOUNCE, stepSize, maxBumps, maxClipPlanes, hasTime } = params;\n  return stepSlideMove({\n    origin,\n    velocity,\n    frametime,\n    trace,\n    mins,\n    maxs,\n    overbounce,\n    stepSize,\n    maxBumps,\n    maxClipPlanes,\n    hasTime,\n  });\n}\n","import { MASK_WATER, CONTENTS_NONE, type ContentsFlag } from '../bsp/contents.js';\nimport type { Vec3 } from '../math/vec3.js';\nimport { WaterLevel } from './constants.js';\nimport type { PmovePointContentsFn } from './types.js';\n\nexport interface WaterLevelParams {\n  readonly origin: Vec3;\n  readonly mins: Vec3;\n  readonly viewheight: number;\n  readonly pointContents: PmovePointContentsFn;\n}\n\nexport interface WaterLevelResult {\n  readonly waterlevel: WaterLevel;\n  readonly watertype: ContentsFlag;\n}\n\n/**\n * Mirrors the rerelease `PM_GetWaterLevel` helper: probes the player's feet,\n * waist, and viewheight to determine how submerged they are and returns both\n * the enum level plus the contents bits encountered at the lowest sample.\n */\nexport function getWaterLevel(params: WaterLevelParams): WaterLevelResult {\n  const { origin, mins, viewheight, pointContents } = params;\n\n  const sample2 = viewheight - mins.z;\n  const sample1 = sample2 / 2;\n\n  const point: Vec3 = {\n    x: origin.x,\n    y: origin.y,\n    z: origin.z + mins.z + 1,\n  };\n\n  let contents = pointContents(point);\n  if ((contents & MASK_WATER) === 0) {\n    return { waterlevel: WaterLevel.None, watertype: CONTENTS_NONE };\n  }\n\n  const watertype = contents;\n  let waterlevel = WaterLevel.Feet;\n\n  let point2: Vec3 = { x: point.x, y: point.y, z: origin.z + mins.z + sample1 };\n  contents = pointContents(point2);\n  if ((contents & MASK_WATER) !== 0) {\n    waterlevel = WaterLevel.Waist;\n\n    let point3: Vec3 = { x: point.x, y: point.y, z: origin.z + mins.z + sample2 };\n    contents = pointContents(point3);\n    if ((contents & MASK_WATER) !== 0) {\n      waterlevel = WaterLevel.Under;\n    }\n  }\n\n  return { waterlevel, watertype };\n}\n","import { CONTENTS_NONE, type ContentsFlag } from '../bsp/contents.js';\nimport { addVec3, clipVelocityVec3, type Vec3 } from '../math/vec3.js';\nimport {\n  PmFlag,\n  type PmFlags,\n  PmType,\n  addPmFlag,\n  hasPmFlag,\n  removePmFlag,\n} from './constants.js';\nimport { getWaterLevel } from './water.js';\nimport type { PmovePointContentsFn, PmoveTraceFn, PmoveTraceResult } from './types.js';\n\nconst GROUND_PROBE_DISTANCE = 0.25;\nconst LADDER_BYPASS_VELOCITY = 180;\nconst TRICK_VELOCITY_THRESHOLD = 100;\nconst SLANTED_NORMAL_THRESHOLD = 0.7;\nconst TRICK_NORMAL_THRESHOLD = 0.9;\nconst TRICK_PM_TIME = 64;\nconst LAND_PM_TIME = 128;\nconst IMPACT_CLIP_OVERBOUNCE = 1.01;\n\nconst WATERJUMP_CLEAR =\n  PmFlag.TimeWaterJump | PmFlag.TimeLand | PmFlag.TimeTeleport | PmFlag.TimeTrick;\n\nexport interface CategorizePositionParams {\n  readonly pmType: PmType;\n  readonly pmFlags: PmFlags;\n  readonly pmTime: number;\n  readonly n64Physics: boolean;\n  readonly velocity: Vec3;\n  readonly startVelocity: Vec3;\n  readonly origin: Vec3;\n  readonly mins: Vec3;\n  readonly maxs: Vec3;\n  readonly viewheight: number;\n  readonly trace: PmoveTraceFn;\n  readonly pointContents: PmovePointContentsFn;\n}\n\nexport interface CategorizePositionResult {\n  readonly pmFlags: PmFlags;\n  readonly pmTime: number;\n  readonly onGround: boolean;\n  readonly groundTrace?: PmoveTraceResult;\n  readonly groundContents: ContentsFlag;\n  readonly waterlevel: number;\n  readonly watertype: ContentsFlag;\n  readonly impactDelta?: number;\n}\n\n/**\n * Pure mirror of PM_CatagorizePosition from `rerelease/p_move.cpp`: traces a quarter-unit\n * below the player bounds to determine whether they stand on solid ground, updates timers\n * and pmflags accordingly, records the latest ground plane data, and recalculates waterlevel\n * by probing feet/waist/viewheight samples.\n */\nexport function categorizePosition(params: CategorizePositionParams): CategorizePositionResult {\n  const {\n    pmType,\n    n64Physics,\n    velocity,\n    startVelocity,\n    origin,\n    mins,\n    maxs,\n    viewheight,\n    trace,\n    pointContents,\n  } = params;\n\n  let pmFlags = params.pmFlags;\n  let pmTime = params.pmTime;\n  let impactDelta: number | undefined;\n  let onGround = hasPmFlag(pmFlags, PmFlag.OnGround);\n\n  let groundTrace: PmoveTraceResult | undefined;\n  let groundContents: ContentsFlag = CONTENTS_NONE;\n\n  const forceAirborne = velocity.z > LADDER_BYPASS_VELOCITY || pmType === PmType.Grapple;\n\n  if (forceAirborne) {\n    pmFlags = removePmFlag(pmFlags, PmFlag.OnGround);\n    onGround = false;\n  } else {\n    const end: Vec3 = { x: origin.x, y: origin.y, z: origin.z - GROUND_PROBE_DISTANCE };\n    const traceResult = trace(origin, end, mins, maxs);\n    groundTrace = traceResult;\n    groundContents = traceResult.contents ?? CONTENTS_NONE;\n\n    const planeNormal = traceResult.planeNormal;\n\n    let slantedGround =\n      traceResult.fraction < 1 && !!planeNormal && planeNormal.z < SLANTED_NORMAL_THRESHOLD;\n\n    if (slantedGround && planeNormal) {\n      const slantEnd = addVec3(origin, planeNormal);\n      const slantTrace = trace(origin, slantEnd, mins, maxs);\n      if (slantTrace.fraction < 1 && !slantTrace.startsolid) {\n        slantedGround = false;\n      }\n    }\n\n    if (\n      traceResult.fraction === 1 ||\n      !planeNormal ||\n      (slantedGround && !traceResult.startsolid)\n    ) {\n      pmFlags = removePmFlag(pmFlags, PmFlag.OnGround);\n      onGround = false;\n    } else {\n      onGround = true;\n\n      if (hasPmFlag(pmFlags, PmFlag.TimeWaterJump)) {\n        pmFlags &= ~WATERJUMP_CLEAR;\n        pmTime = 0;\n      }\n\n      const wasOnGround = hasPmFlag(pmFlags, PmFlag.OnGround);\n\n      if (!wasOnGround) {\n        if (\n          !n64Physics &&\n          velocity.z >= TRICK_VELOCITY_THRESHOLD &&\n          planeNormal.z >= TRICK_NORMAL_THRESHOLD &&\n          !hasPmFlag(pmFlags, PmFlag.Ducked)\n        ) {\n          pmFlags = addPmFlag(pmFlags, PmFlag.TimeTrick);\n          pmTime = TRICK_PM_TIME;\n        }\n\n        const clipped = clipVelocityVec3(velocity, planeNormal, IMPACT_CLIP_OVERBOUNCE);\n        impactDelta = startVelocity.z - clipped.z;\n      }\n\n      pmFlags = addPmFlag(pmFlags, PmFlag.OnGround);\n\n      if (!wasOnGround && (n64Physics || hasPmFlag(pmFlags, PmFlag.Ducked))) {\n        pmFlags = addPmFlag(pmFlags, PmFlag.TimeLand);\n        pmTime = LAND_PM_TIME;\n      }\n    }\n  }\n\n  const { waterlevel, watertype } = getWaterLevel({\n    origin,\n    mins,\n    viewheight,\n    pointContents,\n  });\n\n  return {\n    pmFlags,\n    pmTime,\n    onGround: hasPmFlag(pmFlags, PmFlag.OnGround),\n    groundTrace,\n    groundContents,\n    waterlevel,\n    watertype,\n    impactDelta,\n  };\n}\n","import type { Vec3 } from '../math/vec3.js';\nimport { PmFlag, type PmFlags, PmType } from './constants.js';\n\nexport interface PlayerDimensions {\n  readonly mins: Vec3;\n  readonly maxs: Vec3;\n  readonly viewheight: number;\n}\n\nfunction createVec3(x: number, y: number, z: number): Vec3 {\n  return { x, y, z } satisfies Vec3;\n}\n\n/**\n * Pure mirror of PM_SetDimensions from rerelease `p_move.cpp`.\n * Computes the mins/maxs/viewheight triplet for a player based on\n * their movement type and ducked flag without mutating inputs.\n */\nexport function computePlayerDimensions(pmType: PmType, pmFlags: PmFlags): PlayerDimensions {\n  const minsBase = createVec3(-16, -16, 0);\n  const maxsBase = createVec3(16, 16, 16);\n\n  if (pmType === PmType.Gib) {\n    return {\n      mins: minsBase,\n      maxs: maxsBase,\n      viewheight: 8,\n    } satisfies PlayerDimensions;\n  }\n\n  const ducked = pmType === PmType.Dead || (pmFlags & PmFlag.Ducked) !== 0;\n  const mins = createVec3(minsBase.x, minsBase.y, -24);\n  const maxs = createVec3(maxsBase.x, maxsBase.y, ducked ? 4 : 32);\n\n  return {\n    mins,\n    maxs,\n    viewheight: ducked ? -2 : 22,\n  } satisfies PlayerDimensions;\n}\n","import { MASK_SOLID, MASK_WATER, type ContentsFlag } from '../bsp/contents.js';\nimport type { Vec3 } from '../math/vec3.js';\nimport {\n  PlayerButton,\n  PmFlag,\n  type PmFlags,\n  PmType,\n  WaterLevel,\n  addPmFlag,\n  hasPmFlag,\n  removePmFlag,\n} from './constants.js';\nimport type { PmoveTraceResult } from './types.js';\nimport { computePlayerDimensions, type PlayerDimensions } from './dimensions.js';\n\nconst CROUCH_MAX_Z = 4;\nconst STAND_MAX_Z = 32;\nconst ABOVE_WATER_OFFSET = 8;\n\nexport interface DuckTraceParams {\n  readonly start: Vec3;\n  readonly end: Vec3;\n  readonly mins: Vec3;\n  readonly maxs: Vec3;\n  readonly mask: ContentsFlag;\n}\n\nexport type DuckTraceFn = (params: DuckTraceParams) => PmoveTraceResult;\n\nexport interface CheckDuckParams {\n  readonly pmType: PmType;\n  readonly pmFlags: PmFlags;\n  readonly buttons: number;\n  readonly waterlevel: WaterLevel;\n  readonly hasGroundEntity: boolean;\n  readonly onLadder: boolean;\n  readonly n64Physics: boolean;\n  readonly origin: Vec3;\n  readonly mins: Vec3;\n  readonly maxs: Vec3;\n  readonly trace: DuckTraceFn;\n}\n\nexport interface CheckDuckResult extends PlayerDimensions {\n  readonly pmFlags: PmFlags;\n  readonly ducked: boolean;\n  readonly changed: boolean;\n}\n\n/**\n * Pure port of PM_CheckDuck from rerelease `p_move.cpp`. Updates the PMF_DUCKED flag\n * based on crouch input, obstruction traces, and special cases (dead bodies) without\n * mutating the provided mins/maxs. Returns the updated flag word plus the dimensions\n * computed from PM_SetDimensions so callers can update collision bounds atomically.\n */\nexport function checkDuckState(params: CheckDuckParams): CheckDuckResult {\n  const { pmType } = params;\n\n  if (pmType === PmType.Gib) {\n    const dims = computePlayerDimensions(pmType, params.pmFlags);\n    return { pmFlags: params.pmFlags, ducked: hasPmFlag(params.pmFlags, PmFlag.Ducked), changed: false, ...dims };\n  }\n\n  let flags = params.pmFlags;\n  let changed = false;\n\n  if (pmType === PmType.Dead) {\n    if (!hasPmFlag(flags, PmFlag.Ducked)) {\n      flags = addPmFlag(flags, PmFlag.Ducked);\n      changed = true;\n    }\n  } else if (shouldDuck(params)) {\n    if (!hasPmFlag(flags, PmFlag.Ducked) && !isDuckBlocked(params)) {\n      flags = addPmFlag(flags, PmFlag.Ducked);\n      changed = true;\n    }\n  } else if (hasPmFlag(flags, PmFlag.Ducked) && !isStandBlocked(params)) {\n    flags = removePmFlag(flags, PmFlag.Ducked);\n    changed = true;\n  }\n\n  const dims = computePlayerDimensions(pmType, flags);\n  const ducked = pmType === PmType.Dead || hasPmFlag(flags, PmFlag.Ducked);\n\n  return { pmFlags: flags, ducked, changed, ...dims };\n}\n\nfunction shouldDuck(params: CheckDuckParams): boolean {\n  if ((params.buttons & PlayerButton.Crouch) === 0) {\n    return false;\n  }\n  if (params.onLadder || params.n64Physics) {\n    return false;\n  }\n  if (params.hasGroundEntity) {\n    return true;\n  }\n  if (params.waterlevel <= WaterLevel.Feet && !isAboveWater(params)) {\n    return true;\n  }\n  return false;\n}\n\nfunction isDuckBlocked(params: CheckDuckParams): boolean {\n  const trace = params.trace({\n    start: params.origin,\n    end: params.origin,\n    mins: params.mins,\n    maxs: withZ(params.maxs, CROUCH_MAX_Z),\n    mask: MASK_SOLID,\n  });\n  return trace.allsolid;\n}\n\nfunction isStandBlocked(params: CheckDuckParams): boolean {\n  const trace = params.trace({\n    start: params.origin,\n    end: params.origin,\n    mins: params.mins,\n    maxs: withZ(params.maxs, STAND_MAX_Z),\n    mask: MASK_SOLID,\n  });\n  return trace.allsolid;\n}\n\nfunction isAboveWater(params: CheckDuckParams): boolean {\n  const below: Vec3 = { x: params.origin.x, y: params.origin.y, z: params.origin.z - ABOVE_WATER_OFFSET };\n\n  const solidTrace = params.trace({\n    start: params.origin,\n    end: below,\n    mins: params.mins,\n    maxs: params.maxs,\n    mask: MASK_SOLID,\n  });\n\n  if (solidTrace.fraction < 1) {\n    return false;\n  }\n\n  const waterTrace = params.trace({\n    start: params.origin,\n    end: below,\n    mins: params.mins,\n    maxs: params.maxs,\n    mask: MASK_WATER,\n  });\n\n  return waterTrace.fraction < 1;\n}\n\nfunction withZ(vec: Vec3, z: number): Vec3 {\n  return { x: vec.x, y: vec.y, z };\n}\n","import type { Vec3 } from '../math/vec3.js';\nimport { addVec3, dotVec3, lengthVec3, normalizeVec3, scaleVec3 } from '../math/vec3.js';\nimport { angleVectors } from '../math/angles.js';\nimport type {\n  PmoveAccelerateParams,\n  PmoveCmd,\n  PmoveFrictionParams,\n  PmoveWishParams,\n  PmoveWishResult,\n  PmoveState,\n  PmoveImports,\n  PmoveTraceResult\n} from './types.js';\nimport { PlayerButton, PmFlag, PmType, addPmFlag, removePmFlag } from './constants.js';\nimport { checkJump } from './jump.js';\nimport { applyPmoveAirMove, applyPmoveWaterMove, applyPmoveWalkMove } from './move.js';\nimport { categorizePosition } from './categorize.js';\nimport { checkDuckState, DuckTraceParams } from './duck.js';\n// import { updateViewOffsets } from './view.js';\n\nconst FRAMETIME = 0.025; // Define FRAMETIME here or import if available in constants? Using local definition for now as per previous context.\n\n/**\n * Pure version of PM_Friction from rerelease p_move.cpp.\n * Handles ground and water friction and returns a new velocity.\n */\nexport function applyPmoveFriction(params: PmoveFrictionParams): Vec3 {\n  const {\n    velocity,\n    frametime,\n    onGround,\n    groundIsSlick,\n    onLadder,\n    waterlevel,\n    pmFriction,\n    pmStopSpeed,\n    pmWaterFriction,\n  } = params;\n\n  const speed = lengthVec3(velocity);\n\n  // Matches the \"if (speed < 1)\" early-out: clears X/Y but preserves Z.\n  if (speed < 1) {\n    return { x: 0, y: 0, z: velocity.z };\n  }\n\n  let drop = 0;\n\n  // Ground friction (or ladder)\n  if ((onGround && !groundIsSlick) || onLadder) {\n    const control = speed < pmStopSpeed ? pmStopSpeed : speed;\n    const friction = pmFriction;\n    drop += control * friction * frametime;\n  }\n\n  // Water friction (only when not on ladder)\n  if (waterlevel > 0 && !onLadder) {\n    drop += speed * pmWaterFriction * waterlevel * frametime;\n  }\n\n  let newspeed = speed - drop;\n  if (newspeed < 0) {\n    newspeed = 0;\n  }\n\n  if (newspeed === speed) {\n    return velocity;\n  }\n\n  const scale = newspeed / speed;\n  return scaleVec3(velocity, scale);\n}\n\n/**\n * Pure version of PM_Accelerate from rerelease p_move.cpp.\n * Returns a new velocity with wishdir/wishspeed acceleration applied.\n */\nexport function applyPmoveAccelerate(params: PmoveAccelerateParams): Vec3 {\n  const { velocity, wishdir, wishspeed, accel, frametime } = params;\n\n  const currentSpeed = dotVec3(velocity, wishdir);\n  const addSpeed = wishspeed - currentSpeed;\n\n  if (addSpeed <= 0) {\n    return velocity;\n  }\n\n  let accelSpeed = accel * frametime * wishspeed;\n  if (accelSpeed > addSpeed) {\n    accelSpeed = addSpeed;\n  }\n\n  return {\n    x: velocity.x + wishdir.x * accelSpeed,\n    y: velocity.y + wishdir.y * accelSpeed,\n    z: velocity.z + wishdir.z * accelSpeed,\n  };\n}\n\n/**\n * Mirrors PM_AirAccelerate in rerelease `p_move.cpp` (lines ~612-636): wishspeed is clamped\n * to 30 for the addspeed calculation but the acceleration magnitude still uses the full wishspeed.\n */\nexport function applyPmoveAirAccelerate(params: PmoveAccelerateParams): Vec3 {\n  const { velocity, wishdir, wishspeed, accel, frametime } = params;\n\n  const wishspd = Math.min(wishspeed, 30);\n  const currentSpeed = dotVec3(velocity, wishdir);\n  const addSpeed = wishspd - currentSpeed;\n\n  if (addSpeed <= 0) {\n    return velocity;\n  }\n\n  let accelSpeed = accel * wishspeed * frametime;\n  if (accelSpeed > addSpeed) {\n    accelSpeed = addSpeed;\n  }\n\n  return {\n    x: velocity.x + wishdir.x * accelSpeed,\n    y: velocity.y + wishdir.y * accelSpeed,\n    z: velocity.z + wishdir.z * accelSpeed,\n  };\n}\n\n/**\n * Pure mirror of PM_CmdScale from rerelease `p_move.cpp`. Computes the scalar applied to\n * the command directional inputs so that the resulting wish velocity caps at `maxSpeed`\n * regardless of the directional mix.\n */\nexport function pmoveCmdScale(cmd: PmoveCmd, maxSpeed: number): number {\n  const forward = Math.abs(cmd.forwardmove);\n  const side = Math.abs(cmd.sidemove);\n  const up = Math.abs(cmd.upmove);\n\n  const max = Math.max(forward, side, up);\n  if (max === 0) {\n    return 0;\n  }\n\n  const total = Math.sqrt(cmd.forwardmove * cmd.forwardmove + cmd.sidemove * cmd.sidemove + cmd.upmove * cmd.upmove);\n  return (maxSpeed * max) / (127 * total);\n}\n\n/**\n * Computes wishdir/wishspeed for ground/air movement as done in PM_AirMove and\n * PM_GroundMove. Z is forced to zero and wishspeed is clamped to maxSpeed, matching\n * the rerelease p_move.cpp helpers before they call PM_Accelerate/PM_AirAccelerate.\n */\nexport function buildAirGroundWish(params: PmoveWishParams): PmoveWishResult {\n  const { forward, right, cmd, maxSpeed } = params;\n\n  let wishvel = {\n    x: forward.x * cmd.forwardmove + right.x * cmd.sidemove,\n    y: forward.y * cmd.forwardmove + right.y * cmd.sidemove,\n    z: 0,\n  } satisfies Vec3;\n\n  let wishspeed = lengthVec3(wishvel);\n  if (wishspeed > maxSpeed) {\n    const scale = maxSpeed / wishspeed;\n    wishvel = scaleVec3(wishvel, scale);\n    wishspeed = maxSpeed;\n  }\n\n  return {\n    wishdir: wishspeed === 0 ? wishvel : normalizeVec3(wishvel),\n    wishspeed,\n  };\n}\n\n/**\n * Computes the wishdir/wishspeed mix for water movement, matching PM_WaterMove in\n * rerelease p_move.cpp: includes the upward bias when no strong upmove is requested,\n * clamps wishspeed to maxSpeed, and halves the returned wishspeed before acceleration.\n */\nexport function buildWaterWish(params: PmoveWishParams): PmoveWishResult {\n  const { forward, right, cmd, maxSpeed } = params;\n\n  // Use full 3D components for water movement\n  let wishvel = {\n    x: forward.x * cmd.forwardmove + right.x * cmd.sidemove,\n    y: forward.y * cmd.forwardmove + right.y * cmd.sidemove,\n    z: forward.z * cmd.forwardmove + right.z * cmd.sidemove,\n  } satisfies Vec3;\n\n  if (cmd.upmove > 10) {\n    wishvel = addVec3(wishvel, { x: 0, y: 0, z: cmd.upmove });\n  } else if (cmd.upmove < -10) {\n    wishvel = addVec3(wishvel, { x: 0, y: 0, z: cmd.upmove });\n  } else if (Math.abs(cmd.forwardmove) < 10 && Math.abs(cmd.sidemove) < 10) {\n    // Standard drift down when no vertical input AND no significant horizontal input\n    // Matches Quake 2 rerelease behavior (sinking slowly)\n    wishvel = addVec3(wishvel, { x: 0, y: 0, z: -60 });\n  } else {\n    // When moving horizontally but not vertically, drift slightly up\n    // This matches the \"else { wishvel[2] += 10 }\" logic in PM_WaterMove\n    wishvel = addVec3(wishvel, { x: 0, y: 0, z: 10 });\n  }\n\n  let wishspeed = lengthVec3(wishvel);\n  if (wishspeed > maxSpeed) {\n    const scale = maxSpeed / wishspeed;\n    wishvel = scaleVec3(wishvel, scale);\n    wishspeed = maxSpeed;\n  }\n\n  wishspeed *= 0.5;\n\n  return {\n    wishdir: wishspeed === 0 ? wishvel : normalizeVec3(wishvel),\n    wishspeed,\n  };\n}\n\n/**\n * Runs the full player movement simulation for a single frame.\n */\nexport function runPmove(state: PmoveState, imports: PmoveImports): PmoveState {\n  if (state.pmType === PmType.Dead) {\n    return state;\n  }\n\n  let nextState = { ...state };\n\n  // Categorize Position\n  const catResult = categorizePosition({\n    pmType: nextState.pmType,\n    pmFlags: nextState.pmFlags,\n    pmTime: 0,\n    n64Physics: false,\n    velocity: nextState.velocity,\n    startVelocity: nextState.velocity,\n    origin: nextState.origin,\n    mins: nextState.mins,\n    maxs: nextState.maxs,\n    viewheight: nextState.viewHeight,\n    trace: imports.trace,\n    pointContents: imports.pointcontents\n  });\n\n  // Merge result back to state\n  nextState.pmFlags = catResult.pmFlags;\n  nextState.waterlevel = catResult.waterlevel;\n  nextState.watertype = catResult.watertype;\n\n  // Check Ducking (Before Jump)\n  const duckResult = checkDuckState({\n    pmType: nextState.pmType,\n    pmFlags: nextState.pmFlags,\n    buttons: nextState.cmd.buttons,\n    waterlevel: nextState.waterlevel,\n    hasGroundEntity: (nextState.pmFlags & PmFlag.OnGround) !== 0,\n    onLadder: false,\n    n64Physics: false,\n    origin: nextState.origin,\n    mins: nextState.mins,\n    maxs: nextState.maxs,\n    trace: (params: DuckTraceParams): PmoveTraceResult => {\n      // Adapter from DuckTraceFn (obj) to PmoveTraceFn (args)\n      return imports.trace(params.start, params.end, params.mins, params.maxs);\n    }\n  });\n\n  nextState.pmFlags = duckResult.pmFlags;\n  nextState.mins = duckResult.mins;\n  nextState.maxs = duckResult.maxs;\n  nextState.viewHeight = duckResult.viewheight;\n\n  // Check Jump\n  const jumpResult = checkJump({\n    pmFlags: nextState.pmFlags,\n    pmType: nextState.pmType,\n    buttons: nextState.cmd.buttons,\n    waterlevel: nextState.waterlevel,\n    onGround: (nextState.pmFlags & PmFlag.OnGround) !== 0,\n    velocity: nextState.velocity,\n    origin: nextState.origin\n  });\n\n  nextState.pmFlags = jumpResult.pmFlags;\n  nextState.velocity = jumpResult.velocity;\n  nextState.origin = jumpResult.origin;\n\n  if (jumpResult.onGround !== ((nextState.pmFlags & PmFlag.OnGround) !== 0)) {\n     if (jumpResult.onGround) {\n       nextState.pmFlags = addPmFlag(nextState.pmFlags, PmFlag.OnGround);\n     } else {\n       nextState.pmFlags = removePmFlag(nextState.pmFlags, PmFlag.OnGround);\n     }\n  }\n\n  // Frictional movement\n  const onGround = (nextState.pmFlags & PmFlag.OnGround) !== 0;\n\n  // Apply friction\n  const velocityBeforeFriction = nextState.velocity;\n  nextState.velocity = applyPmoveFriction({\n      velocity: nextState.velocity,\n      frametime: FRAMETIME,\n      onGround,\n      groundIsSlick: false,\n      onLadder: false, // Defaulting to false for now as ladder logic is complex\n      waterlevel: nextState.waterlevel,\n      pmFriction: 6, // Default\n      pmStopSpeed: 100, // Default\n      pmWaterFriction: 1 // Default\n  });\n\n  // Calculate view vectors from angles\n  const { forward, right } = angleVectors(nextState.viewAngles);\n\n  if (nextState.pmType === PmType.NoClip) {\n    // PM_NoclipMove\n    // Simplified noclip\n    const wishvel = {\n         x: forward.x * nextState.cmd.forwardmove + right.x * nextState.cmd.sidemove,\n         y: forward.y * nextState.cmd.forwardmove + right.y * nextState.cmd.sidemove,\n         z: nextState.cmd.upmove\n    };\n    const scale = FRAMETIME; // Just move by velocity\n    // Actually we need to apply velocity based on input\n    // But sticking to just what's needed for jumping/movement:\n    nextState.velocity = wishvel; // Simple override for noclip\n    nextState.origin = {\n        x: nextState.origin.x + wishvel.x * scale,\n        y: nextState.origin.y + wishvel.y * scale,\n        z: nextState.origin.z + wishvel.z * scale\n    };\n\n  } else if (nextState.waterlevel >= 2) {\n    const outcome = applyPmoveWaterMove({\n        origin: nextState.origin,\n        velocity: nextState.velocity,\n        frametime: FRAMETIME,\n        mins: nextState.mins,\n        maxs: nextState.maxs,\n        trace: imports.trace,\n        cmd: nextState.cmd,\n        forward,\n        right,\n        pmFlags: nextState.pmFlags,\n        onGround,\n        pmMaxSpeed: 300,\n        pmDuckSpeed: 100,\n        pmWaterAccelerate: 4,\n        pmWaterSpeed: 400,\n        onLadder: false,\n        watertype: nextState.watertype,\n        groundContents: 0, // Should be passed in?\n        waterlevel: nextState.waterlevel,\n        viewPitch: nextState.viewAngles.x,\n        ladderMod: 1,\n        stepSize: 18 // Added stepSize for consistency, though water move might not use it heavily\n    });\n    nextState.origin = outcome.origin;\n    nextState.velocity = outcome.velocity;\n\n  } else if ((nextState.pmFlags & PmFlag.OnGround) === 0) {\n     const outcome = applyPmoveAirMove({\n        origin: nextState.origin,\n        velocity: nextState.velocity,\n        frametime: FRAMETIME,\n        mins: nextState.mins,\n        maxs: nextState.maxs,\n        trace: imports.trace,\n        cmd: nextState.cmd,\n        forward,\n        right,\n        pmFlags: nextState.pmFlags,\n        onGround,\n        gravity: nextState.gravity,\n        pmType: nextState.pmType,\n        pmAccelerate: 10,\n        pmAirAccelerate: 1,\n        pmMaxSpeed: 300,\n        pmDuckSpeed: 100,\n        onLadder: false,\n        waterlevel: nextState.waterlevel,\n        watertype: nextState.watertype,\n        groundContents: 0,\n        viewPitch: nextState.viewAngles.x,\n        ladderMod: 1,\n        pmWaterSpeed: 400,\n        stepSize: 18 // Added stepSize\n    });\n    nextState.origin = outcome.origin;\n    nextState.velocity = outcome.velocity;\n\n  } else {\n     const outcome = applyPmoveWalkMove({\n        origin: nextState.origin,\n        velocity: nextState.velocity,\n        frametime: FRAMETIME,\n        mins: nextState.mins,\n        maxs: nextState.maxs,\n        trace: imports.trace,\n        cmd: nextState.cmd,\n        forward,\n        right,\n        pmFlags: nextState.pmFlags,\n        onGround,\n        gravity: nextState.gravity,\n        pmType: nextState.pmType,\n        pmAccelerate: 10,\n        pmMaxSpeed: 300,\n        pmDuckSpeed: 100,\n        onLadder: false,\n        waterlevel: nextState.waterlevel,\n        watertype: nextState.watertype,\n        groundContents: 0,\n        viewPitch: nextState.viewAngles.x,\n        ladderMod: 1,\n        pmWaterSpeed: 400,\n        stepSize: 18 // Added stepSize\n    });\n    nextState.origin = outcome.origin;\n    nextState.velocity = outcome.velocity;\n  }\n\n  // Categorize Position again at end of frame\n  const catResultEnd = categorizePosition({\n    pmType: nextState.pmType,\n    pmFlags: nextState.pmFlags,\n    pmTime: 0,\n    n64Physics: false,\n    velocity: nextState.velocity,\n    startVelocity: nextState.velocity,\n    origin: nextState.origin,\n    mins: nextState.mins,\n    maxs: nextState.maxs,\n    viewheight: nextState.viewHeight,\n    trace: imports.trace,\n    pointContents: imports.pointcontents\n  });\n\n  nextState.pmFlags = catResultEnd.pmFlags;\n  nextState.waterlevel = catResultEnd.waterlevel;\n  nextState.watertype = catResultEnd.watertype;\n\n  // Update view offsets (bobbing, etc)\n  // nextState = updateViewOffsets(nextState);\n\n  return nextState;\n}\n","import {\n  addVec3,\n  lengthSquaredVec3,\n  scaleVec3,\n  subtractVec3,\n  type Vec3,\n} from '../math/vec3.js';\nimport type { PmoveTraceResult } from './types.js';\n\nconst AXES = ['x', 'y', 'z'] as const;\ntype Axis = (typeof AXES)[number];\n\ntype AxisTuple = readonly [number, number, number];\ntype SideBoundCode = -1 | 0 | 1;\n\ninterface SideCheck {\n  readonly normal: AxisTuple;\n  readonly mins: readonly [SideBoundCode, SideBoundCode, SideBoundCode];\n  readonly maxs: readonly [SideBoundCode, SideBoundCode, SideBoundCode];\n}\n\nconst SIDE_CHECKS: readonly SideCheck[] = [\n  { normal: [0, 0, 1], mins: [-1, -1, 0], maxs: [1, 1, 0] },\n  { normal: [0, 0, -1], mins: [-1, -1, 0], maxs: [1, 1, 0] },\n  { normal: [1, 0, 0], mins: [0, -1, -1], maxs: [0, 1, 1] },\n  { normal: [-1, 0, 0], mins: [0, -1, -1], maxs: [0, 1, 1] },\n  { normal: [0, 1, 0], mins: [-1, 0, -1], maxs: [1, 0, 1] },\n  { normal: [0, -1, 0], mins: [-1, 0, -1], maxs: [1, 0, 1] },\n];\n\nexport interface FixStuckParams {\n  readonly origin: Vec3;\n  readonly mins: Vec3;\n  readonly maxs: Vec3;\n  readonly trace: FixStuckTraceFn;\n}\n\nexport type FixStuckResult = 'good-position' | 'fixed' | 'no-good-position';\n\nexport interface FixStuckOutcome {\n  readonly result: FixStuckResult;\n  readonly origin: Vec3;\n}\n\nexport type FixStuckTraceFn = (\n  start: Vec3,\n  mins: Vec3,\n  maxs: Vec3,\n  end: Vec3,\n) => PmoveTraceResult;\n\ninterface CandidatePosition {\n  readonly distance: number;\n  readonly origin: Vec3;\n}\n\nconst ZERO_VEC: Vec3 = { x: 0, y: 0, z: 0 };\n\ntype MutableVec3 = { x: number; y: number; z: number };\n\nfunction cloneMutable(vec: Vec3): MutableVec3 {\n  return { x: vec.x, y: vec.y, z: vec.z };\n}\n\nfunction tupleToVec3(tuple: AxisTuple): Vec3 {\n  return { x: tuple[0], y: tuple[1], z: tuple[2] };\n}\n\nfunction adjustAxis(vec: MutableVec3, axis: Axis, delta: number): void {\n  if (delta === 0) return;\n  switch (axis) {\n    case 'x':\n      vec.x += delta;\n      break;\n    case 'y':\n      vec.y += delta;\n      break;\n    case 'z':\n      vec.z += delta;\n      break;\n  }\n}\n\nfunction setAxis(vec: MutableVec3, axis: Axis, value: number): void {\n  switch (axis) {\n    case 'x':\n      vec.x = value;\n      break;\n    case 'y':\n      vec.y = value;\n      break;\n    case 'z':\n      vec.z = value;\n      break;\n  }\n}\n\nfunction axisValue(vec: Vec3, axis: Axis): number {\n  switch (axis) {\n    case 'x':\n      return vec.x;\n    case 'y':\n      return vec.y;\n    case 'z':\n    default:\n      return vec.z;\n  }\n}\n\nfunction boundValue(code: SideBoundCode, axis: Axis, mins: Vec3, maxs: Vec3): number {\n  if (code === -1) {\n    return axisValue(mins, axis);\n  }\n  if (code === 1) {\n    return axisValue(maxs, axis);\n  }\n  return 0;\n}\n\nfunction applySideOffset(base: Vec3, side: SideCheck, mins: Vec3, maxs: Vec3): MutableVec3 {\n  const result = cloneMutable(base);\n  for (let i = 0; i < AXES.length; i++) {\n    const axis = AXES[i];\n    const normal = side.normal[i];\n    if (normal < 0) {\n      adjustAxis(result, axis, axisValue(mins, axis));\n    } else if (normal > 0) {\n      adjustAxis(result, axis, axisValue(maxs, axis));\n    }\n  }\n  return result;\n}\n\nfunction buildSideBounds(side: SideCheck, mins: Vec3, maxs: Vec3): { mins: MutableVec3; maxs: MutableVec3 } {\n  const localMins = cloneMutable(ZERO_VEC);\n  const localMaxs = cloneMutable(ZERO_VEC);\n  for (let i = 0; i < AXES.length; i++) {\n    const axis = AXES[i];\n    setAxis(localMins, axis, boundValue(side.mins[i], axis, mins, maxs));\n    setAxis(localMaxs, axis, boundValue(side.maxs[i], axis, mins, maxs));\n  }\n  return { mins: localMins, maxs: localMaxs };\n}\n\nfunction addEpsilon(\n  source: MutableVec3,\n  axis: Axis | undefined,\n  direction: number,\n): MutableVec3 {\n  if (!axis || direction === 0) {\n    return source;\n  }\n  const clone = cloneMutable(source);\n  adjustAxis(clone, axis, direction);\n  return clone;\n}\n\nfunction addEpsilonImmutable(vec: Vec3, axis: Axis | undefined, direction: number): Vec3 {\n  if (!axis || direction === 0) {\n    return vec;\n  }\n  switch (axis) {\n    case 'x':\n      return { ...vec, x: vec.x + direction };\n    case 'y':\n      return { ...vec, y: vec.y + direction };\n    case 'z':\n    default:\n      return { ...vec, z: vec.z + direction };\n  }\n}\n\n/**\n * TypeScript port of G_FixStuckObject_Generic from rerelease p_move.cpp. Attempts to\n * nudge a stuck bounding box out of solid space by probing the faces of the box and\n * moving towards the opposite side, keeping the smallest successful displacement.\n */\nexport function fixStuckObjectGeneric(params: FixStuckParams): FixStuckOutcome {\n  const { origin, mins, maxs, trace } = params;\n\n  const initial = trace(origin, mins, maxs, origin);\n  if (!initial.startsolid) {\n    return { result: 'good-position', origin: { ...origin } };\n  }\n\n  const candidates: CandidatePosition[] = [];\n\n  for (let i = 0; i < SIDE_CHECKS.length; i++) {\n    const side = SIDE_CHECKS[i];\n    const { mins: localMins, maxs: localMaxs } = buildSideBounds(side, mins, maxs);\n\n    let start = applySideOffset(origin, side, mins, maxs);\n    let tr = trace(start, localMins, localMaxs, start);\n\n    let epsilonAxis: Axis | undefined;\n    let epsilonDir = 0;\n\n    if (tr.startsolid) {\n      for (let axisIndex = 0; axisIndex < AXES.length; axisIndex++) {\n        if (side.normal[axisIndex] !== 0) {\n          continue;\n        }\n        const axis = AXES[axisIndex];\n        let epsilonStart = cloneMutable(start);\n        adjustAxis(epsilonStart, axis, 1);\n        tr = trace(epsilonStart, localMins, localMaxs, epsilonStart);\n        if (!tr.startsolid) {\n          start = epsilonStart;\n          epsilonAxis = axis;\n          epsilonDir = 1;\n          break;\n        }\n        epsilonStart = cloneMutable(start);\n        adjustAxis(epsilonStart, axis, -1);\n        tr = trace(epsilonStart, localMins, localMaxs, epsilonStart);\n        if (!tr.startsolid) {\n          start = epsilonStart;\n          epsilonAxis = axis;\n          epsilonDir = -1;\n          break;\n        }\n      }\n    }\n\n    if (tr.startsolid) {\n      continue;\n    }\n\n    const otherSide = SIDE_CHECKS[i ^ 1];\n    let oppositeStart = applySideOffset(origin, otherSide, mins, maxs);\n    oppositeStart = addEpsilon(oppositeStart, epsilonAxis, epsilonDir);\n\n    tr = trace(start, localMins, localMaxs, oppositeStart);\n    if (tr.startsolid) {\n      continue;\n    }\n\n    const normal = tupleToVec3(side.normal);\n    const end = addVec3(tr.endpos ?? oppositeStart, scaleVec3(normal, 0.125));\n    const delta = subtractVec3(end, oppositeStart);\n    let newOrigin = addVec3(origin, delta);\n    newOrigin = addEpsilonImmutable(newOrigin, epsilonAxis, epsilonDir);\n\n    const validation = trace(newOrigin, mins, maxs, newOrigin);\n    if (validation.startsolid) {\n      continue;\n    }\n\n    candidates.push({ origin: newOrigin, distance: lengthSquaredVec3(delta) });\n  }\n\n  if (candidates.length === 0) {\n    return { result: 'no-good-position', origin: { ...origin } };\n  }\n\n  candidates.sort((a, b) => a.distance - b.distance);\n  return { result: 'fixed', origin: { ...candidates[0].origin } };\n}\n","import { addVec3, lengthVec3, normalizeVec3, scaleVec3, type Vec3 } from '../math/vec3.js';\nimport { PlayerButton } from './constants.js';\nimport { applyPmoveAccelerate } from './pmove.js';\nimport { stepSlideMove, type StepSlideMoveOutcome } from './slide.js';\nimport type { PmoveCmd, PmoveTraceFn } from './types.js';\n\nconst FLY_FRICTION_MULTIPLIER = 1.5;\nconst BUTTON_VERTICAL_SCALE = 0.5;\nconst DEFAULT_OVERBOUNCE = 1.01;\n\nexport interface FlyMoveParams {\n  readonly origin: Vec3;\n  readonly velocity: Vec3;\n  readonly cmd: PmoveCmd;\n  readonly forward: Vec3;\n  readonly right: Vec3;\n  readonly frametime: number;\n  readonly pmFriction: number;\n  readonly pmStopSpeed: number;\n  readonly pmMaxSpeed: number;\n  readonly pmAccelerate: number;\n  readonly pmWaterSpeed: number;\n  readonly doclip: boolean;\n  readonly mins?: Vec3;\n  readonly maxs?: Vec3;\n  readonly trace?: PmoveTraceFn;\n  readonly overbounce?: number;\n  readonly stepSize?: number;\n  readonly maxBumps?: number;\n  readonly maxClipPlanes?: number;\n}\n\nexport type FlyMoveResult = StepSlideMoveOutcome;\n\n/**\n * Pure translation of PM_FlyMove from rerelease `p_move.cpp`: applies the\n * spectator/noclip friction and acceleration rules, then either advances the\n * origin freely or resolves movement through `stepSlideMove` when clipping is\n * requested. This keeps the spectator and noclip physics deterministic between\n * the client and server.\n */\nexport function applyPmoveFlyMove(params: FlyMoveParams): FlyMoveResult {\n  const {\n    origin,\n    cmd,\n    frametime,\n    pmFriction,\n    pmStopSpeed,\n    pmMaxSpeed,\n    pmAccelerate,\n    pmWaterSpeed,\n    doclip,\n    forward,\n    right,\n    mins,\n    maxs,\n    trace,\n    overbounce = DEFAULT_OVERBOUNCE,\n    stepSize,\n    maxBumps,\n    maxClipPlanes,\n  } = params;\n\n  let velocity = applyFlyFriction({ velocity: params.velocity, pmFriction, pmStopSpeed, frametime });\n\n  const wishdirVelocity = buildFlyWishVelocity({\n    cmd,\n    forward,\n    right,\n    pmMaxSpeed,\n    pmWaterSpeed,\n  });\n\n  if (wishdirVelocity.wishspeed > 0) {\n    velocity = applyPmoveAccelerate({\n      velocity,\n      wishdir: wishdirVelocity.wishdir,\n      wishspeed: wishdirVelocity.accelSpeed,\n      accel: pmAccelerate,\n      frametime,\n    });\n  }\n\n  if (!doclip) {\n    const originDelta = scaleVec3(velocity, frametime);\n    const nextOrigin = addVec3(origin, originDelta);\n    return {\n      origin: nextOrigin,\n      velocity,\n      planes: [],\n      blocked: 0,\n      stopped: velocity.x === 0 && velocity.y === 0 && velocity.z === 0,\n      stepped: false,\n      stepHeight: 0,\n    };\n  }\n\n  if (!trace || !mins || !maxs) {\n    throw new Error('applyPmoveFlyMove: doclip=true requires trace/mins/maxs');\n  }\n\n  return stepSlideMove({\n    origin,\n    velocity,\n    frametime,\n    overbounce,\n    trace,\n    mins,\n    maxs,\n    stepSize,\n    maxBumps,\n    maxClipPlanes,\n  });\n}\n\ninterface FlyFrictionParams {\n  readonly velocity: Vec3;\n  readonly pmFriction: number;\n  readonly pmStopSpeed: number;\n  readonly frametime: number;\n}\n\nfunction applyFlyFriction(params: FlyFrictionParams): Vec3 {\n  const { velocity, pmFriction, pmStopSpeed, frametime } = params;\n  const speed = lengthVec3(velocity);\n\n  if (speed < 1) {\n    return { x: 0, y: 0, z: 0 };\n  }\n\n  const friction = pmFriction * FLY_FRICTION_MULTIPLIER;\n  const control = speed < pmStopSpeed ? pmStopSpeed : speed;\n  const drop = control * friction * frametime;\n\n  let newspeed = speed - drop;\n  if (newspeed < 0) {\n    newspeed = 0;\n  }\n\n  if (newspeed === speed) {\n    return velocity;\n  }\n\n  return scaleVec3(velocity, newspeed / speed);\n}\n\ninterface FlyWishVelocityParams {\n  readonly cmd: PmoveCmd;\n  readonly forward: Vec3;\n  readonly right: Vec3;\n  readonly pmMaxSpeed: number;\n  readonly pmWaterSpeed: number;\n}\n\ninterface FlyWishVelocityResult {\n  readonly wishdir: Vec3;\n  readonly wishspeed: number;\n  readonly accelSpeed: number;\n}\n\nfunction buildFlyWishVelocity(params: FlyWishVelocityParams): FlyWishVelocityResult {\n  const { cmd, forward, right, pmMaxSpeed, pmWaterSpeed } = params;\n\n  const forwardNorm = normalizeVec3(forward);\n  const rightNorm = normalizeVec3(right);\n\n  const wishvel = {\n    x: forwardNorm.x * cmd.forwardmove + rightNorm.x * cmd.sidemove,\n    y: forwardNorm.y * cmd.forwardmove + rightNorm.y * cmd.sidemove,\n    z: forwardNorm.z * cmd.forwardmove + rightNorm.z * cmd.sidemove,\n  } satisfies Vec3;\n\n  let adjusted = wishvel;\n  const buttons = cmd.buttons ?? 0;\n\n  if (buttons & PlayerButton.Jump) {\n    adjusted = addVec3(adjusted, { x: 0, y: 0, z: pmWaterSpeed * BUTTON_VERTICAL_SCALE });\n  }\n\n  if (buttons & PlayerButton.Crouch) {\n    adjusted = addVec3(adjusted, { x: 0, y: 0, z: -pmWaterSpeed * BUTTON_VERTICAL_SCALE });\n  }\n\n  let wishspeed = lengthVec3(adjusted);\n  let wishdir = wishspeed === 0 ? { x: 0, y: 0, z: 0 } : normalizeVec3(adjusted);\n\n  if (wishspeed > pmMaxSpeed) {\n    const scale = pmMaxSpeed / wishspeed;\n    adjusted = scaleVec3(adjusted, scale);\n    wishspeed = pmMaxSpeed;\n    wishdir = wishspeed === 0 ? { x: 0, y: 0, z: 0 } : normalizeVec3(adjusted);\n  }\n\n  const accelSpeed = wishspeed * 2;\n\n  return { wishdir, wishspeed, accelSpeed };\n}\n","import { CONTENTS_LADDER, CONTENTS_NONE, CONTENTS_NO_WATERJUMP } from '../bsp/contents.js';\nimport { addVec3, lengthSquaredVec3, normalizeVec3, scaleVec3, type Vec3 } from '../math/vec3.js';\nimport { PlayerButton, PmFlag, type PmFlags, addPmFlag, removePmFlag, WaterLevel } from './constants.js';\nimport { stepSlideMove } from './slide.js';\nimport type { PmoveCmd, PmovePointContentsFn, PmoveTraceFn } from './types.js';\nimport { getWaterLevel } from './water.js';\n\nconst LADDER_TRACE_DISTANCE = 1;\nconst WATERJUMP_FORWARD_CHECK = 40;\nconst WATERJUMP_FORWARD_SPEED = 50;\nconst WATERJUMP_UPWARD_SPEED = 350;\nconst WATERJUMP_PM_TIME = 2048;\nconst WATERJUMP_SIM_STEP = 0.1;\nconst WATERJUMP_BASE_GRAVITY = 800;\nconst WATERJUMP_MAX_STEPS = 50;\nconst GROUND_NORMAL_THRESHOLD = 0.7;\nconst WATERJUMP_STEP_TOLERANCE = 18;\nconst DEFAULT_OVERBOUNCE = 1.01;\nconst WATERJUMP_DOWN_PROBE = 2;\n\nexport interface SpecialMovementParams {\n  readonly pmFlags: PmFlags;\n  readonly pmTime: number;\n  readonly waterlevel: WaterLevel;\n  readonly watertype: number;\n  readonly gravity: number;\n  readonly cmd: PmoveCmd;\n  readonly forward: Vec3;\n  readonly origin: Vec3;\n  readonly velocity: Vec3;\n  readonly mins: Vec3;\n  readonly maxs: Vec3;\n  readonly viewheight: number;\n  readonly trace: PmoveTraceFn;\n  readonly pointContents: PmovePointContentsFn;\n  readonly onGround: boolean;\n  readonly overbounce?: number;\n  readonly stepSize?: number;\n  readonly maxBumps?: number;\n  readonly maxClipPlanes?: number;\n}\n\nexport interface SpecialMovementResult {\n  readonly pmFlags: PmFlags;\n  readonly pmTime: number;\n  readonly velocity: Vec3;\n  readonly performedWaterJump: boolean;\n}\n\n/**\n * Mirrors the ladder detection and water-jump probing logic from\n * `PM_CheckSpecialMovement` in `rerelease/p_move.cpp`. The helper clears and\n * re-adds the ladder flag based on nearby CONTENTS_LADDER brushes, then\n * simulates a potential water jump by firing the same 40-unit probe and\n * step-slide loop the C++ uses before committing to the upward velocity.\n */\nexport function checkSpecialMovement(params: SpecialMovementParams): SpecialMovementResult {\n  const {\n    pmFlags: initialFlags,\n    pmTime: initialPmTime,\n    waterlevel,\n    watertype,\n    gravity,\n    cmd,\n    forward,\n    origin,\n    velocity: initialVelocity,\n    mins,\n    maxs,\n    viewheight,\n    trace,\n    pointContents,\n    onGround,\n    overbounce = DEFAULT_OVERBOUNCE,\n    stepSize = WATERJUMP_STEP_TOLERANCE,\n    maxBumps,\n    maxClipPlanes,\n  } = params;\n\n  if (initialPmTime > 0) {\n    return { pmFlags: initialFlags, pmTime: initialPmTime, velocity: initialVelocity, performedWaterJump: false };\n  }\n\n  let pmFlags = removePmFlag(initialFlags, PmFlag.OnLadder);\n  let pmTime = initialPmTime;\n  let velocity = initialVelocity;\n\n  const flatforward = normalizeVec3({ x: forward.x, y: forward.y, z: 0 });\n  const hasForward = lengthSquaredVec3(flatforward) > 0;\n\n  if (waterlevel < WaterLevel.Waist && hasForward) {\n    const ladderEnd = addVec3(origin, scaleVec3(flatforward, LADDER_TRACE_DISTANCE));\n    const ladderTrace = trace(origin, ladderEnd, mins, maxs);\n    const contents = ladderTrace.contents ?? CONTENTS_NONE;\n\n    if (ladderTrace.fraction < 1 && (contents & CONTENTS_LADDER) !== 0) {\n      pmFlags = addPmFlag(pmFlags, PmFlag.OnLadder);\n    }\n  }\n\n  if (gravity === 0) {\n    return { pmFlags, pmTime, velocity, performedWaterJump: false };\n  }\n\n  if (((cmd.buttons ?? 0) & PlayerButton.Jump) === 0 && cmd.forwardmove <= 0) {\n    return { pmFlags, pmTime, velocity, performedWaterJump: false };\n  }\n\n  if (waterlevel !== WaterLevel.Waist) {\n    return { pmFlags, pmTime, velocity, performedWaterJump: false };\n  }\n\n  if ((watertype & CONTENTS_NO_WATERJUMP) !== 0) {\n    return { pmFlags, pmTime, velocity, performedWaterJump: false };\n  }\n\n  if (!hasForward) {\n    return { pmFlags, pmTime, velocity, performedWaterJump: false };\n  }\n\n  const forwardCheckEnd = addVec3(origin, scaleVec3(flatforward, WATERJUMP_FORWARD_CHECK));\n  const forwardTrace = trace(origin, forwardCheckEnd, mins, maxs);\n\n  if (\n    forwardTrace.fraction === 1 ||\n    !forwardTrace.planeNormal ||\n    forwardTrace.planeNormal.z >= GROUND_NORMAL_THRESHOLD\n  ) {\n    return { pmFlags, pmTime, velocity, performedWaterJump: false };\n  }\n\n  let simVelocity: Vec3 = {\n    x: flatforward.x * WATERJUMP_FORWARD_SPEED,\n    y: flatforward.y * WATERJUMP_FORWARD_SPEED,\n    z: WATERJUMP_UPWARD_SPEED,\n  };\n\n  let simOrigin = origin;\n  let hasTime = true;\n  const stepCount = computeWaterJumpSteps(gravity);\n\n  for (let i = 0; i < stepCount; i++) {\n    simVelocity = { x: simVelocity.x, y: simVelocity.y, z: simVelocity.z - gravity * WATERJUMP_SIM_STEP };\n    if (simVelocity.z < 0) {\n      hasTime = false;\n    }\n\n    const move = stepSlideMove({\n      origin: simOrigin,\n      velocity: simVelocity,\n      frametime: WATERJUMP_SIM_STEP,\n      trace,\n      mins,\n      maxs,\n      overbounce,\n      stepSize,\n      maxBumps,\n      maxClipPlanes,\n      hasTime,\n    });\n    simOrigin = move.origin;\n    simVelocity = move.velocity;\n  }\n\n  const downEnd = addVec3(simOrigin, { x: 0, y: 0, z: -WATERJUMP_DOWN_PROBE });\n  const downTrace = trace(simOrigin, downEnd, mins, maxs);\n\n  if (\n    downTrace.fraction === 1 ||\n    !downTrace.planeNormal ||\n    downTrace.planeNormal.z < GROUND_NORMAL_THRESHOLD ||\n    downTrace.endpos.z < origin.z\n  ) {\n    return { pmFlags, pmTime, velocity, performedWaterJump: false };\n  }\n\n  if (onGround && Math.abs(origin.z - downTrace.endpos.z) <= stepSize) {\n    return { pmFlags, pmTime, velocity, performedWaterJump: false };\n  }\n\n  const landingWater = getWaterLevel({ origin: downTrace.endpos, mins, viewheight, pointContents });\n  if (landingWater.waterlevel >= WaterLevel.Waist) {\n    return { pmFlags, pmTime, velocity, performedWaterJump: false };\n  }\n\n  pmFlags = addPmFlag(pmFlags, PmFlag.TimeWaterJump);\n  pmTime = WATERJUMP_PM_TIME;\n  velocity = {\n    x: flatforward.x * WATERJUMP_FORWARD_SPEED,\n    y: flatforward.y * WATERJUMP_FORWARD_SPEED,\n    z: WATERJUMP_UPWARD_SPEED,\n  } satisfies Vec3;\n\n  return { pmFlags, pmTime, velocity, performedWaterJump: true };\n}\n\nfunction computeWaterJumpSteps(gravity: number): number {\n  if (gravity === 0) {\n    return 0;\n  }\n\n  const scaled = Math.floor(10 * (WATERJUMP_BASE_GRAVITY / gravity));\n  if (scaled <= 0) {\n    return 0;\n  }\n  return Math.min(WATERJUMP_MAX_STEPS, scaled);\n}\n","import type { Vec3 } from '../math/vec3.js';\nimport { fixStuckObjectGeneric } from './stuck.js';\nimport type { PmoveTraceFn } from './types.js';\n\nconst SNAP_OFFSETS = [0, -1, 1] as const;\n\nexport interface GoodPositionParams {\n  readonly origin: Vec3;\n  readonly mins: Vec3;\n  readonly maxs: Vec3;\n  readonly trace: PmoveTraceFn;\n}\n\nexport function goodPosition(params: GoodPositionParams): boolean {\n  const { origin, mins, maxs, trace } = params;\n  const result = trace(origin, origin, mins, maxs);\n  return result.allsolid ? false : true;\n}\n\nexport type SnapResolution = 'unchanged' | 'fixed' | 'reverted';\n\nexport interface SnapPositionParams extends GoodPositionParams {\n  readonly velocity: Vec3;\n  readonly previousOrigin: Vec3;\n}\n\nexport interface SnapPositionResult {\n  readonly origin: Vec3;\n  readonly velocity: Vec3;\n  readonly resolution: SnapResolution;\n}\n\n/**\n * Pure translation of PM_SnapPosition from rerelease `p_move.cpp`.\n * Attempts to keep the caller's origin in a valid location by first\n * checking the current origin against collision traces, then falling\n * back to the shared `fixStuckObjectGeneric` helper before finally\n * reverting to the provided previous origin when no fix is possible.\n */\nexport function snapPosition(params: SnapPositionParams): SnapPositionResult {\n  const { origin, velocity, mins, maxs, previousOrigin, trace } = params;\n\n  if (goodPosition({ origin, mins, maxs, trace })) {\n    return { origin: { ...origin }, velocity: { ...velocity }, resolution: 'unchanged' };\n  }\n\n  const fix = fixStuckObjectGeneric({\n    origin,\n    mins,\n    maxs,\n    trace: (start, localMins, localMaxs, end) => trace(start, end, localMins, localMaxs),\n  });\n\n  if (fix.result === 'fixed' || fix.result === 'good-position') {\n    return { origin: fix.origin, velocity: { ...velocity }, resolution: 'fixed' };\n  }\n\n  return { origin: { ...previousOrigin }, velocity: { ...velocity }, resolution: 'reverted' };\n}\n\nexport interface InitialSnapPositionParams extends GoodPositionParams {}\n\nexport interface InitialSnapPositionResult {\n  readonly origin: Vec3;\n  readonly snapped: boolean;\n}\n\n/**\n * Pure translation of PM_InitialSnapPosition from rerelease `p_move.cpp`.\n * Tries a 3x3x3 grid of +/-1 unit offsets around the base origin to find\n * a valid collision-free spot, mirroring the search order of the C++ code.\n */\nexport function initialSnapPosition(params: InitialSnapPositionParams): InitialSnapPositionResult {\n  const { origin, mins, maxs, trace } = params;\n\n  for (const oz of SNAP_OFFSETS) {\n    for (const oy of SNAP_OFFSETS) {\n      for (const ox of SNAP_OFFSETS) {\n        const candidate = { x: origin.x + ox, y: origin.y + oy, z: origin.z + oz } satisfies Vec3;\n        if (goodPosition({ origin: candidate, mins, maxs, trace })) {\n          const snapped = ox !== 0 || oy !== 0 || oz !== 0;\n          return { origin: candidate, snapped };\n        }\n      }\n    }\n  }\n\n  return { origin: { ...origin }, snapped: false };\n}\n","import type { Vec3 } from '../math/vec3.js';\nimport { angleVectors, type AngleVectorsResult } from '../math/angles.js';\nimport { PmFlag, type PmFlags } from './constants.js';\n\nexport interface ClampViewAnglesParams {\n  readonly pmFlags: PmFlags;\n  readonly cmdAngles: Vec3;\n  readonly deltaAngles: Vec3;\n}\n\nexport interface ClampViewAnglesResult extends AngleVectorsResult {\n  readonly viewangles: Vec3;\n}\n\nfunction addAngles(cmdAngles: Vec3, deltaAngles: Vec3): Vec3 {\n  return {\n    x: cmdAngles.x + deltaAngles.x,\n    y: cmdAngles.y + deltaAngles.y,\n    z: cmdAngles.z + deltaAngles.z,\n  } satisfies Vec3;\n}\n\nfunction clampPitch(pitch: number): number {\n  if (pitch > 89 && pitch < 180) {\n    return 89;\n  }\n  if (pitch < 271 && pitch >= 180) {\n    return 271;\n  }\n  return pitch;\n}\n\n/**\n * Pure translation of `PM_ClampAngles` from `rerelease/p_move.cpp`. The helper\n * fuses the latest command angles with the stored delta, applies the teleport\n * pitch/roll reset, enforces the ±90° pitch window, and returns the resulting\n * axis vectors that the C version stored in `pml.forward/right/up`.\n */\nexport function clampViewAngles(params: ClampViewAnglesParams): ClampViewAnglesResult {\n  const { pmFlags, cmdAngles, deltaAngles } = params;\n\n  let viewangles: Vec3;\n\n  if ((pmFlags & PmFlag.TimeTeleport) !== 0) {\n    viewangles = {\n      x: 0,\n      y: cmdAngles.y + deltaAngles.y,\n      z: 0,\n    } satisfies Vec3;\n  } else {\n    viewangles = addAngles(cmdAngles, deltaAngles);\n    viewangles = { ...viewangles, x: clampPitch(viewangles.x) };\n  }\n\n  const vectors = angleVectors(viewangles);\n  return { viewangles, ...vectors };\n}\n","import { angleMod } from '../math/angles.js';\nimport type { Vec3 } from '../math/vec3.js';\nimport { PlayerButton } from '../pmove/constants.js';\n\nexport interface UserCommand {\n  readonly msec: number;\n  readonly buttons: PlayerButton;\n  readonly angles: Vec3;\n  readonly forwardmove: number;\n  readonly sidemove: number;\n  readonly upmove: number;\n  readonly serverFrame?: number;\n  readonly sequence: number;\n  readonly lightlevel: number;\n  readonly impulse: number;\n}\n\nexport interface MouseDelta {\n  readonly deltaX: number;\n  readonly deltaY: number;\n}\n\nexport interface MouseLookOptions {\n  readonly sensitivity: number;\n  readonly invertY: boolean;\n  readonly sensitivityX?: number;\n  readonly sensitivityY?: number;\n}\n\nexport const DEFAULT_FORWARD_SPEED = 200;\nexport const DEFAULT_SIDE_SPEED = 200;\nexport const DEFAULT_UP_SPEED = 200;\nexport const DEFAULT_YAW_SPEED = 140;\nexport const DEFAULT_PITCH_SPEED = 150;\nexport const DEFAULT_MOUSE_SENSITIVITY = 3;\n\nfunction clampPitch(pitch: number): number {\n  const normalized = angleMod(pitch);\n\n  if (normalized > 89 && normalized < 180) return 89;\n  if (normalized < 271 && normalized >= 180) return 271;\n\n  return normalized;\n}\n\nexport function addViewAngles(current: Vec3, delta: Vec3): Vec3 {\n  return {\n    x: clampPitch(current.x + delta.x),\n    y: angleMod(current.y + delta.y),\n    z: angleMod(current.z + delta.z),\n  } satisfies Vec3;\n}\n\nexport function mouseDeltaToViewDelta(delta: MouseDelta, options: MouseLookOptions): Vec3 {\n  const yawScale = options.sensitivityX ?? options.sensitivity;\n  const pitchScale = (options.sensitivityY ?? options.sensitivity) * (options.invertY ? -1 : 1);\n\n  return {\n    x: delta.deltaY * pitchScale,\n    y: delta.deltaX * yawScale,\n    z: 0,\n  } satisfies Vec3;\n}\n","\nexport enum ServerCommand {\n  bad = 0,\n\n  // these ops are known to the game dll\n  muzzleflash = 1,\n  muzzleflash2 = 2,\n  temp_entity = 3,\n  layout = 4,\n  inventory = 5,\n\n  // the rest are private to the client and server\n  nop = 6,\n  disconnect = 7,\n  reconnect = 8,\n  sound = 9,            // <see code>\n  print = 10,           // [byte] id [string] null terminated string\n  stufftext = 11,       // [string] stuffed into client's console buffer, should be \\n terminated\n  serverdata = 12,      // [long] protocol ...\n  configstring = 13,    // [short] [string]\n  spawnbaseline = 14,\n  centerprint = 15,     // [string] to put in center of the screen\n  download = 16,        // [short] size [size bytes]\n  playerinfo = 17,      // variable\n  packetentities = 18,  // [...]\n  deltapacketentities = 19, // [...]\n  frame = 20,\n  splitclient = 21,\n  configblast = 22,\n  spawnbaselineblast = 23,\n  level_restart = 24,\n  damage = 25,\n  locprint = 26,\n  fog = 27,\n  waitingforplayers = 28,\n  bot_chat = 29,\n  poi = 30,\n  help_path = 31,\n  muzzleflash3 = 32,\n  achievement = 33\n}\n\nexport enum ClientCommand {\n  bad = 0,\n  nop = 1,\n  move = 2,             // [[usercmd_t]\n  userinfo = 3,         // [[userinfo string]\n  stringcmd = 4         // [string] message\n}\n","\n// Temp entity constants from Quake 2\nexport enum TempEntity {\n  GUNSHOT = 0,\n  BLOOD = 1,\n  BLASTER = 2,\n  RAILTRAIL = 3,\n  SHOTGUN = 4,\n  EXPLOSION1 = 5,\n  EXPLOSION2 = 6,\n  ROCKET_EXPLOSION = 7,\n  GRENADE_EXPLOSION = 8,\n  SPARKS = 9,\n  SPLASH = 10,\n  BUBBLETRAIL = 11,\n  SCREEN_SPARKS = 12,\n  SHIELD_SPARKS = 13,\n  BULLET_SPARKS = 14,\n  LASER_SPARKS = 15,\n  PARASITE_ATTACK = 16,\n  ROCKET_EXPLOSION_WATER = 17,\n  GRENADE_EXPLOSION_WATER = 18,\n  MEDIC_CABLE_ATTACK = 19,\n  BFG_EXPLOSION = 20,\n  BFG_BIGEXPLOSION = 21,\n  BOSSTPORT = 22,\n  BFG_LASER = 23,\n  GRAPPLE_CABLE = 24,\n  WELDING_SPARKS = 25,\n  GREENBLOOD = 26,\n  BLUEHYPERBLASTER = 27,\n  PLASMA_EXPLOSION = 28,\n  TUNNEL_SPARKS = 29,\n  // ROGUE\n  BLASTER2 = 30,\n  RAILTRAIL2 = 31,\n  FLAME = 32,\n  LIGHTNING = 33,\n  DEBUGTRAIL = 34,\n  PLAIN_EXPLOSION = 35,\n  FLASHLIGHT = 36,\n  FORCEWALL = 37,\n  HEATBEAM = 38,\n  MONSTER_HEATBEAM = 39,\n  STEAM = 40,\n  BUBBLETRAIL2 = 41,\n  MOREBLOOD = 42,\n  HEATBEAM_SPARKS = 43,\n  HEATBEAM_STEAM = 44,\n  CHAINFIST_SMOKE = 45,\n  ELECTRIC_SPARKS = 46,\n  TRACKER_EXPLOSION = 47,\n  TELEPORT_EFFECT = 48,\n  DBALL_GOAL = 49,\n  WIDOWBEAMOUT = 50,\n  NUKEBLAST = 51,\n  WIDOWSPLASH = 52,\n  EXPLOSION1_BIG = 53,\n  EXPLOSION1_NP = 54,\n  FLECHETTE = 55,\n  BLUEHYPERBLASTER_KEX = 56,\n  BFG_ZAP = 57,\n  BERSERK_SLAM = 58,\n  GRAPPLE_CABLE_2 = 59,\n  POWER_SPLASH = 60,\n  LIGHTNING_BEAM = 61,\n  EXPLOSION1_NL = 62,\n  EXPLOSION2_NL = 63\n}\n","\nexport const MAX_CHALLENGES = 1024;\nexport const MAX_PACKET_ENTITIES = 256; // Standard Q2 value\nexport const UPDATE_BACKUP = 16;\nexport const CMD_BACKUP = 64;\nexport const MAX_INFO_STRING = 512;\nexport const MAX_MSGLEN = 1400; // MTU safe limit\n\n// Muzzle Flash Constants\nexport const MZ_BLASTER = 0;\nexport const MZ_MACHINEGUN = 1;\nexport const MZ_SHOTGUN = 2;\nexport const MZ_CHAINGUN1 = 3;\nexport const MZ_CHAINGUN2 = 4;\nexport const MZ_CHAINGUN3 = 5;\nexport const MZ_RAILGUN = 6;\nexport const MZ_ROCKET = 7;\nexport const MZ_GRENADE = 8;\nexport const MZ_LOGIN = 9;\nexport const MZ_LOGOUT = 10;\nexport const MZ_SSHOTGUN = 11;\nexport const MZ_BFG = 12;\nexport const MZ_HYPERBLASTER = 13;\n\n// Xatrix / Rogue Extensions\nexport const MZ_IONRIPPER = 16;\nexport const MZ_BLUEHYPERBLASTER = 17;\nexport const MZ_PHALANX = 18;\nexport const MZ_BFG2 = 19;\nexport const MZ_PHALANX2 = 20;\nexport const MZ_ETF_RIFLE = 30;\nexport const MZ_PROX = 31;\nexport const MZ_ETF_RIFLE_2 = 32;\nexport const MZ_HEATBEAM = 33;\nexport const MZ_BLASTER2 = 34;\nexport const MZ_TRACKER = 35;\nexport const MZ_NUKE1 = 36;\nexport const MZ_NUKE2 = 37;\nexport const MZ_NUKE4 = 38;\nexport const MZ_NUKE8 = 39;\n","// Matching rerelease/game.h:1584-1593\nexport enum LayoutFlags {\n    LAYOUTS_LAYOUT = 1,\n    LAYOUTS_INVENTORY = 2,\n    LAYOUTS_HIDE_HUD = 4,\n    LAYOUTS_INTERMISSION = 8,\n    LAYOUTS_HELP = 16,\n    LAYOUTS_HIDE_CROSSHAIR = 32\n}\n","\n/**\n * Helper to force a number into a signed 16-bit integer range (-32768 to 32767).\n * This mimics the behavior of casting to `short` in C++.\n */\nfunction toSigned16(val: number): number {\n  return (val << 16) >> 16;\n}\n\n/**\n * Reads a 16-bit integer (unsigned) from the stats array at the given byte offset.\n * Mimics reading `*(uint16_t*)((uint8_t*)stats + byteOffset)` in Little Endian.\n */\nfunction readUint16LE(stats: number[], startIndex: number, byteOffset: number): number {\n  // Determine which element(s) of the array we are accessing\n  // stats is int16[], so each element is 2 bytes.\n  // absolute byte offset from stats[startIndex]\n  const elementIndex = Math.floor(byteOffset / 2);\n  const isOdd = (byteOffset % 2) !== 0;\n\n  // Access the array at the calculated index relative to startIndex\n  const index = startIndex + elementIndex;\n\n  // Read the primary element\n  const val0 = stats[index] || 0; // Handle potentially undefined/uninitialized slots as 0\n\n  if (!isOdd) {\n    // Aligned access: just return the element as uint16\n    return val0 & 0xFFFF;\n  } else {\n    // Unaligned access: High byte of val0 + Low byte of val1\n    const val1 = stats[index + 1] || 0;\n\n    // Low byte of result comes from High byte of val0\n    const low = (val0 >>> 8) & 0xFF;\n    // High byte of result comes from Low byte of val1\n    const high = val1 & 0xFF;\n\n    return (high << 8) | low;\n  }\n}\n\n/**\n * Writes a 16-bit integer to the stats array at the given byte offset.\n * Mimics writing `*(uint16_t*)((uint8_t*)stats + byteOffset) = value` in Little Endian.\n */\nfunction writeUint16LE(stats: number[], startIndex: number, byteOffset: number, value: number): void {\n  const elementIndex = Math.floor(byteOffset / 2);\n  const isOdd = (byteOffset % 2) !== 0;\n  const index = startIndex + elementIndex;\n\n  // Ensure array has values at these indices to avoid NaN math\n  if (stats[index] === undefined) stats[index] = 0;\n\n  if (!isOdd) {\n    // Aligned access: overwrite the element\n    stats[index] = toSigned16(value);\n  } else {\n    // Unaligned access\n    if (stats[index + 1] === undefined) stats[index + 1] = 0;\n\n    const val0 = stats[index];\n    const val1 = stats[index + 1];\n\n    // We want to write `value` (which is Low byte `L_v` and High byte `H_v`)\n    // into the bytes at `byteOffset` and `byteOffset + 1`.\n\n    // Byte at `byteOffset` corresponds to High byte of `stats[index]`.\n    // It should become `value & 0xFF` (L_v).\n    // So `stats[index]` becomes `(Old_Low) | (L_v << 8)`.\n    const newHigh0 = value & 0xFF;\n    const newVal0 = (val0 & 0xFF) | (newHigh0 << 8);\n    stats[index] = toSigned16(newVal0);\n\n    // Byte at `byteOffset + 1` corresponds to Low byte of `stats[index+1]`.\n    // It should become `(value >> 8) & 0xFF` (H_v).\n    // So `stats[index+1]` becomes `(H_v) | (Old_High << 8)`.\n    const newLow1 = (value >>> 8) & 0xFF;\n    const newVal1 = newLow1 | (val1 & 0xFF00);\n    stats[index + 1] = toSigned16(newVal1);\n  }\n}\n\n/**\n * Packs a value into the stats array using a specific bit width.\n * Equivalent to C++ `set_compressed_integer`.\n *\n * @param stats The stats array (number[] representing int16s)\n * @param startIndex The index in the stats array where the packed region begins (e.g. STAT_AMMO_INFO_START)\n * @param id The ID of the item to set (0-based index within the packed region)\n * @param count The value to set\n * @param bitsPerValue Number of bits per item (e.g. 9 for ammo, 2 for powerups)\n */\nexport function setCompressedInteger(\n  stats: number[],\n  startIndex: number,\n  id: number,\n  count: number,\n  bitsPerValue: number\n): void {\n  const bitOffset = bitsPerValue * id;\n  const byteOffset = Math.floor(bitOffset / 8);\n  const bitShift = bitOffset % 8;\n  const mask = ((1 << bitsPerValue) - 1) << bitShift;\n\n  // Read the 16-bit word at the target byte address\n  let base = readUint16LE(stats, startIndex, byteOffset);\n\n  // Apply the mask and value\n  // Note: (count << bitShift) might overflow 16 bits if we aren't careful,\n  // but the mask will handle the high bits.\n  // However, in JS, bitwise ops are 32-bit.\n  // We need to ensure we only write back 16 bits.\n\n  const valueToWrite = (base & ~mask) | ((count << bitShift) & mask);\n\n  // Write the modified 16-bit word back\n  writeUint16LE(stats, startIndex, byteOffset, valueToWrite & 0xFFFF);\n}\n\n/**\n * Unpacks a value from the stats array.\n * Equivalent to C++ `get_compressed_integer`.\n */\nexport function getCompressedInteger(\n  stats: number[],\n  startIndex: number,\n  id: number,\n  bitsPerValue: number\n): number {\n  const bitOffset = bitsPerValue * id;\n  const byteOffset = Math.floor(bitOffset / 8);\n  const bitShift = bitOffset % 8;\n  const mask = ((1 << bitsPerValue) - 1) << bitShift;\n\n  const base = readUint16LE(stats, startIndex, byteOffset);\n\n  return (base & mask) >>> bitShift;\n}\n","/**\n * Powerup identifiers shared across game and cgame.\n * Reference: rerelease/g_items.cpp, game/src/inventory/playerInventory.ts\n */\n\nexport enum PowerupId {\n  QuadDamage = 'quad',\n  Invulnerability = 'invulnerability',\n  EnviroSuit = 'enviro_suit',\n  Rebreather = 'rebreather',\n  Silencer = 'silencer',\n  // New additions for demo playback and extended support\n  PowerScreen = 'power_screen',\n  PowerShield = 'power_shield',\n  QuadFire = 'quad_fire',\n  Invisibility = 'invisibility',\n  Bandolier = 'bandolier',\n  AmmoPack = 'ammo_pack',\n  IRGoggles = 'ir_goggles',\n  DoubleDamage = 'double_damage',\n  SphereVengeance = 'sphere_vengeance',\n  SphereHunter = 'sphere_hunter',\n  SphereDefender = 'sphere_defender',\n  Doppelganger = 'doppelganger',\n  TagToken = 'tag_token',\n  TechResistance = 'tech_resistance',\n  TechStrength = 'tech_strength',\n  TechHaste = 'tech_haste',\n  TechRegeneration = 'tech_regeneration',\n  Flashlight = 'flashlight',\n  Compass = 'compass',\n}\n","import { setCompressedInteger, getCompressedInteger } from './bitpack.js';\nimport { PowerupId } from '../items/powerups.js';\n\n// Matching rerelease/bg_local.h:196-262\nexport enum PlayerStat {\n    STAT_HEALTH_ICON = 0,\n    STAT_HEALTH,\n    STAT_AMMO_ICON,\n    STAT_AMMO,\n    STAT_ARMOR_ICON,\n    STAT_ARMOR,\n    STAT_SELECTED_ICON,\n    STAT_PICKUP_ICON,\n    STAT_PICKUP_STRING,\n    STAT_TIMER_ICON,\n    STAT_TIMER,\n    STAT_HELPICON,\n    STAT_SELECTED_ITEM,\n    STAT_LAYOUTS,\n    STAT_FRAGS,\n    STAT_FLASHES,\n    STAT_CHASE,\n    STAT_SPECTATOR,\n\n    // CTF Stats (Rerelease/KEX)\n    STAT_CTF_TEAM1_PIC = 18,\n    STAT_CTF_TEAM1_CAPS = 19,\n    STAT_CTF_TEAM2_PIC = 20,\n    STAT_CTF_TEAM2_CAPS = 21,\n    STAT_CTF_FLAG_PIC = 22,\n    STAT_CTF_JOINED_TEAM1_PIC = 23,\n    STAT_CTF_JOINED_TEAM2_PIC = 24,\n    STAT_CTF_TEAM1_HEADER = 25,\n    STAT_CTF_TEAM2_HEADER = 26,\n    STAT_CTF_TECH = 27,\n    STAT_CTF_ID_VIEW = 28,\n    STAT_CTF_MATCH = 29,\n    STAT_CTF_ID_VIEW_COLOR = 30,\n    STAT_CTF_TEAMINFO = 31,\n\n    // Rerelease additions\n    STAT_WEAPONS_OWNED_1 = 32,\n    STAT_WEAPONS_OWNED_2 = 33,\n\n    // Ammo counts (start index)\n    STAT_AMMO_INFO_START = 34,\n    // Calculated below, but enum needs literal or constant if we want to use it as type.\n    // However, for TS Enum, we can just define start.\n\n    // Powerups start after Ammo.\n    // AMMO_MAX=12, 9 bits each -> 108 bits -> 7 int16s.\n    // 34 + 7 = 41.\n    STAT_POWERUP_INFO_START = 41,\n\n    // Keys and other KEX stats (Start after Powerups)\n    // POWERUP_MAX=23, 2 bits each -> 46 bits -> 3 int16s.\n    // 41 + 3 = 44.\n    STAT_KEY_A = 44,\n    STAT_KEY_B = 45,\n    STAT_KEY_C = 46,\n\n    STAT_ACTIVE_WHEEL_WEAPON = 47,\n    STAT_COOP_RESPAWN = 48,\n    STAT_LIVES = 49,\n    STAT_HIT_MARKER = 50,\n    STAT_SELECTED_ITEM_NAME = 51,\n    STAT_HEALTH_BARS = 52,\n    STAT_ACTIVE_WEAPON = 53,\n\n    STAT_LAST\n}\n\n// Constants for bit packing logic\nexport const AMMO_MAX = 12;\nexport const NUM_BITS_FOR_AMMO = 9;\nexport const NUM_AMMO_STATS = Math.ceil((AMMO_MAX * NUM_BITS_FOR_AMMO) / 16); // 7\n\nexport const POWERUP_MAX = 23; // Adjusted to include TechRegeneration (index 22)\nexport const NUM_BITS_FOR_POWERUP = 2;\nexport const NUM_POWERUP_STATS = Math.ceil((POWERUP_MAX * NUM_BITS_FOR_POWERUP) / 16); // 3\n\n// Powerup ID mapping from string to C++ integer index (powerup_t in bg_local.h)\nconst POWERUP_STAT_MAP: Partial<Record<PowerupId, number>> = {\n  [PowerupId.PowerScreen]: 0,\n  [PowerupId.PowerShield]: 1,\n  // 2 is POWERUP_AM_BOMB (not in PowerupId?)\n  [PowerupId.QuadDamage]: 3,\n  [PowerupId.QuadFire]: 4,\n  [PowerupId.Invulnerability]: 5,\n  [PowerupId.Invisibility]: 6,\n  [PowerupId.Silencer]: 7,\n  [PowerupId.Rebreather]: 8,\n  [PowerupId.EnviroSuit]: 9,\n  [PowerupId.Bandolier]: 10, // Placeholder/Map mismatch handling?\n  [PowerupId.AmmoPack]: 10, // Original reused indices or had gaps?\n  [PowerupId.IRGoggles]: 11,\n  [PowerupId.DoubleDamage]: 12,\n  [PowerupId.SphereVengeance]: 13,\n  [PowerupId.SphereHunter]: 14,\n  [PowerupId.SphereDefender]: 15,\n  [PowerupId.Doppelganger]: 16,\n  [PowerupId.Flashlight]: 17,\n  [PowerupId.Compass]: 18,\n  [PowerupId.TechResistance]: 19,\n  [PowerupId.TechStrength]: 20,\n  [PowerupId.TechHaste]: 21,\n  [PowerupId.TechRegeneration]: 22,\n  // Add missing mappings to avoid runtime lookups failing for new types\n  [PowerupId.TagToken]: -1,\n};\n\n// 9 bits for ammo count\nexport function G_SetAmmoStat(stats: number[], ammoId: number, count: number): void {\n  if (ammoId < 0 || ammoId >= AMMO_MAX) return;\n\n  // Clamp count to 9 bits (0-511)\n  let val = count;\n  if (val > 511) val = 511;\n  if (val < 0) val = 0;\n\n  setCompressedInteger(stats, PlayerStat.STAT_AMMO_INFO_START, ammoId, val, NUM_BITS_FOR_AMMO);\n}\n\nexport function G_GetAmmoStat(stats: number[], ammoId: number): number {\n  if (ammoId < 0 || ammoId >= AMMO_MAX) return 0;\n  return getCompressedInteger(stats, PlayerStat.STAT_AMMO_INFO_START, ammoId, NUM_BITS_FOR_AMMO);\n}\n\n// 2 bits for powerup active/inactive state\nexport function G_SetPowerupStat(stats: number[], powerupId: PowerupId | number, val: number): void {\n  let index: number | undefined;\n\n  if (typeof powerupId === 'number') {\n    index = powerupId;\n  } else {\n    index = POWERUP_STAT_MAP[powerupId];\n  }\n\n  if (index === undefined || index < 0 || index >= POWERUP_MAX) return;\n\n  // Clamp value to 2 bits (0-3)\n  let safeVal = val;\n  if (safeVal > 3) safeVal = 3;\n  if (safeVal < 0) safeVal = 0;\n\n  setCompressedInteger(stats, PlayerStat.STAT_POWERUP_INFO_START, index, safeVal, NUM_BITS_FOR_POWERUP);\n}\n\nexport function G_GetPowerupStat(stats: number[], powerupId: PowerupId | number): number {\n  let index: number | undefined;\n\n  if (typeof powerupId === 'number') {\n    index = powerupId;\n  } else {\n    index = POWERUP_STAT_MAP[powerupId];\n  }\n\n  if (index === undefined || index < 0 || index >= POWERUP_MAX) return 0;\n\n  return getCompressedInteger(stats, PlayerStat.STAT_POWERUP_INFO_START, index, NUM_BITS_FOR_POWERUP);\n}\n","import { BinaryWriter } from '../io/binaryWriter.js';\nimport { UserCommand } from './usercmd.js';\n\nexport function writeUserCommand(writer: BinaryWriter, cmd: UserCommand): void {\n  // msec (byte)\n  writer.writeByte(cmd.msec);\n\n  // buttons (byte)\n  writer.writeByte(cmd.buttons);\n\n  // angles (short * 3) - Scaled 360 -> 65536\n  writer.writeAngle16(cmd.angles.x);\n  writer.writeAngle16(cmd.angles.y);\n  writer.writeAngle16(cmd.angles.z);\n\n  // forwardmove (short)\n  writer.writeShort(cmd.forwardmove);\n\n  // sidemove (short)\n  writer.writeShort(cmd.sidemove);\n\n  // upmove (short)\n  writer.writeShort(cmd.upmove);\n\n  // impulse (byte)\n  writer.writeByte(cmd.impulse);\n\n  // lightlevel (byte)\n  writer.writeByte(0); // TODO: Lightlevel\n}\n","export enum RenderFx {\n  MinLight = 1,\n  ViewerModel = 2,\n  WeaponModel = 4,\n  FullBright = 8,\n  DepthHack = 16,\n  Translucent = 32,\n  FrameLerp = 64,\n  Beam = 128,\n  CustomLight = 256,\n  Glow = 512,\n  ShellRed = 1024,\n  ShellGreen = 2048,\n  ShellBlue = 4096,\n  IrVisible = 32768,\n  ShellDouble = 65536,\n  ShellHalfDam = 131072,\n  MinLightPlus = 262144,\n  ExtraLight = 524288,\n  BeamLightning = 1048576,\n  Flashlight = 2097152, // 1 << 21\n}\n","// Quake 2 CRC implementation\n// Ported from qcommon/crc.c\n\nconst crc_table: number[] = [\n    0x00, 0x91, 0xe3, 0x72, 0x07, 0x96, 0xe4, 0x75, 0x0e, 0x9f, 0xed, 0x7c, 0x09, 0x98, 0xea, 0x7b,\n    0x1c, 0x8d, 0xff, 0x6e, 0x1b, 0x8a, 0xf8, 0x69, 0x12, 0x83, 0xf1, 0x60, 0x15, 0x84, 0xf6, 0x67,\n    0x38, 0xa9, 0xdb, 0x4a, 0x3f, 0xae, 0xdc, 0x4d, 0x36, 0xa7, 0xd5, 0x44, 0x31, 0xa0, 0xd2, 0x43,\n    0x24, 0xb5, 0xc7, 0x56, 0x23, 0xb2, 0xc0, 0x51, 0x2a, 0xbb, 0xc9, 0x58, 0x2d, 0xbc, 0xce, 0x5f,\n    0x70, 0xe1, 0x93, 0x02, 0x77, 0xe6, 0x94, 0x05, 0x7e, 0xef, 0x9d, 0x0c, 0x79, 0xe8, 0x9a, 0x0b,\n    0x6c, 0xfd, 0x8f, 0x1e, 0x6b, 0xfa, 0x88, 0x19, 0x62, 0xf3, 0x81, 0x10, 0x65, 0xf4, 0x86, 0x17,\n    0x48, 0xd9, 0xab, 0x3a, 0x4f, 0xde, 0xac, 0x3d, 0x46, 0xd7, 0xa5, 0x34, 0x41, 0xd0, 0xa2, 0x33,\n    0x54, 0xc5, 0xb7, 0x26, 0x53, 0xc2, 0xb0, 0x21, 0x5a, 0xcb, 0xb9, 0x28, 0x5d, 0xcc, 0xbe, 0x2f,\n    0xe0, 0x71, 0x03, 0x92, 0xe7, 0x76, 0x04, 0x95, 0xee, 0x7f, 0x0d, 0x9c, 0xe9, 0x78, 0x0a, 0x9b,\n    0xfc, 0x6d, 0x1f, 0x8e, 0xfb, 0x6a, 0x18, 0x89, 0xf2, 0x63, 0x11, 0x80, 0xf5, 0x64, 0x16, 0x87,\n    0xd8, 0x49, 0x3b, 0xaa, 0xdf, 0x4e, 0x3c, 0xad, 0xd6, 0x47, 0x35, 0xa4, 0xd1, 0x40, 0x32, 0xa3,\n    0xc4, 0x55, 0x27, 0xb6, 0xc3, 0x52, 0x20, 0xb1, 0xca, 0x5b, 0x29, 0xb8, 0xcd, 0x5c, 0x2e, 0xbf,\n    0x90, 0x01, 0x73, 0xe2, 0x97, 0x06, 0x74, 0xe5, 0x9e, 0x0f, 0x7d, 0xec, 0x99, 0x08, 0x7a, 0xeb,\n    0x8c, 0x1d, 0x6f, 0xfe, 0x8b, 0x1a, 0x68, 0xf9, 0x82, 0x13, 0x61, 0xf0, 0x85, 0x14, 0x66, 0xf7,\n    0xa8, 0x39, 0x4b, 0xda, 0xaf, 0x3e, 0x4c, 0xdd, 0xa6, 0x37, 0x45, 0xd4, 0xa1, 0x30, 0x42, 0xd3,\n    0xb4, 0x25, 0x56, 0xc7, 0xb3, 0x22, 0x50, 0xc1, 0xba, 0x2b, 0x59, 0xc8, 0xbd, 0x2c, 0x5e, 0xcf\n];\n\n/**\n * Calculates 8-bit CRC for the given data\n */\nexport function crc8(data: Uint8Array): number {\n    let crc = 0;\n    for (let i = 0; i < data.length; i++) {\n        crc = crc_table[(crc ^ data[i]) & 0xff];\n    }\n    return crc;\n}\n","// Source: game.h (Quake 2)\nexport enum EntityEffects {\n  Rotate = 0x00000004,\n  Gib = 0x00000008,\n  RotateScript = 0x00000010,\n  Blaster = 0x00000020,\n  Rocket = 0x00000040,\n  Grenade = 0x00000080,\n  HyperBlaster = 0x00000100,\n  Bfg = 0x00000200,\n  ColorShell = 0x00000400,\n  Powerscreen = 0x00000800,\n  Anim01 = 0x00001000,\n  Anim23 = 0x00002000,\n  AnimAll = 0x00004000,\n  AnimAllFast = 0x00008000,\n  Quad = 0x00010000,\n  Pent = 0x00020000,\n  Explosion = 0x00040000,\n  Teleport = 0x00080000,\n  Flag1 = 0x00100000,\n  Flag2 = 0x00200000,\n  Boomerang = 0x00400000,\n  Greengibs = 0x00800000,\n  Bluehyperblaster = 0x01000000,\n  Spinning = 0x02000000,\n  Plasma = 0x04000000,\n  Trap = 0x08000000,\n  Tracker = 0x10000000,\n  Double = 0x20000000,\n  Sphinx = 0x40000000,\n  TagTrail = 0x80000000,\n}\n","export enum EntityEvent {\n  None = 0,\n  ItemRespawn = 1,\n  Footstep = 2,\n  FallShort = 3,\n  Fall = 4,\n  FallFar = 5,\n  PlayerTeleport = 6,\n  OtherTeleport = 7,\n\n  // [Paril-KEX]\n  OtherFootstep = 8,\n  LadderStep = 9,\n}\n","import { BinaryWriter } from '../io/index.js';\nimport { EntityState } from './entityState.js';\n\n// Constants matching packages/engine/src/demo/parser.ts\nexport const U_ORIGIN1   = (1 << 0);\nexport const U_ORIGIN2   = (1 << 1);\nexport const U_ANGLE2    = (1 << 2);\nexport const U_ANGLE3    = (1 << 3);\nexport const U_FRAME8    = (1 << 4);\nexport const U_EVENT     = (1 << 5);\nexport const U_REMOVE    = (1 << 6);\nexport const U_MOREBITS1 = (1 << 7);\n\nexport const U_NUMBER16  = (1 << 8);\nexport const U_ORIGIN3   = (1 << 9);\nexport const U_ANGLE1    = (1 << 10);\nexport const U_MODEL     = (1 << 11);\nexport const U_RENDERFX8 = (1 << 12);\nexport const U_ALPHA     = (1 << 13); // Rerelease: Alpha\nexport const U_EFFECTS8  = (1 << 14);\nexport const U_MOREBITS2 = (1 << 15);\n\nexport const U_SKIN8     = (1 << 16);\nexport const U_FRAME16   = (1 << 17);\nexport const U_RENDERFX16 = (1 << 18);\nexport const U_EFFECTS16 = (1 << 19);\nexport const U_MODEL2    = (1 << 20); // Rerelease\nexport const U_MODEL3    = (1 << 21); // Rerelease\nexport const U_MODEL4    = (1 << 22); // Rerelease\nexport const U_MOREBITS3 = (1 << 23);\n\nexport const U_OLDORIGIN = (1 << 24);\nexport const U_SKIN16    = (1 << 25);\nexport const U_SOUND     = (1 << 26);\nexport const U_SOLID     = (1 << 27);\nexport const U_SCALE     = (1 << 28); // Rerelease\nexport const U_INSTANCE_BITS = (1 << 29); // Rerelease\nexport const U_LOOP_VOLUME   = (1 << 30); // Rerelease\nexport const U_MOREBITS4     = 0x80000000 | 0; // Bit 31 (sign bit)\n\n// Rerelease Extension Bits (Byte 5 - High Bits)\nexport const U_LOOP_ATTENUATION_HIGH = (1 << 0);\nexport const U_OWNER_HIGH            = (1 << 1);\nexport const U_OLD_FRAME_HIGH        = (1 << 2);\n\n\n// A null state for new entities, used as a baseline for comparison.\nconst NULL_STATE: EntityState = {\n  number: 0,\n  origin: { x: 0, y: 0, z: 0 },\n  angles: { x: 0, y: 0, z: 0 },\n  modelIndex: 0,\n  frame: 0,\n  skinNum: 0,\n  effects: 0,\n  renderfx: 0,\n  solid: 0,\n  sound: 0,\n  event: 0,\n  alpha: 0,\n  scale: 0,\n  instanceBits: 0,\n  loopVolume: 0,\n  loopAttenuation: 0,\n  owner: 0,\n  oldFrame: 0,\n  modelIndex2: 0,\n  modelIndex3: 0,\n  modelIndex4: 0\n};\n\n/**\n * Writes the remove bit for an entity.\n */\nexport function writeRemoveEntity(\n    number: number,\n    writer: BinaryWriter\n): void {\n    let bits = U_REMOVE;\n\n    if (number >= 256) {\n        bits |= U_NUMBER16;\n    }\n\n    // Determine needed bytes for header (U_NUMBER16 is in bits 8-15)\n    if (bits & 0xFF00) {\n        bits |= U_MOREBITS1;\n    }\n\n    // Write Header\n    writer.writeByte(bits & 0xFF);\n    if (bits & U_MOREBITS1) {\n        writer.writeByte((bits >> 8) & 0xFF);\n    }\n\n    // Write Number\n    if (bits & U_NUMBER16) {\n        writer.writeShort(number);\n    } else {\n        writer.writeByte(number);\n    }\n}\n\n/**\n * Writes the delta between two entity states to a binary writer.\n */\nexport function writeDeltaEntity(\n  from: EntityState,\n  to: EntityState,\n  writer: BinaryWriter,\n  force: boolean,\n  newEntity: boolean\n): void {\n  let bits = 0;\n  let bitsHigh = 0;\n\n  // If this is a new entity, use a null baseline\n  if (newEntity) {\n    from = NULL_STATE;\n  }\n\n  // --- Compare fields and build the bitmask ---\n  if (to.modelIndex !== from.modelIndex || force) {\n    bits |= U_MODEL;\n  }\n  if (to.modelIndex2 !== from.modelIndex2 || force) {\n      bits |= U_MODEL2;\n  }\n  if (to.modelIndex3 !== from.modelIndex3 || force) {\n      bits |= U_MODEL3;\n  }\n  if (to.modelIndex4 !== from.modelIndex4 || force) {\n      bits |= U_MODEL4;\n  }\n\n  if (to.origin.x !== from.origin.x || force) {\n    bits |= U_ORIGIN1;\n  }\n  if (to.origin.y !== from.origin.y || force) {\n    bits |= U_ORIGIN2;\n  }\n  if (to.origin.z !== from.origin.z || force) {\n    bits |= U_ORIGIN3;\n  }\n  if (to.angles.x !== from.angles.x || force) {\n    bits |= U_ANGLE1;\n  }\n  if (to.angles.y !== from.angles.y || force) {\n    bits |= U_ANGLE2;\n  }\n  if (to.angles.z !== from.angles.z || force) {\n    bits |= U_ANGLE3;\n  }\n\n  if (to.frame !== from.frame || force) {\n      if (to.frame >= 256) bits |= U_FRAME16;\n      else bits |= U_FRAME8;\n  }\n\n  if (to.skinNum !== from.skinNum || force) {\n      if (to.skinNum >= 256) bits |= U_SKIN16;\n      else bits |= U_SKIN8;\n  }\n\n  if (to.effects !== from.effects || force) {\n      if (to.effects >= 256) bits |= U_EFFECTS16;\n      else bits |= U_EFFECTS8;\n  }\n\n  if (to.renderfx !== from.renderfx || force) {\n      if (to.renderfx >= 256) bits |= U_RENDERFX16;\n      else bits |= U_RENDERFX8;\n  }\n\n  if (to.solid !== from.solid || force) {\n    bits |= U_SOLID;\n  }\n  if (to.sound !== from.sound || force) {\n    bits |= U_SOUND;\n  }\n  if (to.event !== from.event || force) {\n    bits |= U_EVENT;\n  }\n\n  // Rerelease Fields\n  if ((to.alpha !== from.alpha || force) && to.alpha !== undefined) {\n      bits |= U_ALPHA;\n  }\n  if ((to.scale !== from.scale || force) && to.scale !== undefined) {\n      bits |= U_SCALE;\n  }\n  if ((to.instanceBits !== from.instanceBits || force) && to.instanceBits !== undefined) {\n      bits |= U_INSTANCE_BITS;\n  }\n  if ((to.loopVolume !== from.loopVolume || force) && to.loopVolume !== undefined) {\n      bits |= U_LOOP_VOLUME;\n  }\n\n  // High Bits Fields\n  if ((to.loopAttenuation !== from.loopAttenuation || force) && to.loopAttenuation !== undefined) {\n      bitsHigh |= U_LOOP_ATTENUATION_HIGH;\n  }\n  if ((to.owner !== from.owner || force) && to.owner !== undefined) {\n      bitsHigh |= U_OWNER_HIGH;\n  }\n  if ((to.oldFrame !== from.oldFrame || force) && to.oldFrame !== undefined) {\n      bitsHigh |= U_OLD_FRAME_HIGH;\n  }\n\n\n  // Handle entity number\n  if (to.number >= 256) {\n      bits |= U_NUMBER16;\n  }\n\n  // Determine needed bytes for header\n\n  // If we have high bits, we set U_MOREBITS4 on the 4th byte\n  if (bitsHigh > 0) {\n      bits |= U_MOREBITS4;\n  }\n\n  // Now calculate cascading flags\n  if (bits & 0xFF000000) { // e.g. U_MOREBITS4 (bit 31) is here\n      bits |= U_MOREBITS3;\n  }\n  if (bits & 0xFFFF0000) { // e.g. U_MOREBITS3 (bit 23) is here\n      bits |= U_MOREBITS2;\n  }\n  if (bits & 0xFFFFFF00) { // e.g. U_MOREBITS2 (bit 15) is here\n      bits |= U_MOREBITS1;\n  }\n\n  // Write Header\n  writer.writeByte(bits & 0xFF);\n\n  if (bits & U_MOREBITS1) {\n      writer.writeByte((bits >> 8) & 0xFF);\n  }\n  if (bits & U_MOREBITS2) {\n      writer.writeByte((bits >> 16) & 0xFF);\n  }\n  if (bits & U_MOREBITS3) {\n      writer.writeByte((bits >> 24) & 0xFF);\n  }\n  if (bits & U_MOREBITS4) {\n      writer.writeByte(bitsHigh & 0xFF);\n  }\n\n  // Write Number\n  if (bits & U_NUMBER16) {\n      writer.writeShort(to.number);\n  } else {\n      writer.writeByte(to.number);\n  }\n\n  // Write Fields in Order (matching NetworkMessageParser.parseDelta)\n  if (bits & U_MODEL) writer.writeByte(to.modelIndex);\n  if (bits & U_MODEL2) writer.writeByte(to.modelIndex2 ?? 0);\n  if (bits & U_MODEL3) writer.writeByte(to.modelIndex3 ?? 0);\n  if (bits & U_MODEL4) writer.writeByte(to.modelIndex4 ?? 0);\n\n  if (bits & U_FRAME8) writer.writeByte(to.frame);\n  if (bits & U_FRAME16) writer.writeShort(to.frame);\n\n  if (bits & U_SKIN8) writer.writeByte(to.skinNum);\n  if (bits & U_SKIN16) writer.writeShort(to.skinNum);\n\n  if (bits & U_EFFECTS8) writer.writeByte(to.effects);\n  if (bits & U_EFFECTS16) writer.writeShort(to.effects);\n\n  if (bits & U_RENDERFX8) writer.writeByte(to.renderfx);\n  if (bits & U_RENDERFX16) writer.writeShort(to.renderfx);\n\n  if (bits & U_ORIGIN1) writer.writeCoord(to.origin.x);\n  if (bits & U_ORIGIN2) writer.writeCoord(to.origin.y);\n  if (bits & U_ORIGIN3) writer.writeCoord(to.origin.z);\n\n  if (bits & U_ANGLE1) writer.writeAngle(to.angles.x);\n  if (bits & U_ANGLE2) writer.writeAngle(to.angles.y);\n  if (bits & U_ANGLE3) writer.writeAngle(to.angles.z);\n\n  if (bits & U_OLDORIGIN) {\n      // Not implemented in EntityState usually, skip or zero\n      // writer.writePos(to.old_origin);\n  }\n\n  if (bits & U_SOUND) writer.writeByte(to.sound ?? 0);\n\n  if (bits & U_EVENT) writer.writeByte(to.event ?? 0);\n\n  if (bits & U_SOLID) writer.writeShort(to.solid);\n\n  // Rerelease Fields Writing\n  if (bits & U_ALPHA) writer.writeByte(Math.floor((to.alpha ?? 0) * 255));\n  if (bits & U_SCALE) writer.writeFloat(to.scale ?? 0);\n  if (bits & U_INSTANCE_BITS) writer.writeLong(to.instanceBits ?? 0);\n  if (bits & U_LOOP_VOLUME) writer.writeByte(Math.floor((to.loopVolume ?? 0) * 255));\n\n  // High bits fields\n  if (bitsHigh & U_LOOP_ATTENUATION_HIGH) writer.writeByte(Math.floor((to.loopAttenuation ?? 0) * 255));\n  if (bitsHigh & U_OWNER_HIGH) writer.writeShort(to.owner ?? 0);\n  if (bitsHigh & U_OLD_FRAME_HIGH) writer.writeShort(to.oldFrame ?? 0);\n}\n","import { BinaryWriter, Vec3 } from '../index.js';\n\nexport interface ProtocolPlayerState {\n  pm_type: number;\n  origin: Vec3;\n  velocity: Vec3;\n  pm_time: number;\n  pm_flags: number;\n  gravity: number;\n  delta_angles: Vec3;\n  viewoffset: Vec3;\n  viewangles: Vec3;\n  kick_angles: Vec3;\n  gun_index: number;\n  gun_frame: number;\n  gun_offset: Vec3;\n  gun_angles: Vec3;\n  blend: number[]; // [r,g,b,a]\n  fov: number;\n  rdflags: number;\n  stats: number[];\n  watertype: number;\n\n  // Optional / Extension fields if needed\n  gunskin?: number;\n  gunrate?: number;\n  damage_blend?: number[];\n  team_id?: number;\n}\n\n// Bitflags matching demo/parser.ts\nconst PS_M_TYPE = (1 << 0);\nconst PS_M_ORIGIN = (1 << 1);\nconst PS_M_VELOCITY = (1 << 2);\nconst PS_M_TIME = (1 << 3);\nconst PS_M_FLAGS = (1 << 4);\nconst PS_M_GRAVITY = (1 << 5);\nconst PS_M_DELTA_ANGLES = (1 << 6);\nconst PS_VIEWOFFSET = (1 << 7);\nconst PS_VIEWANGLES = (1 << 8);\nconst PS_KICKANGLES = (1 << 9);\nconst PS_BLEND = (1 << 10);\nconst PS_FOV = (1 << 11);\nconst PS_WEAPONINDEX = (1 << 12);\nconst PS_WEAPONFRAME = (1 << 13);\nconst PS_RDFLAGS = (1 << 14);\nconst PS_WATERTYPE = (1 << 15);\n\nexport function writePlayerState(writer: BinaryWriter, ps: ProtocolPlayerState): void {\n  // Determine mask\n  let mask = 0;\n\n  if (ps.pm_type !== 0) mask |= PS_M_TYPE;\n  if (ps.origin.x !== 0 || ps.origin.y !== 0 || ps.origin.z !== 0) mask |= PS_M_ORIGIN;\n  if (ps.velocity.x !== 0 || ps.velocity.y !== 0 || ps.velocity.z !== 0) mask |= PS_M_VELOCITY;\n  if (ps.pm_time !== 0) mask |= PS_M_TIME;\n  if (ps.pm_flags !== 0) mask |= PS_M_FLAGS;\n  if (ps.gravity !== 0) mask |= PS_M_GRAVITY;\n  if (ps.delta_angles.x !== 0 || ps.delta_angles.y !== 0 || ps.delta_angles.z !== 0) mask |= PS_M_DELTA_ANGLES;\n  if (ps.viewoffset.x !== 0 || ps.viewoffset.y !== 0 || ps.viewoffset.z !== 0) mask |= PS_VIEWOFFSET;\n  if (ps.viewangles.x !== 0 || ps.viewangles.y !== 0 || ps.viewangles.z !== 0) mask |= PS_VIEWANGLES;\n  if (ps.kick_angles.x !== 0 || ps.kick_angles.y !== 0 || ps.kick_angles.z !== 0) mask |= PS_KICKANGLES;\n  if (ps.gun_index !== 0) mask |= PS_WEAPONINDEX;\n\n  // Weapon frame includes offset/angles\n  if (ps.gun_frame !== 0 ||\n      ps.gun_offset.x !== 0 || ps.gun_offset.y !== 0 || ps.gun_offset.z !== 0 ||\n      ps.gun_angles.x !== 0 || ps.gun_angles.y !== 0 || ps.gun_angles.z !== 0) {\n      mask |= PS_WEAPONFRAME;\n  }\n\n  if (ps.blend && (ps.blend[0] !== 0 || ps.blend[1] !== 0 || ps.blend[2] !== 0 || ps.blend[3] !== 0)) {\n      mask |= PS_BLEND;\n  }\n\n  if (ps.fov !== 0) mask |= PS_FOV;\n  if (ps.rdflags !== 0) mask |= PS_RDFLAGS;\n  if (ps.watertype !== 0) mask |= PS_WATERTYPE;\n\n  // Stats mask calculation\n  let statsMask = 0;\n  // Only support first 32 stats for now\n  for (let i = 0; i < 32; i++) {\n      if (ps.stats[i] && ps.stats[i] !== 0) {\n          statsMask |= (1 << i);\n      }\n  }\n\n  // Write header\n  writer.writeShort(mask);\n\n  // Write fields\n  if (mask & PS_M_TYPE) writer.writeByte(ps.pm_type);\n\n  if (mask & PS_M_ORIGIN) {\n      writer.writeShort(Math.round(ps.origin.x * 8));\n      writer.writeShort(Math.round(ps.origin.y * 8));\n      writer.writeShort(Math.round(ps.origin.z * 8));\n  }\n\n  if (mask & PS_M_VELOCITY) {\n      writer.writeShort(Math.round(ps.velocity.x * 8));\n      writer.writeShort(Math.round(ps.velocity.y * 8));\n      writer.writeShort(Math.round(ps.velocity.z * 8));\n  }\n\n  if (mask & PS_M_TIME) writer.writeByte(ps.pm_time);\n  if (mask & PS_M_FLAGS) writer.writeByte(ps.pm_flags);\n  if (mask & PS_M_GRAVITY) writer.writeShort(ps.gravity);\n\n  if (mask & PS_M_DELTA_ANGLES) {\n      writer.writeShort(Math.round(ps.delta_angles.x * (32768 / 180)));\n      writer.writeShort(Math.round(ps.delta_angles.y * (32768 / 180)));\n      writer.writeShort(Math.round(ps.delta_angles.z * (32768 / 180)));\n  }\n\n  if (mask & PS_VIEWOFFSET) {\n      writer.writeChar(Math.round(ps.viewoffset.x * 4));\n      writer.writeChar(Math.round(ps.viewoffset.y * 4));\n      writer.writeChar(Math.round(ps.viewoffset.z * 4));\n  }\n\n  if (mask & PS_VIEWANGLES) {\n      writer.writeAngle16(ps.viewangles.x);\n      writer.writeAngle16(ps.viewangles.y);\n      writer.writeAngle16(ps.viewangles.z);\n  }\n\n  if (mask & PS_KICKANGLES) {\n      writer.writeChar(Math.round(ps.kick_angles.x * 4));\n      writer.writeChar(Math.round(ps.kick_angles.y * 4));\n      writer.writeChar(Math.round(ps.kick_angles.z * 4));\n  }\n\n  if (mask & PS_WEAPONINDEX) writer.writeByte(ps.gun_index);\n\n  if (mask & PS_WEAPONFRAME) {\n      writer.writeByte(ps.gun_frame);\n      writer.writeChar(Math.round(ps.gun_offset.x * 4));\n      writer.writeChar(Math.round(ps.gun_offset.y * 4));\n      writer.writeChar(Math.round(ps.gun_offset.z * 4));\n      writer.writeChar(Math.round(ps.gun_angles.x * 4));\n      writer.writeChar(Math.round(ps.gun_angles.y * 4));\n      writer.writeChar(Math.round(ps.gun_angles.z * 4));\n  }\n\n  if (mask & PS_BLEND) {\n      writer.writeByte(Math.round(ps.blend[0]));\n      writer.writeByte(Math.round(ps.blend[1]));\n      writer.writeByte(Math.round(ps.blend[2]));\n      writer.writeByte(Math.round(ps.blend[3]));\n  }\n\n  if (mask & PS_FOV) writer.writeByte(ps.fov);\n  if (mask & PS_RDFLAGS) writer.writeByte(ps.rdflags);\n  if (mask & PS_WATERTYPE) writer.writeByte(ps.watertype);\n\n  // Write Stats\n  writer.writeLong(statsMask);\n  for (let i = 0; i < 32; i++) {\n      if (statsMask & (1 << i)) {\n          writer.writeShort(ps.stats[i]);\n      }\n  }\n}\n","\nimport { PmoveCmd, PmoveTraceFn } from './types.js';\nimport { Vec3 } from '../math/vec3.js';\n\nimport { applyPmoveAccelerate, applyPmoveFriction, buildAirGroundWish, buildWaterWish } from './pmove.js';\nimport { PlayerState } from '../protocol/player-state.js';\nimport { angleVectors } from '../math/angles.js';\nimport { MASK_WATER } from '../bsp/contents.js';\n\nconst FRAMETIME = 0.025;\n\n// Local definition to avoid dependency issues if constants.ts is missing\n// Matches packages/shared/src/pmove/constants.ts\nconst WaterLevel = {\n  None: 0,\n  Feet: 1,\n  Waist: 2,\n  Under: 3,\n} as const;\n\nconst categorizePosition = (state: PlayerState, trace: PmoveTraceFn): PlayerState => {\n  const point = { ...state.origin };\n  point.z -= 0.25;\n  const traceResult = trace(state.origin, point);\n\n  return {\n    ...state,\n    onGround: traceResult.fraction < 1,\n  };\n};\n\nconst checkWater = (state: PlayerState, pointContents: (point: Vec3) => number): PlayerState => {\n  const point = { ...state.origin };\n  const { mins, maxs } = state;\n\n  // Default to feet\n  point.z = state.origin.z + mins.z + 1;\n\n  const feetContents = pointContents(point);\n\n  if (!(feetContents & MASK_WATER)) {\n    return { ...state, waterLevel: WaterLevel.None, watertype: 0 };\n  }\n\n  let waterLevel: number = WaterLevel.Feet;\n  let watertype = feetContents;\n\n  // Check waist\n  const waist = state.origin.z + (mins.z + maxs.z) * 0.5;\n  point.z = waist;\n  const waistContents = pointContents(point);\n\n  if (waistContents & MASK_WATER) {\n    waterLevel = WaterLevel.Waist;\n    watertype = waistContents;\n\n    // Check head (eyes)\n    // Standard Quake 2 viewheight is 22. maxs.z is typically 32.\n    // So eyes are roughly at origin.z + 22.\n    // We'll use origin.z + 22 to check if eyes are underwater.\n    // If viewheight was available in PlayerState, we'd use that.\n    const head = state.origin.z + 22;\n    point.z = head;\n    const headContents = pointContents(point);\n\n    if (headContents & MASK_WATER) {\n      waterLevel = WaterLevel.Under;\n      watertype = headContents;\n    }\n  }\n\n  return { ...state, waterLevel, watertype };\n};\n\n\nexport const applyPmove = (\n  state: PlayerState,\n  cmd: PmoveCmd,\n  trace: PmoveTraceFn,\n  pointContents: (point: Vec3) => number\n): PlayerState => {\n  let newState = { ...state };\n  newState = categorizePosition(newState, trace);\n  newState = checkWater(newState, pointContents);\n\n  const { origin, velocity, onGround, waterLevel, viewAngles } = newState;\n\n  // Calculate forward and right vectors from view angles\n  // For water movement, use full view angles including pitch\n  // For ground/air movement, reduce pitch influence by dividing by 3\n  // See: rerelease/p_move.cpp lines 1538, 1686-1691, 800, 858\n  const adjustedAngles = waterLevel >= 2\n    ? viewAngles\n    : {\n        // For ground/air movement, reduce pitch influence (rerelease/p_move.cpp:1689)\n        x: viewAngles.x > 180 ? (viewAngles.x - 360) / 3 : viewAngles.x / 3,\n        y: viewAngles.y,\n        z: viewAngles.z,\n      };\n\n  const { forward, right } = angleVectors(adjustedAngles);\n\n  // Apply friction BEFORE acceleration to match original Quake 2 rerelease behavior\n  // See: rerelease/src/game/player/pmove.c lines 1678 (PM_Friction) then 1693 (PM_AirMove->PM_Accelerate)\n  const frictionedVelocity = applyPmoveFriction({\n    velocity,\n    frametime: FRAMETIME,\n    onGround,\n    groundIsSlick: false,\n    onLadder: false,\n    waterlevel: waterLevel,\n    pmFriction: 6,\n    pmStopSpeed: 100,\n    pmWaterFriction: 1,\n  });\n\n  const wish = waterLevel >= 2\n    ? buildWaterWish({\n        forward,\n        right,\n        cmd,\n        maxSpeed: 320,\n      })\n    : buildAirGroundWish({\n        forward,\n        right,\n        cmd,\n        maxSpeed: 320,\n      });\n\n  const finalVelocity = applyPmoveAccelerate({\n    velocity: frictionedVelocity,\n    wishdir: wish.wishdir,\n    wishspeed: wish.wishspeed,\n    // Water movement uses ground acceleration (10), not air acceleration (1)\n    accel: (onGround || waterLevel >= 2) ? 10 : 1,\n    frametime: FRAMETIME,\n  });\n\n  const traceResult = trace(origin, {\n    x: origin.x + finalVelocity.x * FRAMETIME,\n    y: origin.y + finalVelocity.y * FRAMETIME,\n    z: origin.z + finalVelocity.z * FRAMETIME,\n  });\n\n  return {\n    ...newState,\n    origin: traceResult.endpos,\n    velocity: finalVelocity,\n  };\n};\n","import { Vec3 } from '../math/vec3.js';\nimport { ANORMS } from '../math/anorms.js';\n\nexport class BinaryStream {\n  private view: DataView;\n  private offset: number;\n  private length: number;\n\n  constructor(buffer: ArrayBuffer | Uint8Array) {\n    if (buffer instanceof Uint8Array) {\n      this.view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);\n    } else {\n      this.view = new DataView(buffer);\n    }\n    this.offset = 0;\n    this.length = this.view.byteLength;\n  }\n\n  public getPosition(): number {\n    return this.offset;\n  }\n\n  public getReadPosition(): number {\n    return this.offset;\n  }\n\n  public getLength(): number {\n    return this.length;\n  }\n\n  public getRemaining(): number {\n    return this.length - this.offset;\n  }\n\n  public seek(position: number): void {\n    if (position < 0 || position > this.length) {\n      throw new Error(`Seek out of bounds: ${position} (length: ${this.length})`);\n    }\n    this.offset = position;\n  }\n\n  public setReadPosition(position: number): void {\n    this.seek(position);\n  }\n\n  public hasMore(): boolean {\n    return this.offset < this.length;\n  }\n\n  public hasBytes(count: number): boolean {\n    return this.offset + count <= this.length;\n  }\n\n  public readChar(): number {\n    const value = this.view.getInt8(this.offset);\n    this.offset += 1;\n    return value;\n  }\n\n  public readByte(): number {\n    const value = this.view.getUint8(this.offset);\n    this.offset += 1;\n    return value;\n  }\n\n  public readShort(): number {\n    const value = this.view.getInt16(this.offset, true);\n    this.offset += 2;\n    return value;\n  }\n\n  public readUShort(): number {\n    const value = this.view.getUint16(this.offset, true);\n    this.offset += 2;\n    return value;\n  }\n\n  public readLong(): number {\n    const value = this.view.getInt32(this.offset, true);\n    this.offset += 4;\n    return value;\n  }\n\n  public readULong(): number {\n    const value = this.view.getUint32(this.offset, true);\n    this.offset += 4;\n    return value;\n  }\n\n  public readFloat(): number {\n    const value = this.view.getFloat32(this.offset, true);\n    this.offset += 4;\n    return value;\n  }\n\n  public readString(): string {\n    let str = '';\n    while (this.offset < this.length) {\n      const charCode = this.readChar();\n      if (charCode === -1 || charCode === 0) {\n        break;\n      }\n      str += String.fromCharCode(charCode);\n    }\n    return str;\n  }\n\n  public readStringLine(): string {\n    let str = '';\n    while (this.offset < this.length) {\n      const charCode = this.readChar();\n      if (charCode === -1 || charCode === 0 || charCode === 10) { // 10 is \\n\n        break;\n      }\n      str += String.fromCharCode(charCode);\n    }\n    return str;\n  }\n\n  public readCoord(): number {\n    return this.readShort() * (1.0 / 8.0);\n  }\n\n  public readAngle(): number {\n    return this.readChar() * (360.0 / 256.0);\n  }\n\n  public readAngle16(): number {\n    return (this.readShort() * 360.0) / 65536.0;\n  }\n\n  public readData(length: number): Uint8Array {\n    if (this.offset + length > this.length) {\n       throw new Error(`Read out of bounds: ${this.offset + length} (length: ${this.length})`);\n    }\n    const data = new Uint8Array(this.view.buffer, this.view.byteOffset + this.offset, length);\n    this.offset += length;\n    // Return a copy to avoid side effects if the original buffer is modified or reused\n    return new Uint8Array(data);\n  }\n\n  public readPos(out: { x: number, y: number, z: number }): void {\n    out.x = this.readCoord();\n    out.y = this.readCoord();\n    out.z = this.readCoord();\n  }\n\n  public readDir(out: { x: number, y: number, z: number }): void {\n    const b = this.readByte();\n    if (b >= 162) { // NUMVERTEXNORMALS\n      out.x = 0; out.y = 0; out.z = 0;\n      return;\n    }\n    const norm = ANORMS[b];\n    out.x = norm[0];\n    out.y = norm[1];\n    out.z = norm[2];\n  }\n}\n","import { ANORMS } from '../math/anorms.js';\nimport { Vec3 } from '../math/vec3.js';\n\nexport class BinaryWriter {\n  private buffer: Uint8Array;\n  private view: DataView;\n  private offset: number;\n  private readonly fixed: boolean;\n\n  constructor(sizeOrBuffer: number | Uint8Array = 1400) {\n    if (typeof sizeOrBuffer === 'number') {\n      this.buffer = new Uint8Array(sizeOrBuffer);\n      this.fixed = false;\n    } else {\n      this.buffer = sizeOrBuffer;\n      this.fixed = true;\n    }\n    this.view = new DataView(this.buffer.buffer, this.buffer.byteOffset, this.buffer.byteLength);\n    this.offset = 0;\n  }\n\n  private ensureSpace(bytes: number) {\n    if (this.offset + bytes > this.buffer.byteLength) {\n      if (this.fixed) {\n        throw new Error(`Buffer overflow: capacity ${this.buffer.byteLength}, needed ${this.offset + bytes}`);\n      }\n      // Expand buffer (double size)\n      const newSize = Math.max(this.buffer.byteLength * 2, this.offset + bytes);\n      const newBuffer = new Uint8Array(newSize);\n      newBuffer.set(this.buffer);\n      this.buffer = newBuffer;\n      this.view = new DataView(this.buffer.buffer, this.buffer.byteOffset, this.buffer.byteLength);\n    }\n  }\n\n  public writeByte(value: number): void {\n    this.ensureSpace(1);\n    this.view.setUint8(this.offset, value);\n    this.offset += 1;\n  }\n\n  public writeBytes(data: Uint8Array): void {\n      this.ensureSpace(data.byteLength);\n      this.buffer.set(data, this.offset);\n      this.offset += data.byteLength;\n  }\n\n  public writeChar(value: number): void {\n    this.ensureSpace(1);\n    this.view.setInt8(this.offset, value);\n    this.offset += 1;\n  }\n\n  public writeShort(value: number): void {\n    this.ensureSpace(2);\n    // Use setUint16 to allow writing 0xFFFF as a valid pattern even if it represents -1\n    // But value might be negative (-1). setUint16(-1) wraps to 65535.\n    // So setInt16 is fine if value is in range.\n    // If value is 65535 (from bit manipulation), setInt16 might throw?\n    // Let's safe cast.\n    this.view.setInt16(this.offset, value, true);\n    this.offset += 2;\n  }\n\n  public writeLong(value: number): void {\n    this.ensureSpace(4);\n    this.view.setInt32(this.offset, value, true);\n    this.offset += 4;\n  }\n\n  public writeFloat(value: number): void {\n    this.ensureSpace(4);\n    this.view.setFloat32(this.offset, value, true);\n    this.offset += 4;\n  }\n\n  public writeString(value: string): void {\n    // UTF-8 encoding of string + null terminator\n    // We iterate manually to match readString behavior (ASCII/Latin1 mostly)\n    // and avoid TextEncoder overhead if simple\n    const len = value.length;\n    this.ensureSpace(len + 1);\n    for (let i = 0; i < len; i++) {\n      this.view.setUint8(this.offset + i, value.charCodeAt(i));\n    }\n    this.view.setUint8(this.offset + len, 0);\n    this.offset += len + 1;\n  }\n\n  public writeCoord(value: number): void {\n    this.writeShort(Math.trunc(value * 8));\n  }\n\n  public writeAngle(value: number): void {\n    this.writeByte(Math.trunc(value * 256.0 / 360.0) & 255);\n  }\n\n  public writeAngle16(value: number): void {\n    this.writeShort(Math.trunc(value * 65536.0 / 360.0) & 65535);\n  }\n\n  public writePos(pos: Vec3): void {\n    this.writeCoord(pos.x);\n    this.writeCoord(pos.y);\n    this.writeCoord(pos.z);\n  }\n\n  public writeDir(dir: Vec3): void {\n      // Find closest normal\n      let maxDot = -1.0;\n      let bestIndex = 0;\n\n      // Check for zero vector\n      if (dir.x === 0 && dir.y === 0 && dir.z === 0) {\n        this.writeByte(0);\n        return;\n      }\n\n      for (let i = 0; i < ANORMS.length; i++) {\n        const norm = ANORMS[i];\n        const dot = dir.x * norm[0] + dir.y * norm[1] + dir.z * norm[2];\n        if (dot > maxDot) {\n          maxDot = dot;\n          bestIndex = i;\n        }\n      }\n\n      this.writeByte(bestIndex);\n  }\n\n  public getData(): Uint8Array {\n      return this.buffer.slice(0, this.offset);\n  }\n\n  public getBuffer(): Uint8Array {\n      return this.buffer;\n  }\n\n  public getOffset(): number {\n      return this.offset;\n  }\n\n  public reset(): void {\n      this.offset = 0;\n  }\n}\n","import { ANORMS } from '../math/anorms.js';\n\nexport class NetworkMessageBuilder {\n  private buffer: Uint8Array;\n  private view: DataView;\n  private offset: number;\n\n  constructor(initialSize: number = 1024) {\n    this.buffer = new Uint8Array(initialSize);\n    this.view = new DataView(this.buffer.buffer);\n    this.offset = 0;\n  }\n\n  private ensureCapacity(needed: number): void {\n    if (this.offset + needed > this.buffer.length) {\n      const newSize = Math.max(this.buffer.length * 2, this.offset + needed);\n      const newBuffer = new Uint8Array(newSize);\n      newBuffer.set(this.buffer);\n      this.buffer = newBuffer;\n      this.view = new DataView(this.buffer.buffer);\n    }\n  }\n\n  public getData(): Uint8Array {\n    return this.buffer.slice(0, this.offset);\n  }\n\n  public writeByte(value: number): void {\n    this.ensureCapacity(1);\n    this.view.setUint8(this.offset, value);\n    this.offset += 1;\n  }\n\n  public writeChar(value: number): void {\n    this.ensureCapacity(1);\n    this.view.setInt8(this.offset, value);\n    this.offset += 1;\n  }\n\n  public writeShort(value: number): void {\n    this.ensureCapacity(2);\n    this.view.setInt16(this.offset, value, true);\n    this.offset += 2;\n  }\n\n  public writeUShort(value: number): void {\n      this.ensureCapacity(2);\n      this.view.setUint16(this.offset, value, true);\n      this.offset += 2;\n  }\n\n  public writeLong(value: number): void {\n    this.ensureCapacity(4);\n    this.view.setInt32(this.offset, value, true);\n    this.offset += 4;\n  }\n\n  public writeFloat(value: number): void {\n    this.ensureCapacity(4);\n    this.view.setFloat32(this.offset, value, true);\n    this.offset += 4;\n  }\n\n  public writeString(value: string): void {\n    const len = value.length + 1; // +1 for null terminator\n    this.ensureCapacity(len);\n    for (let i = 0; i < value.length; i++) {\n      this.view.setUint8(this.offset + i, value.charCodeAt(i));\n    }\n    this.view.setUint8(this.offset + value.length, 0);\n    this.offset += len;\n  }\n\n  public writeData(data: Uint8Array): void {\n      this.ensureCapacity(data.length);\n      this.buffer.set(data, this.offset);\n      this.offset += data.length;\n  }\n\n  public writeCoord(value: number): void {\n    this.writeShort(Math.round(value * 8.0));\n  }\n\n  public writeAngle(value: number): void {\n    this.writeByte(Math.round(value * 256.0 / 360.0) & 255);\n  }\n\n  public writeAngle16(value: number): void {\n    this.writeShort(Math.round(value * 65536.0 / 360.0));\n  }\n\n  public writeDir(x: number, y: number, z: number): void {\n      // Find closest normal from ANORMS\n      // Simple brute force or use lookup if needed.\n      // For now, let's just use 0 if implementation is complex to find best match.\n      // Or unimplemented for now?\n      // \"WriteDir\" in Q2 usually means writing a byte index into ANORMS.\n\n      let best = 0;\n      let bestDot = -999999;\n\n      const len = Math.sqrt(x*x + y*y + z*z);\n      if (len > 0) {\n          x /= len; y /= len; z /= len;\n\n          for (let i=0; i<162; i++) {\n              const dot = x*ANORMS[i][0] + y*ANORMS[i][1] + z*ANORMS[i][2];\n              if (dot > bestDot) {\n                  bestDot = dot;\n                  best = i;\n              }\n          }\n      }\n\n      this.writeByte(best);\n  }\n}\n","import { BinaryWriter } from '../io/binaryWriter.js';\n\nexport interface NetAddress {\n  type: string;\n  port: number;\n}\n\n/**\n * NetChan handles reliable message delivery over an unreliable channel (UDP/WebSocket).\n * Fragmentation support is planned but not fully implemented.\n *\n * Ported from qcommon/net_chan.c\n */\nexport class NetChan {\n  // Constants from net_chan.c\n  static readonly MAX_MSGLEN = 1400;\n  static readonly FRAGMENT_SIZE = 1024;\n  static readonly PACKET_HEADER = 10; // sequence(4) + ack(4) + qport(2)\n  static readonly HEADER_OVERHEAD = NetChan.PACKET_HEADER + 2; // +2 for reliable length prefix\n\n  // Increase internal reliable buffer to support large messages (fragmentation)\n  // Quake 2 uses MAX_MSGLEN for the reliable buffer, limiting single messages to ~1400 bytes.\n  // We expand this to allow larger messages (e.g. snapshots, downloads) which are then fragmented.\n  static readonly MAX_RELIABLE_BUFFER = 0x40000; // 256KB\n\n  // Public state\n  qport = 0; // qport value to distinguish multiple clients from same IP\n\n  // Sequencing\n  incomingSequence = 0;\n  outgoingSequence = 0;\n  incomingAcknowledged = 0;\n\n  // Reliable messaging\n  incomingReliableAcknowledged = false; // single bit\n  incomingReliableSequence = 0; // last reliable message sequence received\n  outgoingReliableSequence = 0; // reliable message sequence number to send\n  reliableMessage: BinaryWriter;\n  reliableLength = 0;\n\n  // Fragmentation State (Sending)\n  fragmentSendOffset = 0;\n\n  // Fragmentation State (Receiving)\n  fragmentBuffer: Uint8Array | null = null;\n  fragmentLength = 0;\n  fragmentReceived = 0;\n\n  // Timing\n  lastReceived = 0;\n  lastSent = 0;\n\n  remoteAddress: NetAddress | null = null;\n\n  constructor() {\n    // Initialize buffers\n    this.reliableMessage = new BinaryWriter(NetChan.MAX_RELIABLE_BUFFER);\n\n    // Set initial timestamps\n    const now = Date.now();\n    this.lastReceived = now;\n    this.lastSent = now;\n\n    // Random qport by default (can be overridden)\n    // Ensure we use global Math.random which is usually seeded or random enough for basic collision avoidance\n    this.qport = Math.floor(Math.random() * 65536);\n  }\n\n  /**\n   * Setup the netchan with specific settings\n   */\n  setup(qport: number, address: NetAddress | null = null): void {\n    this.qport = qport;\n    this.remoteAddress = address;\n    this.reset();\n  }\n\n  /**\n   * Reset the netchan state\n   */\n  reset(): void {\n    this.incomingSequence = 0;\n    this.outgoingSequence = 0;\n    this.incomingAcknowledged = 0;\n    this.incomingReliableAcknowledged = false;\n    this.incomingReliableSequence = 0;\n    this.outgoingReliableSequence = 0;\n    this.reliableLength = 0;\n    this.reliableMessage.reset();\n\n    this.fragmentSendOffset = 0;\n    this.fragmentBuffer = null;\n    this.fragmentLength = 0;\n    this.fragmentReceived = 0;\n\n    this.lastReceived = Date.now();\n    this.lastSent = Date.now();\n  }\n\n  /**\n   * Transmits a packet containing reliable and unreliable data\n   */\n  transmit(unreliableData?: Uint8Array): Uint8Array {\n    this.outgoingSequence++;\n    this.lastSent = Date.now();\n\n    // Determine how much reliable data to send in this packet\n    let sendReliableLength = 0;\n    let isFragment = false;\n    let fragmentStart = 0;\n\n    if (this.reliableLength > 0) {\n      // Check if we need to fragment\n      if (this.reliableLength > NetChan.FRAGMENT_SIZE) {\n        // We are in fragment mode\n        isFragment = true;\n\n        // If we have finished sending all fragments but still haven't received ACK,\n        // we must loop back to the beginning to retransmit.\n        if (this.fragmentSendOffset >= this.reliableLength) {\n          this.fragmentSendOffset = 0;\n        }\n\n        // Calculate chunk size\n        const remaining = this.reliableLength - this.fragmentSendOffset;\n        sendReliableLength = remaining;\n        if (sendReliableLength > NetChan.FRAGMENT_SIZE) {\n          sendReliableLength = NetChan.FRAGMENT_SIZE;\n        }\n\n        fragmentStart = this.fragmentSendOffset;\n\n        // Advance offset for the next packet\n        this.fragmentSendOffset += sendReliableLength;\n      } else {\n        // Fits in one packet\n        sendReliableLength = this.reliableLength;\n      }\n    }\n\n    // Calculate total size\n    // Header + Reliable + Unreliable\n    const headerSize = NetChan.PACKET_HEADER;\n    const reliableHeaderSize = sendReliableLength > 0 ? 2 + (isFragment ? 8 : 0) : 0; // +2 length, +8 fragment info\n\n    let unreliableSize = unreliableData ? unreliableData.length : 0;\n\n    // Check for overflow\n    if (headerSize + reliableHeaderSize + sendReliableLength + unreliableSize > NetChan.MAX_MSGLEN) {\n      unreliableSize = NetChan.MAX_MSGLEN - headerSize - reliableHeaderSize - sendReliableLength;\n      // We truncate unreliable data if it doesn't fit with reliable data\n      if (unreliableSize < 0) unreliableSize = 0;\n    }\n\n    const buffer = new ArrayBuffer(headerSize + reliableHeaderSize + sendReliableLength + unreliableSize);\n    const view = new DataView(buffer);\n    const result = new Uint8Array(buffer);\n\n    // Write Header\n    // Sequence\n    let sequence = this.outgoingSequence;\n\n    // Set reliable bit if we are sending reliable data\n    if (sendReliableLength > 0) {\n      sequence |= 0x80000000;\n      // Also set the reliable sequence bit (0/1 toggle) at bit 30\n      if ((this.outgoingReliableSequence & 1) !== 0) {\n        sequence |= 0x40000000;\n      }\n    }\n\n    view.setUint32(0, sequence, true);\n\n    // Acknowledge\n    // Set reliable ack bit at bit 31\n    let ack = this.incomingSequence;\n    if ((this.incomingReliableSequence & 1) !== 0) {\n      ack |= 0x80000000;\n    }\n    view.setUint32(4, ack, true);\n\n    view.setUint16(8, this.qport, true);\n\n    // Copy Reliable Data\n    let offset = headerSize;\n    if (sendReliableLength > 0) {\n      // Write length of reliable data (2 bytes)\n      // Extension: If length has high bit (0x8000), it's a fragment.\n      let lengthField = sendReliableLength;\n      if (isFragment) {\n        lengthField |= 0x8000;\n      }\n\n      view.setUint16(offset, lengthField, true);\n      offset += 2;\n\n      if (isFragment) {\n        // Write fragment info: 4 bytes start offset, 4 bytes total length\n        view.setUint32(offset, fragmentStart, true);\n        offset += 4;\n        view.setUint32(offset, this.reliableLength, true);\n        offset += 4;\n      }\n\n      // Copy data\n      const reliableBuffer = this.reliableMessage.getBuffer();\n      const reliableBytes = reliableBuffer.subarray(fragmentStart, fragmentStart + sendReliableLength);\n      result.set(reliableBytes, offset);\n      offset += sendReliableLength;\n    }\n\n    // Copy Unreliable Data\n    if (unreliableData && unreliableSize > 0) {\n      const chunk = unreliableData.slice(0, unreliableSize);\n      result.set(chunk, offset);\n    }\n\n    return result;\n  }\n\n  /**\n   * Processes a received packet\n   * Returns the payload data (reliable + unreliable) to be processed, or null if discarded\n   */\n  process(packet: Uint8Array): Uint8Array | null {\n    if (packet.length < 4) {\n      return null;\n    }\n\n    this.lastReceived = Date.now();\n\n    const view = new DataView(packet.buffer, packet.byteOffset, packet.byteLength);\n    const sequence = view.getUint32(0, true);\n\n    // Handle connectionless packet (sequence -1)\n    if (sequence === 0xFFFFFFFF) {\n        return packet.subarray(4);\n    }\n\n    if (packet.length < NetChan.PACKET_HEADER) {\n        return null;\n    }\n\n    const ack = view.getUint32(4, true);\n    const qport = view.getUint16(8, true);\n\n    if (this.qport !== qport) {\n      return null;\n    }\n\n    // Check for duplicate or out of order\n    const seqNumberClean = sequence & ~(0x80000000 | 0x40000000); // Mask out flags\n\n    // Handle wrapping using signed difference\n    if (((seqNumberClean - this.incomingSequence) | 0) <= 0) {\n      return null;\n    }\n\n    // Update incoming sequence\n    this.incomingSequence = seqNumberClean;\n\n    // Handle reliable acknowledgment\n    const ackNumber = ack & ~0x80000000;\n    const ackReliable = (ack & 0x80000000) !== 0;\n\n    if (ackNumber > this.incomingAcknowledged) {\n      this.incomingAcknowledged = ackNumber;\n    }\n\n    // Check if our reliable message was acknowledged\n    // If the receiver has toggled their reliable bit, it means they got the WHOLE message\n    if (this.reliableLength > 0) {\n       const receivedAckBit = ackReliable ? 1 : 0;\n       const currentReliableBit = this.outgoingReliableSequence & 1;\n\n       if (receivedAckBit !== currentReliableBit) {\n         // Acked!\n         this.reliableLength = 0;\n         this.reliableMessage.reset();\n         this.outgoingReliableSequence ^= 1;\n         this.fragmentSendOffset = 0; // Reset fragment offset\n       }\n    }\n\n    // Handle incoming reliable data\n    const hasReliableData = (sequence & 0x80000000) !== 0;\n    const reliableSeqBit = (sequence & 0x40000000) !== 0 ? 1 : 0;\n\n    let payloadOffset = NetChan.PACKET_HEADER;\n    let reliableData: Uint8Array | null = null;\n\n    if (hasReliableData) {\n       if (payloadOffset + 2 > packet.byteLength) return null; // Malformed\n\n       let reliableLen = view.getUint16(payloadOffset, true);\n       payloadOffset += 2;\n\n       const isFragment = (reliableLen & 0x8000) !== 0;\n       reliableLen &= 0x7FFF;\n\n       // Check if this is the expected reliable sequence\n       const expectedBit = this.incomingReliableSequence & 1;\n\n       if (reliableSeqBit === expectedBit) {\n          // It's the sequence we are waiting for\n\n          if (isFragment) {\n             // Read fragment info\n             if (payloadOffset + 8 > packet.byteLength) return null;\n             const fragStart = view.getUint32(payloadOffset, true);\n             payloadOffset += 4;\n             const fragTotal = view.getUint32(payloadOffset, true);\n             payloadOffset += 4;\n\n             // Validate fragTotal against MAX_RELIABLE_BUFFER\n             if (fragTotal > NetChan.MAX_RELIABLE_BUFFER) {\n               console.warn(`NetChan: received invalid fragment total ${fragTotal} > ${NetChan.MAX_RELIABLE_BUFFER}`);\n               return null;\n             }\n\n             // Initialize fragment buffer if needed\n             if (!this.fragmentBuffer || this.fragmentBuffer.length !== fragTotal) {\n                this.fragmentBuffer = new Uint8Array(fragTotal);\n                this.fragmentLength = fragTotal;\n                this.fragmentReceived = 0;\n             }\n\n             // Check for valid fragment offset\n             if (payloadOffset + reliableLen > packet.byteLength) return null;\n             const data = packet.subarray(payloadOffset, payloadOffset + reliableLen);\n\n             // Only accept if it matches our expected offset (enforce in-order delivery for simplicity)\n             // or check if we haven't received this part yet.\n             // Since we use a simple 'fragmentReceived' counter, we effectively expect in-order delivery\n             // of streams if we just use append logic.\n             // BUT UDP can reorder.\n             // To be robust, we should enforce strict ordering: fragStart must equal fragmentReceived.\n             // If we miss a chunk, we ignore subsequent chunks until the missing one arrives (via retransmit loop).\n\n             if (fragStart === this.fragmentReceived && fragStart + reliableLen <= fragTotal) {\n               this.fragmentBuffer.set(data, fragStart);\n               this.fragmentReceived += reliableLen;\n\n               // Check if complete\n               if (this.fragmentReceived >= fragTotal) {\n                 reliableData = this.fragmentBuffer;\n                 this.incomingReliableSequence++;\n                 this.fragmentBuffer = null;\n                 this.fragmentLength = 0;\n                 this.fragmentReceived = 0;\n               }\n             }\n\n          } else {\n             // Not a fragment (standard)\n             this.incomingReliableSequence++;\n             if (payloadOffset + reliableLen > packet.byteLength) return null;\n             reliableData = packet.slice(payloadOffset, payloadOffset + reliableLen);\n          }\n       }\n\n       // Advance past reliable data regardless\n       payloadOffset += reliableLen;\n    }\n\n    // Get unreliable data\n    const unreliableData = packet.slice(payloadOffset);\n\n    // Combine if we have reliable data\n    if (reliableData && reliableData.length > 0) {\n        const totalLen = reliableData.length + unreliableData.length;\n        const result = new Uint8Array(totalLen);\n        result.set(reliableData, 0);\n        result.set(unreliableData, reliableData.length);\n        return result;\n    }\n\n    if (unreliableData) {\n      return unreliableData;\n    }\n\n    return new Uint8Array(0);\n  }\n\n  /**\n   * Checks if reliable message buffer is empty and ready for new data\n   */\n  canSendReliable(): boolean {\n    return this.reliableLength === 0;\n  }\n\n  /**\n   * Writes a byte to the reliable message buffer\n   */\n  writeReliableByte(value: number): void {\n    if (this.reliableLength + 1 > NetChan.MAX_RELIABLE_BUFFER) {\n      throw new Error('NetChan reliable buffer overflow');\n    }\n    this.reliableMessage.writeByte(value);\n    this.reliableLength++;\n  }\n\n  /**\n   * Writes a short to the reliable message buffer\n   */\n  writeReliableShort(value: number): void {\n    if (this.reliableLength + 2 > NetChan.MAX_RELIABLE_BUFFER) {\n      throw new Error('NetChan reliable buffer overflow');\n    }\n    this.reliableMessage.writeShort(value);\n    this.reliableLength += 2;\n  }\n\n  /**\n   * Writes a long to the reliable message buffer\n   */\n  writeReliableLong(value: number): void {\n    if (this.reliableLength + 4 > NetChan.MAX_RELIABLE_BUFFER) {\n      throw new Error('NetChan reliable buffer overflow');\n    }\n    this.reliableMessage.writeLong(value);\n    this.reliableLength += 4;\n  }\n\n  /**\n   * Writes a string to the reliable message buffer\n   */\n  writeReliableString(value: string): void {\n    const len = value.length + 1; // +1 for null terminator\n    if (this.reliableLength + len > NetChan.MAX_RELIABLE_BUFFER) {\n      throw new Error('NetChan reliable buffer overflow');\n    }\n    this.reliableMessage.writeString(value);\n    this.reliableLength += len;\n  }\n\n  /**\n   * Returns the current reliable data buffer\n   */\n  getReliableData(): Uint8Array {\n    if (this.reliableLength === 0) {\n      return new Uint8Array(0);\n    }\n    const buffer = this.reliableMessage.getBuffer();\n    return buffer.subarray(0, this.reliableLength);\n  }\n\n  /**\n   * Checks if we need to send a keepalive packet\n   */\n  needsKeepalive(currentTime: number): boolean {\n    return (currentTime - this.lastSent) > 1000;\n  }\n\n  /**\n   * Checks if the connection has timed out\n   */\n  isTimedOut(currentTime: number, timeoutMs: number = 30000): boolean {\n    return (currentTime - this.lastReceived) > timeoutMs;\n  }\n}\n","/**\n * Weapon identifiers shared across game and cgame.\n * Reference: rerelease/g_items.cpp, game/src/inventory/playerInventory.ts\n */\n\nexport enum WeaponId {\n  Blaster = 'blaster',\n  Shotgun = 'shotgun',\n  SuperShotgun = 'supershotgun', // Matched to assets (w_supershotgun, weapon_supershotgun)\n  Machinegun = 'machinegun',\n  Chaingun = 'chaingun',\n  HandGrenade = 'grenades', // Matched to assets (w_grenades, weapon_grenades)\n  GrenadeLauncher = 'grenadelauncher', // Matched to assets (w_grenadelauncher)\n  RocketLauncher = 'rocketlauncher', // Matched to assets (w_rocketlauncher)\n  HyperBlaster = 'hyperblaster',\n  Railgun = 'railgun',\n  BFG10K = 'bfg10k',\n  // New additions for demo playback and extended support\n  Grapple = 'grapple',\n  ChainFist = 'chainfist',\n  EtfRifle = 'etf_rifle', // Confirm asset?\n  ProxLauncher = 'prox_launcher', // Confirm asset?\n  IonRipper = 'ionripper',\n  PlasmaBeam = 'plasmabeam',\n  Phalanx = 'phalanx',\n  Disruptor = 'disruptor',\n  Trap = 'trap',\n}\n","/**\n * Ammo type identifiers shared across game and cgame.\n * Reference: rerelease/g_items.cpp, game/src/inventory/ammo.ts\n */\n\nexport enum AmmoType {\n  Bullets = 0,\n  Shells,\n  Rockets,\n  Grenades,\n  Cells,\n  Slugs,\n  // RAFAEL\n  MagSlugs,\n  Trap,\n  // RAFAEL\n  // ROGUE\n  Flechettes,\n  Tesla,\n  Disruptor, // Was missing or named differently?\n  Prox,\n  // ROGUE\n  // Custom or Extras?\n  Nuke,\n  Rounds,\n}\n\nexport const AMMO_TYPE_COUNT = Object.keys(AmmoType).length / 2;\n\n/**\n * Item classnames for ammo pickups.\n * Used for spawning and identifying ammo items.\n */\nexport enum AmmoItemId {\n  Shells = 'ammo_shells',\n  Bullets = 'ammo_bullets',\n  Rockets = 'ammo_rockets',\n  Grenades = 'ammo_grenades',\n  Cells = 'ammo_cells',\n  Slugs = 'ammo_slugs',\n  MagSlugs = 'ammo_magslug',\n  Flechettes = 'ammo_flechettes',\n  Disruptor = 'ammo_disruptor',\n  Tesla = 'ammo_tesla',\n  Trap = 'ammo_trap',\n  Prox = 'ammo_prox',\n}\n","import { WeaponId } from './weapons.js';\nimport { AmmoType } from './ammo.js';\n\n// Order matches Q2 original weapon wheel index order for bitmask generation\n// Used by both Game (for STAT_WEAPONS_OWNED calculation) and CGame (for weapon wheel UI)\nexport const WEAPON_WHEEL_ORDER: WeaponId[] = [\n    WeaponId.Blaster,\n    WeaponId.Shotgun,\n    WeaponId.SuperShotgun,\n    WeaponId.Machinegun,\n    WeaponId.Chaingun,\n    WeaponId.GrenadeLauncher,\n    WeaponId.RocketLauncher,\n    WeaponId.HandGrenade,\n    WeaponId.HyperBlaster,\n    WeaponId.Railgun,\n    WeaponId.BFG10K\n];\n\n// Mapping of weapon to its ammo type\n// Used by CGame to lookup ammo counts for weapon wheel\nexport const WEAPON_AMMO_MAP: Record<WeaponId, AmmoType | null> = {\n    [WeaponId.Blaster]: null,\n    [WeaponId.Shotgun]: AmmoType.Shells,\n    [WeaponId.SuperShotgun]: AmmoType.Shells,\n    [WeaponId.Machinegun]: AmmoType.Bullets,\n    [WeaponId.Chaingun]: AmmoType.Bullets,\n    [WeaponId.HandGrenade]: AmmoType.Grenades,\n    [WeaponId.GrenadeLauncher]: AmmoType.Grenades,\n    [WeaponId.RocketLauncher]: AmmoType.Rockets,\n    [WeaponId.HyperBlaster]: AmmoType.Cells,\n    [WeaponId.Railgun]: AmmoType.Slugs,\n    [WeaponId.BFG10K]: AmmoType.Cells,\n\n    // Extensions / Rogue / Xatrix\n    [WeaponId.Grapple]: null,\n    [WeaponId.ChainFist]: null,\n    [WeaponId.EtfRifle]: AmmoType.Flechettes,\n    [WeaponId.ProxLauncher]: AmmoType.Prox,\n    [WeaponId.IonRipper]: AmmoType.Cells,\n    [WeaponId.PlasmaBeam]: AmmoType.Cells,\n    [WeaponId.Phalanx]: AmmoType.MagSlugs,\n    [WeaponId.Disruptor]: AmmoType.Disruptor,\n    [WeaponId.Trap]: AmmoType.Trap,\n};\n","export const MAX_SOUND_CHANNELS = 32;\n\n// Sound channel identifiers and flags from the rerelease game headers.\nexport enum SoundChannel {\n  Auto = 0,\n  Weapon = 1,\n  Voice = 2,\n  Item = 3,\n  Body = 4,\n  Aux = 5,\n  Footstep = 6,\n  Aux3 = 7,\n\n  NoPhsAdd = 1 << 3,\n  Reliable = 1 << 4,\n  ForcePos = 1 << 5,\n}\n\nexport const ATTN_LOOP_NONE = -1;\nexport const ATTN_NONE = 0;\nexport const ATTN_NORM = 1;\nexport const ATTN_IDLE = 2;\nexport const ATTN_STATIC = 3;\n\nexport const SOUND_FULLVOLUME = 80;\nexport const SOUND_LOOP_ATTENUATE = 0.003;\n\nexport function attenuationToDistanceMultiplier(attenuation: number): number {\n  return attenuation * 0.001;\n}\n\nexport function calculateMaxAudibleDistance(attenuation: number): number {\n  const distMult = attenuationToDistanceMultiplier(attenuation);\n  return distMult <= 0 ? Number.POSITIVE_INFINITY : SOUND_FULLVOLUME + 1 / distMult;\n}\n","import { PlayerState } from './protocol/index.js';\nimport { AmmoItemId, AmmoType, WeaponId } from './items/index.js';\nimport { G_GetAmmoStat } from './protocol/stats.js';\nimport { WEAPON_AMMO_MAP } from './items/index.js';\nimport { ConfigStringIndex } from './protocol/configstrings.js';\n\n// Blaster uses no ammo in standard Q2.\n// We handle mapping `AmmoItemId` (string) to `AmmoType` (enum).\nexport const AMMO_ITEM_MAP: Record<AmmoItemId, AmmoType> = {\n  [AmmoItemId.Shells]: AmmoType.Shells,\n  [AmmoItemId.Bullets]: AmmoType.Bullets,\n  [AmmoItemId.Rockets]: AmmoType.Rockets,\n  [AmmoItemId.Grenades]: AmmoType.Grenades,\n  [AmmoItemId.Cells]: AmmoType.Cells,\n  [AmmoItemId.Slugs]: AmmoType.Slugs,\n  [AmmoItemId.MagSlugs]: AmmoType.MagSlugs,\n  [AmmoItemId.Flechettes]: AmmoType.Flechettes,\n  [AmmoItemId.Disruptor]: AmmoType.Disruptor,\n  [AmmoItemId.Tesla]: AmmoType.Tesla,\n  [AmmoItemId.Trap]: AmmoType.Trap,\n  [AmmoItemId.Prox]: AmmoType.Prox,\n};\n\n/**\n * Retrieves the ammo count for a given item (Weapon or Ammo).\n * @param playerState The current player state.\n * @param item The item identifier (WeaponId or AmmoItemId).\n * @returns The ammo count, or 0 if not found/applicable. Returns -1 for infinite ammo (e.g. Blaster).\n */\nexport function getAmmoCount(playerState: PlayerState, item: WeaponId | AmmoItemId): number {\n  let ammoType: AmmoType | null | undefined;\n\n  // Check if it's an Ammo Item ID\n  if (Object.values(AmmoItemId).includes(item as AmmoItemId)) {\n    ammoType = AMMO_ITEM_MAP[item as AmmoItemId];\n  }\n  // Check if it's a Weapon ID\n  else if (Object.values(WeaponId).includes(item as WeaponId)) {\n    ammoType = WEAPON_AMMO_MAP[item as WeaponId];\n\n    // Existing map has null for Blaster, Grapple, etc.\n    if (ammoType === null) {\n        return -1;\n    }\n  }\n\n  if (ammoType === undefined || ammoType === null) {\n    return 0;\n  }\n\n  return G_GetAmmoStat(playerState.stats, ammoType);\n}\n\n/**\n * Resolves the icon path for a given stat index (e.g. STAT_SELECTED_ICON).\n * @param statIndex The index in the stats array to read (e.g. PlayerStat.STAT_SELECTED_ICON).\n * @param playerState The player state containing the stats.\n * @param configStrings The array of configuration strings (from client state).\n * @returns The path to the icon image, or undefined if invalid.\n */\nexport function getIconPath(\n  statIndex: number,\n  playerState: PlayerState,\n  configStrings: string[]\n): string | undefined {\n  const iconIndex = playerState.stats[statIndex];\n\n  // 0 usually means no icon or null\n  if (iconIndex === undefined || iconIndex <= 0) {\n    return undefined;\n  }\n\n  // The value in the stat is the index into the Config Strings relative to ConfigStringIndex.Images.\n  const configIndex = ConfigStringIndex.Images + iconIndex;\n\n  if (configIndex < 0 || configIndex >= configStrings.length) {\n    return undefined;\n  }\n\n  return configStrings[configIndex];\n}\n","import type { PmoveTraceFn, PmoveTraceResult } from './pmove/types.js';\nimport type { Vec3 } from './math/vec3.js';\nimport { CONTENTS_LADDER } from './bsp/contents.js';\n\nexport const intersects = (end: Vec3, maxs: Vec3, mins: Vec3, boxMins: Vec3, boxMaxs: Vec3): boolean => {\n  return (\n    end.x + maxs.x > boxMins.x &&\n    end.x + mins.x < boxMaxs.x &&\n    end.y + maxs.y > boxMins.y &&\n    end.y + mins.y < boxMaxs.y &&\n    end.z + maxs.z > boxMins.z &&\n    end.z + mins.z < boxMaxs.z\n  );\n};\n\nexport const stairTrace: PmoveTraceFn = (start: Vec3, end: Vec3, mins?: Vec3, maxs?: Vec3): PmoveTraceResult => {\n  // Default bbox if not provided\n  const useMins = mins ?? { x: -16, y: -16, z: -24 };\n  const useMaxs = maxs ?? { x: 16, y: 16, z: 32 };\n\n  // Step: x from 0 forward, z from 0 to 8\n  const STEP_HEIGHT = 8;\n  const STEP_X_START = 0;\n\n  const isHorizontal = Math.abs(end.z - start.z) < 1;\n  const isMovingDown = end.z < start.z;\n\n  // Check if trying to go below the floor\n  const endMinZ = end.z + useMins.z;\n  const startMinZ = start.z + useMins.z;\n  const endMaxX = end.x + useMaxs.x;\n\n  // If moving horizontally, check if we'd hit the vertical face of the step\n  // The step only blocks if the player's origin is below the step height\n  if (isHorizontal && end.z < STEP_HEIGHT && endMaxX > STEP_X_START) {\n    // Check if we're crossing into the step area\n    const startMaxX = start.x + useMaxs.x;\n    if (startMaxX <= STEP_X_START) {\n      // We're moving from before the step to past it, block\n      return {\n        allsolid: false,\n        startsolid: false,\n        fraction: 0,\n        endpos: start,\n        planeNormal: { x: -1, y: 0, z: 0 },\n        contents: 1,\n      };\n    }\n  }\n\n  // If moving down and over the step area, land on the step surface\n  if (isMovingDown && end.x >= STEP_X_START) {\n    // The step surface is at z=STEP_HEIGHT in world space\n    // The player's bbox bottom reaches this plane when origin.z + mins.z = STEP_HEIGHT\n    // So the player's origin should be at z = STEP_HEIGHT - mins.z\n    const landZ = STEP_HEIGHT - useMins.z;\n\n    // Check if we'd pass through the step surface\n    // We cross the plane if start is above it and end would be below it\n    if (startMinZ > STEP_HEIGHT && endMinZ < STEP_HEIGHT) {\n      // Calculate the fraction along the ray where we intersect the plane\n      // The bbox bottom is at: start.z + useMins.z + t * (end.z - start.z + 0) = STEP_HEIGHT\n      // Solving for t: t = (STEP_HEIGHT - (start.z + useMins.z)) / ((end.z + useMins.z) - (start.z + useMins.z))\n      const fraction = (STEP_HEIGHT - startMinZ) / (endMinZ - startMinZ);\n\n      // Clamp to valid range [0, 1]\n      const clampedFraction = Math.max(0, Math.min(1, fraction));\n\n      // Calculate the endpos along the ray at this fraction\n      const finalX = start.x + clampedFraction * (end.x - start.x);\n      const finalY = start.y + clampedFraction * (end.y - start.y);\n      const finalZ = start.z + clampedFraction * (end.z - start.z);\n\n      return {\n        allsolid: false,\n        startsolid: false,\n        fraction: clampedFraction,\n        endpos: { x: finalX, y: finalY, z: finalZ },\n        planeNormal: { x: 0, y: 0, z: 1 },\n        contents: 1,\n      };\n    }\n  }\n\n  // If moving down and would go below floor level, block at floor\n  if (isMovingDown && endMinZ < 0) {\n    // Floor is at z=0, so player origin should be at z = -mins.z when landing\n    const landZ = -useMins.z;\n\n    // Only apply if we're crossing the floor plane\n    if (startMinZ >= 0) {\n      // Calculate fraction where bbox bottom hits z=0\n      const fraction = (0 - startMinZ) / (endMinZ - startMinZ);\n      const clampedFraction = Math.max(0, Math.min(1, fraction));\n\n      const finalX = start.x + clampedFraction * (end.x - start.x);\n      const finalY = start.y + clampedFraction * (end.y - start.y);\n      const finalZ = start.z + clampedFraction * (end.z - start.z);\n\n      return {\n        allsolid: false,\n        startsolid: false,\n        fraction: clampedFraction,\n        endpos: { x: finalX, y: finalY, z: finalZ },\n        planeNormal: { x: 0, y: 0, z: 1 },\n        contents: 1,\n      };\n    }\n\n    // Already below floor, block immediately\n    return {\n      allsolid: false,\n      startsolid: false,\n      fraction: 0,\n      endpos: start,\n      planeNormal: { x: 0, y: 0, z: 1 },\n      contents: 1,\n    };\n  }\n\n  // Free movement\n  return {\n    allsolid: false,\n    startsolid: false,\n    fraction: 1.0,\n    endpos: end,\n    contents: 0,\n  };\n};\n\nexport const ladderTrace: PmoveTraceFn = (start: Vec3, end: Vec3, mins?: Vec3, maxs?: Vec3): PmoveTraceResult => {\n  // Default bbox if not provided\n  const useMins = mins ?? { x: -16, y: -16, z: -24 };\n  const useMaxs = maxs ?? { x: 16, y: 16, z: 32 };\n\n  // Define the ladder volume (x=0 to x=8, y=-16 to y=16, z=0 to z=100)\n  const LADDER_X_MIN = 0;\n  const LADDER_X_MAX = 8;\n  const LADDER_Y_MIN = -16;\n  const LADDER_Y_MAX = 16;\n  const LADDER_Z_MIN = 0;\n  const LADDER_Z_MAX = 100;\n\n  // Check if end position is within the ladder volume\n  const endInLadder =\n    end.x + useMins.x < LADDER_X_MAX &&\n    end.x + useMaxs.x > LADDER_X_MIN &&\n    end.y + useMins.y < LADDER_Y_MAX &&\n    end.y + useMaxs.y > LADDER_Y_MIN &&\n    end.z + useMins.z < LADDER_Z_MAX &&\n    end.z + useMaxs.z > LADDER_Z_MIN;\n\n  // If moving into the ladder from outside (moving forward into it)\n  const movingIntoLadder = start.x < LADDER_X_MIN && end.x >= LADDER_X_MIN;\n\n  // If moving horizontally into the ladder front face, block with ladder surface\n  if (movingIntoLadder && Math.abs(end.z - start.z) < 0.1) {\n    return {\n      allsolid: false,\n      startsolid: false,\n      fraction: 0,\n      endpos: start,\n      planeNormal: { x: -1, y: 0, z: 0 },\n      contents: CONTENTS_LADDER,\n    };\n  }\n\n  // If we're in the ladder volume, return success but with CONTENTS_LADDER\n  // This allows the player to detect they're on a ladder without blocking movement\n  if (endInLadder) {\n    return {\n      allsolid: false,\n      startsolid: false,\n      fraction: 1.0,\n      endpos: end,\n      contents: CONTENTS_LADDER,\n    };\n  }\n\n  // Floor at z=0\n  if (end.z + useMins.z <= 0) {\n    return {\n      allsolid: false,\n      startsolid: false,\n      fraction: 0,\n      endpos: start,\n      planeNormal: { x: 0, y: 0, z: 1 },\n      contents: 1,\n    };\n  }\n\n  // No collision - free movement\n  return {\n    allsolid: false,\n    startsolid: false,\n    fraction: 1.0,\n    endpos: end,\n    contents: 0,\n  };\n};\n"]}