@datamoc/mw_games 0.43.0 → 0.44.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +67 -0
- package/README.md +22 -0
- package/REFERENCE.md +82 -6
- package/api-surface.json +1028 -2
- package/dist/actors/Resource.d.ts.map +1 -1
- package/dist/actors/Resource.js +2 -3
- package/dist/actors/Resource.js.map +1 -1
- package/dist/audio/AdaptiveMusic.d.ts +85 -0
- package/dist/audio/AdaptiveMusic.d.ts.map +1 -0
- package/dist/audio/AdaptiveMusic.js +230 -0
- package/dist/audio/AdaptiveMusic.js.map +1 -0
- package/dist/audio/AudioLoader.d.ts +7 -2
- package/dist/audio/AudioLoader.d.ts.map +1 -1
- package/dist/audio/AudioLoader.js +23 -18
- package/dist/audio/AudioLoader.js.map +1 -1
- package/dist/audio/AudioViews.d.ts +70 -0
- package/dist/audio/AudioViews.d.ts.map +1 -0
- package/dist/audio/AudioViews.js +119 -0
- package/dist/audio/AudioViews.js.map +1 -0
- package/dist/audio/BusBudget.d.ts +89 -0
- package/dist/audio/BusBudget.d.ts.map +1 -0
- package/dist/audio/BusBudget.js +120 -0
- package/dist/audio/BusBudget.js.map +1 -0
- package/dist/audio/Channels.d.ts +65 -1
- package/dist/audio/Channels.d.ts.map +1 -1
- package/dist/audio/Channels.js +117 -30
- package/dist/audio/Channels.js.map +1 -1
- package/dist/audio/CoreHost.d.ts +114 -0
- package/dist/audio/CoreHost.d.ts.map +1 -0
- package/dist/audio/CoreHost.js +335 -0
- package/dist/audio/CoreHost.js.map +1 -0
- package/dist/audio/DecoderGuard.d.ts +139 -0
- package/dist/audio/DecoderGuard.d.ts.map +1 -0
- package/dist/audio/DecoderGuard.js +208 -0
- package/dist/audio/DecoderGuard.js.map +1 -0
- package/dist/audio/Fft.d.ts +3 -0
- package/dist/audio/Fft.d.ts.map +1 -0
- package/dist/audio/Fft.js +45 -0
- package/dist/audio/Fft.js.map +1 -0
- package/dist/audio/LoopTags.d.ts +18 -0
- package/dist/audio/LoopTags.d.ts.map +1 -1
- package/dist/audio/LoopTags.js +20 -0
- package/dist/audio/LoopTags.js.map +1 -1
- package/dist/audio/Midi.d.ts +35 -0
- package/dist/audio/Midi.d.ts.map +1 -1
- package/dist/audio/Midi.js +71 -1
- package/dist/audio/Midi.js.map +1 -1
- package/dist/audio/MidiRender.d.ts +31 -0
- package/dist/audio/MidiRender.d.ts.map +1 -1
- package/dist/audio/MidiRender.js +79 -2
- package/dist/audio/MidiRender.js.map +1 -1
- package/dist/audio/MidiSynth.d.ts +147 -0
- package/dist/audio/MidiSynth.d.ts.map +1 -0
- package/dist/audio/MidiSynth.js +205 -0
- package/dist/audio/MidiSynth.js.map +1 -0
- package/dist/audio/Playable.d.ts +7 -0
- package/dist/audio/Playable.d.ts.map +1 -1
- package/dist/audio/Playable.js.map +1 -1
- package/dist/audio/Positional.d.ts +12 -4
- package/dist/audio/Positional.d.ts.map +1 -1
- package/dist/audio/Positional.js +5 -2
- package/dist/audio/Positional.js.map +1 -1
- package/dist/audio/Resample.d.ts +61 -0
- package/dist/audio/Resample.d.ts.map +1 -0
- package/dist/audio/Resample.js +97 -0
- package/dist/audio/Resample.js.map +1 -0
- package/dist/audio/Settings.d.ts +99 -0
- package/dist/audio/Settings.d.ts.map +1 -0
- package/dist/audio/Settings.js +134 -0
- package/dist/audio/Settings.js.map +1 -0
- package/dist/audio/Sfx.d.ts +148 -0
- package/dist/audio/Sfx.d.ts.map +1 -0
- package/dist/audio/Sfx.js +213 -0
- package/dist/audio/Sfx.js.map +1 -0
- package/dist/audio/SpectralDistance.d.ts +34 -0
- package/dist/audio/SpectralDistance.d.ts.map +1 -0
- package/dist/audio/SpectralDistance.js +64 -0
- package/dist/audio/SpectralDistance.js.map +1 -0
- package/dist/audio/StreamChannel.d.ts +150 -0
- package/dist/audio/StreamChannel.d.ts.map +1 -0
- package/dist/audio/StreamChannel.js +390 -0
- package/dist/audio/StreamChannel.js.map +1 -0
- package/dist/audio/StreamPlayable.d.ts +73 -0
- package/dist/audio/StreamPlayable.d.ts.map +1 -0
- package/dist/audio/StreamPlayable.js +130 -0
- package/dist/audio/StreamPlayable.js.map +1 -0
- package/dist/audio/SyxBank.d.ts +73 -0
- package/dist/audio/SyxBank.d.ts.map +1 -0
- package/dist/audio/SyxBank.js +130 -0
- package/dist/audio/SyxBank.js.map +1 -0
- package/dist/audio/Underrun.d.ts +25 -0
- package/dist/audio/Underrun.d.ts.map +1 -0
- package/dist/audio/Underrun.js +18 -0
- package/dist/audio/Underrun.js.map +1 -0
- package/dist/audio/Wav.d.ts +56 -0
- package/dist/audio/Wav.d.ts.map +1 -0
- package/dist/audio/Wav.js +164 -0
- package/dist/audio/Wav.js.map +1 -0
- package/dist/audio/WebMidi.d.ts +58 -0
- package/dist/audio/WebMidi.d.ts.map +1 -0
- package/dist/audio/WebMidi.js +79 -0
- package/dist/audio/WebMidi.js.map +1 -0
- package/dist/audio/humanize/Onsets.d.ts.map +1 -1
- package/dist/audio/humanize/Onsets.js +1 -44
- package/dist/audio/humanize/Onsets.js.map +1 -1
- package/dist/audio/index.d.ts +38 -6
- package/dist/audio/index.d.ts.map +1 -1
- package/dist/audio/index.js +19 -3
- package/dist/audio/index.js.map +1 -1
- package/dist/battle/AttackPreview.d.ts.map +1 -1
- package/dist/battle/AttackPreview.js +8 -8
- package/dist/battle/AttackPreview.js.map +1 -1
- package/dist/battle/StatStages.d.ts.map +1 -1
- package/dist/battle/StatStages.js +2 -1
- package/dist/battle/StatStages.js.map +1 -1
- package/dist/board/Engine.d.ts +2 -0
- package/dist/board/Engine.d.ts.map +1 -1
- package/dist/board/Engine.js +1 -1
- package/dist/board/Engine.js.map +1 -1
- package/dist/board/HexSkirmish.d.ts.map +1 -1
- package/dist/board/HexSkirmish.js +11 -72
- package/dist/board/HexSkirmish.js.map +1 -1
- package/dist/board/Tactics.d.ts.map +1 -1
- package/dist/board/Tactics.js +3 -5
- package/dist/board/Tactics.js.map +1 -1
- package/dist/board/tourney.d.ts.map +1 -1
- package/dist/board/tourney.js +2 -19
- package/dist/board/tourney.js.map +1 -1
- package/dist/core/Handles.js +7 -7
- package/dist/core/Handles.js.map +1 -1
- package/dist/mw_games.global.js +25 -22
- package/dist/mwl/conditions.d.ts +12 -0
- package/dist/mwl/conditions.d.ts.map +1 -1
- package/dist/mwl/conditions.js +49 -8
- package/dist/mwl/conditions.js.map +1 -1
- package/dist/mwl/index.d.ts +11 -0
- package/dist/mwl/index.d.ts.map +1 -1
- package/dist/mwl/index.js +6 -0
- package/dist/mwl/index.js.map +1 -1
- package/dist/mwl/package-container.d.ts +185 -0
- package/dist/mwl/package-container.d.ts.map +1 -0
- package/dist/mwl/package-container.js +446 -0
- package/dist/mwl/package-container.js.map +1 -0
- package/dist/mwl/package-document.d.ts +217 -0
- package/dist/mwl/package-document.d.ts.map +1 -0
- package/dist/mwl/package-document.js +639 -0
- package/dist/mwl/package-document.js.map +1 -0
- package/dist/mwl/package-rom.d.ts +37 -0
- package/dist/mwl/package-rom.d.ts.map +1 -0
- package/dist/mwl/package-rom.js +96 -0
- package/dist/mwl/package-rom.js.map +1 -0
- package/dist/mwl/package-verify.d.ts +34 -0
- package/dist/mwl/package-verify.d.ts.map +1 -0
- package/dist/mwl/package-verify.js +111 -0
- package/dist/mwl/package-verify.js.map +1 -0
- package/dist/mwl/package.d.ts +184 -0
- package/dist/mwl/package.d.ts.map +1 -0
- package/dist/mwl/package.js +382 -0
- package/dist/mwl/package.js.map +1 -0
- package/dist/physics/PhysicsWorld.d.ts.map +1 -1
- package/dist/physics/PhysicsWorld.js +4 -3
- package/dist/physics/PhysicsWorld.js.map +1 -1
- package/dist/physics/XpbdWorld.d.ts.map +1 -1
- package/dist/physics/XpbdWorld.js +2 -1
- package/dist/physics/XpbdWorld.js.map +1 -1
- package/dist/testing/FakeAudio.d.ts +149 -0
- package/dist/testing/FakeAudio.d.ts.map +1 -0
- package/dist/testing/FakeAudio.js +219 -0
- package/dist/testing/FakeAudio.js.map +1 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -0
- package/dist/testing/index.js.map +1 -1
- package/dist/threads/index.d.ts +2 -2
- package/dist/threads/index.d.ts.map +1 -1
- package/dist/threads/index.js +1 -1
- package/dist/threads/index.js.map +1 -1
- package/dist/threads/spawn.d.ts +32 -0
- package/dist/threads/spawn.d.ts.map +1 -1
- package/dist/threads/spawn.js +35 -11
- package/dist/threads/spawn.js.map +1 -1
- package/dist/two-d/Game.d.ts +13 -2
- package/dist/two-d/Game.d.ts.map +1 -1
- package/dist/two-d/Game.js +42 -18
- package/dist/two-d/Game.js.map +1 -1
- package/dist/two-d/render/HazeLayer.d.ts.map +1 -1
- package/dist/two-d/render/HazeLayer.js +2 -1
- package/dist/two-d/render/HazeLayer.js.map +1 -1
- package/dist/two-d/render/ImageModifiers.d.ts +4 -2
- package/dist/two-d/render/ImageModifiers.d.ts.map +1 -1
- package/dist/two-d/render/ImageModifiers.js +13 -8
- package/dist/two-d/render/ImageModifiers.js.map +1 -1
- package/dist/two-d/render/NeonGlow.d.ts.map +1 -1
- package/dist/two-d/render/NeonGlow.js +2 -1
- package/dist/two-d/render/NeonGlow.js.map +1 -1
- package/dist/two-d/render/Particles.d.ts.map +1 -1
- package/dist/two-d/render/Particles.js +2 -1
- package/dist/two-d/render/Particles.js.map +1 -1
- package/dist/two-d/render/SceneTransition.d.ts +29 -0
- package/dist/two-d/render/SceneTransition.d.ts.map +1 -1
- package/dist/two-d/render/SceneTransition.js +27 -0
- package/dist/two-d/render/SceneTransition.js.map +1 -1
- package/dist/two-d/render/ScreenEffects.d.ts.map +1 -1
- package/dist/two-d/render/ScreenEffects.js +2 -1
- package/dist/two-d/render/ScreenEffects.js.map +1 -1
- package/dist/two-d/render/SkeletalSprite.d.ts.map +1 -1
- package/dist/two-d/render/SkeletalSprite.js +2 -1
- package/dist/two-d/render/SkeletalSprite.js.map +1 -1
- package/dist/two-d/render/Types2D.d.ts +2 -2
- package/dist/two-d/render/Types2D.d.ts.map +1 -1
- package/dist/two-d/render/Types2D.js +2 -2
- package/dist/two-d/render/Types2D.js.map +1 -1
- package/dist/two-d/render/index.d.ts +2 -2
- package/dist/two-d/render/index.d.ts.map +1 -1
- package/dist/two-d/render/index.js +1 -1
- package/dist/two-d/render/index.js.map +1 -1
- package/dist/two-d/ui/Bar.d.ts.map +1 -1
- package/dist/two-d/ui/Bar.js +3 -5
- package/dist/two-d/ui/Bar.js.map +1 -1
- package/dist/two-d/ui/Dropdown.d.ts +5 -1
- package/dist/two-d/ui/Dropdown.d.ts.map +1 -1
- package/dist/two-d/ui/Dropdown.js +8 -1
- package/dist/two-d/ui/Dropdown.js.map +1 -1
- package/dist/two-d/ui/DropdownView.d.ts +15 -1
- package/dist/two-d/ui/DropdownView.d.ts.map +1 -1
- package/dist/two-d/ui/DropdownView.js +21 -3
- package/dist/two-d/ui/DropdownView.js.map +1 -1
- package/dist/two-d/ui/FloatingText.d.ts.map +1 -1
- package/dist/two-d/ui/FloatingText.js +2 -1
- package/dist/two-d/ui/FloatingText.js.map +1 -1
- package/dist/two-d/ui/IconGrid.d.ts.map +1 -1
- package/dist/two-d/ui/IconGrid.js +2 -1
- package/dist/two-d/ui/IconGrid.js.map +1 -1
- package/dist/two-d/ui/ListView.d.ts.map +1 -1
- package/dist/two-d/ui/ListView.js +2 -1
- package/dist/two-d/ui/ListView.js.map +1 -1
- package/dist/two-d/ui/ScrollBox.d.ts +6 -0
- package/dist/two-d/ui/ScrollBox.d.ts.map +1 -1
- package/dist/two-d/ui/ScrollBox.js +12 -1
- package/dist/two-d/ui/ScrollBox.js.map +1 -1
- package/dist/two-d/ui/ScrollText.d.ts +11 -2
- package/dist/two-d/ui/ScrollText.d.ts.map +1 -1
- package/dist/two-d/ui/ScrollText.js +18 -2
- package/dist/two-d/ui/ScrollText.js.map +1 -1
- package/dist/two-d/ui/Slider.d.ts.map +1 -1
- package/dist/two-d/ui/Slider.js +4 -4
- package/dist/two-d/ui/Slider.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +8 -1
- package/sbom.cdx.json +6 -6
- package/tools/audio.d.mts +75 -0
- package/tools/audio.mjs +437 -0
- package/tools/mwl.mjs +144 -2
- package/tools.md +1 -1
package/dist/mw_games.global.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var mw_games=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=Object.create,n=Object.defineProperty,r=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,a=Object.getPrototypeOf,o=Object.prototype.hasOwnProperty,s=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(e){throw n=[e],e}},c=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t,t.exports),e=null),t.exports),l=(e,t)=>{let r={};for(var i in e)n(r,i,{get:e[i],enumerable:!0});return t||n(r,Symbol.toStringTag,{value:`Module`}),r},u=(e,t,a,s)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var c=i(t),l=0,u=c.length,d;l<u;l++)d=c[l],!o.call(e,d)&&d!==a&&n(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(s=r(t,d))||s.enumerable});return e},d=(e,r,i)=>(i=e==null?{}:t(a(e)),u(r||!e||!e.__esModule||!o.call(e,`default`)?n(i,`default`,{value:e,enumerable:!0}):i,e)),f=`0.43.0`,p=class{constructor(e=!1){this.listeners=[],this.stackMode=e}add(e){this.listeners.includes(e)||(this.stackMode?this.listeners.unshift(e):this.listeners.push(e))}remove(e){let t=this.listeners.indexOf(e);t!==-1&&this.listeners.splice(t,1)}removeAll(){this.listeners.length=0}get size(){return this.listeners.length}dispatch(e){let t=this.listeners.slice();for(let n of t)if(this.listeners.includes(n)&&n(e)===!0)return!0;return!1}},m=class{constructor(){this.onDestroy=new p,this.destroyed=!1}update(e){}resize(e,t){}onSuspend(){}onResume(e){}destroy(){this.destroyed||(this.destroyed=!0,this.onDestroy.dispatch(),this.onDestroy.removeAll(),this.teardown())}teardown(){}get isDestroyed(){return this.destroyed}},h=class{constructor(){this.scenes=[]}get current(){return this.scenes.length===0?null:this.scenes[this.scenes.length-1]}get depth(){return this.scenes.length}replace(e){for(let e of this.scenes)e.destroy();this.scenes=[e],e.create()}push(e){this.current?.onSuspend(),this.scenes.push(e),e.create()}pop(e){if(this.scenes.length<=1)throw Error(`cannot pop the last scene off the stack - switchScene somewhere instead`);this.scenes.pop()?.destroy(),this.current?.onResume(e)}update(e){this.current?.update(e)}resize(e,t){for(let n of this.scenes)n.resize(e,t)}destroy(){for(let e of this.scenes)e.destroy();this.scenes=[]}},g=class{constructor(){this.items=new Map}register(e,t){if(this.items.has(e))throw Error(`"${e}" is already registered`);this.items.set(e,t)}get(e){let t=this.items.get(e);if(t===void 0)throw Error(`no registration named "${e}"`);return t}has(e){return this.items.has(e)}list(){return[...this.items.keys()]}};function _(){let e=1,t=new Map;return{get size(){return t.size},put(n){let r=e++;return t.set(r,n),r},get(e){let n=t.get(e);if(n===void 0)throw Error(`unknown handle ${e}`);return n},drop(e){t.delete(e)},clear(){t.clear()},with(n,r){let i=e++;t.set(i,n);try{return r(i)}finally{t.delete(i)}}}}var v=class{constructor(){this.order=[],this.registry=new g}add(e,t){this.registry.register(e.name,e),this.order.push(e),e.create?.(t)}has(e){return this.registry.has(e)}get(e){return this.registry.get(e)}update(e,t){for(let n of this.order)n.update?.(e,t)}resize(e,t,n){for(let r of this.order)r.resize?.(e,t,n)}onSuspend(e){for(let t of this.order)t.onSuspend?.(e)}onResume(e,t){for(let n of this.order)n.onResume?.(e,t)}destroy(e){for(let t=this.order.length-1;t>=0;t--)this.order[t].destroy?.(e);this.order=[],this.registry=new g}},y={debug:0,info:1,warn:2,error:3},b=class{constructor(e,t={}){if(!e)throw Error(`a logger needs a category`);this.category=e,this.level=t.level??`debug`,this.sink=t.sink??x}setLevel(e){this.level=e}debug(e,t){this.write(`debug`,e,t)}info(e,t){this.write(`info`,e,t)}warn(e,t){this.write(`warn`,e,t)}error(e,t){this.write(`error`,e,t)}write(e,t,n){y[e]<y[this.level]||this.sink({level:e,category:this.category,message:t,data:n,time:Date.now()})}};function x(e){let t=`[${e.category}] ${e.message}`;e.level===`debug`?console.debug(t,e.data??``):e.level===`info`?console.info(t,e.data??``):e.level===`warn`?console.warn(t,e.data??``):console.error(t,e.data??``)}var S=class{constructor(){this.hooks=[]}on(e,t,n){this.hooks.push({event:e,handler:t,source:n})}off(e){this.hooks=this.hooks.filter(t=>t.handler!==e)}offSource(e){this.hooks=this.hooks.filter(t=>t.source!==e)}emit(e,...t){for(let n of[...this.hooks])n.event===e&&n.handler(...t)}get size(){return this.hooks.length}clear(){this.hooks=[]}},C=l({Generator:()=>j,MersenneTwister:()=>he,RandomStreams:()=>ge,active:()=>ee,chance:()=>A,element:()=>re,float:()=>D,int:()=>O,normalRange:()=>k,pop:()=>T,push:()=>w,range:()=>ne,reset:()=>te,shuffle:()=>oe,weighted:()=>ie,weightedKey:()=>ae,withSeed:()=>E});function ee(){return le()}function w(e){let t=new j(e);return ce.push(t),t}function T(){if(ce.length===1)throw Error(`the base random generator cannot be popped`);ce.pop()}function E(e,t){w(e);try{return t()}finally{T()}}function te(){ce.length=0,ce.push(new j)}function D(e,t,n){let r=n??le();return e===void 0?r.float():t===void 0?r.float()*e:e+r.float()*(t-e)}function O(e,t,n){let r=n??le();return t===void 0?r.int(e):e+r.int(t-e)}function ne(e,t,n){return e+(n??le()).int(t-e+1)}function k(e,t,n){let r=n??le();return e+Math.floor((r.float()+r.float())*(t-e+1)/2)}function A(e,t){return(t??le()).float()<e}function re(e,t){return e.length>0?e[(t??le()).int(e.length)]:null}function ie(e,t){let n=0;for(let t of e)n+=t;if(n<=0)return null;let r=(t??le()).float()*n;for(let t=0;t<e.length;t++)if(r-=e[t],r<0)return t;return e.length-1}function ae(e,t){let n=[...e.keys()],r=ie(n.map(t=>e.get(t)??0),t);return r===null?null:n[r]}function oe(e,t){for(let n=e.length-1;n>0;n--){let r=(t??le()).int(n+1);[e[n],e[r]]=[e[r],e[n]]}return e}function se(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619)>>>0;return t>>>0}var j,ce,le,ue,de,fe,pe,me,he,ge,_e=s((()=>{j=class{constructor(e){this.s0=0,this.s1=0,this.s2=0,this.s3=0,this.seed=e===void 0?Math.random()*4294967296>>>0:e>>>0;let t=this.seed,n=()=>{t=t+2654435769>>>0;let e=t;return e=Math.imul(e^e>>>16,569420461),e=Math.imul(e^e>>>15,1935289751),(e^e>>>15)>>>0};this.s0=n(),this.s1=n(),this.s2=n(),this.s3=n(),(this.s0|this.s1|this.s2|this.s3)===0&&(this.s0=1)}nextUint32(){let e=Math.imul(this.rotl(Math.imul(this.s1,5),7),9)>>>0>>>0,t=this.s1<<9>>>0;return this.s2^=this.s0,this.s3^=this.s1,this.s1^=this.s2,this.s0^=this.s3,this.s2^=t,this.s3=this.rotl(this.s3,11),e}float(){return this.nextUint32()/4294967296}int(e){if(e<=0)return 0;let t=4294967296-4294967296%e,n=this.nextUint32();for(;n>=t;)n=this.nextUint32();return n%e}getState(){return[this.s0,this.s1,this.s2,this.s3]}setState(e){[this.s0,this.s1,this.s2,this.s3]=e}rotl(e,t){return(e<<t|e>>>32-t)>>>0}},ce=[new j],le=()=>ce[ce.length-1],ue=624,de=397,fe=2567483615,pe=2147483648,me=2147483647,he=class{constructor(e=5489){this.state=new Uint32Array(ue),this.index=ue,this.seedValue=5489,this.produced=0,this.seed(e)}seed(e){this.seedValue=e>>>0,this.state[0]=this.seedValue;for(let e=1;e<ue;e++){let t=this.state[e-1]^this.state[e-1]>>>30;this.state[e]=Math.imul(1812433253,t)+e>>>0}this.index=ue,this.produced=0}generate(){for(let e=0;e<ue;e++){let t=this.state[e]&pe|this.state[(e+1)%ue]&me,n=this.state[(e+de)%ue]^t>>>1;t&1&&(n^=fe),this.state[e]=n>>>0}this.index=0}nextUint32(){this.index>=ue&&this.generate();let e=this.state[this.index++];return e^=e>>>11,e^=e<<7&2636928640,e^=e<<15&4022730752,e^=e>>>18,this.produced++,e>>>0}float(){return this.nextUint32()/4294967296}int(e){if(e<=0)return 0;let t=4294967296-4294967296%e,n=this.nextUint32();for(;n>=t;)n=this.nextUint32();return n%e}discard(e){for(let t=0;t<e;t++)this.nextUint32()}get discardCount(){return this.produced}getState(){return{seed:this.seedValue,state:[...this.state],index:this.index,discard:this.produced}}setState(e){this.seedValue=e.seed>>>0;for(let t=0;t<ue;t++)this.state[t]=(e.state[t]??0)>>>0;this.index=e.index,this.produced=e.discard}},ge=class{constructor(e=0){this.streams=new Map,this.baseSeed=e>>>0}stream(e){let t=this.streams.get(e);if(!t){let n=(this.baseSeed^se(e))>>>0;t={seed:n,engine:new he(n)},this.streams.set(e,t)}return t.engine}seedOf(e){return this.streams.get(e)?.seed}reseed(e){this.baseSeed=e>>>0,this.streams.clear()}names(){return[...this.streams.keys()]}getState(){let e={};for(let[t,n]of this.streams)e[t]=n.engine.getState();return e}setState(e){for(let[t,n]of Object.entries(e)){let e=new he(n.seed);e.setState(n),this.streams.set(t,{seed:n.seed,engine:e})}}}})),ve=l({DEFAULT_BINDINGS:()=>je,actionsForKey:()=>Pe,attach:()=>gt,attachPointer:()=>ht,attachSwipe:()=>mt,bind:()=>Me,bindAxis:()=>at,bindButton:()=>it,bindTouch:()=>lt,detach:()=>_t,dispatchAction:()=>Te,dispatchComposition:()=>Ee,dispatchText:()=>we,endFrame:()=>Ke,exportBindings:()=>Le,gamepadAxisCode:()=>rt,gamepadButtonCode:()=>nt,importBindings:()=>Re,isDown:()=>Ue,justPressed:()=>We,justReleased:()=>Ge,keysFor:()=>Ie,onAction:()=>P,onComposition:()=>F,onKey:()=>xe,onText:()=>Se,onWheel:()=>De,pollGamepads:()=>ot,pressTouch:()=>ut,releaseTouch:()=>dt,resetBindings:()=>ze,rumble:()=>st,textFromKey:()=>Ce,touchCode:()=>ct,unbind:()=>Fe,wheelActionFor:()=>Oe}),M=new Map,N=new Set,ye=new Set,be=new Set,P=new p(!0),xe=new p(!0),Se=new p(!0),F=new p(!0);function Ce(e){return e.isComposing||e.ctrlKey||e.metaKey||e.altKey?null:e.key.length===1?e.key:null}function we(e){e.length>0&&Se.dispatch(e)}function Te(e){P.dispatch(e)}function Ee(e){F.dispatch({phase:e.phase,text:e.text})}var De=new p(!0);function Oe(e){return e.ctrlKey||e.metaKey?`zoom`:e.shiftKey?`scrollHorizontal`:`scroll`}function ke(e){let t=Oe(e);t===`zoom`&&e.preventDefault();let n=t===`scrollHorizontal`&&e.deltaX!==0?e.deltaX:e.deltaY;De.dispatch({action:t,delta:n})}var Ae=!1,je={up:[`ArrowUp`,`KeyW`,`Numpad8`],down:[`ArrowDown`,`KeyS`,`Numpad2`],left:[`ArrowLeft`,`KeyA`,`Numpad4`],right:[`ArrowRight`,`KeyD`,`Numpad6`],upLeft:[`Numpad7`],upRight:[`Numpad9`],downLeft:[`Numpad1`],downRight:[`Numpad3`],wait:[`Numpad5`,`Period`],confirm:[`Enter`,`Space`,`NumpadEnter`],cancel:[`Escape`,`Backspace`],menu:[`KeyI`,`Tab`]};function Me(e,t){M.set(e,new Set(t))}function Ne(e,t){let n=M.get(e)??new Set;for(let e of t)n.add(e);M.set(e,n)}function Pe(e){return Be(e)}function Fe(e){M.delete(e)}function Ie(e){return[...M.get(e)??[]]}function Le(){let e={};for(let[t,n]of M)e[t]=[...n];return e}function Re(e){M.clear();for(let[t,n]of Object.entries(e))Me(t,n)}function ze(){Re(je)}ze();function Be(e){let t=[];for(let[n,r]of M)r.has(e)&&t.push(n);return t}function Ve(e){if(!N.has(e)){N.add(e);for(let t of Be(e))ye.add(t),P.dispatch(t)}}function He(e){if(N.has(e)){N.delete(e);for(let t of Be(e))be.add(t)}}function Ue(e){let t=M.get(e);if(!t)return!1;for(let e of t)if(N.has(e))return!0;return!1}function We(e){return ye.has(e)}function Ge(e){return be.has(e)}function Ke(){ye.clear(),be.clear()}function qe(e){let t=Ce(e);t!==null&&we(t)}function Je(e){e.repeat?(xe.dispatch(e),qe(e)):(Ve(e.code),xe.dispatch(e),qe(e))}function Ye(e){He(e.code)}function Xe(e){Ee({phase:`start`,text:e.data??``})}function Ze(e){Ee({phase:`update`,text:e.data??``})}function Qe(e){Ee({phase:`end`,text:e.data??``})}function $e(){N.clear(),ye.clear(),be.clear()}var et=.5,tt=new Set;function nt(e,t){return`Gamepad${e}Button${t}`}function rt(e,t,n){return`Gamepad${e}Axis${t}${n>0?`+`:`-`}`}function it(e,t,n){Ne(e,n.map(e=>nt(t,e)))}function at(e,t,n,r){Ne(e,[rt(t,n,r)])}function ot(e=typeof navigator?.getGamepads==`function`?navigator.getGamepads():[]){tt.clear();for(let t of e)if(t){for(let e=0;e<t.buttons.length;e++)t.buttons[e].pressed&&tt.add(nt(t.index,e));for(let e=0;e<t.axes.length;e++){let n=t.axes[e];n>=et?tt.add(rt(t.index,e,1)):n<=-.5&&tt.add(rt(t.index,e,-1))}}for(let e of tt)Ve(e);for(let e of N)!tt.has(e)&&e.startsWith(`Gamepad`)&&He(e)}function st(e,t,n=typeof navigator?.getGamepads==`function`?navigator.getGamepads():[]){(n[e]?.vibrationActuator)?.playEffect(`dual-rumble`,{duration:t.duration,weakMagnitude:t.weakMagnitude??1,strongMagnitude:t.strongMagnitude??1})}function ct(e){return`Touch:${e}`}function lt(e,t=e){Ne(e,[ct(t)])}function ut(e){Ve(ct(e))}function dt(e){He(ct(e))}var ft={up:`up`,down:`down`,left:`left`,right:`right`,upLeft:`upLeft`,upRight:`upRight`,downLeft:`downLeft`,downRight:`downRight`},pt=[`right`,`downRight`,`down`,`downLeft`,`left`,`upLeft`,`up`,`upRight`];function mt(e,t={}){let n={...ft,...t.actions},r=t.minDistance??24;for(let e of[...pt,`tap`]){let t=n[e];t&<(t,`swipe:${e}`)}let i=!1,a=-1,o=0,s=0;function c(e){ut(`swipe:${e}`),dt(`swipe:${e}`)}function l(e){i=!0,a=e.pointerId,o=e.clientX,s=e.clientY}function u(e){if(!i||e.pointerId!==a)return;i=!1;let t=e.clientX-o,l=e.clientY-s;if(Math.hypot(t,l)<r){n.tap&&c(`tap`);return}let u=pt[(Math.round(Math.atan2(l,t)/(Math.PI/4))%8+8)%8];n[u]&&c(u)}return e.addEventListener(`pointerdown`,l),e.addEventListener(`pointerup`,u),e.addEventListener(`pointercancel`,u),()=>{e.removeEventListener(`pointerdown`,l),e.removeEventListener(`pointerup`,u),e.removeEventListener(`pointercancel`,u)}}function ht(e,t={}){let n=t.dragThreshold??4,r=t.toWorld??((e,t)=>({x:e,y:t})),i=new p,a=new p,o=new p,s=new p,c=-1,l=!1,u=!1,d=0,f=0,m=null;function h(t){let n=e.getBoundingClientRect?.()??{left:0,top:0},i=t.clientX-n.left,a=t.clientY-n.top,o=r(i,a);return{x:i,y:a,worldX:o.x,worldY:o.y,dx:l?i-d:0,dy:l?a-f:0,pointerId:t.pointerId,pressed:l}}function g(t){if(l)return;l=!0,u=!1,c=t.pointerId;let n=e.getBoundingClientRect?.()??{left:0,top:0};d=t.clientX-n.left,f=t.clientY-n.top,m=h(t),i.dispatch(m)}function _(e){l&&e.pointerId!==c||(m=h(e),a.dispatch(m),l&&(!u&&Math.hypot(m.dx,m.dy)>=n&&(u=!0),u&&o.dispatch(m)))}function v(e){if(!l||e.pointerId!==c)return;let t=u,n=h(e);l=!1,u=!1,m={...n,pressed:!1,dx:0,dy:0},s.dispatch({...n,pressed:!1,dragged:t})}return e.addEventListener(`pointerdown`,g),e.addEventListener(`pointermove`,_),e.addEventListener(`pointerup`,v),e.addEventListener(`pointercancel`,v),{down:i,move:a,drag:o,up:s,get current(){return m},detach(){e.removeEventListener(`pointerdown`,g),e.removeEventListener(`pointermove`,_),e.removeEventListener(`pointerup`,v),e.removeEventListener(`pointercancel`,v)}}}function gt(e=window){Ae||(Ae=!0,e.addEventListener(`keydown`,Je),e.addEventListener(`keyup`,Ye),e.addEventListener(`compositionstart`,Xe),e.addEventListener(`compositionupdate`,Ze),e.addEventListener(`compositionend`,Qe),window.addEventListener(`blur`,$e),e.addEventListener(`wheel`,ke,{passive:!1}))}function _t(e=window){Ae&&(Ae=!1,e.removeEventListener(`keydown`,Je),e.removeEventListener(`keyup`,Ye),e.removeEventListener(`compositionstart`,Xe),e.removeEventListener(`compositionupdate`,Ze),e.removeEventListener(`compositionend`,Qe),e.removeEventListener(`wheel`,ke),window.removeEventListener(`blur`,$e),$e())}var vt=class{constructor(e,t={}){if(!e)throw Error(`a player needs a non-empty id`);this.id=e,this.padIndex=t.padIndex}scoped(e){return`${this.id}:${e}`}bind(e,t){Me(this.scoped(e),t)}bindButton(e,t){if(this.padIndex===void 0)throw Error(`player "${this.id}" has no padIndex to bind a gamepad button to`);it(this.scoped(e),this.padIndex,t)}bindAxis(e,t,n){if(this.padIndex===void 0)throw Error(`player "${this.id}" has no padIndex to bind a gamepad axis to`);at(this.scoped(e),this.padIndex,t,n)}bindTouch(e,t=e){lt(this.scoped(e),`${this.id}:${t}`)}pressTouch(e){ut(`${this.id}:${e}`)}releaseTouch(e){dt(`${this.id}:${e}`)}isDown(e){return Ue(this.scoped(e))}justPressed(e){return We(this.scoped(e))}justReleased(e){return Ge(this.scoped(e))}keysFor(e){return Ie(this.scoped(e))}},yt=25214903917n,bt=11n,xt=(1n<<48n)-1n,St=class{constructor(e=0,t={}){this.state=0n,this.onDraw=t.onDraw,this.setSeed(e)}setSeed(e){this.state=(BigInt.asIntN(64,BigInt(e))^yt)&xt}next(e){if(!Number.isInteger(e)||e<1||e>32)throw Error(`next needs 1 to 32 bits, got ${e}`);this.state=this.state*yt+bt&xt;let t=Number(this.state>>BigInt(48-e)),n=e===32?t|0:t;return this.onDraw?.({bits:e,value:n}),n}nextInt(e){if(e===void 0)return this.next(32);if(!Number.isInteger(e)||e<=0||e>2147483647)throw Error(`nextInt needs a bound from 1 to 2147483647, got ${e}`);if((e&-e)===e)return Math.floor(e*this.next(31)/2147483648);let t,n;do t=this.next(31),n=t%e;while(t-n+(e-1)>2147483647);return n}nextLong(){let e=BigInt(this.next(32)),t=BigInt(this.next(32));return BigInt.asIntN(64,(e<<32n)+t)}nextDouble(){return(this.next(26)*134217728+this.next(27))/2**53}nextFloat(){return this.next(24)/16777216}nextBoolean(){return this.next(1)!==0}};_e();function Ct(e,t){if(!t)throw Error(`scramble needs a non-empty key`);let n=new TextEncoder().encode(e),r=new TextEncoder().encode(t),i=new Uint8Array(n.length);for(let e=0;e<n.length;e++)i[e]=n[e]^r[e%r.length];return Tt(i)}function wt(e,t){if(!t)throw Error(`scramble needs a non-empty key`);let n=Et(e),r=new TextEncoder().encode(t),i=new Uint8Array(n.length);for(let e=0;e<n.length;e++)i[e]=n[e]^r[e%r.length];return new TextDecoder(`utf-8`,{fatal:!0}).decode(i)}function Tt(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t)}function Et(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}var Dt=10485760;function Ot(e,t={}){let n=t.maxBytes??Dt,r=typeof e==`string`?new TextEncoder().encode(e).length:e.length;if(r>n)throw Error(`inbound data exceeds the ${n}-byte limit (${r} bytes)`)}function kt(e){for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n!==9&&n!==10&&n!==13&&(n<=31||n===127))throw Error(`inbound data contains a control character (0x${n.toString(16).padStart(2,`0`)}) at index ${t}`)}}function At(e,t={}){return Ot(e,t),kt(e),e}var jt=new Set([`__proto__`,`constructor`,`prototype`]);function Mt(e,t=`$`){if(Array.isArray(e))e.forEach((e,n)=>Mt(e,`${t}[${n}]`));else if(typeof e==`object`&&e)for(let n of Object.keys(e)){if(jt.has(n))throw Error(`${t} contains a forbidden key "${n}"`);Mt(e[n],`${t}.${n}`)}}function Nt(e,t,n=`$`){if(e===void 0){if(t.optional)return;throw Error(`${n} is required`)}switch(t.type){case`string`:if(typeof e!=`string`)throw Error(`${n} must be a string`);return;case`number`:if(typeof e!=`number`||!Number.isFinite(e))throw Error(`${n} must be a finite number`);if(t.min!==void 0&&e<t.min)throw Error(`${n} must be >= ${t.min}`);if(t.max!==void 0&&e>t.max)throw Error(`${n} must be <= ${t.max}`);return;case`boolean`:if(typeof e!=`boolean`)throw Error(`${n} must be a boolean`);return;case`array`:if(!Array.isArray(e))throw Error(`${n} must be an array`);if(t.maxLength!==void 0&&e.length>t.maxLength)throw Error(`${n} exceeds its maximum length of ${t.maxLength}`);e.forEach((e,r)=>Nt(e,t.items,`${n}[${r}]`));return;case`object`:if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`${n} must be an object`);for(let t of Object.keys(e))if(jt.has(t))throw Error(`${n} contains a forbidden key "${t}"`);for(let[r,i]of Object.entries(t.fields))Nt(e[r],i,`${n}.${r}`);return}}function Pt(e,t={}){let n=t.label??`inbound data`;At(e,t);try{return JSON.parse(e,(e,t)=>{if(jt.has(e))throw new Ft(e);return t})}catch(e){throw e instanceof Ft?Error(`${n} contains a forbidden key "${e.key}"`):Error(`${n} is not valid JSON (${e instanceof Error?e.message:String(e)})`)}}var Ft=class{constructor(e){this.key=e}};function It(e,t){let n=Pt(e,{label:t}),r=n?.meta;if(typeof n!=`object`||!n||Array.isArray(n)||!(`state`in n))throw Error(`${t} is not save data (expected { meta, state })`);if(typeof r!=`object`||!r||!Number.isSafeInteger(r.version)||r.version<0)throw Error(`${t} has no valid meta.version`);if(typeof r.savedAt!=`number`||!Number.isFinite(r.savedAt))throw Error(`${t} has no valid meta.savedAt`);return n}var Lt=class{constructor(){this.data=new Map}read(e){return this.data.get(e)??null}write(e,t){this.data.set(e,t)}remove(e){this.data.delete(e)}keys(){return[...this.data.keys()]}};function Rt(){return typeof localStorage>`u`?new Lt:{read:e=>localStorage.getItem(e),write:(e,t)=>localStorage.setItem(e,t),remove:e=>localStorage.removeItem(e),keys:()=>Object.keys(localStorage)}}var zt=class{constructor(e){this.namespace=e.namespace,this.version=e.version,this.migrations=e.migrations??{},this.storage=e.storage??Rt()}key(e){return`mwg-save:${this.namespace}:${e}`}save(e,t,n){let r={meta:{version:this.version,savedAt:Date.now(),preview:n},state:t};this.storage.write(this.key(e),JSON.stringify(r))}load(e){let t=this.storage.read(this.key(e));if(!t)return null;try{let n=It(t,`save slot "${e}"`),r=n.state;for(let e=n.meta.version;e<this.version;e++)r=(this.migrations[e]??(e=>e))(r);return{meta:{...n.meta,version:this.version},state:r}}catch{return null}}importExternal(e,t,n,r){Ot(t);let i=n(t);for(let e=0;e<this.version;e++)i=(this.migrations[e]??(e=>e))(i);let a={meta:{version:this.version,savedAt:Date.now(),preview:r},state:i};this.storage.write(this.key(e),JSON.stringify(a))}delete(e){this.storage.remove(this.key(e))}exportSlot(e,t){let n=this.storage.read(this.key(e));return n===null?null:t?Ct(n,t):n}importSlot(e,t,n){Ot(t);let r=It(n?wt(t,n):t,`SaveSystem.importSlot: payload`),i=r.state;for(let e=r.meta.version;e<this.version;e++)i=(this.migrations[e]??(e=>e))(i);let a={meta:{...r.meta,version:this.version},state:i};this.storage.write(this.key(e),JSON.stringify(a))}list(){let e=`mwg-save:${this.namespace}:`,t=[];for(let n of this.storage.keys()){if(!n.startsWith(e))continue;let r=this.storage.read(n);if(r)try{t.push({slot:n.slice(e.length),meta:It(r,n).meta})}catch{}}return t}},Bt=class{constructor(e,t){this.storage=e,this.key=t}read(e){let t=this.storage.read(this.key);return t?Pt(t,{label:`stored value "${this.key}"`}):e}write(e){this.storage.write(this.key,JSON.stringify(e))}remove(){this.storage.remove(this.key)}};function Vt(e,t=`value`){return Ht(e,t,new Set)}function Ht(e,t,n){if(typeof e==`function`||typeof e==`symbol`)return t;if(typeof e!=`object`||!e||n.has(e)||(n.add(e),Ut(e)))return null;let r=[];if(e instanceof Map)for(let[n,i]of e)r.push([`${t}.get(${JSON.stringify(n)??String(n)})`,i]);else if(e instanceof Set)for(let n of e)r.push([`${t}.item`,n]);else if(Array.isArray(e))e.forEach((e,n)=>r.push([`${t}[${n}]`,e]));else for(let[n,i]of Object.entries(e))r.push([`${t}.${n}`,i]);for(let[e,t]of r){let r=Ht(t,e,n);if(r)return r}return t}function Ut(e){try{return structuredClone(e),!0}catch{return!1}}function Wt(e,t){try{return structuredClone(e)}catch(n){let r=Vt(e,t)??t;throw TypeError(`${r} cannot be structured-cloned (${n instanceof Error?n.message:String(n)}). Journals, snapshots and undo checkpoints copy their contents with structuredClone, so they must hold plain data: refer to a live object (an actor, anything carrying callbacks such as a ReactionTable) by its id and resolve it inside the rule.`,{cause:n})}}var Gt=class{constructor(e,t={}){this._state=Wt(e,`initial state`),this.version=t.version??1,this.migrations=t.migrations??{},this.extensions=t.extensions??new Kt}get state(){return structuredClone(this._state)}set(e){this._state=Wt(e,`state`)}update(e){let t=e(this.state);return this.set(t),this.state}snapshot(){let e=this.extensions.snapshot();return{version:this.version,state:this.state,extensions:e.extensions,extensionVersions:e.versions}}restore(e,t={}){if(!Number.isSafeInteger(e.version)||e.version<1)throw Error(`canonical state snapshot version must be a positive integer`);if(e.version>this.version)throw Error(`canonical state snapshot version ${e.version} is newer than ${this.version}`);let n=this.snapshot();try{let n=Wt(e.state,`snapshot.state`);for(let t=e.version;t<this.version;t++){let e=this.migrations[t+1];if(!e)throw Error(`missing canonical state migration to version ${t+1}`);n=e(n)}return this._state=Wt(n,`migrated state`),this.extensions.restore({extensions:e.extensions,versions:e.extensionVersions},t)}catch(e){throw this._state=structuredClone(n.state),this.extensions.restore({extensions:n.extensions,versions:n.extensionVersions},{missing:`keep`}),e}}transaction(e){let t=this.snapshot();try{return e(this)}catch(e){throw this.restore(t),e}}},Kt=class{constructor(){this.extensions=new Map}register(e){if(!/^[A-Za-z_][A-Za-z0-9_.-]*$/.test(e.id))throw Error(`invalid state extension id: ${e.id}`);if(this.extensions.has(e.id))throw Error(`state extension already registered: ${e.id}`);return this.extensions.set(e.id,{id:e.id,capture:()=>e.capture(),restore:t=>e.restore(t),version:e.version??1,migrations:e.migrations,reset:e.reset,remove:e.remove}),()=>this.extensions.delete(e.id)}snapshot(){let e={};for(let[t,n]of this.extensions)e[t]=Wt(n.capture(),`extension ${t}`);let t={};for(let[e,n]of this.extensions)t[e]=n.version??1;return{extensions:e,versions:t}}restore(e,t={}){let n=this.snapshot(),r=[];try{for(let[n,i]of this.extensions){if(!(n in e.extensions)){t.missing===`reset`?(i.reset&&i.reset(),r.push({extension:n,from:0,to:i.version??1,status:`reset`})):t.missing===`remove`&&(i.remove&&i.remove(),r.push({extension:n,from:0,to:i.version??1,status:`removed`}));continue}let a=e.versions?.[n]??1,o=i.version??1,s=Wt(e.extensions[n],`snapshot.extensions.${n}`);for(let e=a;e<o;e++){let t=i.migrations?.[e+1];if(!t)throw Error(`missing state migration for ${n} to version ${e+1}`);s=t(s)}i.restore(Wt(s,`migrated extension ${n}`)),r.push({extension:n,from:a,to:o,status:a===o?`unchanged`:`migrated`})}}catch(e){for(let[e,t]of this.extensions)e in n.extensions&&t.restore(structuredClone(n.extensions[e]));throw e}for(let e of r)t.onDiagnostic?.(e);return r}transaction(e){let t=this.snapshot();try{return e()}catch(e){throw this.restore(t),e}}},qt=new Set([`localhost`,`127.0.0.1`,`[::1]`]);function Jt(e,t,n=!1){if(n||!/^[a-z][a-z0-9+.-]*:/i.test(e))return;let r=new URL(e);if(r.protocol!==`https:`&&r.protocol!==`wss:`&&(r.protocol!==`http:`&&r.protocol!==`ws:`||!qt.has(r.hostname)))throw Error(`${t} url must use https: or wss: (got ${r.protocol}//${r.host}); pass allowInsecure: true to accept it`)}var Yt=class{constructor(e,t){if(!e.endpoint)throw Error(`${t} endpoint is required`);if(Jt(e.endpoint,`${t} endpoint`,e.allowInsecure),this.endpoint=e.endpoint,this.label=t,this.maxResponseBytes=e.maxResponseBytes??10485760,this.timeoutMs=e.timeoutMs??1e4,!(this.timeoutMs>0))throw Error(`${t} timeout must be positive`);if(this.fetchFn=e.fetch??globalThis.fetch,!this.fetchFn)throw Error(`fetch is unavailable; provide ${t}Options.fetch`)}async withTimeout(e){let t=new AbortController,n=setTimeout(()=>t.abort(),this.timeoutMs);try{return await e(t.signal)}finally{clearTimeout(n)}}async readText(e){let t=this.maxResponseBytes,n=Number(e.headers?.get?.(`content-length`));if(n>t)throw Error(`${this.label} response exceeds the ${t}-byte limit (${n} bytes)`);if(!e.body){let n=await e.text();return Ot(n,{maxBytes:t}),n}let r=e.body.getReader(),i=[],a=0;for(;;){let{done:e,value:n}=await r.read();if(e)break;if(a+=n.byteLength,a>t)throw await r.cancel(),Error(`${this.label} response exceeds the ${t}-byte limit`);i.push(n)}let o=new Uint8Array(a),s=0;for(let e of i)o.set(e,s),s+=e.byteLength;return new TextDecoder().decode(o)}async readJson(e,t){return Pt(await this.readText(e),{maxBytes:this.maxResponseBytes,label:`${this.label} ${t}`})}},Xt=class extends Yt{constructor(e){super(e,`save sync`)}async upload(e,t){if(!e)throw Error(`save sync slot name is required`);if(!t)throw Error(`save sync payload cannot be empty`);return this.withTimeout(async n=>{let r=await this.fetchFn(this.slotUrl(e),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({payload:t}),signal:n});if(!r.ok)throw Error(`save upload failed with HTTP ${r.status}`);return{ok:!0,status:r.status}})}async download(e){if(!e)throw Error(`save sync slot name is required`);return this.withTimeout(async t=>{let n=await this.fetchFn(this.slotUrl(e),{signal:t});if(!n.ok)throw Error(`save download failed with HTTP ${n.status}`);let r=await this.readJson(n,`download`);if(typeof r?.payload!=`string`)throw Error(`save download response missing a string payload`);return r.payload})}async list(){return this.withTimeout(async e=>{let t=await this.fetchFn(this.endpoint,{signal:e});if(!t.ok)throw Error(`save slot list failed with HTTP ${t.status}`);let n=await this.readJson(t,`slot list`);if(!Array.isArray(n?.slots)||!n.slots.every(e=>typeof e==`string`))throw Error(`save slot list response missing a string array of slots`);return n.slots})}slotUrl(e){let t=this.endpoint.includes(`?`)?`&`:`?`;return`${this.endpoint}${t}slot=${encodeURIComponent(e)}`}},Zt=1,Qt=class{constructor(e){if(this.onWelcome=new p,this.onTick=new p,this.onReject=new p,this.onDesync=new p,this.onClose=new p,this.onProtocolError=new p,this.socket=null,this._id=null,!e.url)throw Error(`lockstep client url is required`);Jt(e.url,`lockstep client`,e.allowInsecure),this.url=e.url,this.createSocket=e.create??(e=>new WebSocket(e)),this.validateInput=e.validateInput,this.maxMessageBytes=e.maxMessageBytes??1048576}get id(){return this._id}get connected(){return this.socket!==null&&this.socket.readyState===Zt}connect(){if(this.socket)throw Error(`lockstep client is already connected`);let e=this.createSocket(this.url);e.onmessage=e=>this.handleMessage(e.data),e.onclose=()=>{this.socket=null,this._id=null,this.onClose.dispatch()},this.socket=e}submitInput(e,t){if(!this.connected)return;let n=this.validateInput?.(e);n===!1||typeof n==`string`?this.onReject.dispatch({reason:n===!1?`input rejected by client validation`:n}):this.socket?.send(JSON.stringify({type:`input`,payload:e,...t===void 0?{}:{checksum:t}}))}close(){this.socket?.close()}handleMessage(e){let t;try{if(typeof e!=`string`)throw Error(`lockstep message is not text`);t=en(Pt(e,{maxBytes:this.maxMessageBytes,label:`lockstep message`}))}catch(e){this.onProtocolError.dispatch({reason:e instanceof Error?e.message:String(e)});return}if(t.type===`welcome`)this._id=t.id,this.onWelcome.dispatch({id:t.id,...t.seed===void 0?{}:{seed:t.seed},...t.initialState===void 0?{}:{initialState:t.initialState}});else if(t.type===`tick`){let e={tick:t.tick,inputs:t.inputs,...t.checksums===void 0?{}:{checksums:t.checksums}};if(this.onTick.dispatch(e),t.checksums){let e=Object.values(t.checksums);e.some(t=>t!==e[0])&&this.onDesync.dispatch({tick:t.tick,checksums:t.checksums})}}else this.onReject.dispatch({reason:t.reason??`input rejected by server`})}},$t=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function en(e){if(!$t(e)||typeof e.type!=`string`)throw Error(`lockstep message has no type`);switch(e.type){case`welcome`:if(typeof e.id!=`string`||e.id===``)throw Error(`welcome needs a string id`);if(e.seed!==void 0&&!Number.isSafeInteger(e.seed))throw Error(`welcome seed must be an integer`);return e;case`tick`:if(!Number.isSafeInteger(e.tick)||e.tick<0)throw Error(`tick needs a non-negative integer tick`);if(!$t(e.inputs))throw Error(`tick needs an inputs object`);if(e.checksums!==void 0&&(!$t(e.checksums)||Object.values(e.checksums).some(e=>typeof e!=`number`)))throw Error(`tick checksums must map ids to numbers`);return e;case`rejected`:if(e.reason!==void 0&&typeof e.reason!=`string`)throw Error(`rejected reason must be a string`);return e;default:throw Error(`unknown lockstep message type "${e.type}"`)}}var tn=class{constructor(e){this.store=new Bt(e.storage??Rt(),`mwg-runs:${e.namespace}`),this.limit=e.limit}readAll(){return this.store.read([])}record(e){let t=this.readAll(),n={id:`${Date.now()}-${t.length}`,endedAt:Date.now(),summary:e};return t.push(n),this.limit!==void 0&&t.length>this.limit&&t.splice(0,t.length-this.limit),this.store.write(t),n}all(){return this.readAll()}ranked(e,t=`desc`){let n=this.readAll(),r=t===`desc`?-1:1;return n.sort((t,n)=>r*(e(t.summary)-e(n.summary)))}clear(){this.store.remove()}},nn=class{constructor(e){this.store=new Bt(e.storage??Rt(),`mwg-stats:${e.namespace}`),this.initial=e.initial,this.combine=e.combine}get(){return this.store.read(this.initial)}record(e){let t=this.combine(this.get(),e);return this.store.write(t),t}reset(){this.store.remove()}},rn=class extends Yt{constructor(e){super(e,`telemetry`),this.consented=!1,this.maxStringLength=e.maxStringLength??256,this.maxProperties=e.maxProperties??32,this.allowed=e.allowedProperties?new Set(e.allowedProperties):null}get hasConsent(){return this.consented}setConsent(e){this.consented=e}async send(e){if(!e.name)throw Error(`telemetry event needs a name`);return this.consented?this.withTimeout(async t=>{let n=await this.fetchFn(this.endpoint,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(this.bounded(e)),signal:t});if(!n.ok)throw Error(`telemetry request failed with HTTP ${n.status}`);return{ok:!0,status:n.status}}):null}bounded(e){let t=e=>e.length>this.maxStringLength?e.slice(0,this.maxStringLength):e;if(!e.properties)return{name:t(e.name)};let n={},r=0;for(let[i,a]of Object.entries(e.properties))if(!this.allowed||this.allowed.has(i)){if(r++>=this.maxProperties)break;n[t(i)]=typeof a==`string`?t(a):a}return{name:t(e.name),properties:n}}},an=class extends Yt{constructor(e){super(e,`news`)}async fetchItems(){return this.withTimeout(async e=>{let t=await this.fetchFn(this.endpoint,{signal:e});if(!t.ok)throw Error(`news request failed with HTTP ${t.status}`);let n=await this.readJson(t,`response`);if(!Array.isArray(n))throw Error(`news response was not an array`);return n.map((e,t)=>on(e,t))})}};function on(e,t){if(typeof e!=`object`||!e)throw Error(`news item ${t} was not an object`);let n=e;if(typeof n.id!=`string`||!n.id)throw Error(`news item ${t} is missing a string id`);if(typeof n.title!=`string`)throw Error(`news item ${t} is missing a string title`);if(typeof n.body!=`string`)throw Error(`news item ${t} is missing a string body`);return{id:n.id,title:n.title,body:n.body,publishedAt:typeof n.publishedAt==`number`?n.publishedAt:void 0}}var sn=class{constructor(e){this.store=new Bt(e.storage??Rt(),`mwg-news-seen:${e.namespace}`)}readSeen(){return new Set(this.store.read([]))}isSeen(e){return this.readSeen().has(e)}markSeen(e){let t=this.readSeen();t.add(e),this.store.write([...t])}unseen(e){let t=this.readSeen();return e.filter(e=>!t.has(e.id))}},cn=class{constructor(e,t={}){if(!e)throw Error(`a collection needs a name`);this.prefix=`mwg-db:${t.namespace??`default`}:${e}:`,this.storage=t.storage??Rt()}get size(){return this.keys().length}all(){return this.keys().map(e=>this.read(e))}get(e){let t=this.storage.read(this.prefix+e);return t===null?void 0:this.parse(t,this.prefix+e)}put(e){if(typeof e!=`object`||!e||Array.isArray(e)||typeof e.id!=`string`||e.id===``)throw Error(`a record must be an object with a string id`);this.storage.write(this.prefix+e.id,JSON.stringify(e))}remove(e){this.storage.remove(this.prefix+e)}where(e){return this.all().filter(e)}clear(){for(let e of this.keys())this.storage.remove(e)}keys(){return this.storage.keys().filter(e=>e.startsWith(this.prefix))}read(e){return this.parse(this.storage.read(e),e)}parse(e,t){return Pt(e,{label:`record "${t}"`})}},ln=class{constructor(e,t,n){if(this.recorded=[],this.fromFrame=n?.fromFrame??0,!Number.isInteger(this.fromFrame)||this.fromFrame<0)throw RangeError(`a resumed recorder needs a non-negative fromFrame`);this.frameStamp=this.fromFrame,this.actions=e,this.frames=t,this.onAction=e=>{this.recorded.push({frame:this.frameStamp,action:e})},this.onFrame=()=>{this.frameStamp++},e.add(this.onAction),t.add(this.onFrame)}get events(){return this.recorded}get frame(){return this.frameStamp}toJSON(){return this.recorded.map(e=>({frame:e.frame,action:e.action}))}stop(){this.actions.remove(this.onAction),this.frames.remove(this.onFrame)}},un=class{constructor(e,t,n,r){if(this.events=e,this.dispatch=t,this.frames=n,this.fromFrame=r?.fromFrame??0,!Number.isInteger(this.fromFrame)||this.fromFrame<0)throw RangeError(`a resumed player needs a non-negative fromFrame`);this.index=this.events.findIndex(e=>e.frame>=this.fromFrame),this.index<0&&(this.index=this.events.length),this.frame=this.fromFrame,this.onFrame=()=>this.pump(),n.add(this.onFrame)}get done(){return this.index>=this.events.length}stop(){this.frames.remove(this.onFrame)}pump(){for(;this.index<this.events.length&&this.events[this.index].frame<=this.frame;)this.dispatch(this.events[this.index].action),this.index++;this.frame++}};function dn(e){return JSON.stringify(e)}function fn(e){return pn(JSON.parse(e))}function pn(e){if(!Array.isArray(e))throw Error(`a replay must be an array of {frame, action}`);return e.map(e=>{if(typeof e!=`object`||!e||!Number.isInteger(e.frame)||e.frame<0||typeof e.action!=`string`)throw Error(`a replay entry must be {frame: a non-negative integer, action: a string}`);return{frame:e.frame,action:e.action}})}function mn(e,t){if(typeof t!=`string`||!t.length)throw TypeError(`a replay file needs a non-empty ${e}`);return t}function hn(e){let t=e;if(!Number.isInteger(t)||t<0||t>4294967295)throw RangeError(`a replay seed must be uint32`);return t}function gn(e,t){let n={format:`mwg-replay`,version:1,framework:mn(`framework`,t.framework),game:mn(`game`,t.game),events:pn(e)};if(t.seed!==void 0&&(n.seed=hn(t.seed)),t.recordedAt!==void 0){if(typeof t.recordedAt!=`number`||!Number.isFinite(t.recordedAt))throw TypeError(`recordedAt must be a finite number`);n.recordedAt=t.recordedAt}return JSON.stringify(n)}function _n(e,t){let n=Pt(e,{label:`replay file`});if(typeof n!=`object`||!n||Array.isArray(n))throw Error(`a replay file must be a JSON object`);if(n.format!==`mwg-replay`)throw Error(`not a replay file: expected format "mwg-replay", found ${JSON.stringify(n.format)}`);if(n.version!==1)throw Error(`replay file version ${JSON.stringify(n.version)} is not supported (this build reads 1)`);if(n.game!==t.game)throw Error(`a replay of ${JSON.stringify(n.game)} cannot be imported into ${JSON.stringify(t.game)}`);if(n.framework!==t.framework)throw Error(`a replay recorded against mwg ${JSON.stringify(n.framework)} cannot be imported into ${JSON.stringify(t.framework)}`);let r=pn(n.events);return{format:`mwg-replay`,version:1,framework:n.framework,game:n.game,...n.seed===void 0?{}:{seed:hn(n.seed)},...n.recordedAt===void 0?{}:{recordedAt:n.recordedAt},events:r}}var vn=class{constructor(e){if(typeof e.namespace!=`string`||!e.namespace.length)throw TypeError(`a last-run store needs a non-empty namespace`);let t=e.maxEvents??1e4;if(!Number.isInteger(t)||t<1||t>1e6)throw RangeError(`last-run maxEvents must be in 1..1000000`);this.maxEvents=t,this.store=new Bt(e.storage??Rt(),`mwg-last-run:${e.namespace}`)}keep(e,t){let n=pn(e);n.length>this.maxEvents&&(n=n.slice(n.length-this.maxEvents));let r=t===void 0?{version:1,events:n}:{version:1,seed:hn(t),events:n};Ot(JSON.stringify(r)),this.store.write(r)}load(){let e=this.store.read(null);if(e===null)return null;if(e?.version!==1)throw Error(`the kept last-run recording is not version 1; clear() it and record again`);return{version:1,...e.seed===void 0?{}:{seed:hn(e.seed)},events:pn(e.events)}}clear(){this.store.remove()}};function yn(e,t){return{version:1,frame:e.frame,events:e.toJSON(),state:t}}function bn(e,t,n){if(typeof e!=`object`||!e||e.version!==1)throw Error(`a run checkpoint must be { version: 1, frame, events, state }`);return new un(pn(e.events),t,n,{fromFrame:e.frame})}function xn(e,t){if(typeof document>`u`)throw Error(`downloadReplayFile needs a browser document`);let n=document.createElement(`a`);n.href=URL.createObjectURL(new Blob([e],{type:`application/json`})),n.download=t,document.body.appendChild(n),n.click(),n.remove(),setTimeout(()=>URL.revokeObjectURL(n.href),0)}async function Sn(e){return await e.text()}async function Cn(e=`.json`){if(typeof document>`u`)throw Error(`pickReplayFile needs a browser document`);return await new Promise(t=>{let n=document.createElement(`input`);n.type=`file`,n.accept=e,n.style.display=`none`;let r=!1,i=e=>{r||(r=!0,n.remove(),t(e))};n.addEventListener(`change`,()=>i(n.files?.[0]??null)),n.addEventListener(`cancel`,()=>i(null)),document.body.appendChild(n),n.click()})}var wn=class e{constructor(){this.entries=[],this.nextSequence=0}append(e,t=[]){let n={sequence:this.nextSequence,action:Wt(e,`action`),events:Wt([...t],`events`)};return this.nextSequence++,this.entries.push(n),structuredClone(n)}get size(){return this.entries.length}get all(){return structuredClone(this.entries)}mark(){return this.nextSequence}since(e){return structuredClone(this.entries.filter(t=>t.sequence>=e))}truncate(e){this.entries=this.entries.filter(t=>t.sequence<e),this.nextSequence=e}toJSON(){return this.all}replace(t){let n=e.fromJSON(t);this.entries=n.entries,this.nextSequence=n.nextSequence}static fromJSON(t){let n=new e,r=0;for(let e of t){if(!Number.isSafeInteger(e.sequence)||e.sequence!==r)throw Error(`action journal sequences must be contiguous from zero`);n.entries.push(structuredClone({sequence:e.sequence,action:e.action,events:[...e.events]})),r++}return n.nextSequence=r,n}};function Tn(e){if(e.criteria)return e.criteria;if(e.counter===void 0||e.target===void 0)throw Error(`achievement "${e.id}" needs either counter/target or criteria`);return[{counter:e.counter,target:e.target}]}var En=class e{constructor(){this.definitions=new Map,this.counts=new Map,this.fresh=[]}define(e){this.definitions.set(e.id,e)}count(e){return this.counts.get(e)??0}increment(e,t=1){let n=this.count(e);this.counts.set(e,n+t);let r=[];for(let t of this.definitions.values()){let i=Tn(t);i.some(t=>t.counter===e)&&(i.every(t=>t.counter===e?n>=t.target:this.count(t.counter)>=t.target)||i.every(e=>this.count(e.counter)>=e.target)&&(r.push(t.id),this.fresh.push(t.id)))}return r}unlocked(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);return Tn(t).every(e=>this.count(e.counter)>=e.target)}progress(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);let n=Tn(t);if(n.length!==1)throw Error(`achievement "${e}" has several criteria - use subProgress`);return{count:this.count(n[0].counter),target:n[0].target}}subProgress(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);return Tn(t).map(e=>{let t=this.count(e.counter);return{counter:e.counter,count:t,target:e.target,met:t>=e.target}})}drainNew(){let e=this.fresh;return this.fresh=[],e}toJSON(){return{counts:[...this.counts]}}static fromJSON(t,n){let r=new e;for(let e of t)r.define(e);for(let[e,t]of n.counts)r.counts.set(e,t);return r}},Dn=class e{constructor(e=[]){this.active=new Set,this.spent=new Set,this.rules=[...e]}add(e){this.rules.push(e)}remove(e){this.rules=this.rules.filter(t=>t.id!==e),this.active.delete(e)}check(e){let t=[];for(let n of this.rules){if(n.once&&this.spent.has(n.id))continue;let r=n.when(e);r&&!this.active.has(n.id)&&(n.action(e),t.push(n.id),n.once&&this.spent.add(n.id)),r?this.active.add(n.id):this.active.delete(n.id)}return t}isActive(e){return this.active.has(e)}reset(){this.active.clear(),this.spent.clear()}toJSON(){return{active:[...this.active],spent:[...this.spent]}}static fromJSON(t,n){let r=new e(t);for(let e of n.active)r.active.add(e);for(let e of n.spent)r.spent.add(e);return r}},On=class{constructor(e={}){let t=e.storage??Rt(),n=`mwg-session:${e.namespace??`default`}`,r=Number(t.read(n)??`0`);this.launches=(Number.isFinite(r)?r:0)+1,t.write(n,String(this.launches))}};function kn(e,t,n){return e<t?t:e>n?n:e}function An(){return{musicVolume:1,sfxVolume:1,muted:!1,zoom:1,bindings:In(je),custom:{}}}function jn(e){return e.muted?0:e.musicVolume}function Mn(e){return e.muted?0:e.sfxVolume}var Nn=class{constructor(e={}){this.storage=e.storage??Rt(),this.key=`mwg-settings:${e.namespace??`default`}`,this.value=Vn(this.storage,this.key),Re(this.value.bindings)}get current(){return{...this.value,bindings:In(this.value.bindings),custom:{...this.value.custom}}}getCustom(e,t){return this.value.custom[e]??t}setCustom(e,t){this.value.custom[e]=t,Hn(this.storage,this.key,this.value)}setMusicVolume(e){this.update({musicVolume:e})}setSfxVolume(e){this.update({sfxVolume:e})}setMuted(e){this.update({muted:e})}setZoom(e){this.update({zoom:e})}setBindings(e){this.update({bindings:e})}update(e){e.musicVolume!==void 0&&(this.value.musicVolume=Pn(e.musicVolume)),e.sfxVolume!==void 0&&(this.value.sfxVolume=Pn(e.sfxVolume)),e.muted!==void 0&&(this.value.muted=e.muted),e.zoom!==void 0&&(this.value.zoom=Fn(e.zoom)),e.bindings!==void 0&&(this.value.bindings=Ln(e.bindings),Re(this.value.bindings)),e.custom!==void 0&&(this.value.custom=zn(e.custom)),Hn(this.storage,this.key,this.value)}applyBindings(){Re(this.value.bindings)}reset(){this.value=An(),Re(this.value.bindings),Hn(this.storage,this.key,this.value)}};function Pn(e){return Number.isFinite(e)?kn(e,0,1):1}function Fn(e){return Number.isFinite(e)?Math.max(.01,e):1}function In(e){let t={};for(let[n,r]of Object.entries(e))t[n]=[...r];return t}function Ln(e){if(typeof e!=`object`||!e||Array.isArray(e))return In(je);let t={};for(let[n,r]of Object.entries(e)){if(!Array.isArray(r))continue;let e=r.filter(e=>typeof e==`string`);e.length>0&&(t[n]=e)}return Object.keys(t).length>0?t:In(je)}function Rn(e){let t=typeof e;return t===`string`||t===`number`||t===`boolean`}function zn(e){if(typeof e!=`object`||!e||Array.isArray(e))return{};let t={};for(let[n,r]of Object.entries(e))Rn(r)&&(t[n]=r);return t}function Bn(e){let t=An();if(typeof e!=`object`||!e||Array.isArray(e))return t;let n=e;return{musicVolume:typeof n.musicVolume==`number`?Pn(n.musicVolume):t.musicVolume,sfxVolume:typeof n.sfxVolume==`number`?Pn(n.sfxVolume):t.sfxVolume,muted:typeof n.muted==`boolean`?n.muted:t.muted,zoom:typeof n.zoom==`number`?Fn(n.zoom):t.zoom,bindings:Ln(n.bindings),custom:zn(n.custom)}}function Vn(e,t){let n=e.read(t);if(!n)return An();try{return Bn(Pt(n,{label:`settings`}))}catch{return An()}}function Hn(e,t,n){e.write(t,JSON.stringify(n))}var Un=class extends Yt{constructor(e){super(e,`feedback`)}async submit(e){if(!e.message?.trim())throw Error(`feedback message cannot be empty`);return this.withTimeout(async t=>{let n=await this.fetchFn(this.endpoint,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e),signal:t});if(!n.ok)throw Error(`feedback request failed with HTTP ${n.status}`);return{ok:!0,status:n.status}})}},Wn=class{constructor(e){this.schedule=[],this.cursor=0,this.elapsed=0,this.startedWaves=new Set,this.completed=!1,this.onSpawn=e.onSpawn,this.onWaveStart=e.onWaveStart,this.onComplete=e.onComplete,e.waves.forEach((e,t)=>{let n=e.entries.reduce((e,t)=>e+t.count,0),r=e.duration??0,i=0;for(let a of e.entries)for(let o=0;o<a.count;o++,i++){let o=n>1&&r>0?i/(n-1)*r:0;this.schedule.push({time:e.delay+o,kind:a.kind,waveIndex:t})}}),this.schedule.sort((e,t)=>e.time-t.time),this.schedule.length===0&&(this.completed=!0,this.onComplete?.())}update(e){if(!this.completed){for(this.elapsed+=e;this.cursor<this.schedule.length&&this.schedule[this.cursor].time<=this.elapsed;){let e=this.schedule[this.cursor];this.startedWaves.has(e.waveIndex)||(this.startedWaves.add(e.waveIndex),this.onWaveStart?.(e.waveIndex)),this.onSpawn(e.kind),this.cursor++}this.cursor>=this.schedule.length&&(this.completed=!0,this.onComplete?.())}}get isComplete(){return this.completed}};function Gn(e,t){let n=e,r=t-(e-(e&1))/2;return{x:n,y:-n-r,z:r}}function Kn(e){return{x:e.x,y:e.z+(e.x-(e.x&1))/2}}var qn=[{x:1,y:-1,z:0},{x:1,y:0,z:-1},{x:0,y:1,z:-1},{x:-1,y:1,z:0},{x:-1,y:0,z:1},{x:0,y:-1,z:1}];function Jn(e,t){let n=Gn(e,t);return qn.map(e=>Kn({x:n.x+e.x,y:n.y+e.y,z:n.z+e.z}))}function Yn(e,t){let n=Gn(e.x,e.y),r=Gn(t.x,t.y);return Math.max(Math.abs(n.x-r.x),Math.abs(n.y-r.y),Math.abs(n.z-r.z))}function Xn(e){let t=Math.round(e.x),n=Math.round(e.y),r=Math.round(e.z),i=Math.abs(t-e.x),a=Math.abs(n-e.y),o=Math.abs(r-e.z);return i>a&&i>o?t=-n-r:a>o?n=-t-r:r=-t-n,{x:t,y:n,z:r}}function Zn(e,t){let n=Yn(e,t);if(n===0)return[{x:e.x,y:e.y}];let r=Gn(e.x,e.y),i=Gn(t.x,t.y),a=[];for(let e=0;e<=n;e++){let t=e/n;a.push(Kn(Xn({x:r.x+(i.x-r.x)*t,y:r.y+(i.y-r.y)*t,z:r.z+(i.z-r.z)*t})))}return a}function Qn(e,t){let n=Gn(e.x,e.y),r=[];for(let e=-t;e<=t;e++)for(let i=Math.max(-t,-e-t);i<=Math.min(t,-e+t);i++){let t=-e-i;r.push(Kn({x:n.x+e,y:n.y+i,z:n.z+t}))}return r}function $n(e,t,n,r,i={}){let a=+((i.offset??`odd`)===`odd`);return(i.orientation??`flat-top`)===`pointy-top`?{x:e*n+((t&1)===a?n/2:0)+n/2,y:t*r*.75+r/2}:{x:e*n*.75+n/2,y:t*r+((e&1)===a?r/2:0)+r/2}}function er(e,t,n,r,i={}){let a=(i.orientation??`flat-top`)===`pointy-top`,o=a?n:n*.75,s=a?r*.75:r,c=Math.round((e-n/2)/o),l=Math.round((t-r/2)/s),u={x:c,y:l},d=1/0;for(let a=-2;a<=2;a++)for(let o=-2;o<=2;o++){let s={x:c+a,y:l+o},f=$n(s.x,s.y,n,r,i),p=(f.x-e)**2+(f.y-t)**2;p<d&&(d=p,u=s)}return u}function tr(e,t,n,r){return n>=0&&r>=0&&n<e&&r<t}function nr(e,t,n){return n*e+t}function rr(e,t){return t%e}function ir(e,t){return Math.floor(t/e)}function ar(e,t){return`${e},${t}`}function or(e){let t=/^(-?\d+),(-?\d+)$/.exec(e);return t?{x:Number(t[1]),y:Number(t[2])}:null}var sr=[[0,-1],[1,0],[0,1],[-1,0]],cr=[[-1,-1],[0,-1],[1,-1],[-1,0],[1,0],[-1,1],[0,1],[1,1]],lr=[[0,-1],[1,-1],[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1]];function ur(e,t){return Math.hypot(e.x-t.x,e.y-t.y)}function dr(e,t){return Math.max(Math.abs(e.x-t.x),Math.abs(e.y-t.y))}function fr(e,t){return Math.abs(e.x-t.x)+Math.abs(e.y-t.y)}function pr(e,t,n){switch(e){case`euclidean`:return ur(t,n);case`manhattan`:return fr(t,n);case`chebyshev`:return dr(t,n);default:throw RangeError(`unknown distance metric: ${e}`)}}var mr=.12,hr=null,gr,_r=new p;function vr(){if(gr===void 0&&(gr=typeof matchMedia==`function`?matchMedia(`(prefers-reduced-motion: reduce)`):null,gr)){let e=()=>{_r.dispatch(br())};typeof gr.addEventListener==`function`?gr.addEventListener(`change`,e):typeof gr.addListener==`function`&&gr.addListener(e)}return gr}function yr(){return vr()?.matches??!1}function br(){return hr??yr()}function xr(e){hr=e,_r.dispatch(br())}function Sr(e){return vr(),_r.add(e),()=>_r.remove(e)}function Cr(e,t=`decorative`){return br()?t===`meaningful`?Math.min(e,mr):0:e}var wr=class e{constructor(e,t){this.width=e,this.height=t,this.volume=new Float32Array(e*t)}index(e,t){return e<0||t<0||e>=this.width||t>=this.height?-1:t*this.width+e}volumeAt(e,t){let n=this.index(e,t);return n<0?0:this.volume[n]}total(){let e=0;for(let t=0;t<this.volume.length;t++)e+=this.volume[t];return e}seed(e,t,n){let r=this.index(e,t);r>=0&&(this.volume[r]+=n)}clear(e,t){let n=this.index(e,t);n>=0&&(this.volume[n]=0)}spread(e,t=.25,n=.9){let r=new Float32Array(this.volume.length);for(let n=0;n<this.height;n++)for(let i=0;i<this.width;i++){let a=n*this.width+i,o=this.volume[a];if(o<=0)continue;let s=[];for(let[t,r]of sr){let a=i+t,o=n+r,c=this.index(a,o);c>=0&&e(a,o)&&s.push(c)}if(s.length===0)r[a]+=o;else{let e=o*t/s.length;r[a]+=o-e*s.length;for(let t of s)r[t]+=e}}let i=[];for(let e=0;e<r.length;e++){let t=r[e]*n,a=t<.001?0:t;a===0&&this.volume[e]>0&&i.push({x:e%this.width,y:Math.floor(e/this.width)}),this.volume[e]=a}return i}cellsAbove(e){let t=[];for(let n=0;n<this.height;n++)for(let r=0;r<this.width;r++){let i=this.volume[n*this.width+r];i>=e&&t.push({x:r,y:n,volume:i})}return t}toJSON(){return{width:this.width,height:this.height,volume:[...this.volume]}}static fromJSON(t){let n=new e(t.width,t.height);return n.volume.set(t.volume.slice(0,n.volume.length)),n}},Tr=class{constructor(e=1/60,t=5){if(this.accumulator=0,!(e>0))throw Error(`a fixed step must be positive`);this.step=e,this.maxSubsteps=Math.max(1,Math.floor(t))}advance(e,t){this.accumulator+=Math.max(0,e);let n=0;for(;this.accumulator>=this.step&&n<this.maxSubsteps;)t(this.step),this.accumulator-=this.step,n++;return this.accumulator>=this.step&&(this.accumulator=0),n}get alpha(){return this.accumulator/this.step}reset(){this.accumulator=0}},Er={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>e*(2-e),easeInOutQuad:e=>e<.5?2*e*e:1-(-2*e+2)**2/2,easeInCubic:e=>e*e*e,easeOutCubic:e=>1-(1-e)**3,easeInOutCubic:e=>e<.5?4*e*e*e:1-(-2*e+2)**3/2},Dr=class{constructor(){this.tweens=[]}tween(e,t,n=Er.linear){let{ease:r=Er.linear,intent:i=`decorative`,alternate:a}=typeof n==`function`?{ease:n}:n,o=br()&&a!==void 0,s=o?a:t,c=Cr(e,o?`meaningful`:i);return c>0?new Promise(e=>{this.tweens.push({elapsed:0,duration:c,ease:r,apply:s,resolve:e,finishOnReduced:!o&&i===`decorative`})}):(s(1),Promise.resolve())}update(e){if(this.tweens.length!==0)for(let t of[...this.tweens]){if(t.finishOnReduced&&br()){this.tweens.splice(this.tweens.indexOf(t),1),t.apply(1),t.resolve();continue}t.elapsed+=e;let n=Math.min(1,t.elapsed/t.duration);t.apply(t.ease(n)),n>=1&&(this.tweens.splice(this.tweens.indexOf(t),1),t.resolve())}}get isBusy(){return this.tweens.length>0}clear(){this.tweens=[]}},Or=class{constructor(e={}){this.history=[],this.cursor=-1,this.limit=Math.max(1,e.limit??50)}push(e){this.history.length=this.cursor+1,this.history.push(e),this.history.length>this.limit&&this.history.shift(),this.cursor=this.history.length-1}get canUndo(){return this.cursor>0}get canRedo(){return this.cursor<this.history.length-1}undo(){return this.canUndo?(this.cursor--,this.history[this.cursor]):null}redo(){return this.canRedo?(this.cursor++,this.history[this.cursor]):null}get current(){return this.cursor>=0?this.history[this.cursor]:null}clear(){this.history=[],this.cursor=-1}};function kr(e,t){if(!Number.isFinite(t.maxCost)||t.maxCost<0)return new Map;let n=t.key(e),r=new Map([[n,{cell:e,cost:0}]]),i=[{cell:e,key:n,cost:0}];for(;i.length>0;){let e=jr(i),n=r.get(e.key);if(n&&e.cost===n.cost&&!t.stop?.(e.cell,e.cost))for(let n of t.neighbors(e.cell)){let a=t.cost(e.cell,n);if(!Number.isFinite(a)||a<0)continue;let o=e.cost+a;if(o>t.maxCost||t.canEnter&&!t.canEnter(n,e.cell,o))continue;let s=t.key(n);if(o>=(r.get(s)?.cost??1/0))continue;let c={cell:n,key:s,cost:o};r.set(s,c),Ar(i,c)}}return r}function Ar(e,t){e.push(t);let n=e.length-1;for(;n>0;){let t=Math.floor((n-1)/2);if(e[t].cost<=e[n].cost)break;[e[t],e[n]]=[e[n],e[t]],n=t}}function jr(e){let t=e[0],n=e.pop();if(!t||!n||e.length===0)return t;e[0]=n;let r=0;for(;;){let t=r*2+1,n=t+1,i=r;if(t<e.length&&e[t].cost<e[i].cost&&(i=t),n<e.length&&e[n].cost<e[i].cost&&(i=n),i===r)break;[e[r],e[i]]=[e[i],e[r]],r=i}return t}var Mr=class{constructor(){this.changed=new p,this.tasks=[],this.progress=new Map,this.status_=`idle`,this.current_=null,this.error_=null,this.cancelled=!1}add(e){if(!e.id)throw Error(`load task needs an id`);if(this.tasks.some(t=>t.id===e.id))throw Error(`duplicate load task "${e.id}"`);if(e.weight!==void 0&&!(e.weight>0))throw Error(`load task weight must be positive`);if(this.status_===`loading`)throw Error(`cannot add a task while loading`);return this.tasks.push(e),this.progress.set(e.id,0),this.emit(),this}get snapshot(){let e=this.tasks.reduce((e,t)=>e+(t.weight??1),0),t=this.tasks.reduce((e,t)=>e+(t.weight??1)*(this.progress.get(t.id)??0),0);return{status:this.status_,completed:t,total:e,current:this.current_,error:this.error_}}async start(){if(this.status_===`loading`)throw Error(`load queue is already running`);this.status_=`loading`,this.cancelled=!1,this.error_=null,this.emit();try{for(let e of this.tasks){if(this.cancelled)break;this.current_=e.id,this.emit();let t=this;await e.run({get cancelled(){return t.cancelled},report:t=>this.report(e.id,t)}),this.cancelled||this.report(e.id,1)}this.current_=null,this.status_=this.cancelled?`cancelled`:`ready`,this.emit()}catch(e){throw this.current_=null,this.error_=e,this.status_=`failed`,this.emit(),e}}cancel(){this.status_===`loading`&&(this.cancelled=!0)}retry(){if(this.status_===`loading`)throw Error(`cannot retry while loading`);this.status_=`idle`,this.current_=null,this.error_=null,this.cancelled=!1;for(let e of this.tasks)this.progress.set(e.id,0);this.emit()}report(e,t){if(!Number.isFinite(t))throw Error(`load progress must be finite`);this.progress.set(e,Math.max(0,Math.min(1,t))),this.emit()}emit(){this.changed.dispatch(this.snapshot)}},Nr=class{constructor(){this.entities=new Map,this.ids=new Map,this.sequence=0}add(e,t){let n=this.ids.get(e);if(n!==void 0){if(t!==void 0&&t!==n)throw Error(`entity already has id ${n}`);return n}let r=t;if(r!==void 0){if(r.length===0)throw Error(`entity id must not be empty`);if(this.entities.has(r))throw Error(`entity id already exists: ${r}`)}else do r=`e${this.sequence++}`;while(this.entities.has(r));return this.entities.set(r,e),this.ids.set(e,r),r}get(e){return this.entities.get(e)}idOf(e){return this.ids.get(e)}has(e){return this.entities.has(e)}remove(e){let t=this.entities.get(e);return t!==void 0&&(this.entities.delete(e),this.ids.delete(t),!0)}get size(){return this.entities.size}},Pr=class{constructor(e){this.queue=[],this.busy=!1,this.remaining=0,this.play=e.play}enqueue(e){this.queue.push(...e),this.busy||this.advance()}update(e){this.busy&&(this.remaining-=e,this.remaining<=0&&this.advance())}get isBusy(){return this.busy}clear(){this.queue=[],this.busy=!1,this.remaining=0}advance(){let e=this.queue.shift();if(e===void 0){this.busy=!1,this.remaining=0;return}this.busy=!0;let t=this.play(e)||0;t>0?this.remaining=t:this.advance()}},Fr=2166136261,Ir=16777619;function Lr(e,t=!1){if(e==null)return`null`;switch(typeof e){case`boolean`:return e?`true`:`false`;case`number`:return Number.isFinite(e)?String(e):`null`;case`string`:return JSON.stringify(e);case`bigint`:return JSON.stringify(e.toString());case`function`:case`symbol`:return t?`null`:`undefined`}return Array.isArray(e)?`[${e.map(e=>Lr(e,!0)).join(`,`)}]`:`{${Object.entries(e).filter(([,e])=>e!==void 0&&typeof e!=`function`&&typeof e!=`symbol`).sort(([e],[t])=>e<t?-1:+(e>t)).map(([e,t])=>`${JSON.stringify(e)}:${Lr(t)}`).join(`,`)}}`}function Rr(e){let t=Lr(e),n=Fr;for(let e=0;e<t.length;e++)n^=t.charCodeAt(e),n=Math.imul(n,Ir)>>>0;return n>>>0}var zr=class{constructor(){this.reference=new Map,this.desyncTick=null}observe(e,t){let n=this.reference.get(e);return n===void 0?(this.reference.set(e,t),!0):n===t||(this.desyncTick===null&&(this.desyncTick=e),!1)}get divergent(){return this.desyncTick!==null}get atTick(){return this.desyncTick}reset(){this.reference.clear(),this.desyncTick=null}};function Br(e,t={}){let n=Ur(e);if(n.length===0)return[];let[r,...i]=n,a=t.listDelimiter??`;`,o=t.mapDelimiter??`=`;return i.map((e,n)=>{let i={};return r.forEach((r,s)=>{let c=e[s]??``;c!==``&&(i[r]=Vr(c,t.columns?.[r]??`string`,r,n,a,o))}),i})}function Vr(e,t,n,r,i,a){return Hr(e,t,{column:n,rowIndex:r,listDelimiter:i,mapDelimiter:a,error:()=>t===`number`?`CSV row ${r+1}, column "${n}": "${e}" is not a number`:t===`boolean`?`CSV row ${r+1}, column "${n}": "${e}" is not "true" or "false"`:t===`map`?`CSV row ${r+1}, column "${n}": "${e.split(i).map(e=>e.trim()).find(e=>e&&!e.includes(a))??e}" has no "${a}" to split a key from its value`:`CSV row ${r+1}, column "${n}": "${e}" is invalid`})}function Hr(e,t,n={}){let r=n.column??`value`,i=n.listDelimiter??`;`,a=n.mapDelimiter??`=`,o=e=>{throw Error(n.error?.(e)??e)};switch(t){case`string`:return e;case`number`:{let t=Number(e);return Number.isFinite(t)||o(`${r} must be a number`),t}case`boolean`:{let t=e.toLowerCase();if(t===`true`)return!0;if(t===`false`)return!1;if(n.acceptYesNo&&t===`yes`)return!0;if(n.acceptYesNo&&t===`no`)return!1;o(`${r} must be true, false${n.acceptYesNo?`, yes, or no`:``}`)}case`list`:return e.split(i).map(e=>e.trim()).filter(e=>e.length>0);case`map`:{let t={};for(let n of e.split(i).map(e=>e.trim()).filter(e=>e.length>0)){let e=n.indexOf(a);e===-1&&o(`${r} map entry must contain ${a}`),t[n.slice(0,e).trim()]=n.slice(e+a.length).trim()}return t}}}function Ur(e){let t=[],n=[],r=``,i=!1,a=0;for(;a<e.length;){let o=e[a];if(i){if(o===`"`){if(e[a+1]===`"`){r+=`"`,a+=2;continue}i=!1,a++;continue}r+=o,a++}else o===`"`?(i=!0,a++):o===`,`?(n.push(r),r=``,a++):o===`\r`?a++:o===`
|
|
1
|
+
var mw_games=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=Object.create,n=Object.defineProperty,r=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,a=Object.getPrototypeOf,o=Object.prototype.hasOwnProperty,s=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(e){throw n=[e],e}},c=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t,t.exports),e=null),t.exports),l=(e,t)=>{let r={};for(var i in e)n(r,i,{get:e[i],enumerable:!0});return t||n(r,Symbol.toStringTag,{value:`Module`}),r},u=(e,t,a,s)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var c=i(t),l=0,u=c.length,d;l<u;l++)d=c[l],!o.call(e,d)&&d!==a&&n(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(s=r(t,d))||s.enumerable});return e},d=(e,r,i)=>(i=e==null?{}:t(a(e)),u(r||!e||!e.__esModule||!o.call(e,`default`)?n(i,`default`,{value:e,enumerable:!0}):i,e)),f=`0.44.2`,p=class{constructor(e=!1){this.listeners=[],this.stackMode=e}add(e){this.listeners.includes(e)||(this.stackMode?this.listeners.unshift(e):this.listeners.push(e))}remove(e){let t=this.listeners.indexOf(e);t!==-1&&this.listeners.splice(t,1)}removeAll(){this.listeners.length=0}get size(){return this.listeners.length}dispatch(e){let t=this.listeners.slice();for(let n of t)if(this.listeners.includes(n)&&n(e)===!0)return!0;return!1}},m=class{constructor(){this.onDestroy=new p,this.destroyed=!1}update(e){}resize(e,t){}onSuspend(){}onResume(e){}destroy(){this.destroyed||(this.destroyed=!0,this.onDestroy.dispatch(),this.onDestroy.removeAll(),this.teardown())}teardown(){}get isDestroyed(){return this.destroyed}},h=class{constructor(){this.scenes=[]}get current(){return this.scenes.length===0?null:this.scenes[this.scenes.length-1]}get depth(){return this.scenes.length}replace(e){for(let e of this.scenes)e.destroy();this.scenes=[e],e.create()}push(e){this.current?.onSuspend(),this.scenes.push(e),e.create()}pop(e){if(this.scenes.length<=1)throw Error(`cannot pop the last scene off the stack - switchScene somewhere instead`);this.scenes.pop()?.destroy(),this.current?.onResume(e)}update(e){this.current?.update(e)}resize(e,t){for(let n of this.scenes)n.resize(e,t)}destroy(){for(let e of this.scenes)e.destroy();this.scenes=[]}},g=class{constructor(){this.items=new Map}register(e,t){if(this.items.has(e))throw Error(`"${e}" is already registered`);this.items.set(e,t)}get(e){let t=this.items.get(e);if(t===void 0)throw Error(`no registration named "${e}"`);return t}has(e){return this.items.has(e)}list(){return[...this.items.keys()]}};function _(){let e=1,t=new Map;function n(n){let r=e++;return t.set(r,n),r}return{get size(){return t.size},put:n,get(e){let n=t.get(e);if(n===void 0)throw Error(`unknown handle ${e}`);return n},drop(e){t.delete(e)},clear(){t.clear()},with(e,r){let i=n(e);try{return r(i)}finally{t.delete(i)}}}}var v=class{constructor(){this.order=[],this.registry=new g}add(e,t){this.registry.register(e.name,e),this.order.push(e),e.create?.(t)}has(e){return this.registry.has(e)}get(e){return this.registry.get(e)}update(e,t){for(let n of this.order)n.update?.(e,t)}resize(e,t,n){for(let r of this.order)r.resize?.(e,t,n)}onSuspend(e){for(let t of this.order)t.onSuspend?.(e)}onResume(e,t){for(let n of this.order)n.onResume?.(e,t)}destroy(e){for(let t=this.order.length-1;t>=0;t--)this.order[t].destroy?.(e);this.order=[],this.registry=new g}},y={debug:0,info:1,warn:2,error:3},b=class{constructor(e,t={}){if(!e)throw Error(`a logger needs a category`);this.category=e,this.level=t.level??`debug`,this.sink=t.sink??x}setLevel(e){this.level=e}debug(e,t){this.write(`debug`,e,t)}info(e,t){this.write(`info`,e,t)}warn(e,t){this.write(`warn`,e,t)}error(e,t){this.write(`error`,e,t)}write(e,t,n){y[e]<y[this.level]||this.sink({level:e,category:this.category,message:t,data:n,time:Date.now()})}};function x(e){let t=`[${e.category}] ${e.message}`;e.level===`debug`?console.debug(t,e.data??``):e.level===`info`?console.info(t,e.data??``):e.level===`warn`?console.warn(t,e.data??``):console.error(t,e.data??``)}var S=class{constructor(){this.hooks=[]}on(e,t,n){this.hooks.push({event:e,handler:t,source:n})}off(e){this.hooks=this.hooks.filter(t=>t.handler!==e)}offSource(e){this.hooks=this.hooks.filter(t=>t.source!==e)}emit(e,...t){for(let n of[...this.hooks])n.event===e&&n.handler(...t)}get size(){return this.hooks.length}clear(){this.hooks=[]}},C=l({Generator:()=>j,MersenneTwister:()=>he,RandomStreams:()=>ge,active:()=>ee,chance:()=>A,element:()=>re,float:()=>D,int:()=>O,normalRange:()=>k,pop:()=>T,push:()=>w,range:()=>ne,reset:()=>te,shuffle:()=>oe,weighted:()=>ie,weightedKey:()=>ae,withSeed:()=>E});function ee(){return le()}function w(e){let t=new j(e);return ce.push(t),t}function T(){if(ce.length===1)throw Error(`the base random generator cannot be popped`);ce.pop()}function E(e,t){w(e);try{return t()}finally{T()}}function te(){ce.length=0,ce.push(new j)}function D(e,t,n){let r=n??le();return e===void 0?r.float():t===void 0?r.float()*e:e+r.float()*(t-e)}function O(e,t,n){let r=n??le();return t===void 0?r.int(e):e+r.int(t-e)}function ne(e,t,n){return e+(n??le()).int(t-e+1)}function k(e,t,n){let r=n??le();return e+Math.floor((r.float()+r.float())*(t-e+1)/2)}function A(e,t){return(t??le()).float()<e}function re(e,t){return e.length>0?e[(t??le()).int(e.length)]:null}function ie(e,t){let n=0;for(let t of e)n+=t;if(n<=0)return null;let r=(t??le()).float()*n;for(let t=0;t<e.length;t++)if(r-=e[t],r<0)return t;return e.length-1}function ae(e,t){let n=[...e.keys()],r=ie(n.map(t=>e.get(t)??0),t);return r===null?null:n[r]}function oe(e,t){for(let n=e.length-1;n>0;n--){let r=(t??le()).int(n+1);[e[n],e[r]]=[e[r],e[n]]}return e}function se(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619)>>>0;return t>>>0}var j,ce,le,ue,de,fe,pe,me,he,ge,_e=s((()=>{j=class{constructor(e){this.s0=0,this.s1=0,this.s2=0,this.s3=0,this.seed=e===void 0?Math.random()*4294967296>>>0:e>>>0;let t=this.seed,n=()=>{t=t+2654435769>>>0;let e=t;return e=Math.imul(e^e>>>16,569420461),e=Math.imul(e^e>>>15,1935289751),(e^e>>>15)>>>0};this.s0=n(),this.s1=n(),this.s2=n(),this.s3=n(),(this.s0|this.s1|this.s2|this.s3)===0&&(this.s0=1)}nextUint32(){let e=Math.imul(this.rotl(Math.imul(this.s1,5),7),9)>>>0>>>0,t=this.s1<<9>>>0;return this.s2^=this.s0,this.s3^=this.s1,this.s1^=this.s2,this.s0^=this.s3,this.s2^=t,this.s3=this.rotl(this.s3,11),e}float(){return this.nextUint32()/4294967296}int(e){if(e<=0)return 0;let t=4294967296-4294967296%e,n=this.nextUint32();for(;n>=t;)n=this.nextUint32();return n%e}getState(){return[this.s0,this.s1,this.s2,this.s3]}setState(e){[this.s0,this.s1,this.s2,this.s3]=e}rotl(e,t){return(e<<t|e>>>32-t)>>>0}},ce=[new j],le=()=>ce[ce.length-1],ue=624,de=397,fe=2567483615,pe=2147483648,me=2147483647,he=class{constructor(e=5489){this.state=new Uint32Array(ue),this.index=ue,this.seedValue=5489,this.produced=0,this.seed(e)}seed(e){this.seedValue=e>>>0,this.state[0]=this.seedValue;for(let e=1;e<ue;e++){let t=this.state[e-1]^this.state[e-1]>>>30;this.state[e]=Math.imul(1812433253,t)+e>>>0}this.index=ue,this.produced=0}generate(){for(let e=0;e<ue;e++){let t=this.state[e]&pe|this.state[(e+1)%ue]&me,n=this.state[(e+de)%ue]^t>>>1;t&1&&(n^=fe),this.state[e]=n>>>0}this.index=0}nextUint32(){this.index>=ue&&this.generate();let e=this.state[this.index++];return e^=e>>>11,e^=e<<7&2636928640,e^=e<<15&4022730752,e^=e>>>18,this.produced++,e>>>0}float(){return this.nextUint32()/4294967296}int(e){if(e<=0)return 0;let t=4294967296-4294967296%e,n=this.nextUint32();for(;n>=t;)n=this.nextUint32();return n%e}discard(e){for(let t=0;t<e;t++)this.nextUint32()}get discardCount(){return this.produced}getState(){return{seed:this.seedValue,state:[...this.state],index:this.index,discard:this.produced}}setState(e){this.seedValue=e.seed>>>0;for(let t=0;t<ue;t++)this.state[t]=(e.state[t]??0)>>>0;this.index=e.index,this.produced=e.discard}},ge=class{constructor(e=0){this.streams=new Map,this.baseSeed=e>>>0}stream(e){let t=this.streams.get(e);if(!t){let n=(this.baseSeed^se(e))>>>0;t={seed:n,engine:new he(n)},this.streams.set(e,t)}return t.engine}seedOf(e){return this.streams.get(e)?.seed}reseed(e){this.baseSeed=e>>>0,this.streams.clear()}names(){return[...this.streams.keys()]}getState(){let e={};for(let[t,n]of this.streams)e[t]=n.engine.getState();return e}setState(e){for(let[t,n]of Object.entries(e)){let e=new he(n.seed);e.setState(n),this.streams.set(t,{seed:n.seed,engine:e})}}}})),ve=l({DEFAULT_BINDINGS:()=>je,actionsForKey:()=>Pe,attach:()=>gt,attachPointer:()=>ht,attachSwipe:()=>mt,bind:()=>Me,bindAxis:()=>at,bindButton:()=>it,bindTouch:()=>lt,detach:()=>_t,dispatchAction:()=>Te,dispatchComposition:()=>Ee,dispatchText:()=>we,endFrame:()=>Ke,exportBindings:()=>Le,gamepadAxisCode:()=>rt,gamepadButtonCode:()=>nt,importBindings:()=>Re,isDown:()=>Ue,justPressed:()=>We,justReleased:()=>Ge,keysFor:()=>Ie,onAction:()=>P,onComposition:()=>F,onKey:()=>xe,onText:()=>Se,onWheel:()=>De,pollGamepads:()=>ot,pressTouch:()=>ut,releaseTouch:()=>dt,resetBindings:()=>ze,rumble:()=>st,textFromKey:()=>Ce,touchCode:()=>ct,unbind:()=>Fe,wheelActionFor:()=>Oe}),M=new Map,N=new Set,ye=new Set,be=new Set,P=new p(!0),xe=new p(!0),Se=new p(!0),F=new p(!0);function Ce(e){return e.isComposing||e.ctrlKey||e.metaKey||e.altKey?null:e.key.length===1?e.key:null}function we(e){e.length>0&&Se.dispatch(e)}function Te(e){P.dispatch(e)}function Ee(e){F.dispatch({phase:e.phase,text:e.text})}var De=new p(!0);function Oe(e){return e.ctrlKey||e.metaKey?`zoom`:e.shiftKey?`scrollHorizontal`:`scroll`}function ke(e){let t=Oe(e);t===`zoom`&&e.preventDefault();let n=t===`scrollHorizontal`&&e.deltaX!==0?e.deltaX:e.deltaY;De.dispatch({action:t,delta:n})}var Ae=!1,je={up:[`ArrowUp`,`KeyW`,`Numpad8`],down:[`ArrowDown`,`KeyS`,`Numpad2`],left:[`ArrowLeft`,`KeyA`,`Numpad4`],right:[`ArrowRight`,`KeyD`,`Numpad6`],upLeft:[`Numpad7`],upRight:[`Numpad9`],downLeft:[`Numpad1`],downRight:[`Numpad3`],wait:[`Numpad5`,`Period`],confirm:[`Enter`,`Space`,`NumpadEnter`],cancel:[`Escape`,`Backspace`],menu:[`KeyI`,`Tab`]};function Me(e,t){M.set(e,new Set(t))}function Ne(e,t){let n=M.get(e)??new Set;for(let e of t)n.add(e);M.set(e,n)}function Pe(e){return Be(e)}function Fe(e){M.delete(e)}function Ie(e){return[...M.get(e)??[]]}function Le(){let e={};for(let[t,n]of M)e[t]=[...n];return e}function Re(e){M.clear();for(let[t,n]of Object.entries(e))Me(t,n)}function ze(){Re(je)}ze();function Be(e){let t=[];for(let[n,r]of M)r.has(e)&&t.push(n);return t}function Ve(e){if(!N.has(e)){N.add(e);for(let t of Be(e))ye.add(t),P.dispatch(t)}}function He(e){if(N.has(e)){N.delete(e);for(let t of Be(e))be.add(t)}}function Ue(e){let t=M.get(e);if(!t)return!1;for(let e of t)if(N.has(e))return!0;return!1}function We(e){return ye.has(e)}function Ge(e){return be.has(e)}function Ke(){ye.clear(),be.clear()}function qe(e){let t=Ce(e);t!==null&&we(t)}function Je(e){e.repeat?(xe.dispatch(e),qe(e)):(Ve(e.code),xe.dispatch(e),qe(e))}function Ye(e){He(e.code)}function Xe(e){Ee({phase:`start`,text:e.data??``})}function Ze(e){Ee({phase:`update`,text:e.data??``})}function Qe(e){Ee({phase:`end`,text:e.data??``})}function $e(){N.clear(),ye.clear(),be.clear()}var et=.5,tt=new Set;function nt(e,t){return`Gamepad${e}Button${t}`}function rt(e,t,n){return`Gamepad${e}Axis${t}${n>0?`+`:`-`}`}function it(e,t,n){Ne(e,n.map(e=>nt(t,e)))}function at(e,t,n,r){Ne(e,[rt(t,n,r)])}function ot(e=typeof navigator?.getGamepads==`function`?navigator.getGamepads():[]){tt.clear();for(let t of e)if(t){for(let e=0;e<t.buttons.length;e++)t.buttons[e].pressed&&tt.add(nt(t.index,e));for(let e=0;e<t.axes.length;e++){let n=t.axes[e];n>=et?tt.add(rt(t.index,e,1)):n<=-.5&&tt.add(rt(t.index,e,-1))}}for(let e of tt)Ve(e);for(let e of N)!tt.has(e)&&e.startsWith(`Gamepad`)&&He(e)}function st(e,t,n=typeof navigator?.getGamepads==`function`?navigator.getGamepads():[]){(n[e]?.vibrationActuator)?.playEffect(`dual-rumble`,{duration:t.duration,weakMagnitude:t.weakMagnitude??1,strongMagnitude:t.strongMagnitude??1})}function ct(e){return`Touch:${e}`}function lt(e,t=e){Ne(e,[ct(t)])}function ut(e){Ve(ct(e))}function dt(e){He(ct(e))}var ft={up:`up`,down:`down`,left:`left`,right:`right`,upLeft:`upLeft`,upRight:`upRight`,downLeft:`downLeft`,downRight:`downRight`},pt=[`right`,`downRight`,`down`,`downLeft`,`left`,`upLeft`,`up`,`upRight`];function mt(e,t={}){let n={...ft,...t.actions},r=t.minDistance??24;for(let e of[...pt,`tap`]){let t=n[e];t&<(t,`swipe:${e}`)}let i=!1,a=-1,o=0,s=0;function c(e){ut(`swipe:${e}`),dt(`swipe:${e}`)}function l(e){i=!0,a=e.pointerId,o=e.clientX,s=e.clientY}function u(e){if(!i||e.pointerId!==a)return;i=!1;let t=e.clientX-o,l=e.clientY-s;if(Math.hypot(t,l)<r){n.tap&&c(`tap`);return}let u=pt[(Math.round(Math.atan2(l,t)/(Math.PI/4))%8+8)%8];n[u]&&c(u)}return e.addEventListener(`pointerdown`,l),e.addEventListener(`pointerup`,u),e.addEventListener(`pointercancel`,u),()=>{e.removeEventListener(`pointerdown`,l),e.removeEventListener(`pointerup`,u),e.removeEventListener(`pointercancel`,u)}}function ht(e,t={}){let n=t.dragThreshold??4,r=t.toWorld??((e,t)=>({x:e,y:t})),i=new p,a=new p,o=new p,s=new p,c=-1,l=!1,u=!1,d=0,f=0,m=null;function h(t){let n=e.getBoundingClientRect?.()??{left:0,top:0},i=t.clientX-n.left,a=t.clientY-n.top,o=r(i,a);return{x:i,y:a,worldX:o.x,worldY:o.y,dx:l?i-d:0,dy:l?a-f:0,pointerId:t.pointerId,pressed:l}}function g(t){if(l)return;l=!0,u=!1,c=t.pointerId;let n=e.getBoundingClientRect?.()??{left:0,top:0};d=t.clientX-n.left,f=t.clientY-n.top,m=h(t),i.dispatch(m)}function _(e){l&&e.pointerId!==c||(m=h(e),a.dispatch(m),l&&(!u&&Math.hypot(m.dx,m.dy)>=n&&(u=!0),u&&o.dispatch(m)))}function v(e){if(!l||e.pointerId!==c)return;let t=u,n=h(e);l=!1,u=!1,m={...n,pressed:!1,dx:0,dy:0},s.dispatch({...n,pressed:!1,dragged:t})}return e.addEventListener(`pointerdown`,g),e.addEventListener(`pointermove`,_),e.addEventListener(`pointerup`,v),e.addEventListener(`pointercancel`,v),{down:i,move:a,drag:o,up:s,get current(){return m},detach(){e.removeEventListener(`pointerdown`,g),e.removeEventListener(`pointermove`,_),e.removeEventListener(`pointerup`,v),e.removeEventListener(`pointercancel`,v)}}}function gt(e=window){Ae||(Ae=!0,e.addEventListener(`keydown`,Je),e.addEventListener(`keyup`,Ye),e.addEventListener(`compositionstart`,Xe),e.addEventListener(`compositionupdate`,Ze),e.addEventListener(`compositionend`,Qe),window.addEventListener(`blur`,$e),e.addEventListener(`wheel`,ke,{passive:!1}))}function _t(e=window){Ae&&(Ae=!1,e.removeEventListener(`keydown`,Je),e.removeEventListener(`keyup`,Ye),e.removeEventListener(`compositionstart`,Xe),e.removeEventListener(`compositionupdate`,Ze),e.removeEventListener(`compositionend`,Qe),e.removeEventListener(`wheel`,ke),window.removeEventListener(`blur`,$e),$e())}var vt=class{constructor(e,t={}){if(!e)throw Error(`a player needs a non-empty id`);this.id=e,this.padIndex=t.padIndex}scoped(e){return`${this.id}:${e}`}bind(e,t){Me(this.scoped(e),t)}bindButton(e,t){if(this.padIndex===void 0)throw Error(`player "${this.id}" has no padIndex to bind a gamepad button to`);it(this.scoped(e),this.padIndex,t)}bindAxis(e,t,n){if(this.padIndex===void 0)throw Error(`player "${this.id}" has no padIndex to bind a gamepad axis to`);at(this.scoped(e),this.padIndex,t,n)}bindTouch(e,t=e){lt(this.scoped(e),`${this.id}:${t}`)}pressTouch(e){ut(`${this.id}:${e}`)}releaseTouch(e){dt(`${this.id}:${e}`)}isDown(e){return Ue(this.scoped(e))}justPressed(e){return We(this.scoped(e))}justReleased(e){return Ge(this.scoped(e))}keysFor(e){return Ie(this.scoped(e))}},yt=25214903917n,bt=11n,xt=(1n<<48n)-1n,St=class{constructor(e=0,t={}){this.state=0n,this.onDraw=t.onDraw,this.setSeed(e)}setSeed(e){this.state=(BigInt.asIntN(64,BigInt(e))^yt)&xt}next(e){if(!Number.isInteger(e)||e<1||e>32)throw Error(`next needs 1 to 32 bits, got ${e}`);this.state=this.state*yt+bt&xt;let t=Number(this.state>>BigInt(48-e)),n=e===32?t|0:t;return this.onDraw?.({bits:e,value:n}),n}nextInt(e){if(e===void 0)return this.next(32);if(!Number.isInteger(e)||e<=0||e>2147483647)throw Error(`nextInt needs a bound from 1 to 2147483647, got ${e}`);if((e&-e)===e)return Math.floor(e*this.next(31)/2147483648);let t,n;do t=this.next(31),n=t%e;while(t-n+(e-1)>2147483647);return n}nextLong(){let e=BigInt(this.next(32)),t=BigInt(this.next(32));return BigInt.asIntN(64,(e<<32n)+t)}nextDouble(){return(this.next(26)*134217728+this.next(27))/2**53}nextFloat(){return this.next(24)/16777216}nextBoolean(){return this.next(1)!==0}};_e();function Ct(e,t){if(!t)throw Error(`scramble needs a non-empty key`);let n=new TextEncoder().encode(e),r=new TextEncoder().encode(t),i=new Uint8Array(n.length);for(let e=0;e<n.length;e++)i[e]=n[e]^r[e%r.length];return Tt(i)}function wt(e,t){if(!t)throw Error(`scramble needs a non-empty key`);let n=Et(e),r=new TextEncoder().encode(t),i=new Uint8Array(n.length);for(let e=0;e<n.length;e++)i[e]=n[e]^r[e%r.length];return new TextDecoder(`utf-8`,{fatal:!0}).decode(i)}function Tt(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t)}function Et(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}var Dt=10485760;function Ot(e,t={}){let n=t.maxBytes??Dt,r=typeof e==`string`?new TextEncoder().encode(e).length:e.length;if(r>n)throw Error(`inbound data exceeds the ${n}-byte limit (${r} bytes)`)}function kt(e){for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n!==9&&n!==10&&n!==13&&(n<=31||n===127))throw Error(`inbound data contains a control character (0x${n.toString(16).padStart(2,`0`)}) at index ${t}`)}}function At(e,t={}){return Ot(e,t),kt(e),e}var jt=new Set([`__proto__`,`constructor`,`prototype`]);function Mt(e,t=`$`){if(Array.isArray(e))e.forEach((e,n)=>Mt(e,`${t}[${n}]`));else if(typeof e==`object`&&e)for(let n of Object.keys(e)){if(jt.has(n))throw Error(`${t} contains a forbidden key "${n}"`);Mt(e[n],`${t}.${n}`)}}function Nt(e,t,n=`$`){if(e===void 0){if(t.optional)return;throw Error(`${n} is required`)}switch(t.type){case`string`:if(typeof e!=`string`)throw Error(`${n} must be a string`);return;case`number`:if(typeof e!=`number`||!Number.isFinite(e))throw Error(`${n} must be a finite number`);if(t.min!==void 0&&e<t.min)throw Error(`${n} must be >= ${t.min}`);if(t.max!==void 0&&e>t.max)throw Error(`${n} must be <= ${t.max}`);return;case`boolean`:if(typeof e!=`boolean`)throw Error(`${n} must be a boolean`);return;case`array`:if(!Array.isArray(e))throw Error(`${n} must be an array`);if(t.maxLength!==void 0&&e.length>t.maxLength)throw Error(`${n} exceeds its maximum length of ${t.maxLength}`);e.forEach((e,r)=>Nt(e,t.items,`${n}[${r}]`));return;case`object`:if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`${n} must be an object`);for(let t of Object.keys(e))if(jt.has(t))throw Error(`${n} contains a forbidden key "${t}"`);for(let[r,i]of Object.entries(t.fields))Nt(e[r],i,`${n}.${r}`);return}}function Pt(e,t={}){let n=t.label??`inbound data`;At(e,t);try{return JSON.parse(e,(e,t)=>{if(jt.has(e))throw new Ft(e);return t})}catch(e){throw e instanceof Ft?Error(`${n} contains a forbidden key "${e.key}"`):Error(`${n} is not valid JSON (${e instanceof Error?e.message:String(e)})`)}}var Ft=class{constructor(e){this.key=e}};function It(e,t){let n=Pt(e,{label:t}),r=n?.meta;if(typeof n!=`object`||!n||Array.isArray(n)||!(`state`in n))throw Error(`${t} is not save data (expected { meta, state })`);if(typeof r!=`object`||!r||!Number.isSafeInteger(r.version)||r.version<0)throw Error(`${t} has no valid meta.version`);if(typeof r.savedAt!=`number`||!Number.isFinite(r.savedAt))throw Error(`${t} has no valid meta.savedAt`);return n}var Lt=class{constructor(){this.data=new Map}read(e){return this.data.get(e)??null}write(e,t){this.data.set(e,t)}remove(e){this.data.delete(e)}keys(){return[...this.data.keys()]}};function Rt(){return typeof localStorage>`u`?new Lt:{read:e=>localStorage.getItem(e),write:(e,t)=>localStorage.setItem(e,t),remove:e=>localStorage.removeItem(e),keys:()=>Object.keys(localStorage)}}var zt=class{constructor(e){this.namespace=e.namespace,this.version=e.version,this.migrations=e.migrations??{},this.storage=e.storage??Rt()}key(e){return`mwg-save:${this.namespace}:${e}`}save(e,t,n){let r={meta:{version:this.version,savedAt:Date.now(),preview:n},state:t};this.storage.write(this.key(e),JSON.stringify(r))}load(e){let t=this.storage.read(this.key(e));if(!t)return null;try{let n=It(t,`save slot "${e}"`),r=n.state;for(let e=n.meta.version;e<this.version;e++)r=(this.migrations[e]??(e=>e))(r);return{meta:{...n.meta,version:this.version},state:r}}catch{return null}}importExternal(e,t,n,r){Ot(t);let i=n(t);for(let e=0;e<this.version;e++)i=(this.migrations[e]??(e=>e))(i);let a={meta:{version:this.version,savedAt:Date.now(),preview:r},state:i};this.storage.write(this.key(e),JSON.stringify(a))}delete(e){this.storage.remove(this.key(e))}exportSlot(e,t){let n=this.storage.read(this.key(e));return n===null?null:t?Ct(n,t):n}importSlot(e,t,n){Ot(t);let r=It(n?wt(t,n):t,`SaveSystem.importSlot: payload`),i=r.state;for(let e=r.meta.version;e<this.version;e++)i=(this.migrations[e]??(e=>e))(i);let a={meta:{...r.meta,version:this.version},state:i};this.storage.write(this.key(e),JSON.stringify(a))}list(){let e=`mwg-save:${this.namespace}:`,t=[];for(let n of this.storage.keys()){if(!n.startsWith(e))continue;let r=this.storage.read(n);if(r)try{t.push({slot:n.slice(e.length),meta:It(r,n).meta})}catch{}}return t}},Bt=class{constructor(e,t){this.storage=e,this.key=t}read(e){let t=this.storage.read(this.key);return t?Pt(t,{label:`stored value "${this.key}"`}):e}write(e){this.storage.write(this.key,JSON.stringify(e))}remove(){this.storage.remove(this.key)}};function Vt(e,t=`value`){return Ht(e,t,new Set)}function Ht(e,t,n){if(typeof e==`function`||typeof e==`symbol`)return t;if(typeof e!=`object`||!e||n.has(e)||(n.add(e),Ut(e)))return null;let r=[];if(e instanceof Map)for(let[n,i]of e)r.push([`${t}.get(${JSON.stringify(n)??String(n)})`,i]);else if(e instanceof Set)for(let n of e)r.push([`${t}.item`,n]);else if(Array.isArray(e))e.forEach((e,n)=>r.push([`${t}[${n}]`,e]));else for(let[n,i]of Object.entries(e))r.push([`${t}.${n}`,i]);for(let[e,t]of r){let r=Ht(t,e,n);if(r)return r}return t}function Ut(e){try{return structuredClone(e),!0}catch{return!1}}function Wt(e,t){try{return structuredClone(e)}catch(n){let r=Vt(e,t)??t;throw TypeError(`${r} cannot be structured-cloned (${n instanceof Error?n.message:String(n)}). Journals, snapshots and undo checkpoints copy their contents with structuredClone, so they must hold plain data: refer to a live object (an actor, anything carrying callbacks such as a ReactionTable) by its id and resolve it inside the rule.`,{cause:n})}}var Gt=class{constructor(e,t={}){this._state=Wt(e,`initial state`),this.version=t.version??1,this.migrations=t.migrations??{},this.extensions=t.extensions??new Kt}get state(){return structuredClone(this._state)}set(e){this._state=Wt(e,`state`)}update(e){let t=e(this.state);return this.set(t),this.state}snapshot(){let e=this.extensions.snapshot();return{version:this.version,state:this.state,extensions:e.extensions,extensionVersions:e.versions}}restore(e,t={}){if(!Number.isSafeInteger(e.version)||e.version<1)throw Error(`canonical state snapshot version must be a positive integer`);if(e.version>this.version)throw Error(`canonical state snapshot version ${e.version} is newer than ${this.version}`);let n=this.snapshot();try{let n=Wt(e.state,`snapshot.state`);for(let t=e.version;t<this.version;t++){let e=this.migrations[t+1];if(!e)throw Error(`missing canonical state migration to version ${t+1}`);n=e(n)}return this._state=Wt(n,`migrated state`),this.extensions.restore({extensions:e.extensions,versions:e.extensionVersions},t)}catch(e){throw this._state=structuredClone(n.state),this.extensions.restore({extensions:n.extensions,versions:n.extensionVersions},{missing:`keep`}),e}}transaction(e){let t=this.snapshot();try{return e(this)}catch(e){throw this.restore(t),e}}},Kt=class{constructor(){this.extensions=new Map}register(e){if(!/^[A-Za-z_][A-Za-z0-9_.-]*$/.test(e.id))throw Error(`invalid state extension id: ${e.id}`);if(this.extensions.has(e.id))throw Error(`state extension already registered: ${e.id}`);return this.extensions.set(e.id,{id:e.id,capture:()=>e.capture(),restore:t=>e.restore(t),version:e.version??1,migrations:e.migrations,reset:e.reset,remove:e.remove}),()=>this.extensions.delete(e.id)}snapshot(){let e={};for(let[t,n]of this.extensions)e[t]=Wt(n.capture(),`extension ${t}`);let t={};for(let[e,n]of this.extensions)t[e]=n.version??1;return{extensions:e,versions:t}}restore(e,t={}){let n=this.snapshot(),r=[];try{for(let[n,i]of this.extensions){if(!(n in e.extensions)){t.missing===`reset`?(i.reset&&i.reset(),r.push({extension:n,from:0,to:i.version??1,status:`reset`})):t.missing===`remove`&&(i.remove&&i.remove(),r.push({extension:n,from:0,to:i.version??1,status:`removed`}));continue}let a=e.versions?.[n]??1,o=i.version??1,s=Wt(e.extensions[n],`snapshot.extensions.${n}`);for(let e=a;e<o;e++){let t=i.migrations?.[e+1];if(!t)throw Error(`missing state migration for ${n} to version ${e+1}`);s=t(s)}i.restore(Wt(s,`migrated extension ${n}`)),r.push({extension:n,from:a,to:o,status:a===o?`unchanged`:`migrated`})}}catch(e){for(let[e,t]of this.extensions)e in n.extensions&&t.restore(structuredClone(n.extensions[e]));throw e}for(let e of r)t.onDiagnostic?.(e);return r}transaction(e){let t=this.snapshot();try{return e()}catch(e){throw this.restore(t),e}}},qt=new Set([`localhost`,`127.0.0.1`,`[::1]`]);function Jt(e,t,n=!1){if(n||!/^[a-z][a-z0-9+.-]*:/i.test(e))return;let r=new URL(e);if(r.protocol!==`https:`&&r.protocol!==`wss:`&&(r.protocol!==`http:`&&r.protocol!==`ws:`||!qt.has(r.hostname)))throw Error(`${t} url must use https: or wss: (got ${r.protocol}//${r.host}); pass allowInsecure: true to accept it`)}var Yt=class{constructor(e,t){if(!e.endpoint)throw Error(`${t} endpoint is required`);if(Jt(e.endpoint,`${t} endpoint`,e.allowInsecure),this.endpoint=e.endpoint,this.label=t,this.maxResponseBytes=e.maxResponseBytes??10485760,this.timeoutMs=e.timeoutMs??1e4,!(this.timeoutMs>0))throw Error(`${t} timeout must be positive`);if(this.fetchFn=e.fetch??globalThis.fetch,!this.fetchFn)throw Error(`fetch is unavailable; provide ${t}Options.fetch`)}async withTimeout(e){let t=new AbortController,n=setTimeout(()=>t.abort(),this.timeoutMs);try{return await e(t.signal)}finally{clearTimeout(n)}}async readText(e){let t=this.maxResponseBytes,n=Number(e.headers?.get?.(`content-length`));if(n>t)throw Error(`${this.label} response exceeds the ${t}-byte limit (${n} bytes)`);if(!e.body){let n=await e.text();return Ot(n,{maxBytes:t}),n}let r=e.body.getReader(),i=[],a=0;for(;;){let{done:e,value:n}=await r.read();if(e)break;if(a+=n.byteLength,a>t)throw await r.cancel(),Error(`${this.label} response exceeds the ${t}-byte limit`);i.push(n)}let o=new Uint8Array(a),s=0;for(let e of i)o.set(e,s),s+=e.byteLength;return new TextDecoder().decode(o)}async readJson(e,t){return Pt(await this.readText(e),{maxBytes:this.maxResponseBytes,label:`${this.label} ${t}`})}},Xt=class extends Yt{constructor(e){super(e,`save sync`)}async upload(e,t){if(!e)throw Error(`save sync slot name is required`);if(!t)throw Error(`save sync payload cannot be empty`);return this.withTimeout(async n=>{let r=await this.fetchFn(this.slotUrl(e),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({payload:t}),signal:n});if(!r.ok)throw Error(`save upload failed with HTTP ${r.status}`);return{ok:!0,status:r.status}})}async download(e){if(!e)throw Error(`save sync slot name is required`);return this.withTimeout(async t=>{let n=await this.fetchFn(this.slotUrl(e),{signal:t});if(!n.ok)throw Error(`save download failed with HTTP ${n.status}`);let r=await this.readJson(n,`download`);if(typeof r?.payload!=`string`)throw Error(`save download response missing a string payload`);return r.payload})}async list(){return this.withTimeout(async e=>{let t=await this.fetchFn(this.endpoint,{signal:e});if(!t.ok)throw Error(`save slot list failed with HTTP ${t.status}`);let n=await this.readJson(t,`slot list`);if(!Array.isArray(n?.slots)||!n.slots.every(e=>typeof e==`string`))throw Error(`save slot list response missing a string array of slots`);return n.slots})}slotUrl(e){let t=this.endpoint.includes(`?`)?`&`:`?`;return`${this.endpoint}${t}slot=${encodeURIComponent(e)}`}},Zt=1,Qt=class{constructor(e){if(this.onWelcome=new p,this.onTick=new p,this.onReject=new p,this.onDesync=new p,this.onClose=new p,this.onProtocolError=new p,this.socket=null,this._id=null,!e.url)throw Error(`lockstep client url is required`);Jt(e.url,`lockstep client`,e.allowInsecure),this.url=e.url,this.createSocket=e.create??(e=>new WebSocket(e)),this.validateInput=e.validateInput,this.maxMessageBytes=e.maxMessageBytes??1048576}get id(){return this._id}get connected(){return this.socket!==null&&this.socket.readyState===Zt}connect(){if(this.socket)throw Error(`lockstep client is already connected`);let e=this.createSocket(this.url);e.onmessage=e=>this.handleMessage(e.data),e.onclose=()=>{this.socket=null,this._id=null,this.onClose.dispatch()},this.socket=e}submitInput(e,t){if(!this.connected)return;let n=this.validateInput?.(e);n===!1||typeof n==`string`?this.onReject.dispatch({reason:n===!1?`input rejected by client validation`:n}):this.socket?.send(JSON.stringify({type:`input`,payload:e,...t===void 0?{}:{checksum:t}}))}close(){this.socket?.close()}handleMessage(e){let t;try{if(typeof e!=`string`)throw Error(`lockstep message is not text`);t=en(Pt(e,{maxBytes:this.maxMessageBytes,label:`lockstep message`}))}catch(e){this.onProtocolError.dispatch({reason:e instanceof Error?e.message:String(e)});return}if(t.type===`welcome`)this._id=t.id,this.onWelcome.dispatch({id:t.id,...t.seed===void 0?{}:{seed:t.seed},...t.initialState===void 0?{}:{initialState:t.initialState}});else if(t.type===`tick`){let e={tick:t.tick,inputs:t.inputs,...t.checksums===void 0?{}:{checksums:t.checksums}};if(this.onTick.dispatch(e),t.checksums){let e=Object.values(t.checksums);e.some(t=>t!==e[0])&&this.onDesync.dispatch({tick:t.tick,checksums:t.checksums})}}else this.onReject.dispatch({reason:t.reason??`input rejected by server`})}},$t=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function en(e){if(!$t(e)||typeof e.type!=`string`)throw Error(`lockstep message has no type`);switch(e.type){case`welcome`:if(typeof e.id!=`string`||e.id===``)throw Error(`welcome needs a string id`);if(e.seed!==void 0&&!Number.isSafeInteger(e.seed))throw Error(`welcome seed must be an integer`);return e;case`tick`:if(!Number.isSafeInteger(e.tick)||e.tick<0)throw Error(`tick needs a non-negative integer tick`);if(!$t(e.inputs))throw Error(`tick needs an inputs object`);if(e.checksums!==void 0&&(!$t(e.checksums)||Object.values(e.checksums).some(e=>typeof e!=`number`)))throw Error(`tick checksums must map ids to numbers`);return e;case`rejected`:if(e.reason!==void 0&&typeof e.reason!=`string`)throw Error(`rejected reason must be a string`);return e;default:throw Error(`unknown lockstep message type "${e.type}"`)}}var tn=class{constructor(e){this.store=new Bt(e.storage??Rt(),`mwg-runs:${e.namespace}`),this.limit=e.limit}readAll(){return this.store.read([])}record(e){let t=this.readAll(),n={id:`${Date.now()}-${t.length}`,endedAt:Date.now(),summary:e};return t.push(n),this.limit!==void 0&&t.length>this.limit&&t.splice(0,t.length-this.limit),this.store.write(t),n}all(){return this.readAll()}ranked(e,t=`desc`){let n=this.readAll(),r=t===`desc`?-1:1;return n.sort((t,n)=>r*(e(t.summary)-e(n.summary)))}clear(){this.store.remove()}},nn=class{constructor(e){this.store=new Bt(e.storage??Rt(),`mwg-stats:${e.namespace}`),this.initial=e.initial,this.combine=e.combine}get(){return this.store.read(this.initial)}record(e){let t=this.combine(this.get(),e);return this.store.write(t),t}reset(){this.store.remove()}},rn=class extends Yt{constructor(e){super(e,`telemetry`),this.consented=!1,this.maxStringLength=e.maxStringLength??256,this.maxProperties=e.maxProperties??32,this.allowed=e.allowedProperties?new Set(e.allowedProperties):null}get hasConsent(){return this.consented}setConsent(e){this.consented=e}async send(e){if(!e.name)throw Error(`telemetry event needs a name`);return this.consented?this.withTimeout(async t=>{let n=await this.fetchFn(this.endpoint,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(this.bounded(e)),signal:t});if(!n.ok)throw Error(`telemetry request failed with HTTP ${n.status}`);return{ok:!0,status:n.status}}):null}bounded(e){let t=e=>e.length>this.maxStringLength?e.slice(0,this.maxStringLength):e;if(!e.properties)return{name:t(e.name)};let n={},r=0;for(let[i,a]of Object.entries(e.properties))if(!this.allowed||this.allowed.has(i)){if(r++>=this.maxProperties)break;n[t(i)]=typeof a==`string`?t(a):a}return{name:t(e.name),properties:n}}},an=class extends Yt{constructor(e){super(e,`news`)}async fetchItems(){return this.withTimeout(async e=>{let t=await this.fetchFn(this.endpoint,{signal:e});if(!t.ok)throw Error(`news request failed with HTTP ${t.status}`);let n=await this.readJson(t,`response`);if(!Array.isArray(n))throw Error(`news response was not an array`);return n.map((e,t)=>on(e,t))})}};function on(e,t){if(typeof e!=`object`||!e)throw Error(`news item ${t} was not an object`);let n=e;if(typeof n.id!=`string`||!n.id)throw Error(`news item ${t} is missing a string id`);if(typeof n.title!=`string`)throw Error(`news item ${t} is missing a string title`);if(typeof n.body!=`string`)throw Error(`news item ${t} is missing a string body`);return{id:n.id,title:n.title,body:n.body,publishedAt:typeof n.publishedAt==`number`?n.publishedAt:void 0}}var sn=class{constructor(e){this.store=new Bt(e.storage??Rt(),`mwg-news-seen:${e.namespace}`)}readSeen(){return new Set(this.store.read([]))}isSeen(e){return this.readSeen().has(e)}markSeen(e){let t=this.readSeen();t.add(e),this.store.write([...t])}unseen(e){let t=this.readSeen();return e.filter(e=>!t.has(e.id))}},cn=class{constructor(e,t={}){if(!e)throw Error(`a collection needs a name`);this.prefix=`mwg-db:${t.namespace??`default`}:${e}:`,this.storage=t.storage??Rt()}get size(){return this.keys().length}all(){return this.keys().map(e=>this.read(e))}get(e){let t=this.storage.read(this.prefix+e);return t===null?void 0:this.parse(t,this.prefix+e)}put(e){if(typeof e!=`object`||!e||Array.isArray(e)||typeof e.id!=`string`||e.id===``)throw Error(`a record must be an object with a string id`);this.storage.write(this.prefix+e.id,JSON.stringify(e))}remove(e){this.storage.remove(this.prefix+e)}where(e){return this.all().filter(e)}clear(){for(let e of this.keys())this.storage.remove(e)}keys(){return this.storage.keys().filter(e=>e.startsWith(this.prefix))}read(e){return this.parse(this.storage.read(e),e)}parse(e,t){return Pt(e,{label:`record "${t}"`})}},ln=class{constructor(e,t,n){if(this.recorded=[],this.fromFrame=n?.fromFrame??0,!Number.isInteger(this.fromFrame)||this.fromFrame<0)throw RangeError(`a resumed recorder needs a non-negative fromFrame`);this.frameStamp=this.fromFrame,this.actions=e,this.frames=t,this.onAction=e=>{this.recorded.push({frame:this.frameStamp,action:e})},this.onFrame=()=>{this.frameStamp++},e.add(this.onAction),t.add(this.onFrame)}get events(){return this.recorded}get frame(){return this.frameStamp}toJSON(){return this.recorded.map(e=>({frame:e.frame,action:e.action}))}stop(){this.actions.remove(this.onAction),this.frames.remove(this.onFrame)}},un=class{constructor(e,t,n,r){if(this.events=e,this.dispatch=t,this.frames=n,this.fromFrame=r?.fromFrame??0,!Number.isInteger(this.fromFrame)||this.fromFrame<0)throw RangeError(`a resumed player needs a non-negative fromFrame`);this.index=this.events.findIndex(e=>e.frame>=this.fromFrame),this.index<0&&(this.index=this.events.length),this.frame=this.fromFrame,this.onFrame=()=>this.pump(),n.add(this.onFrame)}get done(){return this.index>=this.events.length}stop(){this.frames.remove(this.onFrame)}pump(){for(;this.index<this.events.length&&this.events[this.index].frame<=this.frame;)this.dispatch(this.events[this.index].action),this.index++;this.frame++}};function dn(e){return JSON.stringify(e)}function fn(e){return pn(JSON.parse(e))}function pn(e){if(!Array.isArray(e))throw Error(`a replay must be an array of {frame, action}`);return e.map(e=>{if(typeof e!=`object`||!e||!Number.isInteger(e.frame)||e.frame<0||typeof e.action!=`string`)throw Error(`a replay entry must be {frame: a non-negative integer, action: a string}`);return{frame:e.frame,action:e.action}})}function mn(e,t){if(typeof t!=`string`||!t.length)throw TypeError(`a replay file needs a non-empty ${e}`);return t}function hn(e){let t=e;if(!Number.isInteger(t)||t<0||t>4294967295)throw RangeError(`a replay seed must be uint32`);return t}function gn(e,t){let n={format:`mwg-replay`,version:1,framework:mn(`framework`,t.framework),game:mn(`game`,t.game),events:pn(e)};if(t.seed!==void 0&&(n.seed=hn(t.seed)),t.recordedAt!==void 0){if(typeof t.recordedAt!=`number`||!Number.isFinite(t.recordedAt))throw TypeError(`recordedAt must be a finite number`);n.recordedAt=t.recordedAt}return JSON.stringify(n)}function _n(e,t){let n=Pt(e,{label:`replay file`});if(typeof n!=`object`||!n||Array.isArray(n))throw Error(`a replay file must be a JSON object`);if(n.format!==`mwg-replay`)throw Error(`not a replay file: expected format "mwg-replay", found ${JSON.stringify(n.format)}`);if(n.version!==1)throw Error(`replay file version ${JSON.stringify(n.version)} is not supported (this build reads 1)`);if(n.game!==t.game)throw Error(`a replay of ${JSON.stringify(n.game)} cannot be imported into ${JSON.stringify(t.game)}`);if(n.framework!==t.framework)throw Error(`a replay recorded against mwg ${JSON.stringify(n.framework)} cannot be imported into ${JSON.stringify(t.framework)}`);let r=pn(n.events);return{format:`mwg-replay`,version:1,framework:n.framework,game:n.game,...n.seed===void 0?{}:{seed:hn(n.seed)},...n.recordedAt===void 0?{}:{recordedAt:n.recordedAt},events:r}}var vn=class{constructor(e){if(typeof e.namespace!=`string`||!e.namespace.length)throw TypeError(`a last-run store needs a non-empty namespace`);let t=e.maxEvents??1e4;if(!Number.isInteger(t)||t<1||t>1e6)throw RangeError(`last-run maxEvents must be in 1..1000000`);this.maxEvents=t,this.store=new Bt(e.storage??Rt(),`mwg-last-run:${e.namespace}`)}keep(e,t){let n=pn(e);n.length>this.maxEvents&&(n=n.slice(n.length-this.maxEvents));let r=t===void 0?{version:1,events:n}:{version:1,seed:hn(t),events:n};Ot(JSON.stringify(r)),this.store.write(r)}load(){let e=this.store.read(null);if(e===null)return null;if(e?.version!==1)throw Error(`the kept last-run recording is not version 1; clear() it and record again`);return{version:1,...e.seed===void 0?{}:{seed:hn(e.seed)},events:pn(e.events)}}clear(){this.store.remove()}};function yn(e,t){return{version:1,frame:e.frame,events:e.toJSON(),state:t}}function bn(e,t,n){if(typeof e!=`object`||!e||e.version!==1)throw Error(`a run checkpoint must be { version: 1, frame, events, state }`);return new un(pn(e.events),t,n,{fromFrame:e.frame})}function xn(e,t){if(typeof document>`u`)throw Error(`downloadReplayFile needs a browser document`);let n=document.createElement(`a`);n.href=URL.createObjectURL(new Blob([e],{type:`application/json`})),n.download=t,document.body.appendChild(n),n.click(),n.remove(),setTimeout(()=>URL.revokeObjectURL(n.href),0)}async function Sn(e){return await e.text()}async function Cn(e=`.json`){if(typeof document>`u`)throw Error(`pickReplayFile needs a browser document`);return await new Promise(t=>{let n=document.createElement(`input`);n.type=`file`,n.accept=e,n.style.display=`none`;let r=!1,i=e=>{r||(r=!0,n.remove(),t(e))};n.addEventListener(`change`,()=>i(n.files?.[0]??null)),n.addEventListener(`cancel`,()=>i(null)),document.body.appendChild(n),n.click()})}var wn=class e{constructor(){this.entries=[],this.nextSequence=0}append(e,t=[]){let n={sequence:this.nextSequence,action:Wt(e,`action`),events:Wt([...t],`events`)};return this.nextSequence++,this.entries.push(n),structuredClone(n)}get size(){return this.entries.length}get all(){return structuredClone(this.entries)}mark(){return this.nextSequence}since(e){return structuredClone(this.entries.filter(t=>t.sequence>=e))}truncate(e){this.entries=this.entries.filter(t=>t.sequence<e),this.nextSequence=e}toJSON(){return this.all}replace(t){let n=e.fromJSON(t);this.entries=n.entries,this.nextSequence=n.nextSequence}static fromJSON(t){let n=new e,r=0;for(let e of t){if(!Number.isSafeInteger(e.sequence)||e.sequence!==r)throw Error(`action journal sequences must be contiguous from zero`);n.entries.push(structuredClone({sequence:e.sequence,action:e.action,events:[...e.events]})),r++}return n.nextSequence=r,n}};function Tn(e){if(e.criteria)return e.criteria;if(e.counter===void 0||e.target===void 0)throw Error(`achievement "${e.id}" needs either counter/target or criteria`);return[{counter:e.counter,target:e.target}]}var En=class e{constructor(){this.definitions=new Map,this.counts=new Map,this.fresh=[]}define(e){this.definitions.set(e.id,e)}count(e){return this.counts.get(e)??0}increment(e,t=1){let n=this.count(e);this.counts.set(e,n+t);let r=[];for(let t of this.definitions.values()){let i=Tn(t);i.some(t=>t.counter===e)&&(i.every(t=>t.counter===e?n>=t.target:this.count(t.counter)>=t.target)||i.every(e=>this.count(e.counter)>=e.target)&&(r.push(t.id),this.fresh.push(t.id)))}return r}unlocked(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);return Tn(t).every(e=>this.count(e.counter)>=e.target)}progress(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);let n=Tn(t);if(n.length!==1)throw Error(`achievement "${e}" has several criteria - use subProgress`);return{count:this.count(n[0].counter),target:n[0].target}}subProgress(e){let t=this.definitions.get(e);if(!t)throw Error(`no such achievement: "${e}"`);return Tn(t).map(e=>{let t=this.count(e.counter);return{counter:e.counter,count:t,target:e.target,met:t>=e.target}})}drainNew(){let e=this.fresh;return this.fresh=[],e}toJSON(){return{counts:[...this.counts]}}static fromJSON(t,n){let r=new e;for(let e of t)r.define(e);for(let[e,t]of n.counts)r.counts.set(e,t);return r}},Dn=class e{constructor(e=[]){this.active=new Set,this.spent=new Set,this.rules=[...e]}add(e){this.rules.push(e)}remove(e){this.rules=this.rules.filter(t=>t.id!==e),this.active.delete(e)}check(e){let t=[];for(let n of this.rules){if(n.once&&this.spent.has(n.id))continue;let r=n.when(e);r&&!this.active.has(n.id)&&(n.action(e),t.push(n.id),n.once&&this.spent.add(n.id)),r?this.active.add(n.id):this.active.delete(n.id)}return t}isActive(e){return this.active.has(e)}reset(){this.active.clear(),this.spent.clear()}toJSON(){return{active:[...this.active],spent:[...this.spent]}}static fromJSON(t,n){let r=new e(t);for(let e of n.active)r.active.add(e);for(let e of n.spent)r.spent.add(e);return r}},On=class{constructor(e={}){let t=e.storage??Rt(),n=`mwg-session:${e.namespace??`default`}`,r=Number(t.read(n)??`0`);this.launches=(Number.isFinite(r)?r:0)+1,t.write(n,String(this.launches))}};function kn(e,t,n){return e<t?t:e>n?n:e}function An(){return{musicVolume:1,sfxVolume:1,muted:!1,zoom:1,bindings:In(je),custom:{}}}function jn(e){return e.muted?0:e.musicVolume}function Mn(e){return e.muted?0:e.sfxVolume}var Nn=class{constructor(e={}){this.storage=e.storage??Rt(),this.key=`mwg-settings:${e.namespace??`default`}`,this.value=Vn(this.storage,this.key),Re(this.value.bindings)}get current(){return{...this.value,bindings:In(this.value.bindings),custom:{...this.value.custom}}}getCustom(e,t){return this.value.custom[e]??t}setCustom(e,t){this.value.custom[e]=t,Hn(this.storage,this.key,this.value)}setMusicVolume(e){this.update({musicVolume:e})}setSfxVolume(e){this.update({sfxVolume:e})}setMuted(e){this.update({muted:e})}setZoom(e){this.update({zoom:e})}setBindings(e){this.update({bindings:e})}update(e){e.musicVolume!==void 0&&(this.value.musicVolume=Pn(e.musicVolume)),e.sfxVolume!==void 0&&(this.value.sfxVolume=Pn(e.sfxVolume)),e.muted!==void 0&&(this.value.muted=e.muted),e.zoom!==void 0&&(this.value.zoom=Fn(e.zoom)),e.bindings!==void 0&&(this.value.bindings=Ln(e.bindings),Re(this.value.bindings)),e.custom!==void 0&&(this.value.custom=zn(e.custom)),Hn(this.storage,this.key,this.value)}applyBindings(){Re(this.value.bindings)}reset(){this.value=An(),Re(this.value.bindings),Hn(this.storage,this.key,this.value)}};function Pn(e){return Number.isFinite(e)?kn(e,0,1):1}function Fn(e){return Number.isFinite(e)?Math.max(.01,e):1}function In(e){let t={};for(let[n,r]of Object.entries(e))t[n]=[...r];return t}function Ln(e){if(typeof e!=`object`||!e||Array.isArray(e))return In(je);let t={};for(let[n,r]of Object.entries(e)){if(!Array.isArray(r))continue;let e=r.filter(e=>typeof e==`string`);e.length>0&&(t[n]=e)}return Object.keys(t).length>0?t:In(je)}function Rn(e){let t=typeof e;return t===`string`||t===`number`||t===`boolean`}function zn(e){if(typeof e!=`object`||!e||Array.isArray(e))return{};let t={};for(let[n,r]of Object.entries(e))Rn(r)&&(t[n]=r);return t}function Bn(e){let t=An();if(typeof e!=`object`||!e||Array.isArray(e))return t;let n=e;return{musicVolume:typeof n.musicVolume==`number`?Pn(n.musicVolume):t.musicVolume,sfxVolume:typeof n.sfxVolume==`number`?Pn(n.sfxVolume):t.sfxVolume,muted:typeof n.muted==`boolean`?n.muted:t.muted,zoom:typeof n.zoom==`number`?Fn(n.zoom):t.zoom,bindings:Ln(n.bindings),custom:zn(n.custom)}}function Vn(e,t){let n=e.read(t);if(!n)return An();try{return Bn(Pt(n,{label:`settings`}))}catch{return An()}}function Hn(e,t,n){e.write(t,JSON.stringify(n))}var Un=class extends Yt{constructor(e){super(e,`feedback`)}async submit(e){if(!e.message?.trim())throw Error(`feedback message cannot be empty`);return this.withTimeout(async t=>{let n=await this.fetchFn(this.endpoint,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e),signal:t});if(!n.ok)throw Error(`feedback request failed with HTTP ${n.status}`);return{ok:!0,status:n.status}})}},Wn=class{constructor(e){this.schedule=[],this.cursor=0,this.elapsed=0,this.startedWaves=new Set,this.completed=!1,this.onSpawn=e.onSpawn,this.onWaveStart=e.onWaveStart,this.onComplete=e.onComplete,e.waves.forEach((e,t)=>{let n=e.entries.reduce((e,t)=>e+t.count,0),r=e.duration??0,i=0;for(let a of e.entries)for(let o=0;o<a.count;o++,i++){let o=n>1&&r>0?i/(n-1)*r:0;this.schedule.push({time:e.delay+o,kind:a.kind,waveIndex:t})}}),this.schedule.sort((e,t)=>e.time-t.time),this.schedule.length===0&&(this.completed=!0,this.onComplete?.())}update(e){if(!this.completed){for(this.elapsed+=e;this.cursor<this.schedule.length&&this.schedule[this.cursor].time<=this.elapsed;){let e=this.schedule[this.cursor];this.startedWaves.has(e.waveIndex)||(this.startedWaves.add(e.waveIndex),this.onWaveStart?.(e.waveIndex)),this.onSpawn(e.kind),this.cursor++}this.cursor>=this.schedule.length&&(this.completed=!0,this.onComplete?.())}}get isComplete(){return this.completed}};function Gn(e,t){let n=e,r=t-(e-(e&1))/2;return{x:n,y:-n-r,z:r}}function Kn(e){return{x:e.x,y:e.z+(e.x-(e.x&1))/2}}var qn=[{x:1,y:-1,z:0},{x:1,y:0,z:-1},{x:0,y:1,z:-1},{x:-1,y:1,z:0},{x:-1,y:0,z:1},{x:0,y:-1,z:1}];function Jn(e,t){let n=Gn(e,t);return qn.map(e=>Kn({x:n.x+e.x,y:n.y+e.y,z:n.z+e.z}))}function Yn(e,t){let n=Gn(e.x,e.y),r=Gn(t.x,t.y);return Math.max(Math.abs(n.x-r.x),Math.abs(n.y-r.y),Math.abs(n.z-r.z))}function Xn(e){let t=Math.round(e.x),n=Math.round(e.y),r=Math.round(e.z),i=Math.abs(t-e.x),a=Math.abs(n-e.y),o=Math.abs(r-e.z);return i>a&&i>o?t=-n-r:a>o?n=-t-r:r=-t-n,{x:t,y:n,z:r}}function Zn(e,t){let n=Yn(e,t);if(n===0)return[{x:e.x,y:e.y}];let r=Gn(e.x,e.y),i=Gn(t.x,t.y),a=[];for(let e=0;e<=n;e++){let t=e/n;a.push(Kn(Xn({x:r.x+(i.x-r.x)*t,y:r.y+(i.y-r.y)*t,z:r.z+(i.z-r.z)*t})))}return a}function Qn(e,t){let n=Gn(e.x,e.y),r=[];for(let e=-t;e<=t;e++)for(let i=Math.max(-t,-e-t);i<=Math.min(t,-e+t);i++){let t=-e-i;r.push(Kn({x:n.x+e,y:n.y+i,z:n.z+t}))}return r}function $n(e,t,n,r,i={}){let a=+((i.offset??`odd`)===`odd`);return(i.orientation??`flat-top`)===`pointy-top`?{x:e*n+((t&1)===a?n/2:0)+n/2,y:t*r*.75+r/2}:{x:e*n*.75+n/2,y:t*r+((e&1)===a?r/2:0)+r/2}}function er(e,t,n,r,i={}){let a=(i.orientation??`flat-top`)===`pointy-top`,o=a?n:n*.75,s=a?r*.75:r,c=Math.round((e-n/2)/o),l=Math.round((t-r/2)/s),u={x:c,y:l},d=1/0;for(let a=-2;a<=2;a++)for(let o=-2;o<=2;o++){let s={x:c+a,y:l+o},f=$n(s.x,s.y,n,r,i),p=(f.x-e)**2+(f.y-t)**2;p<d&&(d=p,u=s)}return u}function tr(e,t,n,r){return n>=0&&r>=0&&n<e&&r<t}function nr(e,t,n){return n*e+t}function rr(e,t){return t%e}function ir(e,t){return Math.floor(t/e)}function ar(e,t){return`${e},${t}`}function or(e){let t=/^(-?\d+),(-?\d+)$/.exec(e);return t?{x:Number(t[1]),y:Number(t[2])}:null}var sr=[[0,-1],[1,0],[0,1],[-1,0]],cr=[[-1,-1],[0,-1],[1,-1],[-1,0],[1,0],[-1,1],[0,1],[1,1]],lr=[[0,-1],[1,-1],[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1]];function ur(e,t){return Math.hypot(e.x-t.x,e.y-t.y)}function dr(e,t){return Math.max(Math.abs(e.x-t.x),Math.abs(e.y-t.y))}function fr(e,t){return Math.abs(e.x-t.x)+Math.abs(e.y-t.y)}function pr(e,t,n){switch(e){case`euclidean`:return ur(t,n);case`manhattan`:return fr(t,n);case`chebyshev`:return dr(t,n);default:throw RangeError(`unknown distance metric: ${e}`)}}var mr=.12,hr=null,gr,_r=new p;function vr(){if(gr===void 0&&(gr=typeof matchMedia==`function`?matchMedia(`(prefers-reduced-motion: reduce)`):null,gr)){let e=()=>{_r.dispatch(br())};typeof gr.addEventListener==`function`?gr.addEventListener(`change`,e):typeof gr.addListener==`function`&&gr.addListener(e)}return gr}function yr(){return vr()?.matches??!1}function br(){return hr??yr()}function xr(e){hr=e,_r.dispatch(br())}function Sr(e){return vr(),_r.add(e),()=>_r.remove(e)}function Cr(e,t=`decorative`){return br()?t===`meaningful`?Math.min(e,mr):0:e}var wr=class e{constructor(e,t){this.width=e,this.height=t,this.volume=new Float32Array(e*t)}index(e,t){return e<0||t<0||e>=this.width||t>=this.height?-1:t*this.width+e}volumeAt(e,t){let n=this.index(e,t);return n<0?0:this.volume[n]}total(){let e=0;for(let t=0;t<this.volume.length;t++)e+=this.volume[t];return e}seed(e,t,n){let r=this.index(e,t);r>=0&&(this.volume[r]+=n)}clear(e,t){let n=this.index(e,t);n>=0&&(this.volume[n]=0)}spread(e,t=.25,n=.9){let r=new Float32Array(this.volume.length);for(let n=0;n<this.height;n++)for(let i=0;i<this.width;i++){let a=n*this.width+i,o=this.volume[a];if(o<=0)continue;let s=[];for(let[t,r]of sr){let a=i+t,o=n+r,c=this.index(a,o);c>=0&&e(a,o)&&s.push(c)}if(s.length===0)r[a]+=o;else{let e=o*t/s.length;r[a]+=o-e*s.length;for(let t of s)r[t]+=e}}let i=[];for(let e=0;e<r.length;e++){let t=r[e]*n,a=t<.001?0:t;a===0&&this.volume[e]>0&&i.push({x:e%this.width,y:Math.floor(e/this.width)}),this.volume[e]=a}return i}cellsAbove(e){let t=[];for(let n=0;n<this.height;n++)for(let r=0;r<this.width;r++){let i=this.volume[n*this.width+r];i>=e&&t.push({x:r,y:n,volume:i})}return t}toJSON(){return{width:this.width,height:this.height,volume:[...this.volume]}}static fromJSON(t){let n=new e(t.width,t.height);return n.volume.set(t.volume.slice(0,n.volume.length)),n}},Tr=class{constructor(e=1/60,t=5){if(this.accumulator=0,!(e>0))throw Error(`a fixed step must be positive`);this.step=e,this.maxSubsteps=Math.max(1,Math.floor(t))}advance(e,t){this.accumulator+=Math.max(0,e);let n=0;for(;this.accumulator>=this.step&&n<this.maxSubsteps;)t(this.step),this.accumulator-=this.step,n++;return this.accumulator>=this.step&&(this.accumulator=0),n}get alpha(){return this.accumulator/this.step}reset(){this.accumulator=0}},Er={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>e*(2-e),easeInOutQuad:e=>e<.5?2*e*e:1-(-2*e+2)**2/2,easeInCubic:e=>e*e*e,easeOutCubic:e=>1-(1-e)**3,easeInOutCubic:e=>e<.5?4*e*e*e:1-(-2*e+2)**3/2},Dr=class{constructor(){this.tweens=[]}tween(e,t,n=Er.linear){let{ease:r=Er.linear,intent:i=`decorative`,alternate:a}=typeof n==`function`?{ease:n}:n,o=br()&&a!==void 0,s=o?a:t,c=Cr(e,o?`meaningful`:i);return c>0?new Promise(e=>{this.tweens.push({elapsed:0,duration:c,ease:r,apply:s,resolve:e,finishOnReduced:!o&&i===`decorative`})}):(s(1),Promise.resolve())}update(e){if(this.tweens.length!==0)for(let t of[...this.tweens]){if(t.finishOnReduced&&br()){this.tweens.splice(this.tweens.indexOf(t),1),t.apply(1),t.resolve();continue}t.elapsed+=e;let n=Math.min(1,t.elapsed/t.duration);t.apply(t.ease(n)),n>=1&&(this.tweens.splice(this.tweens.indexOf(t),1),t.resolve())}}get isBusy(){return this.tweens.length>0}clear(){this.tweens=[]}},Or=class{constructor(e={}){this.history=[],this.cursor=-1,this.limit=Math.max(1,e.limit??50)}push(e){this.history.length=this.cursor+1,this.history.push(e),this.history.length>this.limit&&this.history.shift(),this.cursor=this.history.length-1}get canUndo(){return this.cursor>0}get canRedo(){return this.cursor<this.history.length-1}undo(){return this.canUndo?(this.cursor--,this.history[this.cursor]):null}redo(){return this.canRedo?(this.cursor++,this.history[this.cursor]):null}get current(){return this.cursor>=0?this.history[this.cursor]:null}clear(){this.history=[],this.cursor=-1}};function kr(e,t){if(!Number.isFinite(t.maxCost)||t.maxCost<0)return new Map;let n=t.key(e),r=new Map([[n,{cell:e,cost:0}]]),i=[{cell:e,key:n,cost:0}];for(;i.length>0;){let e=jr(i),n=r.get(e.key);if(n&&e.cost===n.cost&&!t.stop?.(e.cell,e.cost))for(let n of t.neighbors(e.cell)){let a=t.cost(e.cell,n);if(!Number.isFinite(a)||a<0)continue;let o=e.cost+a;if(o>t.maxCost||t.canEnter&&!t.canEnter(n,e.cell,o))continue;let s=t.key(n);if(o>=(r.get(s)?.cost??1/0))continue;let c={cell:n,key:s,cost:o};r.set(s,c),Ar(i,c)}}return r}function Ar(e,t){e.push(t);let n=e.length-1;for(;n>0;){let t=Math.floor((n-1)/2);if(e[t].cost<=e[n].cost)break;[e[t],e[n]]=[e[n],e[t]],n=t}}function jr(e){let t=e[0],n=e.pop();if(!t||!n||e.length===0)return t;e[0]=n;let r=0;for(;;){let t=r*2+1,n=t+1,i=r;if(t<e.length&&e[t].cost<e[i].cost&&(i=t),n<e.length&&e[n].cost<e[i].cost&&(i=n),i===r)break;[e[r],e[i]]=[e[i],e[r]],r=i}return t}var Mr=class{constructor(){this.changed=new p,this.tasks=[],this.progress=new Map,this.status_=`idle`,this.current_=null,this.error_=null,this.cancelled=!1}add(e){if(!e.id)throw Error(`load task needs an id`);if(this.tasks.some(t=>t.id===e.id))throw Error(`duplicate load task "${e.id}"`);if(e.weight!==void 0&&!(e.weight>0))throw Error(`load task weight must be positive`);if(this.status_===`loading`)throw Error(`cannot add a task while loading`);return this.tasks.push(e),this.progress.set(e.id,0),this.emit(),this}get snapshot(){let e=this.tasks.reduce((e,t)=>e+(t.weight??1),0),t=this.tasks.reduce((e,t)=>e+(t.weight??1)*(this.progress.get(t.id)??0),0);return{status:this.status_,completed:t,total:e,current:this.current_,error:this.error_}}async start(){if(this.status_===`loading`)throw Error(`load queue is already running`);this.status_=`loading`,this.cancelled=!1,this.error_=null,this.emit();try{for(let e of this.tasks){if(this.cancelled)break;this.current_=e.id,this.emit();let t=this;await e.run({get cancelled(){return t.cancelled},report:t=>this.report(e.id,t)}),this.cancelled||this.report(e.id,1)}this.current_=null,this.status_=this.cancelled?`cancelled`:`ready`,this.emit()}catch(e){throw this.current_=null,this.error_=e,this.status_=`failed`,this.emit(),e}}cancel(){this.status_===`loading`&&(this.cancelled=!0)}retry(){if(this.status_===`loading`)throw Error(`cannot retry while loading`);this.status_=`idle`,this.current_=null,this.error_=null,this.cancelled=!1;for(let e of this.tasks)this.progress.set(e.id,0);this.emit()}report(e,t){if(!Number.isFinite(t))throw Error(`load progress must be finite`);this.progress.set(e,Math.max(0,Math.min(1,t))),this.emit()}emit(){this.changed.dispatch(this.snapshot)}},Nr=class{constructor(){this.entities=new Map,this.ids=new Map,this.sequence=0}add(e,t){let n=this.ids.get(e);if(n!==void 0){if(t!==void 0&&t!==n)throw Error(`entity already has id ${n}`);return n}let r=t;if(r!==void 0){if(r.length===0)throw Error(`entity id must not be empty`);if(this.entities.has(r))throw Error(`entity id already exists: ${r}`)}else do r=`e${this.sequence++}`;while(this.entities.has(r));return this.entities.set(r,e),this.ids.set(e,r),r}get(e){return this.entities.get(e)}idOf(e){return this.ids.get(e)}has(e){return this.entities.has(e)}remove(e){let t=this.entities.get(e);return t!==void 0&&(this.entities.delete(e),this.ids.delete(t),!0)}get size(){return this.entities.size}},Pr=class{constructor(e){this.queue=[],this.busy=!1,this.remaining=0,this.play=e.play}enqueue(e){this.queue.push(...e),this.busy||this.advance()}update(e){this.busy&&(this.remaining-=e,this.remaining<=0&&this.advance())}get isBusy(){return this.busy}clear(){this.queue=[],this.busy=!1,this.remaining=0}advance(){let e=this.queue.shift();if(e===void 0){this.busy=!1,this.remaining=0;return}this.busy=!0;let t=this.play(e)||0;t>0?this.remaining=t:this.advance()}},Fr=2166136261,Ir=16777619;function Lr(e,t=!1){if(e==null)return`null`;switch(typeof e){case`boolean`:return e?`true`:`false`;case`number`:return Number.isFinite(e)?String(e):`null`;case`string`:return JSON.stringify(e);case`bigint`:return JSON.stringify(e.toString());case`function`:case`symbol`:return t?`null`:`undefined`}return Array.isArray(e)?`[${e.map(e=>Lr(e,!0)).join(`,`)}]`:`{${Object.entries(e).filter(([,e])=>e!==void 0&&typeof e!=`function`&&typeof e!=`symbol`).sort(([e],[t])=>e<t?-1:+(e>t)).map(([e,t])=>`${JSON.stringify(e)}:${Lr(t)}`).join(`,`)}}`}function Rr(e){let t=Lr(e),n=Fr;for(let e=0;e<t.length;e++)n^=t.charCodeAt(e),n=Math.imul(n,Ir)>>>0;return n>>>0}var zr=class{constructor(){this.reference=new Map,this.desyncTick=null}observe(e,t){let n=this.reference.get(e);return n===void 0?(this.reference.set(e,t),!0):n===t||(this.desyncTick===null&&(this.desyncTick=e),!1)}get divergent(){return this.desyncTick!==null}get atTick(){return this.desyncTick}reset(){this.reference.clear(),this.desyncTick=null}};function Br(e,t={}){let n=Ur(e);if(n.length===0)return[];let[r,...i]=n,a=t.listDelimiter??`;`,o=t.mapDelimiter??`=`;return i.map((e,n)=>{let i={};return r.forEach((r,s)=>{let c=e[s]??``;c!==``&&(i[r]=Vr(c,t.columns?.[r]??`string`,r,n,a,o))}),i})}function Vr(e,t,n,r,i,a){return Hr(e,t,{column:n,rowIndex:r,listDelimiter:i,mapDelimiter:a,error:()=>t===`number`?`CSV row ${r+1}, column "${n}": "${e}" is not a number`:t===`boolean`?`CSV row ${r+1}, column "${n}": "${e}" is not "true" or "false"`:t===`map`?`CSV row ${r+1}, column "${n}": "${e.split(i).map(e=>e.trim()).find(e=>e&&!e.includes(a))??e}" has no "${a}" to split a key from its value`:`CSV row ${r+1}, column "${n}": "${e}" is invalid`})}function Hr(e,t,n={}){let r=n.column??`value`,i=n.listDelimiter??`;`,a=n.mapDelimiter??`=`,o=e=>{throw Error(n.error?.(e)??e)};switch(t){case`string`:return e;case`number`:{let t=Number(e);return Number.isFinite(t)||o(`${r} must be a number`),t}case`boolean`:{let t=e.toLowerCase();if(t===`true`)return!0;if(t===`false`)return!1;if(n.acceptYesNo&&t===`yes`)return!0;if(n.acceptYesNo&&t===`no`)return!1;o(`${r} must be true, false${n.acceptYesNo?`, yes, or no`:``}`)}case`list`:return e.split(i).map(e=>e.trim()).filter(e=>e.length>0);case`map`:{let t={};for(let n of e.split(i).map(e=>e.trim()).filter(e=>e.length>0)){let e=n.indexOf(a);e===-1&&o(`${r} map entry must contain ${a}`),t[n.slice(0,e).trim()]=n.slice(e+a.length).trim()}return t}}}function Ur(e){let t=[],n=[],r=``,i=!1,a=0;for(;a<e.length;){let o=e[a];if(i){if(o===`"`){if(e[a+1]===`"`){r+=`"`,a+=2;continue}i=!1,a++;continue}r+=o,a++}else o===`"`?(i=!0,a++):o===`,`?(n.push(r),r=``,a++):o===`\r`?a++:o===`
|
|
2
2
|
`?(n.push(r),t.push(n),n=[],r=``,a++):(r+=o,a++)}return(r.length>0||n.length>0)&&(n.push(r),t.push(n)),t.filter(e=>e.length!==1||e[0]!==``)}function Wr(e){let t=[],n=[],r,i=e=>{if(!n.includes(e)){if(n.length>=2)throw Error(`dialogue text supports at most two speakers for the "-" shorthand; found a third speaker "${e}" after "${n[0]}" and "${n[1]}" were already established`);n.push(e)}};for(let a of e.split(`
|
|
3
3
|
`)){let e=a.trim();if(e===``)continue;let o=/^@(\S+)(?:\s+(.*))?$/.exec(e);if(o){let[,e,n]=o;i(e),n&&(t.push({text:n.trim(),speaker:e}),r=e)}else if(e.startsWith(`-`)){if(n.length<2)throw Error(`a "-" line needs two established speakers first (write two "@id text" lines before it)`);let i=e.slice(1).trim(),a=n.find(e=>e!==r)??n[0];t.push({text:i,speaker:a}),r=a}else t.push({text:e}),r=void 0}return t}function Gr(e){let t=Kr(e);if(t.length===0)throw Error(`this twee source has no passages - passages start with ":: Name"`);let n={},r,i;for(let e of t)if(e.name===`StoryTitle`)r=e.body.trim()||void 0;else if(e.name===`StoryData`)i=Jr(e.body);else{if(Object.prototype.hasOwnProperty.call(n,e.name))throw Error(`this twee source defines "${e.name}" twice`);n[e.name]=Yr(e.name,e.body)}let a=Object.keys(n);if(a.length===0)throw Error(`this twee source has no story passages, only StoryTitle/StoryData`);if(i!==void 0&&!Object.prototype.hasOwnProperty.call(n,i))throw Error(`StoryData starts at "${i}", which is not a passage in this file`);for(let[e,t]of Object.entries(n))for(let r of t)if(`ask`in r){for(let t of r.choices)if(t.goto!==void 0&&!Object.prototype.hasOwnProperty.call(n,t.goto))throw Error(`passage "${e}" links to "${t.goto}", which is not a passage in this file`)}return{story:n,start:i??a[0],title:r}}function Kr(e){let t=[],n=null,r=[],i=()=>{n!==null&&t.push({name:n,body:r.join(`
|
|
4
4
|
`)})};for(let t of e.split(`
|
|
@@ -1343,7 +1343,7 @@ fn mainFragment(
|
|
|
1343
1343
|
src: url('${n}');
|
|
1344
1344
|
}`}Xl();var cj=new Map;async function lj(e){let t=e.filter(e=>Yl.has(`${e}-and-url`)).map(e=>{if(!cj.has(e)){let{entries:t}=Yl.get(`${e}-and-url`),n=[];t.forEach(t=>{let r=t.url,i=t.faces.map(e=>({weight:e.weight,style:e.style}));n.push(...i.map(t=>sj({fontWeight:t.weight,fontStyle:t.style,fontFamily:e},r)))}),cj.set(e,Promise.all(n).then(e=>e.join(`
|
|
1345
1345
|
`)))}return cj.get(e)});return(await Promise.all(t)).join(`
|
|
1346
|
-
`)}function uj(e,t,n,r,i){let{domElement:a,styleElement:o,svgRoot:s}=i;a.innerHTML=`<style>${t.cssStyle}</style><div style='padding:0;'>${e}</div>`,a.setAttribute(`style`,`transform: scale(${n});transform-origin: top left; display: inline-block`),o.textContent=r;let{width:c,height:l}=i.image;return s.setAttribute(`width`,c.toString()),s.setAttribute(`height`,l.toString()),new XMLSerializer().serializeToString(s)}fu();function dj(e,t){let n=du.getOptimalCanvasAndContext(e.width,e.height,t),{context:r}=n;return r.clearRect(0,0,e.width,e.height),r.drawImage(e,0,0),n}function fj(e,t,n){return new Promise(async r=>{n&&await new Promise(e=>setTimeout(e,100)),e.onload=()=>{r()},e.src=`data:image/svg+xml;charset=utf8,${encodeURIComponent(t)}`,e.crossOrigin=`anonymous`})}R(),fu(),fs(),Gd(),NS(),W(),ha(),Fu();var pj=class{constructor(e){this._activeTextures={},this._renderer=e,this._createCanvas=e.type===Wd.WEBGPU}getTexture(e){return this.getTexturePromise(e)}getManagedTexture(e){let t=e.styleKey;if(this._activeTextures[t])return this._increaseReferenceCount(t),this._activeTextures[t].promise;let n=this._buildTexturePromise(e).then(e=>(this._activeTextures[t].texture=e,e));return this._activeTextures[t]={texture:null,promise:n,usageCount:1},n}getReferenceCount(e){return this._activeTextures[e]?.usageCount??null}_increaseReferenceCount(e){this._activeTextures[e].usageCount++}decreaseReferenceCount(e){let t=this._activeTextures[e];t&&(t.usageCount--,t.usageCount===0&&(t.texture?this._cleanUp(t.texture):t.promise.then(e=>{t.texture=e,this._cleanUp(t.texture)}).catch(()=>{U(`HTMLTextSystem: Failed to clean texture`)}),this._activeTextures[e]=null))}getTexturePromise(e){return this._buildTexturePromise(e)}async _buildTexturePromise(e){let{text:t,style:n,resolution:r,textureStyle:i,autoGenerateMipmaps:a}=e,o=ma.get(ej),s=aj(t,n),c=await lj(s),l=nj(t,n,c,o),u=Math.ceil(Math.ceil(Math.max(1,l.width)+n.padding*2)*r),d=Math.ceil(Math.ceil(Math.max(1,l.height)+n.padding*2)*r),f=o.image;f.width=(u|0)+2,f.height=(d|0)+2,await fj(f,uj(t,n,r,c,o),MS()&&s.length>0);let p=f,m;this._createCanvas&&(m=dj(f,r));let h=Nu(m?m.canvas:p,f.width-2,f.height-2,r,a,i?.scaleMode);return this._renderer?.texture.initSource(h.source),this._createCanvas&&du.returnCanvasAndContext(m),ma.return(o),h}returnTexturePromise(e){e.then(e=>{this._cleanUp(e)}).catch(()=>{U(`HTMLTextSystem: Failed to clean texture`)})}_cleanUp(e){let t=e.source;ds.returnTexture(e),t.resource=null,t.uploadMethodId=`unknown`}destroy(){this._renderer=null;for(let e in this._activeTextures)this._activeTextures[e]&&this.returnTexturePromise(this._activeTextures[e].promise);this._activeTextures=null}};pj.extension={type:[I.WebGLSystem,I.WebGPUSystem,I.CanvasSystem],name:`htmlText`},R(),L.add(pj),L.add(ij),Po(),ko();var mj=class extends fA{constructor(...e){let t=pA(e,`HtmlText`);super(t,ZA),this.renderPipeId=`htmlText`,t.textureStyle&&(this.textureStyle=t.textureStyle instanceof Oo?t.textureStyle:new Oo(t.textureStyle),wA(this.textureStyle)),this.autoGenerateMipmaps=t.autoGenerateMipmaps??No.defaultOptions.autoGenerateMipmaps}updateBounds(){let e=this._bounds,t=this._anchor,{width:n,height:r}=nj(this.text,this._style);e.minX=-t._x*n,e.maxX=e.minX+n,e.minY=-t._y*r,e.maxY=e.minY+r}get text(){return this._text}set text(e){let t=this._sanitiseText(e.toString());super.text=t}_sanitiseText(e){return this._removeInvalidHtmlTags(e.replace(/<br>/gi,`<br/>`).replace(/<hr>/gi,`<hr/>`).replace(/ /gi,` `))}_removeInvalidHtmlTags(e){return e.replace(/<[^>]*?(?=<|$)/g,``)}};oa();var hj=class e extends Hk{constructor(...e){super({});let t=e[0]??{};typeof t==`number`&&(H(V,`PlaneGeometry constructor changed please use { width, height, verticesX, verticesY } instead`),t={width:t,height:e[1],verticesX:e[2],verticesY:e[3]}),this.build(t)}build(t){t={...e.defaultOptions,...t},this.verticesX=this.verticesX??t.verticesX,this.verticesY=this.verticesY??t.verticesY,this.width=this.width??t.width,this.height=this.height??t.height;let n=this.verticesX*this.verticesY,r=[],i=[],a=[],o=this.verticesX-1,s=this.verticesY-1,c=this.width/o,l=this.height/s;for(let e=0;e<n;e++){let t=e%this.verticesX,n=e/this.verticesX|0;r.push(t*c,n*l),i.push(t/o,n/s)}let u=o*s;for(let e=0;e<u;e++){let t=e%o,n=e/o|0,r=n*this.verticesX+t,i=n*this.verticesX+t+1,s=(n+1)*this.verticesX+t,c=(n+1)*this.verticesX+t+1;a.push(r,i,s,i,c,s)}this.buffers[0].data=new Float32Array(r),this.buffers[1].data=new Float32Array(i),this.indexBuffer.data=new Uint32Array(a),this.buffers[0].update(),this.buffers[1].update(),this.indexBuffer.update()}};hj.defaultOptions={width:100,height:100,verticesX:10,verticesY:10};var gj=hj;wo();var _j=class extends Kk{constructor(e){let{texture:t,verticesX:n,verticesY:r,...i}=e,a=new gj(Co({width:t.width,height:t.height,verticesX:n,verticesY:r}));super(Co({...i,geometry:a,texture:t})),this.texture=t,this.autoResize=!0}textureUpdated(){let e=this.geometry,{width:t,height:n}=this.texture;this.autoResize&&(e.width!==t||e.height!==n)&&(e.width=t,e.height=n,e.build({}))}set texture(e){this._texture?.off(`update`,this.textureUpdated,this),super.texture=e,e.on(`update`,this.textureUpdated,this),this.textureUpdated()}get texture(){return this._texture}destroy(e){this.texture.off(`update`,this.textureUpdated,this),super.destroy(e)}};R(),su(),to(),Ya();var vj=[[0,0],[0,0],[0,0]],yj=[[0,0],[0,0],[0,0]],bj=[[0,0],[0,0],[0,0]],xj=[[0,0],[0,0],[0,0]];function Sj(e,t,n,r,i,a,o){e[0][0]=t,e[0][1]=n,e[1][0]=r,e[1][1]=i,e[2][0]=a,e[2][1]=o}var Cj=class{constructor(e){this._renderer=e}validateRenderable(e){return!1}addRenderable(e,t){this._renderer.renderPipes.batch.break(t),t.add(e)}updateRenderable(e){}execute(e){let t=this._renderer,n=t.canvasContext,r=n.activeContext;r.save();let i=e.groupTransform,a=t._roundPixels|e._roundPixels;n.setContextTransform(i,a===1),n.setBlendMode(e.groupBlendMode);let o=t.globalUniforms.globalUniformData?.worldColor??4294967295,s=e.groupColorAlpha,c=(o>>>24&255)/255,l=(s>>>24&255)/255,u=t.filter?.alphaMultiplier??1,d=c*l*u;if(d<=0){r.restore();return}r.globalAlpha=d;let f=o&16777215,p=$a(Ja(s&16777215,f)),m=e.texture,h=X.getCanvasSource(m);if(!h){r.restore();return}let g=n.smoothProperty,_=m.source.style.scaleMode!==`nearest`;r[g]!==_&&(r[g]=_);let v=p!==16777215||m.rotate!==0,y=v?X.getTintedCanvas({texture:m},p):h,{leftWidth:b,topHeight:x,rightWidth:S,bottomHeight:C,width:ee,height:w}=e,T=b+S,E=x+C,te=Math.min(T>ee?ee/T:1,E>w?w/E:1,1),D=b*te,O=S*te,ne=x*te,k=C*te,A=Math.max(0,ee-D-O),re=Math.max(0,w-ne-k),ie=e.anchor,ae=m.source._resolution??m.source.resolution??1,oe=m.frame.x*ae,se=m.frame.y*ae,j=-ie.x*ee,ce=-ie.y*w,le=b*ae,ue=x*ae,de=S*ae,fe=C*ae,pe=m.frame.width*ae,me=m.frame.height*ae;v&&(oe=0,se=0,pe=y.width,me=y.height);let he=pe-le-de,ge=me-ue-fe,_e=he>0?oe+le:Math.max(oe,Math.min(oe+le,oe+pe-1)),ve=he>0?he:1,M=ge>0?se+ue:Math.max(se,Math.min(se+ue,se+me-1)),N=ge>0?ge:1;Sj(vj,oe,le,_e,ve,oe+pe-de,de),Sj(yj,se,ue,M,N,se+me-fe,fe),Sj(bj,j,D,j+D,A,j+ee-O,O),Sj(xj,ce,ne,ce+ne,re,ce+w-k,k);for(let e=0;e<3;e++){let t=bj[e][1];if(t<=0)continue;let n=vj[e][0],i=vj[e][1],a=bj[e][0];for(let e=0;e<3;e++){let o=xj[e][1];o<=0||r.drawImage(y,n,yj[e][0],i,yj[e][1],a,xj[e][0],t,o)}}r.restore()}destroy(){this._renderer=null}};Cj.extension={type:[I.CanvasPipes],name:`nineSliceSprite`};var wj=class e extends gj{constructor(t={}){t={...e.defaultOptions,...t},super({width:t.width,height:t.height,verticesX:4,verticesY:4}),this._trimX=0,this._trimY=0,this._trimWidth=t.originalWidth??e.defaultOptions.originalWidth,this._trimHeight=t.originalHeight??e.defaultOptions.originalHeight,this.update(t)}update(e){this.width=e.width??this.width,this.height=e.height??this.height,this._originalWidth=e.originalWidth??this._originalWidth,this._originalHeight=e.originalHeight??this._originalHeight,this._leftWidth=e.leftWidth??this._leftWidth,this._rightWidth=e.rightWidth??this._rightWidth,this._topHeight=e.topHeight??this._topHeight,this._bottomHeight=e.bottomHeight??this._bottomHeight,this._anchorX=e.anchor?.x,this._anchorY=e.anchor?.y,e.trim===void 0?(this._trimWidth=this._originalWidth,this._trimHeight=this._originalHeight):(this._trimX=e.trim?.x??0,this._trimY=e.trim?.y??0,this._trimWidth=e.trim?.width??this._originalWidth,this._trimHeight=e.trim?.height??this._originalHeight),this.updateUvs(),this.updatePositions()}updatePositions(){let e=this.positions,{width:t,height:n,_leftWidth:r,_rightWidth:i,_topHeight:a,_bottomHeight:o,_anchorX:s,_anchorY:c}=this,l=r+i,u=t>l?1:t/l,d=a+o,f=n>d?1:n/d,p=Math.min(u,f),m=s*t,h=c*n;e[0]=e[8]=e[16]=e[24]=-m,e[2]=e[10]=e[18]=e[26]=r*p-m,e[4]=e[12]=e[20]=e[28]=t-i*p-m,e[6]=e[14]=e[22]=e[30]=t-m,e[1]=e[3]=e[5]=e[7]=-h,e[9]=e[11]=e[13]=e[15]=a*p-h,e[17]=e[19]=e[21]=e[23]=n-o*p-h,e[25]=e[27]=e[29]=e[31]=n-h,this.getBuffer(`aPosition`).update()}updateUvs(){let e=this.uvs,t=this._originalWidth,n=this._originalHeight,r=this._trimX/t,i=this._trimY/n,a=(this._trimX+this._trimWidth)/t,o=(this._trimY+this._trimHeight)/n;e[0]=e[8]=e[16]=e[24]=r,e[1]=e[3]=e[5]=e[7]=i,e[6]=e[14]=e[22]=e[30]=a,e[25]=e[27]=e[29]=e[31]=o;let s=1/t,c=1/n;e[2]=e[10]=e[18]=e[26]=r+s*this._leftWidth,e[9]=e[11]=e[13]=e[15]=i+c*this._topHeight,e[4]=e[12]=e[20]=e[28]=a-s*this._rightWidth,e[17]=e[19]=e[21]=e[23]=o-c*this._bottomHeight,this.getBuffer(`aUV`).update()}};wj.defaultOptions={width:100,height:100,leftWidth:10,topHeight:10,rightWidth:10,bottomHeight:10,originalWidth:100,originalHeight:100};var Tj=wj;R(),cv();var Ej=class extends Uk{constructor(){super(),this.geometry=new Tj}destroy(){this.geometry.destroy()}},Dj=class{constructor(e){this._renderer=e,this._managedSprites=new sv({renderer:e,type:`renderable`,name:`nineSliceSprite`})}addRenderable(e,t){let n=this._getGpuSprite(e);e.didViewUpdate&&this._updateBatchableSprite(e,n),this._renderer.renderPipes.batch.addToBatch(n,t)}updateRenderable(e){let t=this._getGpuSprite(e);e.didViewUpdate&&this._updateBatchableSprite(e,t),t._batcher.updateElement(t)}validateRenderable(e){let t=this._getGpuSprite(e);return!t._batcher.checkAndUpdateTexture(t,e._texture)}_updateBatchableSprite(e,t){t.geometry.update(e),t.setTexture(e._texture)}_getGpuSprite(e){return e._gpuData[this._renderer.uid]||this._initGPUSprite(e)}_initGPUSprite(e){let t=e._gpuData[this._renderer.uid]=new Ej,n=t;return n.renderable=e,n.transform=e.groupTransform,n.texture=e._texture,n.roundPixels=this._renderer._roundPixels|e._roundPixels,this._managedSprites.add(e),e.didViewUpdate||this._updateBatchableSprite(e,n),t}destroy(){this._managedSprites.destroy(),this._renderer=null}};Dj.extension={type:[I.WebGLPipes,I.WebGPUPipes],name:`nineSliceSprite`},R(),L.add(Cj),L.add(Dj),Zi(),$o(),yc();var Oj=class e extends vc{constructor(t){t instanceof q&&(t={texture:t});let{width:n,height:r,anchor:i,leftWidth:a,rightWidth:o,topHeight:s,bottomHeight:c,texture:l,roundPixels:u,...d}=t;super({label:`NineSliceSprite`,...d}),this.renderPipeId=`nineSliceSprite`,this.batched=!0,this._leftWidth=a??l?.defaultBorders?.left??Tj.defaultOptions.leftWidth,this._topHeight=s??l?.defaultBorders?.top??Tj.defaultOptions.topHeight,this._rightWidth=o??l?.defaultBorders?.right??Tj.defaultOptions.rightWidth,this._bottomHeight=c??l?.defaultBorders?.bottom??Tj.defaultOptions.bottomHeight,this._width=n??l.width??Tj.defaultOptions.width,this._height=r??l.height??Tj.defaultOptions.height,this.allowChildren=!1,this.texture=l??e.defaultOptions.texture,this.roundPixels=u??!1,this._anchor=new Xi({_onUpdate:()=>{this.onViewUpdate()}}),i?this.anchor=i:this.texture.defaultAnchor&&(this.anchor=this.texture.defaultAnchor)}get anchor(){return this._anchor}set anchor(e){typeof e==`number`?this._anchor.set(e):this._anchor.copyFrom(e)}get width(){return this._width}set width(e){this._width=e,this.onViewUpdate()}get height(){return this._height}set height(e){this._height=e,this.onViewUpdate()}setSize(e,t){typeof e==`object`&&(t=e.height??e.width,e=e.width),this._width=e,this._height=t??e,this.onViewUpdate()}getSize(e){return e||={},e.width=this._width,e.height=this._height,e}get leftWidth(){return this._leftWidth}set leftWidth(e){this._leftWidth=e,this.onViewUpdate()}get topHeight(){return this._topHeight}set topHeight(e){this._topHeight=e,this.onViewUpdate()}get rightWidth(){return this._rightWidth}set rightWidth(e){this._rightWidth=e,this.onViewUpdate()}get bottomHeight(){return this._bottomHeight}set bottomHeight(e){this._bottomHeight=e,this.onViewUpdate()}get texture(){return this._texture}set texture(e){e||=q.EMPTY;let t=this._texture;t!==e&&(t&&t.dynamic&&t.off(`update`,this.onViewUpdate,this),e.dynamic&&e.on(`update`,this.onViewUpdate,this),this._texture=e,this.onViewUpdate())}get originalWidth(){return this._texture.width}get originalHeight(){return this._texture.height}get trim(){return this._texture.trim??null}destroy(e){if(super.destroy(e),typeof e==`boolean`?e:e?.texture){let t=typeof e==`boolean`?e:e?.textureSource;this._texture.destroy(t)}this._texture=null}updateBounds(){let e=this._bounds,t=this._anchor,n=this._width,r=this._height;e.minX=-t._x*n,e.maxX=e.minX+n,e.minY=-t._y*r,e.maxY=e.minY+r}};Oj.defaultOptions={texture:q.EMPTY};var kj=Oj;R(),nu(),xl(),B(),qi(),Pa(),Eg(),Xm(),$m(),sh(),mh(),Ng(),Af(),Of(),Lf(),rf(),g_(),Po(),$o(),tu(),xs(),TC(),TE(),Tl(),$D(),oO(),ri(),L.add(Gf,Jf);function Aj(e,t,n,r){let i=Math.max(e,t);return!Number.isFinite(r)||r<=0||!Number.isFinite(i)||i<=0||i*n<=r?n:Math.max(1,Math.floor(r/i))}var jj=class{constructor(e){this.over=0,this.under=0,this.ceiling=Mj(e.ceiling);let t=e.minRatio??1;this.floor=Math.min(Number.isFinite(t)&&t>0?t:1,this.ceiling);let n=e.targetFps??60;this.budget=Number.isFinite(n)&&n>0?1/n:1/60,this.downAfter=Nj(e.overBudgetFrames,60),this.upAfter=Nj(e.underBudgetFrames,600),this.step=Number.isFinite(e.step)&&e.step>0?e.step:.25,this.ratio_=this.ceiling}get ratio(){return this.ratio_}setCeiling(e){return this.ceiling=Mj(e),this.ratio_>this.ceiling&&(this.ratio_=this.ceiling,this.over=0,this.under=0),this.ratio_}observe(e){return!Number.isFinite(e)||e<=0||(e>this.budget?(this.over++,this.under=0,this.over>=this.downAfter&&this.ratio_>this.floor&&(this.ratio_=Math.max(this.floor,this.ratio_-this.step),this.over=0)):(this.under++,this.over=0,this.under>=this.upAfter&&this.ratio_<this.ceiling&&(this.ratio_=Math.min(this.ceiling,this.ratio_+this.step),this.under=0))),this.ratio_}reset(){this.ratio_=this.ceiling,this.over=0,this.under=0}};function Mj(e){return Number.isFinite(e)&&e>0?e:1}function Nj(e,t){return Number.isFinite(e)?Math.max(1,Math.floor(e)):t}var Pj=e=>Math.min(1,Math.max(0,e));function Fj(e,t,n=`diagonal`,r=1){let i=e*t,a=[],o=r>>>0||1;for(let r=0;r<t;r++)for(let i=0;i<e;i++)n===`diagonal`?a.push(i+r):n===`rows`?a.push(r*e+i):n===`spiral`?a.push(Math.min(i,r,e-1-i,t-1-r)):(o=Math.imul(o,1664525)+1013904223>>>0,a.push(o/2**32));let s=Math.min(...a),c=Math.max(...a);return a.map(e=>i===1||c===s?0:(e-s)/(c-s))}function Ij(e,t,n){let r=Pj(n);return Pj((t-e*r)/(1-r||1))}function Lj(e,t=1.08){let n=Pj(e);return n<.7?Er.easeOutCubic(n/.7)*t:t+(1-t)*Er.easeInOutQuad((n-.7)/.3)}function Rj(e){return typeof e==`function`?e:Er[e??`easeInOutQuad`]}function zj(e,t){return e??{x:t.width/2,y:t.height/2}}function Bj(e){if(!e.snapshot)return null;let t=new wl(e.snapshot);return t.width=e.width,t.height=e.height,t}function Vj(e,t,n){return{update:t,destroy(){n?.(),e.destroy({children:!0})}}}function Hj(e={}){let t=Math.max(1,Math.floor(e.columns??8)),n=Math.max(1,Math.floor(e.rows??5)),r=e.stagger??.5,i=e.rotation??0;return{name:`tileShrink`,start(a){let o=new J;a.over.addChild(o);let s=Fj(t,n,e.order??`diagonal`,e.seed),c=[],l=a.snapshot,u=a.width/t,d=a.height/n;if(l){let e=l.frame;for(let r=0;r<n;r++)for(let i=0;i<t;i++){let a=new G(e.x+i*e.width/t,e.y+r*e.height/n,e.width/t,e.height/n),s=new wl(new q({source:l.source,frame:a}));s.anchor.set(.5),s.width=u,s.height=d,s.position.set((i+.5)*u,(r+.5)*d),c.push({sprite:s,width:s.scale.x,height:s.scale.y}),o.addChild(s)}}return Vj(o,e=>{c.forEach(({sprite:t,width:n,height:a},o)=>{let c=1-Ij(s[o],e,r);t.scale.set(n*c,a*c),t.rotation=(1-c)*i,t.visible=c>0})})}}}function Uj(e={}){return{name:`shrink`,start(t){let n=new J;t.over.addChild(n);let r=Bj(t);r&&n.addChild(r);let i=zj(e.to,t);return Vj(n,e=>{let t=1-e;n.scale.set(t),n.position.set(i.x*(1-t),i.y*(1-t)),n.alpha=1-e*e})}}}function Wj(e,t,n){return{name:e,start(e){let r=new J;e.under.addChild(r);let i=Bj(e);i&&r.addChild(i);let a=zj(t,e),o=e.incoming;return Vj(r,e=>{let t=n(e);o.scale.set(t),o.position.set(a.x*(1-t),a.y*(1-t)),o.alpha=Pj(e*3)},()=>{o.scale.set(1),o.position.set(0,0),o.alpha=1})}}}function Gj(e={}){return Wj(`pop`,e.from,t=>Lj(t,e.overshoot))}function Kj(e={}){return Wj(`grow`,e.from,e=>e)}function qj(e={}){let t=e.direction??`left`,n=t===`left`?-1:+(t===`right`),r=t===`up`?-1:+(t===`down`);return{name:`slide`,start(e){let t=new J;e.over.addChild(t);let i=Bj(e);i&&t.addChild(i);let a=e.incoming;return Vj(t,i=>{t.position.set(n*e.width*i,r*e.height*i),a.position.set(-n*e.width*(1-i),-r*e.height*(1-i))},()=>a.position.set(0,0))}}}function Jj(e={}){return{name:`iris`,start(t){let n=new J;t.under.addChild(n);let r=Bj(t);r&&n.addChild(r);let i=zj(e.from,t),a=Math.hypot(Math.max(i.x,t.width-i.x),Math.max(i.y,t.height-i.y)),o=new Z;return t.incoming.addChild(o),t.incoming.mask=o,Vj(n,e=>{o.clear().circle(i.x,i.y,a*e).fill({color:16777215})},()=>{t.incoming.mask=null,o.destroy()})}}}function Yj(){return{name:`dissolve`,start(e){let t=new J;e.over.addChild(t);let n=Bj(e);return n&&t.addChild(n),Vj(t,e=>{t.alpha=1-e})}}}function Xj(e,t,n=!1){let r=Pj(t),i=Er.easeOutCubic(r);return e===`pop`?{scale:n?i:Lj(r),alpha:Pj(r*3),offset:0}:e===`grow`?{scale:i,alpha:Pj(r*3),offset:0}:e===`slide`?{scale:1,alpha:i,offset:(1-i)*48}:{scale:1,alpha:i,offset:0}}var Zj=class{constructor(e,t,n,r){this.under=new J,this.over=new J,this.elapsed=0,this.finished=!1,this.snapshot=n,this.duration=Math.max(1e-4,e.duration??.5),this.ease=Rj(e.easing),this.pause=e.pause??!1,this.onDone=e.onDone,this.runtime=e.transition.start({width:t.width,height:t.height,snapshot:n,incoming:r,under:this.under,over:this.over}),this.runtime.update(0)}get progress(){return this.finished?1:Math.min(1,this.elapsed/this.duration)}get done(){return this.finished}update(e){return this.finished?!0:(this.elapsed+=e,this.elapsed>=this.duration?(this.finish(),!0):(this.runtime.update(this.ease(this.progress)),!1))}finish(){this.finished||(this.finished=!0,this.runtime.update(1),this.runtime.destroy(),this.snapshot?.destroy(!0),this.under.destroy({children:!0}),this.over.destroy({children:!0}),this.onDone?.())}},Qj=`mwg-pixel-art`,$j=new b(`renderer`);function eM(){if(document.getElementById(Qj))return;let e=document.createElement(`style`);e.id=Qj,e.textContent=`.${Qj} { image-rendering: pixelated; }`,document.head.appendChild(e)}function tM(e){let t=null,n=()=>{t=matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`),t.addEventListener(`change`,r,{once:!0})},r=()=>{e(),n()};return n(),()=>t?.removeEventListener(`change`,r)}var nM=class e{static{this.instance=null}constructor(t={}){this.app=new sD,this.elapsed=0,this.timeTotal=0,this.timeScale=1,this.onFrame=new p,this.hitStopRemaining=0,this.hitStopScale=0,this.stack=new h,this.pending=[],this.running=null,this.started=!1,this.stopWatchingDpr=null,this.stopWatchingVisibility=null,this.suspended_=!1,this.timeScaleBeforeSuspend=1,this.scaler=null,this.options={canvas:t.canvas??document.createElement(`canvas`),background:t.background??0,maxDelta:t.maxDelta??.25,pixelArt:t.pixelArt??!0,resizeTo:t.resizeTo??window,extensions:t.extensions??[],autoPause:t.autoPause??!0,audio:t.audio??null,qualityScaling:t.qualityScaling??null},this.options.pixelArt&&(No.defaultOptions.scaleMode=`nearest`),e.instance=this}get width(){return this.app.renderer.screen.width}get height(){return this.app.renderer.screen.height}static get active(){return e.instance}static get current(){if(!e.instance)throw Error(`no Game has been created yet`);return e.instance}async start(e){if(this.started)throw Error(`this Game has already been started`);this.started=!0;for(let e of this.options.extensions)e();if(gt(),await this.app.init({canvas:this.options.canvas,background:this.options.background,resizeTo:this.options.resizeTo,antialias:!1,preserveDrawingBuffer:!1,resolution:window.devicePixelRatio||1,autoDensity:!0}),this.options.canvas.isConnected||document.body.appendChild(this.options.canvas),this.options.pixelArt&&(eM(),this.options.canvas.classList.add(Qj)),this.app.renderer.on(`resize`,()=>{this.stack.resize(this.width,this.height),this.fitResolutionToDevice()}),this.fitResolutionToDevice(),this.stopWatchingDpr=tM(()=>{this.fitResolutionToDevice()}),this.options.autoPause&&typeof document<`u`){let e=()=>{document.hidden?this.suspend():this.resume()};document.addEventListener(`visibilitychange`,e),this.stopWatchingVisibility=()=>document.removeEventListener(`visibilitychange`,e)}this.expose(),this.switchNow(e),this.app.ticker.add(e=>this.frame(e.deltaMS/1e3))}switchScene(e,t){this.pending.push({kind:`switch`,next:e,transition:t})}transition(e,t){this.pending.push({kind:`swap`,swap:e,transition:t})}get transitioning(){return this.running!==null}pushScene(e){this.pending.push({kind:`push`,next:e})}popScene(e){this.pending.push({kind:`pop`,result:e})}get currentScene(){return this.stack.current}hitStop(e,t=0){this.hitStopRemaining=e,this.hitStopScale=t}step(e){this.frame(e),this.app.renderer.render(this.app.stage)}get suspended(){return this.suspended_}suspend(){this.suspended_||(this.suspended_=!0,this.timeScaleBeforeSuspend=this.timeScale,this.timeScale=0,this.stack.current?.onSuspend(),this.options.audio?.suspend())}resume(){this.suspended_&&(this.suspended_=!1,this.timeScale=this.timeScaleBeforeSuspend,this.stack.current?.onResume(void 0),this.options.audio?.resume())}expose(){let e=globalThis;e.__PIXI_APP__=this.app,e.__MWG__=this}fitResolutionToDevice(){let e=this.app.renderer.gl,t=e?e.getParameter(e.MAX_TEXTURE_SIZE):1/0,n=window.devicePixelRatio||1,r=Aj(this.width,this.height,n,t);!this.scaler&&this.options.qualityScaling&&(this.scaler=new jj({...this.options.qualityScaling,ceiling:r}));let i=this.scaler?this.scaler.setCeiling(r):r;i!==this.app.renderer.resolution&&($j.warn(`this device cannot render a ${this.width}x${this.height} canvas at ${n}x (its limit is ${t}); using ${r}x instead, which is softer than the display`),this.app.renderer.resize(this.width,this.height,i))}frame(e){this.pending.length>0&&this.endTransition();for(let e of this.pending)e.kind===`switch`?this.applySwitch(e.next,e.transition):e.kind===`swap`?this.applySwap(e.swap,e.transition):e.kind===`push`?this.applyPush(e.next):this.applyPop(e.result);this.pending.length=0,this.hitStopRemaining>0&&!this.suspended_&&(this.hitStopRemaining-=e,this.timeScale=this.hitStopRemaining>0?this.hitStopScale:1),this.running&&this.running.runner.update(e)&&this.endTransition();let t=this.running?.runner.pause===!0;this.elapsed=t?0:Math.min(e,this.options.maxDelta)*this.timeScale;let n=this.suspended_||this.elapsed<=0?null:this.scaler;if(n){let e=n.observe(this.elapsed);e!==this.app.renderer.resolution&&this.app.renderer.resize(this.width,this.height,e)}this.timeTotal+=this.elapsed,ot(),this.stack.update(this.elapsed),this.onFrame.dispatch(this.elapsed),Ke()}switchNow(e){this.applySwitch(e)}snapshot(e){return!e||br()?null:this.app.renderer.generateTexture(this.app.stage)}beginTransition(e,t){let n=new J;n.addChild(...this.app.stage.removeChildren());let r=new Zj(e,{width:this.width,height:this.height},t,n);this.app.stage.addChild(r.under,n,r.over),this.running={runner:r,wrapper:n}}endTransition(){let e=this.running;if(!e)return;this.running=null,e.runner.finish();let t=e.wrapper.removeChildren();this.app.stage.removeChildren(),this.app.stage.addChild(...t),e.wrapper.destroy()}applySwap(e,t){let n=this.snapshot(t);e(),n?this.beginTransition(t,n):t.onDone?.()}applySwitch(e,t){let n=this.snapshot(t),r=new e;this.stack.replace(r),this.app.stage.removeChildren(),this.app.stage.addChild(r.stage),this.elapsed=0,this.timeTotal=0,this.timeScale=1,r.resize(this.width,this.height),n&&t?this.beginTransition(t,n):t?.onDone?.()}applyPush(e){let t=new e;this.stack.push(t),this.app.stage.addChild(t.stage),this.elapsed=0,this.timeTotal=0,this.timeScale=1,t.resize(this.width,this.height)}applyPop(e){let t=this.stack.current;this.stack.pop(e),t&&this.app.stage.removeChild(t.stage)}destroy(){_t(),this.stopWatchingDpr?.(),this.stopWatchingVisibility?.(),this.stack.destroy(),this.onFrame.removeAll(),this.app.destroy(!0,{children:!0}),e.instance===this&&(e.instance=null)}},rM=class extends m{constructor(...e){super(...e),this.stage=new J}transitionTo(e,t){let n=nM.active;n?n.transition(e,t):e()}teardown(){this.stage.destroy({children:!0})}},iM={name:`color-add-bit`,vertex:{header:`
|
|
1346
|
+
`)}function uj(e,t,n,r,i){let{domElement:a,styleElement:o,svgRoot:s}=i;a.innerHTML=`<style>${t.cssStyle}</style><div style='padding:0;'>${e}</div>`,a.setAttribute(`style`,`transform: scale(${n});transform-origin: top left; display: inline-block`),o.textContent=r;let{width:c,height:l}=i.image;return s.setAttribute(`width`,c.toString()),s.setAttribute(`height`,l.toString()),new XMLSerializer().serializeToString(s)}fu();function dj(e,t){let n=du.getOptimalCanvasAndContext(e.width,e.height,t),{context:r}=n;return r.clearRect(0,0,e.width,e.height),r.drawImage(e,0,0),n}function fj(e,t,n){return new Promise(async r=>{n&&await new Promise(e=>setTimeout(e,100)),e.onload=()=>{r()},e.src=`data:image/svg+xml;charset=utf8,${encodeURIComponent(t)}`,e.crossOrigin=`anonymous`})}R(),fu(),fs(),Gd(),NS(),W(),ha(),Fu();var pj=class{constructor(e){this._activeTextures={},this._renderer=e,this._createCanvas=e.type===Wd.WEBGPU}getTexture(e){return this.getTexturePromise(e)}getManagedTexture(e){let t=e.styleKey;if(this._activeTextures[t])return this._increaseReferenceCount(t),this._activeTextures[t].promise;let n=this._buildTexturePromise(e).then(e=>(this._activeTextures[t].texture=e,e));return this._activeTextures[t]={texture:null,promise:n,usageCount:1},n}getReferenceCount(e){return this._activeTextures[e]?.usageCount??null}_increaseReferenceCount(e){this._activeTextures[e].usageCount++}decreaseReferenceCount(e){let t=this._activeTextures[e];t&&(t.usageCount--,t.usageCount===0&&(t.texture?this._cleanUp(t.texture):t.promise.then(e=>{t.texture=e,this._cleanUp(t.texture)}).catch(()=>{U(`HTMLTextSystem: Failed to clean texture`)}),this._activeTextures[e]=null))}getTexturePromise(e){return this._buildTexturePromise(e)}async _buildTexturePromise(e){let{text:t,style:n,resolution:r,textureStyle:i,autoGenerateMipmaps:a}=e,o=ma.get(ej),s=aj(t,n),c=await lj(s),l=nj(t,n,c,o),u=Math.ceil(Math.ceil(Math.max(1,l.width)+n.padding*2)*r),d=Math.ceil(Math.ceil(Math.max(1,l.height)+n.padding*2)*r),f=o.image;f.width=(u|0)+2,f.height=(d|0)+2,await fj(f,uj(t,n,r,c,o),MS()&&s.length>0);let p=f,m;this._createCanvas&&(m=dj(f,r));let h=Nu(m?m.canvas:p,f.width-2,f.height-2,r,a,i?.scaleMode);return this._renderer?.texture.initSource(h.source),this._createCanvas&&du.returnCanvasAndContext(m),ma.return(o),h}returnTexturePromise(e){e.then(e=>{this._cleanUp(e)}).catch(()=>{U(`HTMLTextSystem: Failed to clean texture`)})}_cleanUp(e){let t=e.source;ds.returnTexture(e),t.resource=null,t.uploadMethodId=`unknown`}destroy(){this._renderer=null;for(let e in this._activeTextures)this._activeTextures[e]&&this.returnTexturePromise(this._activeTextures[e].promise);this._activeTextures=null}};pj.extension={type:[I.WebGLSystem,I.WebGPUSystem,I.CanvasSystem],name:`htmlText`},R(),L.add(pj),L.add(ij),Po(),ko();var mj=class extends fA{constructor(...e){let t=pA(e,`HtmlText`);super(t,ZA),this.renderPipeId=`htmlText`,t.textureStyle&&(this.textureStyle=t.textureStyle instanceof Oo?t.textureStyle:new Oo(t.textureStyle),wA(this.textureStyle)),this.autoGenerateMipmaps=t.autoGenerateMipmaps??No.defaultOptions.autoGenerateMipmaps}updateBounds(){let e=this._bounds,t=this._anchor,{width:n,height:r}=nj(this.text,this._style);e.minX=-t._x*n,e.maxX=e.minX+n,e.minY=-t._y*r,e.maxY=e.minY+r}get text(){return this._text}set text(e){let t=this._sanitiseText(e.toString());super.text=t}_sanitiseText(e){return this._removeInvalidHtmlTags(e.replace(/<br>/gi,`<br/>`).replace(/<hr>/gi,`<hr/>`).replace(/ /gi,` `))}_removeInvalidHtmlTags(e){return e.replace(/<[^>]*?(?=<|$)/g,``)}};oa();var hj=class e extends Hk{constructor(...e){super({});let t=e[0]??{};typeof t==`number`&&(H(V,`PlaneGeometry constructor changed please use { width, height, verticesX, verticesY } instead`),t={width:t,height:e[1],verticesX:e[2],verticesY:e[3]}),this.build(t)}build(t){t={...e.defaultOptions,...t},this.verticesX=this.verticesX??t.verticesX,this.verticesY=this.verticesY??t.verticesY,this.width=this.width??t.width,this.height=this.height??t.height;let n=this.verticesX*this.verticesY,r=[],i=[],a=[],o=this.verticesX-1,s=this.verticesY-1,c=this.width/o,l=this.height/s;for(let e=0;e<n;e++){let t=e%this.verticesX,n=e/this.verticesX|0;r.push(t*c,n*l),i.push(t/o,n/s)}let u=o*s;for(let e=0;e<u;e++){let t=e%o,n=e/o|0,r=n*this.verticesX+t,i=n*this.verticesX+t+1,s=(n+1)*this.verticesX+t,c=(n+1)*this.verticesX+t+1;a.push(r,i,s,i,c,s)}this.buffers[0].data=new Float32Array(r),this.buffers[1].data=new Float32Array(i),this.indexBuffer.data=new Uint32Array(a),this.buffers[0].update(),this.buffers[1].update(),this.indexBuffer.update()}};hj.defaultOptions={width:100,height:100,verticesX:10,verticesY:10};var gj=hj;wo();var _j=class extends Kk{constructor(e){let{texture:t,verticesX:n,verticesY:r,...i}=e,a=new gj(Co({width:t.width,height:t.height,verticesX:n,verticesY:r}));super(Co({...i,geometry:a,texture:t})),this.texture=t,this.autoResize=!0}textureUpdated(){let e=this.geometry,{width:t,height:n}=this.texture;this.autoResize&&(e.width!==t||e.height!==n)&&(e.width=t,e.height=n,e.build({}))}set texture(e){this._texture?.off(`update`,this.textureUpdated,this),super.texture=e,e.on(`update`,this.textureUpdated,this),this.textureUpdated()}get texture(){return this._texture}destroy(e){this.texture.off(`update`,this.textureUpdated,this),super.destroy(e)}};R(),su(),to(),Ya();var vj=[[0,0],[0,0],[0,0]],yj=[[0,0],[0,0],[0,0]],bj=[[0,0],[0,0],[0,0]],xj=[[0,0],[0,0],[0,0]];function Sj(e,t,n,r,i,a,o){e[0][0]=t,e[0][1]=n,e[1][0]=r,e[1][1]=i,e[2][0]=a,e[2][1]=o}var Cj=class{constructor(e){this._renderer=e}validateRenderable(e){return!1}addRenderable(e,t){this._renderer.renderPipes.batch.break(t),t.add(e)}updateRenderable(e){}execute(e){let t=this._renderer,n=t.canvasContext,r=n.activeContext;r.save();let i=e.groupTransform,a=t._roundPixels|e._roundPixels;n.setContextTransform(i,a===1),n.setBlendMode(e.groupBlendMode);let o=t.globalUniforms.globalUniformData?.worldColor??4294967295,s=e.groupColorAlpha,c=(o>>>24&255)/255,l=(s>>>24&255)/255,u=t.filter?.alphaMultiplier??1,d=c*l*u;if(d<=0){r.restore();return}r.globalAlpha=d;let f=o&16777215,p=$a(Ja(s&16777215,f)),m=e.texture,h=X.getCanvasSource(m);if(!h){r.restore();return}let g=n.smoothProperty,_=m.source.style.scaleMode!==`nearest`;r[g]!==_&&(r[g]=_);let v=p!==16777215||m.rotate!==0,y=v?X.getTintedCanvas({texture:m},p):h,{leftWidth:b,topHeight:x,rightWidth:S,bottomHeight:C,width:ee,height:w}=e,T=b+S,E=x+C,te=Math.min(T>ee?ee/T:1,E>w?w/E:1,1),D=b*te,O=S*te,ne=x*te,k=C*te,A=Math.max(0,ee-D-O),re=Math.max(0,w-ne-k),ie=e.anchor,ae=m.source._resolution??m.source.resolution??1,oe=m.frame.x*ae,se=m.frame.y*ae,j=-ie.x*ee,ce=-ie.y*w,le=b*ae,ue=x*ae,de=S*ae,fe=C*ae,pe=m.frame.width*ae,me=m.frame.height*ae;v&&(oe=0,se=0,pe=y.width,me=y.height);let he=pe-le-de,ge=me-ue-fe,_e=he>0?oe+le:Math.max(oe,Math.min(oe+le,oe+pe-1)),ve=he>0?he:1,M=ge>0?se+ue:Math.max(se,Math.min(se+ue,se+me-1)),N=ge>0?ge:1;Sj(vj,oe,le,_e,ve,oe+pe-de,de),Sj(yj,se,ue,M,N,se+me-fe,fe),Sj(bj,j,D,j+D,A,j+ee-O,O),Sj(xj,ce,ne,ce+ne,re,ce+w-k,k);for(let e=0;e<3;e++){let t=bj[e][1];if(t<=0)continue;let n=vj[e][0],i=vj[e][1],a=bj[e][0];for(let e=0;e<3;e++){let o=xj[e][1];o<=0||r.drawImage(y,n,yj[e][0],i,yj[e][1],a,xj[e][0],t,o)}}r.restore()}destroy(){this._renderer=null}};Cj.extension={type:[I.CanvasPipes],name:`nineSliceSprite`};var wj=class e extends gj{constructor(t={}){t={...e.defaultOptions,...t},super({width:t.width,height:t.height,verticesX:4,verticesY:4}),this._trimX=0,this._trimY=0,this._trimWidth=t.originalWidth??e.defaultOptions.originalWidth,this._trimHeight=t.originalHeight??e.defaultOptions.originalHeight,this.update(t)}update(e){this.width=e.width??this.width,this.height=e.height??this.height,this._originalWidth=e.originalWidth??this._originalWidth,this._originalHeight=e.originalHeight??this._originalHeight,this._leftWidth=e.leftWidth??this._leftWidth,this._rightWidth=e.rightWidth??this._rightWidth,this._topHeight=e.topHeight??this._topHeight,this._bottomHeight=e.bottomHeight??this._bottomHeight,this._anchorX=e.anchor?.x,this._anchorY=e.anchor?.y,e.trim===void 0?(this._trimWidth=this._originalWidth,this._trimHeight=this._originalHeight):(this._trimX=e.trim?.x??0,this._trimY=e.trim?.y??0,this._trimWidth=e.trim?.width??this._originalWidth,this._trimHeight=e.trim?.height??this._originalHeight),this.updateUvs(),this.updatePositions()}updatePositions(){let e=this.positions,{width:t,height:n,_leftWidth:r,_rightWidth:i,_topHeight:a,_bottomHeight:o,_anchorX:s,_anchorY:c}=this,l=r+i,u=t>l?1:t/l,d=a+o,f=n>d?1:n/d,p=Math.min(u,f),m=s*t,h=c*n;e[0]=e[8]=e[16]=e[24]=-m,e[2]=e[10]=e[18]=e[26]=r*p-m,e[4]=e[12]=e[20]=e[28]=t-i*p-m,e[6]=e[14]=e[22]=e[30]=t-m,e[1]=e[3]=e[5]=e[7]=-h,e[9]=e[11]=e[13]=e[15]=a*p-h,e[17]=e[19]=e[21]=e[23]=n-o*p-h,e[25]=e[27]=e[29]=e[31]=n-h,this.getBuffer(`aPosition`).update()}updateUvs(){let e=this.uvs,t=this._originalWidth,n=this._originalHeight,r=this._trimX/t,i=this._trimY/n,a=(this._trimX+this._trimWidth)/t,o=(this._trimY+this._trimHeight)/n;e[0]=e[8]=e[16]=e[24]=r,e[1]=e[3]=e[5]=e[7]=i,e[6]=e[14]=e[22]=e[30]=a,e[25]=e[27]=e[29]=e[31]=o;let s=1/t,c=1/n;e[2]=e[10]=e[18]=e[26]=r+s*this._leftWidth,e[9]=e[11]=e[13]=e[15]=i+c*this._topHeight,e[4]=e[12]=e[20]=e[28]=a-s*this._rightWidth,e[17]=e[19]=e[21]=e[23]=o-c*this._bottomHeight,this.getBuffer(`aUV`).update()}};wj.defaultOptions={width:100,height:100,leftWidth:10,topHeight:10,rightWidth:10,bottomHeight:10,originalWidth:100,originalHeight:100};var Tj=wj;R(),cv();var Ej=class extends Uk{constructor(){super(),this.geometry=new Tj}destroy(){this.geometry.destroy()}},Dj=class{constructor(e){this._renderer=e,this._managedSprites=new sv({renderer:e,type:`renderable`,name:`nineSliceSprite`})}addRenderable(e,t){let n=this._getGpuSprite(e);e.didViewUpdate&&this._updateBatchableSprite(e,n),this._renderer.renderPipes.batch.addToBatch(n,t)}updateRenderable(e){let t=this._getGpuSprite(e);e.didViewUpdate&&this._updateBatchableSprite(e,t),t._batcher.updateElement(t)}validateRenderable(e){let t=this._getGpuSprite(e);return!t._batcher.checkAndUpdateTexture(t,e._texture)}_updateBatchableSprite(e,t){t.geometry.update(e),t.setTexture(e._texture)}_getGpuSprite(e){return e._gpuData[this._renderer.uid]||this._initGPUSprite(e)}_initGPUSprite(e){let t=e._gpuData[this._renderer.uid]=new Ej,n=t;return n.renderable=e,n.transform=e.groupTransform,n.texture=e._texture,n.roundPixels=this._renderer._roundPixels|e._roundPixels,this._managedSprites.add(e),e.didViewUpdate||this._updateBatchableSprite(e,n),t}destroy(){this._managedSprites.destroy(),this._renderer=null}};Dj.extension={type:[I.WebGLPipes,I.WebGPUPipes],name:`nineSliceSprite`},R(),L.add(Cj),L.add(Dj),Zi(),$o(),yc();var Oj=class e extends vc{constructor(t){t instanceof q&&(t={texture:t});let{width:n,height:r,anchor:i,leftWidth:a,rightWidth:o,topHeight:s,bottomHeight:c,texture:l,roundPixels:u,...d}=t;super({label:`NineSliceSprite`,...d}),this.renderPipeId=`nineSliceSprite`,this.batched=!0,this._leftWidth=a??l?.defaultBorders?.left??Tj.defaultOptions.leftWidth,this._topHeight=s??l?.defaultBorders?.top??Tj.defaultOptions.topHeight,this._rightWidth=o??l?.defaultBorders?.right??Tj.defaultOptions.rightWidth,this._bottomHeight=c??l?.defaultBorders?.bottom??Tj.defaultOptions.bottomHeight,this._width=n??l.width??Tj.defaultOptions.width,this._height=r??l.height??Tj.defaultOptions.height,this.allowChildren=!1,this.texture=l??e.defaultOptions.texture,this.roundPixels=u??!1,this._anchor=new Xi({_onUpdate:()=>{this.onViewUpdate()}}),i?this.anchor=i:this.texture.defaultAnchor&&(this.anchor=this.texture.defaultAnchor)}get anchor(){return this._anchor}set anchor(e){typeof e==`number`?this._anchor.set(e):this._anchor.copyFrom(e)}get width(){return this._width}set width(e){this._width=e,this.onViewUpdate()}get height(){return this._height}set height(e){this._height=e,this.onViewUpdate()}setSize(e,t){typeof e==`object`&&(t=e.height??e.width,e=e.width),this._width=e,this._height=t??e,this.onViewUpdate()}getSize(e){return e||={},e.width=this._width,e.height=this._height,e}get leftWidth(){return this._leftWidth}set leftWidth(e){this._leftWidth=e,this.onViewUpdate()}get topHeight(){return this._topHeight}set topHeight(e){this._topHeight=e,this.onViewUpdate()}get rightWidth(){return this._rightWidth}set rightWidth(e){this._rightWidth=e,this.onViewUpdate()}get bottomHeight(){return this._bottomHeight}set bottomHeight(e){this._bottomHeight=e,this.onViewUpdate()}get texture(){return this._texture}set texture(e){e||=q.EMPTY;let t=this._texture;t!==e&&(t&&t.dynamic&&t.off(`update`,this.onViewUpdate,this),e.dynamic&&e.on(`update`,this.onViewUpdate,this),this._texture=e,this.onViewUpdate())}get originalWidth(){return this._texture.width}get originalHeight(){return this._texture.height}get trim(){return this._texture.trim??null}destroy(e){if(super.destroy(e),typeof e==`boolean`?e:e?.texture){let t=typeof e==`boolean`?e:e?.textureSource;this._texture.destroy(t)}this._texture=null}updateBounds(){let e=this._bounds,t=this._anchor,n=this._width,r=this._height;e.minX=-t._x*n,e.maxX=e.minX+n,e.minY=-t._y*r,e.maxY=e.minY+r}};Oj.defaultOptions={texture:q.EMPTY};var kj=Oj;R(),nu(),xl(),B(),qi(),Pa(),Eg(),Xm(),$m(),sh(),mh(),Ng(),Af(),Of(),Lf(),rf(),g_(),Po(),$o(),tu(),xs(),TC(),TE(),Tl(),$D(),oO(),ri(),L.add(Gf,Jf);function Aj(e,t,n,r){let i=Math.max(e,t);return!Number.isFinite(r)||r<=0||!Number.isFinite(i)||i<=0||i*n<=r?n:Math.max(1,Math.floor(r/i))}var jj=class{constructor(e){this.over=0,this.under=0,this.ceiling=Mj(e.ceiling);let t=e.minRatio??1;this.floor=Math.min(Number.isFinite(t)&&t>0?t:1,this.ceiling);let n=e.targetFps??60;this.budget=Number.isFinite(n)&&n>0?1/n:1/60,this.downAfter=Nj(e.overBudgetFrames,60),this.upAfter=Nj(e.underBudgetFrames,600),this.step=Number.isFinite(e.step)&&e.step>0?e.step:.25,this.ratio_=this.ceiling}get ratio(){return this.ratio_}setCeiling(e){return this.ceiling=Mj(e),this.ratio_>this.ceiling&&(this.ratio_=this.ceiling,this.over=0,this.under=0),this.ratio_}observe(e){return!Number.isFinite(e)||e<=0||(e>this.budget?(this.over++,this.under=0,this.over>=this.downAfter&&this.ratio_>this.floor&&(this.ratio_=Math.max(this.floor,this.ratio_-this.step),this.over=0)):(this.under++,this.over=0,this.under>=this.upAfter&&this.ratio_<this.ceiling&&(this.ratio_=Math.min(this.ceiling,this.ratio_+this.step),this.under=0))),this.ratio_}reset(){this.ratio_=this.ceiling,this.over=0,this.under=0}};function Mj(e){return Number.isFinite(e)&&e>0?e:1}function Nj(e,t){return Number.isFinite(e)?Math.max(1,Math.floor(e)):t}function Pj(e,t){return t?!e||e.interrupt?`interrupt`:e.queue?`queue`:`ignore`:`apply`}var Fj=e=>Math.min(1,Math.max(0,e));function Ij(e,t,n=`diagonal`,r=1){let i=e*t,a=[],o=r>>>0||1;for(let r=0;r<t;r++)for(let i=0;i<e;i++)n===`diagonal`?a.push(i+r):n===`rows`?a.push(r*e+i):n===`spiral`?a.push(Math.min(i,r,e-1-i,t-1-r)):(o=Math.imul(o,1664525)+1013904223>>>0,a.push(o/2**32));let s=Math.min(...a),c=Math.max(...a);return a.map(e=>i===1||c===s?0:(e-s)/(c-s))}function Lj(e,t,n){let r=Fj(n);return Fj((t-e*r)/(1-r||1))}function Rj(e,t=1.08){let n=Fj(e);return n<.7?Er.easeOutCubic(n/.7)*t:t+(1-t)*Er.easeInOutQuad((n-.7)/.3)}function zj(e){return typeof e==`function`?e:Er[e??`easeInOutQuad`]}function Bj(e,t){return e??{x:t.width/2,y:t.height/2}}function Vj(e){if(!e.snapshot)return null;let t=new wl(e.snapshot);return t.width=e.width,t.height=e.height,t}function Hj(e,t,n){return{update:t,destroy(){n?.(),e.destroy({children:!0})}}}function Uj(e={}){let t=Math.max(1,Math.floor(e.columns??8)),n=Math.max(1,Math.floor(e.rows??5)),r=e.stagger??.5,i=e.rotation??0;return{name:`tileShrink`,start(a){let o=new J;a.over.addChild(o);let s=Ij(t,n,e.order??`diagonal`,e.seed),c=[],l=a.snapshot,u=a.width/t,d=a.height/n;if(l){let e=l.frame;for(let r=0;r<n;r++)for(let i=0;i<t;i++){let a=new G(e.x+i*e.width/t,e.y+r*e.height/n,e.width/t,e.height/n),s=new wl(new q({source:l.source,frame:a}));s.anchor.set(.5),s.width=u,s.height=d,s.position.set((i+.5)*u,(r+.5)*d),c.push({sprite:s,width:s.scale.x,height:s.scale.y}),o.addChild(s)}}return Hj(o,e=>{c.forEach(({sprite:t,width:n,height:a},o)=>{let c=1-Lj(s[o],e,r);t.scale.set(n*c,a*c),t.rotation=(1-c)*i,t.visible=c>0})})}}}function Wj(e={}){return{name:`shrink`,start(t){let n=new J;t.over.addChild(n);let r=Vj(t);r&&n.addChild(r);let i=Bj(e.to,t);return Hj(n,e=>{let t=1-e;n.scale.set(t),n.position.set(i.x*(1-t),i.y*(1-t)),n.alpha=1-e*e})}}}function Gj(e,t,n){return{name:e,start(e){let r=new J;e.under.addChild(r);let i=Vj(e);i&&r.addChild(i);let a=Bj(t,e),o=e.incoming;return Hj(r,e=>{let t=n(e);o.scale.set(t),o.position.set(a.x*(1-t),a.y*(1-t)),o.alpha=Fj(e*3)},()=>{o.scale.set(1),o.position.set(0,0),o.alpha=1})}}}function Kj(e={}){return Gj(`pop`,e.from,t=>Rj(t,e.overshoot))}function qj(e={}){return Gj(`grow`,e.from,e=>e)}function Jj(e={}){let t=e.direction??`left`,n=t===`left`?-1:+(t===`right`),r=t===`up`?-1:+(t===`down`);return{name:`slide`,start(e){let t=new J;e.over.addChild(t);let i=Vj(e);i&&t.addChild(i);let a=e.incoming;return Hj(t,i=>{t.position.set(n*e.width*i,r*e.height*i),a.position.set(-n*e.width*(1-i),-r*e.height*(1-i))},()=>a.position.set(0,0))}}}function Yj(e={}){return{name:`iris`,start(t){let n=new J;t.under.addChild(n);let r=Vj(t);r&&n.addChild(r);let i=Bj(e.from,t),a=Math.hypot(Math.max(i.x,t.width-i.x),Math.max(i.y,t.height-i.y)),o=new Z;return t.incoming.addChild(o),t.incoming.mask=o,Hj(n,e=>{o.clear().circle(i.x,i.y,a*e).fill({color:16777215})},()=>{t.incoming.mask=null,o.destroy()})}}}function Xj(){return{name:`dissolve`,start(e){let t=new J;e.over.addChild(t);let n=Vj(e);return n&&t.addChild(n),Hj(t,e=>{t.alpha=1-e})}}}function Zj(e,t,n=!1){let r=Fj(t),i=Er.easeOutCubic(r);return e===`pop`?{scale:n?i:Rj(r),alpha:Fj(r*3),offset:0}:e===`grow`?{scale:i,alpha:Fj(r*3),offset:0}:e===`slide`?{scale:1,alpha:i,offset:(1-i)*48}:{scale:1,alpha:i,offset:0}}var Qj=class{constructor(e,t,n,r){this.under=new J,this.over=new J,this.elapsed=0,this.finished=!1,this.snapshot=n,this.duration=Math.max(1e-4,e.duration??.5),this.ease=zj(e.easing),this.pause=e.pause??!1,this.onDone=e.onDone,this.runtime=e.transition.start({width:t.width,height:t.height,snapshot:n,incoming:r,under:this.under,over:this.over}),this.runtime.update(0)}get progress(){return this.finished?1:Math.min(1,this.elapsed/this.duration)}get done(){return this.finished}update(e){return this.finished?!0:(this.elapsed+=e,this.elapsed>=this.duration?(this.finish(),!0):(this.runtime.update(this.ease(this.progress)),!1))}finish(){this.finished||(this.finished=!0,this.runtime.update(1),this.runtime.destroy(),this.snapshot?.destroy(!0),this.under.destroy({children:!0}),this.over.destroy({children:!0}),this.onDone?.())}},$j=`mwg-pixel-art`,eM=new b(`renderer`);function tM(){if(document.getElementById($j))return;let e=document.createElement(`style`);e.id=$j,e.textContent=`.${$j} { image-rendering: pixelated; }`,document.head.appendChild(e)}function nM(e){let t=null,n=()=>{t=matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`),t.addEventListener(`change`,r,{once:!0})},r=()=>{e(),n()};return n(),()=>t?.removeEventListener(`change`,r)}var rM=class e{static{this.instance=null}constructor(t={}){this.app=new sD,this.elapsed=0,this.timeTotal=0,this.timeScale=1,this.onFrame=new p,this.hitStopRemaining=0,this.hitStopScale=0,this.stack=new h,this.pending=[],this.queued=[],this.running=null,this.started=!1,this.stopWatchingDpr=null,this.stopWatchingVisibility=null,this.suspended_=!1,this.timeScaleBeforeSuspend=1,this.scaler=null,this.options={canvas:t.canvas??document.createElement(`canvas`),background:t.background??0,maxDelta:t.maxDelta??.25,pixelArt:t.pixelArt??!0,resizeTo:t.resizeTo??window,extensions:t.extensions??[],autoPause:t.autoPause??!0,audio:t.audio??null,qualityScaling:t.qualityScaling??null},this.options.pixelArt&&(No.defaultOptions.scaleMode=`nearest`),e.instance=this}get width(){return this.app.renderer.screen.width}get height(){return this.app.renderer.screen.height}static get active(){return e.instance}static get current(){if(!e.instance)throw Error(`no Game has been created yet`);return e.instance}async start(e){if(this.started)throw Error(`this Game has already been started`);this.started=!0;for(let e of this.options.extensions)e();if(gt(),await this.app.init({canvas:this.options.canvas,background:this.options.background,resizeTo:this.options.resizeTo,antialias:!1,preserveDrawingBuffer:!1,resolution:window.devicePixelRatio||1,autoDensity:!0}),this.options.canvas.isConnected||document.body.appendChild(this.options.canvas),this.options.pixelArt&&(tM(),this.options.canvas.classList.add($j)),this.app.renderer.on(`resize`,()=>{this.stack.resize(this.width,this.height),this.fitResolutionToDevice()}),this.fitResolutionToDevice(),this.stopWatchingDpr=nM(()=>{this.fitResolutionToDevice()}),this.options.autoPause&&typeof document<`u`){let e=()=>{document.hidden?this.suspend():this.resume()};document.addEventListener(`visibilitychange`,e),this.stopWatchingVisibility=()=>document.removeEventListener(`visibilitychange`,e)}this.expose(),this.switchNow(e),this.app.ticker.add(e=>this.frame(e.deltaMS/1e3))}switchScene(e,t){this.pending.push({kind:`switch`,next:e,transition:t})}transition(e,t){this.pending.push({kind:`swap`,swap:e,transition:t})}get transitioning(){return this.running!==null||this.queued.length>0}pushScene(e){this.pending.push({kind:`push`,next:e})}popScene(e){this.pending.push({kind:`pop`,result:e})}get currentScene(){return this.stack.current}hitStop(e,t=0){this.hitStopRemaining=e,this.hitStopScale=t}step(e){this.frame(e),this.app.renderer.render(this.app.stage)}get suspended(){return this.suspended_}suspend(){this.suspended_||(this.suspended_=!0,this.timeScaleBeforeSuspend=this.timeScale,this.timeScale=0,this.stack.current?.onSuspend(),this.options.audio?.suspend())}resume(){this.suspended_&&(this.suspended_=!1,this.timeScale=this.timeScaleBeforeSuspend,this.stack.current?.onResume(void 0),this.options.audio?.resume())}expose(){let e=globalThis;e.__PIXI_APP__=this.app,e.__MWG__=this}fitResolutionToDevice(){let e=this.app.renderer.gl,t=e?e.getParameter(e.MAX_TEXTURE_SIZE):1/0,n=window.devicePixelRatio||1,r=Aj(this.width,this.height,n,t);!this.scaler&&this.options.qualityScaling&&(this.scaler=new jj({...this.options.qualityScaling,ceiling:r}));let i=this.scaler?this.scaler.setCeiling(r):r;i!==this.app.renderer.resolution&&(eM.warn(`this device cannot render a ${this.width}x${this.height} canvas at ${n}x (its limit is ${t}); using ${r}x instead, which is softer than the display`),this.app.renderer.resize(this.width,this.height,i))}frame(e){let t=this.pending.splice(0);for(let e of t)this.applyRequest(e);this.hitStopRemaining>0&&!this.suspended_&&(this.hitStopRemaining-=e,this.timeScale=this.hitStopRemaining>0?this.hitStopScale:1),this.running&&this.running.runner.update(e)&&(this.endTransition(),this.queued.length>0&&this.pending.push(...this.queued.splice(0)));let n=this.running?.runner.pause===!0;this.elapsed=n?0:Math.min(e,this.options.maxDelta)*this.timeScale;let r=this.suspended_||this.elapsed<=0?null:this.scaler;if(r){let e=r.observe(this.elapsed);e!==this.app.renderer.resolution&&this.app.renderer.resize(this.width,this.height,e)}this.timeTotal+=this.elapsed,ot(),this.stack.update(this.elapsed),this.onFrame.dispatch(this.elapsed),Ke()}switchNow(e){this.applySwitch(e)}snapshot(e){return!e||br()?null:this.app.renderer.generateTexture(this.app.stage)}beginTransition(e,t){let n=new J;n.addChild(...this.app.stage.removeChildren());let r=new Qj(e,{width:this.width,height:this.height},t,n);this.app.stage.addChild(r.under,n,r.over),this.running={runner:r,wrapper:n}}endTransition(){let e=this.running;if(!e)return;this.running=null,e.runner.finish();let t=e.wrapper.removeChildren();this.app.stage.removeChildren(),this.app.stage.addChild(...t),e.wrapper.destroy()}applyRequest(e){let t=Pj(e.kind===`switch`||e.kind===`swap`?e.transition:void 0,this.running!==null);t!==`ignore`&&(t===`queue`?this.queued.push(e):(t===`interrupt`&&this.endTransition(),e.kind===`switch`?this.applySwitch(e.next,e.transition):e.kind===`swap`?this.applySwap(e.swap,e.transition):e.kind===`push`?this.applyPush(e.next):this.applyPop(e.result)))}applySwap(e,t){let n=this.snapshot(t);e(),n?this.beginTransition(t,n):t.onDone?.()}applySwitch(e,t){let n=this.snapshot(t),r=new e;this.stack.replace(r),this.app.stage.removeChildren(),this.app.stage.addChild(r.stage),this.elapsed=0,this.timeTotal=0,this.timeScale=1,r.resize(this.width,this.height),n&&t?this.beginTransition(t,n):t?.onDone?.()}applyPush(e){let t=new e;this.stack.push(t),this.app.stage.addChild(t.stage),this.elapsed=0,this.timeTotal=0,this.timeScale=1,t.resize(this.width,this.height)}applyPop(e){let t=this.stack.current;this.stack.pop(e),t&&this.app.stage.removeChild(t.stage)}destroy(){_t(),this.stopWatchingDpr?.(),this.stopWatchingVisibility?.(),this.stack.destroy(),this.onFrame.removeAll(),this.app.destroy(!0,{children:!0}),e.instance===this&&(e.instance=null)}},iM=class extends m{constructor(...e){super(...e),this.stage=new J}transitionTo(e,t){let n=rM.active;n?n.transition(e,t):e()}teardown(){this.stage.destroy({children:!0})}},aM={name:`color-add-bit`,vertex:{header:`
|
|
1347
1347
|
in vec4 aColorAdd;
|
|
1348
1348
|
out vec4 vColorAdd;
|
|
1349
1349
|
`,main:`
|
|
@@ -1356,7 +1356,7 @@ fn mainFragment(
|
|
|
1356
1356
|
// a coloured halo where the sprite is empty.
|
|
1357
1357
|
float addedAlpha = finalColor.a + vColorAdd.a;
|
|
1358
1358
|
finalColor = vec4(finalColor.rgb + vColorAdd.rgb * addedAlpha, addedAlpha);
|
|
1359
|
-
`}},
|
|
1359
|
+
`}},oM={name:`color-add-bit`,vertex:{header:`
|
|
1360
1360
|
@in aColorAdd: vec4<f32>;
|
|
1361
1361
|
@out vColorAdd: vec4<f32>;
|
|
1362
1362
|
`,main:`
|
|
@@ -1366,24 +1366,24 @@ fn mainFragment(
|
|
|
1366
1366
|
`,end:`
|
|
1367
1367
|
let addedAlpha = finalColor.a + vColorAdd.a;
|
|
1368
1368
|
finalColor = vec4<f32>(finalColor.rgb + vColorAdd.rgb * addedAlpha, addedAlpha);
|
|
1369
|
-
`}},oM=class extends nf{constructor(e){super({glProgram:Ym({name:`color-transform-batch`,bits:[Qm,iM,ih(e),ph]}),gpuProgram:Jm({name:`color-transform-batch`,bits:[Zm,aM,nh(e),fh]}),resources:{batchSamplers:jg(e)}}),this.maxTextures=e}},sM=7,cM=class extends If{constructor(){let e=new kf({data:new Float32Array(1),label:`mwg-color-transform-attribute-buffer`,usage:Df.VERTEX|Df.COPY_DST,shrinkToFit:!1}),t=new kf({data:new Uint32Array(1),label:`mwg-color-transform-index-buffer`,usage:Df.INDEX|Df.COPY_DST,shrinkToFit:!1});super({attributes:{aPosition:{buffer:e,format:`float32x2`,stride:28,offset:0},aUV:{buffer:e,format:`float32x2`,stride:28,offset:8},aColor:{buffer:e,format:`unorm8x4`,stride:28,offset:16},aTextureIdAndRound:{buffer:e,format:`uint16x2`,stride:28,offset:20},aColorAdd:{buffer:e,format:`unorm8x4`,stride:28,offset:24}},indexBuffer:t})}},lM=0,uM=e=>e.colorAdd??lM;function dM(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h){e[n]=r*l+a*u+s,e[n+1]=o*u+i*l+c,e[n+2]=d,e[n+3]=f,t[n+4]=p,t[n+5]=m,t[n+6]=h}var fM=class e extends Tg{static{this.extension={type:[I.Batcher],name:`mwg-color-transform`}}constructor(t){super(t),this.geometry=new cM,this.name=e.extension.name,this.vertexSize=sM,this.shader=new oM(t.maxTextures)}packAttributes(e,t,n,r,i){let a=i<<16|e.roundPixels&65535,{a:o,b:s,c,d:l,tx:u,ty:d}=e.transform,{positions:f,uvs:p}=e,m=e.color,h=uM(e),g=e.attributeOffset,_=g+e.attributeSize;for(let e=g;e<_;e++){let i=e*2,g=f[i],_=f[i+1];t[r++]=o*g+c*_+u,t[r++]=l*_+s*g+d,t[r++]=p[i],t[r++]=p[i+1],n[r++]=m,n[r++]=a,n[r++]=h}}packQuadAttributes(e,t,n,r,i){let{a,b:o,c:s,d:c,tx:l,ty:u}=e.transform,{bounds:d}=e,f=e.texture.uvs,p=d.maxX,m=d.minX,h=d.maxY,g=d.minY,_=e.color,v=uM(e),y=i<<16|e.roundPixels&65535;dM(t,n,r,a,o,s,c,l,u,m,g,f.x0,f.y0,_,y,v),r+=sM,dM(t,n,r,a,o,s,c,l,u,p,g,f.x1,f.y1,_,y,v),r+=sM,dM(t,n,r,a,o,s,c,l,u,p,h,f.x2,f.y2,_,y,v),r+=sM,dM(t,n,r,a,o,s,c,l,u,m,h,f.x3,f.y3,_,y,v)}_updateMaxTextures(e){this.shader.maxTextures!==e&&(this.shader.destroy(),this.shader=new oM(e))}destroy(){this.shader.destroy(),super.destroy()}},pM=`mwg-tinted-sprite`;function mM(e){e.renderPipeId=pM}var hM=class{static{this.extension={type:[I.WebGLPipes,I.WebGPUPipes,I.CanvasPipes],name:pM}}constructor(e){this.renderer=e}addRenderable(e,t){let n=this.element(e);e.didViewUpdate&&this.sync(e,n),this.renderer.renderPipes.batch.addToBatch(n,t)}updateRenderable(e){let t=this.element(e);e.didViewUpdate&&this.sync(e,t),t._batcher.updateElement(t)}validateRenderable(e){let t=this.element(e);return!t._batcher.checkAndUpdateTexture(t,e.texture)}sync(e,t){t.bounds=e.visualBounds,t.texture=e.texture,t.colorAdd=e.colorAdd}element(e){let t=e._gpuData;return t[this.renderer.uid]??this.create(e,t)}create(e,t){let n=new gM;return n.renderable=e,n.transform=e.groupTransform,n.texture=e.texture,n.bounds=e.visualBounds,n.roundPixels=this.renderer._roundPixels|e._roundPixels,n.colorAdd=e.colorAdd,t[this.renderer.uid]=n,n}destroy(){this.renderer=null}},gM=class{constructor(){this.batcherName=fM.extension.name,this.topology=`triangle-list`,this.attributeSize=4,this.indexSize=6,this.packAsQuad=!0,this.roundPixels=0,this.colorAdd=0,this._attributeStart=0,this._textureId=0,this._indexStart=0,this._batcher=null,this._batch=null}get blendMode(){return this.renderable.groupBlendMode}get color(){return this.renderable.groupColorAlpha}reset(){this.renderable=null,this.texture=null,this._batcher=null,this._batch=null,this.bounds=null,this.colorAdd=0}destroy(){this.reset()}},_M=!1;function vM(){_M||(_M=!0,L.add(fM),L.add(hM))}function yM(e,t,n,r=0){return(xM(r)<<24|xM(n)<<16|xM(t)<<8|xM(e))>>>0}function bM(e,t){return yM((e>>16&255)/255*t,(e>>8&255)/255*t,(e&255)/255*t)}function xM(e){return Math.max(0,Math.min(255,Math.round(e*255)))}var SM=lM;vM();var CM=class extends wl{constructor(e){super(e),this._colorAdd=0,mM(this)}get colorAdd(){return this._colorAdd}set colorAdd(e){this._colorAdd!==e&&(this._colorAdd=e,this.onViewUpdate())}setColorAdd(e,t,n,r=0){this.colorAdd=yM(e,t,n,r)}lerpTint(e,t){let n=Math.round((1-t)*255);this.tint=n<<16|n<<8|n,this.colorAdd=bM(e,t)}silhouette(e){this.tint=0,this.colorAdd=bM(e,1)}resetColor(){this.tint=16777215,this.colorAdd=0}};function wM(e){return[e>>16&255,e>>8&255,e&255]}function TM(e){let[t,n,r]=wM(e);return Math.floor((t+n+r)/3)}function EM(e,t,n){return Math.trunc(n*e+(1-n)*t)}function DM(e,t,n){let[r,i,a]=wM(e),[o,s,c]=wM(t);return EM(r,o,n)<<16|EM(i,s,n)<<8|EM(a,c,n)}function OM(e,t){let n=e.length>0?TM(e[0]):255;return{from:e,to:e.map(e=>{let r=TM(e);return n!==0&&r<=n?DM(t.mid,t.min,r/n):DM(t.mid,t.max,(255-r)/(255-n))})}}function kM(e,t,n=`exact`){let r=t.from.map(wM),i=new Uint8ClampedArray(e.length);for(let a=0;a<e.length;a+=4){let o=e[a+3],s=e[a],c=e[a+1],l=e[a+2];if(i[a]=s,i[a+1]=c,i[a+2]=l,i[a+3]=o,o===0||r.length===0)continue;if(n===`exact`){let e=r.findIndex(([e,t,n])=>e===s&&t===c&&n===l);if(e<0)continue;let[n,o,u]=wM(t.to[e]??t.from[e]);i[a]=n,i[a+1]=o,i[a+2]=u;continue}let u=0,d=1/0;for(let e=0;e<r.length;e+=1){let[t,n,i]=r[e],a=s-t,o=c-n,f=l-i,p=a*a+o*o+f*f;p<d&&(d=p,u=e)}let[f,p,m]=wM(t.to[u]??t.from[u]);i[a]=f,i[a+1]=p,i[a+2]=m}return i}function AM(e,t,n){let r=e.width,i=e.height;if(r<=0||i<=0||!e.source)return e;let a=!t.createCanvas,o=t.createCanvas?.(r,i)??(typeof document>`u`?null:document.createElement(`canvas`));if(!o)return e;o.width=r,o.height=i;let s=o.getContext(`2d`);if(!s)return e;let c=a?{drawImage:s.drawImage.bind(s),getImageData:s.getImageData.bind(s),putImageData:(e,t,n)=>s.putImageData(new ImageData(new Uint8ClampedArray(e.data),e.width,e.height),t,n)}:s;return s.drawImage(e.source.resource,0,0),n(c,r,i),q.from(o)}function jM(e,t,n={},r=`exact`){return AM(e,n,(e,n,i)=>{let a=kM(e.getImageData(0,0,n,i).data,t,r);e.putImageData({data:a,width:n,height:i},0,0)})}function MM(e){e=e.replace(/^"|"$/g,``);let t=[],n=0,r=0;for(let i=0;i<e.length;i+=1)e[i]===`(`?r+=1:e[i]===`)`?r=Math.max(0,r-1):e[i]===`~`&&r===0&&(t.push(e.slice(n,i)),n=i+1);t.push(e.slice(n));let i=(t.shift()??``).trim(),a=[];for(let e of t){let t=/^([A-Za-z][A-Za-z0-9_-]*)(?:\((.*)\))?$/.exec(e.trim());t&&a.push({name:t[1].toUpperCase(),args:t[2]===void 0?[]:t[2].split(`,`).map(e=>e.trim())})}return{path:i,modifiers:a}}function NM(e,t){return e.modifiers.find(e=>e.name===t.toUpperCase())}function PM(e){return e!==void 0&&/^(linear|smooth)$/i.test(e)?`linear`:`nearest`}function FM(e,t,n){return[1,0,0,0,e/255,0,1,0,0,t/255,0,0,1,0,n/255,0,0,0,1,0]}function IM(e){return[(e.red??100)/100,0,0,0,0,0,(e.green??100)/100,0,0,0,0,0,(e.blue??100)/100,0,0,0,0,0,1,0]}function LM(e,t){let n=1-t,r=(e>>16&255)/255,i=(e>>8&255)/255,a=(e&255)/255;return[n,0,0,0,r*t,0,n,0,0,i*t,0,0,n,0,a*t,0,0,0,1,0]}function RM(e){let t=[`R`,`G`,`B`,`A`].map((t,n)=>e[n]??t),n=e=>{switch(e){case`R`:return[1,0,0,0,0];case`G`:return[0,1,0,0,0];case`B`:return[0,0,1,0,0];case`A`:return[0,0,0,1,0];case`0`:return[0,0,0,0,0];case`1`:return[0,0,0,0,1]}};return t.flatMap(e=>n(e))}function zM(e,t){let n=new Bk;n.matrix=t,e.filters=[n]}function BM(e){if(e===void 0)return;let t=e.trim(),n=t.endsWith(`%`),r=Number(n?t.slice(0,-1):t);if(Number.isFinite(r))return n||r>1?r/100:r}function VM(e){if(e===void 0)return;let t=Number.parseInt(e.replace(/^#/,``),16);return Number.isFinite(t)?t:void 0}function HM(e,t,n=1){let r=NM(t,`FL`);r&&(r.args.length===0||r.args.some(e=>/horiz|horizontal|x/i.test(e)))&&(e.scale.x*=-1),r?.args.some(e=>/vert|vertical|y/i.test(e))&&(e.scale.y*=-1);let i=NM(t,`SCALE`);if(i){let t=Number(i.args[0]),r=Number(i.args[1]??i.args[0]);Number.isFinite(t)&&t>0&&(e.width=t*n),Number.isFinite(r)&&r>0&&(e.height=r*n)}if(NM(t,`GS`)){let t=new Bk;t.greyscale(1,!1),e.filters=[...e.filters??[],t]}let a=NM(t,`CS`);if(a){let t=a.args.slice(0,3).map(Number);if(t.length===3&&t.every(e=>Number.isFinite(e))){let n=new Bk;n.matrix=FM(t[0],t[1],t[2]),e.filters=[...e.filters??[],n]}}let o=NM(t,`R`),s=NM(t,`G`),c=NM(t,`B`);if(o||s||c){let t=o?Number(o.args[0]):void 0,n=s?Number(s.args[0]):void 0,r=c?Number(c.args[0]):void 0,i=new Bk;i.matrix=IM({red:Number.isFinite(t)?t:void 0,green:Number.isFinite(n)?n:void 0,blue:Number.isFinite(r)?r:void 0}),e.filters=[...e.filters??[],i]}let l=NM(t,`CHAN`);if(l&&l.args.length>0){let t=l.args.map(e=>e.trim().toUpperCase()),n=new Bk;n.matrix=RM(t),e.filters=[...e.filters??[],n]}let u=NM(t,`O`);if(u){let t=BM(u.args[0]);t!==void 0&&(e.alpha*=Math.min(1,Math.max(0,t)))}}function UM(e,t,n={},r=1){e.texture=JM(e.texture,t,n),HM(e,t,r)}function WM(e,t){let n=NM(t,`CROP`);if(!n||n.args.length<4||!e.source)return e;let r=n.args.slice(0,4).map(Number);if(r.some(e=>!Number.isFinite(e))||r[2]<=0||r[3]<=0)return e;let i=Math.max(0,r[0]),a=Math.max(0,r[1]),o=Math.min(r[2],Math.max(0,e.width-i)),s=Math.min(r[3],Math.max(0,e.height-a));return o>0&&s>0?new q({source:e.source,frame:new G(i,a,o,s)}):e}function GM(e,t){let n=e.trim();return VM(n)??t?.(n)}function KM(e,t){let n=[],r=[];for(let i of e){let[e,a]=i.split(`>`);if(e===void 0||a===void 0)continue;let o=GM(e,t),s=GM(a,t);o!==void 0&&s!==void 0&&(n.push(o),r.push(s))}return{from:n,to:r}}function qM(e,t){let n=e.join(`,`),r=n.indexOf(`>`);if(r<0)return{from:[],to:[]};let i=e=>e.split(`,`).map(e=>GM(e,t)).filter(e=>e!==void 0);return{from:i(n.slice(0,r)),to:i(n.slice(r+1))}}function JM(e,t,n={}){let r=e,i=NM(t,`RC`);if(i&&i.args.length>0){let e=KM(i.args,n.resolveColor);e.from.length>0&&(r=jM(r,e,n,`exact`))}let a=NM(t,`PAL`);if(a){let e=qM(a.args,n.resolveColor);e.from.length>0&&e.from.length===e.to.length&&(r=jM(r,e,n,`exact`))}let o=NM(t,`BLIT`);if(o&&o.args.length>0&&n.resolveTexture){let e=n.resolveTexture(o.args[0]);if(e){let t=Number(o.args[1]??0)||0,i=Number(o.args[2]??0)||0;r=AM(r,n,n=>{n.drawImage(e.source.resource,t,i)})}}let s=NM(t,`MASK`);if(s&&s.args.length>0&&n.resolveTexture){let e=n.resolveTexture(s.args[0]);if(e){let t=Number(s.args[1]??0)||0,i=Number(s.args[2]??0)||0;r=AM(r,n,(r,a,o)=>{let s=r.getImageData(0,0,a,o),c=YM(e.width,e.height,n);if(!c)return;let l=c.getContext(`2d`);if(!l)return;l.drawImage(e.source.resource,0,0);let u=l.getImageData(0,0,e.width,e.height),d=XM(s.data,a,o,u.data,e.width,e.height,t,i);r.putImageData({data:d,width:a,height:o},0,0)})}}let c=NM(t,`BLEND`);if(c){let e=GM(c.args[0]??``,n.resolveColor),t=BM(c.args[1]);e!==void 0&&t!==void 0&&(r=AM(r,n,(n,r,i)=>{let a=ZM(n.getImageData(0,0,r,i).data,e,t);n.putImageData({data:a,width:r,height:i},0,0)}))}let l=NM(t,`ROTATE`);if(l){let e=Number(l.args[0]);if(Number.isFinite(e)&&e%360!=0){let t=r.width,i=r.height;if(t>0&&i>0&&r.source){let a=YM(t,i,n),o=a?.getContext(`2d`);if(a&&o){o.drawImage(r.source.resource,0,0);let a=QM(o.getImageData(0,0,t,i).data,t,i,e,PM(l.args[1])),s=YM(a.width,a.height,n),c=s?.getContext(`2d`);s&&c&&(c.putImageData({data:a.data,width:a.width,height:a.height},0,0),r=q.from(s))}}}}return r}function YM(e,t,n){let r=n.createCanvas?.(e,t)??(typeof document>`u`?null:document.createElement(`canvas`));return r?(r.width=e,r.height=t,r):null}function XM(e,t,n,r,i,a,o,s){let c=new Uint8ClampedArray(e.length);for(let l=0;l<n;l+=1)for(let n=0;n<t;n+=1){let u=(l*t+n)*4,d=n-o,f=l-s,p=d>=0&&d<i&&f>=0&&f<a?r[(f*i+d)*4+3]:0;c[u]=e[u],c[u+1]=e[u+1],c[u+2]=e[u+2],c[u+3]=Math.round(e[u+3]*p/255)}return c}function ZM(e,t,n){let r=Math.min(1,Math.max(0,n)),i=t>>16&255,a=t>>8&255,o=t&255,s=new Uint8ClampedArray(e.length);for(let t=0;t<e.length;t+=4){let n=e[t+3];s[t+3]=n,n===0?(s[t]=e[t],s[t+1]=e[t+1],s[t+2]=e[t+2]):(s[t]=e[t]*(1-r)+i*r,s[t+1]=e[t+1]*(1-r)+a*r,s[t+2]=e[t+2]*(1-r)+o*r)}return s}function QM(e,t,n,r,i=`nearest`){let a=r*Math.PI/180,o=Math.cos(a),s=Math.sin(a),c=t/2,l=n/2,u=0,d=0;for(let[e,t]of[[-c,-l],[c,-l],[c,l],[-c,l]])u=Math.max(u,Math.abs(e*o-t*s)),d=Math.max(d,Math.abs(e*s+t*o));let f=Math.max(1,Math.round(u*2)),p=Math.max(1,Math.round(d*2)),m=new Uint8ClampedArray(f*p*4),h=t/2-.5,g=n/2-.5,_=f/2-.5,v=p/2-.5,y=i===`linear`&&r%90!=0;for(let r=0;r<p;r+=1)for(let i=0;i<f;i+=1){let a=i-_,c=r-v,l=a*o+c*s+h,u=-a*s+c*o+g,d=(r*f+i)*4;if(y)$M(e,t,n,l,u,m,d);else{let r=Math.round(l),i=Math.round(u);if(r<0||r>=t||i<0||i>=n)continue;let a=(i*t+r)*4;m[d]=e[a],m[d+1]=e[a+1],m[d+2]=e[a+2],m[d+3]=e[a+3]}}return{data:m,width:f,height:p}}function $M(e,t,n,r,i,a,o){if(r<-.5||i<-.5||r>t-.5||i>n-.5)return;let s=Math.floor(r),c=Math.floor(i),l=r-s,u=i-c,d=0,f=0,p=0,m=0;for(let r=0;r<=1;r+=1)for(let i=0;i<=1;i+=1){let a=(i===0?1-l:l)*(r===0?1-u:u);if(a===0)continue;let o=kn(s+i,0,t-1),h=(kn(c+r,0,n-1)*t+o)*4,g=e[h+3];d+=g*a,f+=e[h]*g*a,p+=e[h+1]*g*a,m+=e[h+2]*g*a}d<=0||(a[o]=f/d,a[o+1]=p/d,a[o+2]=m/d,a[o+3]=d)}var eN=class{constructor(e,{fps:t=10,loop:n=!0,startTime:r=0}={}){if(e.length===0)throw Error(`an animation needs at least one frame`);if(!(t>0))throw Error(`an animation needs a positive fps, got ${t}`);this.frameDuration=1/t,this.frames=e.map(e=>tN(e)?e:{texture:e}),this.times=this.frames.map(e=>e.duration??this.frameDuration),this.loop=n,this.startTime=r;let i=0,a=0;for(let e of this.frames)e.duration===void 0?i++:a+=e.duration;this.duration=i*this.frameDuration+a}frameAt(e){return this.frames[this.frameIndexAt(e)]}frameIndexAt(e){let t=e-this.startTime;if(t<=0)return 0;let n=this.duration;if(n<=0)return this.frames.length-1;let r=this.loop?t%n:Math.min(t,n);for(let e=0;e<this.times.length;e++){if(r<this.times[e])return e;r-=this.times[e]}return this.frames.length-1}};function tN(e){return e.texture!==void 0}var nN=class extends CM{constructor(...e){super(...e),this.animations=new Map,this.current=null,this.currentName=null,this.elapsed=0,this.finished=!1,this.offset={x:0,y:0},this.onFinish=null,this.paused=!1}add(e,t,n){return this.animations.set(e,new eN(t,n)),this}has(e){return this.animations.has(e)}get playing(){return this.currentName}get isFinished(){return this.finished}get frameOffset(){return this.offset}get elapsedTime(){return this.elapsed}play(e,t=!1){if(!t&&this.currentName===e&&!this.finished)return this;let n=this.animations.get(e);if(!n)throw Error(`no animation named "${e}" on this sprite`);return this.current=n,this.currentName=e,this.elapsed=0,this.finished=!1,this.show(n.frameAt(0)),this}stop(){this.current=null,this.currentName=null}update(e){let t=this.current;!t||this.paused||this.finished||(this.elapsed+=e,this.show(t.frameAt(this.elapsed)),!t.loop&&this.elapsed>=t.startTime+t.duration&&(this.finished=!0,this.onFinish?.(this.currentName)))}show(e){this.texture=e.texture,this.offset.x=e.offsetX??0,this.offset.y=e.offsetY??0}};function rN(e,t,n,r){return t>=e.x-r&&t<=e.x+e.width+r&&n>=e.y-r&&n<=e.y+e.height+r}function iN(e,t,n,r=0){return rN(e.view,t,n,r)}var aN=class{constructor(){this.members=[]}get size(){return this.members.length}add(e){return this.members.includes(e)||this.members.push(e),this}remove(e){let t=this.members.indexOf(e);return t<0?!1:(this.members.splice(t,1),!0)}clear(){this.members.length=0}update(e,t,n=0){let r=e.view;for(let e of[...this.members])rN(r,e.x,e.y,n)&&e.update(t)}};function oN(e){for(let t of[`columns`,`rows`])if(!Number.isInteger(e[t])||e[t]<2)throw RangeError(`a pinned deform grid needs integer ${t} of at least 2, saw ${e[t]}`);for(let t of[`width`,`height`])if(!Number.isFinite(e[t])||e[t]<=0)throw RangeError(`a pinned deform grid needs ${t} above 0, saw ${e[t]}`)}function sN(e,t){if(!Number.isFinite(e)||!Number.isFinite(t))throw Error(`a deform control point needs finite coordinates, saw (${e}, ${t})`)}var cN=class{constructor(e){oN(e),this.columns=e.columns,this.rows=e.rows,this.width=e.width,this.height=e.height,this.rest=new Float32Array(this.count*2),this.offsets=new Float32Array(this.count*2);for(let e=0;e<this.rows;e++)for(let t=0;t<this.columns;t++){let n=(e*this.columns+t)*2;this.rest[n]=t/(this.columns-1)*this.width,this.rest[n+1]=e/(this.rows-1)*this.height}}get count(){return this.columns*this.rows}indexOf(e,t){if(!Number.isInteger(e)||!Number.isInteger(t)||e<0||t<0||e>=this.columns||t>=this.rows)throw RangeError(`control point (${e}, ${t}) is outside a ${this.columns}x${this.rows} grid`);return t*this.columns+e}checkIndex(e){if(!Number.isInteger(e)||e<0||e>=this.count)throw RangeError(`control point ${e} is outside a grid of ${this.count} points`)}restAt(e){return this.checkIndex(e),{x:this.rest[e*2],y:this.rest[e*2+1]}}at(e){return this.checkIndex(e),{x:this.rest[e*2]+this.offsets[e*2],y:this.rest[e*2+1]+this.offsets[e*2+1]}}isMoved(e){return this.checkIndex(e),this.offsets[e*2]!==0||this.offsets[e*2+1]!==0}movedCount(){let e=0;for(let t=0;t<this.count;t++)(this.offsets[t*2]!==0||this.offsets[t*2+1]!==0)&&e++;return e}drag(e,t,n){this.checkIndex(e),sN(t,n),this.offsets[e*2]=t-this.rest[e*2],this.offsets[e*2+1]=n-this.rest[e*2+1]}dragMany(e){for(let t of e)this.checkIndex(t.index),sN(t.x,t.y);for(let t of e)this.drag(t.index,t.x,t.y)}nudge(e,t,n){this.checkIndex(e),sN(t,n),this.offsets[e*2]+=t,this.offsets[e*2+1]+=n}reset(e){e===void 0?this.offsets.fill(0):(this.checkIndex(e),this.offsets[e*2]=0,this.offsets[e*2+1]=0)}rebase(e){if(!(e instanceof Float32Array)||e.length!==this.rest.length)throw Error(`rebase needs a Float32Array of ${this.rest.length} floats, saw length ${e?.length}`);for(let t of e)if(!Number.isFinite(t))throw Error(`rebase needs finite rest positions`);this.rest.set(e),this.offsets.fill(0)}positions(){let e=new Float32Array(this.rest.length);return this.writePositions(e),e}writePositions(e){if(!(e instanceof Float32Array)||e.length!==this.rest.length)throw Error(`a deform target needs a Float32Array of ${this.rest.length} floats, saw length ${e?.length}`);for(let t=0;t<this.rest.length;t++)e[t]=this.rest[t]+this.offsets[t]}},lN=class extends _j{constructor(e,t){let n=t?.columns??4,r=t?.rows??4,i=new cN({columns:n,rows:r,width:e.width,height:e.height});super({texture:e,verticesX:n,verticesY:r}),this.deform=i,this.autoResize=!1,this.deform.rebase(Float32Array.from(this.positionArray())),this.sync()}positionArray(){return this.geometry.getAttribute(`aPosition`).buffer.data}sync(){let e=this.geometry.getAttribute(`aPosition`);this.deform.writePositions(e.buffer.data),e.buffer.update()}get columns(){return this.deform.columns}get rows(){return this.deform.rows}get count(){return this.deform.count}indexOf(e,t){return this.deform.indexOf(e,t)}restAt(e){return this.deform.restAt(e)}vertexAt(e){return this.deform.at(e)}isMoved(e){return this.deform.isMoved(e)}movedCount(){return this.deform.movedCount()}dragVertex(e,t,n){this.deform.drag(e,t,n),this.sync()}dragVertices(e){this.deform.dragMany(e),this.sync()}nudgeVertex(e,t,n){this.deform.nudge(e,t,n),this.sync()}resetVertices(e){this.deform.reset(e),this.sync()}},uN=l({advance:()=>bN,advancePlayback:()=>gN,advancePose:()=>xN,boneOrder:()=>dN,create:()=>fN,createMixer:()=>_N,crossfadeTo:()=>vN,mixPoses:()=>yN,resolve:()=>pN,samplePose:()=>mN,sampleTransformPose:()=>hN,solveTwoBoneIK:()=>wN,validatePose:()=>CN});function dN(e){let t=new Map(e.bones.map(e=>[e.name,e])),n=[],r=new Set,i=new Set,a=e=>{if(!r.has(e.name)){if(i.has(e.name))throw Error(`skeleton cycle involving ${e.name}`);if(e.parent&&!t.has(e.parent))throw Error(`skeleton bone ${e.name} names no parent ${e.parent}`);if(e.parent){i.add(e.name);let n=t.get(e.parent);n&&a(n),i.delete(e.name)}r.has(e.name)||(r.add(e.name),n.push(e.name))}};for(let t of e.bones)a(t);return n}function fN(e){let t=new Set;for(let n of e){if(t.has(n.name))throw Error(`duplicate skeleton bone ${n.name}`);if(t.add(n.name),n.limits&&!(n.limits.min<=n.limits.max))throw Error(`invalid joint limits for bone ${n.name}`)}let n=dN({bones:e});for(let t of e)if(t.parent&&n.indexOf(t.parent)>=n.indexOf(t.name))throw Error(`skeleton bone ${t.name} cannot precede its parent ${t.parent}`);return{bones:e}}function pN(e,t={}){let n=typeof t.rotations==`object`?t.rotations:t,r=t.translations??{},i=t.scales??{},a=new Map(e.bones.map(e=>[e.name,e])),o=new Map;for(let t of dN(e)){let e=a.get(t);if(!e)throw Error(`skeleton bone ${t} went missing`);let s=e.parent?o.get(e.parent):void 0,c=(e.rotation??0)+(n[t]??0),l=(s?s.angle:0)+c,u=i[t]??{x:1,y:1},d=(s?s.scaleX:1)*u.x,f=(s?s.scaleY:1)*u.y,p=l*Math.PI/180,m={a:Math.cos(p)*d,b:Math.sin(p)*d,c:-Math.sin(p)*f,d:Math.cos(p)*f},h=s?{a:s.matrix.a,b:s.matrix.b,c:s.matrix.c,d:s.matrix.d}:{a:1,b:0,c:0,d:1},g=e.origin?.x??0,_=e.origin?.y??0,v=g+(r[t]?.x??0),y=_+(r[t]?.y??0),b=(s?s.tipX:0)+h.a*v+h.c*y,x=(s?s.tipY:0)+h.b*v+h.d*y;for(let e of[m.a,m.b,m.c,m.d])if(!Number.isFinite(e))throw Error(`invalid transform for bone ${t}`);o.set(t,{name:t,x:b,y:x,angle:l,scaleX:d,scaleY:f,matrix:m,tipX:b+m.a*(e.length??0),tipY:x+m.b*(e.length??0)})}return[...o.values()]}function mN(e,t,n){return{...hN(e,t,n).rotations}}function hN(e,t,n){let r=e.frames;if(!r.length)return n&&CN(n,{}),{rotations:{}};let i=e.loop&&e.duration>0?(t%e.duration+e.duration)%e.duration:t,a=r[0];if(!e.loop&&i>=e.duration)a=r[r.length-1];else if(i>=r[0].time){a=r[r.length-1];for(let e=1;e<r.length;e++)if(i<r[e].time){let t=r[e].time-r[e-1].time;a=SN(r[e-1],r[e],t>0?(i-r[e-1].time)/t:0,!0);break}}let o=SN(a,a,0,!0);return n&&CN(n,o.rotations),o}function gN(e,t){let n=e.clip,r=e.time+t*e.rate;return n.loop&&n.duration>0?(r%=n.duration,r<0&&(r+=n.duration)):r=Math.max(0,Math.min(n.duration,r)),{clip:n,time:r,rate:e.rate}}function _N(e,t,n=1){return{skeleton:e,base:{clip:t,time:0,rate:n},layers:[]}}function vN(e,t,n=.25,r=e.base.rate){n<=0?(e.base={clip:t,time:0,rate:r},e.crossfade=void 0):(e.crossfade={from:e.base,remaining:n,duration:n},e.base={clip:t,time:0,rate:r})}function yN(e,t){let n={rotations:e};for(let e of[...t].sort((e,t)=>e.priority-t.priority)){let t=Math.max(0,Math.min(1,e.weight));t&&(n=SN(n,{rotations:e.pose},t,!1))}return{...n.rotations}}function bN(e,t){return{...xN(e,t).rotations}}function xN(e,t){e.base=gN(e.base,t);for(let n of e.layers)n.playback=gN(n.playback,t);let n=hN(e.base.clip,e.base.time,e.skeleton);if(e.crossfade){let r=e.crossfade;r.from=gN(r.from,t),r.remaining=Math.max(0,r.remaining-t);let i=hN(r.from.clip,r.from.time,e.skeleton),a=r.duration>0?1-r.remaining/r.duration:1;n=SN(i,n,a,!0),r.remaining===0&&(e.crossfade=void 0)}for(let t of[...e.layers].sort((e,t)=>e.priority-t.priority))n=SN(n,hN(t.playback.clip,t.playback.time,e.skeleton),Math.max(0,Math.min(1,t.weight)),!1);return n}function SN(e,t,n,r){let i={...e.rotations};for(let a of new Set([...Object.keys(t.rotations),...r?Object.keys(e.rotations):[]]))i[a]=(e.rotations[a]??0)*(1-n)+(t.rotations[a]??0)*n;let a={rotations:i};for(let i of[`translations`,`scales`]){let o=e[i]??{},s=t[i]??{},c=+(i===`scales`),l={...o};for(let e of new Set([...Object.keys(s),...r?Object.keys(o):[]]))l[e]={x:(o[e]?.x??c)*(1-n)+(s[e]?.x??c)*n,y:(o[e]?.y??c)*(1-n)+(s[e]?.y??c)*n};Object.keys(l).length&&(a[i]=l)}return a}function CN(e,t){for(let n of e.bones){let e=(n.rotation??0)+(t[n.name]??0);if(!Number.isFinite(e))throw Error(`invalid rotation for bone ${n.name}`);if(n.limits&&(e<n.limits.min||e>n.limits.max))throw Error(`joint limit for bone ${n.name}: ${e} outside [${n.limits.min}, ${n.limits.max}]`)}}function wN(e,t,n,r,i=1,a={}){let o=e.bones.find(e=>e.name===t),s=e.bones.find(e=>e.name===n);if(!o||!s||s.parent!==t)throw Error(`IK chain ${t}/${n} must be connected`);if((s.origin?.x??0)!==0||(s.origin?.y??0)!==0)throw Error(`IK bone ${n} needs a zero origin`);let c=o.length??0,l=s.length??0;if(!(c>0&&l>0)||!Number.isFinite(c+l))throw Error(`IK chain ${t}/${n} needs positive finite lengths`);if(!Number.isFinite(r.x)||!Number.isFinite(r.y)||i!==1&&i!==-1)throw Error(`invalid IK target or bend for ${t}/${n}`);let u=pN(e,a),d=u.find(e=>e.name===t);if(!d)throw Error(`IK chain ${t}/${n} resolves no base`);let f=r.x-d.x,p=r.y-d.y,m=Math.hypot(f,p);if(m>c+l+1e-9||m<Math.abs(c-l)-1e-9)throw Error(`unreachable IK target for ${t}/${n}`);let h=i*Math.acos(Math.max(-1,Math.min(1,(m*m-c*c-l*l)/(2*c*l)))),g=Math.atan2(p,f)-Math.atan2(l*Math.sin(h),c+l*Math.cos(h)),_=o.parent?u.find(e=>e.name===o.parent):void 0,v=_?_.angle:0,y={...a,[t]:g*180/Math.PI-v-(o.rotation??0),[n]:h*180/Math.PI-(s.rotation??0)};return CN(e,y),y}var TN=class extends J{constructor(e,t){super(),this.parts=new Map,this.skeleton=e,this.mixer=t}bind(e,t){let n=new CM(t);return this.parts.set(e,n),this.addChild(n),n}part(e){return this.parts.get(e)}apply(e){let t=new Map(pN(this.skeleton,e).map(e=>[e.name,e]));for(let[e,n]of this.parts){let r=t.get(e);if(!r)throw Error(`skeletal sprite binds no bone named ${e}`);let{a:i,b:a,c:o,d:s}=r.matrix;n.setFromMatrix(new z(i,a,o,s,r.x,r.y))}if(this.diagnostics){this.setChildIndex(this.diagnostics,this.children.length-1);let e=this.diagnostics.clear();for(let n of t.values())e.moveTo(n.x,n.y).lineTo(n.tipX,n.tipY).stroke({color:65535,width:2}),e.circle(n.x,n.y,4).fill(16768256),e.circle(n.tipX,n.tipY,2).fill(16729224),e.moveTo(n.x-7,n.y).lineTo(n.x+7,n.y).moveTo(n.x,n.y-7).lineTo(n.x,n.y+7).stroke({color:16768256,width:1})}}setDiagnostics(e){e&&!this.diagnostics&&(this.diagnostics=this.addChild(new Z)),!e&&this.diagnostics&&(this.diagnostics.destroy(),this.diagnostics=void 0)}update(e){if(!this.mixer)throw Error(`a skeletal sprite without a mixer needs apply(pose)`);this.apply(bN(this.mixer,e))}},EN=class{constructor(e){if(this.points=[],this.previous=[],e.segments<2)throw Error(`an articulated chain needs at least two segments`);if(e.length<=0)throw Error(`an articulated chain needs a positive length`);this.length=e.length,this.stiffness=Math.max(0,Math.min(1,e.stiffness??1)),this.bendLimit=(e.bendLimit??90)*(Math.PI/180);for(let t=0;t<e.segments;t++)this.points.push({x:-t*e.length,y:0}),this.previous.push({x:-t*e.length,y:0})}pull(e,t){this.points[0].x=e,this.points[0].y=t}update(e){for(let e=0;e<this.points.length;e++)this.previous[e]={x:this.points[e].x,y:this.points[e].y};for(let e=1;e<this.points.length;e++){let t=this.previous[e-1],n=this.points[e],r=t.x-n.x,i=t.y-n.y,a=Math.hypot(r,i);if(a>this.length){let e=a>0?(a-this.length)/a:0;n.x+=r*e*this.stiffness,n.y+=i*e*this.stiffness}}for(let e=2;e<this.points.length;e++){let t=this.points[e-2],n=this.points[e-1],r=this.points[e],i=Math.atan2(n.y-t.y,n.x-t.x),a=Math.atan2(r.y-n.y,r.x-n.x)-i;for(;a>Math.PI;)a-=2*Math.PI;for(;a<-Math.PI;)a+=2*Math.PI;if(Math.abs(a)<=this.bendLimit)continue;let o=i+Math.sign(a)*this.bendLimit;r.x=n.x+Math.cos(o)*this.length,r.y=n.y+Math.sin(o)*this.length}}},DN=class extends J{constructor(e,t){if(super(),t.length!==e.points.length)throw Error(`a chain rig needs one texture per segment`);this.chain=e,this.segments=t.map(e=>{let t=new CM(e);return t.anchor.set(0,.5),this.addChild(t),t})}update(e){this.chain.update(e);for(let e=0;e<this.segments.length;e++){let t=this.chain.points[e],n=this.chain.points[e+1]??t;this.segments[e].position.set(t.x,t.y),this.segments[e].rotation=Math.atan2(n.y-t.y,n.x-t.x)}}},ON=``;function kN(e){ON=e.endsWith(`/`)||e===``?e:e+`/`}var AN;function jN(e){AN=e}function MN(){return AN||(typeof window>`u`?void 0:window.__MWG_ASSETS__)}function NN(){return MN()!==void 0}function PN(){return Object.keys(MN()??{})}function FN(e){let t=MN();return!t||e in t}function IN(e){if(/^(data|blob):/.test(e))return e;let t=MN();if(!t)return ON+e;let n=t[e];if(n===void 0)throw Error(`asset "${e}" is not in this build - check it is under the folder passed to compile-resources`);return n}var LN={"image/png":`png`,"image/jpeg":`jpg`,"image/webp":`webp`,"image/gif":`gif`,"image/svg+xml":`svg`};async function RN(e,t={}){let{onProgress:n,resolution:r,optional:i,onMissing:a}=typeof t==`function`?{onProgress:t,resolution:void 0,optional:void 0,onMissing:void 0}:t,o=new Set(i??[]),s=e.filter(e=>!Ik.cache.has(e)),c=s.filter(e=>!o.has(e)),l=s.filter(e=>o.has(e)),u=e=>{let t=IN(e),n={alias:e,src:t};if(r!==void 0&&(n.data={resolution:r}),t.startsWith(`data:`)){let r=/^data:([^;,]+)/.exec(t)?.[1],i=(r&&LN[r])??/\.([a-z0-9]+)$/i.exec(e)?.[1];i&&(n.format=i)}Ik.add(n)};if(l.length===0&&c.length===0){n?.(1);return}for(let e of c)u(e);let d=c.length>0?Ik.load(c,n):Promise.resolve(),f=l.map(async e=>{u(e);try{await Ik.load(e)}catch(t){a?.(e,t)}});await Promise.all([d,...f]),l.length>0&&c.length===0&&n?.(1)}function zN(e,t){if(!Ik.cache.has(e)){if(t!==void 0)return t;throw Error(`texture "${e}" has not been loaded - pass it to load() first`)}return Ik.get(e)}function BN(e,t){if(!Ik.cache.has(e)){if(t!==void 0)return t;throw Error(`asset "${e}" has not been loaded - pass it to load() first`)}return Ik.get(e)}function VN(e){return Ik.cache.has(e)}async function HN(e){let t=e.filter(e=>Ik.cache.has(e));t.length!==0&&await Ik.unload(t)}var UN=new Map;async function WN(e,t,n={}){let r=n.fetch??globalThis.fetch;if(!r)throw Error(`fetch is unavailable; provide LoadBinaryOptions.fetch`);let i=e.filter(e=>!UN.has(e));if(i.length===0){t?.(1);return}let a=0;await Promise.all(i.map(async e=>{let n=await r(IN(e));if(!n.ok)throw Error(`failed to load binary asset "${e}": ${n.status}`);UN.set(e,await n.arrayBuffer()),a++,t?.(a/i.length)}))}function GN(e){let t=UN.get(e);if(!t)throw Error(`binary asset "${e}" has not been loaded - pass it to loadBinary() first`);return t}function KN(e){return UN.has(e)}function qN(e){for(let t of e)UN.delete(t)}var JN=[{name:`<script>`,pattern:/<script[\s/>]/i},{name:`<foreignObject>`,pattern:/<foreignobject[\s/>]/i},{name:`<iframe>`,pattern:/<iframe[\s/>]/i},{name:`<embed>`,pattern:/<embed[\s/>]/i},{name:`<object>`,pattern:/<object[\s/>]/i},{name:`an event-handler attribute`,pattern:/\son[a-z]+\s*=/i},{name:`a javascript: URL`,pattern:/javascript\s*:/i},{name:`a data: URL of an active type`,pattern:/data:(?:text\/html|application\/xml|image\/svg\+xml)/i}];function YN(e){for(let{name:t,pattern:n}of JN)if(n.test(e))throw Error(`SVG refused: contains ${t}`);return e}function XN(e){return`data:image/svg\+xml,${encodeURIComponent(e)}`}function ZN(e,t){let n=YN(e);if(t.length===0)throw Error(`SVG scale variants need at least one named scale`);let r=new Set;for(let e of t){if(!e.name)throw Error(`an SVG scale variant needs a name`);if(!Number.isFinite(e.resolution)||e.resolution<=0)throw Error(`SVG scale variant ${e.name} needs a positive resolution`);if(r.has(e.name))throw Error(`duplicate SVG scale variant ${e.name}`);r.add(e.name)}let i=XN(n);return t.map(e=>({name:e.name,src:i,resolution:e.resolution}))}function QN(e){let t=YN(e),n=/^([\s\S]*?)<svg([^>]*)>/i.exec(t),r=t.lastIndexOf(`</svg>`);if(!n||r<0)throw Error(`SVG group split needs an <svg> root`);let i=t.slice(n[0].length,r),a=[...i.matchAll(/<(defs|style)\b[^>]*>[\s\S]*?<\/\1\s*>/gi)].map(e=>e[0]).join(``),o=i.replace(/<(defs|style)\b[^>]*>[\s\S]*?<\/\1\s*>/gi,``),s=Object.create(null),c=0;for(;c<o.length;){let e=/<g\b([^>]*?)(\/?)>/i.exec(o.slice(c));if(!e)break;let t=e[1],r=/\bid\s*=\s*["']([^"']+)["']/i.exec(t)?.[1],i=c+e.index+e[0].length;if(e[2]===`/`){if(!r)throw Error(`SVG group split refuses a group with no id`);if(r in s)throw Error(`SVG group split refuses a duplicate id ${r}`);s[r]=`${n[0]}${a}${e[0]}</svg>`,c=i;continue}let l=1,u=i,d=``;for(;l>0&&u<o.length;){let e=o.slice(u).match(/<g\b[^>]*>|<\/g\s*>/i);if(!e)throw Error(`SVG group ${r??`<unnamed>`} never closes`);e[0].startsWith(`</`)?(l--,l===0&&(d=e[0])):/\/\s*>$/.test(e[0])||l++,u+=e.index+e[0].length}if(l!==0)throw Error(`SVG group ${r??`<unnamed>`} never closes`);let f=o.slice(i,u-d.length);if(c=u,!r)throw Error(`SVG group split refuses a group with no id`);if(r in s)throw Error(`SVG group split refuses a duplicate id ${r}`);s[r]=`${n[0]}${a}${e[0]}${f}</g></svg>`}if(Object.keys(s).length===0)throw Error(`SVG group split found no named groups`);return s}var $N=class{constructor(e={}){if(this.entries=new Map,this.clock=0,this.budgetBytes=e.budgetBytes??1/0,!(this.budgetBytes>=0))throw Error(`asset stream budget must not be negative`);this.loadAssets=e.load??RN,this.releaseAssets=e.release??HN}async preload(e,t){if(!e.id)throw Error(`asset bundle needs an id`);if(e.estimatedBytes!==void 0&&e.estimatedBytes<0)throw Error(`asset bundle size must not be negative`);let n=this.entries.get(e.id);if(n?.ready){n.lastUsed=++this.clock,t?.(1);return}let r=e.paths.filter(e=>!this.isRetained(e));r.length>0?await this.loadAssets([...r],t):t?.(1),this.entries.set(e.id,{...e,lastUsed:++this.clock,ready:!0}),await this.enforceBudget(e.id)}async preloadLikely(e,t){let n=[...e].sort((e,t)=>(t.priority??0)-(e.priority??0));for(let[e,r]of n.entries())await this.preload(r,t&&(r=>t((e+r)/n.length)));t?.(1)}use(e){let t=this.entries.get(e);return t?.ready?(t.lastUsed=++this.clock,!0):!1}isReady(e){return this.entries.get(e)?.ready??!1}async unload(e){let t=this.entries.get(e);if(!t)return;this.entries.delete(e);let n=t.paths.filter(e=>!this.isRetained(e));n.length>0&&await this.releaseAssets(n)}get estimatedBytes(){return[...this.entries.values()].reduce((e,t)=>e+(t.estimatedBytes??0),0)}async enforceBudget(e){for(;this.estimatedBytes>this.budgetBytes;){let t=[...this.entries.values()].filter(t=>t.id!==e).sort((e,t)=>e.lastUsed-t.lastUsed)[0];if(!t)return;await this.unload(t.id)}}isRetained(e){return[...this.entries.values()].some(t=>t.ready&&t.paths.includes(e))}};async function eP(e,t,n=fetch){let r=await n(e);if(!r.ok)throw Error(`fetchWithByteProgress: ${e} responded ${r.status}`);let i=r.headers.get(`content-length`),a=i!==null&&i!==``?Number(i):null;if(!r.body){let e=await r.blob();return t?.({loaded:e.size,total:a??e.size}),e}let o=r.body.getReader(),s=[],c=0;for(;;){let{done:e,value:n}=await o.read();if(e)break;s.push(n),c+=n.byteLength,t?.({loaded:c,total:a})}return new Blob(s)}async function tP(e){if(e.trimStart().startsWith(`<`))return YN(e);let t=IN(e);if(t.startsWith(`data:`)){let n=t.indexOf(`,`);if(n<0)throw Error(`invalid SVG data URI for ${e}`);return YN(/;base64/i.test(t.slice(0,n))?new TextDecoder().decode(Uint8Array.from(atob(t.slice(n+1)),e=>e.charCodeAt(0))):decodeURIComponent(t.slice(n+1)))}let n=await fetch(t);if(!n.ok)throw Error(`SVG failed to load ${e}: ${n.status}`);return YN(await n.text())}var nP=new WeakMap;async function rP(e,t={}){let n=t.resolution??1;if(!Number.isFinite(n)||n<=0)throw Error(`SVG parts need a positive finite resolution`);let r=QN(await tP(e)),i=t.groups??Object.keys(r);for(let e of i)if(!Object.hasOwn(r,e))throw Error(`SVG parts unknown group ${e}`);let a=Object.create(null);for(let e of i){let t=XN(r[e].replace(`</svg>`,`<!-- mwg-resolution:${n} --></svg>`)),i=`mwg-svg-part:${n}:${t}`;a[e]=await Ik.load({alias:i,src:t,format:`svg`,data:{resolution:n}}),nP.set(a[e],i)}return Object.freeze(a)}async function iP(e){for(let t of new Set(Object.values(e))){let e=nP.get(t);e&&(await Ik.unload(e),nP.delete(t))}}var aP=l({AssetStream:()=>$N,fetchWithByteProgress:()=>eP,get:()=>BN,getBinary:()=>GN,has:()=>FN,isBinaryLoaded:()=>KN,isCompiled:()=>NN,isLoaded:()=>VN,load:()=>RN,loadBinary:()=>WN,loadSvgParts:()=>rP,paths:()=>PN,release:()=>HN,releaseBinary:()=>qN,releaseSvgParts:()=>iP,resolve:()=>IN,sanitizeSvg:()=>YN,setAssetMap:()=>jN,setBase:()=>kN,splitSvgGroups:()=>QN,svgDataUri:()=>XN,svgScaleVariants:()=>ZN,texture:()=>zN});function oP(e){return{x:e.x,y:e.y,width:e.width,height:e.height}}var sP=class e{constructor(e,t,n){this.frames=new Map,this.names=new Map,this.texture=e,this.frameWidth=t,this.frameHeight=n,this.columns=t>0?Math.floor(e.width/t):0,this.rows=n>0?Math.floor(e.height/n):0,t>0&&(e.width%t!==0||e.height%n!==0)&&console.warn(`sprite sheet ${e.width}x${e.height} is not a whole number of ${t}x${n} frames; the frames will be cut from the wrong places`)}static grid(t,n=0,r=n){return new e(zN(t),n,r)}static strip(t,n){if(!(n>0))throw Error(`a sprite strip needs at least one frame`);let r=zN(t);return new e(r,r.width/n,r.height)}static fromTexture(t,n=0,r=n){return new e(t,n,r)}get count(){return this.columns*this.rows}name(e,t){return this.names.set(e,t),this}nameAll(e){for(let[t,n]of Object.entries(e))this.names.set(t,n);return this}indexOf(e){let t=this.names.get(e);if(t===void 0)throw Error(`this sheet has no frame named "${e}"`);return t}get(e){let t=typeof e==`string`?this.indexOf(e):e,n=this.frames.get(t);if(n)return n;if(t<0||t>=this.count)throw Error(`frame ${t} is outside this sheet, which holds ${this.count}`);let r=new q({source:this.texture.source,frame:new G(t%this.columns*this.frameWidth,Math.floor(t/this.columns)*this.frameHeight,this.frameWidth,this.frameHeight)});return this.frames.set(t,r),r}rect(e,t,n,r,i){if(r<=0||i<=0)throw Error(`a sprite sheet rect needs a positive width and height`);return this.frames.set(e,new q({source:this.texture.source,frame:new G(t,n,r,i)})),this}region(e){let t=this.get(e);return{texture:t,frame:oP(t.frame)}}range(e,t){let n=[];for(let r=e;r<=t;r++)n.push(this.get(r));return n}pick(...e){return e.map(e=>this.get(e))}},cP=class{constructor(e={}){if(this.world=new J,this.x=0,this.y=0,this.requestedZoom=1,this.viewWidth=0,this.viewHeight=0,this.screenX=0,this.screenY=0,this.followTarget=null,this.followIntensity=0,this.shakeMagnitude=0,this.shakeRemaining=0,this.shakeDuration=1,this.shakeX=0,this.shakeY=0,this.bounds=null,this.step=0,this._angle=0,this.targetAngle=null,this.angleIntensity=0,e.grid!==void 0&&e.grid!==`square`&&e.grid!==`hex`)throw Error(`camera grid must be "square" or "hex", not "${e.grid}"`);this.stepsPerTurn=e.grid===`hex`?6:4,this.deadzone=e.deadzone??0,this.pixelPerfectTileSize=e.pixelPerfectTileSize,this.resolution=e.resolution??(()=>1),this.zoom=e.zoom??1}get rotationSteps(){return this.step}get rotation(){return this._angle}get uprightRotation(){return-this.rotation}setRotationStep(e){if(!Number.isInteger(e))throw Error(`camera rotation step must be an integer`);this.step=(e%this.stepsPerTurn+this.stepsPerTurn)%this.stepsPerTurn,this._angle=this.step/this.stepsPerTurn*Math.PI*2,this.targetAngle=null,this.apply()}rotate(e=1){this.setRotationStep(this.step+e)}rotateTo(e){this._angle=e,this.targetAngle=null,this.angleIntensity=0,this.apply()}animateRotationTo(e,t=4){this.targetAngle=e,this.angleIntensity=t}get spin(){let e=this.rotation;return{cos:Math.cos(e),sin:Math.sin(e)}}get zoom(){return this.pixelPerfectTileSize?uP(this.requestedZoom,this.pixelPerfectTileSize,this.resolution()):this.requestedZoom}set zoom(e){this.requestedZoom=Math.max(.01,e)}setViewport(e,t,n=0,r=0){this.viewWidth=e,this.viewHeight=t,this.screenX=n,this.screenY=r}fit(e,t){this.zoom=Math.min(this.viewWidth/e,this.viewHeight/t),this.snapTo(e/2,t/2)}get view(){let e=this.viewWidth/this.zoom,t=this.viewHeight/this.zoom,{x:n,y:r}=this.clampedCentre(this.x,this.y);if(this._angle===0)return{x:n-e/2,y:r-t/2,width:e,height:t};let i=[this.toWorld(this.screenX,this.screenY),this.toWorld(this.screenX+this.viewWidth,this.screenY),this.toWorld(this.screenX+this.viewWidth,this.screenY+this.viewHeight),this.toWorld(this.screenX,this.screenY+this.viewHeight)],a=i.map(e=>e.x),o=i.map(e=>e.y),s=Math.min(...a),c=Math.min(...o);return{x:s,y:c,width:Math.max(...a)-s,height:Math.max(...o)-c}}setBounds(e){this.bounds=e}snapTo(e,t){this.x=e,this.y=t,this.followTarget=null,this.followIntensity=0,this.apply()}panTo(e,t,n=4){this.followTarget={x:e,y:t},this.followIntensity=n}follow(e,t=8){this.followTarget=e,this.followIntensity=t}stopFollowing(){this.followTarget=null,this.followIntensity=0}shake(e,t=.4){br()||(this.shakeMagnitude=e,this.shakeRemaining=this.shakeDuration=t)}shakeScreen(e,t=.4){this.shake(e/this.zoom,t)}update(e){if(this.followTarget&&this.followIntensity>0){let t=this.viewWidth/this.zoom*this.deadzone/2,n=this.viewHeight/this.zoom*this.deadzone/2,r=this.followTarget.x-this.x,i=this.followTarget.y-this.y;r=r>t?r-t:r<-t?r+t:0,i=i>n?i-n:i<-n?i+n:0;let a=br()?1:1-Math.exp(-this.followIntensity*e);this.x+=r*a,this.y+=i*a}if(this.targetAngle!==null&&this.angleIntensity>0){let t=lP(this._angle,this.targetAngle),n=br()?1:1-Math.exp(-this.angleIntensity*e);this._angle+=t*n}if(this.shakeRemaining>0){this.shakeRemaining-=e;let t=Math.max(0,this.shakeRemaining/this.shakeDuration);this.shakeX=D(-this.shakeMagnitude,this.shakeMagnitude)*t,this.shakeY=D(-this.shakeMagnitude,this.shakeMagnitude)*t}else this.shakeX=this.shakeY=0;this.apply()}toScreen(e,t){let{x:n,y:r}=this.clampedCentre(this.x+this.shakeX,this.y+this.shakeY),{cos:i,sin:a}=this.spin,o=e-n,s=t-r;return{x:(o*i-s*a)*this.zoom+this.screenX+this.viewWidth/2,y:(o*a+s*i)*this.zoom+this.screenY+this.viewHeight/2}}toWorld(e,t){let{x:n,y:r}=this.clampedCentre(this.x+this.shakeX,this.y+this.shakeY),{cos:i,sin:a}=this.spin,o=(e-this.screenX-this.viewWidth/2)/this.zoom,s=(t-this.screenY-this.viewHeight/2)/this.zoom;return{x:n+o*i+s*a,y:r-o*a+s*i}}clampedCentre(e,t){if(!this.bounds)return{x:e,y:t};let n=this.viewWidth/this.zoom/2,r=this.viewHeight/this.zoom/2,{minX:i,minY:a,maxX:o,maxY:s}=this.bounds;return{x:o-i<n*2?(i+o)/2:kn(e,i+n,o-n),y:s-a<r*2?(a+s)/2:kn(t,a+r,s-r)}}apply(){let{x:e,y:t}=this.clampedCentre(this.x+this.shakeX,this.y+this.shakeY);this.world.scale.set(this.zoom),this._angle===0?(this.world.rotation=0,this.world.pivot.set(0,0),this.world.x=this.snapToDevice(this.screenX+this.viewWidth/2-e*this.zoom),this.world.y=this.snapToDevice(this.screenY+this.viewHeight/2-t*this.zoom)):(this.world.rotation=this.rotation,this.world.pivot.set(e,t),this.world.x=this.snapToDevice(this.screenX+this.viewWidth/2),this.world.y=this.snapToDevice(this.screenY+this.viewHeight/2))}snapToDevice(e){let t=this.resolution();return Math.round(e*t)/t}};function lP(e,t){let n=Math.PI*2,r=(t-e)%n;return r>Math.PI&&(r-=n),r<-Math.PI&&(r+=n),r}function uP(e,t,n=1){return Math.max(1,Math.round(e*t*n))/(t*n)}function dP(e={}){let t=nM.current,n=new cP({resolution:()=>t.app.renderer.resolution,...e});return n.setViewport(t.width,t.height),n}var fP=class{constructor(e){this.container=new J,this.clip=new Z,this.camera=new cP(e),this.container.addChild(this.camera.world),this.container.addChild(this.clip),this.container.mask=this.clip,this.resize(e.x,e.y,e.width,e.height)}resize(e,t,n,r){this.camera.setViewport(n,r,e,t),this.clip.clear().rect(e,t,n,r).fill(16777215)}update(e){this.camera.update(e)}};function pP(e,t){if(e>=t){let n=Math.floor(e/2);return[{x:0,y:0,width:n,height:t},{x:n,y:0,width:e-n,height:t}]}let n=Math.floor(t/2);return[{x:0,y:0,width:e,height:n},{x:0,y:n,width:e,height:t-n}]}var mP={protanopia:[.567,.433,0,0,0,.558,.442,0,0,0,0,.242,.758,0,0,0,0,0,1,0],deuteranopia:[.625,.375,0,0,0,.7,.3,0,0,0,0,.3,.7,0,0,0,0,0,1,0],tritanopia:[.95,.05,0,0,0,0,.433,.567,0,0,0,.475,.525,0,0,0,0,0,1,0]};function hP(e){let t=new Bk;return t.matrix=mP[e],t}function gP(e,t){let n=[];for(let r of e)t.has(r)||n.push(r);return n}function _P(e,t,n,r=`square`){return r===`hex`?$n(e,t,n,n):{x:(e+.5)*n,y:(t+.5)*n}}var vP=class extends J{constructor(e){super(),this.drawn=new Set,this.marker=new Z,this.widthInCells=e.widthInCells,this.cellSize=e.cellSize??2,this.shape=e.shape??`square`,this.renderTexture=h_.create({width:this.shape===`hex`?Math.ceil((e.widthInCells-1)*this.cellSize*.75+this.cellSize):e.widthInCells*this.cellSize,height:this.shape===`hex`?e.heightInCells*this.cellSize+this.cellSize/2:e.heightInCells*this.cellSize}),this.sprite=new wl(this.renderTexture),this.addChild(this.sprite),this.addChild(this.marker)}get exploredCount(){return this.drawn.size}sync(e,t){let n=gP(e,this.drawn);if(n.length===0)return;let r=new Z;for(let e of n){this.drawn.add(e);let n=e%this.widthInCells,i=Math.floor(e/this.widthInCells),a=_P(n,i,this.cellSize,this.shape);if(this.shape===`hex`){let e=this.cellSize/2,o=[];for(let t=0;t<6;t++){let n=Math.PI/3*t;o.push(a.x+Math.cos(n)*e,a.y+Math.sin(n)*e)}r.poly(o).fill({color:t(n,i)})}else r.rect(a.x-this.cellSize/2,a.y-this.cellSize/2,this.cellSize,this.cellSize).fill({color:t(n,i)})}nM.current.app.renderer.render({container:r,target:this.renderTexture,clear:!1}),r.destroy()}setMarker(e,t,n,r=16777215){this.setMarkers([{x:e,y:t,facing:n,color:r}])}setMarkers(e){this.marker.clear();for(let t of e){let e=t.color??16777215,n=_P(t.x,t.y,this.cellSize,this.shape);if(this.marker.circle(n.x,n.y,Math.max(1,this.cellSize)).fill({color:e}),t.facing!==void 0){let r=this.cellSize*2;this.marker.moveTo(n.x,n.y).lineTo(n.x+Math.cos(t.facing)*r,n.y+Math.sin(t.facing)*r).stroke({color:e,width:1})}}}reset(){this.drawn.clear(),nM.current.app.renderer.render({container:new J,target:this.renderTexture,clear:!0})}destroy(e){this.renderTexture.destroy(!0),super.destroy(e)}},yP=24,bP=48,xP=[0,16,48,80];function SP(e,t){if(!Number.isInteger(t))throw Error(`${e} must be an integer, got ${t}`)}function CP(e){if(e!==0&&e!==1&&e!==2&&e!==3)throw Error(`RPG Maker autotile slot must be 0, 1, 2, or 3, got ${e}`)}function wP(e){if(e.length===0)throw Error(`RPG Maker autotile shape table cannot be empty`);for(let t=0;t<e.length;t++){if(e[t].length!==4)throw Error(`RPG Maker autotile shape ${t} needs exactly 4 quadrants`);for(let n of e[t])if(n.length!==2||!n.every(Number.isInteger)||n.some(e=>e<0))throw Error(`RPG Maker autotile shape ${t} has an invalid quadrant offset`)}}function TP(e,t){let n=xP[t]+Math.floor(e/48),r=n%8,i=Math.floor(n/8);return t===0?[Math.floor(r/4)*8,i*6+Math.floor(r/2)%2*3]:t===1?[r*2,(i-2)*3]:t===2?[r*2,(i-6)*2]:[r*2,Math.floor((i-10)*2.5+(i%2==1?.5:0))]}function EP(e,t,n,r){if(SP(`RPG Maker autotile tileId`,e),e<0)throw Error(`RPG Maker autotile tileId must be non-negative, got ${e}`);if(CP(t),SP(`RPG Maker autotile shape`,n),wP(r),n<0||n>=r.length)throw Error(`RPG Maker autotile shape ${n} is outside the table, which holds ${r.length}`);let[i,a]=TP(e,t);return{tileId:e,slot:t,shape:n,destinationX:e%16*bP,destinationY:Math.floor(e/16)*bP,quadrants:r[n].map(([e,t],n)=>({sourceX:(i*2+e)*yP,sourceY:(a*2+t)*yP,destinationX:n%2*yP,destinationY:Math.floor(n/2)*yP}))}}var DP=class{constructor(e){this.cache=new Map,this.table=e,wP(e)}get(e,t,n){let r=`${e}:${t}:${n}`,i=this.cache.get(r);if(i)return i;let a=EP(e,t,n,this.table);return this.cache.set(r,a),a}clear(){this.cache.clear()}},OP=[2048,2816,4352,5888],kP=[768,1536,1536,2304];function AP(e){if(!Number.isInteger(e))return null;for(let t=0;t<4;t++)if(e>=OP[t]&&e<OP[t]+kP[t])return t;return null}var jP=[[[2,4],[1,4],[2,3],[1,3]],[[2,0],[1,4],[2,3],[1,3]],[[2,4],[3,0],[2,3],[1,3]],[[2,0],[3,0],[2,3],[1,3]],[[2,4],[1,4],[2,3],[3,1]],[[2,0],[1,4],[2,3],[3,1]],[[2,4],[3,0],[2,3],[3,1]],[[2,0],[3,0],[2,3],[3,1]],[[2,4],[1,4],[2,1],[1,3]],[[2,0],[1,4],[2,1],[1,3]],[[2,4],[3,0],[2,1],[1,3]],[[2,0],[3,0],[2,1],[1,3]],[[2,4],[1,4],[2,1],[3,1]],[[2,0],[1,4],[2,1],[3,1]],[[2,4],[3,0],[2,1],[3,1]],[[2,0],[3,0],[2,1],[3,1]],[[0,4],[1,4],[0,3],[1,3]],[[0,4],[3,0],[0,3],[1,3]],[[0,4],[1,4],[0,3],[3,1]],[[0,4],[3,0],[0,3],[3,1]],[[2,2],[1,2],[2,3],[1,3]],[[2,2],[1,2],[2,3],[3,1]],[[2,2],[1,2],[2,1],[1,3]],[[2,2],[1,2],[2,1],[3,1]],[[2,4],[3,4],[2,3],[3,3]],[[2,4],[3,4],[2,1],[3,3]],[[2,0],[3,4],[2,3],[3,3]],[[2,0],[3,4],[2,1],[3,3]],[[2,4],[1,4],[2,5],[1,5]],[[2,0],[1,4],[2,5],[1,5]],[[2,4],[3,0],[2,5],[1,5]],[[2,0],[3,0],[2,5],[1,5]],[[0,4],[3,4],[0,3],[3,3]],[[2,2],[1,2],[2,5],[1,5]],[[0,2],[1,2],[0,3],[1,3]],[[0,2],[1,2],[0,3],[3,1]],[[2,2],[3,2],[2,3],[3,3]],[[2,2],[3,2],[2,1],[3,3]],[[2,4],[3,4],[2,5],[3,5]],[[2,0],[3,4],[2,5],[3,5]],[[0,4],[1,4],[0,5],[1,5]],[[0,4],[3,0],[0,5],[1,5]],[[0,2],[3,2],[0,3],[3,3]],[[0,2],[1,2],[0,5],[1,5]],[[0,4],[3,4],[0,5],[3,5]],[[2,2],[3,2],[2,5],[3,5]],[[0,2],[3,2],[0,5],[3,5]],[[0,0],[1,0],[0,1],[1,1]]],MP=[[[2,2],[1,2],[2,1],[1,1]],[[0,2],[1,2],[0,1],[1,1]],[[2,0],[1,0],[2,1],[1,1]],[[0,0],[1,0],[0,1],[1,1]],[[2,2],[3,2],[2,1],[3,1]],[[0,2],[3,2],[0,1],[3,1]],[[2,0],[3,0],[2,1],[3,1]],[[0,0],[3,0],[0,1],[3,1]],[[2,2],[1,2],[2,3],[1,3]],[[0,2],[1,2],[0,3],[1,3]],[[2,0],[1,0],[2,3],[1,3]],[[0,0],[1,0],[0,3],[1,3]],[[2,2],[3,2],[2,3],[3,3]],[[0,2],[3,2],[0,3],[3,3]],[[2,0],[3,0],[2,3],[3,3]],[[0,0],[3,0],[0,3],[3,3]]],NP=[[26,27,32,33],[4,27,32,33],[26,5,32,33],[4,5,32,33],[26,27,32,11],[4,27,32,11],[26,5,32,11],[4,5,32,11],[26,27,10,33],[4,27,10,33],[26,5,10,33],[4,5,10,33],[26,27,10,11],[4,27,10,11],[26,5,10,11],[4,5,10,11],[24,25,30,31],[24,5,30,31],[24,25,30,11],[24,5,30,11],[14,15,20,21],[14,15,20,11],[14,15,10,21],[14,15,10,11],[28,29,34,35],[28,29,10,35],[4,29,34,35],[4,29,10,35],[38,39,44,45],[4,39,44,45],[38,5,44,45],[4,5,44,45],[24,29,30,35],[14,15,44,45],[12,13,18,19],[12,13,18,11],[16,17,22,23],[16,17,10,23],[40,41,46,47],[4,41,46,47],[36,37,42,43],[36,5,42,43],[12,17,18,23],[12,13,42,43],[36,41,42,47],[16,17,46,47],[12,17,42,47],[0,1,6,7]],PP=[46,44,46,44,43,41,43,40,46,44,46,44,43,41,43,40,42,32,42,32,35,19,35,18,42,32,42,32,34,17,34,16,46,44,46,44,43,41,43,40,46,44,46,44,43,41,43,40,42,32,42,32,35,19,35,18,42,32,42,32,34,17,34,16,45,39,45,39,33,31,33,29,45,39,45,39,33,31,33,29,37,27,37,27,23,15,23,13,37,27,37,27,22,11,22,9,45,39,45,39,33,31,33,29,45,39,45,39,33,31,33,29,36,26,36,26,21,7,21,5,36,26,36,26,20,3,20,1,46,44,46,44,43,41,43,40,46,44,46,44,43,41,43,40,42,32,42,32,35,19,35,18,42,32,42,32,34,17,34,16,46,44,46,44,43,41,43,40,46,44,46,44,43,41,43,40,42,32,42,32,35,19,35,18,42,32,42,32,34,17,34,16,45,38,45,38,33,30,33,28,45,38,45,38,33,30,33,28,37,25,37,25,23,14,23,12,37,25,37,25,22,10,22,8,45,38,45,38,33,30,33,28,45,38,45,38,33,30,33,28,36,24,36,24,21,6,21,4,36,24,36,24,20,2,20,0];function FP(e){return!Number.isInteger(e)||e<=0||e>=384?null:{index:Math.floor(e/48),pattern:e%48}}function IP(e){let t=0;return e(0,-1)&&(t|=1),e(1,-1)&&(t|=2),e(1,0)&&(t|=4),e(1,1)&&(t|=8),e(0,1)&&(t|=16),e(-1,1)&&(t|=32),e(-1,0)&&(t|=64),e(-1,-1)&&(t|=128),PP[t]}var LP=[16,32,32,48];function RP(e){if(e.format===`rpgm-mv`){if(CP(e.slot),wP(e.table),e.tableEdge&&e.slot!==1)throw Error(`a table-edge layout needs slot 1 (A2), got slot ${e.slot}`);let t=LP[e.slot],n=xP[e.slot];for(let r of e.cycles){if(r.length===0)throw Error(`an autotile animation cycle needs at least one kind`);for(let i of r)if(!Number.isInteger(i)||i<n||i>=n+t)throw Error(`animation cycle kind ${i} is outside slot ${e.slot}'s kinds ${n}-${n+t-1}`)}}else{if(!Number.isInteger(e.index)||e.index<0||e.index>7)throw Error(`an XP autotile index must be 0-7, got ${e.index}`);if(!Number.isInteger(e.frames)||e.frames<1)throw Error(`an XP autotile frame count must be at least 1, got ${e.frames}`)}}var zP=24,BP=16,VP=6,HP=96,UP=32;function WP(e,t,n){if(t<=0)return null;if(!Number.isInteger(n)||n<0)throw Error(`an autotile animation frame must be an integer at or above zero, got ${n}`);return e.format===`rpgm-mv`?KP(e,t,n):qP(e,t,n)}function GP(e,t){let n=xP[e.slot]+Math.floor(t/48),r=t%48%e.table.length,i=n%8*2,a=(Math.floor(n/8)-2)*3,o=zP/2;return[2,3].map((t,n)=>{let[s,c]=e.table[r][t];return{sourceX:(i*2+s)*zP,sourceY:(a*2+c)*zP+o,sourceWidth:zP,sourceHeight:o,destX:n/2,destY:0,destWidth:1/2,destHeight:1/4}})}function KP(e,t,n){let r=OP[e.slot],i=kP[e.slot];if(!Number.isInteger(t)||t<r||t>=r+i)throw Error(`tile ${t} is outside slot ${e.slot}'s ids ${r}-${r+i-1}`);let a=t-r;if(e.tableEdge)return GP(e,a);let o=xP[e.slot]+Math.floor(a/48),s=e.tableFor?e.tableFor(o):e.table,c=a%48%s.length;for(let t of e.cycles){let e=t.indexOf(o);if(e>=0){o=t[(e+n)%t.length];break}}return EP((o-xP[e.slot])*48+a%48,e.slot,c,s).quadrants.map((e,t)=>({sourceX:e.sourceX,sourceY:e.sourceY,sourceWidth:zP,sourceHeight:zP,destX:t%2/2,destY:Math.floor(t/2)/2,destWidth:1/2,destHeight:1/2}))}function qP(e,t,n){if(!Number.isInteger(t)||t<e.index*48||t>=e.index*48+48||t<=0)throw Error(`tile ${t} is outside XP autotile ${e.index}'s ids ${e.index*48}-${e.index*48+47}`);if(e.single)return[{sourceX:n%e.frames*UP,sourceY:0,sourceWidth:UP,sourceHeight:UP,destX:0,destY:0,destWidth:1,destHeight:1}];let r=NP[t%48],i=n%e.frames*HP;return r.map((e,t)=>({sourceX:e%VP*BP+i,sourceY:Math.floor(e/VP)*BP,sourceWidth:BP,sourceHeight:BP,destX:t%2/2,destY:Math.floor(t/2)/2,destWidth:1/2,destHeight:1/2}))}var JP=128;function YP(e){let t=new Int32Array(e.width*e.height),n=t=>AP(t)===1&&((e.flags[t]??0)&JP)!==0;for(let r=1;r<e.height;r++)for(let i=0;i<e.width;i++){let a=r*e.width+i,o=e.objects[a-e.width]??0;if(!n(o)||n(e.objects[a]??0))continue;let s=AP(e.ground[a]??0);s!==2&&s!==3&&(t[a]=o)}return t}var XP=-1,ZP=7237230,QP=10132122;function $P(e,t){if(!Number.isInteger(e)||e<0||e>=4096)throw Error(`tileFrame needs a sheet index from 0 to 4095, got ${e}`);if(!Number.isInteger(t)||t<0||t>=1<<20)throw Error(`tileFrame needs a frame index from 0 to ${(1<<20)-1}, got ${t}`);return e<<20|t}function eF(e){return e>>>20}function tF(e){return e&(1<<20)-1}var nF=class extends J{constructor(e){if(super(),this.layers=[],this.layersByName=new Map,this.chunks=[],this.widthInTiles=e.width,this.heightInTiles=e.height,this.sheets=Array.isArray(e.sheet)?[...e.sheet]:[e.sheet],this.sheets.length===0)throw Error(`a TileMap needs at least one sheet`);if(this.tileWidth=e.tileWidth??this.sheets[0].frameWidth,this.tileHeight=e.tileHeight??this.sheets[0].frameHeight,this.shape=e.shape??`square`,this.heightStep=e.heightStep??this.tileHeight/2,!(this.heightStep>0))throw Error(`a TileMap's heightStep must be a positive number, got ${e.heightStep}`);this.chunkSize=e.chunkSize??16,this.chunkColumns=Math.ceil(this.widthInTiles/this.chunkSize),this.chunkRows=Math.ceil(this.heightInTiles/this.chunkSize);let t=this.widthInTiles*this.heightInTiles;this.cellTint=new Uint32Array(t).fill(16777215),this.cellAdd=new Uint32Array(t),this.cellHeight=new Int32Array(t),this.faces=Array(t).fill(null)}get layerCount(){return this.layers.length}get worldWidth(){switch(this.shape){case`square`:return this.widthInTiles*this.tileWidth;case`hex`:return this.widthInTiles<=0?0:(this.widthInTiles-1)*this.tileWidth*.75+this.tileWidth;case`isometric`:return(this.widthInTiles+this.heightInTiles)*(this.tileWidth/2);case`staggered`:return this.widthInTiles*this.tileWidth+this.tileWidth/2}}get worldHeight(){switch(this.shape){case`square`:return this.heightInTiles*this.tileHeight;case`hex`:return this.heightInTiles*this.tileHeight+this.tileHeight/2;case`isometric`:return(this.widthInTiles+this.heightInTiles)*(this.tileHeight/2);case`staggered`:return this.heightInTiles*(this.tileHeight/2)+this.tileHeight/2}}inside(e,t){return e>=0&&t>=0&&e<this.widthInTiles&&t<this.heightInTiles}index(e,t){return t*this.widthInTiles+e}addLayer(e,t){let{cells:n,container:r,chunks:i}=this.beginLayer(e,t?.length),a={kind:`tiles`,name:e,data:t?Int32Array.from(t):new Int32Array(n).fill(-1),sprites:Array(n).fill(null),container:r};this.layers.push(a),this.layersByName.set(e,a),this.chunks.push(i),this.addChild(r);let o=this.layers.length===1;for(let e=0;e<this.heightInTiles;e++)for(let t=0;t<this.widthInTiles;t++){let n=a.data[this.index(t,e)];n!==-1&&this.buildSprite(a,t,e,n),o&&this.syncFaces(t,e)}return this}beginLayer(e,t){if(this.layersByName.has(e))throw Error(`this map already has a layer named "${e}"`);let n=this.widthInTiles*this.heightInTiles;if(t!==void 0&&t!==n)throw Error(`layer "${e}" has ${t} cells, but the map has ${n}`);let r=new J,i=[];for(let e=0;e<this.chunkColumns*this.chunkRows;e++){let e=new J;i.push(e),r.addChild(e)}return{cells:n,container:r,chunks:i}}addAutotileLayer(e,t,n){let r=Array.isArray(n)?n:[n];if(r.length===0)throw Error(`autotile layer "${e}" needs at least one set`);let{cells:i,container:a,chunks:o}=this.beginLayer(e,t.length),s=r.map((t,n)=>this.resolveAutotileSet(e,t,n)),c=new Set;for(let t of s){let n=t.layout.format===`rpgm-mv`?`slot ${t.layout.slot}`:`autotile ${t.layout.index}`;if(c.has(n))throw Error(`autotile layer "${e}" has two sets for ${n}`);c.add(n)}let l=0;r.forEach((t,n)=>{let r=t.animationFrame??0;if(!Number.isInteger(r)||r<0)throw Error(`autotile layer "${e}" set ${n} starts at an invalid animation frame, got ${t.animationFrame}`);if(n===0)l=r;else if(r!==l)throw Error(`autotile layer "${e}" sets disagree on their initial animation frame (${l} vs ${r})`)});let u=Int32Array.from(t);for(let t=0;t<i;t++)u[t]>0&&this.claimAutotileSets(s,e,u[t]);let d={kind:`autotile`,name:e,data:u,sprites:Array(i).fill(null),container:a,sets:s,frame:l};this.layers.push(d),this.layersByName.set(e,d),this.chunks.push(o),this.addChild(a);let f=this.layers.length===1;for(let t=0;t<this.heightInTiles;t++)for(let n=0;n<this.widthInTiles;n++){let r=this.index(n,t),i=u[r];i<=0||(d.sprites[r]=this.makeAutotileSprites(d,this.claimAutotileSets(s,e,i),n,t,i),f&&this.syncFaces(n,t))}return this}setAutotileFrame(e,t){let n=this.layerAt(e);if(n.kind!==`autotile`)throw Error(`layer "${n.name}" is not an autotile layer`);if(!Number.isInteger(t)||t<0)throw Error(`an autotile animation frame must be an integer at or above zero, got ${t}`);if(n.frame!==t){n.frame=t;for(let e=0;e<this.heightInTiles;e++)for(let r=0;r<this.widthInTiles;r++){let i=this.index(r,e),a=n.data[i];if(a<=0)continue;let o=this.claimAutotileSets(n.sets,n.name,a),s=this.autotilePieces(o,a,t),c=n.sprites[i];if(c)for(let e=0;e<c.length;e++)c[e].texture=s.textures[e]}}}addShadowLayer(e,t,n={}){let{cells:r,container:i,chunks:a}=this.beginLayer(e,t.length),o=n.color??0,s=n.alpha??.5;if(!Number.isFinite(s)||s<0||s>1)throw Error(`shadow layer "${e}" alpha must be between 0 and 1, got ${n.alpha}`);let c=Int32Array.from(t,e=>e>0?e&15:0),l={kind:`shadow`,name:e,data:c,sprites:Array(r).fill(null),container:i,color:o,alpha:s};this.layers.push(l),this.layersByName.set(e,l),this.chunks.push(a),this.addChild(i);for(let e=0;e<this.heightInTiles;e++)for(let t=0;t<this.widthInTiles;t++)c[this.index(t,e)]>0&&this.buildShadowSprites(l,t,e);return this}buildShadowSprites(e,t,n){let r=this.index(t,n),i=this.cellOrigin(t,n),a=this.cellHeight[r]*this.heightStep,o=this.tileWidth/2,s=this.tileHeight/2,c=this.chunks[this.layers.indexOf(e)][this.chunkIndex(t,n)],l=[];for(let t=0;t<4;t++){if(!(e.data[r]&1<<t))continue;let n=new CM(q.WHITE);n.x=i.x+t%2*o,n.y=i.y-a+Math.floor(t/2)*s,n.width=o,n.height=s,n.tint=e.color,n.alpha=e.alpha,c.addChild(n),l.push(n)}e.sprites[r]=l}setShadowCell(e,t,n,r){let i=this.index(t,n);e.data[i]=r>0?r&15:0;for(let t of e.sprites[i]??[])t.destroy();e.sprites[i]=null,e.data[i]>0&&this.buildShadowSprites(e,t,n)}getAutotileFrame(e){let t=this.layerAt(e);if(t.kind!==`autotile`)throw Error(`layer "${t.name}" is not an autotile layer`);return t.frame}resolveAutotileSet(e,t,n){let r=`autotile layer "${e}" set ${n}`;if(!t||!t.sheet)throw Error(`${r} needs a source sheet`);let i=t.format??`rpgm-mv`;if(i!==`rpgm-mv`&&i!==`rpgm-xp`)throw Error(`${r} has an unknown format "${t.format}"`);return i===`rpgm-mv`?this.resolveRpgmSet(r,t):this.resolveXpSet(r,t)}resolveRpgmSet(e,t){if(t.slot===void 0)throw Error(`${e} needs a slot (0-3) for its MV sheet`);if(t.mode!==void 0&&t.mode!==`floor`&&t.mode!==`wall`&&t.mode!==`mixed`)throw Error(`${e} has an unknown mode "${t.mode}"`);if(t.animation!==void 0&&!Array.isArray(t.animation))throw Error(`${e} animation must list kind runs, got ${typeof t.animation}`);let n=t.mode??(t.slot<2?`floor`:`wall`),r=n===`mixed`&&t.slot===3&&t.table===void 0,i={format:`rpgm-mv`,slot:t.slot,table:t.table??(n===`floor`||t.tableEdge||n===`mixed`&&t.slot<2?jP:MP),...r?{tableFor:e=>Math.floor(e/8)%2==0?jP:MP}:{},...t.tableEdge?{tableEdge:!0}:{},cycles:t.animation??[]};return RP(i),{sheet:t.sheet,layout:i,cache:new Map,claims:e=>AP(e)===t.slot}}resolveXpSet(e,t){let n=t.index??0,r=t.sheet.texture,i=r.height===32;if(r.height!==32&&r.height!==128)throw Error(`${e} is ${r.height}px tall - XP autotile images are 128px templates or 32px single-tile strips`);let a=i?32:96,o=t.frames??Math.max(1,Math.floor(r.width/a)),s={format:`rpgm-xp`,index:n,frames:o,single:i};if(RP(s),o>Math.floor(r.width/a))throw Error(`${e} asks for ${o} frames but its sheet fits ${Math.floor(r.width/a)}`);return{sheet:t.sheet,layout:s,cache:new Map,claims:e=>{let t=FP(e);return t!==null&&t.index===n}}}claimAutotileSets(e,t,n){for(let t of e)if(t.claims(n))return t;throw Error(`tile ${n} in autotile layer "${t}" matches none of its sets`)}autotilePieces(e,t,n){let r=`${t}:${n}`,i=e.cache.get(r);if(i)return i;let a=WP(e.layout,t,n),o={parts:a,textures:a.map(t=>new q({source:e.sheet.texture.source,frame:new G(t.sourceX,t.sourceY,t.sourceWidth,t.sourceHeight)}))};return e.cache.set(r,o),o}makeAutotileSprites(e,t,n,r,i){let a=this.index(n,r),o=this.autotilePieces(t,i,e.frame),s=this.cellOrigin(n,r),c=this.cellHeight[a]*this.heightStep,l=o.textures.map((e,t)=>{let n=o.parts[t],r=new CM(e);return r.x=s.x+n.destX*this.tileWidth,r.y=s.y-c+n.destY*this.tileHeight,r.scale.set(n.destWidth*this.tileWidth/n.sourceWidth,n.destHeight*this.tileHeight/n.sourceHeight),r.tint=this.cellTint[a],r.colorAdd=this.cellAdd[a],r}),u=this.chunks[this.layers.indexOf(e)][this.chunkIndex(n,r)];for(let e of l)u.addChild(e);return l}setAutotileCell(e,t,n,r){let i=this.index(t,n);e.data[i]=r;let a=e.sprites[i];if(r<=0){if(a)for(let e of a)e.destroy();e.sprites[i]=null;return}let o=this.claimAutotileSets(e.sets,e.name,r),s=this.autotilePieces(o,r,e.frame);if(a&&a.length===s.textures.length)for(let e=0;e<a.length;e++)a[e].texture=s.textures[e];else{if(a)for(let e of a)e.destroy();e.sprites[i]=this.makeAutotileSprites(e,o,t,n,r)}}eachCellSprite(e,t,n){let r=e.sprites[t];if(r){if(Array.isArray(r))for(let e of r)n(e);else n(r)}}firstCellSprite(e,t){let n=e.sprites[t];return n?Array.isArray(n)?n[0]:n:null}layerAt(e){let t=typeof e==`number`?this.layers[e]:this.layersByName.get(e);if(!t)throw Error(`no such layer: ${e}`);return t}chunkIndex(e,t){return Math.floor(t/this.chunkSize)*this.chunkColumns+Math.floor(e/this.chunkSize)}projectedCenter(e,t){switch(this.shape){case`square`:return{x:(e+.5)*this.tileWidth,y:(t+.5)*this.tileHeight};case`hex`:return $n(e,t,this.tileWidth,this.tileHeight);case`isometric`:return{x:(e-t+(this.heightInTiles-1))*(this.tileWidth/2)+this.tileWidth/2,y:(e+t)*(this.tileHeight/2)+this.tileHeight/2};case`staggered`:return{x:e*this.tileWidth+(t&1)*(this.tileWidth/2)+this.tileWidth/2,y:t*(this.tileHeight/2)+this.tileHeight/2}}}projectedTile(e,t){switch(this.shape){case`square`:return{x:Math.floor(e/this.tileWidth),y:Math.floor(t/this.tileHeight)};case`hex`:return er(e,t,this.tileWidth,this.tileHeight);case`isometric`:{let n=(e-this.tileWidth/2)/(this.tileWidth/2)-(this.heightInTiles-1),r=(t-this.tileHeight/2)/(this.tileHeight/2);return{x:Math.round((n+r)/2),y:Math.round((r-n)/2)}}case`staggered`:{let n=Math.round((t-this.tileHeight/2)/(this.tileHeight/2));return{x:Math.round((e-this.tileWidth/2-(n&1)*(this.tileWidth/2))/this.tileWidth),y:n}}}}cellOrigin(e,t){let n=this.projectedCenter(e,t);return{x:n.x-this.tileWidth/2,y:n.y-this.tileHeight/2}}textureFor(e){let t=eF(e);if(t>=this.sheets.length)throw Error(`frame ${e} names sheet ${t}, but this map has ${this.sheets.length}`);return this.sheets[t].get(tF(e))}buildSprite(e,t,n,r){let i=new CM(this.textureFor(r)),a=this.cellOrigin(t,n);i.x=a.x,i.y=a.y-this.cellHeight[this.index(t,n)]*this.heightStep;let o=this.index(t,n);return i.tint=this.cellTint[o],i.colorAdd=this.cellAdd[o],e.sprites[o]=i,this.chunks[this.layers.indexOf(e)][this.chunkIndex(t,n)].addChild(i),i}getTile(e,t,n){return this.inside(t,n)?this.layerAt(e).data[this.index(t,n)]:-1}setTile(e,t,n,r){if(!this.inside(t,n))return;let i=this.layerAt(e),a=this.index(t,n);if(i.data[a]!==r){if(i.kind===`autotile`)this.setAutotileCell(i,t,n,r);else if(i.kind===`shadow`)this.setShadowCell(i,t,n,r);else{i.data[a]=r;let e=i.sprites[a];r===-1?(e?.destroy(),i.sprites[a]=null):e?e.texture=this.textureFor(r):this.buildSprite(i,t,n,r)}this.layers[0]===i&&this.syncFaces(t,n)}}setLayerData(e,t){this.layerAt(e);for(let n=0;n<this.heightInTiles;n++)for(let r=0;r<this.widthInTiles;r++)this.setTile(e,r,n,t[this.index(r,n)]??-1)}stampRect(e,t,n,r,i,a){if(this.layerAt(e),a.length!==r*i)throw Error(`a ${r}x${i} stamp needs ${r*i} frames, got ${a.length}`);if(t<0||n<0||t+r>this.widthInTiles||n+i>this.heightInTiles)throw Error(`a ${r}x${i} stamp at (${t},${n}) does not fit the ${this.widthInTiles}x${this.heightInTiles} map`);for(let o=0;o<i;o++)for(let i=0;i<r;i++)this.setTile(e,t+i,n+o,a[o*r+i])}setCellColor(e,t,n,r=0){if(!this.inside(e,t))return;let i=this.index(e,t);if(this.cellTint[i]===n&&this.cellAdd[i]===r)return;this.cellTint[i]=n,this.cellAdd[i]=r;for(let e of this.layers)e.kind!==`shadow`&&this.eachCellSprite(e,i,e=>{e.tint=n,e.colorAdd=r});let a=this.faces[i];a&&(a.tint=n)}getCellTint(e,t){return this.inside(e,t)?this.cellTint[this.index(e,t)]:0}clearColors(){for(let e=0;e<this.heightInTiles;e++)for(let t=0;t<this.widthInTiles;t++)this.setCellColor(t,e,16777215,0)}setCellHeight(e,t,n){if(!this.inside(e,t))return;if(!Number.isInteger(n))throw Error(`a cell's height must be a whole number, got ${n}`);let r=this.index(e,t);if(this.cellHeight[r]===n)return;let i=(n-this.cellHeight[r])*this.heightStep;this.cellHeight[r]=n;for(let e of this.layers)this.eachCellSprite(e,r,e=>{e.y-=i});this.syncFaces(e,t)}getCellHeight(e,t){return this.inside(e,t)?this.cellHeight[this.index(e,t)]:0}get faceCount(){return this.faces.filter(e=>e!==null).length}syncFaces(e,t){if(this.layers.length===0)return;let n=this.index(e,t),r=(this.shape===`isometric`||this.shape===`staggered`)&&this.cellHeight[n]>0&&this.layers[0].data[n]!==-1,i=this.faces[n];if(!r){i&&(i.destroy(),this.faces[n]=null);return}let a=i??new Z;if(this.drawFaces(a,e,t),a.tint=this.cellTint[n],!i){this.faces[n]=a;let r=this.chunks[0][this.chunkIndex(e,t)],i=this.firstCellSprite(this.layers[0],n);i?r.addChildAt(a,r.getChildIndex(i)):r.addChild(a)}}drawFaces(e,t,n){let r=this.cellOrigin(t,n),i=r.x,a=r.y,o=this.tileWidth/2,s=this.tileHeight/2,c=this.heightStep,l=this.cellHeight[this.index(t,n)];e.clear();for(let t=1;t<=l;t++){let n=t*c,r=(t-1)*c;e.poly([i,a+s-n,i+o,a+s*2-n,i+o,a+s*2-r,i,a+s-r]).fill(ZP),e.poly([i+o,a+s*2-n,i+o*2,a+s-n,i+o*2,a+s-r,i+o,a+s*2-r]).fill(QP)}}toTile(e,t){return this.projectedTile(e,t)}tileCenter(e,t){let n=this.projectedCenter(e,t);return n.y-=this.getCellHeight(e,t)*this.heightStep,n}cull(e){let t=e.view,n=this.projectedTile(t.x,t.y),r=this.projectedTile(t.x+t.width,t.y),i=this.projectedTile(t.x,t.y+t.height),a=this.projectedTile(t.x+t.width,t.y+t.height),o=Math.min(n.x,r.x,i.x,a.x),s=Math.max(n.x,r.x,i.x,a.x),c=Math.min(n.y,r.y,i.y,a.y),l=Math.max(n.y,r.y,i.y,a.y),u=Math.floor(o/this.chunkSize)-1,d=Math.floor(s/this.chunkSize)+1,f=Math.floor(c/this.chunkSize)-1,p=Math.floor(l/this.chunkSize)+1;for(let e=0;e<this.chunkRows;e++){let t=e>=f&&e<=p;for(let n=0;n<this.chunkColumns;n++){let r=t&&n>=u&&n<=d,i=e*this.chunkColumns+n;for(let e of this.chunks)e[i].renderable=r}}}get visibleChunks(){return this.chunks.length===0?0:this.chunks[0].filter(e=>e.renderable).length}},rF=class extends J{constructor(...e){super(...e),this.layers=new Map}addLayer(e,t,n=0){this.removeLayer(e);let r=new CM(t);return this.layers.set(e,{sprite:r,order:n}),this.addChild(r),this.resort(),r}removeLayer(e){let t=this.layers.get(e);t&&(this.layers.delete(e),t.sprite.destroy())}layer(e){return this.layers.get(e)?.sprite}hasLayer(e){return this.layers.has(e)}setTexture(e,t){let n=this.layers.get(e);n&&(n.sprite.texture=t)}resort(){[...this.layers.values()].sort((e,t)=>e.order-t.order).forEach((e,t)=>this.setChildIndex(e.sprite,t))}},iF=class{constructor(e,t,n,r={}){this.elapsed=0,this.arrived=!1,this.sprite=e,this.fromX=t.x,this.fromY=t.y,this.toX=n.x,this.toY=n.y,this.animation=r.animation;let i=Math.hypot(n.x-t.x,n.y-t.y);this.duration=r.duration??i/(r.speed??400),this.duration<=0&&(this.duration=1e-6),e.x=t.x,e.y=t.y}get done(){return this.arrived}get progress(){return Math.min(1,this.elapsed/this.duration)}get frame(){return this.animation?.frameAt(this.elapsed)}get frameOffset(){let e=this.frame;return{x:e?.offsetX??0,y:e?.offsetY??0}}update(e){if(this.arrived)return!1;this.elapsed+=e;let t=this.progress;return this.sprite.x=this.fromX+(this.toX-this.fromX)*t,this.sprite.y=this.fromY+(this.toY-this.fromY)*t,t>=1&&(this.arrived=!0,!0)}};function aF(e){return e===!0||e===`progress`?`progress`:typeof e==`number`&&e>0?`seconds`:`none`}var oF=class extends J{constructor(...e){super(...e),this.live=[]}add(e,t,n,r={}){let i,a;e instanceof q?(a=new wl(e),this.addChild(a),i=a):i=e,r.tint!==void 0&&typeof i.tint==`number`&&(i.tint=r.tint);let o=aF(r.fadeIn),s=typeof r.fadeIn==`number`?r.fadeIn:0,c=typeof i.alpha==`number`?i.alpha:1;o!==`none`&&(i.alpha=0);let l={projectile:new iF(i,t,n,r),sprite:i,built:a,onArrive:r.onArrive,spin:r.spin??(r.spinDegrees===void 0?void 0:r.spinDegrees*Math.PI/180),fadeMode:o,fadeIn:s,baseAlpha:c,elapsed:0};return this.live.push(l),{projectile:l.projectile,get done(){return l.projectile.done},cancel:()=>{let e=this.live.indexOf(l);e!==-1&&(this.live.splice(e,1),this.release(l))}}}update(e){for(let t=this.live.length-1;t>=0;t--){let n=this.live[t];n.elapsed+=e,n.spin!==void 0&&(n.sprite.rotation=(n.sprite.rotation??0)+n.spin*e),n.fadeMode===`seconds`&&(n.sprite.alpha=n.baseAlpha*Math.min(1,n.elapsed/n.fadeIn));let r=n.projectile.update(e);n.fadeMode===`progress`&&(n.sprite.alpha=n.baseAlpha*n.projectile.progress),r&&(this.live.splice(t,1),this.release(n),n.onArrive?.())}}get count(){return this.live.length}clear(){for(let e of this.live.splice(0))this.release(e)}destroy(){this.clear(),super.destroy()}release(e){e.built&&(this.removeChild(e.built),e.built.destroy())}},sF=class extends J{constructor(e,t,n={}){super(),this.elapsed=0,this.expired=!1,this.lifeFraction=1,this.from={...e},this.to={...t},this.colour=n.colour??16777215,this.thin=n.thin??!1;let r=n.texture;if(r===void 0?(this.texture=void 0,this.stretch=!1,this.textureAnchor=0):r instanceof q?(this.texture=r,this.stretch=!1,this.textureAnchor=0):(this.texture=r.source,this.stretch=r.stretch??!1,this.textureAnchor=r.anchor??.5),this.thickness=n.width??2,this.duration=Math.max(1e-6,n.duration??.2),this.texture&&this.stretch)this.body=new wl(this.texture),this.body.anchor.set(0,this.textureAnchor);else if(this.texture){let e=new dA({texture:this.texture,width:1,height:this.thickness});e.anchor.set(0,this.textureAnchor),this.body=e}else this.body=new Z;(n.additive??!0)&&(this.body.blendMode=`add`),this.addChild(this.body),this.redraw()}get progress(){return Math.min(1,this.elapsed/this.duration)}get done(){return this.expired}retarget(e,t){e&&(this.from={...e}),t&&(this.to={...t}),this.redraw()}update(e){return!this.expired&&(this.elapsed+=e,this.alpha=1-this.progress,this.lifeFraction=this.thin?1-this.progress:1,this.thin&&this.redraw(),this.elapsed>=this.duration&&(this.expired=!0,!0))}destroy(){this.removeChild(this.body),this.body.destroy(),super.destroy()}redraw(){let e=this.to.x-this.from.x,t=this.to.y-this.from.y,n=Math.hypot(e,t);if(this.position.set(this.from.x,this.from.y),this.rotation=n>0?Math.atan2(t,e):0,this.body instanceof dA)this.body.width=n,this.body.height=this.thickness*this.lifeFraction;else if(this.body instanceof wl){let e=this.texture?.width||1,t=this.texture?.height||1;this.body.scale.x=n/e,this.body.scale.y=this.thickness/t*this.lifeFraction}else{let e=this.body;e.clear(),e.moveTo(0,0),e.lineTo(n,0),e.stroke({width:this.thickness*this.lifeFraction,color:this.colour})}}},cF=class extends J{constructor(...e){super(...e),this.live=[]}add(e,t,n){let r=new sF(e,t,n);return this.addChild(r),this.live.push(r),r}update(e){for(let t=this.live.length-1;t>=0;t--)if(this.live[t].update(e)){let[e]=this.live.splice(t,1);this.removeChild(e),e.destroy()}}get count(){return this.live.length}clear(){for(let e of this.live.splice(0))this.removeChild(e),e.destroy()}destroy(){this.clear(),super.destroy()}},lF=class{constructor(e,t,n={}){this.elapsed=0,this.sinceFlicker=0,this.expired=!1,this.current=[],this.from={...e},this.to={...t},this.segments=Math.max(0,Math.floor(n.segments??6)),this.jitter=n.jitter??12,this.flickerInterval=n.flickerInterval,this.random=n.random??Math.random,this.duration=n.duration,this.reroll()}get points(){return this.current}get done(){return this.expired}retarget(e,t){e&&(this.from={...e}),t&&(this.to={...t}),this.flickerInterval===void 0&&this.reroll()}update(e){return!this.expired&&(this.elapsed+=e,this.flickerInterval!==void 0&&(this.sinceFlicker+=e,this.sinceFlicker>=this.flickerInterval&&(this.sinceFlicker=0,this.reroll())),this.duration!==void 0&&this.elapsed>=this.duration&&(this.expired=!0,!0))}reroll(){let e=this.to.x-this.from.x,t=this.to.y-this.from.y,n=Math.hypot(e,t),r=n>0?-t/n:0,i=n>0?e/n:0,a=[{...this.from}],o=this.segments+1;for(let n=1;n<o;n+=1){let s=n/o,c=Math.sin(Math.PI*s),l=(this.random()*2-1)*this.jitter*c;a.push({x:this.from.x+e*s+r*l,y:this.from.y+t*s+i*l})}a.push({...this.to}),this.current=a}},uF=class{constructor(e,t={}){this.elapsed=0,this.expired=!1,this.child=e,this.offsetX=t.offsetX??0,this.offsetY=t.offsetY??0,this.duration=t.duration}get done(){return this.expired}follow(e,t){return this.child.x=e+this.offsetX,this.child.y=t+this.offsetY,this}update(e){return this.expired||this.duration===void 0?!1:(this.elapsed+=e,this.elapsed>=this.duration&&(this.expired=!0,!0))}},dF=class extends J{constructor(e){super(),this.cells=new Map,this.ripples=[],this.offset=0,this.eventMode=`none`,this.columns=e.width,this.tileSize=e.tileSize??16,this.speed=e.speed??5,this.rippleTexture=e.rippleTexture,this.rippleDuration=e.rippleDuration??.5;for(let t=0;t<e.height;t++)for(let n=0;n<e.width;n++){if(!e.isLiquid(n,t))continue;let r=new dA({texture:e.texture,width:this.tileSize,height:this.tileSize});r.eventMode=`none`,r.position.set(n*this.tileSize,t*this.tileSize),r.tilePosition.set(-r.x,-r.y),r.visible=!1,this.cells.set(n+t*this.columns,r),this.addChild(r)}}setCellColor(e,t,n){let r=this.cells.get(e+t*this.columns);r&&(r.tint=n,r.visible=n!==0)}ripple(e,t){if(!this.rippleTexture||!this.cells.get(e+t*this.columns)?.visible)return;let n=new wl(this.rippleTexture);n.eventMode=`none`,n.anchor.set(.5),n.position.set((e+.5)*this.tileSize,(t+.5)*this.tileSize),n.scale.set(0),this.addChild(n),this.ripples.push({sprite:n,age:0})}get rippleCount(){return this.ripples.length}update(e){this.offset+=this.speed*e;for(let e of this.cells.values())e.visible&&(e.tilePosition.y=-e.y+this.offset);for(let t=this.ripples.length-1;t>=0;t--){let n=this.ripples[t];if(n.age+=e,n.age>=this.rippleDuration)n.sprite.destroy(),this.ripples.splice(t,1);else{let e=n.age/this.rippleDuration;n.sprite.scale.set(e),n.sprite.alpha=1-e}}}};function fF(e,t,n,r,i,a){let o=t*r;for(let s=0;s<n;s++)for(let n=0;n<t;n++){let t=i(n,s);for(let i=0;i<r;i++)for(let c=0;c<r;c++){let l=a[typeof t==`number`?t:t[i*r+c]??0]??[0,0,0,0];e.set(l,((s*r+i)*o+n*r+c)*4)}}}var pF=class extends wl{constructor(e){let t=e.resolution??2,n=document.createElement(`canvas`);n.width=e.width*t,n.height=e.height*t;let r=n.getContext(`2d`);if(!r)throw Error(`FogLayer needs a 2D canvas context`);super(q.from(n)),this.context=r,this.image=r.createImageData(n.width,n.height),this.columns=e.width,this.rows=e.height,this.cellResolution=t,this.palette=e.palette,this.texture.source.scaleMode=`linear`,this.scale.set((e.tileSize??16)/t),this.eventMode=`none`}setPalette(e){this.palette=e}refresh(e){fF(this.image.data,this.columns,this.rows,this.cellResolution,e,this.palette),this.context.putImageData(this.image,0,0),this.texture.source.update()}destroy(){super.destroy({texture:!0,textureSource:!0})}},mF=`halo`,hF=class extends nN{constructor(e){super(),this.offsetX=e.offsetX??0,this.offsetY=e.offsetY??0,this.blendMode=e.blendMode??`add`,this.add(mF,e.frames,e.animation),this.play(mF)}follow(e,t){return this.position.set(e+this.offsetX,t+this.offsetY),this}};_e();function gF(e){return typeof e==`number`?e:D(e[0],e[1])}function _F(e){if(typeof e==`number`)return e;let t=D(),n=n=>{let r=e[0]>>n&255,i=e[1]>>n&255;return Math.round(r+(i-r)*t)<<n};return n(16)|n(8)|n(0)}function vF(e){return typeof e==`function`?e:t=>e[0]+(e[1]-e[0])*t}var yF=class extends J{constructor(e={}){super(),this.pool=[],this.sprites=[],this.tintOverridden=!1,this.emitting=!1,this.followTarget=null,this.followOffsetX=0,this.followOffsetY=0,this.followEnabled=null,this.followVisible=null,this.poolCursor=0,this.debt=0;let t=Math.max(1,Math.floor(e.max??200));this.rate=e.rate??0,this.life=e.life??[.4,.9],this.speed=e.speed??[20,60],this.angleRange=e.angle??[0,Math.PI*2],this.gravityX=e.gravity?.x??0,this.gravityY=e.gravity?.y??0,this.scaleOf=vF(e.scale??[1,1]),this.alphaOf=vF(e.alpha??[1,0]),this.flicker=Math.min(1,Math.max(0,e.flicker??0)),this.spin=e.spin??0,this.tintRange=e.tint??16777215,this.frames=e.frames,this.spawnArea=e.spawn??null;for(let n=0;n<t;n++){this.pool.push({x:0,y:0,vx:0,vy:0,age:0,life:0,rotation:0,spin:0,scale:1,alpha:1,tint:16777215,frame:0,active:!1});let t=this.frames?.[0]??e.texture;if(t){let n=new wl(t);n.anchor.set(.5),n.visible=!1,typeof e.tint==`number`&&(n.tint=e.tint),this.sprites.push(n),this.addChild(n)}}}start(){this.emitting=!0}stop(){this.emitting=!1,this.debt=0}attach(e,t={}){this.followTarget=e,this.followOffsetX=t.offsetX??0,this.followOffsetY=t.offsetY??0,this.followEnabled=t.enabled??null,this.followVisible=t.visible??null,this.syncFollow()}detach(){this.followTarget=null,this.followEnabled=null,this.followVisible!==null&&(this.visible=!0),this.followVisible=null,this.followOffsetX=0,this.followOffsetY=0}get attachedTo(){return this.followTarget}syncFollow(){let e=this.followTarget;if(!e)return;if(typeof e!=`function`&&e.destroyed){this.detach();return}let t=typeof e==`function`?e():e;this.x=t.x+this.followOffsetX,this.y=t.y+this.followOffsetY,this.followVisible!==null&&(this.visible=this.followVisible())}followEmissionAllowed(){return this.followEnabled?.()??!0}get isEmitting(){return this.emitting}get activeCount(){let e=0;for(let t of this.pool)t.active&&e++;return e}get particles(){return this.pool}burst(e,t={}){this.syncFollow(),t.tint!==void 0&&(this.tintOverridden=!0);let n=0;for(let r=0;r<e&&this.spawn(t);r++)n++;return n}spawn(e={}){let t=null;for(let e=0;e<this.pool.length;e++){let e=this.pool[this.poolCursor];if(this.poolCursor=(this.poolCursor+1)%this.pool.length,!e.active){t=e;break}}if(!t)return!1;let n=gF(this.angleRange),r=gF(this.speed),i=+!br(),a=this.spawnOffset();return t.x=(e.x??this.x)+a.x,t.y=(e.y??this.y)+a.y,t.vx=Math.cos(n)*r*i,t.vy=Math.sin(n)*r*i,t.age=0,t.life=Math.max(1e-6,gF(this.life)),t.rotation=0,t.spin=gF(this.spin)*i,t.scale=this.scaleOf(0),t.alpha=this.alphaOf(0),t.tint=e.tint??_F(this.tintRange),t.frame=0,t.active=!0,!0}spawnOffset(){let e=this.spawnArea;if(!e)return{x:0,y:0};let t=e.height??e.width;if(e.shape===`rect`)return{x:(D()-.5)*e.width,y:(D()-.5)*t};let n=Math.sqrt(D()),r=D()*Math.PI*2;return{x:Math.cos(r)*n*(e.width/2),y:Math.sin(r)*n*(t/2)}}update(e){if(this.syncFollow(),this.emitting&&this.rate>0&&this.followEmissionAllowed()){for(this.debt+=this.rate*e;this.debt>=1;)if(--this.debt,!this.spawn()){this.debt=0;break}}let t=br();for(let n of this.pool){if(!n.active)continue;if(n.age+=e,n.age>=n.life){n.active=!1;continue}t?(n.vx=0,n.vy=0,n.spin=0):(n.vx+=this.gravityX*e,n.vy+=this.gravityY*e),n.x+=n.vx*e,n.y+=n.vy*e,n.rotation+=n.spin*e;let r=n.age/n.life;n.scale=this.scaleOf(r),n.alpha=this.alphaOf(r),this.flicker>0&&!t&&(n.scale*=1-this.flicker*D()),this.frames&&(n.frame=Math.min(this.frames.length-1,Math.floor(r*this.frames.length)))}this.draw()}draw(){if(this.sprites.length===0)return;let e=typeof this.tintRange!=`number`||this.tintOverridden;for(let t=0;t<this.pool.length;t++){let n=this.pool[t],r=this.sprites[t];r.visible=n.active,n.active&&(r.x=n.x-this.x,r.y=n.y-this.y,r.rotation=n.rotation,r.alpha=n.alpha,r.scale.set(n.scale),e&&(r.tint=n.tint),this.frames&&(r.texture=this.frames[n.frame]??r.texture))}}clear(){for(let e of this.pool)e.active=!1;this.debt=0,this.draw()}},bF=class extends J{constructor(e={}){super(),this.overlay=new Z,this.phase=`idle`,this.elapsed=0,this.duration=0,this.fromAlpha=0,this.toAlpha=0,this.queue=[],this.defaultColor=e.color??0,this.viewWidth=e.width??0,this.viewHeight=e.height??0,this.overlay.alpha=0,this.overlay.tint=this.defaultColor,this.addChild(this.overlay),this.redraw()}setViewport(e,t){this.viewWidth=e,this.viewHeight=t,this.redraw()}redraw(){this.overlay.clear(),this.viewWidth>0&&this.viewHeight>0&&this.overlay.rect(0,0,this.viewWidth,this.viewHeight).fill({color:16777215})}get isBusy(){return this.phase!==`idle`}get washAlpha(){return this.overlay.alpha}fadeOut(e,t){this.begin(`fadeOut`,e,this.overlay.alpha,1,t)}fadeIn(e,t){this.begin(`fadeIn`,e,this.overlay.alpha,0,t)}flash(e,t,n=1){this.begin(`flash`,e,0,n,t)}sequence(e){this.queue=e.slice(1),e.length===0?this.phase=`idle`:this.beginStep(e[0])}setTint(e,t){this.queue=[],this.phase=`idle`,this.elapsed=0,this.overlay.tint=e,this.overlay.alpha=Math.max(0,Math.min(1,t))}clear(){this.queue=[],this.phase=`idle`,this.elapsed=0,this.overlay.alpha=0,this.overlay.tint=this.defaultColor}beginStep(e){switch(e.kind){case`fadeOut`:return this.begin(`fadeOut`,e.duration,this.overlay.alpha,1,e.color);case`fadeIn`:return this.begin(`fadeIn`,e.duration,this.overlay.alpha,0,e.color);case`flash`:return this.begin(`flash`,e.duration,0,e.peak??1,e.color);case`hold`:return this.begin(`hold`,e.duration,this.overlay.alpha,this.overlay.alpha,e.color??this.overlay.tint)}}advance(){let e=this.queue.shift();return e?this.beginStep(e):(this.phase=`idle`,!0)}begin(e,t,n,r,i){return br()&&(t=0),this.overlay.tint=i??this.defaultColor,this.fromAlpha=n,this.toAlpha=r,this.elapsed=0,this.duration=t,t>0?(this.phase=e,this.overlay.alpha=e===`flash`?0:n,!1):(this.overlay.alpha=e===`flash`?0:r,this.advance())}update(e){if(this.phase===`idle`)return!1;if(br())return this.overlay.alpha=this.phase===`flash`?0:this.toAlpha,this.advance();this.elapsed+=e;let t=Math.min(1,this.elapsed/this.duration);if(this.phase===`flash`){let e=t<.5?Er.easeOutQuad(t*2):1-Er.easeInQuad((t-.5)*2);this.overlay.alpha=this.toAlpha*e}else{let e=Er.easeInOutQuad(t);this.overlay.alpha=this.fromAlpha+(this.toAlpha-this.fromAlpha)*e}return t>=1&&(this.overlay.alpha=this.phase===`flash`?0:this.toAlpha,this.advance())}},xF=class{constructor(e,t){this.idleOrMove=`idle`,this.inAction=!1,this.sprite=e,this.animationName=t.animationName,this.variant=t.variant??``,this.sprite.onFinish=()=>this.onSpriteFinish(),this.apply(this.idleOrMove)}get state(){return this.inAction?`action`:this.idleOrMove}get variantName(){return this.variant}setMoving(e,t){t!==void 0&&(this.variant=t),this.idleOrMove=e?`move`:`idle`,this.inAction||this.apply(this.idleOrMove)}playAction(e,t=!1){(!this.inAction||t)&&(e!==void 0&&(this.variant=e),this.inAction=!0,this.apply(`action`))}onSpriteFinish(){this.inAction&&(this.inAction=!1,this.apply(this.idleOrMove))}apply(e){let t=this.animationName(e,this.variant);this.sprite.has(t)&&this.sprite.play(t,e===`action`)}},SF=class{constructor(e,t){this.active=new Set,this.elapsed=0,this.flashColor=0,this.flashStrength=0,this.flashDuration=0,this.flashRemaining=0,this.target=e,this.styles=t.styles}set(e,t){t?this.active.add(e):this.active.delete(e)}has(e){return this.active.has(e)}flash(e,t,n){this.flashColor=e,this.flashStrength=t,this.flashDuration=Math.max(n,1e-6),this.flashRemaining=this.flashDuration}update(e){this.elapsed+=e,this.flashRemaining>0&&(this.flashRemaining=Math.max(0,this.flashRemaining-e));let t=0,n=0,r=0;for(let e of this.active){let i=this.styles[e];if(!i)continue;let a=i.strength??.5,o=i.pulseRate?a*(.5+.5*Math.sin(this.elapsed*i.pulseRate*Math.PI*2)):a;t+=(i.color>>16&255)/255*o,n+=(i.color>>8&255)/255*o,r+=(i.color&255)/255*o}if(this.flashRemaining>0){let e=this.flashRemaining/this.flashDuration,i=this.flashStrength*e;t+=(this.flashColor>>16&255)/255*i,n+=(this.flashColor>>8&255)/255*i,r+=(this.flashColor&255)/255*i}this.target.colorAdd=yM(Math.min(1,t),Math.min(1,n),Math.min(1,r))}},CF={scaleX:1,scaleY:1,dy:0,rotation:0,skewX:0},wF={done:Promise.resolve(),cancel(){}},TF=class{constructor(e,t={}){this.contributions=new Map,this.loops=new Set,this.nextId=0,this.flipX=!1,this.flipY=!1,this.destroyed=!1,this.target=e,this.tweener=t.tweener??new Dr,this.ownsTweener=t.tweener===void 0,this.intent=t.intent??`decorative`,this.rest={y:e.y,rotation:e.rotation,scaleX:e.scale.x,scaleY:e.scale.y,skewX:e.skew.x}}squash(e){let{amount:t,duration:n}=e;return this.run(n,e=>{let n=Math.sin(Math.PI*e)*t;return{scaleX:1+n,scaleY:1-n}})}hop(e){let{height:t,duration:n}=e;return this.run(n,e=>({dy:-Math.sin(Math.PI*e)*t}))}bob(e){let{amplitude:t,period:n,cycles:r}=e;return r===void 0?this.loop(e=>({dy:Math.sin(2*Math.PI*e/n)*t})):this.run(n*r,e=>({dy:Math.sin(2*Math.PI*r*e)*t}))}wobble(e){let{angle:t,duration:n}=e;return this.run(n,e=>({rotation:Math.sin(4*Math.PI*e)*(1-e)*t}))}spin(e){let{turns:t,duration:n}=e;return this.run(n,e=>({rotation:Math.PI*2*t*e}),Er.easeInOutQuad)}shear(e){let{amount:t,duration:n}=e;return this.run(n,e=>({skewX:Math.sin(Math.PI*e)*t}))}flip(e,t){return e===`x`?this.flipX=t??!this.flipX:this.flipY=t??!this.flipY,this.write(),e===`x`?this.flipX:this.flipY}update(e){this.ownsTweener&&this.tweener.update(e);for(let t of[...this.loops])t(e)}get isBusy(){return this.contributions.size>0}destroy(){this.destroyed=!0,this.contributions.clear(),this.loops.clear(),this.flipX=this.flipY=!1,this.write()}run(e,t,n=Er.linear){if(this.destroyed)return wF;let r=this.nextId++,i=()=>{this.contributions.delete(r),this.write()};return this.contributions.set(r,CF),{done:this.tweener.tween(e,e=>{this.contributions.has(r)&&(this.contributions.set(r,{...CF,...t(e)}),this.write())},{ease:n,intent:this.intent}).then(i),cancel:i}}loop(e){if(this.destroyed)return wF;let t=this.nextId++,n=0,r,i=new Promise(e=>r=e),a=r=>{n+=r;let i=br()&&this.intent===`decorative`;this.contributions.set(t,i?CF:{...CF,...e(n)}),this.write()};return this.contributions.set(t,CF),this.loops.add(a),{done:i,cancel:()=>{this.loops.delete(a),this.contributions.delete(t),this.write(),r()}}}write(){let e=1,t=1,n=0,r=0,i=0;for(let a of this.contributions.values())e*=a.scaleX,t*=a.scaleY,n+=a.dy,r+=a.rotation,i+=a.skewX;let{rest:a,target:o}=this;o.y=a.y+n,o.rotation=a.rotation+r,o.scale.x=a.scaleX*e*(this.flipX?-1:1),o.scale.y=a.scaleY*t*(this.flipY?-1:1),o.skew.x=a.skewX+i}};function EF(e,t){let n=e??{x:0,y:0};if(!Number.isFinite(n.x)||!Number.isFinite(n.y))throw RangeError(`a cloth ${t} needs finite coordinates, saw (${n.x}, ${n.y})`);return{x:n.x,y:n.y}}var DF=class{constructor(e){if(!Number.isFinite(e.width)||e.width<=0)throw RangeError(`a cloth needs width above 0, saw ${e.width}`);if(!Number.isFinite(e.height)||e.height<=0)throw RangeError(`a cloth needs height above 0, saw ${e.height}`);for(let t of[`segmentsX`,`segmentsY`])if(!Number.isInteger(e[t])||e[t]<1)throw RangeError(`a cloth needs integer ${t} of at least 1, saw ${e[t]}`);let t=e.stiffness??.9;if(!Number.isFinite(t)||t<0||t>1)throw RangeError(`a cloth needs stiffness between 0 and 1, saw ${t}`);let n=e.damping??.02;if(!Number.isFinite(n)||n<0||n>1)throw RangeError(`a cloth needs damping between 0 and 1, saw ${n}`);this.segmentsX=e.segmentsX,this.segmentsY=e.segmentsY,this.stiffness=t,this.damping=n,this.gravity=EF(e.gravity,`gravity`),this.wind=EF(e.wind,`wind`);let r=this.pointCount;this.rest=new Float32Array(r*2),this.positions=new Float32Array(r*2),this.previous=new Float32Array(r*2),this.pinned=new Uint8Array(r),this.links=[];let i=e.width/e.segmentsX,a=e.height/e.segmentsY;for(let t=0;t<=e.segmentsY;t++)for(let n=0;n<=e.segmentsX;n++){let e=this.indexOf(n,t);this.rest[e*2]=n*i,this.rest[e*2+1]=t*a,t===0&&(this.pinned[e]=1)}this.reset();let o=(e,t)=>this.indexOf(e,t);for(let t=0;t<=e.segmentsY;t++)for(let n=0;n<e.segmentsX;n++)this.links.push([o(n,t),o(n+1,t),i]);for(let t=0;t<e.segmentsY;t++)for(let n=0;n<=e.segmentsX;n++)this.links.push([o(n,t),o(n,t+1),a])}get pointCount(){return(this.segmentsX+1)*(this.segmentsY+1)}indexOf(e,t){if(!Number.isInteger(e)||!Number.isInteger(t)||e<0||t<0||e>this.segmentsX||t>this.segmentsY)throw RangeError(`cloth point (${e}, ${t}) is outside a ${this.segmentsX+1}x${this.segmentsY+1} grid`);return t*(this.segmentsX+1)+e}checkIndex(e){if(!Number.isInteger(e)||e<0||e>=this.pointCount)throw RangeError(`cloth point ${e} does not exist`)}pointPosition(e){return this.checkIndex(e),{x:this.positions[e*2],y:this.positions[e*2+1]}}isPinned(e){return this.checkIndex(e),this.pinned[e]===1}pointLinks(){return this.links.map(([e,t])=>[e,t])}pinPoint(e){this.checkIndex(e),this.pinned[e]=1,this.previous[e*2]=this.positions[e*2],this.previous[e*2+1]=this.positions[e*2+1]}unpinPoint(e){this.checkIndex(e),this.pinned[e]=0}setWind(e,t){let n=EF({x:e,y:t},`wind`);this.wind=n}setGravity(e,t){let n=EF({x:e,y:t},`gravity`);this.gravity=n}reset(){this.positions.set(this.rest),this.previous.set(this.rest)}movedCount(){let e=0;for(let t=0;t<this.pointCount;t++)this.positions[t*2]===this.rest[t*2]?this.positions[t*2+1]!==this.rest[t*2+1]&&e++:e++;return e}writePositions(e){if(!(e instanceof Float32Array)||e.length!==this.positions.length)throw RangeError(`a cloth target needs a Float32Array of ${this.positions.length} floats, saw length ${e?.length}`);e.set(this.positions)}update(e){if(!Number.isFinite(e)||e<0)throw RangeError(`a cloth update needs dt of at least 0, saw ${e}`);if(e===0)return;let t=1-this.damping,n=(this.gravity.x+this.wind.x)*e*e,r=(this.gravity.y+this.wind.y)*e*e,{positions:i,previous:a,pinned:o}=this;for(let e=0;e<this.pointCount;e++){if(o[e]===1)continue;let s=i[e*2],c=i[e*2+1];i[e*2]=s+(s-a[e*2])*t+n,i[e*2+1]=c+(c-a[e*2+1])*t+r,a[e*2]=s,a[e*2+1]=c}for(let e=0;e<2;e++)this.relax()}relax(){let{positions:e,pinned:t,stiffness:n}=this;if(n!==0)for(let[r,i,a]of this.links){let o=e[i*2]-e[r*2],s=e[i*2+1]-e[r*2+1],c=Math.hypot(o,s);if(c===0)continue;let l=(c-a)/c*n,u=t[r]===1,d=t[i]===1;if(u&&d)continue;let f=u?0:d?1:.5,p=d?0:u?1:.5;e[r*2]+=o*l*f,e[r*2+1]+=s*l*f,e[i*2]-=o*l*p,e[i*2+1]-=s*l*p}}},OF=class extends _j{constructor(e,t={}){let n=t.segmentsX??8,r=t.segmentsY??8,i=new DF({width:e.width,height:e.height,segmentsX:n,segmentsY:r,stiffness:t.stiffness,damping:t.damping,gravity:t.gravity,wind:t.wind});super({texture:e,verticesX:n+1,verticesY:r+1}),this.cloth=i,this.intent=t.intent??`decorative`,this.autoResize=!1,this.sync()}get segmentsX(){return this.cloth.segmentsX}get segmentsY(){return this.cloth.segmentsY}get pointCount(){return this.cloth.pointCount}indexOf(e,t){return this.cloth.indexOf(e,t)}pointPosition(e){return this.cloth.pointPosition(e)}isPinned(e){return this.cloth.isPinned(e)}movedCount(){return this.cloth.movedCount()}pinPoint(e){this.cloth.pinPoint(e)}unpinPoint(e){this.cloth.unpinPoint(e)}setWind(e,t){this.cloth.setWind(e,t)}setGravity(e,t){this.cloth.setGravity(e,t)}update(e){br()&&this.intent===`decorative`||(this.cloth.update(e),this.sync())}sync(){let e=this.geometry.getAttribute(`aPosition`);this.cloth.writePositions(e.buffer.data),e.buffer.update()}},kF=class extends Z{constructor(e){super(),this.spring=e.spring,this.color=e.color??16777215,this.opacity=e.alpha??1,this.lineWidth=e.lineWidth??2,this.sync()}sync(){let e=this.spring.anchorPosition,t=this.spring.position;this.clear(),this.moveTo(e.x,e.y).lineTo(t.x,t.y).stroke({color:this.color,width:this.lineWidth,alpha:this.opacity})}},AF=.35,jF=.12;function MF(e,t,n){let r=Math.sin(e*127.1+t*311.7+n*74.7)*43758.5453;return r-Math.floor(r)}function NF(e,t,n){let r=Math.floor(e),i=Math.floor(t),a=e-r,o=t-i,s=a*a*(3-2*a),c=o*o*(3-2*o),l=MF(r,i,n)+(MF(r+1,i,n)-MF(r,i,n))*s,u=MF(r,i+1,n)+(MF(r+1,i+1,n)-MF(r,i+1,n))*s;return Math.min(1,Math.max(0,l+(u-l)*c))}function PF(e,t,n,r){if(![e,t,n,r].every(Number.isFinite))throw RangeError(`a haze sample needs finite x, y, time and seed, saw (${e}, ${t}, ${n}, ${r})`);let i=e+n*AF,a=t+n*jF;return NF(i/8,a/8,r)*.65+NF(i/3+11,a/3+7,r+1)*.35}function FF(e,t,n,r){if(!(e instanceof Uint8Array||e instanceof Uint8ClampedArray)||e.length!==t*n*4)throw RangeError(`haze needs a pixel buffer of ${t*n*4} bytes`);if(!Number.isFinite(r.time)||!Number.isFinite(r.seed))throw RangeError(`haze needs a finite time and seed, saw (${r.time}, ${r.seed})`);if(!Number.isFinite(r.density)||r.density<0||r.density>1)throw RangeError(`haze needs density between 0 and 1, saw ${r.density}`);let i=r.drift??{x:0,y:0};if(!Number.isFinite(i.x)||!Number.isFinite(i.y))throw RangeError(`haze needs a finite drift, saw (${i.x}, ${i.y})`);for(let a=0;a<n;a++)for(let n=0;n<t;n++){let o=Math.round(255*r.density*PF(n+i.x*r.time,a+i.y*r.time,r.time,r.seed));e.set([255,255,255,o],(a*t+n)*4)}}var IF=class extends wl{constructor(e){if(!Number.isFinite(e.width)||e.width<=0)throw RangeError(`a haze sheet needs width above 0, saw ${e.width}`);if(!Number.isFinite(e.height)||e.height<=0)throw RangeError(`a haze sheet needs height above 0, saw ${e.height}`);let t=e.cellsX??64,n=e.cellsY??36;if(!Number.isInteger(t)||t<1)throw RangeError(`a haze sheet needs integer cellsX of at least 1, saw ${t}`);if(!Number.isInteger(n)||n<1)throw RangeError(`a haze sheet needs integer cellsY of at least 1, saw ${n}`);let r=e.density??.5;if(!Number.isFinite(r)||r<0||r>1)throw RangeError(`a haze sheet needs density between 0 and 1, saw ${r}`);let i=e.drift??{x:.25,y:0};if(!Number.isFinite(i.x)||!Number.isFinite(i.y))throw RangeError(`a haze sheet needs a finite drift, saw (${i.x}, ${i.y})`);if(e.seed!==void 0&&!Number.isFinite(e.seed))throw RangeError(`a haze sheet needs a finite seed, saw ${e.seed}`);let a=document.createElement(`canvas`);a.width=t,a.height=n;let o=a.getContext(`2d`);if(!o)throw Error(`HazeLayer needs a 2D canvas context`);super(q.from(a)),this.time=0,this.context=o,this.image=o.createImageData(t,n),this.cellsX=t,this.cellsY=n,this.density=r,this.drift={...i},this.seed=e.seed??1,this.intent=e.intent??`decorative`,this.tint=e.tint??16777215,this.alpha=e.opacity??1,this.scale.set(e.width/t,e.height/n),this.eventMode=`none`,this.refresh()}get elapsed(){return this.time}setDensity(e){if(!Number.isFinite(e)||e<0||e>1)throw RangeError(`a haze sheet needs density between 0 and 1, saw ${e}`);this.density=e}update(e){if(!Number.isFinite(e)||e<0)throw RangeError(`a haze update needs dt of at least 0, saw ${e}`);(!br()||this.intent!==`decorative`)&&(this.time+=e),this.refresh()}refresh(){FF(this.image.data,this.cellsX,this.cellsY,{time:this.time,density:this.density,seed:this.seed,drift:this.drift}),this.context.putImageData(this.image,0,0),this.texture.source.update()}destroy(){super.destroy({texture:!0,textureSource:!0})}};function LF(e){if(!Number.isInteger(e)||e<0||e>16777215)throw RangeError(`a glow needs an integer color between 0x000000 and 0xffffff, saw ${e}`);return[e>>16&255,e>>8&255,e&255]}function RF(e,t){if(!Number.isFinite(e)||!Number.isFinite(t)||t<=0)throw RangeError(`a glow falloff needs a finite distance and a radius above 0, saw (${e}, ${t})`);if(e<=0)return 1;if(e>=t)return 0;let n=1-e/t*(e/t);return n*n}function zF(e,t,n){if(!Number.isInteger(t)||t<1)throw RangeError(`a glow needs an integer size of at least 1, saw ${t}`);if(!(e instanceof Uint8Array||e instanceof Uint8ClampedArray)||e.length!==t*t*4)throw RangeError(`a glow needs a pixel buffer of ${t*t*4} bytes`);if(!Number.isFinite(n.radius)||n.radius<=0)throw RangeError(`a glow needs a radius above 0, saw ${n.radius}`);if(!Number.isFinite(n.intensity)||n.intensity<0||n.intensity>1)throw RangeError(`a glow needs intensity between 0 and 1, saw ${n.intensity}`);let[r,i,a]=LF(n.color),o=(t-1)/2;for(let s=0;s<t;s++)for(let c=0;c<t;c++){let l=RF(Math.hypot(c-o,s-o),n.radius)*n.intensity;e.set([Math.round(r*l),Math.round(i*l),Math.round(a*l),Math.round(255*l)],(s*t+c)*4)}}var BF=class e extends wl{constructor(t){if(!Number.isFinite(t.radius)||t.radius<=0)throw RangeError(`a glow needs a radius above 0, saw ${t.radius}`);let n=t.intensity??1;if(!Number.isFinite(n)||n<0||n>1)throw RangeError(`a glow needs intensity between 0 and 1, saw ${n}`);let r=t.flicker??{amount:0,frequency:1};if(!Number.isFinite(r.amount)||r.amount<0||r.amount>1)throw RangeError(`a glow needs a flicker amount between 0 and 1, saw ${r.amount}`);if(!Number.isFinite(r.frequency)||r.frequency<=0)throw RangeError(`a glow needs a flicker frequency above 0, saw ${r.frequency}`);let i=e.paintCanvas(t.color,t.radius);super(q.from(i)),this.clock=0,this.canvas=i,this.color=t.color,this.radius=t.radius,this.peak=n,this.flickerAmount=r.amount,this.flickerFrequency=r.frequency,this.intent=t.intent??`decorative`,this.blendMode=`add`,this.anchor.set(.5),this.eventMode=`none`,this.alpha=this.peak}get elapsed(){return this.clock}setColor(e){LF(e),this.color=e,this.repaint()}setRadius(e){if(!Number.isFinite(e)||e<=0)throw RangeError(`a glow needs a radius above 0, saw ${e}`);this.radius=e,this.repaint()}setIntensity(e){if(!Number.isFinite(e)||e<0||e>1)throw RangeError(`a glow needs intensity between 0 and 1, saw ${e}`);this.peak=e}update(e){if(!Number.isFinite(e)||e<0)throw RangeError(`a glow update needs dt of at least 0, saw ${e}`);(!br()||this.intent!==`decorative`)&&(this.clock+=e);let t=1+this.flickerAmount*Math.sin(2*Math.PI*this.flickerFrequency*this.clock);this.alpha=Math.min(1,Math.max(0,this.peak*t))}static paintCanvas(e,t){let n=Math.ceil(t)*2+1,r=document.createElement(`canvas`);r.width=n,r.height=n;let i=r.getContext(`2d`);if(!i)throw Error(`NeonGlow needs a 2D canvas context`);let a=i.createImageData(n,n);return zF(a.data,n,{color:e,radius:t,intensity:1}),i.putImageData(a,0,0),r}repaint(){let t=this.texture;this.canvas=e.paintCanvas(this.color,this.radius),this.texture=q.from(this.canvas),t.destroy(!0)}destroy(){super.destroy({texture:!0,textureSource:!0})}},VF=WF(),HF=new Map(VF.map((e,t)=>[UF(e),t]));function UF(e){let t=e.ne&&e.n&&e.e,n=e.se&&e.s&&e.e,r=e.sw&&e.s&&e.w,i=e.nw&&e.n&&e.w;return+!!e.n|(e.e?2:0)|(e.s?4:0)|(e.w?8:0)|(t?16:0)|(n?32:0)|(r?64:0)|(i?128:0)}function WF(){let e=new Set,t=[];for(let n=0;n<256;n++){let r={n:!!(n&1),e:!!(n&2),s:!!(n&4),w:!!(n&8),ne:!!(n&16),se:!!(n&32),sw:!!(n&64),nw:!!(n&128)},i=UF(r);e.has(i)||(e.add(i),t.push({mask:i,shape:{n:r.n,e:r.e,s:r.s,w:r.w,ne:r.ne&&r.n&&r.e,se:r.se&&r.s&&r.e,sw:r.sw&&r.s&&r.w,nw:r.nw&&r.n&&r.w}}))}return t.sort((e,t)=>e.mask-t.mask),t.map(e=>e.shape)}function GF(e){return HF.get(UF(e))}function KF(e,t,n,r){if(r.length!==VF.length)throw Error(`autotileFrames needs exactly ${VF.length} frames, got ${r.length}`);let i=new Int32Array(e*t);for(let a=0;a<t;a++)for(let t=0;t<e;t++){let o=a*e+t;i[o]=n(t,a)?r[GF({n:n(t,a-1),e:n(t+1,a),s:n(t,a+1),w:n(t-1,a),ne:n(t+1,a-1),se:n(t+1,a+1),sw:n(t-1,a+1),nw:n(t-1,a-1)})]:-1}return i}_e();function qF(e,t,n,r){let i=n*4/r,a=e,o=t;for(let e=0;e<i;e+=1)[a,o]=[-o,a];return{dx:a||0,dy:o||0}}function JF(e,t,n,r){let i=n*6/r,a=e,o=t;for(let e=0;e<i;e+=1){let e=-a-o;[a,o]=[-o,-e]}return{dx:a||0,dy:o||0}}function YF(e,t){let n=t??new Set;return!(e.hasAll&&!e.hasAll.every(e=>n.has(e))||e.hasAny&&!e.hasAny.some(e=>n.has(e))||e.hasNone&&e.hasNone.some(e=>n.has(e)))}function XF(e,t,n,r,i=qF,a=0){let o=e.rotations??0;return e.conditions.every(e=>{let s=o>0?i(e.dx,e.dy,a,o):e;return YF(e,r(t+s.dx,n+s.dy))})}function ZF(e,t,n,r,i={}){let a=i.rotate??qF,o=i.random??new j,s=[];for(let i=0;i<t;i+=1)for(let t=0;t<e;t+=1){let e=-1,c=[];for(let o of n){let n=o.rotations??0,s=n>0?n:1;for(let n=0;n<s;n+=1){if(!XF(o,t,i,r,a,n))continue;let s=o.conditions.length;s>e?(e=s,c=[{rule:o,rotationIndex:n}]):s===e&&c.push({rule:o,rotationIndex:n})}}if(c.length===0)continue;let l=c.length===1?c[0]:c[QF(c.map(e=>e.rule.probability??1),o)],u=l.rule.rotations??0;for(let e of l.rule.images){let n=u>0?a(e.dx??0,e.dy??0,l.rotationIndex,u):{dx:e.dx??0,dy:e.dy??0};s.push({x:t,y:i,ruleId:l.rule.id,image:e.image,dx:n.dx,dy:n.dy,layer:e.layer??0})}}return s}function QF(e,t){let n=e.reduce((e,t)=>e+Math.max(0,t),0);if(n<=0)return 0;let r=t.float()*n;for(let t=0;t<e.length;t+=1)if(r-=Math.max(0,e[t]),r<0)return t;return e.length-1}var $F=class extends J{};function eI(e,t){let n={};for(let r of t){let t=new $F;t.label=r,e.addChild(t),n[r]=t}return n}var tI=class extends Z{dashedLine(e,t,n,r,i=6,a=4){let o=Math.hypot(n-e,r-t);if(o===0||i<=0)return this;let s=(n-e)/o,c=(r-t)/o;for(let n=0;n<o;n+=i+Math.max(0,a)){let r=Math.min(n+i,o);this.moveTo(e+s*n,t+c*n).lineTo(e+s*r,t+c*r)}return this}},nI=class extends jA{},rI=class extends wl{},iI=class extends dA{},aI=wC,oI=class extends $F{constructor(e){super(),this.placements=e.placements,this.project=e.project,this.resolveImage=e.resolveImage??(e=>zN(e,q.EMPTY)),this.rebuild()}setPlacements(e){this.placements=e,this.rebuild()}rebuild(){for(let e of this.removeChildren())e.destroy();for(let e of[...this.placements].sort((e,t)=>e.layer-t.layer)){let t=this.project(e.x,e.y,e.dx,e.dy),n=new rI(this.resolveImage(e.image));n.x=t.x,n.y=t.y,this.addChild(n)}}},sI=[{workload:`sprites`,preferred:`PixiJS WebGL/WebGPU batcher`,fallback:`PixiJS WebGL`,reason:`high-volume textured 2D batches`},{workload:`ui`,preferred:`PixiJS display tree`,fallback:`PixiJS display tree`,reason:`themeable 2D layout and text`},{workload:`custom-shaders`,preferred:`backend-specific GLSL/WGSL only when profiled`,fallback:`PixiJS filters`,reason:`avoid maintaining paired shader sources without a measured gain`},{workload:`particles`,preferred:`PixiJS for 2D, Babylon.js for 3D`,fallback:`instanced sprites/meshes`,reason:`match simulation and depth to the scene`},{workload:`instanced-terrain`,preferred:`Babylon.js thin instances`,fallback:`PixiJS TileMap for 2D`,reason:`depth-tested repeated 3D geometry`},{workload:`voxels`,preferred:`Babylon.js thin instances`,fallback:`batched meshes`,reason:`color-grouped 3D voxels`},{workload:`animated-models`,preferred:`Babylon.js glTF animation groups`,fallback:`billboard sprites`,reason:`standard 3D interchange and animation support`},{workload:`large-3d-worlds`,preferred:`Babylon.js with streaming/culling`,fallback:`partitioned scenes`,reason:`scene graph, depth, and instancing`}];function cI(e={}){let t=e.createCanvas?.()??(typeof document>`u`?null:document.createElement(`canvas`)),n=!!t?.getContext(`webgl2`);return{webgl1:n||!!(t?.getContext(`webgl`)??t?.getContext(`experimental-webgl`)),webgl2:n,webgpu:e.webgpu??!!globalThis.navigator?.gpu,wgsl:e.wgsl??!1}}async function lI(){let e=globalThis.navigator?.gpu;if(!e)return{webgpu:!1,wgsl:!1};try{let t=await(await e.requestAdapter())?.requestDevice();return t?{webgpu:!0,wgsl:(await t.createShaderModule({code:`@compute @workgroup_size(1) fn main() {}`}).getCompilationInfo()).messages.length===0}:{webgpu:!1,wgsl:!1}}catch{return{webgpu:!1,wgsl:!1}}}var uI=536870911,dI={orthogonal:`square`,isometric:`isometric`,staggered:`staggered`};function fI(e,t,n){if(e.frameWidth!==t.tilewidth||e.frameHeight!==t.tileheight)throw Error(`the tileset at firstgid ${n} is cut to ${e.frameWidth}x${e.frameHeight}, but the map is ${t.tilewidth}x${t.tileheight}`)}function pI(e,t,n){let r=-1;for(let n=0;n<t.length&&t[n]<=e;n++)r=n;if(r===-1)throw Error(`layer "${n}" uses gid ${e}, below every tileset's firstgid (${t.join(`, `)})`);return r}function mI(e,t){let n=e.orientation??`orthogonal`,r=dI[n];if(!r)throw Error(`loadTiledMap does not read "${n}" maps yet`);if(r===`staggered`&&(e.staggeraxis??`y`)!==`y`)throw Error(`loadTiledMap only reads Y-axis staggered maps right now, this one is staggered on "${e.staggeraxis}"`);if(r===`staggered`&&(e.staggerindex??`odd`)!==`odd`)throw Error(`loadTiledMap only reads odd-index staggered maps right now, this one staggers "${e.staggerindex}"`);if(e.tilesets.length===0)throw Error(`loadTiledMap needs at least one tileset, this map has none`);let i=[...e.tilesets].sort((e,t)=>e.firstgid-t.firstgid),a,o;if(t instanceof sP){if(e.tilesets.length!==1)throw Error(`loadTiledMap was given one sheet but this map has ${e.tilesets.length} tilesets - pass one sheet per tileset`);fI(t,e,i[0].firstgid),a=[t],o=[i[0].firstgid]}else{if(t.length!==e.tilesets.length)throw Error(`loadTiledMap was given ${t.length} sheets but this map has ${e.tilesets.length} tilesets - pass one sheet per tileset`);a=i.map(n=>{let r=t.find(e=>e.firstgid===n.firstgid);if(!r)throw Error(`loadTiledMap was given no sheet for the tileset at firstgid ${n.firstgid}`);return fI(r.sheet,e,n.firstgid),r.sheet}),o=i.map(e=>e.firstgid)}let s=new nF({width:e.width,height:e.height,sheet:a,shape:r}),c=[];for(let t of e.layers)if(t.type===`tilelayer`){if(t.encoding&&t.encoding!==`csv`)throw Error(`layer "${t.name}" uses "${t.encoding}" encoding - export tile layers as CSV/plain, not compressed`);let e=(t.data??[]).map(e=>{let n=e&uI;if(n===0)return-1;let r=pI(n,o,t.name);return o.length===1?n-o[0]:$P(r,n-o[r])});s.addLayer(t.name,e)}else if(t.type===`objectgroup`)for(let n of t.objects??[])c.push({...n,tileX:Math.floor(n.x/e.tilewidth),tileY:Math.floor(n.y/e.tileheight)});return{map:s,objects:c}}async function hI(e,t){if(t.mixer&&t.mixer.skeleton!==t.skeleton)throw Error(`SVG skeleton mixer must use the supplied skeleton`);let n=await tP(e),r=new DOMParser().parseFromString(n,`image/svg+xml`),i=r.documentElement;if(r.querySelector(`parsererror`)||i.localName!==`svg`)throw Error(`SVG skeleton needs a valid svg root`);let a=i.getAttribute(`viewBox`)?.trim().split(/[\s,]+/).map(Number)??[0,0,Number(i.getAttribute(`width`)),Number(i.getAttribute(`height`))];if(a.length!==4||!a.every(Number.isFinite)||a[2]<=0||a[3]<=0)throw Error(`SVG skeleton needs a finite viewBox or positive numeric width and height`);let o=new Map;for(let e of i.querySelectorAll(`g[id]`)){if(o.has(e.id))throw Error(`duplicate SVG skeleton group ${e.id}`);o.set(e.id,e)}let s=new Map(pN(t.skeleton).map(e=>[e.name,e])),c=t.bindings??[...o.keys()].filter(e=>s.has(e)).map(e=>({bone:e}));if(!c.length)throw Error(`SVG skeleton found no matching bone groups`);let l=new Set(c.map(e=>e.group??e.bone)),u=new Set,d=[],f=new XMLSerializer;for(let e of c){let n=e.group??e.bone;if(u.has(e.bone))throw Error(`duplicate SVG binding for bone ${e.bone}`);u.add(e.bone);let c=s.get(e.bone);if(!c)throw Error(`SVG binding names no bone ${e.bone}`);let p=o.get(n);if(!p)throw Error(`SVG skeleton missing group ${n}`);let m=e.pivot??t.pivots?.[n]??{x:p.hasAttribute(`data-pivot-x`)?Number(p.getAttribute(`data-pivot-x`)):NaN,y:p.hasAttribute(`data-pivot-y`)?Number(p.getAttribute(`data-pivot-y`)):NaN},h=e.rotation??c.angle;if(![m.x,m.y,h].every(Number.isFinite))throw Error(`SVG skeleton group ${n} needs a finite pivot and rest angle`);let g=Math.max(Math.abs(a[0]-m.x),Math.abs(a[0]+a[2]-m.x)),_=Math.max(Math.abs(a[1]-m.y),Math.abs(a[1]+a[3]-m.y)),v=Math.ceil(Math.hypot(g,_))+1,y=i.cloneNode(!1);y.setAttribute(`viewBox`,`${-v} ${-v} ${v*2} ${v*2}`),y.setAttribute(`width`,String(v*2)),y.setAttribute(`height`,String(v*2));for(let e of i.querySelectorAll(`defs, style`))y.appendChild(e.cloneNode(!0));let b=p.cloneNode(!0);for(let e of b.querySelectorAll(`g[id]`))l.has(e.id)&&e.remove();let x=b;for(let e=p.parentElement;e&&e!==i;e=e.parentElement){let t=e.cloneNode(!1);t.appendChild(x),x=t}let S=r.createElementNS(i.namespaceURI,`g`);S.setAttribute(`id`,`mwg-part`),S.setAttribute(`transform`,`rotate(${-h}) translate(${-m.x} ${-m.y})`),S.appendChild(x),y.appendChild(S),d.push({bone:e.bone,svg:f.serializeToString(y)})}let p=Object.create(null);for(let e of d)p[e.bone]=(await rP(e.svg,{resolution:t.resolution}))[`mwg-part`];let m=new TN(t.skeleton,t.mixer);for(let e of d){let t=m.bind(e.bone,p[e.bone]);t.anchor.set(.5),t.label=e.bone}return m.apply({}),{sprite:m,textures:Object.freeze(p)}}var gI={panelBorder:4,padding:8,spacing:2,direction:`ltr`,font:{family:`ui-monospace, Consolas, "DejaVu Sans Mono", monospace`,size:12,lineHeight:1.4},color:{text:15263984,textDim:9079446,textHighlight:16770688,panelFill:1842214,panelBorder:4868702,selection:3820154,overlay:0},overlayAlpha:.5},_I={panelBorder:6,padding:10,spacing:4,direction:`ltr`,font:{family:gI.font.family,size:14,lineHeight:1.5},color:{text:16777215,textDim:13421772,textHighlight:16776960,panelFill:0,panelBorder:16777215,selection:16776960,overlay:0},overlayAlpha:.85},vI=gI;function Q(){return vI}var $=new p;function yI(e){vI={...gI,...e,font:{...gI.font,...e.font},color:{...gI.color,...e.color}},$.dispatch(vI)}function bI(e){return typeof e==`string`?{text:e}:e}function xI(e,t){return e.align??(t.direction===`rtl`?`right`:`left`)}function SI(e,t=40){let n=Math.max(0,e);return{total:n,speed:Math.max(0,t),revealed:t===0?n:0}}function CI(e,t){return e.revealed=Math.min(e.total,Math.max(0,e.revealed+e.speed*t)),TI(e)}function wI(e){e.revealed=e.total}function TI(e){return e.revealed>=e.total}var EI=class extends jA{constructor(e={}){let t=bI(e),n=Q();super({text:t.text??``,resolution:t.resolution,roundPixels:t.roundPixels,style:new aO({fontFamily:n.font.family,stroke:t.stroke,fontSize:t.size??n.font.size,fontWeight:t.bold?`bold`:`normal`,fill:t.color??n.color.text,lineHeight:(t.size??n.font.size)*n.font.lineHeight,align:xI(t,n),wordWrap:t.wrapWidth!==void 0,wordWrapWidth:t.wrapWidth??0,breakWords:!0})}),this.themeListener=e=>this.restyle(e),this.revealSource=null,this.reveal=null,this.opts=t,$.add(this.themeListener)}setColor(e){this.destroyed||(this.style.fill=e)}setWrapWidth(e){this.destroyed||(this.style.wordWrap=e!==void 0,this.style.wordWrapWidth=e??0)}setText(e){this.destroyed||(this.revealSource=null,this.reveal=null,this.text!==e&&(this.text=e))}showProgressive(e,t){this.destroyed||(this.revealSource=e,this.reveal=SI(e.length,t),this.renderRevealed())}updateReveal(e){if(this.destroyed||!this.reveal)return!0;let t=CI(this.reveal,e);return this.renderRevealed(),t}completeReveal(){!this.destroyed&&this.reveal&&(wI(this.reveal),this.renderRevealed())}renderRevealed(){if(!this.reveal||this.revealSource===null)return;let e=this.revealSource.slice(0,Math.floor(this.reveal.revealed));this.text!==e&&(this.text=e)}restyle(e){this.destroyed||(this.style.fontFamily=e.font.family,this.opts.color===void 0&&(this.style.fill=e.color.text),this.opts.size===void 0&&(this.style.fontSize=e.font.size,this.style.lineHeight=e.font.size*e.font.lineHeight),this.opts.align===void 0&&(this.style.align=xI(this.opts,e)))}destroy(e){$.remove(this.themeListener),super.destroy(e)}},DI={positive:5627255,negative:16733525,warning:16757575};function OI(e,t){return t>0?e.slice(Math.max(0,e.length-Math.floor(t))):[]}function kI(e,t){let n=0;for(let t of e)n+=t;let r=0;for(;n>t&&r<e.length-1;)n-=e[r++];return r}var AI=class extends J{constructor(e){super(),this.blocks=[],this.options=e,this.maxLines=e.maxLines??3}get entryCount(){return this.blocks.length}get contentHeight(){return this.blocks.reduce((e,t)=>e+t.label.height,0)}lastEntries(e){return OI(this.blocks.map(e=>({text:e.text,level:e.level})),e)}add(e,t=`info`){let n=new EI({text:e,size:this.options.size,color:this.colorOf(t),wrapWidth:this.options.wrapWidth,resolution:this.options.resolution});this.addChild(n),this.blocks.push({label:n,level:t,text:e}),this.trim(),this.layout()}setMaxLines(e){this.maxLines=Math.max(1,Math.floor(e)),this.trim(),this.layout()}setWrapWidth(e){this.options.wrapWidth=e;for(let t of this.blocks)t.label.style.wordWrapWidth=e;this.trim(),this.layout()}clear(){for(let e of this.blocks.splice(0))e.label.destroy()}colorOf(e){let t=this.options.colors?.[e];return t===void 0?e===`info`?Q().color.text:e===`highlight`?Q().color.textHighlight:DI[e]:t}linesOf(e){let t=Number(e.style.lineHeight)||Number(e.style.fontSize)||1;return Math.max(1,Math.round(e.height/t))}trim(){let e=kI(this.blocks.map(e=>this.linesOf(e.label)),this.maxLines);for(let t of this.blocks.splice(0,e))t.label.destroy()}layout(){let e=0;for(let t of this.blocks)t.label.position.set(0,e),e+=t.label.height}};function jI(e,t,n){let r=Math.max(1,Math.floor(e));for(;r>1&&t*r>n;)r--;return r}function MI(e){let t=1;for(let n=e;n;n=n.parent)t*=Math.abs(n.scale.x);return t}function NI(e,t){let n=(e,r)=>{if(e instanceof jA){let n=t*Math.max(1,Math.round(r));e.resolution!==n&&(e.resolution=n)}for(let t of e.children)n(t,r*Math.abs(t.scale.x))};n(e,MI(e))}var PI=``,FI=``,II=``;function LI(e){let t=``;for(let n=0;n<e.length;n++)if(e[n]===`\\`&&n+1<e.length&&(e[n+1]===`*`||e[n+1]===`_`||e[n+1]===`\\`)){let r=e[n+1];t+=r===`*`?PI:r===`_`?FI:II,n++}else t+=e[n];return t}function RI(e){return e.replaceAll(PI,`*`).replaceAll(FI,`_`).replaceAll(II,`\\`)}function zI(e){return e!==void 0&&/[\p{L}\p{N}_]/u.test(e)}function BI(e,t,n){let r=[],i=0;for(;i<e.length;){if(e[i]!==t){i++;continue}let a=0;for(;e[i+a]===t;)a++;if(!(t===`_`&&zI(e[i-1])&&zI(e[i+a]))){if(n)for(let e=0;e<Math.floor(a/2);e++)r.push(i+e*2);else a%2==1&&r.push(i+a-1)}i+=a}return r}function VI(e,t,n,r,i,a){let o=BI(e,t,n),s=n?2:1;for(let e=0;e+1<o.length;e+=2){let t=o[e],n=o[e+1];i.push({from:t+s,to:n,style:r}),a.push({from:t,to:t+s},{from:n,to:n+s})}}function HI(e){let t=[];for(let n of e){if(!n.text)continue;let e=t[t.length-1];e&&e.bold===n.bold&&e.italic===n.italic?e.text+=n.text:t.push({...n})}return t}function UI(e){let t=LI(e),n=[],r=[];VI(t,`*`,!0,`bold`,n,r),VI(t,`_`,!0,`bold`,n,r),VI(t,`*`,!1,`italic`,n,r),VI(t,`_`,!1,`italic`,n,r);let i=new Set([0,t.length]);for(let e of n)i.add(e.from),i.add(e.to);for(let e of r)i.add(e.from),i.add(e.to);let a=[...i].sort((e,t)=>e-t),o=[];for(let e=0;e+1<a.length;e++){let i=a[e],s=a[e+1];i>=s||r.some(e=>e.from<=i&&s<=e.to)||o.push({text:t.slice(i,s),bold:n.some(e=>e.style===`bold`&&e.from<=i&&s<=e.to),italic:n.some(e=>e.style===`italic`&&e.from<=i&&s<=e.to)})}return HI(o).map(e=>({...e,text:RI(e.text)}))}function WI(e){return UI(e).map(e=>e.text).join(``)}function GI(e,t){let n=[],r=Math.max(0,Math.floor(t));for(let t of e){if(r<=0)break;let e=Math.min(t.text.length,r);n.push({...t,text:t.text.slice(0,e)}),r-=e}return n}var KI=class extends mj{constructor(e={}){let t=bI(e),n=Q(),r=t.tagStyles===void 0?[]:Object.keys(t.tagStyles);super({text:qI(t.text??``,r),resolution:t.resolution,style:new ZA({fontFamily:n.font.family,fontSize:t.size??n.font.size,fontWeight:t.bold?`bold`:`normal`,fill:t.color??n.color.text,lineHeight:(t.size??n.font.size)*n.font.lineHeight,align:xI(t,n),wordWrap:t.wrapWidth!==void 0,wordWrapWidth:t.wrapWidth??0,breakWords:!0,tagStyles:t.tagStyles})}),this.themeListener=e=>this.restyle(e),this.revealSpans=null,this.reveal=null,this.opts=t,this.tags=r,$.add(this.themeListener)}setText(e){this.revealSpans=null,this.reveal=null;let t=qI(e,this.tags);this.text!==t&&(this.text=t)}showProgressive(e,t){this.revealSpans=UI(e),this.reveal=SI(WI(e).length,t),this.renderRevealed()}updateReveal(e){if(!this.reveal)return!0;let t=CI(this.reveal,e);return this.renderRevealed(),t}completeReveal(){this.reveal&&(wI(this.reveal),this.renderRevealed())}renderRevealed(){if(!this.reveal||!this.revealSpans)return;let e=JI(GI(this.revealSpans,this.reveal.revealed),this.tags);this.text!==e&&(this.text=e)}restyle(e){this.style.fontFamily=e.font.family,this.opts.color===void 0&&(this.style.fill=e.color.text),this.opts.size===void 0&&(this.style.fontSize=e.font.size,this.style.lineHeight=e.font.size*e.font.lineHeight),this.opts.align===void 0&&(this.style.align=xI(this.opts,e))}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function qI(e,t){return JI(UI(e),t)}function JI(e,t){return e.map(e=>{let n=YI(e.text,t);return e.italic&&(n=`<i>${n}</i>`),e.bold&&(n=`<b>${n}</b>`),n}).join(``)}function YI(e,t){let n=e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`);for(let e of t)n=n.replaceAll(`<${e}>`,`<${e}>`).replaceAll(`</${e}>`,`</${e}>`);return n}var XI=new Set([`b`,`i`,`span`,`br`,`img`]);function ZI(e,t={}){let n=t.variables??{},r=t.tags,i=[],a=[],o={bold:!1,italic:!1},s=``,c=()=>{if(!s)return;let e={text:s,bold:o.bold,italic:o.italic};o.color!==void 0&&(e.color=o.color),o.size!==void 0&&(e.size=o.size),o.tag!==void 0&&(e.tag=o.tag),i.push(e),s=``};for(let t=0;t<e.length;t++){let l=e[t];if(l===`&`){let n=lL(e,t);if(n){s+=n.text,t=n.end;continue}}if(l===`$`){let r=uL(e,t),i=r?n[r.name]:void 0;if(r&&i!==void 0){s+=i,t=r.end;continue}}if(l===`<`){let n=sL(e,t);if(n&&(XI.has(n.name)||r?.has(n.name))){if(n.name===`img`){let r=cL(e,n);if(r){c(),i.push({text:``,bold:!1,italic:!1,image:r.src}),t=r.end;continue}}else if(n.name===`br`){s+=`
|
|
1370
|
-
`,t=n.end;continue}else if(n.closing){let e=a[a.length-1];if(e?.tag===n.name){c(),o=e.style,a.pop(),t=n.end;continue}}else{c(),a.push({tag:n.name,style:o}),o=
|
|
1371
|
-
`).forEach((e,n)=>{n>0&&r.push({text:``,bold:t.bold,italic:t.italic,hardBreak:!0});for(let n of e.match(/\S+|\s+/g)??[])r.push({text:n,bold:t.bold,italic:t.italic,color:t.color,size:t.size,tag:t.tag})}):r.push({...t});let i=[],a=[],o=0,s=()=>{for(;a.length>0&&a[a.length-1].text.trim()===``&&!a[a.length-1].image;)o-=t(a[a.length-1]),a.pop();i.push({spans:nL(a),width:Math.max(0,o)}),a=[],o=0};for(let e of r){if(e.hardBreak){s();continue}let r=t(e),i=e.image===void 0&&e.text.trim()===``;o>0&&!i&&o+r>n&&s(),a.push(e),o+=r}return(a.length>0||i.length===0)&&s(),i}function nL(e){let t=[];for(let n of e){let e=t[t.length-1];e&&n.image===void 0&&e.image===void 0&&e.bold===n.bold&&e.italic===n.italic&&e.color===n.color&&e.size===n.size&&e.tag===n.tag?e.text+=n.text:t.push({...n})}return t}function rL(e,t){let n=t.direction??`ltr`,r=t.align??(n===`rtl`?`right`:`left`),i=[];for(let a=0;a<e.length;a++){let o=e[a],s=a*t.lineHeight,c=o.spans.map(e=>t.measure(e)),l=c.reduce((e,t)=>e+t,0),u=r===`left`?0:r===`right`?t.maxWidth-l:(t.maxWidth-l)/2,d=n===`rtl`?u+l:u;for(let e=0;e<o.spans.length;e++){let t=c[e],r=n===`rtl`?d-t:d;d=n===`rtl`?d-t:d+t,i.push({span:o.spans[e],x:r,y:s,width:t})}}return i}function iL(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}function aL(e,t,n){if(t===`b`)return{...e,bold:!0};if(t===`i`)return{...e,italic:!0};if(t!==`span`)return{...e,tag:t};let r=oL(n,`color`),i=Number(oL(n,`size`)??``),a={...e};return r&&(a.color=r),Number.isFinite(i)&&i>0&&(a.size=i),a}function oL(e,t){let n=RegExp(`(?:^|\\s)${t}\\s*=\\s*(?:"([^"]*)"|'([^']*)'|([^\\s"'>]+))`).exec(e);return n?n[1]??n[2]??n[3]:void 0}function sL(e,t){let n=/^<(\/?)([a-zA-Z]+)([^>]*)>/.exec(e.slice(t));if(!n)return null;let r=n[3].trimEnd();return{name:n[2].toLowerCase(),closing:n[1]===`/`,selfClosing:r.endsWith(`/`)&&n[1]===``,body:r.replace(/\/$/,``).trim(),end:t+n[0].length-1}}function cL(e,t){if(t.selfClosing){let e=oL(t.body,`src`);return e?{src:e,end:t.end}:null}let n=e.indexOf(`</img>`,t.end+1);if(n<0)return null;let r=e.slice(t.end+1,n).trim();return r?{src:r,end:n+6-1}:null}function lL(e,t){let n={lt:`<`,gt:`>`,amp:`&`,quot:`"`,apos:`'`},r=/^&(lt|gt|amp|quot|apos);/.exec(e.slice(t));if(r)return{text:n[r[1]],end:t+r[0].length-1};let i=/^&#(\d+);/.exec(e.slice(t));return i?{text:String.fromCodePoint(Number(i[1])),end:t+i[0].length-1}:null}function uL(e,t){let n=/^\$([A-Za-z_][A-Za-z0-9_]*)/.exec(e.slice(t));return n?{name:n[1],end:t+n[0].length-1}:null}var dL=class extends J{constructor(e={}){super(),this.themeListener=e=>this.rebuild(e),this.opts=e,this.rebuild(Q()),$.add(this.themeListener)}setText(e){this.opts.text=e,this.rebuild(Q())}rebuild(e){for(let e of this.removeChildren())e.destroy();let t=this.opts.lineHeight??e.font.size*e.font.lineHeight,n=this.opts.maxWidth??1/0,r=this.opts.maxWidth??0,i=this.opts.direction??e.direction,a=this.opts.resolveImage??(e=>zN(e,q.EMPTY)),o=pL(),s=n=>this.measurePiece(n,e,t,a,o),c=this.opts.tagStyles,l=rL(tL(ZI(this.opts.text??``,{variables:this.opts.variables,tags:c===void 0?void 0:new Set(Object.keys(c))}),s,n),{measure:s,maxWidth:r,lineHeight:t,direction:i,align:this.opts.align??(this.opts.maxWidth===void 0?`left`:void 0)});for(let n of l){let r=n.span.image===void 0?this.textFor(n.span,e,t):this.spriteFor(n.span.image,t,a);r.x=n.x,r.y=n.y,this.addChild(r)}}measurePiece(e,t,n,r,i){if(e.image!==void 0)return gL(r(e.image),n).width;let a=this.resolvedFont(e,t);return i?(i.font=`${a.italic?`italic `:``}${a.bold?`bold `:``}${a.size}px ${a.family}`,i.measureText(e.text).width):e.text.length*a.size}tagStyle(e){return e===void 0||this.opts.tagStyles===void 0?void 0:this.opts.tagStyles[e]}resolvedFont(e,t){let n=this.tagStyle(e.tag);return{family:typeof n?.fontFamily==`string`?n.fontFamily:t.font.family,size:typeof n?.fontSize==`number`?n.fontSize:e.size??t.font.size,bold:n?.fontWeight===void 0?e.bold:mL(n.fontWeight),italic:n?.fontStyle===void 0?e.italic:hL(n.fontStyle)}}textFor(e,t,n){let r=this.resolvedFont(e,t),i=this.tagStyle(e.tag);return new nI({text:e.text,resolution:this.opts.resolution,style:{fontFamily:r.family,fontSize:r.size,fontWeight:r.bold?`bold`:`normal`,fontStyle:r.italic?`italic`:`normal`,fill:e.color??t.color.text,lineHeight:n,...i}})}spriteFor(e,t,n){let r=n(e),i=gL(r,t),a=new rI(r);return a.width=i.width,a.height=i.height,a}destroy(e){$.remove(this.themeListener),super.destroy(e)}},fL=null;function pL(){return typeof document>`u`?null:(fL??=document.createElement(`canvas`).getContext(`2d`),fL)}function mL(e){if(e===`bold`||e===`bolder`)return!0;if(e===`normal`||e===`lighter`)return!1;let t=Number(e);return Number.isFinite(t)&&t>=600}function hL(e){return e===`italic`||e===`oblique`}function gL(e,t){return{width:(e.width>0?e.width:t)*(t/(e.height>0?e.height:t)),height:t}}var _L=class extends WA{constructor(e={}){let t=bI(e),n=Q();super({text:t.text??``,style:vL(t,n)}),this.themeListener=e=>this.restyle(e),this.opts=t,$.add(this.themeListener)}setText(e){this.text!==e&&(this.text=e)}restyle(e){this.style=vL(this.opts,e)}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function vL(e,t){return{fontFamily:t.font.family,fontSize:e.size??t.font.size,fontWeight:e.bold?`bold`:`normal`,fill:e.color??t.color.text,align:xI(e,t),wordWrap:e.wrapWidth!==void 0,wordWrapWidth:e.wrapWidth??0,breakWords:!0}}var yL=class extends J{constructor(e,t){super();let n=typeof t.border==`number`?{left:t.border,top:t.border,right:t.border,bottom:t.border}:t.border;this.sprite=new kj({texture:e,leftWidth:n.left,topHeight:n.top,rightWidth:n.right,bottomHeight:n.bottom}),this.addChild(this.sprite)}get border(){return{left:this.sprite.leftWidth,top:this.sprite.topHeight,right:this.sprite.rightWidth,bottom:this.sprite.bottomHeight}}resize(e,t){let n=this.border;this.sprite.width=Math.max(e,n.left+n.right),this.sprite.height=Math.max(t,n.top+n.bottom)}},bL=`position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;`,xL=class{constructor(){this.polite=null,this.assertive=null}region(e){if(typeof document>`u`||!document.body)return null;let t=e?this.assertive:this.polite;if(t)return t;let n=document.createElement(`div`);return n.setAttribute(`aria-live`,e?`assertive`:`polite`),n.setAttribute(`aria-atomic`,`true`),n.setAttribute(`role`,`status`),n.setAttribute(`style`,bL),document.body.appendChild(n),e?this.assertive=n:this.polite=n,n}announce(e,t={}){let n=this.region(t.assertive??!1);n&&(n.textContent=``,n.appendChild(document.createTextNode(e)))}clear(){this.polite&&(this.polite.textContent=``),this.assertive&&(this.assertive.textContent=``)}destroy(){this.polite?.remove(),this.assertive?.remove(),this.polite=null,this.assertive=null}},SL=new xL,CL=class extends J{constructor(e){super(),this.content=new J,this.onClose=new p,this.titleLabel=null,this.closeMark=null,this.innerWidth=0,this.innerHeight=0,this.currentWidth=0,this.currentHeight=0,this.blocker=null,this.themeListener=()=>this.restyle(),this.isClosed=!1,this.motion=null,this.delegate=null,this.onBlockerDown=e=>{e.stopPropagation();let t=e.getLocalPosition(this);this.handleOutsideClick(t.x,t.y)};let t=Q();this.colors={...e.colors},this.modal=e.modal??!0,this.closable=e.closable??!0,this.dims=e.dims??this.modal,this.anchor=e.anchor??`center`,e.blocker===!0&&(this.blocker=new J,this.blocker.eventMode=`static`,this.blocker.on(`pointerdown`,this.onBlockerDown),this.addChild(this.blocker)),this.background=t.panel?new yL(t.panel,{border:t.panelBorder}):new Z,this.addChild(this.background),e.title!==void 0&&(this.titleLabel=new EI({text:e.title,color:this.colors.title??t.color.textHighlight,bold:!0}),this.addChild(this.titleLabel),SL.announce(e.title)),e.closeButton===!0&&this.closable&&(this.closeMark=new EI({text:`✕`,color:this.colors.title??t.color.textHighlight,bold:!0}),this.closeMark.eventMode=`static`,this.closeMark.cursor=`pointer`,this.closeMark.on(`pointertap`,()=>this.close()),this.addChild(this.closeMark)),this.addChild(this.content),this.resize(e.width,e.height),$.add(this.themeListener)}restyle(){this.titleLabel?.setColor(this.colors.title??Q().color.textHighlight),this.closeMark?.setColor(this.colors.title??Q().color.textHighlight),this.resize(this.currentWidth,this.currentHeight)}resize(e,t){this.currentWidth=e,this.currentHeight=t;let n=Q(),r=(this.background instanceof yL?this.background.border.left:2)+n.padding;this.background instanceof yL?(this.background.resize(e,t),this.background.tint=this.colors.background??16777215):this.background.clear().roundRect(0,0,e,t,4).fill({color:this.colors.background??n.color.panelFill}).stroke({color:this.colors.border??n.color.panelBorder,width:1}),this.closeMark&&(this.closeMark.x=n.direction===`rtl`?r:e-r-this.closeMark.width,this.closeMark.y=r);let i=r;this.titleLabel&&(this.titleLabel.x=n.direction===`rtl`?e-r-this.titleLabel.width:r,this.titleLabel.y=r,i=r+this.titleLabel.height+n.padding),this.content.x=r,this.content.y=i,this.innerWidth=Math.max(0,e-r*2),this.innerHeight=Math.max(0,t-i-r)}get contentWidth(){return this.innerWidth}get contentHeight(){return this.innerHeight}setTitle(e){this.titleLabel?.setText(e)}setColors(e){this.colors={...e},this.restyle()}handleAction(e){return this.isClosed?!1:this.delegate?.handleAction(e)?!0:e===`cancel`&&this.closable?(this.close(),!0):!1}get closed(){return this.isClosed}update(e){let t=this.motion;if(!t)return;t.elapsed+=e;let n=t.options.duration??.25,r=Math.min(1,t.elapsed/n);this.applyMotion(t.closing?1-r:r,t),!(r<1)&&(this.motion=null,t.closing?this.close():this.applyMotion(1,t))}applyMotion(e,t){let n=Xj(t.options.animation,e,t.closing),r=t.options.from??{x:t.base.x+this.currentWidth/2,y:t.base.y+this.currentHeight/2};this.scale.set(n.scale),this.alpha=n.alpha,this.position.set(r.x+(t.base.x-r.x)*n.scale,r.y+(t.base.y-r.y)*n.scale+n.offset)}open(e){!e||br()||this.isClosed||(this.motion={options:e,elapsed:0,closing:!1,base:{x:this.x,y:this.y}},this.applyMotion(0,this.motion))}close(e){if(!this.isClosed){if(e&&!br()){let t=this.motion?.base??{x:this.x,y:this.y};this.motion={options:e,elapsed:0,closing:!0,base:t}}else this.isClosed=!0,this.onClose.dispatch(),this.parent?.removeChild(this),this.destroy({children:!0})}}place(e,t){if(this.isClosed)return;let n=this.getLocalBounds(),r=Q().padding*2;this.x=Math.round((e-n.width)/2),this.y=this.anchor===`bottom`?Math.round(t-n.height-r):this.anchor===`top`?r:Math.round((t-n.height)/2),this.fitBlocker(e,t)}fitBlocker(e,t){this.blocker&&(this.blocker.hitArea=new G(-this.x,-this.y,e,t))}handleOutsideClick(e,t){return this.isClosed||e>=0&&t>=0&&e<this.currentWidth&&t<this.currentHeight||!this.closable?!1:(this.close(),!0)}destroy(e){this.isClosed=!0,$.remove(this.themeListener),super.destroy(e)}},wL=class extends J{constructor(){super(),this.windows=[],this.overlay=new Z,this.viewportWidth=0,this.viewportHeight=0,this.listener=e=>this.handleAction(e),this.themeListener=()=>this.drawOverlay(),this.overlay.visible=!1,this.addChild(this.overlay),P.add(this.listener),$.add(this.themeListener)}setViewport(e,t){this.viewportWidth=e,this.viewportHeight=t,this.drawOverlay();for(let n of this.windows)n.place(e,t)}get top(){return this.windows[this.windows.length-1]??null}get isEmpty(){return this.windows.length===0}get depth(){return this.windows.length}push(e){if(e.closed)throw Error(`cannot open a window that was already closed`);return this.windows.push(e),this.addChild(e),e.onClose.add(()=>(this.forget(e),!1)),e.place(this.viewportWidth,this.viewportHeight),this.updateOverlay(),e}pop(){this.top?.close()}closeAll(){for(let e of[...this.windows].reverse())e.close()}forget(e){let t=this.windows.indexOf(e);t!==-1&&this.windows.splice(t,1),this.updateOverlay()}updateOverlay(){let e=this.windows.findIndex(e=>e.dims);e===-1?this.overlay.visible=!1:(this.overlay.visible=!0,this.setChildIndex(this.overlay,Math.max(0,this.getChildIndex(this.windows[e])-1)))}drawOverlay(){let e=Q();this.overlay.clear().rect(0,0,this.viewportWidth,this.viewportHeight).fill({color:e.color.overlay,alpha:e.overlayAlpha})}handleAction(e){return this.top?.handleAction(e)??!1}get blocksWorld(){return this.windows.some(e=>e.modal)}update(e){this.top?.update(e)}destroy(e){P.remove(this.listener),$.remove(this.themeListener),super.destroy(e)}},TL=class{constructor(e){this.list=[],this.current=0,this.hooks=e}get items(){return this.list}get selectedIndex(){return this.current}get selected(){return this.list[this.current]??null}get length(){return this.list.length}reset(e){this.list=e,this.current=e.findIndex(e=>!e.disabled),this.current===-1&&(this.current=0)}swap(e,t){[this.list[e],this.list[t]]=[this.list[t],this.list[e]]}land(e){this.current=e,this.hooks.onChange();let t=this.list[e];t&&this.hooks.onHighlight(t,e)}select(e){e<0||e>=this.list.length||this.list[e].disabled||this.land(e)}confirm(e){let t=this.selected;return!t||t.disabled?!1:(e?.(t,this.current),!0)}step(e,t){if(this.list.length===0)return!1;let n=this.current;for(let r=0;r<t;r++){let t=e(n,this.list.length);if(n=t,!(t<0||t>=this.list.length)&&!this.list[t].disabled)return this.land(t),!0}return!1}},EL=class extends J{constructor(e){super(),this.selection=new TL({onChange:()=>this.refresh(),onHighlight:(e,t)=>this.onHighlight?.(e,t)}),this.rows=[],this.rowsLayer=new J,this.highlight=new Z,this.mask_=new Z,this.scroll=0,this.themeListener=()=>this.restyle(),this.checked=new Set,this.ticks=[];let t=Q();this.viewWidth=e.width,this.viewHeight=e.height,this.explicitRowHeight=e.rowHeight!==void 0,this.rowHeight=e.rowHeight??Math.ceil(t.font.size*t.font.lineHeight)+t.spacing,this.onSelect=e.onSelect??null,this.onHighlight=e.onHighlight??null,this.onToggle=e.onToggle??null,this.multiple=e.multiple??!1,this.addChild(this.highlight),this.addChild(this.rowsLayer),this.addChild(this.mask_),this.rowsLayer.mask=this.mask_,this.drawMask(),this.eventMode=`static`,this.on(`wheel`,e=>this.move(e.deltaY>0?1:-1)),this.setItems(e.items??[]),$.add(this.themeListener)}restyle(){let e=Q();this.explicitRowHeight||(this.rowHeight=Math.ceil(e.font.size*e.font.lineHeight)+e.spacing);let t=e.direction===`rtl`,n=this.selection.items;this.rows.forEach((r,i)=>{r.y=i*this.rowHeight;let a=n[i],o=r.children.find(e=>e instanceof EI);if(o){o.setColor(a.disabled?e.color.textDim:e.color.text);let n=e.spacing+this.checkAdvance()+(a.icon?this.rowHeight:0);o.x=t?this.viewWidth-n-o.width:n,o.y=Math.round((this.rowHeight-o.height)/2)}a.icon&&(a.icon.x=t?this.viewWidth-e.spacing-this.checkAdvance()-this.rowHeight:e.spacing+this.checkAdvance())}),this.updateTicks(),this.refresh()}destroy(e){$.remove(this.themeListener),super.destroy(e)}drawMask(){this.mask_.clear().rect(0,0,this.viewWidth,this.viewHeight).fill({color:16777215})}get visibleRows(){return Math.max(1,Math.floor(this.viewHeight/this.rowHeight))}get selectedIndex(){return this.selection.selectedIndex}get selected(){return this.selection.selected}get length(){return this.selection.length}setItems(e){for(let e of this.rows)e.destroy({children:!0});this.rows=[],this.rowsLayer.removeChildren();let t=Q(),n=t.direction===`rtl`;e.forEach((e,r)=>{let i=new J;i.y=r*this.rowHeight,i.eventMode=`static`,i.cursor=e.disabled?`default`:`pointer`,i.on(`pointerdown`,()=>this.tapRow(r)),e.icon&&(e.icon.x=n?this.viewWidth-t.spacing-this.checkAdvance()-this.rowHeight:t.spacing+this.checkAdvance(),i.addChild(e.icon));let a=new EI({text:e.text,color:e.disabled?t.color.textDim:t.color.text}),o=t.spacing+this.checkAdvance()+(e.icon?this.rowHeight:0);a.x=n?this.viewWidth-o-a.width:o,a.y=Math.round((this.rowHeight-a.height)/2),i.addChild(a),this.rows.push(i),this.rowsLayer.addChild(i)}),this.selection.reset(e),this.checked.clear(),this.rebuildTicks(),this.scroll=0,this.refresh()}resize(e,t){this.viewWidth=e,this.viewHeight=t,this.drawMask(),this.refresh()}move(e){return this.selection.step((t,n)=>(t+e+n)%n,this.selection.length)}select(e){this.selection.select(e)}confirm(){return this.multiple?this.toggleChecked(this.selection.selectedIndex):this.selection.confirm(this.onSelect)}tapRow(e){let t=this.selection.items;e<0||e>=t.length||t[e].disabled||(this.select(e),this.confirm())}handleAction(e){switch(e){case`up`:return this.move(-1);case`down`:return this.move(1);case`confirm`:return this.confirm();default:return!1}}get checkedIndexes(){return[...this.checked].sort((e,t)=>e-t)}isChecked(e){return this.checked.has(e)}setChecked(e,t){let n=this.selection.items[e];n&&!n.disabled&&this.checked.has(e)!==t&&(t?this.checked.add(e):this.checked.delete(e),this.updateTicks(),this.onToggle?.(n,e,t))}toggleChecked(e){let t=this.selection.items[e];return!t||t.disabled?!1:(this.setChecked(e,!this.checked.has(e)),!0)}clearChecked(){this.checked.size!==0&&(this.checked.clear(),this.updateTicks())}checkAdvance(){return this.multiple?this.checkBox()+Q().spacing:0}checkBox(){return Math.max(12,this.rowHeight-8)}rebuildTicks(){if(this.ticks=[],this.multiple){for(let e of this.rows){let t=new Z;e.addChildAt(t,0),this.ticks.push(t)}this.updateTicks()}}updateTicks(){let e=Q(),t=e.direction===`rtl`,n=this.checkBox(),r=Math.round((this.rowHeight-n)/2);this.ticks.forEach((i,a)=>{let o=this.selection.items[a]?.disabled??!0;if(i.clear().rect(0,0,n,n).fill({color:e.color.panelFill}).stroke({color:o?e.color.textDim:e.color.panelBorder,width:2}),this.checked.has(a)){let t=n*.25;i.moveTo(t,n*.55).lineTo(n*.45,n-t).lineTo(n-t,t).stroke({color:o?e.color.textDim:e.color.textHighlight,width:Math.max(2,n*.12),cap:`round`,join:`round`})}i.x=t?this.viewWidth-e.spacing-n:e.spacing,i.y=r})}refresh(){let e=this.visibleRows,t=this.selection.selectedIndex,n=this.selection.length;t<this.scroll?this.scroll=t:t>=this.scroll+e&&(this.scroll=t-e+1),this.scroll=Math.max(0,Math.min(this.scroll,Math.max(0,n-e))),this.rowsLayer.y=-this.scroll*this.rowHeight;let r=Q();n===0?this.highlight.clear():this.highlight.clear().rect(0,(t-this.scroll)*this.rowHeight,this.viewWidth,this.rowHeight).fill({color:r.color.selection})}},DL=class extends J{columnX(e){return(Q().direction===`rtl`?this.columns-1-e:e)*this.cellSize}constructor(e){super(),this.selection=new TL({onChange:()=>this.refresh(),onHighlight:(e,t)=>this.onHighlight?.(e,t)}),this.cells=[],this.cellsLayer=new J,this.highlight=new Z,this.pickupHighlight=new Z,this.mask_=new Z,this.scrollRow=0,this.pickedUp=null,this.pressedIndex=null,this.pressTimer=0,this.themeListener=()=>{let e=Q();this.selection.items.forEach((t,n)=>{let r=this.cells[n];r&&(r.x=this.columnX(n%this.columns),!((t.quantity??1)<=1)&&r.children.find(e=>e instanceof EI)?.setColor(e.color.textHighlight))}),this.refresh()},this.viewWidth=e.width,this.viewHeight=e.height,this.columns=Math.max(1,e.columns),this.cellSize=e.cellSize??Math.floor(this.viewWidth/this.columns),this.longPressDuration=e.longPressDuration??.6,this.onSelect=e.onSelect??null,this.onHighlight=e.onHighlight??null,this.onQuickslot=e.onQuickslot??null,this.onReorder=e.onReorder??null,this.addChild(this.highlight),this.addChild(this.pickupHighlight),this.addChild(this.cellsLayer),this.addChild(this.mask_),this.cellsLayer.mask=this.mask_,this.drawMask(),this.eventMode=`static`,this.on(`wheel`,e=>this.move(0,e.deltaY>0?1:-1)),this.setItems(e.items??[]),$.add(this.themeListener)}destroy(e){$.remove(this.themeListener),super.destroy(e)}drawMask(){this.mask_.clear().rect(0,0,this.viewWidth,this.viewHeight).fill({color:16777215})}get visibleRows(){return Math.max(1,Math.floor(this.viewHeight/this.cellSize))}get rows(){return Math.max(1,Math.ceil(this.selection.length/this.columns))}get selectedIndex(){return this.selection.selectedIndex}get selected(){return this.selection.selected}get length(){return this.selection.length}setItems(e){this.pickedUp=null,this.pressedIndex=null;for(let e of this.cells)e.destroy({children:!0});this.cells=[],this.cellsLayer.removeChildren();let t=Q();e.forEach((e,n)=>{let r=Math.floor(n/this.columns),i=n%this.columns,a=new J;if(a.x=this.columnX(i),a.y=r*this.cellSize,a.eventMode=`static`,a.cursor=e.disabled?`default`:`pointer`,e.icon.x=Math.round((this.cellSize-e.icon.width)/2),e.icon.y=Math.round((this.cellSize-e.icon.height)/2),e.disabled&&(e.icon.alpha=.4),a.addChild(e.icon),(e.quantity??1)>1){let n=new EI({text:String(e.quantity),size:10,color:t.color.textHighlight});n.x=this.cellSize-n.width-2,n.y=this.cellSize-n.height-1,a.addChild(n)}a.on(`pointerdown`,()=>{this.pressedIndex=n,this.pressTimer=0}),a.on(`pointerup`,()=>this.releaseCell(n)),a.on(`pointerupoutside`,()=>this.releaseCell(n)),this.cells.push(a),this.cellsLayer.addChild(a)}),this.selection.reset(e),this.scrollRow=0,this.refresh()}releaseCell(e){this.pressedIndex===e&&(this.pressedIndex=null,this.selection.items[e]?.disabled||this.tapCell(e))}resize(e,t){this.viewWidth=e,this.viewHeight=t,this.drawMask(),this.refresh()}update(e){if(this.pressedIndex===null||(this.pressTimer+=e,this.pressTimer<this.longPressDuration))return;let t=this.pressedIndex;this.pressedIndex=null;let n=this.selection.items[t];n&&!n.disabled&&this.onQuickslot?.(n,t)}tapCell(e){let t=this.selection.items;if(e<0||e>=t.length)return;if(this.pickedUp===null){if(t[e].disabled)return;this.pickedUp=e,this.refresh();return}let n=this.pickedUp;this.pickedUp=null,n!==e&&(this.swapCells(n,e),this.onReorder?.(n,e)),this.refresh()}swapCells(e,t){let n=this.selection.items;this.selection.swap(e,t);let r=this.cells[e],i=this.cells[t],a=r.removeChildren(),o=i.removeChildren();for(let e of o)r.addChild(e);for(let e of a)i.addChild(e);r.cursor=n[e].disabled?`default`:`pointer`,i.cursor=n[t].disabled?`default`:`pointer`}cancelPickup(){this.pickedUp=null,this.refresh()}move(e,t){let n=this.rows,r=this.columns;return this.selection.step(i=>{let a=(Math.floor(i/r)+t+n)%n,o=(i%r+e+r)%r;return a*r+o},n*r)}select(e){this.selection.select(e)}confirm(){return this.selection.confirm(this.onSelect)}handleAction(e){switch(e){case`up`:return this.move(0,-1);case`down`:return this.move(0,1);case`left`:return this.move(Q().direction===`rtl`?1:-1,0);case`right`:return this.move(Q().direction===`rtl`?-1:1,0);case`confirm`:return this.confirm();case`cancel`:return this.pickedUp!==null&&(this.cancelPickup(),!0);default:return!1}}cellRect(e){return{x:this.columnX(e%this.columns),y:Math.floor(e/this.columns)*this.cellSize}}refresh(){let e=this.visibleRows,t=this.selection.selectedIndex,n=Math.floor(t/this.columns);n<this.scrollRow?this.scrollRow=n:n>=this.scrollRow+e&&(this.scrollRow=n-e+1),this.scrollRow=Math.max(0,Math.min(this.scrollRow,Math.max(0,this.rows-e))),this.cellsLayer.y=-this.scrollRow*this.cellSize;let r=Q();if(this.pickupHighlight.clear(),this.pickedUp!==null){let{x:e,y:t}=this.cellRect(this.pickedUp);this.pickupHighlight.rect(e,t,this.cellSize,this.cellSize).stroke({color:r.color.textHighlight,width:2})}if(this.highlight.clear(),this.selection.length>0){let{x:e,y:n}=this.cellRect(t);this.highlight.rect(e,n,this.cellSize,this.cellSize).fill({color:r.color.selection})}}},OL=class{constructor(e){if(this.onChange=new p,this.currentTabIndex=0,this.currentQuery=``,this.rows_=[],this.currentSelectedIndex=0,this.detail=!1,e.tabs.length===0)throw Error(`TabbedList needs at least one tab`);this.tabList=[...e.tabs],this.rowsFor=e.rowsFor,this.pageSize=Math.max(0,Math.floor(e.pageSize??0)),this.labelOf=e.label??(e=>String(e)),this.filterOf=e.filter??((e,t)=>t===``||this.labelOf(e).toLowerCase().includes(t.toLowerCase())),this.disabledOf=e.disabled??(()=>!1),this.recompute()}get tabs(){return this.tabList}get tab(){return this.tabList[this.currentTabIndex]}get query(){return this.currentQuery}get rows(){return this.rows_}get pageCount(){return this.pageSize<=0?1:Math.max(1,Math.ceil(this.rows_.length/this.pageSize))}get page(){return this.pageSize<=0?0:Math.floor(this.currentSelectedIndex/this.pageSize)}get pageRows(){if(this.pageSize<=0)return this.rows_;let e=this.page*this.pageSize;return this.rows_.slice(e,e+this.pageSize)}get selectedIndex(){return this.currentSelectedIndex}get selected(){return this.rows_[this.currentSelectedIndex]??null}get detailOpen(){return this.detail}selectTab(e){let t=this.tabList.findIndex(t=>t.id===e);t===-1||this.tabList[t].disabled||t!==this.currentTabIndex&&(this.currentTabIndex=t,this.recompute(),this.emit())}nextTab(e=1){if(e===0)return;let t=e>0?1:-1,n=this.currentTabIndex;for(let r=0;r<Math.abs(e);r++)do n=(n+t+this.tabList.length)%this.tabList.length;while(this.tabList[n].disabled&&n!==this.currentTabIndex);n!==this.currentTabIndex&&(this.currentTabIndex=n,this.recompute(),this.emit())}setQuery(e){e!==this.currentQuery&&(this.currentQuery=e,this.recompute(),this.emit())}move(e){if(e===0||this.rows_.length===0)return;let t=e>0?1:-1,n=this.currentSelectedIndex;for(let r=0;r<Math.abs(e);r++){let e=n;do e+=t;while(e>=0&&e<this.rows_.length&&this.disabledOf(this.rows_[e]));if(e<0||e>=this.rows_.length)break;n=e}n!==this.currentSelectedIndex&&(this.currentSelectedIndex=n,this.emit())}setPage(e){let t=Math.max(0,Math.min(this.pageCount-1,Math.floor(e)));if(this.pageSize<=0)return;let n=this.firstSelectableOnPage(t);n!==this.currentSelectedIndex&&(this.currentSelectedIndex=n,this.emit())}nextPage(e){this.setPage(this.page+e)}openDetail(){return this.selected===null||this.disabledOf(this.selected)?!1:(this.detail||(this.detail=!0,this.emit()),!0)}closeDetail(){this.detail&&(this.detail=!1,this.emit())}firstSelectableOnPage(e){let t=e*this.pageSize,n=Math.min(this.rows_.length,t+this.pageSize);for(let e=t;e<n;e++)if(!this.disabledOf(this.rows_[e]))return e;return Math.min(t,Math.max(0,this.rows_.length-1))}firstSelectable(e){for(let t=e;t<this.rows_.length;t++)if(!this.disabledOf(this.rows_[t]))return t;return 0}recompute(){let e=this.rowsFor(this.tab.id).filter(e=>this.filterOf(e,this.currentQuery));this.rows_=e,this.currentSelectedIndex=e.length===0?0:this.firstSelectable(0),this.detail=!1}emit(){this.onChange.dispatch()}};function kL(e,t,n={}){let r={},i=t.replace(/\r/g,``).split(`
|
|
1372
|
-
`),a=null,o=``,s=[],c=!1,l=()=>{if(a){if(r[a]!==void 0)throw Error(`Duplicate FTL message: ${a}`);if(s.length){if(!c)throw Error(`FTL select expression is not closed: ${a}`);let t=o.trim().match(/^\{\s*\$([\w-]+)\s*->\s*$/)?.[1];if(!t)throw Error(`Invalid FTL selector: ${o}`);r[a]=
|
|
1369
|
+
`}},sM=class extends nf{constructor(e){super({glProgram:Ym({name:`color-transform-batch`,bits:[Qm,aM,ih(e),ph]}),gpuProgram:Jm({name:`color-transform-batch`,bits:[Zm,oM,nh(e),fh]}),resources:{batchSamplers:jg(e)}}),this.maxTextures=e}},cM=7,lM=class extends If{constructor(){let e=new kf({data:new Float32Array(1),label:`mwg-color-transform-attribute-buffer`,usage:Df.VERTEX|Df.COPY_DST,shrinkToFit:!1}),t=new kf({data:new Uint32Array(1),label:`mwg-color-transform-index-buffer`,usage:Df.INDEX|Df.COPY_DST,shrinkToFit:!1});super({attributes:{aPosition:{buffer:e,format:`float32x2`,stride:28,offset:0},aUV:{buffer:e,format:`float32x2`,stride:28,offset:8},aColor:{buffer:e,format:`unorm8x4`,stride:28,offset:16},aTextureIdAndRound:{buffer:e,format:`uint16x2`,stride:28,offset:20},aColorAdd:{buffer:e,format:`unorm8x4`,stride:28,offset:24}},indexBuffer:t})}},uM=0,dM=e=>e.colorAdd??uM;function fM(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h){e[n]=r*l+a*u+s,e[n+1]=o*u+i*l+c,e[n+2]=d,e[n+3]=f,t[n+4]=p,t[n+5]=m,t[n+6]=h}var pM=class e extends Tg{static{this.extension={type:[I.Batcher],name:`mwg-color-transform`}}constructor(t){super(t),this.geometry=new lM,this.name=e.extension.name,this.vertexSize=cM,this.shader=new sM(t.maxTextures)}packAttributes(e,t,n,r,i){let a=i<<16|e.roundPixels&65535,{a:o,b:s,c,d:l,tx:u,ty:d}=e.transform,{positions:f,uvs:p}=e,m=e.color,h=dM(e),g=e.attributeOffset,_=g+e.attributeSize;for(let e=g;e<_;e++){let i=e*2,g=f[i],_=f[i+1];t[r++]=o*g+c*_+u,t[r++]=l*_+s*g+d,t[r++]=p[i],t[r++]=p[i+1],n[r++]=m,n[r++]=a,n[r++]=h}}packQuadAttributes(e,t,n,r,i){let{a,b:o,c:s,d:c,tx:l,ty:u}=e.transform,{bounds:d}=e,f=e.texture.uvs,p=d.maxX,m=d.minX,h=d.maxY,g=d.minY,_=e.color,v=dM(e),y=i<<16|e.roundPixels&65535;fM(t,n,r,a,o,s,c,l,u,m,g,f.x0,f.y0,_,y,v),r+=cM,fM(t,n,r,a,o,s,c,l,u,p,g,f.x1,f.y1,_,y,v),r+=cM,fM(t,n,r,a,o,s,c,l,u,p,h,f.x2,f.y2,_,y,v),r+=cM,fM(t,n,r,a,o,s,c,l,u,m,h,f.x3,f.y3,_,y,v)}_updateMaxTextures(e){this.shader.maxTextures!==e&&(this.shader.destroy(),this.shader=new sM(e))}destroy(){this.shader.destroy(),super.destroy()}},mM=`mwg-tinted-sprite`;function hM(e){e.renderPipeId=mM}var gM=class{static{this.extension={type:[I.WebGLPipes,I.WebGPUPipes,I.CanvasPipes],name:mM}}constructor(e){this.renderer=e}addRenderable(e,t){let n=this.element(e);e.didViewUpdate&&this.sync(e,n),this.renderer.renderPipes.batch.addToBatch(n,t)}updateRenderable(e){let t=this.element(e);e.didViewUpdate&&this.sync(e,t),t._batcher.updateElement(t)}validateRenderable(e){let t=this.element(e);return!t._batcher.checkAndUpdateTexture(t,e.texture)}sync(e,t){t.bounds=e.visualBounds,t.texture=e.texture,t.colorAdd=e.colorAdd}element(e){let t=e._gpuData;return t[this.renderer.uid]??this.create(e,t)}create(e,t){let n=new _M;return n.renderable=e,n.transform=e.groupTransform,n.texture=e.texture,n.bounds=e.visualBounds,n.roundPixels=this.renderer._roundPixels|e._roundPixels,n.colorAdd=e.colorAdd,t[this.renderer.uid]=n,n}destroy(){this.renderer=null}},_M=class{constructor(){this.batcherName=pM.extension.name,this.topology=`triangle-list`,this.attributeSize=4,this.indexSize=6,this.packAsQuad=!0,this.roundPixels=0,this.colorAdd=0,this._attributeStart=0,this._textureId=0,this._indexStart=0,this._batcher=null,this._batch=null}get blendMode(){return this.renderable.groupBlendMode}get color(){return this.renderable.groupColorAlpha}reset(){this.renderable=null,this.texture=null,this._batcher=null,this._batch=null,this.bounds=null,this.colorAdd=0}destroy(){this.reset()}},vM=!1;function yM(){vM||(vM=!0,L.add(pM),L.add(gM))}function bM(e,t,n,r=0){return(SM(r)<<24|SM(n)<<16|SM(t)<<8|SM(e))>>>0}function xM(e,t){return bM((e>>16&255)/255*t,(e>>8&255)/255*t,(e&255)/255*t)}function SM(e){return Math.max(0,Math.min(255,Math.round(e*255)))}var CM=uM;yM();var wM=class extends wl{constructor(e){super(e),this._colorAdd=0,hM(this)}get colorAdd(){return this._colorAdd}set colorAdd(e){this._colorAdd!==e&&(this._colorAdd=e,this.onViewUpdate())}setColorAdd(e,t,n,r=0){this.colorAdd=bM(e,t,n,r)}lerpTint(e,t){let n=Math.round((1-t)*255);this.tint=n<<16|n<<8|n,this.colorAdd=xM(e,t)}silhouette(e){this.tint=0,this.colorAdd=xM(e,1)}resetColor(){this.tint=16777215,this.colorAdd=0}};function TM(e){return[e>>16&255,e>>8&255,e&255]}function EM(e){let[t,n,r]=TM(e);return Math.floor((t+n+r)/3)}function DM(e,t,n){return Math.trunc(n*e+(1-n)*t)}function OM(e,t,n){let[r,i,a]=TM(e),[o,s,c]=TM(t);return DM(r,o,n)<<16|DM(i,s,n)<<8|DM(a,c,n)}function kM(e,t){let n=e.length>0?EM(e[0]):255;return{from:e,to:e.map(e=>{let r=EM(e);return n!==0&&r<=n?OM(t.mid,t.min,r/n):OM(t.mid,t.max,(255-r)/(255-n))})}}function AM(e,t,n=`exact`){let r=t.from.map(TM),i=new Uint8ClampedArray(e.length);for(let a=0;a<e.length;a+=4){let o=e[a+3],s=e[a],c=e[a+1],l=e[a+2];if(i[a]=s,i[a+1]=c,i[a+2]=l,i[a+3]=o,o===0||r.length===0)continue;if(n===`exact`){let e=r.findIndex(([e,t,n])=>e===s&&t===c&&n===l);if(e<0)continue;let[n,o,u]=TM(t.to[e]??t.from[e]);i[a]=n,i[a+1]=o,i[a+2]=u;continue}let u=0,d=1/0;for(let e=0;e<r.length;e+=1){let[t,n,i]=r[e],a=s-t,o=c-n,f=l-i,p=a*a+o*o+f*f;p<d&&(d=p,u=e)}let[f,p,m]=TM(t.to[u]??t.from[u]);i[a]=f,i[a+1]=p,i[a+2]=m}return i}function jM(e,t,n){let r=e.width,i=e.height;if(r<=0||i<=0||!e.source)return e;let a=!t.createCanvas,o=t.createCanvas?.(r,i)??(typeof document>`u`?null:document.createElement(`canvas`));if(!o)return e;o.width=r,o.height=i;let s=o.getContext(`2d`);if(!s)return e;let c=a?{drawImage:s.drawImage.bind(s),getImageData:s.getImageData.bind(s),putImageData:(e,t,n)=>s.putImageData(new ImageData(new Uint8ClampedArray(e.data),e.width,e.height),t,n)}:s;return s.drawImage(e.source.resource,0,0),n(c,r,i),q.from(o)}function MM(e,t,n={},r=`exact`){return jM(e,n,(e,n,i)=>{let a=AM(e.getImageData(0,0,n,i).data,t,r);e.putImageData({data:a,width:n,height:i},0,0)})}function NM(e){e=e.replace(/^"|"$/g,``);let t=[],n=0,r=0;for(let i=0;i<e.length;i+=1)e[i]===`(`?r+=1:e[i]===`)`?r=Math.max(0,r-1):e[i]===`~`&&r===0&&(t.push(e.slice(n,i)),n=i+1);t.push(e.slice(n));let i=(t.shift()??``).trim(),a=[];for(let e of t){let t=/^([A-Za-z][A-Za-z0-9_-]*)(?:\((.*)\))?$/.exec(e.trim());t&&a.push({name:t[1].toUpperCase(),args:t[2]===void 0?[]:t[2].split(`,`).map(e=>e.trim())})}return{path:i,modifiers:a}}function PM(e,t){return e.modifiers.find(e=>e.name===t.toUpperCase())}function FM(e){return e!==void 0&&/^(linear|smooth)$/i.test(e)?`linear`:`nearest`}function IM(e,t,n){return[1,0,0,0,e/255,0,1,0,0,t/255,0,0,1,0,n/255,0,0,0,1,0]}function LM(e){return[(e.red??100)/100,0,0,0,0,0,(e.green??100)/100,0,0,0,0,0,(e.blue??100)/100,0,0,0,0,0,1,0]}function RM(e,t){let n=1-t,r=(e>>16&255)/255,i=(e>>8&255)/255,a=(e&255)/255;return[n,0,0,0,r*t,0,n,0,0,i*t,0,0,n,0,a*t,0,0,0,1,0]}function zM(e){let t=[`R`,`G`,`B`,`A`].map((t,n)=>e[n]??t),n=e=>{switch(e){case`R`:return[1,0,0,0,0];case`G`:return[0,1,0,0,0];case`B`:return[0,0,1,0,0];case`A`:return[0,0,0,1,0];case`0`:return[0,0,0,0,0];case`1`:return[0,0,0,0,1]}};return t.flatMap(e=>n(e))}function BM(e,t){let n=new Bk;n.matrix=t,e.filters=[n]}function VM(e){if(e===void 0)return;let t=e.trim(),n=t.endsWith(`%`),r=Number(n?t.slice(0,-1):t);if(Number.isFinite(r))return n||r>1?r/100:r}function HM(e){if(e===void 0)return;let t=Number.parseInt(e.replace(/^#/,``),16);return Number.isFinite(t)?t:void 0}function UM(e,t){e.filters=[...e.filters??[],t]}function WM(e,t,n=1){let r=PM(t,`FL`);r&&(r.args.length===0||r.args.some(e=>/horiz|horizontal|x/i.test(e)))&&(e.scale.x*=-1),r?.args.some(e=>/vert|vertical|y/i.test(e))&&(e.scale.y*=-1);let i=PM(t,`SCALE`);if(i){let t=Number(i.args[0]),r=Number(i.args[1]??i.args[0]);Number.isFinite(t)&&t>0&&(e.width=t*n),Number.isFinite(r)&&r>0&&(e.height=r*n)}if(PM(t,`GS`)){let t=new Bk;t.greyscale(1,!1),UM(e,t)}let a=PM(t,`CS`);if(a){let t=a.args.slice(0,3).map(Number);if(t.length===3&&t.every(e=>Number.isFinite(e))){let n=new Bk;n.matrix=IM(t[0],t[1],t[2]),UM(e,n)}}let o=PM(t,`R`),s=PM(t,`G`),c=PM(t,`B`);if(o||s||c){let t=o?Number(o.args[0]):void 0,n=s?Number(s.args[0]):void 0,r=c?Number(c.args[0]):void 0,i=new Bk;i.matrix=LM({red:Number.isFinite(t)?t:void 0,green:Number.isFinite(n)?n:void 0,blue:Number.isFinite(r)?r:void 0}),UM(e,i)}let l=PM(t,`CHAN`);if(l&&l.args.length>0){let t=l.args.map(e=>e.trim().toUpperCase()),n=new Bk;n.matrix=zM(t),UM(e,n)}let u=PM(t,`O`);if(u){let t=VM(u.args[0]);t!==void 0&&(e.alpha*=kn(t,0,1))}}function GM(e,t,n={},r=1){e.texture=XM(e.texture,t,n),WM(e,t,r)}function KM(e,t){let n=PM(t,`CROP`);if(!n||n.args.length<4||!e.source)return e;let r=n.args.slice(0,4).map(Number);if(r.some(e=>!Number.isFinite(e))||r[2]<=0||r[3]<=0)return e;let i=Math.max(0,r[0]),a=Math.max(0,r[1]),o=Math.min(r[2],Math.max(0,e.width-i)),s=Math.min(r[3],Math.max(0,e.height-a));return o>0&&s>0?new q({source:e.source,frame:new G(i,a,o,s)}):e}function qM(e,t){let n=e.trim();return HM(n)??t?.(n)}function JM(e,t){let n=[],r=[];for(let i of e){let[e,a]=i.split(`>`);if(e===void 0||a===void 0)continue;let o=qM(e,t),s=qM(a,t);o!==void 0&&s!==void 0&&(n.push(o),r.push(s))}return{from:n,to:r}}function YM(e,t){let n=e.join(`,`),r=n.indexOf(`>`);if(r<0)return{from:[],to:[]};let i=e=>e.split(`,`).map(e=>qM(e,t)).filter(e=>e!==void 0);return{from:i(n.slice(0,r)),to:i(n.slice(r+1))}}function XM(e,t,n={}){let r=e,i=PM(t,`RC`);if(i&&i.args.length>0){let e=JM(i.args,n.resolveColor);e.from.length>0&&(r=MM(r,e,n,`exact`))}let a=PM(t,`PAL`);if(a){let e=YM(a.args,n.resolveColor);e.from.length>0&&e.from.length===e.to.length&&(r=MM(r,e,n,`exact`))}let o=PM(t,`BLIT`);if(o&&o.args.length>0&&n.resolveTexture){let e=n.resolveTexture(o.args[0]);if(e){let t=Number(o.args[1]??0)||0,i=Number(o.args[2]??0)||0;r=jM(r,n,n=>{n.drawImage(e.source.resource,t,i)})}}let s=PM(t,`MASK`);if(s&&s.args.length>0&&n.resolveTexture){let e=n.resolveTexture(s.args[0]);if(e){let t=Number(s.args[1]??0)||0,i=Number(s.args[2]??0)||0;r=jM(r,n,(r,a,o)=>{let s=r.getImageData(0,0,a,o),c=ZM(e.width,e.height,n);if(!c)return;let l=c.getContext(`2d`);if(!l)return;l.drawImage(e.source.resource,0,0);let u=l.getImageData(0,0,e.width,e.height),d=QM(s.data,a,o,u.data,e.width,e.height,t,i);r.putImageData({data:d,width:a,height:o},0,0)})}}let c=PM(t,`BLEND`);if(c){let e=qM(c.args[0]??``,n.resolveColor),t=VM(c.args[1]);e!==void 0&&t!==void 0&&(r=jM(r,n,(n,r,i)=>{let a=$M(n.getImageData(0,0,r,i).data,e,t);n.putImageData({data:a,width:r,height:i},0,0)}))}let l=PM(t,`ROTATE`);if(l){let e=Number(l.args[0]);if(Number.isFinite(e)&&e%360!=0){let t=r.width,i=r.height;if(t>0&&i>0&&r.source){let a=ZM(t,i,n),o=a?.getContext(`2d`);if(a&&o){o.drawImage(r.source.resource,0,0);let a=eN(o.getImageData(0,0,t,i).data,t,i,e,FM(l.args[1])),s=ZM(a.width,a.height,n),c=s?.getContext(`2d`);s&&c&&(c.putImageData({data:a.data,width:a.width,height:a.height},0,0),r=q.from(s))}}}}return r}function ZM(e,t,n){let r=n.createCanvas?.(e,t)??(typeof document>`u`?null:document.createElement(`canvas`));return r?(r.width=e,r.height=t,r):null}function QM(e,t,n,r,i,a,o,s){let c=new Uint8ClampedArray(e.length);for(let l=0;l<n;l+=1)for(let n=0;n<t;n+=1){let u=(l*t+n)*4,d=n-o,f=l-s,p=d>=0&&d<i&&f>=0&&f<a?r[(f*i+d)*4+3]:0;c[u]=e[u],c[u+1]=e[u+1],c[u+2]=e[u+2],c[u+3]=Math.round(e[u+3]*p/255)}return c}function $M(e,t,n){let r=kn(n,0,1),i=t>>16&255,a=t>>8&255,o=t&255,s=new Uint8ClampedArray(e.length);for(let t=0;t<e.length;t+=4){let n=e[t+3];s[t+3]=n,n===0?(s[t]=e[t],s[t+1]=e[t+1],s[t+2]=e[t+2]):(s[t]=e[t]*(1-r)+i*r,s[t+1]=e[t+1]*(1-r)+a*r,s[t+2]=e[t+2]*(1-r)+o*r)}return s}function eN(e,t,n,r,i=`nearest`){let a=r*Math.PI/180,o=Math.cos(a),s=Math.sin(a),c=t/2,l=n/2,u=0,d=0;for(let[e,t]of[[-c,-l],[c,-l],[c,l],[-c,l]])u=Math.max(u,Math.abs(e*o-t*s)),d=Math.max(d,Math.abs(e*s+t*o));let f=Math.max(1,Math.round(u*2)),p=Math.max(1,Math.round(d*2)),m=new Uint8ClampedArray(f*p*4),h=t/2-.5,g=n/2-.5,_=f/2-.5,v=p/2-.5,y=i===`linear`&&r%90!=0;for(let r=0;r<p;r+=1)for(let i=0;i<f;i+=1){let a=i-_,c=r-v,l=a*o+c*s+h,u=-a*s+c*o+g,d=(r*f+i)*4;if(y)tN(e,t,n,l,u,m,d);else{let r=Math.round(l),i=Math.round(u);if(r<0||r>=t||i<0||i>=n)continue;let a=(i*t+r)*4;m[d]=e[a],m[d+1]=e[a+1],m[d+2]=e[a+2],m[d+3]=e[a+3]}}return{data:m,width:f,height:p}}function tN(e,t,n,r,i,a,o){if(r<-.5||i<-.5||r>t-.5||i>n-.5)return;let s=Math.floor(r),c=Math.floor(i),l=r-s,u=i-c,d=0,f=0,p=0,m=0;for(let r=0;r<=1;r+=1)for(let i=0;i<=1;i+=1){let a=(i===0?1-l:l)*(r===0?1-u:u);if(a===0)continue;let o=kn(s+i,0,t-1),h=(kn(c+r,0,n-1)*t+o)*4,g=e[h+3];d+=g*a,f+=e[h]*g*a,p+=e[h+1]*g*a,m+=e[h+2]*g*a}d<=0||(a[o]=f/d,a[o+1]=p/d,a[o+2]=m/d,a[o+3]=d)}var nN=class{constructor(e,{fps:t=10,loop:n=!0,startTime:r=0}={}){if(e.length===0)throw Error(`an animation needs at least one frame`);if(!(t>0))throw Error(`an animation needs a positive fps, got ${t}`);this.frameDuration=1/t,this.frames=e.map(e=>rN(e)?e:{texture:e}),this.times=this.frames.map(e=>e.duration??this.frameDuration),this.loop=n,this.startTime=r;let i=0,a=0;for(let e of this.frames)e.duration===void 0?i++:a+=e.duration;this.duration=i*this.frameDuration+a}frameAt(e){return this.frames[this.frameIndexAt(e)]}frameIndexAt(e){let t=e-this.startTime;if(t<=0)return 0;let n=this.duration;if(n<=0)return this.frames.length-1;let r=this.loop?t%n:Math.min(t,n);for(let e=0;e<this.times.length;e++){if(r<this.times[e])return e;r-=this.times[e]}return this.frames.length-1}};function rN(e){return e.texture!==void 0}var iN=class extends wM{constructor(...e){super(...e),this.animations=new Map,this.current=null,this.currentName=null,this.elapsed=0,this.finished=!1,this.offset={x:0,y:0},this.onFinish=null,this.paused=!1}add(e,t,n){return this.animations.set(e,new nN(t,n)),this}has(e){return this.animations.has(e)}get playing(){return this.currentName}get isFinished(){return this.finished}get frameOffset(){return this.offset}get elapsedTime(){return this.elapsed}play(e,t=!1){if(!t&&this.currentName===e&&!this.finished)return this;let n=this.animations.get(e);if(!n)throw Error(`no animation named "${e}" on this sprite`);return this.current=n,this.currentName=e,this.elapsed=0,this.finished=!1,this.show(n.frameAt(0)),this}stop(){this.current=null,this.currentName=null}update(e){let t=this.current;!t||this.paused||this.finished||(this.elapsed+=e,this.show(t.frameAt(this.elapsed)),!t.loop&&this.elapsed>=t.startTime+t.duration&&(this.finished=!0,this.onFinish?.(this.currentName)))}show(e){this.texture=e.texture,this.offset.x=e.offsetX??0,this.offset.y=e.offsetY??0}};function aN(e,t,n,r){return t>=e.x-r&&t<=e.x+e.width+r&&n>=e.y-r&&n<=e.y+e.height+r}function oN(e,t,n,r=0){return aN(e.view,t,n,r)}var sN=class{constructor(){this.members=[]}get size(){return this.members.length}add(e){return this.members.includes(e)||this.members.push(e),this}remove(e){let t=this.members.indexOf(e);return t<0?!1:(this.members.splice(t,1),!0)}clear(){this.members.length=0}update(e,t,n=0){let r=e.view;for(let e of[...this.members])aN(r,e.x,e.y,n)&&e.update(t)}};function cN(e){for(let t of[`columns`,`rows`])if(!Number.isInteger(e[t])||e[t]<2)throw RangeError(`a pinned deform grid needs integer ${t} of at least 2, saw ${e[t]}`);for(let t of[`width`,`height`])if(!Number.isFinite(e[t])||e[t]<=0)throw RangeError(`a pinned deform grid needs ${t} above 0, saw ${e[t]}`)}function lN(e,t){if(!Number.isFinite(e)||!Number.isFinite(t))throw Error(`a deform control point needs finite coordinates, saw (${e}, ${t})`)}var uN=class{constructor(e){cN(e),this.columns=e.columns,this.rows=e.rows,this.width=e.width,this.height=e.height,this.rest=new Float32Array(this.count*2),this.offsets=new Float32Array(this.count*2);for(let e=0;e<this.rows;e++)for(let t=0;t<this.columns;t++){let n=(e*this.columns+t)*2;this.rest[n]=t/(this.columns-1)*this.width,this.rest[n+1]=e/(this.rows-1)*this.height}}get count(){return this.columns*this.rows}indexOf(e,t){if(!Number.isInteger(e)||!Number.isInteger(t)||e<0||t<0||e>=this.columns||t>=this.rows)throw RangeError(`control point (${e}, ${t}) is outside a ${this.columns}x${this.rows} grid`);return t*this.columns+e}checkIndex(e){if(!Number.isInteger(e)||e<0||e>=this.count)throw RangeError(`control point ${e} is outside a grid of ${this.count} points`)}restAt(e){return this.checkIndex(e),{x:this.rest[e*2],y:this.rest[e*2+1]}}at(e){return this.checkIndex(e),{x:this.rest[e*2]+this.offsets[e*2],y:this.rest[e*2+1]+this.offsets[e*2+1]}}isMoved(e){return this.checkIndex(e),this.offsets[e*2]!==0||this.offsets[e*2+1]!==0}movedCount(){let e=0;for(let t=0;t<this.count;t++)(this.offsets[t*2]!==0||this.offsets[t*2+1]!==0)&&e++;return e}drag(e,t,n){this.checkIndex(e),lN(t,n),this.offsets[e*2]=t-this.rest[e*2],this.offsets[e*2+1]=n-this.rest[e*2+1]}dragMany(e){for(let t of e)this.checkIndex(t.index),lN(t.x,t.y);for(let t of e)this.drag(t.index,t.x,t.y)}nudge(e,t,n){this.checkIndex(e),lN(t,n),this.offsets[e*2]+=t,this.offsets[e*2+1]+=n}reset(e){e===void 0?this.offsets.fill(0):(this.checkIndex(e),this.offsets[e*2]=0,this.offsets[e*2+1]=0)}rebase(e){if(!(e instanceof Float32Array)||e.length!==this.rest.length)throw Error(`rebase needs a Float32Array of ${this.rest.length} floats, saw length ${e?.length}`);for(let t of e)if(!Number.isFinite(t))throw Error(`rebase needs finite rest positions`);this.rest.set(e),this.offsets.fill(0)}positions(){let e=new Float32Array(this.rest.length);return this.writePositions(e),e}writePositions(e){if(!(e instanceof Float32Array)||e.length!==this.rest.length)throw Error(`a deform target needs a Float32Array of ${this.rest.length} floats, saw length ${e?.length}`);for(let t=0;t<this.rest.length;t++)e[t]=this.rest[t]+this.offsets[t]}},dN=class extends _j{constructor(e,t){let n=t?.columns??4,r=t?.rows??4,i=new uN({columns:n,rows:r,width:e.width,height:e.height});super({texture:e,verticesX:n,verticesY:r}),this.deform=i,this.autoResize=!1,this.deform.rebase(Float32Array.from(this.positionArray())),this.sync()}positionArray(){return this.geometry.getAttribute(`aPosition`).buffer.data}sync(){let e=this.geometry.getAttribute(`aPosition`);this.deform.writePositions(e.buffer.data),e.buffer.update()}get columns(){return this.deform.columns}get rows(){return this.deform.rows}get count(){return this.deform.count}indexOf(e,t){return this.deform.indexOf(e,t)}restAt(e){return this.deform.restAt(e)}vertexAt(e){return this.deform.at(e)}isMoved(e){return this.deform.isMoved(e)}movedCount(){return this.deform.movedCount()}dragVertex(e,t,n){this.deform.drag(e,t,n),this.sync()}dragVertices(e){this.deform.dragMany(e),this.sync()}nudgeVertex(e,t,n){this.deform.nudge(e,t,n),this.sync()}resetVertices(e){this.deform.reset(e),this.sync()}},fN=l({advance:()=>SN,advancePlayback:()=>vN,advancePose:()=>CN,boneOrder:()=>pN,create:()=>mN,createMixer:()=>yN,crossfadeTo:()=>bN,mixPoses:()=>xN,resolve:()=>hN,samplePose:()=>gN,sampleTransformPose:()=>_N,solveTwoBoneIK:()=>EN,validatePose:()=>TN});function pN(e){let t=new Map(e.bones.map(e=>[e.name,e])),n=[],r=new Set,i=new Set,a=e=>{if(!r.has(e.name)){if(i.has(e.name))throw Error(`skeleton cycle involving ${e.name}`);if(e.parent&&!t.has(e.parent))throw Error(`skeleton bone ${e.name} names no parent ${e.parent}`);if(e.parent){i.add(e.name);let n=t.get(e.parent);n&&a(n),i.delete(e.name)}r.has(e.name)||(r.add(e.name),n.push(e.name))}};for(let t of e.bones)a(t);return n}function mN(e){let t=new Set;for(let n of e){if(t.has(n.name))throw Error(`duplicate skeleton bone ${n.name}`);if(t.add(n.name),n.limits&&!(n.limits.min<=n.limits.max))throw Error(`invalid joint limits for bone ${n.name}`)}let n=pN({bones:e});for(let t of e)if(t.parent&&n.indexOf(t.parent)>=n.indexOf(t.name))throw Error(`skeleton bone ${t.name} cannot precede its parent ${t.parent}`);return{bones:e}}function hN(e,t={}){let n=typeof t.rotations==`object`?t.rotations:t,r=t.translations??{},i=t.scales??{},a=new Map(e.bones.map(e=>[e.name,e])),o=new Map;for(let t of pN(e)){let e=a.get(t);if(!e)throw Error(`skeleton bone ${t} went missing`);let s=e.parent?o.get(e.parent):void 0,c=(e.rotation??0)+(n[t]??0),l=(s?s.angle:0)+c,u=i[t]??{x:1,y:1},d=(s?s.scaleX:1)*u.x,f=(s?s.scaleY:1)*u.y,p=l*Math.PI/180,m={a:Math.cos(p)*d,b:Math.sin(p)*d,c:-Math.sin(p)*f,d:Math.cos(p)*f},h=s?{a:s.matrix.a,b:s.matrix.b,c:s.matrix.c,d:s.matrix.d}:{a:1,b:0,c:0,d:1},g=e.origin?.x??0,_=e.origin?.y??0,v=g+(r[t]?.x??0),y=_+(r[t]?.y??0),b=(s?s.tipX:0)+h.a*v+h.c*y,x=(s?s.tipY:0)+h.b*v+h.d*y;for(let e of[m.a,m.b,m.c,m.d])if(!Number.isFinite(e))throw Error(`invalid transform for bone ${t}`);o.set(t,{name:t,x:b,y:x,angle:l,scaleX:d,scaleY:f,matrix:m,tipX:b+m.a*(e.length??0),tipY:x+m.b*(e.length??0)})}return[...o.values()]}function gN(e,t,n){return{..._N(e,t,n).rotations}}function _N(e,t,n){let r=e.frames;if(!r.length)return n&&TN(n,{}),{rotations:{}};let i=e.loop&&e.duration>0?(t%e.duration+e.duration)%e.duration:t,a=r[0];if(!e.loop&&i>=e.duration)a=r[r.length-1];else if(i>=r[0].time){a=r[r.length-1];for(let e=1;e<r.length;e++)if(i<r[e].time){let t=r[e].time-r[e-1].time;a=wN(r[e-1],r[e],t>0?(i-r[e-1].time)/t:0,!0);break}}let o=wN(a,a,0,!0);return n&&TN(n,o.rotations),o}function vN(e,t){let n=e.clip,r=e.time+t*e.rate;return n.loop&&n.duration>0?(r%=n.duration,r<0&&(r+=n.duration)):r=Math.max(0,Math.min(n.duration,r)),{clip:n,time:r,rate:e.rate}}function yN(e,t,n=1){return{skeleton:e,base:{clip:t,time:0,rate:n},layers:[]}}function bN(e,t,n=.25,r=e.base.rate){n<=0?(e.base={clip:t,time:0,rate:r},e.crossfade=void 0):(e.crossfade={from:e.base,remaining:n,duration:n},e.base={clip:t,time:0,rate:r})}function xN(e,t){let n={rotations:e};for(let e of[...t].sort((e,t)=>e.priority-t.priority)){let t=Math.max(0,Math.min(1,e.weight));t&&(n=wN(n,{rotations:e.pose},t,!1))}return{...n.rotations}}function SN(e,t){return{...CN(e,t).rotations}}function CN(e,t){e.base=vN(e.base,t);for(let n of e.layers)n.playback=vN(n.playback,t);let n=_N(e.base.clip,e.base.time,e.skeleton);if(e.crossfade){let r=e.crossfade;r.from=vN(r.from,t),r.remaining=Math.max(0,r.remaining-t);let i=_N(r.from.clip,r.from.time,e.skeleton),a=r.duration>0?1-r.remaining/r.duration:1;n=wN(i,n,a,!0),r.remaining===0&&(e.crossfade=void 0)}for(let t of[...e.layers].sort((e,t)=>e.priority-t.priority))n=wN(n,_N(t.playback.clip,t.playback.time,e.skeleton),Math.max(0,Math.min(1,t.weight)),!1);return n}function wN(e,t,n,r){let i={...e.rotations};for(let a of new Set([...Object.keys(t.rotations),...r?Object.keys(e.rotations):[]]))i[a]=(e.rotations[a]??0)*(1-n)+(t.rotations[a]??0)*n;let a={rotations:i};for(let i of[`translations`,`scales`]){let o=e[i]??{},s=t[i]??{},c=+(i===`scales`),l={...o};for(let e of new Set([...Object.keys(s),...r?Object.keys(o):[]]))l[e]={x:(o[e]?.x??c)*(1-n)+(s[e]?.x??c)*n,y:(o[e]?.y??c)*(1-n)+(s[e]?.y??c)*n};Object.keys(l).length&&(a[i]=l)}return a}function TN(e,t){for(let n of e.bones){let e=(n.rotation??0)+(t[n.name]??0);if(!Number.isFinite(e))throw Error(`invalid rotation for bone ${n.name}`);if(n.limits&&(e<n.limits.min||e>n.limits.max))throw Error(`joint limit for bone ${n.name}: ${e} outside [${n.limits.min}, ${n.limits.max}]`)}}function EN(e,t,n,r,i=1,a={}){let o=e.bones.find(e=>e.name===t),s=e.bones.find(e=>e.name===n);if(!o||!s||s.parent!==t)throw Error(`IK chain ${t}/${n} must be connected`);if((s.origin?.x??0)!==0||(s.origin?.y??0)!==0)throw Error(`IK bone ${n} needs a zero origin`);let c=o.length??0,l=s.length??0;if(!(c>0&&l>0)||!Number.isFinite(c+l))throw Error(`IK chain ${t}/${n} needs positive finite lengths`);if(!Number.isFinite(r.x)||!Number.isFinite(r.y)||i!==1&&i!==-1)throw Error(`invalid IK target or bend for ${t}/${n}`);let u=hN(e,a),d=u.find(e=>e.name===t);if(!d)throw Error(`IK chain ${t}/${n} resolves no base`);let f=r.x-d.x,p=r.y-d.y,m=Math.hypot(f,p);if(m>c+l+1e-9||m<Math.abs(c-l)-1e-9)throw Error(`unreachable IK target for ${t}/${n}`);let h=i*Math.acos(Math.max(-1,Math.min(1,(m*m-c*c-l*l)/(2*c*l)))),g=Math.atan2(p,f)-Math.atan2(l*Math.sin(h),c+l*Math.cos(h)),_=o.parent?u.find(e=>e.name===o.parent):void 0,v=_?_.angle:0,y={...a,[t]:g*180/Math.PI-v-(o.rotation??0),[n]:h*180/Math.PI-(s.rotation??0)};return TN(e,y),y}var DN=class extends J{constructor(e,t){super(),this.parts=new Map,this.skeleton=e,this.mixer=t}bind(e,t){let n=new wM(t);return this.parts.set(e,n),this.addChild(n),n}part(e){return this.parts.get(e)}apply(e){let t=new Map(hN(this.skeleton,e).map(e=>[e.name,e]));for(let[e,n]of this.parts){let r=t.get(e);if(!r)throw Error(`skeletal sprite binds no bone named ${e}`);let{a:i,b:a,c:o,d:s}=r.matrix;n.setFromMatrix(new z(i,a,o,s,r.x,r.y))}if(this.diagnostics){this.setChildIndex(this.diagnostics,this.children.length-1);let e=this.diagnostics.clear();for(let n of t.values())e.moveTo(n.x,n.y).lineTo(n.tipX,n.tipY).stroke({color:65535,width:2}),e.circle(n.x,n.y,4).fill(16768256),e.circle(n.tipX,n.tipY,2).fill(16729224),e.moveTo(n.x-7,n.y).lineTo(n.x+7,n.y).moveTo(n.x,n.y-7).lineTo(n.x,n.y+7).stroke({color:16768256,width:1})}}setDiagnostics(e){e&&!this.diagnostics&&(this.diagnostics=this.addChild(new Z)),!e&&this.diagnostics&&(this.diagnostics.destroy(),this.diagnostics=void 0)}update(e){if(!this.mixer)throw Error(`a skeletal sprite without a mixer needs apply(pose)`);this.apply(SN(this.mixer,e))}},ON=class{constructor(e){if(this.points=[],this.previous=[],e.segments<2)throw Error(`an articulated chain needs at least two segments`);if(e.length<=0)throw Error(`an articulated chain needs a positive length`);this.length=e.length,this.stiffness=kn(e.stiffness??1,0,1),this.bendLimit=(e.bendLimit??90)*(Math.PI/180);for(let t=0;t<e.segments;t++)this.points.push({x:-t*e.length,y:0}),this.previous.push({x:-t*e.length,y:0})}pull(e,t){this.points[0].x=e,this.points[0].y=t}update(e){for(let e=0;e<this.points.length;e++)this.previous[e]={x:this.points[e].x,y:this.points[e].y};for(let e=1;e<this.points.length;e++){let t=this.previous[e-1],n=this.points[e],r=t.x-n.x,i=t.y-n.y,a=Math.hypot(r,i);if(a>this.length){let e=a>0?(a-this.length)/a:0;n.x+=r*e*this.stiffness,n.y+=i*e*this.stiffness}}for(let e=2;e<this.points.length;e++){let t=this.points[e-2],n=this.points[e-1],r=this.points[e],i=Math.atan2(n.y-t.y,n.x-t.x),a=Math.atan2(r.y-n.y,r.x-n.x)-i;for(;a>Math.PI;)a-=2*Math.PI;for(;a<-Math.PI;)a+=2*Math.PI;if(Math.abs(a)<=this.bendLimit)continue;let o=i+Math.sign(a)*this.bendLimit;r.x=n.x+Math.cos(o)*this.length,r.y=n.y+Math.sin(o)*this.length}}},kN=class extends J{constructor(e,t){if(super(),t.length!==e.points.length)throw Error(`a chain rig needs one texture per segment`);this.chain=e,this.segments=t.map(e=>{let t=new wM(e);return t.anchor.set(0,.5),this.addChild(t),t})}update(e){this.chain.update(e);for(let e=0;e<this.segments.length;e++){let t=this.chain.points[e],n=this.chain.points[e+1]??t;this.segments[e].position.set(t.x,t.y),this.segments[e].rotation=Math.atan2(n.y-t.y,n.x-t.x)}}},AN=``;function jN(e){AN=e.endsWith(`/`)||e===``?e:e+`/`}var MN;function NN(e){MN=e}function PN(){return MN||(typeof window>`u`?void 0:window.__MWG_ASSETS__)}function FN(){return PN()!==void 0}function IN(){return Object.keys(PN()??{})}function LN(e){let t=PN();return!t||e in t}function RN(e){if(/^(data|blob):/.test(e))return e;let t=PN();if(!t)return AN+e;let n=t[e];if(n===void 0)throw Error(`asset "${e}" is not in this build - check it is under the folder passed to compile-resources`);return n}var zN={"image/png":`png`,"image/jpeg":`jpg`,"image/webp":`webp`,"image/gif":`gif`,"image/svg+xml":`svg`};async function BN(e,t={}){let{onProgress:n,resolution:r,optional:i,onMissing:a}=typeof t==`function`?{onProgress:t,resolution:void 0,optional:void 0,onMissing:void 0}:t,o=new Set(i??[]),s=e.filter(e=>!Ik.cache.has(e)),c=s.filter(e=>!o.has(e)),l=s.filter(e=>o.has(e)),u=e=>{let t=RN(e),n={alias:e,src:t};if(r!==void 0&&(n.data={resolution:r}),t.startsWith(`data:`)){let r=/^data:([^;,]+)/.exec(t)?.[1],i=(r&&zN[r])??/\.([a-z0-9]+)$/i.exec(e)?.[1];i&&(n.format=i)}Ik.add(n)};if(l.length===0&&c.length===0){n?.(1);return}for(let e of c)u(e);let d=c.length>0?Ik.load(c,n):Promise.resolve(),f=l.map(async e=>{u(e);try{await Ik.load(e)}catch(t){a?.(e,t)}});await Promise.all([d,...f]),l.length>0&&c.length===0&&n?.(1)}function VN(e,t){if(!Ik.cache.has(e)){if(t!==void 0)return t;throw Error(`texture "${e}" has not been loaded - pass it to load() first`)}return Ik.get(e)}function HN(e,t){if(!Ik.cache.has(e)){if(t!==void 0)return t;throw Error(`asset "${e}" has not been loaded - pass it to load() first`)}return Ik.get(e)}function UN(e){return Ik.cache.has(e)}async function WN(e){let t=e.filter(e=>Ik.cache.has(e));t.length!==0&&await Ik.unload(t)}var GN=new Map;async function KN(e,t,n={}){let r=n.fetch??globalThis.fetch;if(!r)throw Error(`fetch is unavailable; provide LoadBinaryOptions.fetch`);let i=e.filter(e=>!GN.has(e));if(i.length===0){t?.(1);return}let a=0;await Promise.all(i.map(async e=>{let n=await r(RN(e));if(!n.ok)throw Error(`failed to load binary asset "${e}": ${n.status}`);GN.set(e,await n.arrayBuffer()),a++,t?.(a/i.length)}))}function qN(e){let t=GN.get(e);if(!t)throw Error(`binary asset "${e}" has not been loaded - pass it to loadBinary() first`);return t}function JN(e){return GN.has(e)}function YN(e){for(let t of e)GN.delete(t)}var XN=[{name:`<script>`,pattern:/<script[\s/>]/i},{name:`<foreignObject>`,pattern:/<foreignobject[\s/>]/i},{name:`<iframe>`,pattern:/<iframe[\s/>]/i},{name:`<embed>`,pattern:/<embed[\s/>]/i},{name:`<object>`,pattern:/<object[\s/>]/i},{name:`an event-handler attribute`,pattern:/\son[a-z]+\s*=/i},{name:`a javascript: URL`,pattern:/javascript\s*:/i},{name:`a data: URL of an active type`,pattern:/data:(?:text\/html|application\/xml|image\/svg\+xml)/i}];function ZN(e){for(let{name:t,pattern:n}of XN)if(n.test(e))throw Error(`SVG refused: contains ${t}`);return e}function QN(e){return`data:image/svg\+xml,${encodeURIComponent(e)}`}function $N(e,t){let n=ZN(e);if(t.length===0)throw Error(`SVG scale variants need at least one named scale`);let r=new Set;for(let e of t){if(!e.name)throw Error(`an SVG scale variant needs a name`);if(!Number.isFinite(e.resolution)||e.resolution<=0)throw Error(`SVG scale variant ${e.name} needs a positive resolution`);if(r.has(e.name))throw Error(`duplicate SVG scale variant ${e.name}`);r.add(e.name)}let i=QN(n);return t.map(e=>({name:e.name,src:i,resolution:e.resolution}))}function eP(e){let t=ZN(e),n=/^([\s\S]*?)<svg([^>]*)>/i.exec(t),r=t.lastIndexOf(`</svg>`);if(!n||r<0)throw Error(`SVG group split needs an <svg> root`);let i=t.slice(n[0].length,r),a=[...i.matchAll(/<(defs|style)\b[^>]*>[\s\S]*?<\/\1\s*>/gi)].map(e=>e[0]).join(``),o=i.replace(/<(defs|style)\b[^>]*>[\s\S]*?<\/\1\s*>/gi,``),s=Object.create(null),c=0;for(;c<o.length;){let e=/<g\b([^>]*?)(\/?)>/i.exec(o.slice(c));if(!e)break;let t=e[1],r=/\bid\s*=\s*["']([^"']+)["']/i.exec(t)?.[1],i=c+e.index+e[0].length;if(e[2]===`/`){if(!r)throw Error(`SVG group split refuses a group with no id`);if(r in s)throw Error(`SVG group split refuses a duplicate id ${r}`);s[r]=`${n[0]}${a}${e[0]}</svg>`,c=i;continue}let l=1,u=i,d=``;for(;l>0&&u<o.length;){let e=o.slice(u).match(/<g\b[^>]*>|<\/g\s*>/i);if(!e)throw Error(`SVG group ${r??`<unnamed>`} never closes`);e[0].startsWith(`</`)?(l--,l===0&&(d=e[0])):/\/\s*>$/.test(e[0])||l++,u+=e.index+e[0].length}if(l!==0)throw Error(`SVG group ${r??`<unnamed>`} never closes`);let f=o.slice(i,u-d.length);if(c=u,!r)throw Error(`SVG group split refuses a group with no id`);if(r in s)throw Error(`SVG group split refuses a duplicate id ${r}`);s[r]=`${n[0]}${a}${e[0]}${f}</g></svg>`}if(Object.keys(s).length===0)throw Error(`SVG group split found no named groups`);return s}var tP=class{constructor(e={}){if(this.entries=new Map,this.clock=0,this.budgetBytes=e.budgetBytes??1/0,!(this.budgetBytes>=0))throw Error(`asset stream budget must not be negative`);this.loadAssets=e.load??BN,this.releaseAssets=e.release??WN}async preload(e,t){if(!e.id)throw Error(`asset bundle needs an id`);if(e.estimatedBytes!==void 0&&e.estimatedBytes<0)throw Error(`asset bundle size must not be negative`);let n=this.entries.get(e.id);if(n?.ready){n.lastUsed=++this.clock,t?.(1);return}let r=e.paths.filter(e=>!this.isRetained(e));r.length>0?await this.loadAssets([...r],t):t?.(1),this.entries.set(e.id,{...e,lastUsed:++this.clock,ready:!0}),await this.enforceBudget(e.id)}async preloadLikely(e,t){let n=[...e].sort((e,t)=>(t.priority??0)-(e.priority??0));for(let[e,r]of n.entries())await this.preload(r,t&&(r=>t((e+r)/n.length)));t?.(1)}use(e){let t=this.entries.get(e);return t?.ready?(t.lastUsed=++this.clock,!0):!1}isReady(e){return this.entries.get(e)?.ready??!1}async unload(e){let t=this.entries.get(e);if(!t)return;this.entries.delete(e);let n=t.paths.filter(e=>!this.isRetained(e));n.length>0&&await this.releaseAssets(n)}get estimatedBytes(){return[...this.entries.values()].reduce((e,t)=>e+(t.estimatedBytes??0),0)}async enforceBudget(e){for(;this.estimatedBytes>this.budgetBytes;){let t=[...this.entries.values()].filter(t=>t.id!==e).sort((e,t)=>e.lastUsed-t.lastUsed)[0];if(!t)return;await this.unload(t.id)}}isRetained(e){return[...this.entries.values()].some(t=>t.ready&&t.paths.includes(e))}};async function nP(e,t,n=fetch){let r=await n(e);if(!r.ok)throw Error(`fetchWithByteProgress: ${e} responded ${r.status}`);let i=r.headers.get(`content-length`),a=i!==null&&i!==``?Number(i):null;if(!r.body){let e=await r.blob();return t?.({loaded:e.size,total:a??e.size}),e}let o=r.body.getReader(),s=[],c=0;for(;;){let{done:e,value:n}=await o.read();if(e)break;s.push(n),c+=n.byteLength,t?.({loaded:c,total:a})}return new Blob(s)}async function rP(e){if(e.trimStart().startsWith(`<`))return ZN(e);let t=RN(e);if(t.startsWith(`data:`)){let n=t.indexOf(`,`);if(n<0)throw Error(`invalid SVG data URI for ${e}`);return ZN(/;base64/i.test(t.slice(0,n))?new TextDecoder().decode(Uint8Array.from(atob(t.slice(n+1)),e=>e.charCodeAt(0))):decodeURIComponent(t.slice(n+1)))}let n=await fetch(t);if(!n.ok)throw Error(`SVG failed to load ${e}: ${n.status}`);return ZN(await n.text())}var iP=new WeakMap;async function aP(e,t={}){let n=t.resolution??1;if(!Number.isFinite(n)||n<=0)throw Error(`SVG parts need a positive finite resolution`);let r=eP(await rP(e)),i=t.groups??Object.keys(r);for(let e of i)if(!Object.hasOwn(r,e))throw Error(`SVG parts unknown group ${e}`);let a=Object.create(null);for(let e of i){let t=QN(r[e].replace(`</svg>`,`<!-- mwg-resolution:${n} --></svg>`)),i=`mwg-svg-part:${n}:${t}`;a[e]=await Ik.load({alias:i,src:t,format:`svg`,data:{resolution:n}}),iP.set(a[e],i)}return Object.freeze(a)}async function oP(e){for(let t of new Set(Object.values(e))){let e=iP.get(t);e&&(await Ik.unload(e),iP.delete(t))}}var sP=l({AssetStream:()=>tP,fetchWithByteProgress:()=>nP,get:()=>HN,getBinary:()=>qN,has:()=>LN,isBinaryLoaded:()=>JN,isCompiled:()=>FN,isLoaded:()=>UN,load:()=>BN,loadBinary:()=>KN,loadSvgParts:()=>aP,paths:()=>IN,release:()=>WN,releaseBinary:()=>YN,releaseSvgParts:()=>oP,resolve:()=>RN,sanitizeSvg:()=>ZN,setAssetMap:()=>NN,setBase:()=>jN,splitSvgGroups:()=>eP,svgDataUri:()=>QN,svgScaleVariants:()=>$N,texture:()=>VN});function cP(e){return{x:e.x,y:e.y,width:e.width,height:e.height}}var lP=class e{constructor(e,t,n){this.frames=new Map,this.names=new Map,this.texture=e,this.frameWidth=t,this.frameHeight=n,this.columns=t>0?Math.floor(e.width/t):0,this.rows=n>0?Math.floor(e.height/n):0,t>0&&(e.width%t!==0||e.height%n!==0)&&console.warn(`sprite sheet ${e.width}x${e.height} is not a whole number of ${t}x${n} frames; the frames will be cut from the wrong places`)}static grid(t,n=0,r=n){return new e(VN(t),n,r)}static strip(t,n){if(!(n>0))throw Error(`a sprite strip needs at least one frame`);let r=VN(t);return new e(r,r.width/n,r.height)}static fromTexture(t,n=0,r=n){return new e(t,n,r)}get count(){return this.columns*this.rows}name(e,t){return this.names.set(e,t),this}nameAll(e){for(let[t,n]of Object.entries(e))this.names.set(t,n);return this}indexOf(e){let t=this.names.get(e);if(t===void 0)throw Error(`this sheet has no frame named "${e}"`);return t}get(e){let t=typeof e==`string`?this.indexOf(e):e,n=this.frames.get(t);if(n)return n;if(t<0||t>=this.count)throw Error(`frame ${t} is outside this sheet, which holds ${this.count}`);let r=new q({source:this.texture.source,frame:new G(t%this.columns*this.frameWidth,Math.floor(t/this.columns)*this.frameHeight,this.frameWidth,this.frameHeight)});return this.frames.set(t,r),r}rect(e,t,n,r,i){if(r<=0||i<=0)throw Error(`a sprite sheet rect needs a positive width and height`);return this.frames.set(e,new q({source:this.texture.source,frame:new G(t,n,r,i)})),this}region(e){let t=this.get(e);return{texture:t,frame:cP(t.frame)}}range(e,t){let n=[];for(let r=e;r<=t;r++)n.push(this.get(r));return n}pick(...e){return e.map(e=>this.get(e))}},uP=class{constructor(e={}){if(this.world=new J,this.x=0,this.y=0,this.requestedZoom=1,this.viewWidth=0,this.viewHeight=0,this.screenX=0,this.screenY=0,this.followTarget=null,this.followIntensity=0,this.shakeMagnitude=0,this.shakeRemaining=0,this.shakeDuration=1,this.shakeX=0,this.shakeY=0,this.bounds=null,this.step=0,this._angle=0,this.targetAngle=null,this.angleIntensity=0,e.grid!==void 0&&e.grid!==`square`&&e.grid!==`hex`)throw Error(`camera grid must be "square" or "hex", not "${e.grid}"`);this.stepsPerTurn=e.grid===`hex`?6:4,this.deadzone=e.deadzone??0,this.pixelPerfectTileSize=e.pixelPerfectTileSize,this.resolution=e.resolution??(()=>1),this.zoom=e.zoom??1}get rotationSteps(){return this.step}get rotation(){return this._angle}get uprightRotation(){return-this.rotation}setRotationStep(e){if(!Number.isInteger(e))throw Error(`camera rotation step must be an integer`);this.step=(e%this.stepsPerTurn+this.stepsPerTurn)%this.stepsPerTurn,this._angle=this.step/this.stepsPerTurn*Math.PI*2,this.targetAngle=null,this.apply()}rotate(e=1){this.setRotationStep(this.step+e)}rotateTo(e){this._angle=e,this.targetAngle=null,this.angleIntensity=0,this.apply()}animateRotationTo(e,t=4){this.targetAngle=e,this.angleIntensity=t}get spin(){let e=this.rotation;return{cos:Math.cos(e),sin:Math.sin(e)}}get zoom(){return this.pixelPerfectTileSize?fP(this.requestedZoom,this.pixelPerfectTileSize,this.resolution()):this.requestedZoom}set zoom(e){this.requestedZoom=Math.max(.01,e)}setViewport(e,t,n=0,r=0){this.viewWidth=e,this.viewHeight=t,this.screenX=n,this.screenY=r}fit(e,t){this.zoom=Math.min(this.viewWidth/e,this.viewHeight/t),this.snapTo(e/2,t/2)}get view(){let e=this.viewWidth/this.zoom,t=this.viewHeight/this.zoom,{x:n,y:r}=this.clampedCentre(this.x,this.y);if(this._angle===0)return{x:n-e/2,y:r-t/2,width:e,height:t};let i=[this.toWorld(this.screenX,this.screenY),this.toWorld(this.screenX+this.viewWidth,this.screenY),this.toWorld(this.screenX+this.viewWidth,this.screenY+this.viewHeight),this.toWorld(this.screenX,this.screenY+this.viewHeight)],a=i.map(e=>e.x),o=i.map(e=>e.y),s=Math.min(...a),c=Math.min(...o);return{x:s,y:c,width:Math.max(...a)-s,height:Math.max(...o)-c}}setBounds(e){this.bounds=e}snapTo(e,t){this.x=e,this.y=t,this.followTarget=null,this.followIntensity=0,this.apply()}panTo(e,t,n=4){this.followTarget={x:e,y:t},this.followIntensity=n}follow(e,t=8){this.followTarget=e,this.followIntensity=t}stopFollowing(){this.followTarget=null,this.followIntensity=0}shake(e,t=.4){br()||(this.shakeMagnitude=e,this.shakeRemaining=this.shakeDuration=t)}shakeScreen(e,t=.4){this.shake(e/this.zoom,t)}update(e){if(this.followTarget&&this.followIntensity>0){let t=this.viewWidth/this.zoom*this.deadzone/2,n=this.viewHeight/this.zoom*this.deadzone/2,r=this.followTarget.x-this.x,i=this.followTarget.y-this.y;r=r>t?r-t:r<-t?r+t:0,i=i>n?i-n:i<-n?i+n:0;let a=br()?1:1-Math.exp(-this.followIntensity*e);this.x+=r*a,this.y+=i*a}if(this.targetAngle!==null&&this.angleIntensity>0){let t=dP(this._angle,this.targetAngle),n=br()?1:1-Math.exp(-this.angleIntensity*e);this._angle+=t*n}if(this.shakeRemaining>0){this.shakeRemaining-=e;let t=Math.max(0,this.shakeRemaining/this.shakeDuration);this.shakeX=D(-this.shakeMagnitude,this.shakeMagnitude)*t,this.shakeY=D(-this.shakeMagnitude,this.shakeMagnitude)*t}else this.shakeX=this.shakeY=0;this.apply()}toScreen(e,t){let{x:n,y:r}=this.clampedCentre(this.x+this.shakeX,this.y+this.shakeY),{cos:i,sin:a}=this.spin,o=e-n,s=t-r;return{x:(o*i-s*a)*this.zoom+this.screenX+this.viewWidth/2,y:(o*a+s*i)*this.zoom+this.screenY+this.viewHeight/2}}toWorld(e,t){let{x:n,y:r}=this.clampedCentre(this.x+this.shakeX,this.y+this.shakeY),{cos:i,sin:a}=this.spin,o=(e-this.screenX-this.viewWidth/2)/this.zoom,s=(t-this.screenY-this.viewHeight/2)/this.zoom;return{x:n+o*i+s*a,y:r-o*a+s*i}}clampedCentre(e,t){if(!this.bounds)return{x:e,y:t};let n=this.viewWidth/this.zoom/2,r=this.viewHeight/this.zoom/2,{minX:i,minY:a,maxX:o,maxY:s}=this.bounds;return{x:o-i<n*2?(i+o)/2:kn(e,i+n,o-n),y:s-a<r*2?(a+s)/2:kn(t,a+r,s-r)}}apply(){let{x:e,y:t}=this.clampedCentre(this.x+this.shakeX,this.y+this.shakeY);this.world.scale.set(this.zoom),this._angle===0?(this.world.rotation=0,this.world.pivot.set(0,0),this.world.x=this.snapToDevice(this.screenX+this.viewWidth/2-e*this.zoom),this.world.y=this.snapToDevice(this.screenY+this.viewHeight/2-t*this.zoom)):(this.world.rotation=this.rotation,this.world.pivot.set(e,t),this.world.x=this.snapToDevice(this.screenX+this.viewWidth/2),this.world.y=this.snapToDevice(this.screenY+this.viewHeight/2))}snapToDevice(e){let t=this.resolution();return Math.round(e*t)/t}};function dP(e,t){let n=Math.PI*2,r=(t-e)%n;return r>Math.PI&&(r-=n),r<-Math.PI&&(r+=n),r}function fP(e,t,n=1){return Math.max(1,Math.round(e*t*n))/(t*n)}function pP(e={}){let t=rM.current,n=new uP({resolution:()=>t.app.renderer.resolution,...e});return n.setViewport(t.width,t.height),n}var mP=class{constructor(e){this.container=new J,this.clip=new Z,this.camera=new uP(e),this.container.addChild(this.camera.world),this.container.addChild(this.clip),this.container.mask=this.clip,this.resize(e.x,e.y,e.width,e.height)}resize(e,t,n,r){this.camera.setViewport(n,r,e,t),this.clip.clear().rect(e,t,n,r).fill(16777215)}update(e){this.camera.update(e)}};function hP(e,t){if(e>=t){let n=Math.floor(e/2);return[{x:0,y:0,width:n,height:t},{x:n,y:0,width:e-n,height:t}]}let n=Math.floor(t/2);return[{x:0,y:0,width:e,height:n},{x:0,y:n,width:e,height:t-n}]}var gP={protanopia:[.567,.433,0,0,0,.558,.442,0,0,0,0,.242,.758,0,0,0,0,0,1,0],deuteranopia:[.625,.375,0,0,0,.7,.3,0,0,0,0,.3,.7,0,0,0,0,0,1,0],tritanopia:[.95,.05,0,0,0,0,.433,.567,0,0,0,.475,.525,0,0,0,0,0,1,0]};function _P(e){let t=new Bk;return t.matrix=gP[e],t}function vP(e,t){let n=[];for(let r of e)t.has(r)||n.push(r);return n}function yP(e,t,n,r=`square`){return r===`hex`?$n(e,t,n,n):{x:(e+.5)*n,y:(t+.5)*n}}var bP=class extends J{constructor(e){super(),this.drawn=new Set,this.marker=new Z,this.widthInCells=e.widthInCells,this.cellSize=e.cellSize??2,this.shape=e.shape??`square`,this.renderTexture=h_.create({width:this.shape===`hex`?Math.ceil((e.widthInCells-1)*this.cellSize*.75+this.cellSize):e.widthInCells*this.cellSize,height:this.shape===`hex`?e.heightInCells*this.cellSize+this.cellSize/2:e.heightInCells*this.cellSize}),this.sprite=new wl(this.renderTexture),this.addChild(this.sprite),this.addChild(this.marker)}get exploredCount(){return this.drawn.size}sync(e,t){let n=vP(e,this.drawn);if(n.length===0)return;let r=new Z;for(let e of n){this.drawn.add(e);let n=e%this.widthInCells,i=Math.floor(e/this.widthInCells),a=yP(n,i,this.cellSize,this.shape);if(this.shape===`hex`){let e=this.cellSize/2,o=[];for(let t=0;t<6;t++){let n=Math.PI/3*t;o.push(a.x+Math.cos(n)*e,a.y+Math.sin(n)*e)}r.poly(o).fill({color:t(n,i)})}else r.rect(a.x-this.cellSize/2,a.y-this.cellSize/2,this.cellSize,this.cellSize).fill({color:t(n,i)})}rM.current.app.renderer.render({container:r,target:this.renderTexture,clear:!1}),r.destroy()}setMarker(e,t,n,r=16777215){this.setMarkers([{x:e,y:t,facing:n,color:r}])}setMarkers(e){this.marker.clear();for(let t of e){let e=t.color??16777215,n=yP(t.x,t.y,this.cellSize,this.shape);if(this.marker.circle(n.x,n.y,Math.max(1,this.cellSize)).fill({color:e}),t.facing!==void 0){let r=this.cellSize*2;this.marker.moveTo(n.x,n.y).lineTo(n.x+Math.cos(t.facing)*r,n.y+Math.sin(t.facing)*r).stroke({color:e,width:1})}}}reset(){this.drawn.clear(),rM.current.app.renderer.render({container:new J,target:this.renderTexture,clear:!0})}destroy(e){this.renderTexture.destroy(!0),super.destroy(e)}},xP=24,SP=48,CP=[0,16,48,80];function wP(e,t){if(!Number.isInteger(t))throw Error(`${e} must be an integer, got ${t}`)}function TP(e){if(e!==0&&e!==1&&e!==2&&e!==3)throw Error(`RPG Maker autotile slot must be 0, 1, 2, or 3, got ${e}`)}function EP(e){if(e.length===0)throw Error(`RPG Maker autotile shape table cannot be empty`);for(let t=0;t<e.length;t++){if(e[t].length!==4)throw Error(`RPG Maker autotile shape ${t} needs exactly 4 quadrants`);for(let n of e[t])if(n.length!==2||!n.every(Number.isInteger)||n.some(e=>e<0))throw Error(`RPG Maker autotile shape ${t} has an invalid quadrant offset`)}}function DP(e,t){let n=CP[t]+Math.floor(e/48),r=n%8,i=Math.floor(n/8);return t===0?[Math.floor(r/4)*8,i*6+Math.floor(r/2)%2*3]:t===1?[r*2,(i-2)*3]:t===2?[r*2,(i-6)*2]:[r*2,Math.floor((i-10)*2.5+(i%2==1?.5:0))]}function OP(e,t,n,r){if(wP(`RPG Maker autotile tileId`,e),e<0)throw Error(`RPG Maker autotile tileId must be non-negative, got ${e}`);if(TP(t),wP(`RPG Maker autotile shape`,n),EP(r),n<0||n>=r.length)throw Error(`RPG Maker autotile shape ${n} is outside the table, which holds ${r.length}`);let[i,a]=DP(e,t);return{tileId:e,slot:t,shape:n,destinationX:e%16*SP,destinationY:Math.floor(e/16)*SP,quadrants:r[n].map(([e,t],n)=>({sourceX:(i*2+e)*xP,sourceY:(a*2+t)*xP,destinationX:n%2*xP,destinationY:Math.floor(n/2)*xP}))}}var kP=class{constructor(e){this.cache=new Map,this.table=e,EP(e)}get(e,t,n){let r=`${e}:${t}:${n}`,i=this.cache.get(r);if(i)return i;let a=OP(e,t,n,this.table);return this.cache.set(r,a),a}clear(){this.cache.clear()}},AP=[2048,2816,4352,5888],jP=[768,1536,1536,2304];function MP(e){if(!Number.isInteger(e))return null;for(let t=0;t<4;t++)if(e>=AP[t]&&e<AP[t]+jP[t])return t;return null}var NP=[[[2,4],[1,4],[2,3],[1,3]],[[2,0],[1,4],[2,3],[1,3]],[[2,4],[3,0],[2,3],[1,3]],[[2,0],[3,0],[2,3],[1,3]],[[2,4],[1,4],[2,3],[3,1]],[[2,0],[1,4],[2,3],[3,1]],[[2,4],[3,0],[2,3],[3,1]],[[2,0],[3,0],[2,3],[3,1]],[[2,4],[1,4],[2,1],[1,3]],[[2,0],[1,4],[2,1],[1,3]],[[2,4],[3,0],[2,1],[1,3]],[[2,0],[3,0],[2,1],[1,3]],[[2,4],[1,4],[2,1],[3,1]],[[2,0],[1,4],[2,1],[3,1]],[[2,4],[3,0],[2,1],[3,1]],[[2,0],[3,0],[2,1],[3,1]],[[0,4],[1,4],[0,3],[1,3]],[[0,4],[3,0],[0,3],[1,3]],[[0,4],[1,4],[0,3],[3,1]],[[0,4],[3,0],[0,3],[3,1]],[[2,2],[1,2],[2,3],[1,3]],[[2,2],[1,2],[2,3],[3,1]],[[2,2],[1,2],[2,1],[1,3]],[[2,2],[1,2],[2,1],[3,1]],[[2,4],[3,4],[2,3],[3,3]],[[2,4],[3,4],[2,1],[3,3]],[[2,0],[3,4],[2,3],[3,3]],[[2,0],[3,4],[2,1],[3,3]],[[2,4],[1,4],[2,5],[1,5]],[[2,0],[1,4],[2,5],[1,5]],[[2,4],[3,0],[2,5],[1,5]],[[2,0],[3,0],[2,5],[1,5]],[[0,4],[3,4],[0,3],[3,3]],[[2,2],[1,2],[2,5],[1,5]],[[0,2],[1,2],[0,3],[1,3]],[[0,2],[1,2],[0,3],[3,1]],[[2,2],[3,2],[2,3],[3,3]],[[2,2],[3,2],[2,1],[3,3]],[[2,4],[3,4],[2,5],[3,5]],[[2,0],[3,4],[2,5],[3,5]],[[0,4],[1,4],[0,5],[1,5]],[[0,4],[3,0],[0,5],[1,5]],[[0,2],[3,2],[0,3],[3,3]],[[0,2],[1,2],[0,5],[1,5]],[[0,4],[3,4],[0,5],[3,5]],[[2,2],[3,2],[2,5],[3,5]],[[0,2],[3,2],[0,5],[3,5]],[[0,0],[1,0],[0,1],[1,1]]],PP=[[[2,2],[1,2],[2,1],[1,1]],[[0,2],[1,2],[0,1],[1,1]],[[2,0],[1,0],[2,1],[1,1]],[[0,0],[1,0],[0,1],[1,1]],[[2,2],[3,2],[2,1],[3,1]],[[0,2],[3,2],[0,1],[3,1]],[[2,0],[3,0],[2,1],[3,1]],[[0,0],[3,0],[0,1],[3,1]],[[2,2],[1,2],[2,3],[1,3]],[[0,2],[1,2],[0,3],[1,3]],[[2,0],[1,0],[2,3],[1,3]],[[0,0],[1,0],[0,3],[1,3]],[[2,2],[3,2],[2,3],[3,3]],[[0,2],[3,2],[0,3],[3,3]],[[2,0],[3,0],[2,3],[3,3]],[[0,0],[3,0],[0,3],[3,3]]],FP=[[26,27,32,33],[4,27,32,33],[26,5,32,33],[4,5,32,33],[26,27,32,11],[4,27,32,11],[26,5,32,11],[4,5,32,11],[26,27,10,33],[4,27,10,33],[26,5,10,33],[4,5,10,33],[26,27,10,11],[4,27,10,11],[26,5,10,11],[4,5,10,11],[24,25,30,31],[24,5,30,31],[24,25,30,11],[24,5,30,11],[14,15,20,21],[14,15,20,11],[14,15,10,21],[14,15,10,11],[28,29,34,35],[28,29,10,35],[4,29,34,35],[4,29,10,35],[38,39,44,45],[4,39,44,45],[38,5,44,45],[4,5,44,45],[24,29,30,35],[14,15,44,45],[12,13,18,19],[12,13,18,11],[16,17,22,23],[16,17,10,23],[40,41,46,47],[4,41,46,47],[36,37,42,43],[36,5,42,43],[12,17,18,23],[12,13,42,43],[36,41,42,47],[16,17,46,47],[12,17,42,47],[0,1,6,7]],IP=[46,44,46,44,43,41,43,40,46,44,46,44,43,41,43,40,42,32,42,32,35,19,35,18,42,32,42,32,34,17,34,16,46,44,46,44,43,41,43,40,46,44,46,44,43,41,43,40,42,32,42,32,35,19,35,18,42,32,42,32,34,17,34,16,45,39,45,39,33,31,33,29,45,39,45,39,33,31,33,29,37,27,37,27,23,15,23,13,37,27,37,27,22,11,22,9,45,39,45,39,33,31,33,29,45,39,45,39,33,31,33,29,36,26,36,26,21,7,21,5,36,26,36,26,20,3,20,1,46,44,46,44,43,41,43,40,46,44,46,44,43,41,43,40,42,32,42,32,35,19,35,18,42,32,42,32,34,17,34,16,46,44,46,44,43,41,43,40,46,44,46,44,43,41,43,40,42,32,42,32,35,19,35,18,42,32,42,32,34,17,34,16,45,38,45,38,33,30,33,28,45,38,45,38,33,30,33,28,37,25,37,25,23,14,23,12,37,25,37,25,22,10,22,8,45,38,45,38,33,30,33,28,45,38,45,38,33,30,33,28,36,24,36,24,21,6,21,4,36,24,36,24,20,2,20,0];function LP(e){return!Number.isInteger(e)||e<=0||e>=384?null:{index:Math.floor(e/48),pattern:e%48}}function RP(e){let t=0;return e(0,-1)&&(t|=1),e(1,-1)&&(t|=2),e(1,0)&&(t|=4),e(1,1)&&(t|=8),e(0,1)&&(t|=16),e(-1,1)&&(t|=32),e(-1,0)&&(t|=64),e(-1,-1)&&(t|=128),IP[t]}var zP=[16,32,32,48];function BP(e){if(e.format===`rpgm-mv`){if(TP(e.slot),EP(e.table),e.tableEdge&&e.slot!==1)throw Error(`a table-edge layout needs slot 1 (A2), got slot ${e.slot}`);let t=zP[e.slot],n=CP[e.slot];for(let r of e.cycles){if(r.length===0)throw Error(`an autotile animation cycle needs at least one kind`);for(let i of r)if(!Number.isInteger(i)||i<n||i>=n+t)throw Error(`animation cycle kind ${i} is outside slot ${e.slot}'s kinds ${n}-${n+t-1}`)}}else{if(!Number.isInteger(e.index)||e.index<0||e.index>7)throw Error(`an XP autotile index must be 0-7, got ${e.index}`);if(!Number.isInteger(e.frames)||e.frames<1)throw Error(`an XP autotile frame count must be at least 1, got ${e.frames}`)}}var VP=24,HP=16,UP=6,WP=96,GP=32;function KP(e,t,n){if(t<=0)return null;if(!Number.isInteger(n)||n<0)throw Error(`an autotile animation frame must be an integer at or above zero, got ${n}`);return e.format===`rpgm-mv`?JP(e,t,n):YP(e,t,n)}function qP(e,t){let n=CP[e.slot]+Math.floor(t/48),r=t%48%e.table.length,i=n%8*2,a=(Math.floor(n/8)-2)*3,o=VP/2;return[2,3].map((t,n)=>{let[s,c]=e.table[r][t];return{sourceX:(i*2+s)*VP,sourceY:(a*2+c)*VP+o,sourceWidth:VP,sourceHeight:o,destX:n/2,destY:0,destWidth:1/2,destHeight:1/4}})}function JP(e,t,n){let r=AP[e.slot],i=jP[e.slot];if(!Number.isInteger(t)||t<r||t>=r+i)throw Error(`tile ${t} is outside slot ${e.slot}'s ids ${r}-${r+i-1}`);let a=t-r;if(e.tableEdge)return qP(e,a);let o=CP[e.slot]+Math.floor(a/48),s=e.tableFor?e.tableFor(o):e.table,c=a%48%s.length;for(let t of e.cycles){let e=t.indexOf(o);if(e>=0){o=t[(e+n)%t.length];break}}return OP((o-CP[e.slot])*48+a%48,e.slot,c,s).quadrants.map((e,t)=>({sourceX:e.sourceX,sourceY:e.sourceY,sourceWidth:VP,sourceHeight:VP,destX:t%2/2,destY:Math.floor(t/2)/2,destWidth:1/2,destHeight:1/2}))}function YP(e,t,n){if(!Number.isInteger(t)||t<e.index*48||t>=e.index*48+48||t<=0)throw Error(`tile ${t} is outside XP autotile ${e.index}'s ids ${e.index*48}-${e.index*48+47}`);if(e.single)return[{sourceX:n%e.frames*GP,sourceY:0,sourceWidth:GP,sourceHeight:GP,destX:0,destY:0,destWidth:1,destHeight:1}];let r=FP[t%48],i=n%e.frames*WP;return r.map((e,t)=>({sourceX:e%UP*HP+i,sourceY:Math.floor(e/UP)*HP,sourceWidth:HP,sourceHeight:HP,destX:t%2/2,destY:Math.floor(t/2)/2,destWidth:1/2,destHeight:1/2}))}var XP=128;function ZP(e){let t=new Int32Array(e.width*e.height),n=t=>MP(t)===1&&((e.flags[t]??0)&XP)!==0;for(let r=1;r<e.height;r++)for(let i=0;i<e.width;i++){let a=r*e.width+i,o=e.objects[a-e.width]??0;if(!n(o)||n(e.objects[a]??0))continue;let s=MP(e.ground[a]??0);s!==2&&s!==3&&(t[a]=o)}return t}var QP=-1,$P=7237230,eF=10132122;function tF(e,t){if(!Number.isInteger(e)||e<0||e>=4096)throw Error(`tileFrame needs a sheet index from 0 to 4095, got ${e}`);if(!Number.isInteger(t)||t<0||t>=1<<20)throw Error(`tileFrame needs a frame index from 0 to ${(1<<20)-1}, got ${t}`);return e<<20|t}function nF(e){return e>>>20}function rF(e){return e&(1<<20)-1}var iF=class extends J{constructor(e){if(super(),this.layers=[],this.layersByName=new Map,this.chunks=[],this.widthInTiles=e.width,this.heightInTiles=e.height,this.sheets=Array.isArray(e.sheet)?[...e.sheet]:[e.sheet],this.sheets.length===0)throw Error(`a TileMap needs at least one sheet`);if(this.tileWidth=e.tileWidth??this.sheets[0].frameWidth,this.tileHeight=e.tileHeight??this.sheets[0].frameHeight,this.shape=e.shape??`square`,this.heightStep=e.heightStep??this.tileHeight/2,!(this.heightStep>0))throw Error(`a TileMap's heightStep must be a positive number, got ${e.heightStep}`);this.chunkSize=e.chunkSize??16,this.chunkColumns=Math.ceil(this.widthInTiles/this.chunkSize),this.chunkRows=Math.ceil(this.heightInTiles/this.chunkSize);let t=this.widthInTiles*this.heightInTiles;this.cellTint=new Uint32Array(t).fill(16777215),this.cellAdd=new Uint32Array(t),this.cellHeight=new Int32Array(t),this.faces=Array(t).fill(null)}get layerCount(){return this.layers.length}get worldWidth(){switch(this.shape){case`square`:return this.widthInTiles*this.tileWidth;case`hex`:return this.widthInTiles<=0?0:(this.widthInTiles-1)*this.tileWidth*.75+this.tileWidth;case`isometric`:return(this.widthInTiles+this.heightInTiles)*(this.tileWidth/2);case`staggered`:return this.widthInTiles*this.tileWidth+this.tileWidth/2}}get worldHeight(){switch(this.shape){case`square`:return this.heightInTiles*this.tileHeight;case`hex`:return this.heightInTiles*this.tileHeight+this.tileHeight/2;case`isometric`:return(this.widthInTiles+this.heightInTiles)*(this.tileHeight/2);case`staggered`:return this.heightInTiles*(this.tileHeight/2)+this.tileHeight/2}}inside(e,t){return e>=0&&t>=0&&e<this.widthInTiles&&t<this.heightInTiles}index(e,t){return t*this.widthInTiles+e}addLayer(e,t){let{cells:n,container:r,chunks:i}=this.beginLayer(e,t?.length),a={kind:`tiles`,name:e,data:t?Int32Array.from(t):new Int32Array(n).fill(-1),sprites:Array(n).fill(null),container:r};this.layers.push(a),this.layersByName.set(e,a),this.chunks.push(i),this.addChild(r);let o=this.layers.length===1;for(let e=0;e<this.heightInTiles;e++)for(let t=0;t<this.widthInTiles;t++){let n=a.data[this.index(t,e)];n!==-1&&this.buildSprite(a,t,e,n),o&&this.syncFaces(t,e)}return this}beginLayer(e,t){if(this.layersByName.has(e))throw Error(`this map already has a layer named "${e}"`);let n=this.widthInTiles*this.heightInTiles;if(t!==void 0&&t!==n)throw Error(`layer "${e}" has ${t} cells, but the map has ${n}`);let r=new J,i=[];for(let e=0;e<this.chunkColumns*this.chunkRows;e++){let e=new J;i.push(e),r.addChild(e)}return{cells:n,container:r,chunks:i}}addAutotileLayer(e,t,n){let r=Array.isArray(n)?n:[n];if(r.length===0)throw Error(`autotile layer "${e}" needs at least one set`);let{cells:i,container:a,chunks:o}=this.beginLayer(e,t.length),s=r.map((t,n)=>this.resolveAutotileSet(e,t,n)),c=new Set;for(let t of s){let n=t.layout.format===`rpgm-mv`?`slot ${t.layout.slot}`:`autotile ${t.layout.index}`;if(c.has(n))throw Error(`autotile layer "${e}" has two sets for ${n}`);c.add(n)}let l=0;r.forEach((t,n)=>{let r=t.animationFrame??0;if(!Number.isInteger(r)||r<0)throw Error(`autotile layer "${e}" set ${n} starts at an invalid animation frame, got ${t.animationFrame}`);if(n===0)l=r;else if(r!==l)throw Error(`autotile layer "${e}" sets disagree on their initial animation frame (${l} vs ${r})`)});let u=Int32Array.from(t);for(let t=0;t<i;t++)u[t]>0&&this.claimAutotileSets(s,e,u[t]);let d={kind:`autotile`,name:e,data:u,sprites:Array(i).fill(null),container:a,sets:s,frame:l};this.layers.push(d),this.layersByName.set(e,d),this.chunks.push(o),this.addChild(a);let f=this.layers.length===1;for(let t=0;t<this.heightInTiles;t++)for(let n=0;n<this.widthInTiles;n++){let r=this.index(n,t),i=u[r];i<=0||(d.sprites[r]=this.makeAutotileSprites(d,this.claimAutotileSets(s,e,i),n,t,i),f&&this.syncFaces(n,t))}return this}setAutotileFrame(e,t){let n=this.layerAt(e);if(n.kind!==`autotile`)throw Error(`layer "${n.name}" is not an autotile layer`);if(!Number.isInteger(t)||t<0)throw Error(`an autotile animation frame must be an integer at or above zero, got ${t}`);if(n.frame!==t){n.frame=t;for(let e=0;e<this.heightInTiles;e++)for(let r=0;r<this.widthInTiles;r++){let i=this.index(r,e),a=n.data[i];if(a<=0)continue;let o=this.claimAutotileSets(n.sets,n.name,a),s=this.autotilePieces(o,a,t),c=n.sprites[i];if(c)for(let e=0;e<c.length;e++)c[e].texture=s.textures[e]}}}addShadowLayer(e,t,n={}){let{cells:r,container:i,chunks:a}=this.beginLayer(e,t.length),o=n.color??0,s=n.alpha??.5;if(!Number.isFinite(s)||s<0||s>1)throw Error(`shadow layer "${e}" alpha must be between 0 and 1, got ${n.alpha}`);let c=Int32Array.from(t,e=>e>0?e&15:0),l={kind:`shadow`,name:e,data:c,sprites:Array(r).fill(null),container:i,color:o,alpha:s};this.layers.push(l),this.layersByName.set(e,l),this.chunks.push(a),this.addChild(i);for(let e=0;e<this.heightInTiles;e++)for(let t=0;t<this.widthInTiles;t++)c[this.index(t,e)]>0&&this.buildShadowSprites(l,t,e);return this}buildShadowSprites(e,t,n){let r=this.index(t,n),i=this.cellOrigin(t,n),a=this.cellHeight[r]*this.heightStep,o=this.tileWidth/2,s=this.tileHeight/2,c=this.chunks[this.layers.indexOf(e)][this.chunkIndex(t,n)],l=[];for(let t=0;t<4;t++){if(!(e.data[r]&1<<t))continue;let n=new wM(q.WHITE);n.x=i.x+t%2*o,n.y=i.y-a+Math.floor(t/2)*s,n.width=o,n.height=s,n.tint=e.color,n.alpha=e.alpha,c.addChild(n),l.push(n)}e.sprites[r]=l}setShadowCell(e,t,n,r){let i=this.index(t,n);e.data[i]=r>0?r&15:0;for(let t of e.sprites[i]??[])t.destroy();e.sprites[i]=null,e.data[i]>0&&this.buildShadowSprites(e,t,n)}getAutotileFrame(e){let t=this.layerAt(e);if(t.kind!==`autotile`)throw Error(`layer "${t.name}" is not an autotile layer`);return t.frame}resolveAutotileSet(e,t,n){let r=`autotile layer "${e}" set ${n}`;if(!t||!t.sheet)throw Error(`${r} needs a source sheet`);let i=t.format??`rpgm-mv`;if(i!==`rpgm-mv`&&i!==`rpgm-xp`)throw Error(`${r} has an unknown format "${t.format}"`);return i===`rpgm-mv`?this.resolveRpgmSet(r,t):this.resolveXpSet(r,t)}resolveRpgmSet(e,t){if(t.slot===void 0)throw Error(`${e} needs a slot (0-3) for its MV sheet`);if(t.mode!==void 0&&t.mode!==`floor`&&t.mode!==`wall`&&t.mode!==`mixed`)throw Error(`${e} has an unknown mode "${t.mode}"`);if(t.animation!==void 0&&!Array.isArray(t.animation))throw Error(`${e} animation must list kind runs, got ${typeof t.animation}`);let n=t.mode??(t.slot<2?`floor`:`wall`),r=n===`mixed`&&t.slot===3&&t.table===void 0,i={format:`rpgm-mv`,slot:t.slot,table:t.table??(n===`floor`||t.tableEdge||n===`mixed`&&t.slot<2?NP:PP),...r?{tableFor:e=>Math.floor(e/8)%2==0?NP:PP}:{},...t.tableEdge?{tableEdge:!0}:{},cycles:t.animation??[]};return BP(i),{sheet:t.sheet,layout:i,cache:new Map,claims:e=>MP(e)===t.slot}}resolveXpSet(e,t){let n=t.index??0,r=t.sheet.texture,i=r.height===32;if(r.height!==32&&r.height!==128)throw Error(`${e} is ${r.height}px tall - XP autotile images are 128px templates or 32px single-tile strips`);let a=i?32:96,o=t.frames??Math.max(1,Math.floor(r.width/a)),s={format:`rpgm-xp`,index:n,frames:o,single:i};if(BP(s),o>Math.floor(r.width/a))throw Error(`${e} asks for ${o} frames but its sheet fits ${Math.floor(r.width/a)}`);return{sheet:t.sheet,layout:s,cache:new Map,claims:e=>{let t=LP(e);return t!==null&&t.index===n}}}claimAutotileSets(e,t,n){for(let t of e)if(t.claims(n))return t;throw Error(`tile ${n} in autotile layer "${t}" matches none of its sets`)}autotilePieces(e,t,n){let r=`${t}:${n}`,i=e.cache.get(r);if(i)return i;let a=KP(e.layout,t,n),o={parts:a,textures:a.map(t=>new q({source:e.sheet.texture.source,frame:new G(t.sourceX,t.sourceY,t.sourceWidth,t.sourceHeight)}))};return e.cache.set(r,o),o}makeAutotileSprites(e,t,n,r,i){let a=this.index(n,r),o=this.autotilePieces(t,i,e.frame),s=this.cellOrigin(n,r),c=this.cellHeight[a]*this.heightStep,l=o.textures.map((e,t)=>{let n=o.parts[t],r=new wM(e);return r.x=s.x+n.destX*this.tileWidth,r.y=s.y-c+n.destY*this.tileHeight,r.scale.set(n.destWidth*this.tileWidth/n.sourceWidth,n.destHeight*this.tileHeight/n.sourceHeight),r.tint=this.cellTint[a],r.colorAdd=this.cellAdd[a],r}),u=this.chunks[this.layers.indexOf(e)][this.chunkIndex(n,r)];for(let e of l)u.addChild(e);return l}setAutotileCell(e,t,n,r){let i=this.index(t,n);e.data[i]=r;let a=e.sprites[i];if(r<=0){if(a)for(let e of a)e.destroy();e.sprites[i]=null;return}let o=this.claimAutotileSets(e.sets,e.name,r),s=this.autotilePieces(o,r,e.frame);if(a&&a.length===s.textures.length)for(let e=0;e<a.length;e++)a[e].texture=s.textures[e];else{if(a)for(let e of a)e.destroy();e.sprites[i]=this.makeAutotileSprites(e,o,t,n,r)}}eachCellSprite(e,t,n){let r=e.sprites[t];if(r){if(Array.isArray(r))for(let e of r)n(e);else n(r)}}firstCellSprite(e,t){let n=e.sprites[t];return n?Array.isArray(n)?n[0]:n:null}layerAt(e){let t=typeof e==`number`?this.layers[e]:this.layersByName.get(e);if(!t)throw Error(`no such layer: ${e}`);return t}chunkIndex(e,t){return Math.floor(t/this.chunkSize)*this.chunkColumns+Math.floor(e/this.chunkSize)}projectedCenter(e,t){switch(this.shape){case`square`:return{x:(e+.5)*this.tileWidth,y:(t+.5)*this.tileHeight};case`hex`:return $n(e,t,this.tileWidth,this.tileHeight);case`isometric`:return{x:(e-t+(this.heightInTiles-1))*(this.tileWidth/2)+this.tileWidth/2,y:(e+t)*(this.tileHeight/2)+this.tileHeight/2};case`staggered`:return{x:e*this.tileWidth+(t&1)*(this.tileWidth/2)+this.tileWidth/2,y:t*(this.tileHeight/2)+this.tileHeight/2}}}projectedTile(e,t){switch(this.shape){case`square`:return{x:Math.floor(e/this.tileWidth),y:Math.floor(t/this.tileHeight)};case`hex`:return er(e,t,this.tileWidth,this.tileHeight);case`isometric`:{let n=(e-this.tileWidth/2)/(this.tileWidth/2)-(this.heightInTiles-1),r=(t-this.tileHeight/2)/(this.tileHeight/2);return{x:Math.round((n+r)/2),y:Math.round((r-n)/2)}}case`staggered`:{let n=Math.round((t-this.tileHeight/2)/(this.tileHeight/2));return{x:Math.round((e-this.tileWidth/2-(n&1)*(this.tileWidth/2))/this.tileWidth),y:n}}}}cellOrigin(e,t){let n=this.projectedCenter(e,t);return{x:n.x-this.tileWidth/2,y:n.y-this.tileHeight/2}}textureFor(e){let t=nF(e);if(t>=this.sheets.length)throw Error(`frame ${e} names sheet ${t}, but this map has ${this.sheets.length}`);return this.sheets[t].get(rF(e))}buildSprite(e,t,n,r){let i=new wM(this.textureFor(r)),a=this.cellOrigin(t,n);i.x=a.x,i.y=a.y-this.cellHeight[this.index(t,n)]*this.heightStep;let o=this.index(t,n);return i.tint=this.cellTint[o],i.colorAdd=this.cellAdd[o],e.sprites[o]=i,this.chunks[this.layers.indexOf(e)][this.chunkIndex(t,n)].addChild(i),i}getTile(e,t,n){return this.inside(t,n)?this.layerAt(e).data[this.index(t,n)]:-1}setTile(e,t,n,r){if(!this.inside(t,n))return;let i=this.layerAt(e),a=this.index(t,n);if(i.data[a]!==r){if(i.kind===`autotile`)this.setAutotileCell(i,t,n,r);else if(i.kind===`shadow`)this.setShadowCell(i,t,n,r);else{i.data[a]=r;let e=i.sprites[a];r===-1?(e?.destroy(),i.sprites[a]=null):e?e.texture=this.textureFor(r):this.buildSprite(i,t,n,r)}this.layers[0]===i&&this.syncFaces(t,n)}}setLayerData(e,t){this.layerAt(e);for(let n=0;n<this.heightInTiles;n++)for(let r=0;r<this.widthInTiles;r++)this.setTile(e,r,n,t[this.index(r,n)]??-1)}stampRect(e,t,n,r,i,a){if(this.layerAt(e),a.length!==r*i)throw Error(`a ${r}x${i} stamp needs ${r*i} frames, got ${a.length}`);if(t<0||n<0||t+r>this.widthInTiles||n+i>this.heightInTiles)throw Error(`a ${r}x${i} stamp at (${t},${n}) does not fit the ${this.widthInTiles}x${this.heightInTiles} map`);for(let o=0;o<i;o++)for(let i=0;i<r;i++)this.setTile(e,t+i,n+o,a[o*r+i])}setCellColor(e,t,n,r=0){if(!this.inside(e,t))return;let i=this.index(e,t);if(this.cellTint[i]===n&&this.cellAdd[i]===r)return;this.cellTint[i]=n,this.cellAdd[i]=r;for(let e of this.layers)e.kind!==`shadow`&&this.eachCellSprite(e,i,e=>{e.tint=n,e.colorAdd=r});let a=this.faces[i];a&&(a.tint=n)}getCellTint(e,t){return this.inside(e,t)?this.cellTint[this.index(e,t)]:0}clearColors(){for(let e=0;e<this.heightInTiles;e++)for(let t=0;t<this.widthInTiles;t++)this.setCellColor(t,e,16777215,0)}setCellHeight(e,t,n){if(!this.inside(e,t))return;if(!Number.isInteger(n))throw Error(`a cell's height must be a whole number, got ${n}`);let r=this.index(e,t);if(this.cellHeight[r]===n)return;let i=(n-this.cellHeight[r])*this.heightStep;this.cellHeight[r]=n;for(let e of this.layers)this.eachCellSprite(e,r,e=>{e.y-=i});this.syncFaces(e,t)}getCellHeight(e,t){return this.inside(e,t)?this.cellHeight[this.index(e,t)]:0}get faceCount(){return this.faces.filter(e=>e!==null).length}syncFaces(e,t){if(this.layers.length===0)return;let n=this.index(e,t),r=(this.shape===`isometric`||this.shape===`staggered`)&&this.cellHeight[n]>0&&this.layers[0].data[n]!==-1,i=this.faces[n];if(!r){i&&(i.destroy(),this.faces[n]=null);return}let a=i??new Z;if(this.drawFaces(a,e,t),a.tint=this.cellTint[n],!i){this.faces[n]=a;let r=this.chunks[0][this.chunkIndex(e,t)],i=this.firstCellSprite(this.layers[0],n);i?r.addChildAt(a,r.getChildIndex(i)):r.addChild(a)}}drawFaces(e,t,n){let r=this.cellOrigin(t,n),i=r.x,a=r.y,o=this.tileWidth/2,s=this.tileHeight/2,c=this.heightStep,l=this.cellHeight[this.index(t,n)];e.clear();for(let t=1;t<=l;t++){let n=t*c,r=(t-1)*c;e.poly([i,a+s-n,i+o,a+s*2-n,i+o,a+s*2-r,i,a+s-r]).fill($P),e.poly([i+o,a+s*2-n,i+o*2,a+s-n,i+o*2,a+s-r,i+o,a+s*2-r]).fill(eF)}}toTile(e,t){return this.projectedTile(e,t)}tileCenter(e,t){let n=this.projectedCenter(e,t);return n.y-=this.getCellHeight(e,t)*this.heightStep,n}cull(e){let t=e.view,n=this.projectedTile(t.x,t.y),r=this.projectedTile(t.x+t.width,t.y),i=this.projectedTile(t.x,t.y+t.height),a=this.projectedTile(t.x+t.width,t.y+t.height),o=Math.min(n.x,r.x,i.x,a.x),s=Math.max(n.x,r.x,i.x,a.x),c=Math.min(n.y,r.y,i.y,a.y),l=Math.max(n.y,r.y,i.y,a.y),u=Math.floor(o/this.chunkSize)-1,d=Math.floor(s/this.chunkSize)+1,f=Math.floor(c/this.chunkSize)-1,p=Math.floor(l/this.chunkSize)+1;for(let e=0;e<this.chunkRows;e++){let t=e>=f&&e<=p;for(let n=0;n<this.chunkColumns;n++){let r=t&&n>=u&&n<=d,i=e*this.chunkColumns+n;for(let e of this.chunks)e[i].renderable=r}}}get visibleChunks(){return this.chunks.length===0?0:this.chunks[0].filter(e=>e.renderable).length}},aF=class extends J{constructor(...e){super(...e),this.layers=new Map}addLayer(e,t,n=0){this.removeLayer(e);let r=new wM(t);return this.layers.set(e,{sprite:r,order:n}),this.addChild(r),this.resort(),r}removeLayer(e){let t=this.layers.get(e);t&&(this.layers.delete(e),t.sprite.destroy())}layer(e){return this.layers.get(e)?.sprite}hasLayer(e){return this.layers.has(e)}setTexture(e,t){let n=this.layers.get(e);n&&(n.sprite.texture=t)}resort(){[...this.layers.values()].sort((e,t)=>e.order-t.order).forEach((e,t)=>this.setChildIndex(e.sprite,t))}},oF=class{constructor(e,t,n,r={}){this.elapsed=0,this.arrived=!1,this.sprite=e,this.fromX=t.x,this.fromY=t.y,this.toX=n.x,this.toY=n.y,this.animation=r.animation;let i=Math.hypot(n.x-t.x,n.y-t.y);this.duration=r.duration??i/(r.speed??400),this.duration<=0&&(this.duration=1e-6),e.x=t.x,e.y=t.y}get done(){return this.arrived}get progress(){return Math.min(1,this.elapsed/this.duration)}get frame(){return this.animation?.frameAt(this.elapsed)}get frameOffset(){let e=this.frame;return{x:e?.offsetX??0,y:e?.offsetY??0}}update(e){if(this.arrived)return!1;this.elapsed+=e;let t=this.progress;return this.sprite.x=this.fromX+(this.toX-this.fromX)*t,this.sprite.y=this.fromY+(this.toY-this.fromY)*t,t>=1&&(this.arrived=!0,!0)}};function sF(e){return e===!0||e===`progress`?`progress`:typeof e==`number`&&e>0?`seconds`:`none`}var cF=class extends J{constructor(...e){super(...e),this.live=[]}add(e,t,n,r={}){let i,a;e instanceof q?(a=new wl(e),this.addChild(a),i=a):i=e,r.tint!==void 0&&typeof i.tint==`number`&&(i.tint=r.tint);let o=sF(r.fadeIn),s=typeof r.fadeIn==`number`?r.fadeIn:0,c=typeof i.alpha==`number`?i.alpha:1;o!==`none`&&(i.alpha=0);let l={projectile:new oF(i,t,n,r),sprite:i,built:a,onArrive:r.onArrive,spin:r.spin??(r.spinDegrees===void 0?void 0:r.spinDegrees*Math.PI/180),fadeMode:o,fadeIn:s,baseAlpha:c,elapsed:0};return this.live.push(l),{projectile:l.projectile,get done(){return l.projectile.done},cancel:()=>{let e=this.live.indexOf(l);e!==-1&&(this.live.splice(e,1),this.release(l))}}}update(e){for(let t=this.live.length-1;t>=0;t--){let n=this.live[t];n.elapsed+=e,n.spin!==void 0&&(n.sprite.rotation=(n.sprite.rotation??0)+n.spin*e),n.fadeMode===`seconds`&&(n.sprite.alpha=n.baseAlpha*Math.min(1,n.elapsed/n.fadeIn));let r=n.projectile.update(e);n.fadeMode===`progress`&&(n.sprite.alpha=n.baseAlpha*n.projectile.progress),r&&(this.live.splice(t,1),this.release(n),n.onArrive?.())}}get count(){return this.live.length}clear(){for(let e of this.live.splice(0))this.release(e)}destroy(){this.clear(),super.destroy()}release(e){e.built&&(this.removeChild(e.built),e.built.destroy())}},lF=class extends J{constructor(e,t,n={}){super(),this.elapsed=0,this.expired=!1,this.lifeFraction=1,this.from={...e},this.to={...t},this.colour=n.colour??16777215,this.thin=n.thin??!1;let r=n.texture;if(r===void 0?(this.texture=void 0,this.stretch=!1,this.textureAnchor=0):r instanceof q?(this.texture=r,this.stretch=!1,this.textureAnchor=0):(this.texture=r.source,this.stretch=r.stretch??!1,this.textureAnchor=r.anchor??.5),this.thickness=n.width??2,this.duration=Math.max(1e-6,n.duration??.2),this.texture&&this.stretch)this.body=new wl(this.texture),this.body.anchor.set(0,this.textureAnchor);else if(this.texture){let e=new dA({texture:this.texture,width:1,height:this.thickness});e.anchor.set(0,this.textureAnchor),this.body=e}else this.body=new Z;(n.additive??!0)&&(this.body.blendMode=`add`),this.addChild(this.body),this.redraw()}get progress(){return Math.min(1,this.elapsed/this.duration)}get done(){return this.expired}retarget(e,t){e&&(this.from={...e}),t&&(this.to={...t}),this.redraw()}update(e){return!this.expired&&(this.elapsed+=e,this.alpha=1-this.progress,this.lifeFraction=this.thin?1-this.progress:1,this.thin&&this.redraw(),this.elapsed>=this.duration&&(this.expired=!0,!0))}destroy(){this.removeChild(this.body),this.body.destroy(),super.destroy()}redraw(){let e=this.to.x-this.from.x,t=this.to.y-this.from.y,n=Math.hypot(e,t);if(this.position.set(this.from.x,this.from.y),this.rotation=n>0?Math.atan2(t,e):0,this.body instanceof dA)this.body.width=n,this.body.height=this.thickness*this.lifeFraction;else if(this.body instanceof wl){let e=this.texture?.width||1,t=this.texture?.height||1;this.body.scale.x=n/e,this.body.scale.y=this.thickness/t*this.lifeFraction}else{let e=this.body;e.clear(),e.moveTo(0,0),e.lineTo(n,0),e.stroke({width:this.thickness*this.lifeFraction,color:this.colour})}}},uF=class extends J{constructor(...e){super(...e),this.live=[]}add(e,t,n){let r=new lF(e,t,n);return this.addChild(r),this.live.push(r),r}update(e){for(let t=this.live.length-1;t>=0;t--)if(this.live[t].update(e)){let[e]=this.live.splice(t,1);this.removeChild(e),e.destroy()}}get count(){return this.live.length}clear(){for(let e of this.live.splice(0))this.removeChild(e),e.destroy()}destroy(){this.clear(),super.destroy()}},dF=class{constructor(e,t,n={}){this.elapsed=0,this.sinceFlicker=0,this.expired=!1,this.current=[],this.from={...e},this.to={...t},this.segments=Math.max(0,Math.floor(n.segments??6)),this.jitter=n.jitter??12,this.flickerInterval=n.flickerInterval,this.random=n.random??Math.random,this.duration=n.duration,this.reroll()}get points(){return this.current}get done(){return this.expired}retarget(e,t){e&&(this.from={...e}),t&&(this.to={...t}),this.flickerInterval===void 0&&this.reroll()}update(e){return!this.expired&&(this.elapsed+=e,this.flickerInterval!==void 0&&(this.sinceFlicker+=e,this.sinceFlicker>=this.flickerInterval&&(this.sinceFlicker=0,this.reroll())),this.duration!==void 0&&this.elapsed>=this.duration&&(this.expired=!0,!0))}reroll(){let e=this.to.x-this.from.x,t=this.to.y-this.from.y,n=Math.hypot(e,t),r=n>0?-t/n:0,i=n>0?e/n:0,a=[{...this.from}],o=this.segments+1;for(let n=1;n<o;n+=1){let s=n/o,c=Math.sin(Math.PI*s),l=(this.random()*2-1)*this.jitter*c;a.push({x:this.from.x+e*s+r*l,y:this.from.y+t*s+i*l})}a.push({...this.to}),this.current=a}},fF=class{constructor(e,t={}){this.elapsed=0,this.expired=!1,this.child=e,this.offsetX=t.offsetX??0,this.offsetY=t.offsetY??0,this.duration=t.duration}get done(){return this.expired}follow(e,t){return this.child.x=e+this.offsetX,this.child.y=t+this.offsetY,this}update(e){return this.expired||this.duration===void 0?!1:(this.elapsed+=e,this.elapsed>=this.duration&&(this.expired=!0,!0))}},pF=class extends J{constructor(e){super(),this.cells=new Map,this.ripples=[],this.offset=0,this.eventMode=`none`,this.columns=e.width,this.tileSize=e.tileSize??16,this.speed=e.speed??5,this.rippleTexture=e.rippleTexture,this.rippleDuration=e.rippleDuration??.5;for(let t=0;t<e.height;t++)for(let n=0;n<e.width;n++){if(!e.isLiquid(n,t))continue;let r=new dA({texture:e.texture,width:this.tileSize,height:this.tileSize});r.eventMode=`none`,r.position.set(n*this.tileSize,t*this.tileSize),r.tilePosition.set(-r.x,-r.y),r.visible=!1,this.cells.set(n+t*this.columns,r),this.addChild(r)}}setCellColor(e,t,n){let r=this.cells.get(e+t*this.columns);r&&(r.tint=n,r.visible=n!==0)}ripple(e,t){if(!this.rippleTexture||!this.cells.get(e+t*this.columns)?.visible)return;let n=new wl(this.rippleTexture);n.eventMode=`none`,n.anchor.set(.5),n.position.set((e+.5)*this.tileSize,(t+.5)*this.tileSize),n.scale.set(0),this.addChild(n),this.ripples.push({sprite:n,age:0})}get rippleCount(){return this.ripples.length}update(e){this.offset+=this.speed*e;for(let e of this.cells.values())e.visible&&(e.tilePosition.y=-e.y+this.offset);for(let t=this.ripples.length-1;t>=0;t--){let n=this.ripples[t];if(n.age+=e,n.age>=this.rippleDuration)n.sprite.destroy(),this.ripples.splice(t,1);else{let e=n.age/this.rippleDuration;n.sprite.scale.set(e),n.sprite.alpha=1-e}}}};function mF(e,t,n,r,i,a){let o=t*r;for(let s=0;s<n;s++)for(let n=0;n<t;n++){let t=i(n,s);for(let i=0;i<r;i++)for(let c=0;c<r;c++){let l=a[typeof t==`number`?t:t[i*r+c]??0]??[0,0,0,0];e.set(l,((s*r+i)*o+n*r+c)*4)}}}var hF=class extends wl{constructor(e){let t=e.resolution??2,n=document.createElement(`canvas`);n.width=e.width*t,n.height=e.height*t;let r=n.getContext(`2d`);if(!r)throw Error(`FogLayer needs a 2D canvas context`);super(q.from(n)),this.context=r,this.image=r.createImageData(n.width,n.height),this.columns=e.width,this.rows=e.height,this.cellResolution=t,this.palette=e.palette,this.texture.source.scaleMode=`linear`,this.scale.set((e.tileSize??16)/t),this.eventMode=`none`}setPalette(e){this.palette=e}refresh(e){mF(this.image.data,this.columns,this.rows,this.cellResolution,e,this.palette),this.context.putImageData(this.image,0,0),this.texture.source.update()}destroy(){super.destroy({texture:!0,textureSource:!0})}},gF=`halo`,_F=class extends iN{constructor(e){super(),this.offsetX=e.offsetX??0,this.offsetY=e.offsetY??0,this.blendMode=e.blendMode??`add`,this.add(gF,e.frames,e.animation),this.play(gF)}follow(e,t){return this.position.set(e+this.offsetX,t+this.offsetY),this}};_e();function vF(e){return typeof e==`number`?e:D(e[0],e[1])}function yF(e){if(typeof e==`number`)return e;let t=D(),n=n=>{let r=e[0]>>n&255,i=e[1]>>n&255;return Math.round(r+(i-r)*t)<<n};return n(16)|n(8)|n(0)}function bF(e){return typeof e==`function`?e:t=>e[0]+(e[1]-e[0])*t}var xF=class extends J{constructor(e={}){super(),this.pool=[],this.sprites=[],this.tintOverridden=!1,this.emitting=!1,this.followTarget=null,this.followOffsetX=0,this.followOffsetY=0,this.followEnabled=null,this.followVisible=null,this.poolCursor=0,this.debt=0;let t=Math.max(1,Math.floor(e.max??200));this.rate=e.rate??0,this.life=e.life??[.4,.9],this.speed=e.speed??[20,60],this.angleRange=e.angle??[0,Math.PI*2],this.gravityX=e.gravity?.x??0,this.gravityY=e.gravity?.y??0,this.scaleOf=bF(e.scale??[1,1]),this.alphaOf=bF(e.alpha??[1,0]),this.flicker=kn(e.flicker??0,0,1),this.spin=e.spin??0,this.tintRange=e.tint??16777215,this.frames=e.frames,this.spawnArea=e.spawn??null;for(let n=0;n<t;n++){this.pool.push({x:0,y:0,vx:0,vy:0,age:0,life:0,rotation:0,spin:0,scale:1,alpha:1,tint:16777215,frame:0,active:!1});let t=this.frames?.[0]??e.texture;if(t){let n=new wl(t);n.anchor.set(.5),n.visible=!1,typeof e.tint==`number`&&(n.tint=e.tint),this.sprites.push(n),this.addChild(n)}}}start(){this.emitting=!0}stop(){this.emitting=!1,this.debt=0}attach(e,t={}){this.followTarget=e,this.followOffsetX=t.offsetX??0,this.followOffsetY=t.offsetY??0,this.followEnabled=t.enabled??null,this.followVisible=t.visible??null,this.syncFollow()}detach(){this.followTarget=null,this.followEnabled=null,this.followVisible!==null&&(this.visible=!0),this.followVisible=null,this.followOffsetX=0,this.followOffsetY=0}get attachedTo(){return this.followTarget}syncFollow(){let e=this.followTarget;if(!e)return;if(typeof e!=`function`&&e.destroyed){this.detach();return}let t=typeof e==`function`?e():e;this.x=t.x+this.followOffsetX,this.y=t.y+this.followOffsetY,this.followVisible!==null&&(this.visible=this.followVisible())}followEmissionAllowed(){return this.followEnabled?.()??!0}get isEmitting(){return this.emitting}get activeCount(){let e=0;for(let t of this.pool)t.active&&e++;return e}get particles(){return this.pool}burst(e,t={}){this.syncFollow(),t.tint!==void 0&&(this.tintOverridden=!0);let n=0;for(let r=0;r<e&&this.spawn(t);r++)n++;return n}spawn(e={}){let t=null;for(let e=0;e<this.pool.length;e++){let e=this.pool[this.poolCursor];if(this.poolCursor=(this.poolCursor+1)%this.pool.length,!e.active){t=e;break}}if(!t)return!1;let n=vF(this.angleRange),r=vF(this.speed),i=+!br(),a=this.spawnOffset();return t.x=(e.x??this.x)+a.x,t.y=(e.y??this.y)+a.y,t.vx=Math.cos(n)*r*i,t.vy=Math.sin(n)*r*i,t.age=0,t.life=Math.max(1e-6,vF(this.life)),t.rotation=0,t.spin=vF(this.spin)*i,t.scale=this.scaleOf(0),t.alpha=this.alphaOf(0),t.tint=e.tint??yF(this.tintRange),t.frame=0,t.active=!0,!0}spawnOffset(){let e=this.spawnArea;if(!e)return{x:0,y:0};let t=e.height??e.width;if(e.shape===`rect`)return{x:(D()-.5)*e.width,y:(D()-.5)*t};let n=Math.sqrt(D()),r=D()*Math.PI*2;return{x:Math.cos(r)*n*(e.width/2),y:Math.sin(r)*n*(t/2)}}update(e){if(this.syncFollow(),this.emitting&&this.rate>0&&this.followEmissionAllowed()){for(this.debt+=this.rate*e;this.debt>=1;)if(--this.debt,!this.spawn()){this.debt=0;break}}let t=br();for(let n of this.pool){if(!n.active)continue;if(n.age+=e,n.age>=n.life){n.active=!1;continue}t?(n.vx=0,n.vy=0,n.spin=0):(n.vx+=this.gravityX*e,n.vy+=this.gravityY*e),n.x+=n.vx*e,n.y+=n.vy*e,n.rotation+=n.spin*e;let r=n.age/n.life;n.scale=this.scaleOf(r),n.alpha=this.alphaOf(r),this.flicker>0&&!t&&(n.scale*=1-this.flicker*D()),this.frames&&(n.frame=Math.min(this.frames.length-1,Math.floor(r*this.frames.length)))}this.draw()}draw(){if(this.sprites.length===0)return;let e=typeof this.tintRange!=`number`||this.tintOverridden;for(let t=0;t<this.pool.length;t++){let n=this.pool[t],r=this.sprites[t];r.visible=n.active,n.active&&(r.x=n.x-this.x,r.y=n.y-this.y,r.rotation=n.rotation,r.alpha=n.alpha,r.scale.set(n.scale),e&&(r.tint=n.tint),this.frames&&(r.texture=this.frames[n.frame]??r.texture))}}clear(){for(let e of this.pool)e.active=!1;this.debt=0,this.draw()}},SF=class extends J{constructor(e={}){super(),this.overlay=new Z,this.phase=`idle`,this.elapsed=0,this.duration=0,this.fromAlpha=0,this.toAlpha=0,this.queue=[],this.defaultColor=e.color??0,this.viewWidth=e.width??0,this.viewHeight=e.height??0,this.overlay.alpha=0,this.overlay.tint=this.defaultColor,this.addChild(this.overlay),this.redraw()}setViewport(e,t){this.viewWidth=e,this.viewHeight=t,this.redraw()}redraw(){this.overlay.clear(),this.viewWidth>0&&this.viewHeight>0&&this.overlay.rect(0,0,this.viewWidth,this.viewHeight).fill({color:16777215})}get isBusy(){return this.phase!==`idle`}get washAlpha(){return this.overlay.alpha}fadeOut(e,t){this.begin(`fadeOut`,e,this.overlay.alpha,1,t)}fadeIn(e,t){this.begin(`fadeIn`,e,this.overlay.alpha,0,t)}flash(e,t,n=1){this.begin(`flash`,e,0,n,t)}sequence(e){this.queue=e.slice(1),e.length===0?this.phase=`idle`:this.beginStep(e[0])}setTint(e,t){this.queue=[],this.phase=`idle`,this.elapsed=0,this.overlay.tint=e,this.overlay.alpha=kn(t,0,1)}clear(){this.queue=[],this.phase=`idle`,this.elapsed=0,this.overlay.alpha=0,this.overlay.tint=this.defaultColor}beginStep(e){switch(e.kind){case`fadeOut`:return this.begin(`fadeOut`,e.duration,this.overlay.alpha,1,e.color);case`fadeIn`:return this.begin(`fadeIn`,e.duration,this.overlay.alpha,0,e.color);case`flash`:return this.begin(`flash`,e.duration,0,e.peak??1,e.color);case`hold`:return this.begin(`hold`,e.duration,this.overlay.alpha,this.overlay.alpha,e.color??this.overlay.tint)}}advance(){let e=this.queue.shift();return e?this.beginStep(e):(this.phase=`idle`,!0)}begin(e,t,n,r,i){return br()&&(t=0),this.overlay.tint=i??this.defaultColor,this.fromAlpha=n,this.toAlpha=r,this.elapsed=0,this.duration=t,t>0?(this.phase=e,this.overlay.alpha=e===`flash`?0:n,!1):(this.overlay.alpha=e===`flash`?0:r,this.advance())}update(e){if(this.phase===`idle`)return!1;if(br())return this.overlay.alpha=this.phase===`flash`?0:this.toAlpha,this.advance();this.elapsed+=e;let t=Math.min(1,this.elapsed/this.duration);if(this.phase===`flash`){let e=t<.5?Er.easeOutQuad(t*2):1-Er.easeInQuad((t-.5)*2);this.overlay.alpha=this.toAlpha*e}else{let e=Er.easeInOutQuad(t);this.overlay.alpha=this.fromAlpha+(this.toAlpha-this.fromAlpha)*e}return t>=1&&(this.overlay.alpha=this.phase===`flash`?0:this.toAlpha,this.advance())}},CF=class{constructor(e,t){this.idleOrMove=`idle`,this.inAction=!1,this.sprite=e,this.animationName=t.animationName,this.variant=t.variant??``,this.sprite.onFinish=()=>this.onSpriteFinish(),this.apply(this.idleOrMove)}get state(){return this.inAction?`action`:this.idleOrMove}get variantName(){return this.variant}setMoving(e,t){t!==void 0&&(this.variant=t),this.idleOrMove=e?`move`:`idle`,this.inAction||this.apply(this.idleOrMove)}playAction(e,t=!1){(!this.inAction||t)&&(e!==void 0&&(this.variant=e),this.inAction=!0,this.apply(`action`))}onSpriteFinish(){this.inAction&&(this.inAction=!1,this.apply(this.idleOrMove))}apply(e){let t=this.animationName(e,this.variant);this.sprite.has(t)&&this.sprite.play(t,e===`action`)}},wF=class{constructor(e,t){this.active=new Set,this.elapsed=0,this.flashColor=0,this.flashStrength=0,this.flashDuration=0,this.flashRemaining=0,this.target=e,this.styles=t.styles}set(e,t){t?this.active.add(e):this.active.delete(e)}has(e){return this.active.has(e)}flash(e,t,n){this.flashColor=e,this.flashStrength=t,this.flashDuration=Math.max(n,1e-6),this.flashRemaining=this.flashDuration}update(e){this.elapsed+=e,this.flashRemaining>0&&(this.flashRemaining=Math.max(0,this.flashRemaining-e));let t=0,n=0,r=0;for(let e of this.active){let i=this.styles[e];if(!i)continue;let a=i.strength??.5,o=i.pulseRate?a*(.5+.5*Math.sin(this.elapsed*i.pulseRate*Math.PI*2)):a;t+=(i.color>>16&255)/255*o,n+=(i.color>>8&255)/255*o,r+=(i.color&255)/255*o}if(this.flashRemaining>0){let e=this.flashRemaining/this.flashDuration,i=this.flashStrength*e;t+=(this.flashColor>>16&255)/255*i,n+=(this.flashColor>>8&255)/255*i,r+=(this.flashColor&255)/255*i}this.target.colorAdd=bM(Math.min(1,t),Math.min(1,n),Math.min(1,r))}},TF={scaleX:1,scaleY:1,dy:0,rotation:0,skewX:0},EF={done:Promise.resolve(),cancel(){}},DF=class{constructor(e,t={}){this.contributions=new Map,this.loops=new Set,this.nextId=0,this.flipX=!1,this.flipY=!1,this.destroyed=!1,this.target=e,this.tweener=t.tweener??new Dr,this.ownsTweener=t.tweener===void 0,this.intent=t.intent??`decorative`,this.rest={y:e.y,rotation:e.rotation,scaleX:e.scale.x,scaleY:e.scale.y,skewX:e.skew.x}}squash(e){let{amount:t,duration:n}=e;return this.run(n,e=>{let n=Math.sin(Math.PI*e)*t;return{scaleX:1+n,scaleY:1-n}})}hop(e){let{height:t,duration:n}=e;return this.run(n,e=>({dy:-Math.sin(Math.PI*e)*t}))}bob(e){let{amplitude:t,period:n,cycles:r}=e;return r===void 0?this.loop(e=>({dy:Math.sin(2*Math.PI*e/n)*t})):this.run(n*r,e=>({dy:Math.sin(2*Math.PI*r*e)*t}))}wobble(e){let{angle:t,duration:n}=e;return this.run(n,e=>({rotation:Math.sin(4*Math.PI*e)*(1-e)*t}))}spin(e){let{turns:t,duration:n}=e;return this.run(n,e=>({rotation:Math.PI*2*t*e}),Er.easeInOutQuad)}shear(e){let{amount:t,duration:n}=e;return this.run(n,e=>({skewX:Math.sin(Math.PI*e)*t}))}flip(e,t){return e===`x`?this.flipX=t??!this.flipX:this.flipY=t??!this.flipY,this.write(),e===`x`?this.flipX:this.flipY}update(e){this.ownsTweener&&this.tweener.update(e);for(let t of[...this.loops])t(e)}get isBusy(){return this.contributions.size>0}destroy(){this.destroyed=!0,this.contributions.clear(),this.loops.clear(),this.flipX=this.flipY=!1,this.write()}run(e,t,n=Er.linear){if(this.destroyed)return EF;let r=this.nextId++,i=()=>{this.contributions.delete(r),this.write()};return this.contributions.set(r,TF),{done:this.tweener.tween(e,e=>{this.contributions.has(r)&&(this.contributions.set(r,{...TF,...t(e)}),this.write())},{ease:n,intent:this.intent}).then(i),cancel:i}}loop(e){if(this.destroyed)return EF;let t=this.nextId++,n=0,r,i=new Promise(e=>r=e),a=r=>{n+=r;let i=br()&&this.intent===`decorative`;this.contributions.set(t,i?TF:{...TF,...e(n)}),this.write()};return this.contributions.set(t,TF),this.loops.add(a),{done:i,cancel:()=>{this.loops.delete(a),this.contributions.delete(t),this.write(),r()}}}write(){let e=1,t=1,n=0,r=0,i=0;for(let a of this.contributions.values())e*=a.scaleX,t*=a.scaleY,n+=a.dy,r+=a.rotation,i+=a.skewX;let{rest:a,target:o}=this;o.y=a.y+n,o.rotation=a.rotation+r,o.scale.x=a.scaleX*e*(this.flipX?-1:1),o.scale.y=a.scaleY*t*(this.flipY?-1:1),o.skew.x=a.skewX+i}};function OF(e,t){let n=e??{x:0,y:0};if(!Number.isFinite(n.x)||!Number.isFinite(n.y))throw RangeError(`a cloth ${t} needs finite coordinates, saw (${n.x}, ${n.y})`);return{x:n.x,y:n.y}}var kF=class{constructor(e){if(!Number.isFinite(e.width)||e.width<=0)throw RangeError(`a cloth needs width above 0, saw ${e.width}`);if(!Number.isFinite(e.height)||e.height<=0)throw RangeError(`a cloth needs height above 0, saw ${e.height}`);for(let t of[`segmentsX`,`segmentsY`])if(!Number.isInteger(e[t])||e[t]<1)throw RangeError(`a cloth needs integer ${t} of at least 1, saw ${e[t]}`);let t=e.stiffness??.9;if(!Number.isFinite(t)||t<0||t>1)throw RangeError(`a cloth needs stiffness between 0 and 1, saw ${t}`);let n=e.damping??.02;if(!Number.isFinite(n)||n<0||n>1)throw RangeError(`a cloth needs damping between 0 and 1, saw ${n}`);this.segmentsX=e.segmentsX,this.segmentsY=e.segmentsY,this.stiffness=t,this.damping=n,this.gravity=OF(e.gravity,`gravity`),this.wind=OF(e.wind,`wind`);let r=this.pointCount;this.rest=new Float32Array(r*2),this.positions=new Float32Array(r*2),this.previous=new Float32Array(r*2),this.pinned=new Uint8Array(r),this.links=[];let i=e.width/e.segmentsX,a=e.height/e.segmentsY;for(let t=0;t<=e.segmentsY;t++)for(let n=0;n<=e.segmentsX;n++){let e=this.indexOf(n,t);this.rest[e*2]=n*i,this.rest[e*2+1]=t*a,t===0&&(this.pinned[e]=1)}this.reset();let o=(e,t)=>this.indexOf(e,t);for(let t=0;t<=e.segmentsY;t++)for(let n=0;n<e.segmentsX;n++)this.links.push([o(n,t),o(n+1,t),i]);for(let t=0;t<e.segmentsY;t++)for(let n=0;n<=e.segmentsX;n++)this.links.push([o(n,t),o(n,t+1),a])}get pointCount(){return(this.segmentsX+1)*(this.segmentsY+1)}indexOf(e,t){if(!Number.isInteger(e)||!Number.isInteger(t)||e<0||t<0||e>this.segmentsX||t>this.segmentsY)throw RangeError(`cloth point (${e}, ${t}) is outside a ${this.segmentsX+1}x${this.segmentsY+1} grid`);return t*(this.segmentsX+1)+e}checkIndex(e){if(!Number.isInteger(e)||e<0||e>=this.pointCount)throw RangeError(`cloth point ${e} does not exist`)}pointPosition(e){return this.checkIndex(e),{x:this.positions[e*2],y:this.positions[e*2+1]}}isPinned(e){return this.checkIndex(e),this.pinned[e]===1}pointLinks(){return this.links.map(([e,t])=>[e,t])}pinPoint(e){this.checkIndex(e),this.pinned[e]=1,this.previous[e*2]=this.positions[e*2],this.previous[e*2+1]=this.positions[e*2+1]}unpinPoint(e){this.checkIndex(e),this.pinned[e]=0}setWind(e,t){let n=OF({x:e,y:t},`wind`);this.wind=n}setGravity(e,t){let n=OF({x:e,y:t},`gravity`);this.gravity=n}reset(){this.positions.set(this.rest),this.previous.set(this.rest)}movedCount(){let e=0;for(let t=0;t<this.pointCount;t++)this.positions[t*2]===this.rest[t*2]?this.positions[t*2+1]!==this.rest[t*2+1]&&e++:e++;return e}writePositions(e){if(!(e instanceof Float32Array)||e.length!==this.positions.length)throw RangeError(`a cloth target needs a Float32Array of ${this.positions.length} floats, saw length ${e?.length}`);e.set(this.positions)}update(e){if(!Number.isFinite(e)||e<0)throw RangeError(`a cloth update needs dt of at least 0, saw ${e}`);if(e===0)return;let t=1-this.damping,n=(this.gravity.x+this.wind.x)*e*e,r=(this.gravity.y+this.wind.y)*e*e,{positions:i,previous:a,pinned:o}=this;for(let e=0;e<this.pointCount;e++){if(o[e]===1)continue;let s=i[e*2],c=i[e*2+1];i[e*2]=s+(s-a[e*2])*t+n,i[e*2+1]=c+(c-a[e*2+1])*t+r,a[e*2]=s,a[e*2+1]=c}for(let e=0;e<2;e++)this.relax()}relax(){let{positions:e,pinned:t,stiffness:n}=this;if(n!==0)for(let[r,i,a]of this.links){let o=e[i*2]-e[r*2],s=e[i*2+1]-e[r*2+1],c=Math.hypot(o,s);if(c===0)continue;let l=(c-a)/c*n,u=t[r]===1,d=t[i]===1;if(u&&d)continue;let f=u?0:d?1:.5,p=d?0:u?1:.5;e[r*2]+=o*l*f,e[r*2+1]+=s*l*f,e[i*2]-=o*l*p,e[i*2+1]-=s*l*p}}},AF=class extends _j{constructor(e,t={}){let n=t.segmentsX??8,r=t.segmentsY??8,i=new kF({width:e.width,height:e.height,segmentsX:n,segmentsY:r,stiffness:t.stiffness,damping:t.damping,gravity:t.gravity,wind:t.wind});super({texture:e,verticesX:n+1,verticesY:r+1}),this.cloth=i,this.intent=t.intent??`decorative`,this.autoResize=!1,this.sync()}get segmentsX(){return this.cloth.segmentsX}get segmentsY(){return this.cloth.segmentsY}get pointCount(){return this.cloth.pointCount}indexOf(e,t){return this.cloth.indexOf(e,t)}pointPosition(e){return this.cloth.pointPosition(e)}isPinned(e){return this.cloth.isPinned(e)}movedCount(){return this.cloth.movedCount()}pinPoint(e){this.cloth.pinPoint(e)}unpinPoint(e){this.cloth.unpinPoint(e)}setWind(e,t){this.cloth.setWind(e,t)}setGravity(e,t){this.cloth.setGravity(e,t)}update(e){br()&&this.intent===`decorative`||(this.cloth.update(e),this.sync())}sync(){let e=this.geometry.getAttribute(`aPosition`);this.cloth.writePositions(e.buffer.data),e.buffer.update()}},jF=class extends Z{constructor(e){super(),this.spring=e.spring,this.color=e.color??16777215,this.opacity=e.alpha??1,this.lineWidth=e.lineWidth??2,this.sync()}sync(){let e=this.spring.anchorPosition,t=this.spring.position;this.clear(),this.moveTo(e.x,e.y).lineTo(t.x,t.y).stroke({color:this.color,width:this.lineWidth,alpha:this.opacity})}},MF=.35,NF=.12;function PF(e,t,n){let r=Math.sin(e*127.1+t*311.7+n*74.7)*43758.5453;return r-Math.floor(r)}function FF(e,t,n){let r=Math.floor(e),i=Math.floor(t),a=e-r,o=t-i,s=a*a*(3-2*a),c=o*o*(3-2*o),l=PF(r,i,n)+(PF(r+1,i,n)-PF(r,i,n))*s;return kn(l+(PF(r,i+1,n)+(PF(r+1,i+1,n)-PF(r,i+1,n))*s-l)*c,0,1)}function IF(e,t,n,r){if(![e,t,n,r].every(Number.isFinite))throw RangeError(`a haze sample needs finite x, y, time and seed, saw (${e}, ${t}, ${n}, ${r})`);let i=e+n*MF,a=t+n*NF;return FF(i/8,a/8,r)*.65+FF(i/3+11,a/3+7,r+1)*.35}function LF(e,t,n,r){if(!(e instanceof Uint8Array||e instanceof Uint8ClampedArray)||e.length!==t*n*4)throw RangeError(`haze needs a pixel buffer of ${t*n*4} bytes`);if(!Number.isFinite(r.time)||!Number.isFinite(r.seed))throw RangeError(`haze needs a finite time and seed, saw (${r.time}, ${r.seed})`);if(!Number.isFinite(r.density)||r.density<0||r.density>1)throw RangeError(`haze needs density between 0 and 1, saw ${r.density}`);let i=r.drift??{x:0,y:0};if(!Number.isFinite(i.x)||!Number.isFinite(i.y))throw RangeError(`haze needs a finite drift, saw (${i.x}, ${i.y})`);for(let a=0;a<n;a++)for(let n=0;n<t;n++){let o=Math.round(255*r.density*IF(n+i.x*r.time,a+i.y*r.time,r.time,r.seed));e.set([255,255,255,o],(a*t+n)*4)}}var RF=class extends wl{constructor(e){if(!Number.isFinite(e.width)||e.width<=0)throw RangeError(`a haze sheet needs width above 0, saw ${e.width}`);if(!Number.isFinite(e.height)||e.height<=0)throw RangeError(`a haze sheet needs height above 0, saw ${e.height}`);let t=e.cellsX??64,n=e.cellsY??36;if(!Number.isInteger(t)||t<1)throw RangeError(`a haze sheet needs integer cellsX of at least 1, saw ${t}`);if(!Number.isInteger(n)||n<1)throw RangeError(`a haze sheet needs integer cellsY of at least 1, saw ${n}`);let r=e.density??.5;if(!Number.isFinite(r)||r<0||r>1)throw RangeError(`a haze sheet needs density between 0 and 1, saw ${r}`);let i=e.drift??{x:.25,y:0};if(!Number.isFinite(i.x)||!Number.isFinite(i.y))throw RangeError(`a haze sheet needs a finite drift, saw (${i.x}, ${i.y})`);if(e.seed!==void 0&&!Number.isFinite(e.seed))throw RangeError(`a haze sheet needs a finite seed, saw ${e.seed}`);let a=document.createElement(`canvas`);a.width=t,a.height=n;let o=a.getContext(`2d`);if(!o)throw Error(`HazeLayer needs a 2D canvas context`);super(q.from(a)),this.time=0,this.context=o,this.image=o.createImageData(t,n),this.cellsX=t,this.cellsY=n,this.density=r,this.drift={...i},this.seed=e.seed??1,this.intent=e.intent??`decorative`,this.tint=e.tint??16777215,this.alpha=e.opacity??1,this.scale.set(e.width/t,e.height/n),this.eventMode=`none`,this.refresh()}get elapsed(){return this.time}setDensity(e){if(!Number.isFinite(e)||e<0||e>1)throw RangeError(`a haze sheet needs density between 0 and 1, saw ${e}`);this.density=e}update(e){if(!Number.isFinite(e)||e<0)throw RangeError(`a haze update needs dt of at least 0, saw ${e}`);(!br()||this.intent!==`decorative`)&&(this.time+=e),this.refresh()}refresh(){LF(this.image.data,this.cellsX,this.cellsY,{time:this.time,density:this.density,seed:this.seed,drift:this.drift}),this.context.putImageData(this.image,0,0),this.texture.source.update()}destroy(){super.destroy({texture:!0,textureSource:!0})}};function zF(e){if(!Number.isInteger(e)||e<0||e>16777215)throw RangeError(`a glow needs an integer color between 0x000000 and 0xffffff, saw ${e}`);return[e>>16&255,e>>8&255,e&255]}function BF(e,t){if(!Number.isFinite(e)||!Number.isFinite(t)||t<=0)throw RangeError(`a glow falloff needs a finite distance and a radius above 0, saw (${e}, ${t})`);if(e<=0)return 1;if(e>=t)return 0;let n=1-e/t*(e/t);return n*n}function VF(e,t,n){if(!Number.isInteger(t)||t<1)throw RangeError(`a glow needs an integer size of at least 1, saw ${t}`);if(!(e instanceof Uint8Array||e instanceof Uint8ClampedArray)||e.length!==t*t*4)throw RangeError(`a glow needs a pixel buffer of ${t*t*4} bytes`);if(!Number.isFinite(n.radius)||n.radius<=0)throw RangeError(`a glow needs a radius above 0, saw ${n.radius}`);if(!Number.isFinite(n.intensity)||n.intensity<0||n.intensity>1)throw RangeError(`a glow needs intensity between 0 and 1, saw ${n.intensity}`);let[r,i,a]=zF(n.color),o=(t-1)/2;for(let s=0;s<t;s++)for(let c=0;c<t;c++){let l=BF(Math.hypot(c-o,s-o),n.radius)*n.intensity;e.set([Math.round(r*l),Math.round(i*l),Math.round(a*l),Math.round(255*l)],(s*t+c)*4)}}var HF=class e extends wl{constructor(t){if(!Number.isFinite(t.radius)||t.radius<=0)throw RangeError(`a glow needs a radius above 0, saw ${t.radius}`);let n=t.intensity??1;if(!Number.isFinite(n)||n<0||n>1)throw RangeError(`a glow needs intensity between 0 and 1, saw ${n}`);let r=t.flicker??{amount:0,frequency:1};if(!Number.isFinite(r.amount)||r.amount<0||r.amount>1)throw RangeError(`a glow needs a flicker amount between 0 and 1, saw ${r.amount}`);if(!Number.isFinite(r.frequency)||r.frequency<=0)throw RangeError(`a glow needs a flicker frequency above 0, saw ${r.frequency}`);let i=e.paintCanvas(t.color,t.radius);super(q.from(i)),this.clock=0,this.canvas=i,this.color=t.color,this.radius=t.radius,this.peak=n,this.flickerAmount=r.amount,this.flickerFrequency=r.frequency,this.intent=t.intent??`decorative`,this.blendMode=`add`,this.anchor.set(.5),this.eventMode=`none`,this.alpha=this.peak}get elapsed(){return this.clock}setColor(e){zF(e),this.color=e,this.repaint()}setRadius(e){if(!Number.isFinite(e)||e<=0)throw RangeError(`a glow needs a radius above 0, saw ${e}`);this.radius=e,this.repaint()}setIntensity(e){if(!Number.isFinite(e)||e<0||e>1)throw RangeError(`a glow needs intensity between 0 and 1, saw ${e}`);this.peak=e}update(e){if(!Number.isFinite(e)||e<0)throw RangeError(`a glow update needs dt of at least 0, saw ${e}`);(!br()||this.intent!==`decorative`)&&(this.clock+=e);let t=1+this.flickerAmount*Math.sin(2*Math.PI*this.flickerFrequency*this.clock);this.alpha=kn(this.peak*t,0,1)}static paintCanvas(e,t){let n=Math.ceil(t)*2+1,r=document.createElement(`canvas`);r.width=n,r.height=n;let i=r.getContext(`2d`);if(!i)throw Error(`NeonGlow needs a 2D canvas context`);let a=i.createImageData(n,n);return VF(a.data,n,{color:e,radius:t,intensity:1}),i.putImageData(a,0,0),r}repaint(){let t=this.texture;this.canvas=e.paintCanvas(this.color,this.radius),this.texture=q.from(this.canvas),t.destroy(!0)}destroy(){super.destroy({texture:!0,textureSource:!0})}},UF=KF(),WF=new Map(UF.map((e,t)=>[GF(e),t]));function GF(e){let t=e.ne&&e.n&&e.e,n=e.se&&e.s&&e.e,r=e.sw&&e.s&&e.w,i=e.nw&&e.n&&e.w;return+!!e.n|(e.e?2:0)|(e.s?4:0)|(e.w?8:0)|(t?16:0)|(n?32:0)|(r?64:0)|(i?128:0)}function KF(){let e=new Set,t=[];for(let n=0;n<256;n++){let r={n:!!(n&1),e:!!(n&2),s:!!(n&4),w:!!(n&8),ne:!!(n&16),se:!!(n&32),sw:!!(n&64),nw:!!(n&128)},i=GF(r);e.has(i)||(e.add(i),t.push({mask:i,shape:{n:r.n,e:r.e,s:r.s,w:r.w,ne:r.ne&&r.n&&r.e,se:r.se&&r.s&&r.e,sw:r.sw&&r.s&&r.w,nw:r.nw&&r.n&&r.w}}))}return t.sort((e,t)=>e.mask-t.mask),t.map(e=>e.shape)}function qF(e){return WF.get(GF(e))}function JF(e,t,n,r){if(r.length!==UF.length)throw Error(`autotileFrames needs exactly ${UF.length} frames, got ${r.length}`);let i=new Int32Array(e*t);for(let a=0;a<t;a++)for(let t=0;t<e;t++){let o=a*e+t;i[o]=n(t,a)?r[qF({n:n(t,a-1),e:n(t+1,a),s:n(t,a+1),w:n(t-1,a),ne:n(t+1,a-1),se:n(t+1,a+1),sw:n(t-1,a+1),nw:n(t-1,a-1)})]:-1}return i}_e();function YF(e,t,n,r){let i=n*4/r,a=e,o=t;for(let e=0;e<i;e+=1)[a,o]=[-o,a];return{dx:a||0,dy:o||0}}function XF(e,t,n,r){let i=n*6/r,a=e,o=t;for(let e=0;e<i;e+=1){let e=-a-o;[a,o]=[-o,-e]}return{dx:a||0,dy:o||0}}function ZF(e,t){let n=t??new Set;return!(e.hasAll&&!e.hasAll.every(e=>n.has(e))||e.hasAny&&!e.hasAny.some(e=>n.has(e))||e.hasNone&&e.hasNone.some(e=>n.has(e)))}function QF(e,t,n,r,i=YF,a=0){let o=e.rotations??0;return e.conditions.every(e=>{let s=o>0?i(e.dx,e.dy,a,o):e;return ZF(e,r(t+s.dx,n+s.dy))})}function $F(e,t,n,r,i={}){let a=i.rotate??YF,o=i.random??new j,s=[];for(let i=0;i<t;i+=1)for(let t=0;t<e;t+=1){let e=-1,c=[];for(let o of n){let n=o.rotations??0,s=n>0?n:1;for(let n=0;n<s;n+=1){if(!QF(o,t,i,r,a,n))continue;let s=o.conditions.length;s>e?(e=s,c=[{rule:o,rotationIndex:n}]):s===e&&c.push({rule:o,rotationIndex:n})}}if(c.length===0)continue;let l=c.length===1?c[0]:c[eI(c.map(e=>e.rule.probability??1),o)],u=l.rule.rotations??0;for(let e of l.rule.images){let n=u>0?a(e.dx??0,e.dy??0,l.rotationIndex,u):{dx:e.dx??0,dy:e.dy??0};s.push({x:t,y:i,ruleId:l.rule.id,image:e.image,dx:n.dx,dy:n.dy,layer:e.layer??0})}}return s}function eI(e,t){let n=e.reduce((e,t)=>e+Math.max(0,t),0);if(n<=0)return 0;let r=t.float()*n;for(let t=0;t<e.length;t+=1)if(r-=Math.max(0,e[t]),r<0)return t;return e.length-1}var tI=class extends J{};function nI(e,t){let n={};for(let r of t){let t=new tI;t.label=r,e.addChild(t),n[r]=t}return n}var rI=class extends Z{dashedLine(e,t,n,r,i=6,a=4){let o=Math.hypot(n-e,r-t);if(o===0||i<=0)return this;let s=(n-e)/o,c=(r-t)/o;for(let n=0;n<o;n+=i+Math.max(0,a)){let r=Math.min(n+i,o);this.moveTo(e+s*n,t+c*n).lineTo(e+s*r,t+c*r)}return this}},iI=class extends jA{},aI=class extends wl{},oI=class extends dA{},sI=wC,cI=class extends tI{constructor(e){super(),this.placements=e.placements,this.project=e.project,this.resolveImage=e.resolveImage??(e=>VN(e,q.EMPTY)),this.rebuild()}setPlacements(e){this.placements=e,this.rebuild()}rebuild(){for(let e of this.removeChildren())e.destroy();for(let e of[...this.placements].sort((e,t)=>e.layer-t.layer)){let t=this.project(e.x,e.y,e.dx,e.dy),n=new aI(this.resolveImage(e.image));n.x=t.x,n.y=t.y,this.addChild(n)}}},lI=[{workload:`sprites`,preferred:`PixiJS WebGL/WebGPU batcher`,fallback:`PixiJS WebGL`,reason:`high-volume textured 2D batches`},{workload:`ui`,preferred:`PixiJS display tree`,fallback:`PixiJS display tree`,reason:`themeable 2D layout and text`},{workload:`custom-shaders`,preferred:`backend-specific GLSL/WGSL only when profiled`,fallback:`PixiJS filters`,reason:`avoid maintaining paired shader sources without a measured gain`},{workload:`particles`,preferred:`PixiJS for 2D, Babylon.js for 3D`,fallback:`instanced sprites/meshes`,reason:`match simulation and depth to the scene`},{workload:`instanced-terrain`,preferred:`Babylon.js thin instances`,fallback:`PixiJS TileMap for 2D`,reason:`depth-tested repeated 3D geometry`},{workload:`voxels`,preferred:`Babylon.js thin instances`,fallback:`batched meshes`,reason:`color-grouped 3D voxels`},{workload:`animated-models`,preferred:`Babylon.js glTF animation groups`,fallback:`billboard sprites`,reason:`standard 3D interchange and animation support`},{workload:`large-3d-worlds`,preferred:`Babylon.js with streaming/culling`,fallback:`partitioned scenes`,reason:`scene graph, depth, and instancing`}];function uI(e={}){let t=e.createCanvas?.()??(typeof document>`u`?null:document.createElement(`canvas`)),n=!!t?.getContext(`webgl2`);return{webgl1:n||!!(t?.getContext(`webgl`)??t?.getContext(`experimental-webgl`)),webgl2:n,webgpu:e.webgpu??!!globalThis.navigator?.gpu,wgsl:e.wgsl??!1}}async function dI(){let e=globalThis.navigator?.gpu;if(!e)return{webgpu:!1,wgsl:!1};try{let t=await(await e.requestAdapter())?.requestDevice();return t?{webgpu:!0,wgsl:(await t.createShaderModule({code:`@compute @workgroup_size(1) fn main() {}`}).getCompilationInfo()).messages.length===0}:{webgpu:!1,wgsl:!1}}catch{return{webgpu:!1,wgsl:!1}}}var fI=536870911,pI={orthogonal:`square`,isometric:`isometric`,staggered:`staggered`};function mI(e,t,n){if(e.frameWidth!==t.tilewidth||e.frameHeight!==t.tileheight)throw Error(`the tileset at firstgid ${n} is cut to ${e.frameWidth}x${e.frameHeight}, but the map is ${t.tilewidth}x${t.tileheight}`)}function hI(e,t,n){let r=-1;for(let n=0;n<t.length&&t[n]<=e;n++)r=n;if(r===-1)throw Error(`layer "${n}" uses gid ${e}, below every tileset's firstgid (${t.join(`, `)})`);return r}function gI(e,t){let n=e.orientation??`orthogonal`,r=pI[n];if(!r)throw Error(`loadTiledMap does not read "${n}" maps yet`);if(r===`staggered`&&(e.staggeraxis??`y`)!==`y`)throw Error(`loadTiledMap only reads Y-axis staggered maps right now, this one is staggered on "${e.staggeraxis}"`);if(r===`staggered`&&(e.staggerindex??`odd`)!==`odd`)throw Error(`loadTiledMap only reads odd-index staggered maps right now, this one staggers "${e.staggerindex}"`);if(e.tilesets.length===0)throw Error(`loadTiledMap needs at least one tileset, this map has none`);let i=[...e.tilesets].sort((e,t)=>e.firstgid-t.firstgid),a,o;if(t instanceof lP){if(e.tilesets.length!==1)throw Error(`loadTiledMap was given one sheet but this map has ${e.tilesets.length} tilesets - pass one sheet per tileset`);mI(t,e,i[0].firstgid),a=[t],o=[i[0].firstgid]}else{if(t.length!==e.tilesets.length)throw Error(`loadTiledMap was given ${t.length} sheets but this map has ${e.tilesets.length} tilesets - pass one sheet per tileset`);a=i.map(n=>{let r=t.find(e=>e.firstgid===n.firstgid);if(!r)throw Error(`loadTiledMap was given no sheet for the tileset at firstgid ${n.firstgid}`);return mI(r.sheet,e,n.firstgid),r.sheet}),o=i.map(e=>e.firstgid)}let s=new iF({width:e.width,height:e.height,sheet:a,shape:r}),c=[];for(let t of e.layers)if(t.type===`tilelayer`){if(t.encoding&&t.encoding!==`csv`)throw Error(`layer "${t.name}" uses "${t.encoding}" encoding - export tile layers as CSV/plain, not compressed`);let e=(t.data??[]).map(e=>{let n=e&fI;if(n===0)return-1;let r=hI(n,o,t.name);return o.length===1?n-o[0]:tF(r,n-o[r])});s.addLayer(t.name,e)}else if(t.type===`objectgroup`)for(let n of t.objects??[])c.push({...n,tileX:Math.floor(n.x/e.tilewidth),tileY:Math.floor(n.y/e.tileheight)});return{map:s,objects:c}}async function _I(e,t){if(t.mixer&&t.mixer.skeleton!==t.skeleton)throw Error(`SVG skeleton mixer must use the supplied skeleton`);let n=await rP(e),r=new DOMParser().parseFromString(n,`image/svg+xml`),i=r.documentElement;if(r.querySelector(`parsererror`)||i.localName!==`svg`)throw Error(`SVG skeleton needs a valid svg root`);let a=i.getAttribute(`viewBox`)?.trim().split(/[\s,]+/).map(Number)??[0,0,Number(i.getAttribute(`width`)),Number(i.getAttribute(`height`))];if(a.length!==4||!a.every(Number.isFinite)||a[2]<=0||a[3]<=0)throw Error(`SVG skeleton needs a finite viewBox or positive numeric width and height`);let o=new Map;for(let e of i.querySelectorAll(`g[id]`)){if(o.has(e.id))throw Error(`duplicate SVG skeleton group ${e.id}`);o.set(e.id,e)}let s=new Map(hN(t.skeleton).map(e=>[e.name,e])),c=t.bindings??[...o.keys()].filter(e=>s.has(e)).map(e=>({bone:e}));if(!c.length)throw Error(`SVG skeleton found no matching bone groups`);let l=new Set(c.map(e=>e.group??e.bone)),u=new Set,d=[],f=new XMLSerializer;for(let e of c){let n=e.group??e.bone;if(u.has(e.bone))throw Error(`duplicate SVG binding for bone ${e.bone}`);u.add(e.bone);let c=s.get(e.bone);if(!c)throw Error(`SVG binding names no bone ${e.bone}`);let p=o.get(n);if(!p)throw Error(`SVG skeleton missing group ${n}`);let m=e.pivot??t.pivots?.[n]??{x:p.hasAttribute(`data-pivot-x`)?Number(p.getAttribute(`data-pivot-x`)):NaN,y:p.hasAttribute(`data-pivot-y`)?Number(p.getAttribute(`data-pivot-y`)):NaN},h=e.rotation??c.angle;if(![m.x,m.y,h].every(Number.isFinite))throw Error(`SVG skeleton group ${n} needs a finite pivot and rest angle`);let g=Math.max(Math.abs(a[0]-m.x),Math.abs(a[0]+a[2]-m.x)),_=Math.max(Math.abs(a[1]-m.y),Math.abs(a[1]+a[3]-m.y)),v=Math.ceil(Math.hypot(g,_))+1,y=i.cloneNode(!1);y.setAttribute(`viewBox`,`${-v} ${-v} ${v*2} ${v*2}`),y.setAttribute(`width`,String(v*2)),y.setAttribute(`height`,String(v*2));for(let e of i.querySelectorAll(`defs, style`))y.appendChild(e.cloneNode(!0));let b=p.cloneNode(!0);for(let e of b.querySelectorAll(`g[id]`))l.has(e.id)&&e.remove();let x=b;for(let e=p.parentElement;e&&e!==i;e=e.parentElement){let t=e.cloneNode(!1);t.appendChild(x),x=t}let S=r.createElementNS(i.namespaceURI,`g`);S.setAttribute(`id`,`mwg-part`),S.setAttribute(`transform`,`rotate(${-h}) translate(${-m.x} ${-m.y})`),S.appendChild(x),y.appendChild(S),d.push({bone:e.bone,svg:f.serializeToString(y)})}let p=Object.create(null);for(let e of d)p[e.bone]=(await aP(e.svg,{resolution:t.resolution}))[`mwg-part`];let m=new DN(t.skeleton,t.mixer);for(let e of d){let t=m.bind(e.bone,p[e.bone]);t.anchor.set(.5),t.label=e.bone}return m.apply({}),{sprite:m,textures:Object.freeze(p)}}var vI={panelBorder:4,padding:8,spacing:2,direction:`ltr`,font:{family:`ui-monospace, Consolas, "DejaVu Sans Mono", monospace`,size:12,lineHeight:1.4},color:{text:15263984,textDim:9079446,textHighlight:16770688,panelFill:1842214,panelBorder:4868702,selection:3820154,overlay:0},overlayAlpha:.5},yI={panelBorder:6,padding:10,spacing:4,direction:`ltr`,font:{family:vI.font.family,size:14,lineHeight:1.5},color:{text:16777215,textDim:13421772,textHighlight:16776960,panelFill:0,panelBorder:16777215,selection:16776960,overlay:0},overlayAlpha:.85},bI=vI;function Q(){return bI}var $=new p;function xI(e){bI={...vI,...e,font:{...vI.font,...e.font},color:{...vI.color,...e.color}},$.dispatch(bI)}function SI(e){return typeof e==`string`?{text:e}:e}function CI(e,t){return e.align??(t.direction===`rtl`?`right`:`left`)}function wI(e,t=40){let n=Math.max(0,e);return{total:n,speed:Math.max(0,t),revealed:t===0?n:0}}function TI(e,t){return e.revealed=Math.min(e.total,Math.max(0,e.revealed+e.speed*t)),DI(e)}function EI(e){e.revealed=e.total}function DI(e){return e.revealed>=e.total}var OI=class extends jA{constructor(e={}){let t=SI(e),n=Q();super({text:t.text??``,resolution:t.resolution,roundPixels:t.roundPixels,style:new aO({fontFamily:n.font.family,stroke:t.stroke,fontSize:t.size??n.font.size,fontWeight:t.bold?`bold`:`normal`,fill:t.color??n.color.text,lineHeight:(t.size??n.font.size)*n.font.lineHeight,align:CI(t,n),wordWrap:t.wrapWidth!==void 0,wordWrapWidth:t.wrapWidth??0,breakWords:!0})}),this.themeListener=e=>this.restyle(e),this.revealSource=null,this.reveal=null,this.opts=t,$.add(this.themeListener)}setColor(e){this.destroyed||(this.style.fill=e)}setWrapWidth(e){this.destroyed||(this.style.wordWrap=e!==void 0,this.style.wordWrapWidth=e??0)}setText(e){this.destroyed||(this.revealSource=null,this.reveal=null,this.text!==e&&(this.text=e))}showProgressive(e,t){this.destroyed||(this.revealSource=e,this.reveal=wI(e.length,t),this.renderRevealed())}updateReveal(e){if(this.destroyed||!this.reveal)return!0;let t=TI(this.reveal,e);return this.renderRevealed(),t}completeReveal(){!this.destroyed&&this.reveal&&(EI(this.reveal),this.renderRevealed())}renderRevealed(){if(!this.reveal||this.revealSource===null)return;let e=this.revealSource.slice(0,Math.floor(this.reveal.revealed));this.text!==e&&(this.text=e)}restyle(e){this.destroyed||(this.style.fontFamily=e.font.family,this.opts.color===void 0&&(this.style.fill=e.color.text),this.opts.size===void 0&&(this.style.fontSize=e.font.size,this.style.lineHeight=e.font.size*e.font.lineHeight),this.opts.align===void 0&&(this.style.align=CI(this.opts,e)))}destroy(e){$.remove(this.themeListener),super.destroy(e)}},kI={positive:5627255,negative:16733525,warning:16757575};function AI(e,t){return t>0?e.slice(Math.max(0,e.length-Math.floor(t))):[]}function jI(e,t){let n=0;for(let t of e)n+=t;let r=0;for(;n>t&&r<e.length-1;)n-=e[r++];return r}var MI=class extends J{constructor(e){super(),this.blocks=[],this.options=e,this.maxLines=e.maxLines??3}get entryCount(){return this.blocks.length}get contentHeight(){return this.blocks.reduce((e,t)=>e+t.label.height,0)}lastEntries(e){return AI(this.blocks.map(e=>({text:e.text,level:e.level})),e)}add(e,t=`info`){let n=new OI({text:e,size:this.options.size,color:this.colorOf(t),wrapWidth:this.options.wrapWidth,resolution:this.options.resolution});this.addChild(n),this.blocks.push({label:n,level:t,text:e}),this.trim(),this.layout()}setMaxLines(e){this.maxLines=Math.max(1,Math.floor(e)),this.trim(),this.layout()}setWrapWidth(e){this.options.wrapWidth=e;for(let t of this.blocks)t.label.style.wordWrapWidth=e;this.trim(),this.layout()}clear(){for(let e of this.blocks.splice(0))e.label.destroy()}colorOf(e){let t=this.options.colors?.[e];return t===void 0?e===`info`?Q().color.text:e===`highlight`?Q().color.textHighlight:kI[e]:t}linesOf(e){let t=Number(e.style.lineHeight)||Number(e.style.fontSize)||1;return Math.max(1,Math.round(e.height/t))}trim(){let e=jI(this.blocks.map(e=>this.linesOf(e.label)),this.maxLines);for(let t of this.blocks.splice(0,e))t.label.destroy()}layout(){let e=0;for(let t of this.blocks)t.label.position.set(0,e),e+=t.label.height}};function NI(e,t,n){let r=Math.max(1,Math.floor(e));for(;r>1&&t*r>n;)r--;return r}function PI(e){let t=1;for(let n=e;n;n=n.parent)t*=Math.abs(n.scale.x);return t}function FI(e,t){let n=(e,r)=>{if(e instanceof jA){let n=t*Math.max(1,Math.round(r));e.resolution!==n&&(e.resolution=n)}for(let t of e.children)n(t,r*Math.abs(t.scale.x))};n(e,PI(e))}var II=``,LI=``,RI=``;function zI(e){let t=``;for(let n=0;n<e.length;n++)if(e[n]===`\\`&&n+1<e.length&&(e[n+1]===`*`||e[n+1]===`_`||e[n+1]===`\\`)){let r=e[n+1];t+=r===`*`?II:r===`_`?LI:RI,n++}else t+=e[n];return t}function BI(e){return e.replaceAll(II,`*`).replaceAll(LI,`_`).replaceAll(RI,`\\`)}function VI(e){return e!==void 0&&/[\p{L}\p{N}_]/u.test(e)}function HI(e,t,n){let r=[],i=0;for(;i<e.length;){if(e[i]!==t){i++;continue}let a=0;for(;e[i+a]===t;)a++;if(!(t===`_`&&VI(e[i-1])&&VI(e[i+a]))){if(n)for(let e=0;e<Math.floor(a/2);e++)r.push(i+e*2);else a%2==1&&r.push(i+a-1)}i+=a}return r}function UI(e,t,n,r,i,a){let o=HI(e,t,n),s=n?2:1;for(let e=0;e+1<o.length;e+=2){let t=o[e],n=o[e+1];i.push({from:t+s,to:n,style:r}),a.push({from:t,to:t+s},{from:n,to:n+s})}}function WI(e){let t=[];for(let n of e){if(!n.text)continue;let e=t[t.length-1];e&&e.bold===n.bold&&e.italic===n.italic?e.text+=n.text:t.push({...n})}return t}function GI(e){let t=zI(e),n=[],r=[];UI(t,`*`,!0,`bold`,n,r),UI(t,`_`,!0,`bold`,n,r),UI(t,`*`,!1,`italic`,n,r),UI(t,`_`,!1,`italic`,n,r);let i=new Set([0,t.length]);for(let e of n)i.add(e.from),i.add(e.to);for(let e of r)i.add(e.from),i.add(e.to);let a=[...i].sort((e,t)=>e-t),o=[];for(let e=0;e+1<a.length;e++){let i=a[e],s=a[e+1];i>=s||r.some(e=>e.from<=i&&s<=e.to)||o.push({text:t.slice(i,s),bold:n.some(e=>e.style===`bold`&&e.from<=i&&s<=e.to),italic:n.some(e=>e.style===`italic`&&e.from<=i&&s<=e.to)})}return WI(o).map(e=>({...e,text:BI(e.text)}))}function KI(e){return GI(e).map(e=>e.text).join(``)}function qI(e,t){let n=[],r=Math.max(0,Math.floor(t));for(let t of e){if(r<=0)break;let e=Math.min(t.text.length,r);n.push({...t,text:t.text.slice(0,e)}),r-=e}return n}var JI=class extends mj{constructor(e={}){let t=SI(e),n=Q(),r=t.tagStyles===void 0?[]:Object.keys(t.tagStyles);super({text:YI(t.text??``,r),resolution:t.resolution,style:new ZA({fontFamily:n.font.family,fontSize:t.size??n.font.size,fontWeight:t.bold?`bold`:`normal`,fill:t.color??n.color.text,lineHeight:(t.size??n.font.size)*n.font.lineHeight,align:CI(t,n),wordWrap:t.wrapWidth!==void 0,wordWrapWidth:t.wrapWidth??0,breakWords:!0,tagStyles:t.tagStyles})}),this.themeListener=e=>this.restyle(e),this.revealSpans=null,this.reveal=null,this.opts=t,this.tags=r,$.add(this.themeListener)}setText(e){this.revealSpans=null,this.reveal=null;let t=YI(e,this.tags);this.text!==t&&(this.text=t)}showProgressive(e,t){this.revealSpans=GI(e),this.reveal=wI(KI(e).length,t),this.renderRevealed()}updateReveal(e){if(!this.reveal)return!0;let t=TI(this.reveal,e);return this.renderRevealed(),t}completeReveal(){this.reveal&&(EI(this.reveal),this.renderRevealed())}renderRevealed(){if(!this.reveal||!this.revealSpans)return;let e=XI(qI(this.revealSpans,this.reveal.revealed),this.tags);this.text!==e&&(this.text=e)}restyle(e){this.style.fontFamily=e.font.family,this.opts.color===void 0&&(this.style.fill=e.color.text),this.opts.size===void 0&&(this.style.fontSize=e.font.size,this.style.lineHeight=e.font.size*e.font.lineHeight),this.opts.align===void 0&&(this.style.align=CI(this.opts,e))}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function YI(e,t){return XI(GI(e),t)}function XI(e,t){return e.map(e=>{let n=ZI(e.text,t);return e.italic&&(n=`<i>${n}</i>`),e.bold&&(n=`<b>${n}</b>`),n}).join(``)}function ZI(e,t){let n=e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`);for(let e of t)n=n.replaceAll(`<${e}>`,`<${e}>`).replaceAll(`</${e}>`,`</${e}>`);return n}var QI=new Set([`b`,`i`,`span`,`br`,`img`]);function $I(e,t={}){let n=t.variables??{},r=t.tags,i=[],a=[],o={bold:!1,italic:!1},s=``,c=()=>{if(!s)return;let e={text:s,bold:o.bold,italic:o.italic};o.color!==void 0&&(e.color=o.color),o.size!==void 0&&(e.size=o.size),o.tag!==void 0&&(e.tag=o.tag),i.push(e),s=``};for(let t=0;t<e.length;t++){let l=e[t];if(l===`&`){let n=dL(e,t);if(n){s+=n.text,t=n.end;continue}}if(l===`$`){let r=fL(e,t),i=r?n[r.name]:void 0;if(r&&i!==void 0){s+=i,t=r.end;continue}}if(l===`<`){let n=lL(e,t);if(n&&(QI.has(n.name)||r?.has(n.name))){if(n.name===`img`){let r=uL(e,n);if(r){c(),i.push({text:``,bold:!1,italic:!1,image:r.src}),t=r.end;continue}}else if(n.name===`br`){s+=`
|
|
1370
|
+
`,t=n.end;continue}else if(n.closing){let e=a[a.length-1];if(e?.tag===n.name){c(),o=e.style,a.pop(),t=n.end;continue}}else{c(),a.push({tag:n.name,style:o}),o=sL(o,n.name,n.body),t=n.end;continue}}}s+=l}return c(),i}function eL(e,t={}){return $I(e,t).map(e=>e.image??e.text).join(``)}function tL(e){return e.map(e=>{if(e.image!==void 0)return``;let t=oL(e.text);e.italic&&(t=`<i>${t}</i>`),e.bold&&(t=`<b>${t}</b>`);let n=[e.color===void 0?void 0:`color:${e.color}`,e.size===void 0?void 0:`font-size:${e.size}px`].filter(e=>e!==void 0);return n.length>0&&(t=`<span style="${n.join(`;`)}">${t}</span>`),e.tag!==void 0&&(t=`<${e.tag}>${t}</${e.tag}>`),t}).join(``)}function nL(e,t={}){let n=t.describeImage??(()=>`[image]`);return e.map(e=>e.image===void 0?e.text:n(e.image)).join(``)}function rL(e,t,n){let r=[];for(let t of e)t.image===void 0?t.text.split(`
|
|
1371
|
+
`).forEach((e,n)=>{n>0&&r.push({text:``,bold:t.bold,italic:t.italic,hardBreak:!0});for(let n of e.match(/\S+|\s+/g)??[])r.push({text:n,bold:t.bold,italic:t.italic,color:t.color,size:t.size,tag:t.tag})}):r.push({...t});let i=[],a=[],o=0,s=()=>{for(;a.length>0&&a[a.length-1].text.trim()===``&&!a[a.length-1].image;)o-=t(a[a.length-1]),a.pop();i.push({spans:iL(a),width:Math.max(0,o)}),a=[],o=0};for(let e of r){if(e.hardBreak){s();continue}let r=t(e),i=e.image===void 0&&e.text.trim()===``;o>0&&!i&&o+r>n&&s(),a.push(e),o+=r}return(a.length>0||i.length===0)&&s(),i}function iL(e){let t=[];for(let n of e){let e=t[t.length-1];e&&n.image===void 0&&e.image===void 0&&e.bold===n.bold&&e.italic===n.italic&&e.color===n.color&&e.size===n.size&&e.tag===n.tag?e.text+=n.text:t.push({...n})}return t}function aL(e,t){let n=t.direction??`ltr`,r=t.align??(n===`rtl`?`right`:`left`),i=[];for(let a=0;a<e.length;a++){let o=e[a],s=a*t.lineHeight,c=o.spans.map(e=>t.measure(e)),l=c.reduce((e,t)=>e+t,0),u=r===`left`?0:r===`right`?t.maxWidth-l:(t.maxWidth-l)/2,d=n===`rtl`?u+l:u;for(let e=0;e<o.spans.length;e++){let t=c[e],r=n===`rtl`?d-t:d;d=n===`rtl`?d-t:d+t,i.push({span:o.spans[e],x:r,y:s,width:t})}}return i}function oL(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}function sL(e,t,n){if(t===`b`)return{...e,bold:!0};if(t===`i`)return{...e,italic:!0};if(t!==`span`)return{...e,tag:t};let r=cL(n,`color`),i=Number(cL(n,`size`)??``),a={...e};return r&&(a.color=r),Number.isFinite(i)&&i>0&&(a.size=i),a}function cL(e,t){let n=RegExp(`(?:^|\\s)${t}\\s*=\\s*(?:"([^"]*)"|'([^']*)'|([^\\s"'>]+))`).exec(e);return n?n[1]??n[2]??n[3]:void 0}function lL(e,t){let n=/^<(\/?)([a-zA-Z]+)([^>]*)>/.exec(e.slice(t));if(!n)return null;let r=n[3].trimEnd();return{name:n[2].toLowerCase(),closing:n[1]===`/`,selfClosing:r.endsWith(`/`)&&n[1]===``,body:r.replace(/\/$/,``).trim(),end:t+n[0].length-1}}function uL(e,t){if(t.selfClosing){let e=cL(t.body,`src`);return e?{src:e,end:t.end}:null}let n=e.indexOf(`</img>`,t.end+1);if(n<0)return null;let r=e.slice(t.end+1,n).trim();return r?{src:r,end:n+6-1}:null}function dL(e,t){let n={lt:`<`,gt:`>`,amp:`&`,quot:`"`,apos:`'`},r=/^&(lt|gt|amp|quot|apos);/.exec(e.slice(t));if(r)return{text:n[r[1]],end:t+r[0].length-1};let i=/^&#(\d+);/.exec(e.slice(t));return i?{text:String.fromCodePoint(Number(i[1])),end:t+i[0].length-1}:null}function fL(e,t){let n=/^\$([A-Za-z_][A-Za-z0-9_]*)/.exec(e.slice(t));return n?{name:n[1],end:t+n[0].length-1}:null}var pL=class extends J{constructor(e={}){super(),this.themeListener=e=>this.rebuild(e),this.opts=e,this.rebuild(Q()),$.add(this.themeListener)}setText(e){this.opts.text=e,this.rebuild(Q())}rebuild(e){for(let e of this.removeChildren())e.destroy();let t=this.opts.lineHeight??e.font.size*e.font.lineHeight,n=this.opts.maxWidth??1/0,r=this.opts.maxWidth??0,i=this.opts.direction??e.direction,a=this.opts.resolveImage??(e=>VN(e,q.EMPTY)),o=hL(),s=n=>this.measurePiece(n,e,t,a,o),c=this.opts.tagStyles,l=aL(rL($I(this.opts.text??``,{variables:this.opts.variables,tags:c===void 0?void 0:new Set(Object.keys(c))}),s,n),{measure:s,maxWidth:r,lineHeight:t,direction:i,align:this.opts.align??(this.opts.maxWidth===void 0?`left`:void 0)});for(let n of l){let r=n.span.image===void 0?this.textFor(n.span,e,t):this.spriteFor(n.span.image,t,a);r.x=n.x,r.y=n.y,this.addChild(r)}}measurePiece(e,t,n,r,i){if(e.image!==void 0)return vL(r(e.image),n).width;let a=this.resolvedFont(e,t);return i?(i.font=`${a.italic?`italic `:``}${a.bold?`bold `:``}${a.size}px ${a.family}`,i.measureText(e.text).width):e.text.length*a.size}tagStyle(e){return e===void 0||this.opts.tagStyles===void 0?void 0:this.opts.tagStyles[e]}resolvedFont(e,t){let n=this.tagStyle(e.tag);return{family:typeof n?.fontFamily==`string`?n.fontFamily:t.font.family,size:typeof n?.fontSize==`number`?n.fontSize:e.size??t.font.size,bold:n?.fontWeight===void 0?e.bold:gL(n.fontWeight),italic:n?.fontStyle===void 0?e.italic:_L(n.fontStyle)}}textFor(e,t,n){let r=this.resolvedFont(e,t),i=this.tagStyle(e.tag);return new iI({text:e.text,resolution:this.opts.resolution,style:{fontFamily:r.family,fontSize:r.size,fontWeight:r.bold?`bold`:`normal`,fontStyle:r.italic?`italic`:`normal`,fill:e.color??t.color.text,lineHeight:n,...i}})}spriteFor(e,t,n){let r=n(e),i=vL(r,t),a=new aI(r);return a.width=i.width,a.height=i.height,a}destroy(e){$.remove(this.themeListener),super.destroy(e)}},mL=null;function hL(){return typeof document>`u`?null:(mL??=document.createElement(`canvas`).getContext(`2d`),mL)}function gL(e){if(e===`bold`||e===`bolder`)return!0;if(e===`normal`||e===`lighter`)return!1;let t=Number(e);return Number.isFinite(t)&&t>=600}function _L(e){return e===`italic`||e===`oblique`}function vL(e,t){return{width:(e.width>0?e.width:t)*(t/(e.height>0?e.height:t)),height:t}}var yL=class extends WA{constructor(e={}){let t=SI(e),n=Q();super({text:t.text??``,style:bL(t,n)}),this.themeListener=e=>this.restyle(e),this.opts=t,$.add(this.themeListener)}setText(e){this.text!==e&&(this.text=e)}restyle(e){this.style=bL(this.opts,e)}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function bL(e,t){return{fontFamily:t.font.family,fontSize:e.size??t.font.size,fontWeight:e.bold?`bold`:`normal`,fill:e.color??t.color.text,align:CI(e,t),wordWrap:e.wrapWidth!==void 0,wordWrapWidth:e.wrapWidth??0,breakWords:!0}}var xL=class extends J{constructor(e,t){super();let n=typeof t.border==`number`?{left:t.border,top:t.border,right:t.border,bottom:t.border}:t.border;this.sprite=new kj({texture:e,leftWidth:n.left,topHeight:n.top,rightWidth:n.right,bottomHeight:n.bottom}),this.addChild(this.sprite)}get border(){return{left:this.sprite.leftWidth,top:this.sprite.topHeight,right:this.sprite.rightWidth,bottom:this.sprite.bottomHeight}}resize(e,t){let n=this.border;this.sprite.width=Math.max(e,n.left+n.right),this.sprite.height=Math.max(t,n.top+n.bottom)}},SL=`position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;`,CL=class{constructor(){this.polite=null,this.assertive=null}region(e){if(typeof document>`u`||!document.body)return null;let t=e?this.assertive:this.polite;if(t)return t;let n=document.createElement(`div`);return n.setAttribute(`aria-live`,e?`assertive`:`polite`),n.setAttribute(`aria-atomic`,`true`),n.setAttribute(`role`,`status`),n.setAttribute(`style`,SL),document.body.appendChild(n),e?this.assertive=n:this.polite=n,n}announce(e,t={}){let n=this.region(t.assertive??!1);n&&(n.textContent=``,n.appendChild(document.createTextNode(e)))}clear(){this.polite&&(this.polite.textContent=``),this.assertive&&(this.assertive.textContent=``)}destroy(){this.polite?.remove(),this.assertive?.remove(),this.polite=null,this.assertive=null}},wL=new CL,TL=class extends J{constructor(e){super(),this.content=new J,this.onClose=new p,this.titleLabel=null,this.closeMark=null,this.innerWidth=0,this.innerHeight=0,this.currentWidth=0,this.currentHeight=0,this.blocker=null,this.themeListener=()=>this.restyle(),this.isClosed=!1,this.motion=null,this.delegate=null,this.onBlockerDown=e=>{e.stopPropagation();let t=e.getLocalPosition(this);this.handleOutsideClick(t.x,t.y)};let t=Q();this.colors={...e.colors},this.modal=e.modal??!0,this.closable=e.closable??!0,this.dims=e.dims??this.modal,this.anchor=e.anchor??`center`,e.blocker===!0&&(this.blocker=new J,this.blocker.eventMode=`static`,this.blocker.on(`pointerdown`,this.onBlockerDown),this.addChild(this.blocker)),this.background=t.panel?new xL(t.panel,{border:t.panelBorder}):new Z,this.addChild(this.background),e.title!==void 0&&(this.titleLabel=new OI({text:e.title,color:this.colors.title??t.color.textHighlight,bold:!0}),this.addChild(this.titleLabel),wL.announce(e.title)),e.closeButton===!0&&this.closable&&(this.closeMark=new OI({text:`✕`,color:this.colors.title??t.color.textHighlight,bold:!0}),this.closeMark.eventMode=`static`,this.closeMark.cursor=`pointer`,this.closeMark.on(`pointertap`,()=>this.close()),this.addChild(this.closeMark)),this.addChild(this.content),this.resize(e.width,e.height),$.add(this.themeListener)}restyle(){this.titleLabel?.setColor(this.colors.title??Q().color.textHighlight),this.closeMark?.setColor(this.colors.title??Q().color.textHighlight),this.resize(this.currentWidth,this.currentHeight)}resize(e,t){this.currentWidth=e,this.currentHeight=t;let n=Q(),r=(this.background instanceof xL?this.background.border.left:2)+n.padding;this.background instanceof xL?(this.background.resize(e,t),this.background.tint=this.colors.background??16777215):this.background.clear().roundRect(0,0,e,t,4).fill({color:this.colors.background??n.color.panelFill}).stroke({color:this.colors.border??n.color.panelBorder,width:1}),this.closeMark&&(this.closeMark.x=n.direction===`rtl`?r:e-r-this.closeMark.width,this.closeMark.y=r);let i=r;this.titleLabel&&(this.titleLabel.x=n.direction===`rtl`?e-r-this.titleLabel.width:r,this.titleLabel.y=r,i=r+this.titleLabel.height+n.padding),this.content.x=r,this.content.y=i,this.innerWidth=Math.max(0,e-r*2),this.innerHeight=Math.max(0,t-i-r)}get contentWidth(){return this.innerWidth}get contentHeight(){return this.innerHeight}setTitle(e){this.titleLabel?.setText(e)}setColors(e){this.colors={...e},this.restyle()}handleAction(e){return this.isClosed?!1:this.delegate?.handleAction(e)?!0:e===`cancel`&&this.closable?(this.close(),!0):!1}get closed(){return this.isClosed}update(e){let t=this.motion;if(!t)return;t.elapsed+=e;let n=t.options.duration??.25,r=Math.min(1,t.elapsed/n);this.applyMotion(t.closing?1-r:r,t),!(r<1)&&(this.motion=null,t.closing?this.close():this.applyMotion(1,t))}applyMotion(e,t){let n=Zj(t.options.animation,e,t.closing),r=t.options.from??{x:t.base.x+this.currentWidth/2,y:t.base.y+this.currentHeight/2};this.scale.set(n.scale),this.alpha=n.alpha,this.position.set(r.x+(t.base.x-r.x)*n.scale,r.y+(t.base.y-r.y)*n.scale+n.offset)}open(e){!e||br()||this.isClosed||(this.motion={options:e,elapsed:0,closing:!1,base:{x:this.x,y:this.y}},this.applyMotion(0,this.motion))}close(e){if(!this.isClosed){if(e&&!br()){let t=this.motion?.base??{x:this.x,y:this.y};this.motion={options:e,elapsed:0,closing:!0,base:t}}else this.isClosed=!0,this.onClose.dispatch(),this.parent?.removeChild(this),this.destroy({children:!0})}}place(e,t){if(this.isClosed)return;let n=this.getLocalBounds(),r=Q().padding*2;this.x=Math.round((e-n.width)/2),this.y=this.anchor===`bottom`?Math.round(t-n.height-r):this.anchor===`top`?r:Math.round((t-n.height)/2),this.fitBlocker(e,t)}fitBlocker(e,t){this.blocker&&(this.blocker.hitArea=new G(-this.x,-this.y,e,t))}handleOutsideClick(e,t){return this.isClosed||e>=0&&t>=0&&e<this.currentWidth&&t<this.currentHeight||!this.closable?!1:(this.close(),!0)}destroy(e){this.isClosed=!0,$.remove(this.themeListener),super.destroy(e)}},EL=class extends J{constructor(){super(),this.windows=[],this.overlay=new Z,this.viewportWidth=0,this.viewportHeight=0,this.listener=e=>this.handleAction(e),this.themeListener=()=>this.drawOverlay(),this.overlay.visible=!1,this.addChild(this.overlay),P.add(this.listener),$.add(this.themeListener)}setViewport(e,t){this.viewportWidth=e,this.viewportHeight=t,this.drawOverlay();for(let n of this.windows)n.place(e,t)}get top(){return this.windows[this.windows.length-1]??null}get isEmpty(){return this.windows.length===0}get depth(){return this.windows.length}push(e){if(e.closed)throw Error(`cannot open a window that was already closed`);return this.windows.push(e),this.addChild(e),e.onClose.add(()=>(this.forget(e),!1)),e.place(this.viewportWidth,this.viewportHeight),this.updateOverlay(),e}pop(){this.top?.close()}closeAll(){for(let e of[...this.windows].reverse())e.close()}forget(e){let t=this.windows.indexOf(e);t!==-1&&this.windows.splice(t,1),this.updateOverlay()}updateOverlay(){let e=this.windows.findIndex(e=>e.dims);e===-1?this.overlay.visible=!1:(this.overlay.visible=!0,this.setChildIndex(this.overlay,Math.max(0,this.getChildIndex(this.windows[e])-1)))}drawOverlay(){let e=Q();this.overlay.clear().rect(0,0,this.viewportWidth,this.viewportHeight).fill({color:e.color.overlay,alpha:e.overlayAlpha})}handleAction(e){return this.top?.handleAction(e)??!1}get blocksWorld(){return this.windows.some(e=>e.modal)}update(e){this.top?.update(e)}destroy(e){P.remove(this.listener),$.remove(this.themeListener),super.destroy(e)}};function DL(e,t,n){return Math.max(0,Math.min(Math.max(0,t-n),e))}var OL=class{constructor(e=.92,t=8){this.velocity=0,this.dragging=!1,this.travelled=0,this.lastY=0,this.lastTime=0,this.friction=e,this.minSpeed=t}start(e,t){this.dragging=!0,this.velocity=0,this.travelled=0,this.lastY=e,this.lastTime=t}move(e,t){if(!this.dragging)return 0;let n=this.lastY-e,r=t-this.lastTime;return r>0&&(this.velocity=this.velocity*.4+n/r*.6),this.travelled+=Math.abs(n),this.lastY=e,this.lastTime=t,n}end(){this.dragging=!1,Math.abs(this.velocity)<this.minSpeed&&(this.velocity=0)}step(e){if(this.dragging||this.velocity===0)return 0;let t=this.velocity*e;return this.velocity*=(1-this.friction)**e,Math.abs(this.velocity)<this.minSpeed&&(this.velocity=0),t}stop(){this.velocity=0}},kL=class extends J{constructor(e){super(),this.onChange=new p,this.content=new J,this.hit=new G(0,0,0,0),this.maskShape=new Z,this.track=new Z,this.thumb=new Z,this.dragMoved=!1,this.thumbGrab=null,this.themeListener=()=>this.draw(),this.handleWheel=e=>{this.scrollBy(e.deltaY)},this.width_=e.width,this.maxHeight_=e.height,this.auto=e.autoHeight??!1,this.lineHeight=e.lineHeight??24,this.drag=e.touch?new OL:null,this.contentHeight_=Math.max(0,e.contentHeight??0),this.height_=this.fit(),this.offset_=DL(e.offset??0,this.contentHeight_,this.height_),this.addChild(this.content),this.addChild(this.maskShape),this.addChild(this.track),this.addChild(this.thumb),this.content.mask=this.maskShape,this.eventMode=`static`,this.on(`wheel`,this.handleWheel),this.drag&&(this.on(`pointerdown`,e=>this.dragStart(e.global.y,performance.now()/1e3)),this.on(`globalpointermove`,e=>this.dragMove(e.global.y,performance.now()/1e3)),this.on(`pointerup`,()=>this.dragEnd()),this.on(`pointerupoutside`,()=>this.dragEnd()),this.on(`pointerupcapture`,e=>{this.dragMoved&&e.stopPropagation()})),this.track.eventMode=`static`,this.thumb.eventMode=`static`,this.thumb.on(`pointerdown`,e=>{e.stopPropagation(),this.thumbDragStart(e.global.y)}),this.thumb.on(`globalpointermove`,e=>this.thumbDragMove(e.global.y)),this.thumb.on(`pointerup`,()=>this.thumbGrab=null),this.thumb.on(`pointerupoutside`,()=>this.thumbGrab=null),this.track.on(`pointerdown`,e=>{e.stopPropagation(),this.scrollToThumbCentre(this.toLocal(e.global).y)}),this.draw(),$.add(this.themeListener)}get offset(){return this.offset_}get contentHeight(){return this.contentHeight_}get viewportWidth(){return this.width_}get viewportHeight(){return this.height_}fit(){return this.auto?Math.min(this.maxHeight_,this.contentHeight_):this.maxHeight_}get maxOffset(){return Math.max(0,this.contentHeight_-this.height_)}get scrollable(){return this.maxOffset>0}setContentHeight(e){this.contentHeight_=Math.max(0,e),this.height_=this.fit(),this.setOffset(DL(this.offset_,this.contentHeight_,this.height_))}resize(e,t){this.width_=e,this.maxHeight_=t,this.height_=this.fit(),this.setOffset(DL(this.offset_,this.contentHeight_,this.height_))}scrollBy(e){this.setOffset(DL(this.offset_+e,this.contentHeight_,this.height_))}scrollTo(e){this.setOffset(DL(e,this.contentHeight_,this.height_))}scrollIntoView(e,t){e<this.offset_?this.scrollTo(e):e+t>this.offset_+this.height_&&this.scrollTo(e+t-this.height_)}handleKey(e){let t=Math.max(this.lineHeight,this.height_-this.lineHeight);switch(e){case`ArrowUp`:return this.scrollBy(-this.lineHeight),!0;case`ArrowDown`:return this.scrollBy(this.lineHeight),!0;case`PageUp`:return this.scrollBy(-t),!0;case`PageDown`:return this.scrollBy(t),!0;case`Home`:return this.scrollTo(0),!0;case`End`:return this.scrollTo(this.maxOffset),!0;default:return!1}}dragStart(e,t){this.drag?.start(e,t),this.dragMoved=!1}dragMove(e,t){let n=this.drag;if(!n?.dragging)return;let r=n.move(e,t);!this.dragMoved&&n.travelled<6||(this.dragMoved=!0,this.scrollBy(r))}dragEnd(){this.drag?.end()}get dragged(){return this.dragMoved}update(e){let t=this.drag;if(!t)return;let n=this.offset_;this.scrollBy(t.step(e)),this.offset_===n&&t.velocity!==0&&t.stop()}get thumbMetrics(){let e=Math.max(6,this.height_/Math.max(1,this.contentHeight_)*this.height_);return{y:this.maxOffset===0?0:this.offset_/this.maxOffset*(this.height_-e),height:e}}thumbDragStart(e){this.thumbGrab={y:e,offset:this.offset_}}thumbDragMove(e){if(!this.thumbGrab)return;let t=this.height_-this.thumbMetrics.height;t<=0||this.scrollTo(this.thumbGrab.offset+(e-this.thumbGrab.y)/t*this.maxOffset)}scrollToThumbCentre(e){let t=this.height_-this.thumbMetrics.height;t<=0||this.scrollTo((e-this.thumbMetrics.height/2)/t*this.maxOffset)}setOffset(e){e===this.offset_?this.draw():(this.offset_=e,this.draw(),this.onChange.dispatch(e))}draw(){this.hit.width=this.width_,this.hit.height=this.height_,this.hitArea=this.hit;let e=Q();if(this.content.y=-this.offset_,this.maskShape.clear().rect(0,0,this.width_,this.height_).fill({color:16777215}),this.track.clear(),this.thumb.clear(),!this.scrollable)return;let t=this.width_-6;this.track.roundRect(t,0,6,this.height_,3).fill({color:e.color.panelFill});let{y:n,height:r}=this.thumbMetrics;this.thumb.roundRect(t,n,6,r,3).fill({color:e.color.textHighlight})}destroy(e){$.remove(this.themeListener),super.destroy(e)}},AL=class{constructor(e){this.list=[],this.current=0,this.hooks=e}get items(){return this.list}get selectedIndex(){return this.current}get selected(){return this.list[this.current]??null}get length(){return this.list.length}reset(e){this.list=e,this.current=e.findIndex(e=>!e.disabled),this.current===-1&&(this.current=0)}swap(e,t){[this.list[e],this.list[t]]=[this.list[t],this.list[e]]}land(e){this.current=e,this.hooks.onChange();let t=this.list[e];t&&this.hooks.onHighlight(t,e)}select(e){e<0||e>=this.list.length||this.list[e].disabled||this.land(e)}confirm(e){let t=this.selected;return!t||t.disabled?!1:(e?.(t,this.current),!0)}step(e,t){if(this.list.length===0)return!1;let n=this.current;for(let r=0;r<t;r++){let t=e(n,this.list.length);if(n=t,!(t<0||t>=this.list.length)&&!this.list[t].disabled)return this.land(t),!0}return!1}},jL=class extends J{constructor(e){super(),this.selection=new AL({onChange:()=>this.refresh(),onHighlight:(e,t)=>this.onHighlight?.(e,t)}),this.rows=[],this.rowsLayer=new J,this.highlight=new Z,this.mask_=new Z,this.scroll=0,this.themeListener=()=>this.restyle(),this.checked=new Set,this.ticks=[];let t=Q();this.viewWidth=e.width,this.viewHeight=e.height,this.explicitRowHeight=e.rowHeight!==void 0,this.rowHeight=e.rowHeight??Math.ceil(t.font.size*t.font.lineHeight)+t.spacing,this.onSelect=e.onSelect??null,this.onHighlight=e.onHighlight??null,this.onToggle=e.onToggle??null,this.multiple=e.multiple??!1,this.addChild(this.highlight),this.addChild(this.rowsLayer),this.addChild(this.mask_),this.rowsLayer.mask=this.mask_,this.drawMask(),this.eventMode=`static`,this.on(`wheel`,e=>this.move(e.deltaY>0?1:-1)),this.setItems(e.items??[]),$.add(this.themeListener)}restyle(){let e=Q();this.explicitRowHeight||(this.rowHeight=Math.ceil(e.font.size*e.font.lineHeight)+e.spacing);let t=e.direction===`rtl`,n=this.selection.items;this.rows.forEach((r,i)=>{r.y=i*this.rowHeight;let a=n[i],o=r.children.find(e=>e instanceof OI);if(o){o.setColor(a.disabled?e.color.textDim:e.color.text);let n=e.spacing+this.checkAdvance()+(a.icon?this.rowHeight:0);o.x=t?this.viewWidth-n-o.width:n,o.y=Math.round((this.rowHeight-o.height)/2)}a.icon&&(a.icon.x=t?this.viewWidth-e.spacing-this.checkAdvance()-this.rowHeight:e.spacing+this.checkAdvance())}),this.updateTicks(),this.refresh()}destroy(e){$.remove(this.themeListener),super.destroy(e)}drawMask(){this.mask_.clear().rect(0,0,this.viewWidth,this.viewHeight).fill({color:16777215})}get visibleRows(){return Math.max(1,Math.floor(this.viewHeight/this.rowHeight))}get selectedIndex(){return this.selection.selectedIndex}get selected(){return this.selection.selected}get length(){return this.selection.length}setItems(e){for(let e of this.rows)e.destroy({children:!0});this.rows=[],this.rowsLayer.removeChildren();let t=Q(),n=t.direction===`rtl`;e.forEach((e,r)=>{let i=new J;i.y=r*this.rowHeight,i.eventMode=`static`,i.cursor=e.disabled?`default`:`pointer`,i.on(`pointerdown`,()=>this.tapRow(r)),e.icon&&(e.icon.x=n?this.viewWidth-t.spacing-this.checkAdvance()-this.rowHeight:t.spacing+this.checkAdvance(),i.addChild(e.icon));let a=new OI({text:e.text,color:e.disabled?t.color.textDim:t.color.text}),o=t.spacing+this.checkAdvance()+(e.icon?this.rowHeight:0);a.x=n?this.viewWidth-o-a.width:o,a.y=Math.round((this.rowHeight-a.height)/2),i.addChild(a),this.rows.push(i),this.rowsLayer.addChild(i)}),this.selection.reset(e),this.checked.clear(),this.rebuildTicks(),this.scroll=0,this.refresh()}resize(e,t){this.viewWidth=e,this.viewHeight=t,this.drawMask(),this.refresh()}move(e){return this.selection.step((t,n)=>(t+e+n)%n,this.selection.length)}select(e){this.selection.select(e)}confirm(){return this.multiple?this.toggleChecked(this.selection.selectedIndex):this.selection.confirm(this.onSelect)}tapRow(e){let t=this.selection.items;e<0||e>=t.length||t[e].disabled||(this.select(e),this.confirm())}handleAction(e){switch(e){case`up`:return this.move(-1);case`down`:return this.move(1);case`confirm`:return this.confirm();default:return!1}}get checkedIndexes(){return[...this.checked].sort((e,t)=>e-t)}isChecked(e){return this.checked.has(e)}setChecked(e,t){let n=this.selection.items[e];n&&!n.disabled&&this.checked.has(e)!==t&&(t?this.checked.add(e):this.checked.delete(e),this.updateTicks(),this.onToggle?.(n,e,t))}toggleChecked(e){let t=this.selection.items[e];return!t||t.disabled?!1:(this.setChecked(e,!this.checked.has(e)),!0)}clearChecked(){this.checked.size!==0&&(this.checked.clear(),this.updateTicks())}checkAdvance(){return this.multiple?this.checkBox()+Q().spacing:0}checkBox(){return Math.max(12,this.rowHeight-8)}rebuildTicks(){if(this.ticks=[],this.multiple){for(let e of this.rows){let t=new Z;e.addChildAt(t,0),this.ticks.push(t)}this.updateTicks()}}updateTicks(){let e=Q(),t=e.direction===`rtl`,n=this.checkBox(),r=Math.round((this.rowHeight-n)/2);this.ticks.forEach((i,a)=>{let o=this.selection.items[a]?.disabled??!0;if(i.clear().rect(0,0,n,n).fill({color:e.color.panelFill}).stroke({color:o?e.color.textDim:e.color.panelBorder,width:2}),this.checked.has(a)){let t=n*.25;i.moveTo(t,n*.55).lineTo(n*.45,n-t).lineTo(n-t,t).stroke({color:o?e.color.textDim:e.color.textHighlight,width:Math.max(2,n*.12),cap:`round`,join:`round`})}i.x=t?this.viewWidth-e.spacing-n:e.spacing,i.y=r})}refresh(){let e=this.visibleRows,t=this.selection.selectedIndex,n=this.selection.length;t<this.scroll?this.scroll=t:t>=this.scroll+e&&(this.scroll=t-e+1),this.scroll=DL(this.scroll,n,e),this.rowsLayer.y=-this.scroll*this.rowHeight;let r=Q();n===0?this.highlight.clear():this.highlight.clear().rect(0,(t-this.scroll)*this.rowHeight,this.viewWidth,this.rowHeight).fill({color:r.color.selection})}},ML=class extends J{columnX(e){return(Q().direction===`rtl`?this.columns-1-e:e)*this.cellSize}constructor(e){super(),this.selection=new AL({onChange:()=>this.refresh(),onHighlight:(e,t)=>this.onHighlight?.(e,t)}),this.cells=[],this.cellsLayer=new J,this.highlight=new Z,this.pickupHighlight=new Z,this.mask_=new Z,this.scrollRow=0,this.pickedUp=null,this.pressedIndex=null,this.pressTimer=0,this.themeListener=()=>{let e=Q();this.selection.items.forEach((t,n)=>{let r=this.cells[n];r&&(r.x=this.columnX(n%this.columns),!((t.quantity??1)<=1)&&r.children.find(e=>e instanceof OI)?.setColor(e.color.textHighlight))}),this.refresh()},this.viewWidth=e.width,this.viewHeight=e.height,this.columns=Math.max(1,e.columns),this.cellSize=e.cellSize??Math.floor(this.viewWidth/this.columns),this.longPressDuration=e.longPressDuration??.6,this.onSelect=e.onSelect??null,this.onHighlight=e.onHighlight??null,this.onQuickslot=e.onQuickslot??null,this.onReorder=e.onReorder??null,this.addChild(this.highlight),this.addChild(this.pickupHighlight),this.addChild(this.cellsLayer),this.addChild(this.mask_),this.cellsLayer.mask=this.mask_,this.drawMask(),this.eventMode=`static`,this.on(`wheel`,e=>this.move(0,e.deltaY>0?1:-1)),this.setItems(e.items??[]),$.add(this.themeListener)}destroy(e){$.remove(this.themeListener),super.destroy(e)}drawMask(){this.mask_.clear().rect(0,0,this.viewWidth,this.viewHeight).fill({color:16777215})}get visibleRows(){return Math.max(1,Math.floor(this.viewHeight/this.cellSize))}get rows(){return Math.max(1,Math.ceil(this.selection.length/this.columns))}get selectedIndex(){return this.selection.selectedIndex}get selected(){return this.selection.selected}get length(){return this.selection.length}setItems(e){this.pickedUp=null,this.pressedIndex=null;for(let e of this.cells)e.destroy({children:!0});this.cells=[],this.cellsLayer.removeChildren();let t=Q();e.forEach((e,n)=>{let r=Math.floor(n/this.columns),i=n%this.columns,a=new J;if(a.x=this.columnX(i),a.y=r*this.cellSize,a.eventMode=`static`,a.cursor=e.disabled?`default`:`pointer`,e.icon.x=Math.round((this.cellSize-e.icon.width)/2),e.icon.y=Math.round((this.cellSize-e.icon.height)/2),e.disabled&&(e.icon.alpha=.4),a.addChild(e.icon),(e.quantity??1)>1){let n=new OI({text:String(e.quantity),size:10,color:t.color.textHighlight});n.x=this.cellSize-n.width-2,n.y=this.cellSize-n.height-1,a.addChild(n)}a.on(`pointerdown`,()=>{this.pressedIndex=n,this.pressTimer=0}),a.on(`pointerup`,()=>this.releaseCell(n)),a.on(`pointerupoutside`,()=>this.releaseCell(n)),this.cells.push(a),this.cellsLayer.addChild(a)}),this.selection.reset(e),this.scrollRow=0,this.refresh()}releaseCell(e){this.pressedIndex===e&&(this.pressedIndex=null,this.selection.items[e]?.disabled||this.tapCell(e))}resize(e,t){this.viewWidth=e,this.viewHeight=t,this.drawMask(),this.refresh()}update(e){if(this.pressedIndex===null||(this.pressTimer+=e,this.pressTimer<this.longPressDuration))return;let t=this.pressedIndex;this.pressedIndex=null;let n=this.selection.items[t];n&&!n.disabled&&this.onQuickslot?.(n,t)}tapCell(e){let t=this.selection.items;if(e<0||e>=t.length)return;if(this.pickedUp===null){if(t[e].disabled)return;this.pickedUp=e,this.refresh();return}let n=this.pickedUp;this.pickedUp=null,n!==e&&(this.swapCells(n,e),this.onReorder?.(n,e)),this.refresh()}swapCells(e,t){let n=this.selection.items;this.selection.swap(e,t);let r=this.cells[e],i=this.cells[t],a=r.removeChildren(),o=i.removeChildren();for(let e of o)r.addChild(e);for(let e of a)i.addChild(e);r.cursor=n[e].disabled?`default`:`pointer`,i.cursor=n[t].disabled?`default`:`pointer`}cancelPickup(){this.pickedUp=null,this.refresh()}move(e,t){let n=this.rows,r=this.columns;return this.selection.step(i=>{let a=(Math.floor(i/r)+t+n)%n,o=(i%r+e+r)%r;return a*r+o},n*r)}select(e){this.selection.select(e)}confirm(){return this.selection.confirm(this.onSelect)}handleAction(e){switch(e){case`up`:return this.move(0,-1);case`down`:return this.move(0,1);case`left`:return this.move(Q().direction===`rtl`?1:-1,0);case`right`:return this.move(Q().direction===`rtl`?-1:1,0);case`confirm`:return this.confirm();case`cancel`:return this.pickedUp!==null&&(this.cancelPickup(),!0);default:return!1}}cellRect(e){return{x:this.columnX(e%this.columns),y:Math.floor(e/this.columns)*this.cellSize}}refresh(){let e=this.visibleRows,t=this.selection.selectedIndex,n=Math.floor(t/this.columns);n<this.scrollRow?this.scrollRow=n:n>=this.scrollRow+e&&(this.scrollRow=n-e+1),this.scrollRow=DL(this.scrollRow,this.rows,e),this.cellsLayer.y=-this.scrollRow*this.cellSize;let r=Q();if(this.pickupHighlight.clear(),this.pickedUp!==null){let{x:e,y:t}=this.cellRect(this.pickedUp);this.pickupHighlight.rect(e,t,this.cellSize,this.cellSize).stroke({color:r.color.textHighlight,width:2})}if(this.highlight.clear(),this.selection.length>0){let{x:e,y:n}=this.cellRect(t);this.highlight.rect(e,n,this.cellSize,this.cellSize).fill({color:r.color.selection})}}},NL=class{constructor(e){if(this.onChange=new p,this.currentTabIndex=0,this.currentQuery=``,this.rows_=[],this.currentSelectedIndex=0,this.detail=!1,e.tabs.length===0)throw Error(`TabbedList needs at least one tab`);this.tabList=[...e.tabs],this.rowsFor=e.rowsFor,this.pageSize=Math.max(0,Math.floor(e.pageSize??0)),this.labelOf=e.label??(e=>String(e)),this.filterOf=e.filter??((e,t)=>t===``||this.labelOf(e).toLowerCase().includes(t.toLowerCase())),this.disabledOf=e.disabled??(()=>!1),this.recompute()}get tabs(){return this.tabList}get tab(){return this.tabList[this.currentTabIndex]}get query(){return this.currentQuery}get rows(){return this.rows_}get pageCount(){return this.pageSize<=0?1:Math.max(1,Math.ceil(this.rows_.length/this.pageSize))}get page(){return this.pageSize<=0?0:Math.floor(this.currentSelectedIndex/this.pageSize)}get pageRows(){if(this.pageSize<=0)return this.rows_;let e=this.page*this.pageSize;return this.rows_.slice(e,e+this.pageSize)}get selectedIndex(){return this.currentSelectedIndex}get selected(){return this.rows_[this.currentSelectedIndex]??null}get detailOpen(){return this.detail}selectTab(e){let t=this.tabList.findIndex(t=>t.id===e);t===-1||this.tabList[t].disabled||t!==this.currentTabIndex&&(this.currentTabIndex=t,this.recompute(),this.emit())}nextTab(e=1){if(e===0)return;let t=e>0?1:-1,n=this.currentTabIndex;for(let r=0;r<Math.abs(e);r++)do n=(n+t+this.tabList.length)%this.tabList.length;while(this.tabList[n].disabled&&n!==this.currentTabIndex);n!==this.currentTabIndex&&(this.currentTabIndex=n,this.recompute(),this.emit())}setQuery(e){e!==this.currentQuery&&(this.currentQuery=e,this.recompute(),this.emit())}move(e){if(e===0||this.rows_.length===0)return;let t=e>0?1:-1,n=this.currentSelectedIndex;for(let r=0;r<Math.abs(e);r++){let e=n;do e+=t;while(e>=0&&e<this.rows_.length&&this.disabledOf(this.rows_[e]));if(e<0||e>=this.rows_.length)break;n=e}n!==this.currentSelectedIndex&&(this.currentSelectedIndex=n,this.emit())}setPage(e){let t=Math.max(0,Math.min(this.pageCount-1,Math.floor(e)));if(this.pageSize<=0)return;let n=this.firstSelectableOnPage(t);n!==this.currentSelectedIndex&&(this.currentSelectedIndex=n,this.emit())}nextPage(e){this.setPage(this.page+e)}openDetail(){return this.selected===null||this.disabledOf(this.selected)?!1:(this.detail||(this.detail=!0,this.emit()),!0)}closeDetail(){this.detail&&(this.detail=!1,this.emit())}firstSelectableOnPage(e){let t=e*this.pageSize,n=Math.min(this.rows_.length,t+this.pageSize);for(let e=t;e<n;e++)if(!this.disabledOf(this.rows_[e]))return e;return Math.min(t,Math.max(0,this.rows_.length-1))}firstSelectable(e){for(let t=e;t<this.rows_.length;t++)if(!this.disabledOf(this.rows_[t]))return t;return 0}recompute(){let e=this.rowsFor(this.tab.id).filter(e=>this.filterOf(e,this.currentQuery));this.rows_=e,this.currentSelectedIndex=e.length===0?0:this.firstSelectable(0),this.detail=!1}emit(){this.onChange.dispatch()}};function PL(e,t,n={}){let r={},i=t.replace(/\r/g,``).split(`
|
|
1372
|
+
`),a=null,o=``,s=[],c=!1,l=()=>{if(a){if(r[a]!==void 0)throw Error(`Duplicate FTL message: ${a}`);if(s.length){if(!c)throw Error(`FTL select expression is not closed: ${a}`);let t=o.trim().match(/^\{\s*\$([\w-]+)\s*->\s*$/)?.[1];if(!t)throw Error(`Invalid FTL selector: ${o}`);r[a]=IL(e,t,s)}else r[a]=FL(o);a=null,o=``,s=[],c=!1}};for(let e of i){if(!e.trim()||e.trimStart().startsWith(`#`))continue;let t=e.match(/^([\w-]+)\s*=\s*(.*)$/);if(t){l(),a=t[1],o=t[2];continue}if(!a)throw Error(`FTL continuation has no message: ${e}`);if(e.trim()===`}`){if(!s.length||c)throw Error(`Unexpected FTL select terminator: ${e}`);c=!0;continue}if(c)throw Error(`FTL content follows a closed select expression: ${e}`);let n=e.match(/^\s*(\*)?\[([^\]]+)\]\s*(.*)$/);if(n)s.push({key:n[2],value:n[3],default:!!n[1]});else if(/^\s+/.test(e))s.length?s[s.length-1].value+=` ${e.trim()}`:o+=` ${e.trim()}`;else throw Error(`Invalid FTL line: ${e}`)}return l(),{locale:e,direction:n.direction??(/^(ar|he|fa|ur)(?:-|$)/i.test(e)?`rtl`:`ltr`),messages:r}}function FL(e){return e.replace(/\{\s*\$([\w-]+)\s*(?:!([sra]))?\s*(?::\s*([^{}]*?))?\s*\}/g,(e,t,n,r)=>`{${t}${n?`!${n}`:``}${r===void 0?``:`:${r.trim()}`}}`).trim()}function IL(e,t,n){let r=n.filter(e=>e.default);if(r.length!==1)throw Error(`FTL select expressions need exactly one default variant`);let i=r[0],a=new Intl.PluralRules(e);return{format(e={}){let r=e[t],o=n.find(e=>e.key===String(r)),s=typeof r==`number`?a.select(r):``;return FL((o??n.find(e=>e.key===s)??i).value)}}}function LL(e,t,n={}){let r=n.domain??`messages`,i=r===`messages`?``:`${r}:`,a={},o=t.replace(/\r\n?/g,`
|
|
1373
1373
|
`).split(`
|
|
1374
|
-
`),s=null,c=``,l=()=>{if(s){if(s.id===void 0){if(s.str!==void 0||s.plurals.size>0||s.context!==void 0)throw Error(`PO entry has a translation but no msgid`);s=null,c=``}else u(s),s=null,c=``}},u=t=>{let n=t.id;if(n===``||/(^|,)\s*fuzzy\s*(,|$)/.test(c))return;if(t.plural!==void 0&&t.plurals.size===0)throw Error(`PO message "${n}" has a plural but no msgstr[N] forms`);let r=i+(t.context?`${t.context}\u0004${n}`:n);if(a[r]!==void 0)throw Error(`Duplicate PO message: ${r}`);if(t.plurals.size>0){if([...t.plurals.values()].every(e=>e===``))return;let i=new Intl.PluralRules(e).resolvedOptions().pluralCategories,o={};for(let[r,a]of[...t.plurals].sort((e,t)=>e[0]-t[0])){let t=i[r];if(t===void 0)throw Error(`PO message "${n}" has plural form ${r}, but ${e} declares only ${i.length}`);o[t]=a}a[r]=o}else t.str!==void 0&&t.str!==``&&(a[r]=t.str)};for(let e=0;e<o.length;e++){let t=o[e],n=t.trim();if(n===``){l();continue}if(n.startsWith(`#,`)){c+=`${c===``?``:`,`}${n.slice(2).trim()}`;continue}if(n.startsWith(`#`))continue;let r=t.match(/^(msgctxt|msgid_plural|msgid|msgstr(?:\[(\d+)\])?)\s+(.*)$/);if(!r)throw Error(`Invalid PO line ${e+1}: ${t}`);let i=r[1],a=r[2]===void 0?void 0:Number(r[2]),u=
|
|
1375
|
-
`;case`t`:return` `;case`r`:return`\r`;case`"`:return`"`;case`\\`:return`\\`;case`a`:return`\x07`;case`b`:return`\b`;case`f`:return`\f`;case`v`:return`\v`;default:return t}})}var IL=/\{sound:([^{}\r\n]+)\}/g;function LL(e){let t=[],n=``,r=0,i;for(IL.lastIndex=0;(i=IL.exec(e))!==null;){n+=e.slice(r,i.index);let a=i[1].trim();a===``?n+=i[0]:t.push({path:a,index:n.length}),r=i.index+i[0].length}return n+=e.slice(r),{text:n,cues:t}}function RL(e){return LL(e).text}function zL(){return{format(e,t){let n=e.params;if(t===`audio`){let t=`${e.type}.audio`;return ez(t)?HR(t,n):``}let r=`${e.type}.${t}`;return ez(r)?UR(r,n):UR(e.type,n)}}}function BL(e,t){return new Intl.NumberFormat(BR(),t).format(e)}function VL(e,t){return new Intl.DateTimeFormat(BR(),t).format(e)}function HL(e,t){return new Intl.ListFormat(BR(),t).format(e)}var UL=/\{(?!sound:)(\w+(?:\.\w+)*)(=)?(?:!([sra]))?(?::([^{}]*))?\}/g;function WL(e){let t=[];UL.lastIndex=0;let n=0,r;for(;(r=UL.exec(e))!==null;){r.index>n&&t.push(e.slice(n,r.index));let i=r[1],a=r[3],o=r[4];t.push({raw:r[0],token:i,debug:r[2]===`=`,conv:a,spec:o}),n=r.index+r[0].length}return n<e.length&&t.push(e.slice(n)),t}function GL(e){return`${e.debug?`=`:``}${e.conv?`!${e.conv}`:``}${e.spec===void 0?``:`:${e.spec}`}`}function KL(e,t){let n=new Map,r=new Map;for(let t of WL(e))typeof t!=`string`&&n.set(t.token,GL(t));for(let e of WL(t))typeof e!=`string`&&r.set(e.token,GL(e));return{missing:[...n.keys()].filter(e=>!r.has(e)),extra:[...r.keys()].filter(e=>!n.has(e)),changed:[...n].flatMap(([e,t])=>{let n=r.get(e);return n!==void 0&&n!==t?[{token:e,base:t,target:n}]:[]})}}var qL=/^(?:(.)?([<>=^]))?([+\- ])?(z)?(#)?(0)?(\d+)?([,_])?(?:\.(\d+))?([bcdeEfFgGnosxX%])?$/,JL={b:2,o:8,x:16,X:16},YL={b:`0b`,o:`0o`,x:`0x`,X:`0X`},XL=new Set([`f`,`F`,`e`,`E`,`g`,`G`,`%`,`n`]);function ZL(e){return Number.isNaN(e)?`nan`:e===1/0?`inf`:e===-1/0?`-inf`:Object.is(e,-0)?`-0.0`:String(e)}function QL(e,t,n=3,r=`\\d`){return e.replace(RegExp(`\\B(?=(${r}{${n}})+(?!${r}))`,`g`),t)}function $L(e,t){let n=/^(\d+)/.exec(e);return n?QL(n[1],t)+e.slice(n[1].length):e}function eR(e,t,n,r){if(e.length>=t)return e;let i=n.repeat(t-e.length);return r===`<`?e+i:r===`^`?i.slice(0,Math.floor(i.length/2))+e+i.slice(Math.floor(i.length/2)):i+e}function tR(e){return e.replace(/([eE][+-])(\d)$/,`$10$2`)}function nR(e,t,n,r,i){let a=t===0?1:t;if(e===0)return r?`0.${`0`.repeat(a-1)}`:`0`;let o=Math.floor(Math.log10(e)),s;return o>=-4&&o<(i??a)?(s=e.toFixed(a-1-o),r||(s=s.replace(/(\.\d*?)0+$/,`$1`).replace(/\.$/,``))):(s=tR(e.toExponential(a-1)),r||(s=s.replace(/(\.\d*?)0+(e|$)/,`$1$2`).replace(/\.e/i,`e`))),n?s.toUpperCase():s}function rR(e){let t=`,`,n=`.`;for(let r of new Intl.NumberFormat(e).formatToParts(1000.5))r.type===`group`&&(t=r.value),r.type===`decimal`&&(n=r.value);return{group:t,decimal:n}}function iR(e,t,n,r,i,a){return eR(a===void 0?e:e.slice(0,a),i,t??(r?`0`:` `),n??`<`)}function aR(e,t,n=`en`){if(t===``)return typeof e==`number`?ZL(e):e;let r=qL.exec(t);if(!r)return;let[i,a,o,s,c,l,u,d,f,p]=r.slice(1),m=f===void 0?void 0:Number(f),h=u===void 0?0:Number(u);if(typeof e==`string`)return o||s||c||d||a===`=`||p!==void 0&&p!==`s`?void 0:iR(e,i,a,l,h,m);if(p===`s`)return;if(p===`c`){if(o||c||l||d||m!==void 0)return;let t=Math.trunc(e);return t<0||t>1114111?void 0:eR(String.fromCodePoint(t),h,i??` `,a??`>`)}if(!Number.isFinite(e)){if(p!==void 0&&!XL.has(p))return;let t=Number.isNaN(e)?`nan`:`inf`;return(p===`F`||p===`E`||p===`G`)&&(t=t.toUpperCase()),p===`%`&&(t+=`%`),eR((e<0?`-`:o===`+`?`+`:o===` `?` `:``)+t,h,i??` `,a??`>`)}let g=e<0||Object.is(e,-0);s&&e===0&&(g=!1);let _=Math.abs(e),v=d===`,`?`,`:d===`_`?`_`:``,y;if(p===void 0){if(m!==void 0){if(Number.isInteger(_))return;y=nR(_,m,!1,!!c,m-1)}else y=ZL(_);v&&(y=$L(y,v))}else if(p===`d`){if(m!==void 0||!Number.isInteger(_))return;y=String(Math.trunc(_)),v&&(y=QL(y,v))}else if(p in JL){if(m!==void 0||!Number.isInteger(_)||d===`,`)return;y=Math.trunc(_).toString(JL[p]),p===`X`&&(y=y.toUpperCase()),v&&(y=QL(y,v,4,`[0-9a-fA-F]`)),c&&(y=YL[p]+y)}else if(p===`n`){if(d||m!==void 0&&Number.isInteger(_))return;if(Number.isInteger(_))y=new Intl.NumberFormat(n).format(Math.trunc(_));else{let{group:e,decimal:t}=rR(n),r=nR(_,m??6,!1,!!c),i=r.split(`e`)[0],a=r.slice(i.length);y=$L(i,e).replace(`.`,t)+a}}else if(p===`f`||p===`F`)y=_.toFixed(m??6),v&&(y=$L(y,v));else if(p===`e`||p===`E`)y=tR(_.toExponential(m??6)),p===`E`&&(y=y.toUpperCase()),v&&(y=$L(y,v));else if(p===`g`||p===`G`)y=nR(_,m??6,p===`G`,!!c),v&&(y=$L(y,v));else{let e=_*100;y=(Number.isFinite(e)?e.toFixed(m??6):`inf`)+`%`,v&&Number.isFinite(e)&&(y=$L(y,v))}let b=g?`-`:o===`+`?`+`:o===` `?` `:``,x=i??(l&&!a?`0`:` `),S=a??(l&&!a?`=`:`>`);return S===`=`?b+eR(y,h-b.length,x,`>`):eR(b+y,h,x,S)}function oR(e,t){let n=new Set(Object.keys(e.messages)),r=new Set(Object.keys(t.messages));return{missing:[...n].filter(e=>!r.has(e)),extra:[...r].filter(e=>!n.has(e))}}function sR(e){let t=[];for(let[n,r]of Object.entries(e.messages))typeof r==`string`?r===``&&t.push({key:n,kind:`empty-message`,detail:`message resolves to an empty string`}):cR(r)&&r.other===void 0&&t.push({key:n,kind:`plural-missing-other`,detail:`plural forms have no "other" branch`});return t}function cR(e){return typeof e==`object`&&!!e&&!(`format`in e)}function lR(e){let t=[];for(let[n,r]of Object.entries(e.messages))n.endsWith(`.audio`)&&(typeof r==`string`?r===``&&t.push({key:n,kind:`empty-audio-path`,detail:`an empty audio entry already means "no sound"; remove the key instead`}):t.push({key:n,kind:`audio-not-a-path`,detail:`an audio entry must be a plain path string, not plural forms or a select message`}));return t}function uR(e){if(typeof e==`string`)return e;if(typeof e==`object`&&e&&`format`in e)try{return e.format()}catch{return``}let t=e;return t.other??Object.values(t)[0]??``}function dR(e,t){if(e===t)return 0;if(e.length===0)return t.length;if(t.length===0)return e.length;let n=Array.from({length:t.length+1},(e,t)=>t),r=Array(t.length+1);for(let i=1;i<=e.length;i++){r[0]=i;for(let a=1;a<=t.length;a++){let o=e[i-1]===t[a-1]?0:1;r[a]=Math.min(n[a]+1,r[a-1]+1,n[a-1]+o)}[n,r]=[r,n]}return n[t.length]}function fR(e,t=.8){let n=Object.entries(e.messages).map(([e,t])=>[e,uR(t)]).filter(([,e])=>e.length>0),r=[];for(let e=0;e<n.length;e++)for(let i=e+1;i<n.length;i++){let[a,o]=n[e],[s,c]=n[i],l=Math.max(o.length,c.length),u=dR(o,c),d=l===0?1:1-u/l;d>=t&&r.push({a,b:s,distance:u,similarity:d})}return r.sort((e,t)=>t.similarity-e.similarity)}function pR(e,t){let n=new Set(t),r=Object.keys(e.messages),i=r.filter(e=>!n.has(e));return{totalKeys:r.length,usedKeys:r.length-i.length,unusedKeys:i}}function mR(e,t){let n=Object.keys(e.messages);if(n.length===0)return 1;let{missing:r}=oR(e,t);return(n.length-r.length)/n.length}function hR(e){let t={},n=0;for(let r of Object.values(e.messages))if(!(typeof r==`string`||typeof r==`object`&&r&&`format`in r)){n++;for(let e of Object.keys(r))t[e]=(t[e]??0)+1}return{pluralKeys:n,formsPresent:t}}function gR(e,t,n){if(!(t in e.messages))throw Error(`mergeCatalogKeys: "${t}" is not a key in this catalog`);if(!(n in e.messages))throw Error(`mergeCatalogKeys: "${n}" is not a key in this catalog`);if(t===n)throw Error(`mergeCatalogKeys: survivingKey and mergedKey must be different keys`);let r={...e.messages};return delete r[n],{...e,messages:r}}function _R(e,t){return{base:e,target:t}}var vR=`.audio`;function yR(e){return e.endsWith(vR)}function bR(e){return[...new Set([...Object.keys(e.base.messages),...Object.keys(e.target.messages)])].filter(e=>!yR(e)).sort()}function xR(e){if(e===void 0)return;let t=uR(e);return t===``?void 0:t}var SR=[`log`,`compact`,`accessibility`,`debug`];function CR(e){let t=e.lastIndexOf(`.`);if(!(t<=0||!SR.includes(e.slice(t+1))))return`${e.slice(0,t)}${vR}`}function wR(e,t){let n=e.base.messages[t],r=e.target.messages[t],i=n!==void 0&&r!==void 0?`ok`:n===void 0?`extra`:`missing`,a=[`${t}${vR}`],o=CR(t);o&&a.push(o);let s,c,l=!1;for(let t of a){let n=xR(e.target.messages[t]);if(n!==void 0){s=n,c=t;break}let r=xR(e.base.messages[t]);if(r!==void 0){s=r,c=t,l=!0;break}}return{key:t,baseText:n===void 0?``:uR(n),targetText:r===void 0?``:uR(r),status:i,sound:s,soundKey:c,soundInherited:l}}function TR(e,t){let n=`${t}${vR}`;return n in e.target.messages||n in e.base.messages?n:CR(t)??n}function ER(e,t={}){let n=t.query?.toLowerCase()??``;return bR(e).map(t=>wR(e,t)).filter(e=>!t.missingOnly||e.status===`missing`).filter(e=>n===``||e.key.toLowerCase().includes(n)||e.baseText.toLowerCase().includes(n)||e.targetText.toLowerCase().includes(n))}function DR(e,t,n){let r=e.target.messages[t]??e.base.messages[t],i=n;if(r!==void 0&&typeof r==`object`&&!(`format`in r))try{let e=JSON.parse(n);typeof e==`object`&&e&&!Array.isArray(e)&&(i=e)}catch{}return{...e,target:{...e.target,messages:{...e.target.messages,[t]:i}}}}function OR(e,t){let n=e.base.messages[t];if(n===void 0)throw Error(`copyFromBase: "${t}" is not a key in the base catalog`);return{...e,target:{...e.target,messages:{...e.target.messages,[t]:n}}}}function kR(e,t){if(!(t in e.target.messages))throw Error(`deleteTargetKey: "${t}" is not a key in the target catalog`);let n={...e.target.messages};return delete n[t],{...e,target:{...e.target,messages:n}}}function AR(e,t,n){let r={...e.target.messages},i=TR(e,t);return n===``?delete r[i]:r[i]=n,{...e,target:{...e.target,messages:r}}}function jR(e){let t=e=>({...e,messages:Object.fromEntries(Object.entries(e.messages).filter(([e])=>!yR(e)))});return mR(t(e.base),t(e.target))}function MR(e){return{base:e.target,target:e.base}}var NR=l({AUDIO_SUFFIX:()=>vR,catalogCompleteness:()=>mR,catalogUsage:()=>pR,copyFromBase:()=>OR,createCatalogFormatter:()=>zL,createEditSession:()=>_R,cueKeyFor:()=>TR,deleteTargetKey:()=>kR,diffCatalogKeys:()=>oR,diffPlaceholders:()=>KL,direction:()=>VR,findSimilarMessages:()=>fR,formatDate:()=>VL,formatList:()=>HL,formatNumber:()=>BL,formatSpec:()=>aR,has:()=>ez,isAudioKey:()=>yR,levenshteinDistance:()=>dR,locale:()=>BR,mergeCatalogKeys:()=>gR,messageText:()=>uR,nonBreakingUnit:()=>XR,parseFTL:()=>kL,parsePo:()=>ML,parseSoundMarkers:()=>LL,pluralFormCoverage:()=>hR,reset:()=>cz,sessionCompleteness:()=>jR,sessionKeys:()=>bR,sessionRow:()=>wR,sessionRows:()=>ER,setActive:()=>zR,setBase:()=>RR,setTargetSound:()=>AR,setTargetText:()=>DR,stripSoundMarkers:()=>RL,swapSession:()=>MR,t:()=>UR,tRaw:()=>HR,tokenizeMessage:()=>WL,typographic:()=>YR,validateCatalog:()=>sR,validateMessageAudio:()=>lR}),PR=null,FR=null,IR=null,LR=null;function RR(e){PR=e}function zR(e){FR=e,IR=e?new Intl.PluralRules(e.locale):null}function BR(){return(FR??PR)?.locale??`en`}function VR(){return(FR??PR)?.direction??`ltr`}function HR(e,t){let n=FR?.messages[e]??PR?.messages[e];if(n===void 0)return e;let r=typeof n==`string`?n:nz(n)?n.format(t):tz(n,t?.count);return t?rz(r,t):r}function UR(e,t){if(!ez(e))return e;let n=HR(e,t),r=(FR??PR)?.typography===!1?n:YR(n,BR());return VR()===`rtl`?`${r}`:r}var WR=` `,GR=`\xA0`,KR=[`Chapitre`,`Tome`,`Livre`,`Partie`,`Section`,`Article`,`Acte`,`Scène`,`Niveau`,`Manche`,`Round`,`Étape`,`Volume`,`Figure`,`Page`,`Numéro`],qR=[`Nr`,`Dr`,`Bd`,`Kap`,`Art`,`Abb`,`Str`,`Tel`],JR=[`kg`,`g`,`mg`,`t`,`km`,`m`,`cm`,`mm`,`l`,`ml`,`h`,`min`,`s`,`%`,`°C`,`€`];function YR(e,t=BR()){let n=t.split(`-`)[0].toLowerCase(),r=e;return(n===`fr`||n===`it`||n===`nl`)&&(r=r.replace(/([\p{L}])'(?=[\p{L}])/gu,`$1’`)),n===`fr`&&(r=ZR(r)),n===`de`&&(r=QR(r)),r}function XR(e,t,n=BR()){let r=n.split(`-`)[0].toLowerCase();return`${e}${r===`fr`?WR:r===`de`?GR:` `}${t}`}function ZR(e){let t=e.replace(/\s?([;!?])/g,`${WR}$1`).replace(/«\s?/g,`«${WR}`).replace(/\s?»/g,`${WR}»`);t=t.replace(/(?<!\{soun)(\p{L})\s?:/gu,`$1${WR}:`);let n=RegExp(`\\b(${KR.join(`|`)})\\s+(?=\\d)`,`g`);return t.replace(n,`$1${GR}`)}function QR(e){let t=RegExp(`(\\d)\\s+(?=(?:${JR.map($R).join(`|`)})(?![\\p{L}\\p{N}]))`,`gu`),n=RegExp(`\\b(${qR.join(`|`)})\\.\\s+`,`g`);return e.replace(t,`$1${GR}`).replace(n,`$1.${GR}`)}function $R(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function ez(e){return FR?.messages[e]!==void 0||PR?.messages[e]!==void 0}function tz(e,t){return t===void 0?e.other??Object.values(e)[0]??``:e[(IR??(LR??=new Intl.PluralRules(`en`))).select(t)]??e.other??``}function nz(e){return`format`in e}function rz(e,t){return WL(e).map(e=>typeof e==`string`?e:az(e,t)).join(``)}function iz(e,t){let n=e[t];if(typeof n==`string`||typeof n==`number`)return n;let r=e;for(let e of t.split(`.`)){if(typeof r!=`object`)return;r=r[e]}return typeof r==`string`||typeof r==`number`?r:void 0}function az(e,t){let n=iz(t,e.token);if(n===void 0)return e.raw;try{let t=e.conv===void 0?n:oz(n,e.conv),r=e.spec===void 0?String(t):aR(t,e.spec,BR());return r===void 0?e.raw:e.debug?`${e.token}=${r}`:r}catch{return e.raw}}function oz(e,t){if(t===`s`)return String(e);if(typeof e==`number`){let n=aR(e,``,`en`)??String(e);return t===`a`?sz(n):n}let n=`'${e.replace(/\\/g,`\\\\`).replace(/'/g,`\\'`).replace(/\n/g,`\\n`).replace(/\r/g,`\\r`).replace(/\t/g,`\\t`)}'`;return t===`a`?sz(n):n}function sz(e){let t=``;for(let n of e){let e=n.codePointAt(0)??0;t+=e>127?e>65535?`\\U${e.toString(16).padStart(8,`0`)}`:`\\u${e.toString(16).padStart(4,`0`)}`:n}return t}function cz(){PR=null,FR=null,IR=null}var lz=class extends CL{constructor(e){super({width:e.width,height:e.height,modal:!0,closable:!1,dims:e.dims,blocker:e.blocker??!0,anchor:e.anchor??`bottom`}),this.pageIndex=0,this.reveal=SI(0),this.pageText=``,this.pageCues=[],this.nextCue=0,this.portrait=null,this.portraitLayer=new J,this.choiceList=null,this.finished=!1,this.autoAdvanceElapsed=0,this.messageThemeListener=()=>this.restyleMessage(),this.pages=e.pages.map(e=>typeof e==`string`?{text:e}:e),this.speed=e.speed??40,this.mode=e.mode??`adv`,this.autoAdvance=e.autoAdvance,this.choices=e.choices??[],this.onDone=e.onDone??null,this.onSound=e.onSound??null,this.announce=e.announce??!0;let t=Q();this.content.addChild(this.portraitLayer),this.speakerLabel=new EI({color:t.color.textHighlight,bold:!0}),this.content.addChild(this.speakerLabel),this.body=new EI({wrapWidth:this.contentWidth}),this.content.addChild(this.body),this.prompt=new EI({text:`▼`,color:t.color.textDim}),this.prompt.visible=!1,this.content.addChild(this.prompt),this.showPage(0),$.add(this.messageThemeListener)}restyleMessage(){let e=Q();this.speakerLabel.setColor(e.color.textHighlight),this.prompt.setColor(e.color.textDim)}destroy(e){$.remove(this.messageThemeListener),super.destroy(e)}showPage(e){let t=this.pages[e],n=Q(),r=n.direction===`rtl`;this.portraitLayer.removeChildren(),this.portrait=null;let i=0,a=this.contentWidth;t.portrait&&(this.portrait=new wl(t.portrait),r&&(this.portrait.x=this.contentWidth-this.portrait.width),this.portraitLayer.addChild(this.portrait),a=this.contentWidth-this.portrait.width-n.padding,i=r?0:this.portrait.width+n.padding),this.speakerLabel.visible=this.mode===`adv`&&t.speaker!==void 0,this.speakerLabel.x=i,this.speakerLabel.setText(t.speaker??``),this.body.x=i,this.body.y=this.mode===`adv`&&t.speaker!==void 0?this.speakerLabel.height+n.spacing:0,this.body.style.wordWrapWidth=Math.max(16,a);let o=LL(t.text);this.pageText=o.text,this.pageCues=o.cues,this.nextCue=0,this.announce&&SL.announce(t.speaker===void 0?this.pageText:`${t.speaker}: ${this.pageText}`),this.reveal=SI(this.pageText.length,this.speed),this.autoAdvanceElapsed=0,this.playRevealedSounds(),this.renderBody(),this.prompt.visible=!1,this.prompt.x=r?0:this.contentWidth-this.prompt.width,this.prompt.y=this.contentHeight-this.prompt.height}renderBody(){if(this.mode===`adv`){this.body.setText(this.pageText.slice(0,Math.floor(this.reveal.revealed)));return}let e=this.pages.slice(0,this.pageIndex).map(e=>this.formatLine(e,LL(e.text).text)),t=this.pages[this.pageIndex];e.push(this.formatLine(t,this.pageText.slice(0,Math.floor(this.reveal.revealed)))),this.body.setText(e.join(`
|
|
1374
|
+
`),s=null,c=``,l=()=>{if(s){if(s.id===void 0){if(s.str!==void 0||s.plurals.size>0||s.context!==void 0)throw Error(`PO entry has a translation but no msgid`);s=null,c=``}else u(s),s=null,c=``}},u=t=>{let n=t.id;if(n===``||/(^|,)\s*fuzzy\s*(,|$)/.test(c))return;if(t.plural!==void 0&&t.plurals.size===0)throw Error(`PO message "${n}" has a plural but no msgstr[N] forms`);let r=i+(t.context?`${t.context}\u0004${n}`:n);if(a[r]!==void 0)throw Error(`Duplicate PO message: ${r}`);if(t.plurals.size>0){if([...t.plurals.values()].every(e=>e===``))return;let i=new Intl.PluralRules(e).resolvedOptions().pluralCategories,o={};for(let[r,a]of[...t.plurals].sort((e,t)=>e[0]-t[0])){let t=i[r];if(t===void 0)throw Error(`PO message "${n}" has plural form ${r}, but ${e} declares only ${i.length}`);o[t]=a}a[r]=o}else t.str!==void 0&&t.str!==``&&(a[r]=t.str)};for(let e=0;e<o.length;e++){let t=o[e],n=t.trim();if(n===``){l();continue}if(n.startsWith(`#,`)){c+=`${c===``?``:`,`}${n.slice(2).trim()}`;continue}if(n.startsWith(`#`))continue;let r=t.match(/^(msgctxt|msgid_plural|msgid|msgstr(?:\[(\d+)\])?)\s+(.*)$/);if(!r)throw Error(`Invalid PO line ${e+1}: ${t}`);let i=r[1],a=r[2]===void 0?void 0:Number(r[2]),u=RL(o,e,r[3]);if(e=u.next-1,s?(i===`msgctxt`||i===`msgid`)&&s.id!==void 0&&(l(),s={plurals:new Map}):s={plurals:new Map},i===`msgctxt`)s.context=u.text;else if(i===`msgid`)s.id=u.text;else if(i===`msgid_plural`)s.plural=u.text;else if(i===`msgstr`)s.str=u.text;else if(a!==void 0)s.plurals.set(a,u.text);else throw Error(`Invalid PO keyword on line ${e+1}: ${i}`)}return l(),{locale:e,direction:n.direction??(/^(ar|he|fa|ur)(?:-|$)/i.test(e)?`rtl`:`ltr`),messages:a}}function RL(e,t,n){if(!n.trim().startsWith(`"`))throw Error(`PO string must start with a quote on line ${t+1}: ${n}`);let r=zL(n.trim(),t),i=t+1;for(;i<e.length&&e[i].trim().startsWith(`"`);)r+=zL(e[i].trim(),i),i++;return{text:r,next:i}}function zL(e,t){let n=e.match(/^"((?:[^"\\]|\\.)*)"/);if(!n)throw Error(`Invalid PO string on line ${t+1}: ${e}`);return BL(n[1])}function BL(e){return e.replace(/\\(.)/g,(e,t)=>{switch(t){case`n`:return`
|
|
1375
|
+
`;case`t`:return` `;case`r`:return`\r`;case`"`:return`"`;case`\\`:return`\\`;case`a`:return`\x07`;case`b`:return`\b`;case`f`:return`\f`;case`v`:return`\v`;default:return t}})}var VL=/\{sound:([^{}\r\n]+)\}/g;function HL(e){let t=[],n=``,r=0,i;for(VL.lastIndex=0;(i=VL.exec(e))!==null;){n+=e.slice(r,i.index);let a=i[1].trim();a===``?n+=i[0]:t.push({path:a,index:n.length}),r=i.index+i[0].length}return n+=e.slice(r),{text:n,cues:t}}function UL(e){return HL(e).text}function WL(){return{format(e,t){let n=e.params;if(t===`audio`){let t=`${e.type}.audio`;return az(t)?qR(t,n):``}let r=`${e.type}.${t}`;return az(r)?JR(r,n):JR(e.type,n)}}}function GL(e,t){return new Intl.NumberFormat(GR(),t).format(e)}function KL(e,t){return new Intl.DateTimeFormat(GR(),t).format(e)}function qL(e,t){return new Intl.ListFormat(GR(),t).format(e)}var JL=/\{(?!sound:)(\w+(?:\.\w+)*)(=)?(?:!([sra]))?(?::([^{}]*))?\}/g;function YL(e){let t=[];JL.lastIndex=0;let n=0,r;for(;(r=JL.exec(e))!==null;){r.index>n&&t.push(e.slice(n,r.index));let i=r[1],a=r[3],o=r[4];t.push({raw:r[0],token:i,debug:r[2]===`=`,conv:a,spec:o}),n=r.index+r[0].length}return n<e.length&&t.push(e.slice(n)),t}function XL(e){return`${e.debug?`=`:``}${e.conv?`!${e.conv}`:``}${e.spec===void 0?``:`:${e.spec}`}`}function ZL(e,t){let n=new Map,r=new Map;for(let t of YL(e))typeof t!=`string`&&n.set(t.token,XL(t));for(let e of YL(t))typeof e!=`string`&&r.set(e.token,XL(e));return{missing:[...n.keys()].filter(e=>!r.has(e)),extra:[...r.keys()].filter(e=>!n.has(e)),changed:[...n].flatMap(([e,t])=>{let n=r.get(e);return n!==void 0&&n!==t?[{token:e,base:t,target:n}]:[]})}}var QL=/^(?:(.)?([<>=^]))?([+\- ])?(z)?(#)?(0)?(\d+)?([,_])?(?:\.(\d+))?([bcdeEfFgGnosxX%])?$/,$L={b:2,o:8,x:16,X:16},eR={b:`0b`,o:`0o`,x:`0x`,X:`0X`},tR=new Set([`f`,`F`,`e`,`E`,`g`,`G`,`%`,`n`]);function nR(e){return Number.isNaN(e)?`nan`:e===1/0?`inf`:e===-1/0?`-inf`:Object.is(e,-0)?`-0.0`:String(e)}function rR(e,t,n=3,r=`\\d`){return e.replace(RegExp(`\\B(?=(${r}{${n}})+(?!${r}))`,`g`),t)}function iR(e,t){let n=/^(\d+)/.exec(e);return n?rR(n[1],t)+e.slice(n[1].length):e}function aR(e,t,n,r){if(e.length>=t)return e;let i=n.repeat(t-e.length);return r===`<`?e+i:r===`^`?i.slice(0,Math.floor(i.length/2))+e+i.slice(Math.floor(i.length/2)):i+e}function oR(e){return e.replace(/([eE][+-])(\d)$/,`$10$2`)}function sR(e,t,n,r,i){let a=t===0?1:t;if(e===0)return r?`0.${`0`.repeat(a-1)}`:`0`;let o=Math.floor(Math.log10(e)),s;return o>=-4&&o<(i??a)?(s=e.toFixed(a-1-o),r||(s=s.replace(/(\.\d*?)0+$/,`$1`).replace(/\.$/,``))):(s=oR(e.toExponential(a-1)),r||(s=s.replace(/(\.\d*?)0+(e|$)/,`$1$2`).replace(/\.e/i,`e`))),n?s.toUpperCase():s}function cR(e){let t=`,`,n=`.`;for(let r of new Intl.NumberFormat(e).formatToParts(1000.5))r.type===`group`&&(t=r.value),r.type===`decimal`&&(n=r.value);return{group:t,decimal:n}}function lR(e,t,n,r,i,a){return aR(a===void 0?e:e.slice(0,a),i,t??(r?`0`:` `),n??`<`)}function uR(e,t,n=`en`){if(t===``)return typeof e==`number`?nR(e):e;let r=QL.exec(t);if(!r)return;let[i,a,o,s,c,l,u,d,f,p]=r.slice(1),m=f===void 0?void 0:Number(f),h=u===void 0?0:Number(u);if(typeof e==`string`)return o||s||c||d||a===`=`||p!==void 0&&p!==`s`?void 0:lR(e,i,a,l,h,m);if(p===`s`)return;if(p===`c`){if(o||c||l||d||m!==void 0)return;let t=Math.trunc(e);return t<0||t>1114111?void 0:aR(String.fromCodePoint(t),h,i??` `,a??`>`)}if(!Number.isFinite(e)){if(p!==void 0&&!tR.has(p))return;let t=Number.isNaN(e)?`nan`:`inf`;return(p===`F`||p===`E`||p===`G`)&&(t=t.toUpperCase()),p===`%`&&(t+=`%`),aR((e<0?`-`:o===`+`?`+`:o===` `?` `:``)+t,h,i??` `,a??`>`)}let g=e<0||Object.is(e,-0);s&&e===0&&(g=!1);let _=Math.abs(e),v=d===`,`?`,`:d===`_`?`_`:``,y;if(p===void 0){if(m!==void 0){if(Number.isInteger(_))return;y=sR(_,m,!1,!!c,m-1)}else y=nR(_);v&&(y=iR(y,v))}else if(p===`d`){if(m!==void 0||!Number.isInteger(_))return;y=String(Math.trunc(_)),v&&(y=rR(y,v))}else if(p in $L){if(m!==void 0||!Number.isInteger(_)||d===`,`)return;y=Math.trunc(_).toString($L[p]),p===`X`&&(y=y.toUpperCase()),v&&(y=rR(y,v,4,`[0-9a-fA-F]`)),c&&(y=eR[p]+y)}else if(p===`n`){if(d||m!==void 0&&Number.isInteger(_))return;if(Number.isInteger(_))y=new Intl.NumberFormat(n).format(Math.trunc(_));else{let{group:e,decimal:t}=cR(n),r=sR(_,m??6,!1,!!c),i=r.split(`e`)[0],a=r.slice(i.length);y=iR(i,e).replace(`.`,t)+a}}else if(p===`f`||p===`F`)y=_.toFixed(m??6),v&&(y=iR(y,v));else if(p===`e`||p===`E`)y=oR(_.toExponential(m??6)),p===`E`&&(y=y.toUpperCase()),v&&(y=iR(y,v));else if(p===`g`||p===`G`)y=sR(_,m??6,p===`G`,!!c),v&&(y=iR(y,v));else{let e=_*100;y=(Number.isFinite(e)?e.toFixed(m??6):`inf`)+`%`,v&&Number.isFinite(e)&&(y=iR(y,v))}let b=g?`-`:o===`+`?`+`:o===` `?` `:``,x=i??(l&&!a?`0`:` `),S=a??(l&&!a?`=`:`>`);return S===`=`?b+aR(y,h-b.length,x,`>`):aR(b+y,h,x,S)}function dR(e,t){let n=new Set(Object.keys(e.messages)),r=new Set(Object.keys(t.messages));return{missing:[...n].filter(e=>!r.has(e)),extra:[...r].filter(e=>!n.has(e))}}function fR(e){let t=[];for(let[n,r]of Object.entries(e.messages))typeof r==`string`?r===``&&t.push({key:n,kind:`empty-message`,detail:`message resolves to an empty string`}):pR(r)&&r.other===void 0&&t.push({key:n,kind:`plural-missing-other`,detail:`plural forms have no "other" branch`});return t}function pR(e){return typeof e==`object`&&!!e&&!(`format`in e)}function mR(e){let t=[];for(let[n,r]of Object.entries(e.messages))n.endsWith(`.audio`)&&(typeof r==`string`?r===``&&t.push({key:n,kind:`empty-audio-path`,detail:`an empty audio entry already means "no sound"; remove the key instead`}):t.push({key:n,kind:`audio-not-a-path`,detail:`an audio entry must be a plain path string, not plural forms or a select message`}));return t}function hR(e){if(typeof e==`string`)return e;if(typeof e==`object`&&e&&`format`in e)try{return e.format()}catch{return``}let t=e;return t.other??Object.values(t)[0]??``}function gR(e,t){if(e===t)return 0;if(e.length===0)return t.length;if(t.length===0)return e.length;let n=Array.from({length:t.length+1},(e,t)=>t),r=Array(t.length+1);for(let i=1;i<=e.length;i++){r[0]=i;for(let a=1;a<=t.length;a++){let o=e[i-1]===t[a-1]?0:1;r[a]=Math.min(n[a]+1,r[a-1]+1,n[a-1]+o)}[n,r]=[r,n]}return n[t.length]}function _R(e,t=.8){let n=Object.entries(e.messages).map(([e,t])=>[e,hR(t)]).filter(([,e])=>e.length>0),r=[];for(let e=0;e<n.length;e++)for(let i=e+1;i<n.length;i++){let[a,o]=n[e],[s,c]=n[i],l=Math.max(o.length,c.length),u=gR(o,c),d=l===0?1:1-u/l;d>=t&&r.push({a,b:s,distance:u,similarity:d})}return r.sort((e,t)=>t.similarity-e.similarity)}function vR(e,t){let n=new Set(t),r=Object.keys(e.messages),i=r.filter(e=>!n.has(e));return{totalKeys:r.length,usedKeys:r.length-i.length,unusedKeys:i}}function yR(e,t){let n=Object.keys(e.messages);if(n.length===0)return 1;let{missing:r}=dR(e,t);return(n.length-r.length)/n.length}function bR(e){let t={},n=0;for(let r of Object.values(e.messages))if(!(typeof r==`string`||typeof r==`object`&&r&&`format`in r)){n++;for(let e of Object.keys(r))t[e]=(t[e]??0)+1}return{pluralKeys:n,formsPresent:t}}function xR(e,t,n){if(!(t in e.messages))throw Error(`mergeCatalogKeys: "${t}" is not a key in this catalog`);if(!(n in e.messages))throw Error(`mergeCatalogKeys: "${n}" is not a key in this catalog`);if(t===n)throw Error(`mergeCatalogKeys: survivingKey and mergedKey must be different keys`);let r={...e.messages};return delete r[n],{...e,messages:r}}function SR(e,t){return{base:e,target:t}}var CR=`.audio`;function wR(e){return e.endsWith(CR)}function TR(e){return[...new Set([...Object.keys(e.base.messages),...Object.keys(e.target.messages)])].filter(e=>!wR(e)).sort()}function ER(e){if(e===void 0)return;let t=hR(e);return t===``?void 0:t}var DR=[`log`,`compact`,`accessibility`,`debug`];function OR(e){let t=e.lastIndexOf(`.`);if(!(t<=0||!DR.includes(e.slice(t+1))))return`${e.slice(0,t)}${CR}`}function kR(e,t){let n=e.base.messages[t],r=e.target.messages[t],i=n!==void 0&&r!==void 0?`ok`:n===void 0?`extra`:`missing`,a=[`${t}${CR}`],o=OR(t);o&&a.push(o);let s,c,l=!1;for(let t of a){let n=ER(e.target.messages[t]);if(n!==void 0){s=n,c=t;break}let r=ER(e.base.messages[t]);if(r!==void 0){s=r,c=t,l=!0;break}}return{key:t,baseText:n===void 0?``:hR(n),targetText:r===void 0?``:hR(r),status:i,sound:s,soundKey:c,soundInherited:l}}function AR(e,t){let n=`${t}${CR}`;return n in e.target.messages||n in e.base.messages?n:OR(t)??n}function jR(e,t={}){let n=t.query?.toLowerCase()??``;return TR(e).map(t=>kR(e,t)).filter(e=>!t.missingOnly||e.status===`missing`).filter(e=>n===``||e.key.toLowerCase().includes(n)||e.baseText.toLowerCase().includes(n)||e.targetText.toLowerCase().includes(n))}function MR(e,t,n){let r=e.target.messages[t]??e.base.messages[t],i=n;if(r!==void 0&&typeof r==`object`&&!(`format`in r))try{let e=JSON.parse(n);typeof e==`object`&&e&&!Array.isArray(e)&&(i=e)}catch{}return{...e,target:{...e.target,messages:{...e.target.messages,[t]:i}}}}function NR(e,t){let n=e.base.messages[t];if(n===void 0)throw Error(`copyFromBase: "${t}" is not a key in the base catalog`);return{...e,target:{...e.target,messages:{...e.target.messages,[t]:n}}}}function PR(e,t){if(!(t in e.target.messages))throw Error(`deleteTargetKey: "${t}" is not a key in the target catalog`);let n={...e.target.messages};return delete n[t],{...e,target:{...e.target,messages:n}}}function FR(e,t,n){let r={...e.target.messages},i=AR(e,t);return n===``?delete r[i]:r[i]=n,{...e,target:{...e.target,messages:r}}}function IR(e){let t=e=>({...e,messages:Object.fromEntries(Object.entries(e.messages).filter(([e])=>!wR(e)))});return yR(t(e.base),t(e.target))}function LR(e){return{base:e.target,target:e.base}}var RR=l({AUDIO_SUFFIX:()=>CR,catalogCompleteness:()=>yR,catalogUsage:()=>vR,copyFromBase:()=>NR,createCatalogFormatter:()=>WL,createEditSession:()=>SR,cueKeyFor:()=>AR,deleteTargetKey:()=>PR,diffCatalogKeys:()=>dR,diffPlaceholders:()=>ZL,direction:()=>KR,findSimilarMessages:()=>_R,formatDate:()=>KL,formatList:()=>qL,formatNumber:()=>GL,formatSpec:()=>uR,has:()=>az,isAudioKey:()=>wR,levenshteinDistance:()=>gR,locale:()=>GR,mergeCatalogKeys:()=>xR,messageText:()=>hR,nonBreakingUnit:()=>tz,parseFTL:()=>PL,parsePo:()=>LL,parseSoundMarkers:()=>HL,pluralFormCoverage:()=>bR,reset:()=>pz,sessionCompleteness:()=>IR,sessionKeys:()=>TR,sessionRow:()=>kR,sessionRows:()=>jR,setActive:()=>WR,setBase:()=>UR,setTargetSound:()=>FR,setTargetText:()=>MR,stripSoundMarkers:()=>UL,swapSession:()=>LR,t:()=>JR,tRaw:()=>qR,tokenizeMessage:()=>YL,typographic:()=>ez,validateCatalog:()=>fR,validateMessageAudio:()=>mR}),zR=null,BR=null,VR=null,HR=null;function UR(e){zR=e}function WR(e){BR=e,VR=e?new Intl.PluralRules(e.locale):null}function GR(){return(BR??zR)?.locale??`en`}function KR(){return(BR??zR)?.direction??`ltr`}function qR(e,t){let n=BR?.messages[e]??zR?.messages[e];if(n===void 0)return e;let r=typeof n==`string`?n:sz(n)?n.format(t):oz(n,t?.count);return t?cz(r,t):r}function JR(e,t){if(!az(e))return e;let n=qR(e,t),r=(BR??zR)?.typography===!1?n:ez(n,GR());return KR()===`rtl`?`${r}`:r}var YR=` `,XR=`\xA0`,ZR=[`Chapitre`,`Tome`,`Livre`,`Partie`,`Section`,`Article`,`Acte`,`Scène`,`Niveau`,`Manche`,`Round`,`Étape`,`Volume`,`Figure`,`Page`,`Numéro`],QR=[`Nr`,`Dr`,`Bd`,`Kap`,`Art`,`Abb`,`Str`,`Tel`],$R=[`kg`,`g`,`mg`,`t`,`km`,`m`,`cm`,`mm`,`l`,`ml`,`h`,`min`,`s`,`%`,`°C`,`€`];function ez(e,t=GR()){let n=t.split(`-`)[0].toLowerCase(),r=e;return(n===`fr`||n===`it`||n===`nl`)&&(r=r.replace(/([\p{L}])'(?=[\p{L}])/gu,`$1’`)),n===`fr`&&(r=nz(r)),n===`de`&&(r=rz(r)),r}function tz(e,t,n=GR()){let r=n.split(`-`)[0].toLowerCase();return`${e}${r===`fr`?YR:r===`de`?XR:` `}${t}`}function nz(e){let t=e.replace(/\s?([;!?])/g,`${YR}$1`).replace(/«\s?/g,`«${YR}`).replace(/\s?»/g,`${YR}»`);t=t.replace(/(?<!\{soun)(\p{L})\s?:/gu,`$1${YR}:`);let n=RegExp(`\\b(${ZR.join(`|`)})\\s+(?=\\d)`,`g`);return t.replace(n,`$1${XR}`)}function rz(e){let t=RegExp(`(\\d)\\s+(?=(?:${$R.map(iz).join(`|`)})(?![\\p{L}\\p{N}]))`,`gu`),n=RegExp(`\\b(${QR.join(`|`)})\\.\\s+`,`g`);return e.replace(t,`$1${XR}`).replace(n,`$1.${XR}`)}function iz(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function az(e){return BR?.messages[e]!==void 0||zR?.messages[e]!==void 0}function oz(e,t){return t===void 0?e.other??Object.values(e)[0]??``:e[(VR??(HR??=new Intl.PluralRules(`en`))).select(t)]??e.other??``}function sz(e){return`format`in e}function cz(e,t){return YL(e).map(e=>typeof e==`string`?e:uz(e,t)).join(``)}function lz(e,t){let n=e[t];if(typeof n==`string`||typeof n==`number`)return n;let r=e;for(let e of t.split(`.`)){if(typeof r!=`object`)return;r=r[e]}return typeof r==`string`||typeof r==`number`?r:void 0}function uz(e,t){let n=lz(t,e.token);if(n===void 0)return e.raw;try{let t=e.conv===void 0?n:dz(n,e.conv),r=e.spec===void 0?String(t):uR(t,e.spec,GR());return r===void 0?e.raw:e.debug?`${e.token}=${r}`:r}catch{return e.raw}}function dz(e,t){if(t===`s`)return String(e);if(typeof e==`number`){let n=uR(e,``,`en`)??String(e);return t===`a`?fz(n):n}let n=`'${e.replace(/\\/g,`\\\\`).replace(/'/g,`\\'`).replace(/\n/g,`\\n`).replace(/\r/g,`\\r`).replace(/\t/g,`\\t`)}'`;return t===`a`?fz(n):n}function fz(e){let t=``;for(let n of e){let e=n.codePointAt(0)??0;t+=e>127?e>65535?`\\U${e.toString(16).padStart(8,`0`)}`:`\\u${e.toString(16).padStart(4,`0`)}`:n}return t}function pz(){zR=null,BR=null,VR=null}var mz=class extends TL{constructor(e){super({width:e.width,height:e.height,modal:!0,closable:!1,dims:e.dims,blocker:e.blocker??!0,anchor:e.anchor??`bottom`}),this.pageIndex=0,this.reveal=wI(0),this.pageText=``,this.pageCues=[],this.nextCue=0,this.portrait=null,this.portraitLayer=new J,this.choiceList=null,this.finished=!1,this.autoAdvanceElapsed=0,this.messageThemeListener=()=>this.restyleMessage(),this.pages=e.pages.map(e=>typeof e==`string`?{text:e}:e),this.speed=e.speed??40,this.mode=e.mode??`adv`,this.autoAdvance=e.autoAdvance,this.choices=e.choices??[],this.onDone=e.onDone??null,this.onSound=e.onSound??null,this.announce=e.announce??!0;let t=Q();this.content.addChild(this.portraitLayer),this.speakerLabel=new OI({color:t.color.textHighlight,bold:!0}),this.content.addChild(this.speakerLabel),this.body=new OI({wrapWidth:this.contentWidth}),this.content.addChild(this.body),this.prompt=new OI({text:`▼`,color:t.color.textDim}),this.prompt.visible=!1,this.content.addChild(this.prompt),this.showPage(0),$.add(this.messageThemeListener)}restyleMessage(){let e=Q();this.speakerLabel.setColor(e.color.textHighlight),this.prompt.setColor(e.color.textDim)}destroy(e){$.remove(this.messageThemeListener),super.destroy(e)}showPage(e){let t=this.pages[e],n=Q(),r=n.direction===`rtl`;this.portraitLayer.removeChildren(),this.portrait=null;let i=0,a=this.contentWidth;t.portrait&&(this.portrait=new wl(t.portrait),r&&(this.portrait.x=this.contentWidth-this.portrait.width),this.portraitLayer.addChild(this.portrait),a=this.contentWidth-this.portrait.width-n.padding,i=r?0:this.portrait.width+n.padding),this.speakerLabel.visible=this.mode===`adv`&&t.speaker!==void 0,this.speakerLabel.x=i,this.speakerLabel.setText(t.speaker??``),this.body.x=i,this.body.y=this.mode===`adv`&&t.speaker!==void 0?this.speakerLabel.height+n.spacing:0,this.body.style.wordWrapWidth=Math.max(16,a);let o=HL(t.text);this.pageText=o.text,this.pageCues=o.cues,this.nextCue=0,this.announce&&wL.announce(t.speaker===void 0?this.pageText:`${t.speaker}: ${this.pageText}`),this.reveal=wI(this.pageText.length,this.speed),this.autoAdvanceElapsed=0,this.playRevealedSounds(),this.renderBody(),this.prompt.visible=!1,this.prompt.x=r?0:this.contentWidth-this.prompt.width,this.prompt.y=this.contentHeight-this.prompt.height}renderBody(){if(this.mode===`adv`){this.body.setText(this.pageText.slice(0,Math.floor(this.reveal.revealed)));return}let e=this.pages.slice(0,this.pageIndex).map(e=>this.formatLine(e,HL(e.text).text)),t=this.pages[this.pageIndex];e.push(this.formatLine(t,this.pageText.slice(0,Math.floor(this.reveal.revealed)))),this.body.setText(e.join(`
|
|
1376
1376
|
|
|
1377
|
-
`))}formatLine(e,t){return e.speaker===void 0?t:`${e.speaker}: ${t}`}playRevealedSounds(){let e=Math.floor(this.reveal.revealed);for(;this.nextCue<this.pageCues.length&&this.pageCues[this.nextCue].index<=e;)this.onSound?.(this.pageCues[this.nextCue].path),this.nextCue++}get pageComplete(){return
|
|
1377
|
+
`))}formatLine(e,t){return e.speaker===void 0?t:`${e.speaker}: ${t}`}playRevealedSounds(){let e=Math.floor(this.reveal.revealed);for(;this.nextCue<this.pageCues.length&&this.pageCues[this.nextCue].index<=e;)this.onSound?.(this.pageCues[this.nextCue].path),this.nextCue++}get pageComplete(){return DI(this.reveal)}update(e){this.finished||(this.pageComplete?(this.prompt.visible=!this.choiceList,!(this.autoAdvance===void 0||this.choiceList)&&(this.autoAdvanceElapsed+=e,this.autoAdvanceElapsed>=this.autoAdvance&&(this.autoAdvanceElapsed=0,this.advance()))):(TI(this.reveal,e),this.playRevealedSounds(),this.renderBody()))}handleAction(e){return this.delegate?super.handleAction(e):e===`confirm`?this.pageComplete?(this.advance(),!0):(EI(this.reveal),this.playRevealedSounds(),this.renderBody(),!0):!1}advance(){this.pageIndex<this.pages.length-1?(this.pageIndex++,this.showPage(this.pageIndex)):this.choices.length>0?this.showChoices():this.finish(void 0)}showChoices(){let e=Q(),t=this.choices.map(e=>({text:e.text,disabled:e.disabled,value:e.value??e.text}));this.announce&&wL.announce(this.choices.map(e=>e.text).join(`, `));let n=Math.ceil(e.font.size*e.font.lineHeight)+e.spacing,r=t.length*n,i=this.body.y+this.body.height+e.padding,a=i+r-this.contentHeight;a>0&&this.grow(a),this.choiceList=new jL({width:this.contentWidth,height:r,items:t,onSelect:e=>this.finish(e.value)}),this.choiceList.y=i,this.content.addChild(this.choiceList),this.delegate=this.choiceList,this.prompt.visible=!1}grow(e){let t=this.getLocalBounds();this.resize(t.width,t.height+e),this.y=Math.max(0,this.y-e)}finish(e){this.finished||(this.finished=!0,this.onDone?.(e),this.close())}},hz=class{constructor(e={}){this.goalColumn=null,this.multiline=e.multiline??!1,this.text=this.limit(this.shape(e.value??``)),this.maxLength=e.maxLength,this.mask=e.mask??!1,this.maskCharacter=e.maskCharacter??`•`,this.caretIndex=this.text.length,this.anchor=this.caretIndex}get value(){return this.text}get maskedValue(){return this.mask?this.text.split(``).map(e=>e===`
|
|
1378
1378
|
`?`
|
|
1379
1379
|
`:this.maskCharacter).join(``):this.text}get length(){return this.text.length}get caret(){return this.caretIndex}get selectionStart(){return Math.min(this.caretIndex,this.anchor)}get selectionEnd(){return Math.max(this.caretIndex,this.anchor)}get hasSelection(){return this.caretIndex!==this.anchor}get selectedText(){return this.text.slice(this.selectionStart,this.selectionEnd)}setValue(e){this.text=this.limit(this.shape(e)),this.caretIndex=this.text.length,this.anchor=this.caretIndex,this.goalColumn=null}setCaret(e,t=!1){this.caretIndex=Math.max(0,Math.min(this.text.length,e)),this.goalColumn=null,t||(this.anchor=this.caretIndex)}insert(e){e.length!==0&&this.replaceSelection(e)}backspace(){this.hasSelection?this.replaceSelection(``):this.caretIndex!==0&&(this.text=this.text.slice(0,this.caretIndex-1)+this.text.slice(this.caretIndex),this.setCaret(this.caretIndex-1))}deleteForward(){this.hasSelection?this.replaceSelection(``):this.caretIndex>=this.text.length||(this.text=this.text.slice(0,this.caretIndex)+this.text.slice(this.caretIndex+1),this.setCaret(this.caretIndex))}moveCaret(e,t=!1){this.setCaret(this.caretIndex+e,t)}moveToStart(e=!1){this.setCaret(0,e)}moveToEnd(e=!1){this.setCaret(this.text.length,e)}selectAll(){this.anchor=0,this.caretIndex=this.text.length,this.goalColumn=null}clearSelection(){this.anchor=this.caretIndex}replaceSelection(e){let t=this.selectionStart,n=this.selectionEnd,r=this.text.slice(0,t)+this.text.slice(n),i=this.shape(e),a=this.maxLength!==void 0&&r.length+i.length>this.maxLength?i.slice(0,Math.max(0,this.maxLength-r.length)):i;this.text=this.text.slice(0,t)+a+this.text.slice(n),this.setCaret(t+a.length)}shape(e){return e.replace(/\r\n|\r|\n/g,this.multiline?`
|
|
1380
1380
|
`:``)}get lineCount(){return this.multiline?this.text.split(`
|
|
1381
1381
|
`).length:1}get caretLine(){return this.text.slice(0,this.caretIndex).split(`
|
|
1382
1382
|
`).length-1}lineRange(e){let t=Math.max(0,Math.min(this.lineCount-1,e)),n=0;for(let e=0;e<t;e++)n=this.text.indexOf(`
|
|
1383
1383
|
`,n)+1;let r=this.text.indexOf(`
|
|
1384
|
-
`,n);return[n,r===-1?this.text.length:r]}moveCaretLine(e,t=!1){let[n]=this.lineRange(this.caretLine),r=this.goalColumn??this.caretIndex-n,[i,a]=this.lineRange(this.caretLine+e);this.setCaret(i+Math.min(r,a-i),t),this.goalColumn=r}limit(e){return this.maxLength!==void 0&&e.length>this.maxLength?e.slice(0,this.maxLength):e}},
|
|
1385
|
-
`){o++,s=0;continue}s*n>=r&&(o++,s=0);let e=i.test(t),c=o===0?0:-o*n;a.push({char:t,x:e?c-n/2:c,y:e?s*n+n/2:s*n,rotate:e}),s++}return a}var xz=class extends J{constructor(e){super(),this.themeListener=e=>this.build(e),this.opts=e,this.build(Q()),$.add(this.themeListener)}build(e){this.removeChildren().forEach(e=>e.destroy());let t=this.opts.size??e.font.size,n=Math.ceil(t*e.font.lineHeight),r=bz(this.opts.text,{lineHeight:n,columnHeight:this.opts.columnHeight,rotate:this.opts.rotate});for(let n of r){let r=new jA({text:n.char,style:{fontFamily:e.font.family,fontSize:t,fill:this.opts.color??e.color.text}});n.rotate&&(r.anchor.set(.5),r.rotation=Math.PI/2),r.x=n.x,r.y=n.y,this.addChild(r)}}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function Sz(e,t=0,n=1){return n>t?Math.max(0,Math.min(1,(e-t)/(n-t))):0}function Cz(e,t=0,n=1,r=0){let i=t+Math.max(0,Math.min(1,e))*(n-t);if(!(r>0))return i;let a=(String(r).split(`.`)[1]??``).length,o=t+Math.round((i-t)/r)*r;return Number(Math.max(t,Math.min(n,o)).toFixed(a))}var wz=class extends J{constructor(e){super(),this.onChange=new p,this.track=new Z,this.fill=new Z,this.knob=new Z,this.dragging=!1,this.themeListener=()=>this.draw(),this.handleDown=e=>{this.disabled_||(this.dragging=!0,this.setFraction(this.fractionAt(this.toLocal(e.global).x)))},this.handleMove=e=>{this.dragging&&!this.disabled_&&this.setFraction(this.fractionAt(this.toLocal(e.global).x))},this.handleUp=()=>{this.dragging=!1},this.width_=e.width,this.height_=e.height??6,this.knobSize=e.knobSize??Math.max(12,this.height_*2),this.min=e.min??0,this.max=e.max??1,this.step=e.step??0,this.value_=this.snap(e.value??this.min),this.disabled_=e.disabled??!1,this.addChild(this.track),this.addChild(this.fill),this.addChild(this.knob),this.draw(),this.eventMode=`static`,this.cursor=`pointer`,this.on(`pointerdown`,this.handleDown),this.on(`pointermove`,this.handleMove),this.on(`pointerup`,this.handleUp),this.on(`pointerupoutside`,this.handleUp),$.add(this.themeListener)}get value(){return this.value_}get fraction(){return Sz(this.value_,this.min,this.max)}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.cursor=e?`default`:`pointer`,this.draw()}setValue(e){let t=this.snap(e);t===this.value_?this.draw():(this.value_=t,this.draw(),this.onChange.dispatch(t))}setFraction(e){this.setValue(Cz(e,this.min,this.max,this.step))}resize(e,t){this.width_=e,this.height_=t,this.draw()}get trackLength(){return Math.max(0,this.width_-this.knobSize)}snap(e){return Cz(Sz(e,this.min,this.max),this.min,this.max,this.step)}fractionAt(e){return this.trackLength>0?Math.max(0,Math.min(1,(e-this.knobSize/2)/this.trackLength)):0}draw(){let e=Q(),t=this.disabled_?e.color.textDim:e.color.textHighlight,n=e.color.panelFill,r=(this.knobSize-this.height_)/2;this.track.clear().roundRect(0,r,this.width_,this.height_,this.height_/2).fill({color:n});let i=this.knobSize/2+this.fraction*this.trackLength;this.fill.clear(),i>this.knobSize/2&&this.fill.roundRect(this.knobSize/2,r,i-this.knobSize/2,this.height_,this.height_/2).fill({color:t}),this.knob.clear().circle(i,this.knobSize/2,this.knobSize/2).fill({color:t})}destroy(e){$.remove(this.themeListener),super.destroy(e)}},Tz=class extends J{constructor(e={}){super(),this.onChange=new p,this.box=new Z,this.themeListener=()=>this.draw(),this.handleTap=()=>{this.disabled_||this.toggle()},this.size_=e.size??20,this.checked_=e.checked??!1,this.disabled_=e.disabled??!1,this.addChild(this.box),this.draw(),this.eventMode=`static`,this.cursor=`pointer`,this.on(`pointertap`,this.handleTap),$.add(this.themeListener)}get checked(){return this.checked_}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.cursor=e?`default`:`pointer`,this.draw()}setChecked(e){e===this.checked_?this.draw():(this.checked_=e,this.draw(),this.onChange.dispatch(e))}toggle(){this.setChecked(!this.checked_)}resize(e){this.size_=e,this.draw()}draw(){let e=Q(),t=this.disabled_?e.color.textDim:e.color.textHighlight;if(this.box.clear().roundRect(0,0,this.size_,this.size_,4).fill({color:e.color.panelFill}).stroke({color:this.disabled_?e.color.textDim:e.color.panelBorder,width:2}),this.checked_){let e=this.size_*.25;this.box.moveTo(e,this.size_*.55).lineTo(this.size_*.45,this.size_-e).lineTo(this.size_-e,e).stroke({color:t,width:Math.max(2,this.size_*.12),cap:`round`,join:`round`})}}destroy(e){$.remove(this.themeListener),super.destroy(e)}},Ez=class extends J{constructor(e={}){super(),this.onChange=new p,this.options_=[],this.rows=[],this.circles=[],this.selected_=-1,this.themeListener=()=>this.draw(),this.size_=e.size??20,this.gap_=e.gap??8,this.buildRows(e.options??[]),this.selected_=this.defaultSelection(e.selected),this.draw(),$.add(this.themeListener)}get selected(){return this.selected_}get selectedOption(){return this.options_[this.selected_]??null}get length(){return this.options_.length}get rowHeight(){return this.size_+this.gap_}setOptions(e,t){this.buildRows(e),this.selected_=this.defaultSelection(t),this.draw()}select(e){let t=this.options_[e];t&&!t.disabled&&(e===this.selected_?this.draw():(this.selected_=e,this.draw(),this.onChange.dispatch(e)))}move(e){let t=this.options_.length;if(t===0)return!1;let n=this.selected_;for(let r=0;r<t;r++){n=(n+e+t)%t;let r=this.options_[n];if(r&&!r.disabled)return this.select(n),!0}return!1}handleAction(e){switch(e){case`up`:case`left`:return this.move(-1);case`down`:case`right`:return this.move(1);default:return!1}}tapRow(e){this.select(e)}defaultSelection(e){if(e!==void 0){let t=this.options_[e];if(t&&!t.disabled)return e}let t=this.options_.findIndex(e=>!e.disabled);return t===-1?-1:t}buildRows(e){for(let e of this.rows)e.destroy({children:!0});this.rows=[],this.circles=[],this.options_=[...e],this.removeChildren(),e.forEach((e,t)=>{let n=new J;n.y=t*this.rowHeight,n.eventMode=`static`,n.cursor=e.disabled?`default`:`pointer`,n.on(`pointertap`,()=>this.tapRow(t));let r=new Z;n.addChild(r),this.circles.push(r);let i=new EI({text:e.text});n.addChild(i),this.rows.push(n),this.addChild(n)})}draw(){let e=Q(),t=e.direction===`rtl`;this.rows.forEach((n,r)=>{let i=this.options_[r].disabled,a=this.circles[r];a.clear().circle(this.size_/2,this.size_/2,this.size_/2-1).fill({color:e.color.panelFill}).stroke({color:i?e.color.textDim:e.color.panelBorder,width:2}),r===this.selected_&&a.circle(this.size_/2,this.size_/2,Math.max(2,this.size_*.28)).fill({color:i?e.color.textDim:e.color.textHighlight});let o=this.size_+e.spacing,s=n.children.find(e=>e instanceof EI),c=s?.width??0;s&&(s.setColor(i?e.color.textDim:e.color.text),s.y=Math.round((this.size_-s.height)/2)),t?(s&&(s.x=0),a.x=c+e.spacing):(a.x=0,s&&(s.x=o))})}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function Dz(e,t,n,r,i=1,a=!1){if(!(r>n))return n;let o=i>0?i:1,s=(String(o).split(`.`)[1]??``).length,c=Math.round((e-n)/o)+Math.round(t),l=Math.round((r-n)/o)+1,u=c;return u=a?(u%l+l)%l:Math.max(0,Math.min(l-1,u)),Number((n+u*o).toFixed(s))}var Oz=class extends J{constructor(e={}){super(),this.onChange=new p,this.face=new Z,this.themeListener=()=>this.draw(),this.handleTap=e=>{this.disabled_||(this.toLocal(e.global).y<this.height_/2?this.increment():this.decrement())},this.width_=e.width??24,this.height_=e.height??32,this.min=e.min??0,this.max=e.max??9,this.step=e.step??1,this.wrap=e.wrap??!1,this.disabled_=e.disabled??!1,this.value_=Dz(e.value??this.min,0,this.min,this.max,this.step,!1),this.addChild(this.face),this.draw(),this.eventMode=`static`,this.cursor=`pointer`,this.on(`pointertap`,this.handleTap),$.add(this.themeListener)}get value(){return this.value_}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.cursor=e?`default`:`pointer`,this.draw()}setValue(e){this.commit(Dz(e,0,this.min,this.max,this.step,this.wrap))}increment(){this.commit(Dz(this.value_,1,this.min,this.max,this.step,this.wrap))}decrement(){this.commit(Dz(this.value_,-1,this.min,this.max,this.step,this.wrap))}resize(e,t){this.width_=e,this.height_=t,this.draw()}commit(e){e===this.value_?this.draw():(this.value_=e,this.draw(),this.onChange.dispatch(e))}draw(){let e=Q(),t=this.disabled_?e.color.textDim:e.color.textHighlight;this.face.clear().roundRect(0,0,this.width_,this.height_,4).fill({color:e.color.panelFill}).stroke({color:e.color.panelBorder,width:1});let n=this.width_/2,r=Math.min(this.width_/4,this.height_/5);this.face.moveTo(n-r,r*1.6).lineTo(n,r*.6).lineTo(n+r,r*1.6).closePath().fill({color:t}),this.face.moveTo(n-r,this.height_-r*1.6).lineTo(n,this.height_-r*.6).lineTo(n+r,this.height_-r*1.6).closePath().fill({color:t})}destroy(e){$.remove(this.themeListener),super.destroy(e)}},kz=class{constructor(e){this.onChange=new p,this.open_=!1,this.options_=[...e.options],this.disabled_=e.disabled??!1;let t=e.selectedIndex??this.firstEnabled();this.current=this.options_[t]?.disabled?this.firstEnabled():t,this.highlight_=this.current}get options(){return this.options_}get selectedIndex(){return this.current}get selected(){return this.options_[this.current]??null}get isOpen(){return this.open_}get disabled(){return this.disabled_}get highlight(){return this.highlight_}setDisabled(e){this.disabled_=e,e&&(this.open_=!1)}setOptions(e){this.options_=[...e],this.current=this.firstEnabled(),this.highlight_=this.current,this.open_=!1}open(){this.disabled_||this.open_||(this.open_=!0,this.highlight_=this.current)}close(){this.open_=!1}toggleOpen(){this.open_?this.close():this.open()}move(e){if(!this.open_||this.options_.length===0)return;let t=this.options_.length,n=this.highlight_;for(let r=0;r<t;r++)if(n=((n+e)%t+t)%t,!this.options_[n].disabled){this.highlight_=n;return}}setHighlight(e){e<0||e>=this.options_.length||this.options_[e].disabled||(this.highlight_=e)}confirm(){if(!this.open_)return!1;let e=this.options_[this.highlight_];return!e||e.disabled?!1:(this.open_=!1,this.highlight_!==this.current&&(this.current=this.highlight_,this.onChange.dispatch({option:e,index:this.current})),!0)}cancel(){this.open_=!1,this.highlight_=this.current}firstEnabled(){let e=this.options_.findIndex(e=>!e.disabled);return e===-1?0:e}};function Az(e,t,n){return Math.max(0,Math.min(Math.max(0,t-n),e))}var jz=class{constructor(e=.92,t=8){this.velocity=0,this.dragging=!1,this.travelled=0,this.lastY=0,this.lastTime=0,this.friction=e,this.minSpeed=t}start(e,t){this.dragging=!0,this.velocity=0,this.travelled=0,this.lastY=e,this.lastTime=t}move(e,t){if(!this.dragging)return 0;let n=this.lastY-e,r=t-this.lastTime;return r>0&&(this.velocity=this.velocity*.4+n/r*.6),this.travelled+=Math.abs(n),this.lastY=e,this.lastTime=t,n}end(){this.dragging=!1,Math.abs(this.velocity)<this.minSpeed&&(this.velocity=0)}step(e){if(this.dragging||this.velocity===0)return 0;let t=this.velocity*e;return this.velocity*=(1-this.friction)**e,Math.abs(this.velocity)<this.minSpeed&&(this.velocity=0),t}stop(){this.velocity=0}},Mz=class extends J{constructor(e){super(),this.onChange=new p,this.content=new J,this.maskShape=new Z,this.track=new Z,this.thumb=new Z,this.dragMoved=!1,this.thumbGrab=null,this.themeListener=()=>this.draw(),this.handleWheel=e=>{this.scrollBy(e.deltaY)},this.width_=e.width,this.maxHeight_=e.height,this.auto=e.autoHeight??!1,this.lineHeight=e.lineHeight??24,this.drag=e.touch?new jz:null,this.contentHeight_=Math.max(0,e.contentHeight??0),this.height_=this.fit(),this.offset_=Az(e.offset??0,this.contentHeight_,this.height_),this.addChild(this.content),this.addChild(this.maskShape),this.addChild(this.track),this.addChild(this.thumb),this.content.mask=this.maskShape,this.eventMode=`static`,this.on(`wheel`,this.handleWheel),this.drag&&(this.on(`pointerdown`,e=>this.dragStart(e.global.y,performance.now()/1e3)),this.on(`globalpointermove`,e=>this.dragMove(e.global.y,performance.now()/1e3)),this.on(`pointerup`,()=>this.dragEnd()),this.on(`pointerupoutside`,()=>this.dragEnd()),this.on(`pointerupcapture`,e=>{this.dragMoved&&e.stopPropagation()})),this.track.eventMode=`static`,this.thumb.eventMode=`static`,this.thumb.on(`pointerdown`,e=>{e.stopPropagation(),this.thumbDragStart(e.global.y)}),this.thumb.on(`globalpointermove`,e=>this.thumbDragMove(e.global.y)),this.thumb.on(`pointerup`,()=>this.thumbGrab=null),this.thumb.on(`pointerupoutside`,()=>this.thumbGrab=null),this.track.on(`pointerdown`,e=>{e.stopPropagation(),this.scrollToThumbCentre(this.toLocal(e.global).y)}),this.draw(),$.add(this.themeListener)}get offset(){return this.offset_}get contentHeight(){return this.contentHeight_}get viewportHeight(){return this.height_}fit(){return this.auto?Math.min(this.maxHeight_,this.contentHeight_):this.maxHeight_}get maxOffset(){return Math.max(0,this.contentHeight_-this.height_)}get scrollable(){return this.maxOffset>0}setContentHeight(e){this.contentHeight_=Math.max(0,e),this.height_=this.fit(),this.setOffset(Az(this.offset_,this.contentHeight_,this.height_))}resize(e,t){this.width_=e,this.maxHeight_=t,this.height_=this.fit(),this.setOffset(Az(this.offset_,this.contentHeight_,this.height_))}scrollBy(e){this.setOffset(Az(this.offset_+e,this.contentHeight_,this.height_))}scrollTo(e){this.setOffset(Az(e,this.contentHeight_,this.height_))}scrollIntoView(e,t){e<this.offset_?this.scrollTo(e):e+t>this.offset_+this.height_&&this.scrollTo(e+t-this.height_)}handleKey(e){let t=Math.max(this.lineHeight,this.height_-this.lineHeight);switch(e){case`ArrowUp`:return this.scrollBy(-this.lineHeight),!0;case`ArrowDown`:return this.scrollBy(this.lineHeight),!0;case`PageUp`:return this.scrollBy(-t),!0;case`PageDown`:return this.scrollBy(t),!0;case`Home`:return this.scrollTo(0),!0;case`End`:return this.scrollTo(this.maxOffset),!0;default:return!1}}dragStart(e,t){this.drag?.start(e,t),this.dragMoved=!1}dragMove(e,t){let n=this.drag;if(!n?.dragging)return;let r=n.move(e,t);!this.dragMoved&&n.travelled<6||(this.dragMoved=!0,this.scrollBy(r))}dragEnd(){this.drag?.end()}get dragged(){return this.dragMoved}update(e){let t=this.drag;if(!t)return;let n=this.offset_;this.scrollBy(t.step(e)),this.offset_===n&&t.velocity!==0&&t.stop()}get thumbMetrics(){let e=Math.max(6,this.height_/Math.max(1,this.contentHeight_)*this.height_);return{y:this.maxOffset===0?0:this.offset_/this.maxOffset*(this.height_-e),height:e}}thumbDragStart(e){this.thumbGrab={y:e,offset:this.offset_}}thumbDragMove(e){if(!this.thumbGrab)return;let t=this.height_-this.thumbMetrics.height;t<=0||this.scrollTo(this.thumbGrab.offset+(e-this.thumbGrab.y)/t*this.maxOffset)}scrollToThumbCentre(e){let t=this.height_-this.thumbMetrics.height;t<=0||this.scrollTo((e-this.thumbMetrics.height/2)/t*this.maxOffset)}setOffset(e){e===this.offset_?this.draw():(this.offset_=e,this.draw(),this.onChange.dispatch(e))}draw(){let e=Q();if(this.content.y=-this.offset_,this.maskShape.clear().rect(0,0,this.width_,this.height_).fill({color:16777215}),this.track.clear(),this.thumb.clear(),!this.scrollable)return;let t=this.width_-6;this.track.roundRect(t,0,6,this.height_,3).fill({color:e.color.panelFill});let{y:n,height:r}=this.thumbMetrics;this.thumb.roundRect(t,n,6,r,3).fill({color:e.color.textHighlight})}destroy(e){$.remove(this.themeListener),super.destroy(e)}},Nz=class extends J{constructor(e){super(),this.list=new J,this.backdrop=new Z,this.box=null,this.listHeight=0,this.themeListener=()=>this.refresh(),this.model=new kz(e),this.rowHeight=e.rowHeight??28,this.maxRows=Math.max(1,e.maxVisibleRows??8),this.width_=e.autoWidth?Math.max(e.width,...this.model.options.map(e=>this.labelWidth(e.label))):e.width,this.head=new dz({width:this.width_,height:this.rowHeight,text:``,disabled:this.model.disabled,onClick:()=>{this.model.toggleOpen(),this.refresh()}}),this.list.y=this.rowHeight,this.list.addChild(this.backdrop),this.addChild(this.head,this.list),this.refresh(),$.add(this.themeListener)}measureLabel(e){try{let t=new aO({fontFamily:Q().font.family,fontSize:Q().font.size});return QD.measureText(e,t).width}catch{return e.length*Q().font.size*.6}}labelWidth(e){return Math.ceil(this.measureLabel(e))+2*Q().padding+16}get viewWidth(){return this.width_}get visibleRows(){return Math.min(this.maxRows,this.model.options.length)}get scroller(){return this.box}fitBelow(e,t){let n=Math.floor((t-e-this.rowHeight)/this.rowHeight);return Math.max(1,Math.min(this.maxRows,n))}refresh(){let e=this.model;if(this.head.setText(`${e.selected?.label??``} ▾`),this.head.setDisabled(e.disabled),this.box?.destroy({children:!0}),this.box=null,this.list.visible=e.isOpen,this.backdrop.clear(),!e.isOpen)return;let t=this.visibleRows;this.listHeight=t*this.rowHeight;let n=Q();this.backdrop.rect(0,0,this.width_,this.listHeight).fill({color:n.color.panelFill,alpha:1}).stroke({color:n.color.panelBorder,width:1});let r=new Mz({width:this.width_,height:this.listHeight,contentHeight:e.options.length*this.rowHeight,touch:!0,lineHeight:this.rowHeight}),i=this.width_-(r.scrollable?8:0);e.options.forEach((t,n)=>{let a=new dz({width:i,height:this.rowHeight,text:t.label,disabled:t.disabled,onClick:()=>{e.setHighlight(n),e.confirm(),this.refresh()}});a.y=n*this.rowHeight,a.setSelected(n===e.highlight),r.content.addChild(a)}),r.scrollIntoView(e.highlight*this.rowHeight,this.rowHeight),this.box=r,this.list.addChild(r)}handleKey(e){let t=this.model;if(t.disabled)return!1;if(!t.isOpen)return e!==`Enter`&&e!==` `&&e!==`ArrowDown`?!1:(t.open(),this.refresh(),!0);let n=t.options.length;switch(e){case`Escape`:t.cancel();break;case`Enter`:case` `:t.confirm();break;case`ArrowUp`:t.move(-1);break;case`ArrowDown`:t.move(1);break;case`PageUp`:t.setHighlight(Math.max(0,t.highlight-this.maxRows));break;case`PageDown`:t.setHighlight(Math.min(n-1,t.highlight+this.maxRows));break;case`Home`:t.setHighlight(0);break;case`End`:t.setHighlight(n-1);break;default:return!1}return this.refresh(),!0}handleOutsideClick(e,t){if(!this.model.isOpen)return!1;let n=this.toLocal(new Gi(e,t));return n.x>=0&&n.x<=this.width_&&n.y>=0&&n.y<=this.rowHeight+this.listHeight?!1:(this.model.cancel(),this.refresh(),!0)}destroy(e){$.remove(this.themeListener),super.destroy(e)}},Pz=class{constructor(e){this.onChange=new p,this.current=0,this.sortKey_=null,this.ascending=!0,this.columns_=[...e.columns],this.rows_=[...e.rows??[]],this.pageSize_=e.pageSize??0,this.disabledOf=e.disabled??(()=>!1),this.current=this.firstEnabled()}get columns(){return this.columns_}get rows(){return this.rows_}get pageSize(){return this.pageSize_}get sortKey(){return this.sortKey_}get sortAscending(){return this.ascending}get selectedIndex(){return this.current}get selected(){return this.rows_[this.current]??null}get page(){return this.pageSize_>0?Math.floor(this.current/this.pageSize_):0}get pageCount(){return this.pageSize_>0?Math.max(1,Math.ceil(this.rows_.length/this.pageSize_)):1}get pageRows(){if(this.pageSize_<=0)return this.rows_;let e=this.page*this.pageSize_;return this.rows_.slice(e,e+this.pageSize_)}setRows(e){this.rows_=[...e],this.current=this.firstEnabled(),this.onChange.dispatch()}setColumns(e){this.columns_=[...e],this.sortKey_&&!this.columns_.some(e=>e.key===this.sortKey_)&&(this.sortKey_=null),this.onChange.dispatch()}setPageSize(e){this.pageSize_=Math.max(0,e),this.onChange.dispatch()}sortBy(e){let t=this.columns_.find(t=>t.key===e);if(!t)return;this.sortKey_===e?this.ascending=!this.ascending:(this.sortKey_=e,this.ascending=!0);let n=t.compare??((t,n)=>Iz(Fz(t,e),Fz(n,e)));this.rows_.sort((e,t)=>(this.ascending?1:-1)*n(e,t)),this.current=this.firstEnabled(),this.onChange.dispatch()}select(e){e<0||e>=this.rows_.length||this.disabledOf(this.rows_[e])||(this.current=e,this.onChange.dispatch())}move(e){let t=this.rows_.length;if(t===0)return;let n=this.current;for(let r=0;r<t;r++){if(n+=e,n<0||n>=t)return;if(!this.disabledOf(this.rows_[n])){this.current=n,this.onChange.dispatch();return}}}setPage(e){if(this.pageSize_<=0)return;let t=Math.max(0,Math.min(this.pageCount-1,e))*this.pageSize_,n=Math.min(t+this.pageSize_,this.rows_.length);for(let e=t;e<n;e++)if(!this.disabledOf(this.rows_[e])){this.current=e,this.onChange.dispatch();return}}nextPage(e=1){this.setPage(this.page+e)}firstEnabled(){let e=this.rows_.findIndex(e=>!this.disabledOf(e));return e===-1?0:e}};function Fz(e,t){return e&&typeof e==`object`?e[t]:void 0}function Iz(e,t){return e===t?0:e===void 0?-1:t===void 0?1:typeof e==`number`&&typeof t==`number`?e-t:String(e).localeCompare(String(t))}var Lz=class{constructor(e){this.onChange=new p,this.expanded=new Set,this.current=0,this.roots_=e.roots;for(let t of e.expanded??[])this.expanded.add(t);this.disabledOf=e.disabled??(()=>!1),this.current=this.firstEnabled()}get roots(){return this.roots_}get rows(){let e=[],t=(n,r)=>{for(let i of n){let n=(i.children?.length??0)>0,a=n&&this.expanded.has(i.id);e.push({node:i,depth:r,expanded:a,hasChildren:n}),a&&t(i.children,r+1)}};return t(this.roots_,0),e}get selectedIndex(){return this.current}get selected(){return this.rows[this.current]?.node??null}isExpanded(e){return this.expanded.has(e)}expand(e){this.expanded.has(e)||(this.expanded.add(e),this.onChange.dispatch())}collapse(e){if(!this.expanded.has(e))return;let t=this.rows[this.current]?.node.id;if(this.expanded.delete(e),t!==void 0&&!this.rows.some(e=>e.node.id===t)){let t=this.rows.findIndex(t=>t.node.id===e);t>=0&&(this.current=t)}this.onChange.dispatch()}toggle(e){this.expanded.has(e)?this.collapse(e):this.expand(e)}expandAll(){let e=t=>{for(let n of t)n.children?.length&&(this.expanded.add(n.id),e(n.children))};e(this.roots_),this.onChange.dispatch()}collapseAll(){this.expanded.clear(),this.select(0),this.onChange.dispatch()}select(e){let t=this.rows[e];t&&!this.disabledOf(t.node)&&(this.current=e,this.onChange.dispatch())}move(e){let t=this.rows.length;if(t===0)return;let n=this.current;for(let r=0;r<t;r++){if(n+=e,n<0||n>=t)return;if(!this.disabledOf(this.rows[n].node)){this.current=n,this.onChange.dispatch();return}}}firstEnabled(){let e=this.rows.findIndex(e=>!this.disabledOf(e.node));return e===-1?0:e}};function Rz(e){switch(e){case`top`:case`bottom`:return{x:.5,y:e===`top`?0:1};case`left`:case`right`:return{x:e===`left`?0:1,y:.5};case`top-left`:return{x:0,y:0};case`top-right`:return{x:1,y:0};case`bottom-left`:return{x:0,y:1};case`bottom-right`:return{x:1,y:1};default:return{x:.5,y:.5}}}function zz(e,t,n={width:0,height:0}){let r=e.margin??0,i=t.x+r,a=t.y+r,o=Math.max(0,t.width-r*2),s=Math.max(0,t.height-r*2);if(e.anchor===`fill`){let t=i+(e.offsetX??0),n=a+(e.offsetY??0);return{x:t,y:n,width:e.width??Math.max(0,i+o-t),height:e.height??Math.max(0,a+s-n)}}let c=Rz(e.anchor??`center`),l=e.alignX??c.x,u=e.alignY??c.y,d=e.width??n.width,f=e.height??n.height;return{x:i+l*Math.max(0,o-d)+(e.offsetX??0),y:a+u*Math.max(0,s-f)+(e.offsetY??0),width:d,height:f}}var Bz=class{constructor(e){this.spec=e}get columns(){return this.spec.columns}get rows(){return this.spec.rows}columnSizes(e){return Vz(this.spec.columns,e,this.gap)}rowSizes(e){return Vz(this.spec.rows,e,this.gap)}rect(e,t,n,r={}){let i=this.columnSizes(n.width),a=this.rowSizes(n.height),o=r.columnSpan??1,s=r.rowSpan??1;return{x:n.x+Uz(i,t,this.gap),y:n.y+Uz(a,e,this.gap),width:Wz(i,t,o,this.gap),height:Wz(a,e,s,this.gap)}}get gap(){return this.spec.gap??0}};function Vz(e,t,n){let r=n*Math.max(0,e.length-1),i=Math.max(0,t-r),a=e.reduce((e,t)=>e+(t.size??0),0),o=e.reduce((e,t)=>e+(t.grow??0),0),s=Math.max(0,i-a),c=0;return e.map((t,n)=>{if(t.size!==void 0)return t.size;if(!t.grow||o===0)return 0;let r=n===Hz(e)?s-c:Math.floor(s*t.grow/o);return c+=r,r})}function Hz(e){for(let t=e.length-1;t>=0;t--)if(e[t].grow)return t;return-1}function Uz(e,t,n){let r=0;for(let i=0;i<t&&i<e.length;i++)r+=e[i]+n;return r}function Wz(e,t,n,r){let i=0;for(let a=t;a<t+n&&a<e.length;a++)i+=e[a],a>t&&(i+=r);return Math.max(0,i)}function Gz(e,t,n={}){let r=n.gap??0,i=n.align??`start`,a=Array(e.length),o=0,s=[],c=0,l=0,u=()=>{if(s.length===0)return;let n=Math.max(0,t-c),u=i===`center`?n/2:i===`end`?n:0;for(let t of s)a[t]={x:u,y:o},u+=e[t].width+r;o+=l+r,s=[],c=0,l=0};return e.forEach((e,n)=>{let i=s.length===0?e.width:c+r+e.width;s.length>0&&i>t&&u(),c=s.length===0?e.width:c+r+e.width,l=Math.max(l,e.height),s.push(n)}),u(),{positions:a,height:Math.max(0,o-r)}}var Kz=[`idle`,`hover`,`pressed`,`disabled`,`selected`,`focused`],qz=class e{constructor(){this.map=new Map}static{this.ANY=`*`}define(e,t,n){let r=this.map.get(e)??{};r[t]={...r[t],...n},this.map.set(e,r)}has(e){return this.map.has(e)}widgets(){return[...this.map.keys()]}resolve(t,n=`idle`){return this.map.get(t)?.[n]??this.map.get(t)?.idle??this.map.get(e.ANY)?.[n]??this.map.get(e.ANY)?.idle??{}}statesOf(e){let t=this.map.get(e);return t?Kz.filter(e=>t[e]!==void 0):[]}static from(t){let n=new e;for(let[e,r]of Object.entries(t))if(Jz(r))for(let t of Kz){let i=r[t];i&&n.define(e,t,i)}else n.define(e,`idle`,r);return n}};function Jz(e){return Kz.some(t=>e[t]!==void 0)}var Yz=class extends J{constructor(e){super(),this.capturing=null,this.onKeyCaptured=e=>this.capturing?(e.preventDefault(),e.code===`Escape`?this.cancelCapture():this.finishCapture(this.capturing,e.code),!0):!1,this.actions=[...e.actions],this.labelFor=e.label??(e=>e),this.onConflict=e.onConflict??(()=>!0),this.list=new EL({width:e.width,height:e.height,rowHeight:e.rowHeight,items:this.rows()}),this.addChild(this.list)}rows(){return this.actions.map(e=>({text:this.rowText(e),value:e,disabled:this.capturing!==null&&this.capturing!==e}))}rowText(e){if(this.capturing===e)return`${this.labelFor(e)}: press a key...`;let t=Ie(e);return`${this.labelFor(e)}: ${t.length?t.join(`, `):`(unbound)`}`}refresh(){let e=this.list.selectedIndex;this.list.setItems(this.rows()),this.list.select(e)}startCapture(e){this.capturing=e,this.refresh(),queueMicrotask(()=>{this.capturing===e&&xe.add(this.onKeyCaptured)})}cancelCapture(){xe.remove(this.onKeyCaptured),this.capturing=null,this.refresh()}finishCapture(e,t){xe.remove(this.onKeyCaptured),this.capturing=null;let n=Pe(t).filter(t=>t!==e);if(n.length>0&&!this.onConflict(t,e,n))this.refresh();else{for(let e of n)Me(e,Ie(e).filter(e=>e!==t));Me(e,[t]),this.refresh()}}get isCapturing(){return this.capturing!==null}handleAction(e){if(this.capturing)return!0;if(e===`confirm`){let e=this.list.selected?.value;return e&&this.startCapture(e),!0}return this.list.handleAction(e)}destroy(e){xe.remove(this.onKeyCaptured),super.destroy(e)}},Xz=class extends J{constructor(e){super(),this.highlight=new Z,this.main=new J,this.rebindLayer=new J,this.rows=[],this.selected=0,this.rebind=null,this.themeListener=()=>this.drawHighlight(),this.settings=e.settings,this.width_=e.width??320,this.rowHeight=e.rowHeight??36,this.labels={music:`Music`,sfx:`Sound effects`,muted:`Mute`,zoom:`Zoom`,controls:`Controls...`,reset:`Reset to defaults`,rebindHint:`Keys (cancel: back)`,...e.labels},this.zoomMin=e.zoomMin??.5,this.zoomMax=e.zoomMax??4,this.zoomStep=e.zoomStep??.25,this.customRows=e.custom??[],this.actionsOption=e.actions,this.onConflict=e.onConflict,this.addChild(this.highlight),this.addChild(this.main),this.addChild(this.rebindLayer),this.rebindLayer.visible=!1,this.buildMain(),this.refresh(),this.drawHighlight(),$.add(this.themeListener)}get selectedRow(){return this.rows[this.selected]?.id??``}get isRebinding(){return this.rebind!==null}handleAction(e){if(this.rebind)return e===`cancel`&&!this.rebind.isCapturing?(this.closeRebind(),!0):this.rebind.handleAction(e);let t=this.rows[this.selected];if(!t)return!1;switch(e){case`up`:return this.select((this.selected+this.rows.length-1)%this.rows.length),!0;case`down`:return this.select((this.selected+1)%this.rows.length),!0;case`left`:return t.adjust(-1),!0;case`right`:return t.adjust(1),!0;case`confirm`:return t.activate(),!0;default:return!1}}refresh(){for(let e of this.rows)e.refresh()}select(e){this.selected=e,this.drawHighlight()}drawHighlight(){this.rows.length===0?this.highlight.clear():this.highlight.clear().rect(0,this.selected*this.rowHeight,this.width_,this.rowHeight).fill({color:Q().color.selection})}buildMain(){let e=this.settings.current;this.addSliderRow(`music`,this.labels.music,0,100,1,10,Math.round(e.musicVolume*100),e=>this.settings.setMusicVolume(e/100)),this.addSliderRow(`sfx`,this.labels.sfx,0,100,1,10,Math.round(e.sfxVolume*100),e=>this.settings.setSfxVolume(e/100)),this.addToggleRow(`muted`,this.labels.muted,e.muted,e=>this.settings.setMuted(e)),this.addSliderRow(`zoom`,this.labels.zoom,this.zoomMin,this.zoomMax,this.zoomStep,this.zoomStep,e.zoom,e=>this.settings.setZoom(e));for(let e of this.customRows)this.addCustomRow(e);this.addActionRow(`controls`,this.labels.controls,()=>this.openRebind()),this.addActionRow(`reset`,this.labels.reset,()=>{this.settings.reset(),this.refresh()}),this.main.children.forEach((e,t)=>{e.y=t*this.rowHeight})}addSliderRow(e,t,n,r,i,a,o,s){let c=new J,l=new EI({text:t});l.y=10;let u=new wz({width:140,min:n,max:r,step:i,value:o});u.x=this.width_-148,u.y=10,c.addChild(l,u),this.main.addChild(c);let d=()=>{l.setText(`${t}: ${u.value}`)};d(),u.onChange.add(e=>{s(e),d()}),this.rows.push({id:e,root:c,adjust:e=>u.setValue(u.value+e*a),activate:()=>{},refresh:()=>{u.setValue(this.readSlider(e)),d()}})}readSlider(e){let t=this.settings.current;switch(e){case`music`:return Math.round(t.musicVolume*100);case`sfx`:return Math.round(t.sfxVolume*100);case`zoom`:return t.zoom;default:return 0}}addToggleRow(e,t,n,r){let i=new J,a=new EI({text:t});a.y=10;let o=new Tz({checked:n});o.x=this.width_-28,o.y=8,i.addChild(a,o),this.main.addChild(i),o.onChange.add(r),this.rows.push({id:e,root:i,adjust:()=>o.toggle(),activate:()=>o.toggle(),refresh:()=>o.setChecked(this.readToggle(e))})}readToggle(e){return e===`muted`?this.settings.current.muted:this.settings.getCustom(e.slice(7),!1)===!0}addCustomRow(e){let t=`custom:${e.key}`;if(e.kind===`boolean`){let n=this.settings.getCustom(e.key,!1);this.addToggleRow(t,e.label,n===!0,t=>this.settings.setCustom(e.key,t))}else if(e.kind===`number`){let n=this.settings.getCustom(e.key,e.min),r=typeof n==`number`?n:e.min,i=e.step??0,a=i>0?i:(e.max-e.min)/20,o=new J,s=new EI({text:e.label});s.y=10;let c=new wz({width:140,min:e.min,max:e.max,step:e.step??0,value:r});c.x=this.width_-148,c.y=10,o.addChild(s,c),this.main.addChild(o);let l=()=>{s.setText(`${e.label}: ${c.value}`)};l(),c.onChange.add(t=>{this.settings.setCustom(e.key,t),l()}),this.rows.push({id:t,root:o,adjust:e=>c.setValue(c.value+e*a),activate:()=>{},refresh:()=>{let t=this.settings.getCustom(e.key,e.min);c.setValue(typeof t==`number`?t:e.min),l()}})}else{let n=e.options,r=new J,i=new EI({text:e.label});i.y=10;let a=new Oz({min:0,max:n.length-1,step:1,value:0,wrap:!0});a.x=this.width_-32,a.y=2,r.addChild(i,a),this.main.addChild(r);let o=e=>{let t=typeof e==`string`?n.indexOf(e):-1;return t>=0?t:0},s=()=>{i.setText(`${e.label}: ${n[a.value]}`)};a.setValue(o(this.settings.getCustom(e.key,n[0]))),s(),a.onChange.add(t=>{this.settings.setCustom(e.key,n[t]),s()}),this.rows.push({id:t,root:r,adjust:e=>e>0?a.increment():a.decrement(),activate:()=>a.increment(),refresh:()=>{a.setValue(o(this.settings.getCustom(e.key,n[0]))),s()}})}}addActionRow(e,t,n){let r=new J,i=new dz({width:this.width_-16,height:28,text:t,onClick:n});i.x=8,i.y=4,r.addChild(i),this.main.addChild(r),this.rows.push({id:e,root:r,adjust:()=>{},activate:n,refresh:()=>{}})}openRebind(){let e=this.actionsOption??Object.keys(this.settings.current.bindings),t=new EI({text:this.labels.rebindHint}),n=new Yz({width:this.width_,height:Math.max(1,e.length)*this.rowHeight,actions:e,onConflict:this.onConflict});t.y=0,n.y=this.rowHeight,this.rebindLayer.addChild(t,n),this.rebindLayer.visible=!0,this.main.visible=!1,this.highlight.visible=!1,this.rebind=n}closeRebind(){this.settings.setBindings(Le()),this.rebindLayer.removeChildren(),this.rebind?.destroy(),this.rebind=null,this.rebindLayer.visible=!1,this.main.visible=!0,this.highlight.visible=!0}destroy(e){$.remove(this.themeListener),this.rebind?.destroy(),this.rebind=null,super.destroy(e)}},Zz=class extends J{constructor(e){if(super(),this.emptyLayer=new J,this.filledLayer=new J,this.maskShape=new Z,this.themeListener=()=>this.draw(),e.filledTexture===void 0!=(e.emptyTexture===void 0))throw Error(`a Meter takes filledTexture and emptyTexture together, or neither`);this.count_=$z(e.count),this.size_=e.size??16,this.gap_=e.gap??4,this.value_=Qz(e.value??this.count_,this.count_),this.explicitColor=e.color!==void 0,this.fillColor=e.color??Q().color.textHighlight,this.emptyColor_=e.emptyColor,this.filledTexture=e.filledTexture,this.emptyTexture=e.emptyTexture,this.addChild(this.emptyLayer),this.addChild(this.filledLayer),this.addChild(this.maskShape),this.filledLayer.mask=this.maskShape,this.draw(),$.add(this.themeListener)}get value(){return this.value_}get count(){return this.count_}get color(){return this.fillColor}setValue(e,t=this.count_){this.count_=$z(t),this.value_=Qz(e,this.count_),this.draw()}setColor(e){this.explicitColor=!0,this.fillColor=e,this.draw()}resize(e,t=this.gap_){this.size_=e,this.gap_=t,this.draw()}get totalWidth(){return this.count_*this.size_+(this.count_-1)*this.gap_}iconX(e){let t=e*(this.size_+this.gap_);return Q().direction===`rtl`?this.totalWidth-t-this.size_:t}draw(){let e=Q();this.explicitColor||(this.fillColor=e.color.textHighlight);let t=this.emptyColor_??e.color.panelFill;this.emptyLayer.removeChildren(),this.filledLayer.removeChildren();for(let e=0;e<this.count_;e++){let n=this.iconX(e);this.emptyLayer.addChild(this.icon(n,t,this.emptyTexture,!1)),this.filledLayer.addChild(this.icon(n,this.fillColor,this.filledTexture,!0))}let n=this.totalWidth*(this.count_>0?this.value_/this.count_:0),r=e.direction===`rtl`?this.totalWidth-n:0;this.maskShape.clear().rect(r,0,n,this.size_).fill({color:16777215})}icon(e,t,n,r){if(n){let i=new wl(n);return i.x=e,i.width=this.size_,i.height=this.size_,r&&this.explicitColor&&(i.tint=t),i}let i=new Z,a=this.size_/2;return i.circle(e+a,a,a).fill({color:t}),i}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function Qz(e,t){return Number.isFinite(e)?Math.max(0,Math.min(t,e)):t}function $z(e){return Number.isFinite(e)?Math.max(1,Math.floor(e)):1}var eB=class extends J{constructor(e){super(),this.track=new Z,this.fill=new Z,this.themeListener=()=>this.draw(),this.width_=e.width,this.height_=e.height,this.explicitColor=e.color!==void 0,this.fillColor=e.color??Q().color.textHighlight,this.fraction=tB((e.value??1)/(e.max??1)),this.fillTexture=e.fillTexture,this.backgroundTexture=e.backgroundTexture,this.background_=e.background,this.roundUpToPixel=e.roundUpToPixel??!1,this.addChild(this.track),this.addChild(this.fill),this.draw(),$.add(this.themeListener)}get value(){return this.fraction}setValue(e,t=1){this.fraction=tB(t>0?e/t:0),this.draw()}get color(){return this.fillColor}setColor(e){this.explicitColor=!0,this.fillColor=e,this.draw()}get background(){return this.background_??Q().color.panelFill}setBackground(e){this.background_=e,this.draw()}resize(e,t){this.width_=e,this.height_=t,this.draw()}draw(){let e=Q();if(this.explicitColor||(this.fillColor=e.color.textHighlight),this.track.clear().rect(0,0,this.width_,this.height_),this.track.fill(this.backgroundTexture?{texture:this.backgroundTexture}:{color:this.background}),this.fill.clear(),this.fraction>0){let t=this.width_*this.fraction,n=this.roundUpToPixel?Math.ceil(t):t,r=e.direction===`rtl`?this.width_-n:0;this.fill.rect(r,0,n,this.height_),this.fill.fill(this.fillTexture?this.explicitColor?{texture:this.fillTexture,color:this.fillColor}:{texture:this.fillTexture}:{color:this.fillColor})}}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function tB(e){return Math.max(0,Math.min(1,e))}function nB(e,t){return t<=0?1-e:t>=1||e<=t?1:1-(e-t)/(1-t)}function rB(e,t,n=!1){return n||e<=0?0:-t*e}function iB(e,t,n){return n<=0?e:Math.max(e,Math.min(n,t))}var aB=class extends J{constructor(e){super(),this.rising=new J,this.elapsed=0,this.done=!1,this.duration=e.duration??.8,this.rise=e.rise??24,this.hold=Math.min(1,Math.max(0,e.hold??0));let t=new EI({text:e.text,color:e.color,size:e.size});t.anchor.set(.5),this.rising.addChild(t),this.addChild(this.rising)}get finished(){return this.done}get riseOffset(){return this.rising.y}ageAtLeast(e){this.elapsed=iB(this.elapsed,this.duration,e)}update(e){if(this.done)return;this.elapsed=Math.min(this.duration,this.elapsed+e);let t=this.duration>0?this.elapsed/this.duration:1;this.rising.y=rB(t,this.rise,br()),this.alpha=nB(t,this.hold),t>=1&&(this.done=!0,this.parent?.removeChild(this),this.destroy({children:!0}))}},oB=4;function sB(e){return Math.max(0,e)/5}function cB(e,t,n=4){let r=t.y-t.height/2;return e.y+e.height/2+n<=r?e.y:r-e.height/2-n}function lB(e,t,n=4){let r=[];if(t.key===void 0)return r;let i=t;for(let a=e.length-1;a>=0;a--){let o=e[a];if(o.key!==t.key)continue;let s=cB(o,i,n);if(s===o.y)break;r.push({index:a,y:s,ageAtLeast:sB(r.length+1)}),i={...o,y:s}}return r}var uB=class extends J{constructor(...e){super(...e),this.live=[]}push(e){let t=new aB({text:e.text,color:e.color,size:e.size,duration:e.duration,rise:e.rise,hold:e.hold});e.scale!==void 0&&t.scale.set(e.scale);let n={key:e.key,x:e.x,y:e.y,height:t.height};for(let e of lB(this.live.map(e=>e.entry),n)){let t=this.live[e.index];t.entry.y=e.y,t.popup.y=e.y,t.popup.ageAtLeast(e.ageAtLeast)}return t.position.set(e.x,e.y),this.addChild(t),this.live.push({popup:t,entry:n}),t}update(e){for(let{popup:t}of this.live)t.update(e);for(let e=this.live.length-1;e>=0;e--)this.live[e].popup.finished&&this.live.splice(e,1)}get count(){return this.live.length}clear(){for(let{popup:e}of this.live)this.removeChild(e),e.destroy({children:!0});this.live.length=0}},dB=class extends J{constructor(e={}){super(),this.queue=[],this.current=null,this.phase=`fadeIn`,this.elapsed=0,this.fadeIn=e.fadeIn??.25,this.hold=e.hold??1,this.fadeOut=e.fadeOut??1.75,this.scaleFrom=e.scaleFrom??2}show(e){this.queue.push(e),this.current||this.start(this.queue.shift())}get isBusy(){return this.current!==null||this.queue.length>0}start(e){this.current=e,this.phase=`fadeIn`,this.elapsed=0,this.addChild(e),e.alpha=this.fadeIn>0?0:1,e.scale.set(this.fadeIn>0?this.scaleFrom:1)}update(e){let t=this.current;if(!t)return;if(this.elapsed+=e,this.phase===`fadeIn`){let e=this.fadeIn,n=e>0?Math.min(1,this.elapsed/e):1,r=Er.easeOutCubic(n);t.alpha=r,t.scale.set(this.scaleFrom+(1-this.scaleFrom)*r),n>=1&&this.advance();return}if(this.phase===`hold`){this.elapsed>=this.hold&&this.advance();return}let n=this.fadeOut,r=n>0?Math.min(1,this.elapsed/n):1;t.alpha=1-r,r>=1&&this.finish()}advance(){this.phase=this.phase===`fadeIn`?`hold`:`fadeOut`,this.elapsed=0}finish(){let e=this.current;if(!e)return;this.removeChild(e),e.destroy({children:!0}),this.current=null;let t=this.queue.shift();t&&this.start(t)}},fB=class extends J{constructor(e={}){super(),this.viewWidth=0,this.viewHeight=0,this.panelWidth=0,this.panelHeight=0,this.pending=null,this.waited=0,this.delay=e.delay??.4,this.maxWidth=e.maxWidth??200,this.offsetX=e.offset?.x??12,this.offsetY=e.offset?.y??16,this.margin=e.margin??4,this.panel=new CL({width:0,height:0,modal:!1,closable:!1,dims:!1}),this.body=new EI({text:``,wrapWidth:this.maxWidth}),this.panel.content.addChild(this.body),this.addChild(this.panel),this.visible=!1}setViewport(e,t){this.viewWidth=e,this.viewHeight=t,this.visible&&this.place()}hover(e,t,n,r=this.delay){this.pending&&this.pending.text===e?(this.pending.x=t,this.pending.y=n,this.visible&&this.place()):(this.pending={text:e,x:t,y:n,delay:r},this.waited=0,this.visible=!1)}leave(){this.pending=null,this.waited=0,this.visible=!1}get isShowing(){return this.visible}get text(){return this.pending?.text??null}get panelPosition(){return{x:this.panel.x,y:this.panel.y}}get size(){return{width:this.panelWidth,height:this.panelHeight}}update(e){if(!this.pending||this.visible||(this.waited+=e,this.waited<this.pending.delay))return!1;this.body.setText(this.pending.text);let t=Q(),n=(t.panel?t.panelBorder:2)+t.padding,r=this.measureBody();return this.panelWidth=Math.ceil(r.width)+n*2,this.panelHeight=Math.ceil(r.height)+n*2,this.panel.resize(this.panelWidth,this.panelHeight),this.visible=!0,this.place(),!0}measureBody(){return{width:this.body.width,height:this.body.height}}place(){let e=this.pending;if(!e)return;let t=this.panelWidth,n=this.panelHeight,r=e.x+this.offsetX,i=e.y+this.offsetY;this.viewWidth>0&&(r+t+this.margin>this.viewWidth&&(r=e.x-this.offsetX-t),r=Math.max(this.margin,Math.min(r,Math.max(this.margin,this.viewWidth-t-this.margin)))),this.viewHeight>0&&(i+n+this.margin>this.viewHeight&&(i=e.y-this.offsetY-n),i=Math.max(this.margin,Math.min(i,Math.max(this.margin,this.viewHeight-n-this.margin)))),this.panel.x=r,this.panel.y=i}},pB=class extends J{constructor(e={}){super(),this.targets=[],this.tooltip=e.tooltip??new fB,this.longPress=e.longPress??.5,this.addChild(this.tooltip)}add(e){return this.targets.push(e),()=>{let t=this.targets.indexOf(e);t>=0&&this.targets.splice(t,1)}}addButton(e){return this.add({bounds:()=>{let t=e.getBounds();return{x:t.x,y:t.y,width:t.width,height:t.height}},text:()=>e.tooltip,active:()=>{for(let t=e;t;t=t.parent)if(!t.visible)return!1;return!0}})}targetAt(e,t){for(let n=this.targets.length-1;n>=0;n--){let r=this.targets[n];if(r.active&&!r.active())continue;let i=r.bounds();if(e>=i.x&&e<=i.x+i.width&&t>=i.y&&t<=i.y+i.height)return r.text()===void 0?null:r}return null}pointerMove(e,t){let n=this.targetAt(e,t)?.text();n?this.tooltip.hover(n,e,t):this.tooltip.leave()}pointerDown(e,t){let n=this.targetAt(e,t)?.text();n?this.tooltip.hover(n,e,t,this.longPress):this.tooltip.leave()}pointerUp(){this.tooltip.leave()}attach(e){let t=e=>this.pointerMove(e.x,e.y),n=e=>this.pointerDown(e.x,e.y),r=()=>this.pointerUp();return e.move.add(t),e.down.add(n),e.up.add(r),()=>{e.move.remove(t),e.down.remove(n),e.up.remove(r)}}update(e){return this.tooltip.update(e)}},mB=class extends J{constructor(e){super(),this.topics=e.topics;let t=e.listWidth??Math.floor(e.width/3),n=e.width-t-Q().spacing,r=Q().direction===`rtl`;this.list=new EL({width:t,height:e.height,items:this.topics.map(e=>({text:e.title})),onHighlight:(e,t)=>this.showBody(t),onSelect:(e,t)=>this.showBody(t)}),this.list.x=r?e.width-t:0,this.addChild(this.list),this.body=new EI({wrapWidth:n}),this.body.x=r?0:t+Q().spacing,this.addChild(this.body),this.topics.length>0&&this.showBody(this.list.selectedIndex)}showBody(e){this.body.setText(this.topics[e]?.body??``)}handleAction(e){return this.list.handleAction(e)}},hB=class e extends J{constructor(t){super(),this.text=new EI({text:e.format(t.stats),wrapWidth:t.width}),this.addChild(this.text)}setStats(t,n){this.text.setText(e.format(t)),n!==void 0&&(this.text.style.wordWrapWidth=n)}static format(e){return e.map(e=>`${e.label}: ${e.value}`).join(`
|
|
1386
|
-
`)}},gB=class extends J{constructor(e){super(),this.backdrop=new Z,this.progress=new eB({width:240,height:10,value:0}),this.width_=e.width,this.height_=e.height,this.onRetry=e.onRetry,this.onCancel=e.onCancel,this.title=new EI({text:e.title??`Loading`,size:18,bold:!0,align:`center`}),this.status=new EI({text:`Preparing...`,align:`center`}),this.addChild(this.backdrop,this.title,this.status,this.progress),this.layout()}setSnapshot(e){let t=e.total>0?e.completed/e.total:0;this.progress.setValue(t),e.status===`failed`?this.status.setText(`Loading failed. Retry or cancel.`):e.status===`cancelled`?this.status.setText(`Loading cancelled.`):e.status===`ready`?this.status.setText(`Ready`):this.status.setText(e.current?`Loading ${e.current}...`:`Preparing...`)}bind(e){this.setSnapshot(e.snapshot);let t=e=>this.setSnapshot(e);return e.changed.add(t),()=>e.changed.remove(t)}retry(){this.onRetry?.()}cancel(){this.onCancel?.()}resize(e,t){this.width_=e,this.height_=t,this.layout()}layout(){let e=Q().color;this.backdrop.clear().rect(0,0,this.width_,this.height_).fill({color:e.overlay,alpha:.92});let t=this.width_/2,n=this.height_/2;this.title.anchor.set(.5),this.status.anchor.set(.5),this.title.position.set(t,n-36),this.status.position.set(t,n-8),this.progress.position.set(t-120,n+16)}};function _B(e,t={}){return n=>new Promise(r=>{e.push(new lz({width:t.width??480,height:t.height??120,speed:t.speed??45,pages:[{text:n.text,speaker:n.speaker,portrait:n.portrait}],choices:n.choices,anchor:t.anchor??`bottom`,onDone:e=>r(e)}))})}function vB(e){let t=e/255;return t<=.03928?t/12.92:((t+.055)/1.055)**2.4}function yB(e){return .2126*vB(e>>16&255)+.7152*vB(e>>8&255)+.0722*vB(e&255)}function bB(e,t){let[n,r]=[yB(e),yB(t)].sort((e,t)=>t-e);return(n+.05)/(r+.05)}function xB(e,t,n=`AA`,r=!1){let i=n===`AAA`?r?4.5:7:r?3:4.5;return bB(e,t)>=i}function SB(e,t,n,r=`…`){if(n(e)<=t)return e;let i=0,a=e.length;for(;i<a;){let o=Math.ceil((i+a)/2);n(e.slice(0,o).trimEnd()+r)<=t?i=o:a=o-1}return i===0?r:e.slice(0,i).trimEnd()+r}function CB(e,t,n,r,i=`…`){let a=[],o=``;for(let n of e.split(/\s+/).filter(Boolean)){let e=o?`${o} ${n}`:n;r(e)<=t||!o?o=e:(a.push(o),o=n)}if(o&&a.push(o),a.length<=n)return a.map(e=>SB(e,t,r,i));let s=a.slice(0,n),c=a.slice(n-1).join(` `);return s[n-1]=SB(c+i,t,r,i),s}function wB(e,t,n,r=40,i=1){let a=e-t;if(a<=0)return 0;let o=a/r,s=2*(i+o),c=(n%s+s)%s;return c<i?0:c<i+o?(c-i)*r:c<2*i+o?a:a-(c-2*i-o)*r}var TB=class extends J{constructor(e){super(),this.body=new EI({...e.label,text:e.text??``,wrapWidth:e.width-10}),this.box=new Mz({width:e.width,height:e.maxHeight,autoHeight:!0,touch:e.touch??!0,keyboard:!0}),this.box.content.addChild(this.body),this.addChild(this.box),this.measure()}measureHeight(){return this.body.height}measure(){this.box.setContentHeight(this.measureHeight())}setText(e){this.body.setText(e),this.measure(),this.box.scrollTo(0)}update(e){this.box.update(e)}},EB=class extends J{constructor(e){super(),this.clip=new Z,this.source=``,this.fullWidth=0,this.time=0,this.width_=e.width,this.speed=e.speed??40,this.pause=e.pause??1,this.labelOptions=e.label??{},this.body=new EI({...this.labelOptions,text:``}),this.clip.rect(0,0,e.width,4096).fill({color:16777215}),this.addChild(this.body,this.clip),this.body.mask=this.clip,this.setText(e.text??``)}measureWidth(e){let t=new EI({...this.labelOptions,text:e}),n=t.width;return t.destroy(),n}setText(e){this.source=e,this.fullWidth=this.measureWidth(e),this.time=0,this.apply()}apply(){br()?(this.body.setText(SB(this.source,this.width_,e=>this.measureWidth(e))),this.body.x=0):(this.body.setText(this.source),this.body.x=-wB(this.fullWidth,this.width_,this.time,this.speed,this.pause))}get shift(){return 0-this.body.x}update(e){this.time+=e,this.apply()}},DB={farLeft:.12,left:.28,center:.5,right:.72,farRight:.88},OB=class extends J{constructor(e,t){super(),this.backdropLayer=new J,this.actorLayer=new J,this.backdrop=null,this.outgoingBackdrop=null,this.actors=new Map,this.definitions=new Map,this.focused=null,this.tweener=new Dr,this.dimAmount=.45,this.stageWidth=e,this.stageHeight=t,this.addChild(this.backdropLayer),this.addChild(this.actorLayer)}defineCharacter(e,t){this.definitions.set(e,t)}resize(e,t){this.stageWidth=e,this.stageHeight=t;for(let e of[this.backdrop,this.outgoingBackdrop])e&&this.fitBackdrop(e);for(let e of this.actors.values())this.placeActor(e)}setBackdrop(e,t=.4){this.outgoingBackdrop?.destroy();let n=this.backdrop;this.outgoingBackdrop=n;let r=new wl(e);this.fitBackdrop(r),this.backdrop=r,this.backdropLayer.addChild(r);let i=()=>{this.outgoingBackdrop===n&&(n?.destroy(),this.outgoingBackdrop=null)};return t<=0?(i(),Promise.resolve()):(r.alpha=0,this.tweener.tween(t,e=>{r.alpha=e}).then(i))}fitBackdrop(e){let t=e.texture,n=Math.max(this.stageWidth/t.width,this.stageHeight/t.height);e.scale.set(n),e.x=Math.round((this.stageWidth-t.width*n)/2),e.y=Math.round((this.stageHeight-t.height*n)/2)}show(e,t={}){let n=this.definitions.get(e);if(!n)throw Error(`no character defined as "${e}"`);let r=t.expression??Object.keys(n.expressions)[0],i=this.actors.get(e);if(i)return t.at!==void 0&&(i.slot=this.slotOf(t.at)),this.setExpression(e,r),this.placeActor(i),Promise.resolve();let a=new CM(n.sheet.get(n.expressions[r])),o={id:e,sprite:a,definition:n,slot:this.slotOf(t.at??`center`),expression:r};this.actors.set(e,o),this.actorLayer.addChild(a),this.placeActor(o),this.applyFocus();let s=t.fade??.25;return s<=0?Promise.resolve():(a.alpha=0,this.tweener.tween(s,e=>{a.alpha=e}))}hide(e,t=.25){let n=this.actors.get(e);return n?(this.actors.delete(e),this.focused===e&&(this.focused=null),this.applyFocus(),t<=0?(n.sprite.destroy(),Promise.resolve()):this.tweener.tween(t,e=>{n.sprite.alpha=1-e}).then(()=>n.sprite.destroy())):Promise.resolve()}hideAll(e=.25){return Promise.all([...this.actors.keys()].map(t=>this.hide(t,e))).then(()=>void 0)}setExpression(e,t){let n=this.actors.get(e);if(!n)return;let r=n.definition.expressions[t];if(r===void 0)throw Error(`character "${e}" has no expression "${t}"`);n.expression=t,n.sprite.texture=n.definition.sheet.get(r)}focus(e){this.focused=e,this.applyFocus()}applyFocus(){let e=Math.round(255*(1-this.dimAmount)),t=e<<16|e<<8|e;for(let e of this.actors.values()){let n=this.focused!==null&&e.id!==this.focused;e.sprite.tint=n?t:16777215}}slotOf(e){return typeof e==`number`?e:DB[e]}placeActor(e){let t=e.definition,n=(t.height??.7)*this.stageHeight,r=n/t.sheet.frameHeight;e.sprite.scale.set(r),e.sprite.x=Math.round(e.slot*this.stageWidth-t.sheet.frameWidth*r/2),e.sprite.y=Math.round((t.baseline??.92)*this.stageHeight-n)}update(e){this.tweener.update(e)}get isBusy(){return this.tweener.isBusy}},kB=class{constructor(e){this.state={answers:{}},this.cancelled=!1,this.historyLog=[],this.seenLines=new Set,this.skipSeen=!1,this.options=e}cancel(){this.cancelled=!0}get history(){return this.historyLog}async showLast(){let e=this.historyLog.at(-1);if(!e)return!1;let{windows:t}=this.options;return await new Promise(n=>{t.push(new lz({width:this.options.boxWidth??480,height:this.options.boxHeight??120,speed:0,pages:[{text:e.text,speaker:e.speaker}],dims:!1,anchor:`bottom`,onDone:()=>n()}))}),!0}async run(e){for(let t of e){if(this.cancelled)break;let e=await this.step(t);if(e!==void 0)throw Error(`a "goto ${e}" only runs inside runStory, not a straight run`)}return this.state}async runStory(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))throw Error(`this story has no passage named "${t}"`);let n=e[t],r=0;for(;r<n.length&&!this.cancelled;){let t=await this.step(n[r]);if(r++,t!==void 0){if(!Object.prototype.hasOwnProperty.call(e,t))throw Error(`this story has no passage named "${t}"`);n=e[t],r=0}}return this.state}async step(e){let{stage:t}=this.options;if(`backdrop`in e)await t.setBackdrop(this.options.backdrop(e.backdrop),e.fade);else if(`show`in e)await t.show(e.show,{at:e.at,expression:e.expression,fade:e.fade});else if(`hide`in e)await t.hide(e.hide,e.fade);else if(`hideAll`in e)await t.hideAll(e.fade);else if(`expression`in e)t.setExpression(e.of,e.expression);else if(`say`in e)await this.speak(e.say,e.as,e.speaker),this.recordHistory(e.say,e.as,e.speaker);else{if(`ask`in e){let t=await this.speak(e.ask,e.as,e.speaker,e.choices);return this.recordHistory(e.ask,e.as,e.speaker,t),e.store&&(this.state.answers[e.store]=t),e.choices.find(e=>(e.value??e.text)===t)?.goto}if(`goto`in e)return e.goto;`wait`in e?await new Promise(t=>setTimeout(t,e.wait*1e3)):`call`in e&&await e.call(this.state)}}recordHistory(e,t,n,r){let i=n??(t?this.options.displayName?.(t)??t:void 0);this.seenLines.add(AB(t,e)),this.historyLog.push({text:e,speaker:i,chosen:r})}speak(e,t,n,r){let{stage:i,windows:a}=this.options;i.focus(t??null);let o=n??(t?this.options.displayName?.(t)??t:void 0),s=this.skipSeen&&!r&&this.seenLines.has(AB(t,e));return new Promise(t=>{a.push(new lz({width:this.options.boxWidth??480,height:this.options.boxHeight??120,speed:s?0:this.options.speed??45,autoAdvance:s?0:void 0,mode:this.options.mode,pages:[{text:e,speaker:o}],choices:r,dims:!1,anchor:`bottom`,onDone:e=>t(e)}))})}};function AB(e,t){return`${e??``}\u0000${t}`}function jB(e){let{story:t,start:n,title:r}=Gr(e);return r===void 0?{story:t,start:n}:{story:t,start:n,title:r}}function MB(e){return Wr(e).map(e=>e.speaker===void 0?{say:e.text}:{say:e.text,as:e.speaker})}function NB(e,t={}){let n={},r=e=>{for(let t of e)`say`in t?n[t.say]=t.say:`ask`in t&&(n[t.ask]=t.ask)};if(Array.isArray(e))r(e);else for(let t of Object.values(e))r(t);return{locale:t.locale??`en`,direction:t.direction??`ltr`,messages:n}}var PB=class{constructor(e){this.onChange=new p,this.onMusic=new p,this.index=0,this.beats=e}get length(){return this.beats.length}get position(){return this.index}get current(){return this.beats[this.index]??null}get done(){return this.beats.length===0||this.index>=this.beats.length-1}get music(){return this.current?.music??null}goTo(e){let t=Math.max(0,Math.min(this.beats.length-1,e));this.index=t,this.report()}advance(){return!this.done&&(this.goTo(this.index+1),!0)}back(){return this.index!==0&&(this.goTo(this.index-1),!0)}skip(){this.goTo(this.beats.length-1)}restart(){this.goTo(0)}report(){let e=this.current;e&&this.onChange.dispatch(e),this.onMusic.dispatch(this.music)}},FB=class extends J{constructor(e){super(),this.backdrop=new wl(q.EMPTY),this.handleAdvance=()=>{this.advance()},this.handleBeat=e=>{this.applyBeat(e)},this.sequence=e.sequence,this.textureFor=e.textureFor??(()=>null),this.playMusic=e.playMusic??(()=>{}),this.width_=e.width,this.height_=e.height,this.titleLabel=new EI({text:``,color:Q().color.textHighlight}),this.textLabel=new EI({text:``,wrapWidth:this.width_*.8}),this.addChild(this.backdrop),this.addChild(this.titleLabel),this.addChild(this.textLabel),this.eventMode=`static`,this.on(`pointertap`,this.handleAdvance),this.sequence.onChange.add(this.handleBeat),this.sequence.onMusic.add(this.playMusic),this.applyBeat(this.sequence.current)}get current(){return this.sequence.current}advance(){return this.sequence.advance()}skip(){this.sequence.skip()}resize(e,t){this.width_=e,this.height_=t,this.applyBeat(this.current)}applyBeat(e){if(!e){this.backdrop.visible=!1;return}let t=e.image?this.textureFor(e.image):null;if(this.backdrop.visible=t!==null,t){this.backdrop.texture=t;let e=Math.max(this.width_/t.width,this.height_/t.height);this.backdrop.scale.set(e),this.backdrop.x=(this.width_-t.width*e)/2,this.backdrop.y=(this.height_-t.height*e)/2}this.titleLabel.setText(e.title??``),this.titleLabel.x=this.width_*.1,this.titleLabel.y=this.height_*.12,this.textLabel.setText(e.text),this.textLabel.x=this.width_*.1,this.textLabel.y=this.height_*.24,this.textLabel.style.wordWrapWidth=this.width_*.8}destroy(e){this.sequence.onChange.remove(this.handleBeat),this.sequence.onMusic.remove(this.playMusic),super.destroy(e)}},IB=[[1,0],[1,-1],[0,-1],[-1,-1],[-1,0],[0,1]],LB=[[1,1],[1,0],[0,-1],[-1,0],[-1,1],[0,1]];function RB(e){return e===4?sr:lr}var zB={passable:!1,transparent:!1},BB={passable:!0,transparent:!0},VB=class e{constructor(e,t,n,r=0,i=`square`,a){if(this.rooms=[],this.width=e,this.shape=i,this.height=t,a!==void 0&&(!Number.isFinite(a)||a<0))throw Error(`viewDistance must be a finite non-negative number`);this.viewDistance=a,this.kinds=n,this.terrain=new Uint8Array(e*t).fill(r)}get cellCount(){return this.width*this.height}index(e,t){return nr(this.width,e,t)}xOf(e){return rr(this.width,e)}yOf(e){return ir(this.width,e)}inside(e,t){return tr(this.width,this.height,e,t)}neighbors(e,t,n=8){return this.shape===`hex`?Jn(e,t):RB(n).map(([n,r])=>({x:e+n,y:t+r}))}forEachNeighbor(e,t,n,r){let i=this.shape===`hex`?e&1?LB:IB:RB(n);for(let[n,a]of i)r(e+n,t+a)}insideWithBorder(e,t){return e>0&&t>0&&e<this.width-1&&t<this.height-1}get(e,t){return this.inside(e,t)?this.terrain[this.index(e,t)]:0}set(e,t,n){this.inside(e,t)&&(this.terrain[this.index(e,t)]=n)}kindAt(e,t){return this.kinds[this.get(e,t)]??zB}passable(e,t){return this.inside(e,t)&&this.kindAt(e,t).passable}transparent(e,t){return this.inside(e,t)&&this.kindAt(e,t).transparent}fillRect(e,t){for(let n=e.top;n<=e.bottom;n++)for(let r=e.left;r<=e.right;r++)this.set(r,n,t)}passableCells(){let e=[];for(let t=0;t<this.terrain.length;t++)this.kinds[this.terrain[t]]?.passable&&e.push(t);return e}toJSON(){return{width:this.width,height:this.height,shape:this.shape,terrain:[...this.terrain],rooms:this.rooms.map(e=>({...e})),...this.viewDistance===void 0?{}:{viewDistance:this.viewDistance}}}static fromJSON(t,n){let r=new e(n.width,n.height,t,0,n.shape,n.viewDistance);return r.terrain.set(n.terrain.slice(0,r.terrain.length)),r.rooms=n.rooms.map(e=>({...e})),r}};function HB(e){return{x:Math.floor((e.left+e.right)/2),y:Math.floor((e.top+e.bottom)/2)}}function UB(e,t,n=0){return!(e.right+n<t.left||t.right+n<e.left||e.bottom+n<t.top||t.bottom+n<e.top)}_e();var WB={id:`hall`,paint:(e,t,n)=>e.fillRect(t,n)};function GB(e){return Math.min(e.right-e.left+1,e.bottom-e.top+1)}function KB(e){return Math.max(e.right-e.left+1,e.bottom-e.top+1)}function qB(e,t){let n=GB(t),r=KB(t);return e.filter(e=>n>=(e.minSize??0)&&r<=(e.maxSize??1/0))}function JB(e,t){let n=qB(e,t);if(n.length===0)return null;let r=ie(n.map(e=>e.weight??1));return r===null?null:n[r]}_e();var YB=[{passable:!1,transparent:!1},{passable:!0,transparent:!0}];function XB(e){let{width:t,height:n,rooms:r=14,minRoomSize:i=4,maxRoomSize:a=10,extraCorridors:o=3,wall:s=0,floor:c=1,kinds:l=[],hooks:u,builders:d}=e,f=new VB(t,n,[...YB,...l],s,e.shape),p=[],m=[],h=[],g=0;for(let e=0;e<r*6&&p.length<r;e++){let e=ne(i,a),r=ne(i,a),o=O(1,Math.max(2,t-e-1)),s=O(1,Math.max(2,n-r-1)),l={left:o,top:s,right:o+e-1,bottom:s+r-1};if(l.right>=t-1||l.bottom>=n-1||p.some(e=>UB(l,e,2))){g++;continue}p.push(l);let m=(d?.length?JB(d,l):null)??WB;m.paint(f,l,c),h.push(m.id),u?.onRoomPlaced?.(l,p.length-1)}for(let e=1;e<p.length;e++){QB(f,HB(p[e-1]),HB(p[e]),c);let t={a:e-1,b:e,extra:!1};m.push(t),u?.onCorridorCarved?.(t,p[e-1],p[e])}for(let e=0;e<o&&p.length>2;e++){let e=O(p.length),t=O(p.length);if(e!==t){QB(f,HB(p[e]),HB(p[t]),c);let n={a:e,b:t,extra:!0};m.push(n),u?.onCorridorCarved?.(n,p[e],p[t])}}return f.rooms=p,{level:f,graph:m,retries:g,roomBuilders:h}}function ZB(e){return XB(e).level}function QB(e,t,n,r){let i=A(.5);if(e.shape===`hex`){let a=i?{x:n.x,y:t.y}:{x:t.x,y:n.y};for(let i of[...Zn(t,a),...Zn(a,n)])e.insideWithBorder(i.x,i.y)&&e.set(i.x,i.y,r)}else i?($B(e,t.x,n.x,t.y,!0,r),$B(e,t.y,n.y,n.x,!1,r)):($B(e,t.y,n.y,t.x,!1,r),$B(e,t.x,n.x,n.y,!0,r))}function $B(e,t,n,r,i,a){let o=t<=n?1:-1;for(let s=t;s!==n+o;s+=o){let t=i?s:r,n=i?r:s;e.insideWithBorder(t,n)&&e.set(t,n,a)}}function eV(e,t=new Set){let n=e.passableCells().filter(e=>!t.has(e));return n.length>0?n[O(n.length)]:null}function tV(e,t){let n=null,r=-1;for(let i of e.rooms){let a=HB(i),o=e.shape===`hex`?Yn(a,t):(a.x-t.x)**2+(a.y-t.y)**2;o>r&&(r=o,n=i)}return n}_e();function nV(e,t){return[[e,t-1],[e,t+1],[e-1,t],[e+1,t]]}function rV(e,t){return Jn(e,t).map(e=>[e.x,e.y])}var iV=2/Math.sqrt(3);function aV(e,t,n,r){let i=$n(e,t,iV,1),a=$n(n,r,iV,1);return(i.x-a.x)**2+(i.y-a.y)**2}function oV(e){let{width:t,height:n}=e;if(t<5||n<5)throw Error(`a cave needs at least 5x5 cells`);if(e.chambers.length<1)throw Error(`a cave needs at least one chamber`);let r=e.wall??0,i=e.floor??1,a=e.kinds??[],o=e.shape??`square`,s=o===`hex`,c=s?rV:nV,l=(e,t,n,r)=>s?Yn({x:e,y:t},{x:n,y:r}):Math.abs(e-n)+Math.abs(t-r),u=(e,t,n,r)=>s?aV(e,t,n,r):(e-n)**2+(t-r)**2;if(e.random===void 0&&e.seed===void 0)throw Error(`a cave needs a seed or a random source`);let d=e.random,f=e=>O(e,void 0,d),p=new VB(t,n,[...YB,...a],r,o),m=(e,n)=>n*t+e,h=(e,t)=>p.insideWithBorder(e,t),g=new Uint8Array(t*n),_=(e,t)=>{h(e,t)&&(g[m(e,t)]=1)};d===void 0&&w(e.seed);try{let r=new Map,a=new Map;for(let i of e.chambers){if(i.size<1)throw Error(`cave chamber ${i.id} needs at least one cell`);let e=ne(Math.max(1,i.xRange[0]),Math.min(t-2,i.xRange[1]),d),o=ne(Math.max(1,i.yRange[0]),Math.min(n-2,i.yRange[1]),d);r.set(i.id,{x:e,y:o});let s=[{x:e,y:o}],u=new Set([m(e,o)]),p=[],g=(e,t)=>{for(let[n,r]of c(e,t))h(n,r)&&!u.has(m(n,r))&&(u.add(m(n,r)),p.push([n,r]))};for(g(e,o);s.length<i.size&&p.length;){let t=0;if(f(100)<(i.jagged??0))t=f(p.length);else{let n=1/0;for(let r=0;r<p.length;r++){let i=l(p[r][0],p[r][1],e,o);i<n&&(n=i,t=r)}}let[n,r]=p.splice(t,1)[0];s.push({x:n,y:r}),g(n,r)}for(let e of s)_(e.x,e.y);a.set(i.id,s)}let o=(e,r,i,a)=>{let o=e.x,s=e.y;for(let e=0;e<t*n&&(o!==r.x||s!==r.y);e++){if(_(o,s),i>1)for(let[e,t]of c(o,s).slice(0,i-1))_(e,t);let e=c(o,s).filter(([e,t])=>h(e,t)),t=e[0];if(f(100)<a)t=e[f(e.length)];else{let n=1/0;for(let i of e){let e=u(i[0],i[1],r.x,r.y);e<n&&(n=e,t=i)}}[o,s]=t}_(r.x,r.y)};for(let t of e.chambers)for(let e of t.passages){let n=r.get(t.id),i=r.get(e.to);if(!n||!i)throw Error(`cave passage ${t.id} -> ${e.to} names no chamber`);f(100)>=(e.chance??100)||o(n,i,Math.max(1,e.width??1),e.windiness??0)}let s=e.mustBeClear??[];for(let e of s){_(e.x,e.y);for(let[t,n]of c(e.x,e.y))_(t,n)}let v=r.get(e.chambers[0].id);if(v){let e=()=>{let e=new Set([m(v.x,v.y)]),t=[[v.x,v.y]];for(;t.length;){let[n,r]=t.pop();for(let[i,a]of c(n,r))h(i,a)&&g[m(i,a)]&&!e.has(m(i,a))&&(e.add(m(i,a)),t.push([i,a]))}return e};for(let t of[...r.values(),...s])h(t.x,t.y)&&!e().has(m(t.x,t.y))&&o(t,v,1,15)}let y=new Set,b=[];for(let t of e.starts??[]){let e=r.get(t.chamber);if(!e)throw Error(`cave start ${t.side} names no chamber`);if(_(e.x,e.y),y.add(m(e.x,e.y)),t.ring)for(let[t,n]of c(e.x,e.y))h(t,n)&&(_(t,n),y.add(m(t,n)));b.push({side:t.side,x:e.x,y:e.y})}let x=[],S=e.villageDensity??0;if(S>0){let e=[];for(let t=0;t<g.length;t++)g[t]&&!y.has(t)&&e.push(t);let n=Math.floor(e.length*S/1e3);for(let r=0;r<n&&e.length;r++){let n=f(e.length),r=e.splice(n,1)[0];x.push({x:r%t,y:Math.floor(r/t)})}}for(let e=0;e<g.length;e++)g[e]&&p.set(e%t,Math.floor(e/t),i);return{level:p,chambers:[...a.entries()].map(([e,t])=>({id:e,centre:r.get(e),cells:t})),starts:b,villages:x}}finally{d===void 0&&T()}}_e();function sV(e,t,n,r,i){let a=e=>Math.max(2,Math.ceil(e/r)+2),o=a(t),s=a(n),c=new Float64Array(o*s);for(let t=0;t<c.length;t++)c[t]=e();let l=e=>e*e*(3-2*e),u=Array(t*n).fill(0);for(let e=0;e<3;e++){let a=1<<e,d=1/(a*a);for(let e=0;e<n;e++)for(let n=0;n<t;n++){let f=(i?n*cV:n)/r*a,p=(i?e+(n&1)/2:e)/r*a,m=Math.floor(f)%(o-1),h=Math.floor(p)%(s-1),g=l(f-Math.floor(f)),_=l(p-Math.floor(p)),v=(e,t)=>c[(h+t)%s*o+(m+e)%o],y=v(0,0)*(1-g)+v(1,0)*g,b=v(0,1)*(1-g)+v(1,1)*g;u[e*t+n]+=(y*(1-_)+b*_)*d}}for(let e=0;e<u.length;e++)u[e]/=1.3125;return u}var cV=Math.sqrt(3)/2,lV=[[0,-1],[0,1],[-1,0],[1,0],[-1,-1],[1,-1],[-1,1],[1,1]];function uV(e,t,n,r){if(e)for(let e of Jn(t,n))r(e.x,e.y,!1);else for(let[e,i]of lV)r(t+e,n+i,e!==0&&i!==0)}var dV={plains:1,forest:3,hills:5,desert:2,swamp:6,water:24,mountains:40};function fV(e){let{width:t,height:n}=e;if(t<16||n<16)throw Error(`an overworld needs at least 16x16 tiles`);let r=e.seaLevel??.4;if(!(r>0&&r<1))throw Error(`seaLevel must be between 0 and 1`);let i=e.noiseScale??6,a=e.shape===`hex`,o=(e,n)=>n*t+e,s=(e,r)=>e>=0&&r>=0&&e<t&&r<n;w(e.seed);try{let c=sV(()=>D(),t,n,i,a),l=sV(()=>D(),t,n,i*1.5,a),u=Array(t*n),d=(e,t)=>{let n=o(e,t),i=c[n],a=l[n];return i<r?`water`:i>.78?`mountains`:i>.62?`hills`:a<.3?`desert`:a>.72?i<r+.08?`swamp`:`forest`:`plains`};for(let e=0;e<n;e++)for(let n=0;n<t;n++)u[o(n,e)]=d(n,e);let f=new Set,p=[],m=e.rivers??Math.max(1,Math.floor(t*n/600)),h=[];for(let e=0;e<u.length;e++)c[e]>.7&&u[e]!==`water`&&h.push(e);for(let e=0;e<m*4&&p.length<m&&h.length!==0;e++){let e=h[O(h.length)],r=[],i=e%t,l=Math.floor(e/t),d=new Set;for(let e=0;e<t+n;e++){let e=o(i,l);if(f.has(e)||u[e]===`water`){r.length>0&&r.push({x:i,y:l});break}r.push({x:i,y:l}),d.add(e);let t;if(uV(a,i,l,(e,n)=>{if(!s(e,n))return;let r={x:e,y:n,up:c[o(e,n)]};(!t||r.up<t.up)&&(t=r)}),!t||t.up>=c[o(i,l)]){u[o(i,l)]=`water`;break}[i,l]=[t.x,t.y]}if(r.length>=2){for(let e of r)f.add(o(e.x,e.y));p.push(r)}}let g=[],_=(e,t)=>{if(a)return Qn({x:e,y:t},3).some(e=>s(e.x,e.y)&&u[o(e.x,e.y)]===`water`);for(let n=-3;n<=3;n++)for(let r=-3;r<=3;r++){let i=e+r,a=t+n;if(s(i,a)&&u[o(i,a)]===`water`)return!0}return!1},v=(e,t,n)=>g.every(r=>(a?Yn(r,{x:e,y:t}):Math.abs(r.x-e)+Math.abs(r.y-t))>=n),y=e.settlements??Math.max(2,Math.floor(t*n/500));for(let e=0;e<y*60&&g.length<y;e++){let e=O(t),r=O(n),i=u[o(e,r)];i!==`plains`&&i!==`hills`&&i!==`forest`||!_(e,r)||v(e,r,8)&&g.push({x:e,y:r,kind:i===`hills`?`castle`:`town`})}for(let e of g)e.kind===`town`&&O(2)===0&&(e.kind=`village`);let b=[],x=g[0];if(x){let e=[x],r=g.slice(1);for(;r.length;){let i;for(let o of r)for(let r of e){let e=pV(u,t,n,r,o,a);e&&(!i||e.length<i.path.length)&&(i={path:e,to:o})}if(!i)break;b.push(i.path),e.push(i.to),r.splice(r.indexOf(i.to),1)}}let S=[],C=e.pointsOfInterest??Math.max(1,Math.floor(t*n/900));for(let e=0;e<C*40&&S.length<C;e++){let e=O(t),r=O(n),i=u[o(e,r)];if(i===`water`||i===`mountains`||!v(e,r,6))continue;let a=[`ruin`,`shrine`,`dungeon`],s=a[O(a.length)];S.push({x:e,y:r,kind:s,leadsTo:`overworld-${s}-${S.length}`})}let ee=Math.max(2,e.regionSize??12),w=Math.ceil(t/ee),T=Array(t*n);for(let e=0;e<n;e++)for(let n=0;n<t;n++)T[o(n,e)]=Math.floor(e/ee)*w+Math.floor(n/ee);return{terrain:u,elevation:c,moisture:l,rivers:p,roads:b,settlements:g,pointsOfInterest:S,regions:T,regionColumns:w}}finally{T()}}function pV(e,t,n,r,i,a){let o=(e,n)=>n*t+e,s=(e,r)=>e>=0&&r>=0&&e<t&&r<n,c=t*n,l=new Float64Array(c).fill(1/0),u=new Int32Array(c).fill(-1),d=o(r.x,r.y),f=o(i.x,i.y);l[d]=0;let p=[d],m=new Uint8Array(c),h=e=>{for(;;){let t=e*2+1,n=t+1,r=e;if(t<p.length&&l[p[t]]<l[p[r]]&&(r=t),n<p.length&&l[p[n]]<l[p[r]]&&(r=n),r===e)return;[p[e],p[r]]=[p[r],p[e]],e=r}},g=()=>{let e=p[0],t=p.pop();return p.length&&(p[0]=t,h(0)),m[e]=0,e},_=e=>{p.push(e),m[e]=1;let t=p.length-1;for(;t>0;){let e=t-1>>1;if(l[p[e]]<=l[p[t]])break;[p[t],p[e]]=[p[e],p[t]],t=e}};for(;p.length;){let n=g();if(n===f){let e=[];for(let n=f;n!==-1;n=u[n])e.push({x:n%t,y:Math.floor(n/t)});return e.reverse()}uV(a,n%t,Math.floor(n/t),(t,r,i)=>{if(!s(t,r))return;let a=o(t,r);if(l[n]===1/0)return;let c=dV[e[a]]*(i?1.5:1);l[n]+c<l[a]&&(l[a]=l[n]+c,u[a]=n,m[a]||_(a))})}}var mV=class e{constructor(){this.defs=new Map,this.placed=new Map}define(e,t){this.defs.set(e,t)}place(e,t){if(!this.defs.has(t))throw Error(`FeatureLayer.place: no definition for kind "${t}"`);this.placed.set(e,t)}has(e){return this.placed.has(e)}kindAt(e){return this.placed.get(e)}remove(e){this.placed.delete(e)}inspect(e,t){this.defAt(e)?.inspect?.(e,t)}interact(e,t){let n=this.defAt(e);n&&(n.interact&&n.interact(e,t)===!1||(n.consequence?.(e,t),n.persistent===!1&&this.remove(e)))}defAt(e){let t=this.placed.get(e);return t===void 0?void 0:this.defs.get(t)}toJSON(){return{cells:[...this.placed.entries()]}}static fromJSON(t,n){let r=new e;for(let[e,n]of t)r.define(e,n);for(let[e,t]of n.cells)r.place(e,t);return r}};_e();function hV(e,t=[],n=!0){let r=[],i=e.map(e=>e.value);t.forEach((e,t)=>{if(e.enabled===!1){r.push({step:`rare`,index:t,outcome:`deferred`});return}let n=A(e.chance);r.push({step:`rare`,index:t,outcome:n?`added`:`skipped`}),n&&i.push(e.value)});for(let t=0;t<e.length;t++){let n=e[t].alternative;if(!n)continue;let a=A(n.chance);r.push({step:`alternative`,index:t,outcome:a?`swapped`:`kept`}),a&&(i[t]=n.value)}return n&&(oe(i),r.push({step:`shuffle`,index:-1,outcome:`shuffled`})),{roster:i,trace:r}}function gV(e,t){return e.length===t.length&&e.every((e,n)=>e.a===t[n].a&&e.b===t[n].b&&e.extra===t[n].extra)}function _V(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function vV(e,t){if(e.length!==t.length)return!1;let n=[...e].sort((e,t)=>e[0]-t[0]),r=[...t].sort((e,t)=>e[0]-t[0]);return n.every(([e,t],n)=>e===r[n][0]&&t===r[n][1])}function yV(e,t){let n=[];return e.retries!==t.retries&&n.push({stage:`graph`,field:`retries`,expected:e.retries,actual:t.retries}),gV(e.graph,t.graph)||n.push({stage:`graph`,field:`graph`,expected:e.graph,actual:t.graph}),(e.width!==t.width||e.height!==t.height||!_V(e.terrain,t.terrain))&&n.push({stage:`paint`,field:`terrain`,expected:e.terrain,actual:t.terrain}),(e.roomBuilders.length!==t.roomBuilders.length||e.roomBuilders.some((e,n)=>e!==t.roomBuilders[n]))&&n.push({stage:`paint`,field:`roomBuilders`,expected:e.roomBuilders,actual:t.roomBuilders}),vV(e.features,t.features)||n.push({stage:`paint`,field:`features`,expected:e.features,actual:t.features}),JSON.stringify(e.content)!==JSON.stringify(t.content)&&n.push({stage:`paint`,field:`content`,expected:e.content,actual:t.content}),e.rngDraws!==t.rngDraws&&n.push({stage:`paint`,field:`rngDraws`,expected:e.rngDraws,actual:t.rngDraws}),n}function bV(e,t=2){let n=e(),r=[];for(let i=1;i<t;i++)r.push(...yV(n,e()));return r}var xV=23283064365386963e-26;new class e{constructor(){this._seed=0,this._s0=0,this._s1=0,this._s2=0,this._c=0}getSeed(){return this._seed}setSeed(e){return e=e<1?1/e:e,this._seed=e,this._s0=(e>>>0)*xV,e=e*69069+1>>>0,this._s1=e*xV,e=e*69069+1>>>0,this._s2=e*xV,this._c=1,this}getUniform(){let e=2091639*this._s0+this._c*xV;return this._s0=this._s1,this._s1=this._s2,this._c=e|0,this._s2=e-this._c,this._s2}getUniformInt(e,t){let n=Math.max(e,t),r=Math.min(e,t);return Math.floor(this.getUniform()*(n-r+1))+r}getNormal(e=0,t=1){let n,r,i;do n=2*this.getUniform()-1,r=2*this.getUniform()-1,i=n*n+r*r;while(i>1||i==0);return e+n*Math.sqrt(-2*Math.log(i)/i)*t}getPercentage(){return 1+Math.floor(this.getUniform()*100)}getItem(e){return e.length?e[Math.floor(this.getUniform()*e.length)]:null}shuffle(e){let t=[],n=e.slice();for(;n.length;){let e=n.indexOf(this.getItem(n));t.push(n.splice(e,1)[0])}return t}getWeightedValue(e){let t=0;for(let n in e)t+=e[n];let n=this.getUniform()*t,r,i=0;for(r in e)if(i+=e[r],n<i)return r;return r}getState(){return[this._s0,this._s1,this._s2,this._c]}setState(e){return this._s0=e[0],this._s1=e[1],this._s2=e[2],this._c=e[3],this}clone(){return new e().setState(this.getState())}}().setSeed(Date.now());var SV=class{getContainer(){return null}setOptions(e){this._options=e}},CV=class extends SV{constructor(){super(),this._ctx=document.createElement(`canvas`).getContext(`2d`)}schedule(e){requestAnimationFrame(e)}getContainer(){return this._ctx.canvas}setOptions(e){super.setOptions(e);let t=`${e.fontStyle?`${e.fontStyle} `:``} ${e.fontSize}px ${e.fontFamily}`;this._ctx.font=t,this._updateSize(),this._ctx.font=t,this._ctx.textAlign=`center`,this._ctx.textBaseline=`middle`}clear(){let e=this._ctx.globalCompositeOperation;this._ctx.globalCompositeOperation=`copy`,this._ctx.fillStyle=this._options.bg,this._ctx.fillRect(0,0,this._ctx.canvas.width,this._ctx.canvas.height),this._ctx.globalCompositeOperation=e}eventToPosition(e,t){let n=this._ctx.canvas,r=n.getBoundingClientRect();return e-=r.left,t-=r.top,e*=n.width/r.width,t*=n.height/r.height,e<0||t<0||e>=n.width||t>=n.height?[-1,-1]:this._normalizedEventToPosition(e,t)}};function wV(e){return e.charAt(0).toUpperCase()+e.substring(1)}function TV(e,...t){let n=TV.map;return e.replace(/%(?:([a-z]+)|(?:{([^}]+)}))/gi,function(r,i,a,o){if(e.charAt(o-1)==`%`)return r.substring(1);if(!t.length)return r;let s=t[0],c=(i||a).split(`,`),l=c.shift()||``,u=n[l.toLowerCase()];if(!u)return r;s=t.shift();let d=s[u].apply(s,c),f=l.charAt(0);return f!=f.toLowerCase()&&(d=wV(d)),d})}TV.map={s:`toString`};var EV=class e extends CV{constructor(){super(),this._spacingX=0,this._spacingY=0,this._canvasCache={}}setOptions(e){super.setOptions(e),this._canvasCache={}}draw(t,n){e.cache?this._drawWithCache(t):this._drawNoCache(t,n)}_drawWithCache(e){let[t,n,r,i,a]=e,o=``+r+i+a,s;if(o in this._canvasCache)s=this._canvasCache[o];else{let e=this._options.border;s=document.createElement(`canvas`);let t=s.getContext(`2d`);if(s.width=this._spacingX,s.height=this._spacingY,t.fillStyle=a,t.fillRect(e,e,s.width-e,s.height-e),r){t.fillStyle=i,t.font=this._ctx.font,t.textAlign=`center`,t.textBaseline=`middle`;let e=[].concat(r);for(let n=0;n<e.length;n++)t.fillText(e[n],this._spacingX/2,Math.ceil(this._spacingY/2))}this._canvasCache[o]=s}this._ctx.drawImage(s,t*this._spacingX,n*this._spacingY)}_drawNoCache(e,t){let[n,r,i,a,o]=e;if(t){let e=this._options.border;this._ctx.fillStyle=o,this._ctx.fillRect(n*this._spacingX+e,r*this._spacingY+e,this._spacingX-e,this._spacingY-e)}if(!i)return;this._ctx.fillStyle=a;let s=[].concat(i);for(let e=0;e<s.length;e++)this._ctx.fillText(s[e],(n+.5)*this._spacingX,Math.ceil((r+.5)*this._spacingY))}computeSize(e,t){return[Math.floor(e/this._spacingX),Math.floor(t/this._spacingY)]}computeFontSize(e,t){let n=Math.floor(e/this._options.width),r=Math.floor(t/this._options.height),i=this._ctx.font;this._ctx.font=`100px `+this._options.fontFamily;let a=Math.ceil(this._ctx.measureText(`W`).width);this._ctx.font=i;let o=a/100*r/n;return o>1&&(r=Math.floor(r/o)),Math.floor(r/this._options.spacing)}_normalizedEventToPosition(e,t){return[Math.floor(e/this._spacingX),Math.floor(t/this._spacingY)]}_updateSize(){let e=this._options,t=Math.ceil(this._ctx.measureText(`W`).width);this._spacingX=Math.ceil(e.spacing*t),this._spacingY=Math.ceil(e.spacing*e.fontSize),e.forceSquareRatio&&(this._spacingX=this._spacingY=Math.max(this._spacingX,this._spacingY)),this._ctx.canvas.width=e.width*this._spacingX,this._ctx.canvas.height=e.height*this._spacingY}};EV.cache=!1;var DV={4:[[0,-1],[1,0],[0,1],[-1,0]],8:[[0,-1],[1,-1],[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1]],6:[[-1,-1],[1,-1],[2,0],[1,1],[-1,1],[-2,0]]},OV=class{constructor(e,t={}){this._lightPasses=e,this._options=Object.assign({topology:8},t)}_getCircle(e,t,n){let r=[],i,a,o;switch(this._options.topology){case 4:a=1,o=[0,1],i=[DV[8][7],DV[8][1],DV[8][3],DV[8][5]];break;case 6:i=DV[6],a=1,o=[-1,1];break;case 8:i=DV[4],a=2,o=[-1,1];break;default:throw Error(`Incorrect topology for FOV computation`)}let s=e+o[0]*n,c=t+o[1]*n;for(let e=0;e<i.length;e++)for(let t=0;t<n*a;t++)r.push([s,c]),s+=i[e][0],c+=i[e][1];return r}},kV=class extends OV{compute(e,t,n,r){if(r(e,t,0,1),!this._lightPasses(e,t))return;let i=[],a,o,s,c,l;for(let u=1;u<=n;u++){let n=this._getCircle(e,t,u),d=360/n.length;for(let e=0;e<n.length;e++)if(s=n[e][0],c=n[e][1],a=d*(e-.5),o=a+d,l=!this._lightPasses(s,c),this._visibleCoords(Math.floor(a),Math.ceil(o),l,i)&&r(s,c,u,1),i.length==2&&i[0]==0&&i[1]==360)return}}_visibleCoords(e,t,n,r){if(e<0){let i=this._visibleCoords(0,t,n,r),a=this._visibleCoords(360+e,360,n,r);return i||a}let i=0;for(;i<r.length&&r[i]<e;)i++;if(i==r.length)return n&&r.push(e,t),!0;let a=0;if(i%2){for(;i<r.length&&r[i]<t;)i++,a++;return a!=0&&(n&&(a%2?r.splice(i-a,a,t):r.splice(i-a,a)),!0)}for(;i<r.length&&r[i]<t;)i++,a++;return e==r[i-a]&&a==1?!1:(n&&(a%2?r.splice(i-a,a,e):r.splice(i-a,a,e,t)),!0)}},AV=class extends OV{compute(e,t,n,r){if(r(e,t,0,1),!this._lightPasses(e,t))return;let i=[],a,o,s,c,l,u;for(let d=1;d<=n;d++){let n=this._getCircle(e,t,d),f=n.length;for(let e=0;e<f;e++)if(a=n[e][0],o=n[e][1],c=[e?2*e-1:2*f-1,2*f],l=[2*e+1,2*f],s=!this._lightPasses(a,o),u=this._checkVisibility(c,l,s,i),u&&r(a,o,d,u),i.length==2&&i[0][0]==0&&i[1][0]==i[1][1])return}}_checkVisibility(e,t,n,r){if(e[0]>t[0])return(this._checkVisibility(e,[e[1],e[1]],n,r)+this._checkVisibility([0,1],t,n,r))/2;let i=0,a=!1;for(;i<r.length;){let t=r[i],n=t[0]*e[1]-e[0]*t[1];if(n>=0){n==0&&!(i%2)&&(a=!0);break}i++}let o=r.length,s=!1;for(;o--;){let e=r[o],n=t[0]*e[1]-e[0]*t[1];if(n>=0){n==0&&o%2&&(s=!0);break}}let c=!0;if((i==o&&(a||s)||a&&s&&i+1==o&&o%2||i>o&&i%2)&&(c=!1),!c)return 0;let l,u=o-i+1;if(u%2){if(i%2){let e=r[i];l=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]),n&&r.splice(i,u,t)}else{let t=r[o];l=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]),n&&r.splice(i,u,e)}}else if(i%2){let e=r[i],t=r[o];l=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]),n&&r.splice(i,u)}else return n&&r.splice(i,u,e,t),1;let d=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]);return l/d}},jV=[[-1,0,0,1],[0,-1,1,0],[0,-1,-1,0],[-1,0,0,-1],[1,0,0,-1],[0,1,-1,0],[0,1,1,0],[1,0,0,1]],MV={DiscreteShadowcasting:kV,PreciseShadowcasting:AV,RecursiveShadowcasting:class extends OV{compute(e,t,n,r){r(e,t,0,1);for(let i=0;i<jV.length;i++)this._renderOctant(e,t,jV[i],n,r)}compute180(e,t,n,r,i){i(e,t,0,1);let a=(r-1+8)%8,o=(r-2+8)%8,s=(r+1+8)%8;this._renderOctant(e,t,jV[o],n,i),this._renderOctant(e,t,jV[a],n,i),this._renderOctant(e,t,jV[r],n,i),this._renderOctant(e,t,jV[s],n,i)}compute90(e,t,n,r,i){i(e,t,0,1);let a=(r-1+8)%8;this._renderOctant(e,t,jV[r],n,i),this._renderOctant(e,t,jV[a],n,i)}_renderOctant(e,t,n,r,i){this._castVisibility(e,t,1,1,0,r+1,n[0],n[1],n[2],n[3],i)}_castVisibility(e,t,n,r,i,a,o,s,c,l,u){if(!(r<i))for(let d=n;d<=a;d++){let n=-d-1,f=-d,p=!1,m=0;for(;n<=0;){n+=1;let h=e+n*o+f*s,g=t+n*c+f*l,_=(n-.5)/(f+.5),v=(n+.5)/(f-.5);if(!(v>r)){if(_<i)break;if(n*n+f*f<a*a&&u(h,g,d,1),!p)!this._lightPasses(h,g)&&d<a&&(p=!0,this._castVisibility(e,t,d+1,r,_,a,o,s,c,l,u),m=v);else{if(!this._lightPasses(h,g)){m=v;continue}p=!1,r=m}}}if(p)break}}}};.5*(Math.sqrt(3)-1),(3-Math.sqrt(3))/6;var NV=class{constructor(e,t,n,r={}){this._toX=e,this._toY=t,this._passableCallback=n,this._options=Object.assign({topology:8},r),this._dirs=DV[this._options.topology],this._options.topology==8&&(this._dirs=[this._dirs[0],this._dirs[2],this._dirs[4],this._dirs[6],this._dirs[1],this._dirs[3],this._dirs[5],this._dirs[7]])}_getNeighbors(e,t){let n=[];for(let r=0;r<this._dirs.length;r++){let i=this._dirs[r],a=e+i[0],o=t+i[1];this._passableCallback(a,o)&&n.push([a,o])}return n}},PV={Dijkstra:class extends NV{constructor(e,t,n,r){super(e,t,n,r),this._computed={},this._todo=[],this._add(e,t,null)}compute(e,t,n){let r=e+`,`+t;if(r in this._computed||this._compute(e,t),!(r in this._computed))return;let i=this._computed[r];for(;i;)n(i.x,i.y),i=i.prev}_compute(e,t){for(;this._todo.length;){let n=this._todo.shift();if(n.x==e&&n.y==t)return;let r=this._getNeighbors(n.x,n.y);for(let e=0;e<r.length;e++){let t=r[e],i=t[0],a=t[1];i+`,`+a in this._computed||this._add(i,a,n)}}}_add(e,t,n){let r={x:e,y:t,prev:n};this._computed[e+`,`+t]=r,this._todo.push(r)}},AStar:class extends NV{constructor(e,t,n,r={}){super(e,t,n,r),this._todo=[],this._done={}}compute(e,t,n){for(this._todo=[],this._done={},this._fromX=e,this._fromY=t,this._add(this._toX,this._toY,null);this._todo.length;){let n=this._todo.shift(),r=n.x+`,`+n.y;if(r in this._done)continue;if(this._done[r]=n,n.x==e&&n.y==t)break;let i=this._getNeighbors(n.x,n.y);for(let e=0;e<i.length;e++){let t=i[e],r=t[0],a=t[1];r+`,`+a in this._done||this._add(r,a,n)}}let r=this._done[e+`,`+t];if(r)for(;r;)n(r.x,r.y),r=r.prev}_add(e,t,n){let r=this._distance(e,t),i={x:e,y:t,prev:n,g:n?n.g+1:0,h:r},a=i.g+i.h;for(let e=0;e<this._todo.length;e++){let t=this._todo[e],n=t.g+t.h;if(a<n||a==n&&r<t.h){this._todo.splice(e,0,i);return}}this._todo.push(i)}_distance(e,t){switch(this._options.topology){case 4:return Math.abs(e-this._fromX)+Math.abs(t-this._fromY);case 6:let n=Math.abs(e-this._fromX),r=Math.abs(t-this._fromY);return r+Math.max(0,(n-r)/2);case 8:return Math.max(Math.abs(e-this._fromX),Math.abs(t-this._fromY))}}}};function FV(e,t){return dr(e,t)}function IV(e,t){let n=[],r=e.x,i=e.y,a=Math.abs(t.x-e.x),o=-Math.abs(t.y-e.y),s=e.x<t.x?1:-1,c=e.y<t.y?1:-1,l=a+o;for(;n.push({x:r,y:i}),r!==t.x||i!==t.y;){let e=l*2;e>=o&&(l+=o,r+=s),e<=a&&(l+=a,i+=c)}return n}function LV(e,t,n,r={}){let i=e.shape===`hex`?Zn(t,n):IV(t,n),a=r.stop??`opaque`,o=[],s=null;for(let t of i)if(o.push(t),o.length!==1&&a!==`none`&&(a===`outside`&&!e.inside(t.x,t.y)||a===`opaque`&&e.inside(t.x,t.y)&&!e.transparent(t.x,t.y)||a===`impassable`&&e.inside(t.x,t.y)&&!e.passable(t.x,t.y))){s=t;break}return{cells:o,stop:s}}function RV(e,t,n){let r=e.shape===`hex`?Zn(t,n):IV(t,n);for(let t=1;t<r.length-1;t++)if(!e.transparent(r[t].x,r[t].y))return!1;return!0}function zV(e,t,n,r){return!((e.shape===`hex`?Yn(t,n):FV(t,n))>r.range||(r.requireLineOfSight??!0)&&!RV(e,t,n))}function BV(e,t,n){switch(n.kind){case`single`:return[t];case`line`:return IV(e,t);case`cone`:return UV(e,t,n.width);case`burst`:{let e=[],r=n.radius;for(let n=-r;n<=r;n++)for(let i=-r;i<=r;i++)i*i+n*n>r*r||e.push({x:t.x+i,y:t.y+n});return e}}}function VV(e,t,n,r){return e.shape===`hex`?r.kind===`single`?[{...n}]:r.kind===`line`?Zn(t,n):r.kind===`burst`?Qn(n,r.radius):HV(t,n,r.width):BV(t,n,r)}function HV(e,t,n){let r=Yn(e,t);if(r===0)return[{...e}];let i=Zn(e,t),a=[];for(let t=1;t<=r;t++){let o=i[t],s=Math.round(t/r*n);for(let n of Qn(o,s))Yn(e,n)===t&&a.push(n)}return a}function UV(e,t,n){let r=t.x-e.x,i=t.y-e.y,a=Math.max(Math.abs(r),Math.abs(i));if(a===0)return[{...e}];let o=Math.sign(r),s=Math.sign(i),c=r!==0&&i!==0?o:s,l=r!==0&&i!==0?-s:o,u=[];for(let t=1;t<=a;t++){let r=e.x+o*t,i=e.y+s*t,d=Math.round(t/a*n);for(let e=-d;e<=d;e++)u.push({x:r+c*e,y:i+l*e})}return u}var WV=.5;function GV(e){return e<0?-Math.round(-e):Math.round(e)}function KV(e,t,n,r){if(!Number.isFinite(r.degrees)||r.degrees<0)throw Error(`a cone sector needs a finite non-negative angle in degrees`);if(!Number.isFinite(r.range)||r.range<0)throw Error(`a cone sector needs a finite non-negative range`);let i=n.x-t.x,a=n.y-t.y;if(i===0&&a===0)return[{...t}];let o=Math.atan2(a,i),s=r.degrees*Math.PI/360,c=Math.max(1,Math.round(r.degrees/WV)),l=r.stop??`opaque`,u=new Set,d=[];for(let n=0;n<=c;n++){let i=o-s+2*s*n/c,a={x:t.x+GV(Math.cos(i)*r.range),y:t.y+GV(Math.sin(i)*r.range)};for(let n of LV(e,t,a,{stop:l}).cells){if(n.x===t.x&&n.y===t.y||!e.inside(n.x,n.y))continue;let r=e.index(n.x,n.y);u.has(r)||(u.add(r),d.push({x:n.x,y:n.y}))}}return d}function qV(e,t,n,r){let i=new Set,a=[],o=t;for(let t=0;t<n;t++){let t=-1,n=r+1;for(let a=0;a<e.length;a++){if(i.has(a))continue;let s=FV(o,e[a]);s<=r&&s<n&&(n=s,t=a)}if(t===-1)break;i.add(t),a.push(e[t]),o=e[t]}return a}function JV(e,t,n=1){for(let n of t)if(e<=n.max)return n.multiplier;return n}function YV(e,t){return t.length===0?1:t[Math.min(e,t.length-1)]}function XV(e,t,n,r){let i=[];for(let a=1;a<=r;a++){let r={x:t.x+n.x*a,y:t.y+n.y*a};if(!e.passable(r.x,r.y))break;i.push(r)}return i}var ZV=class{constructor(e,t){if(this.onMove=new p,this.onConfirm=new p,this.onCancel=new p,!Number.isFinite(t.range)||t.range<0)throw Error(`targeting range must be a finite non-negative number`);this.level=e,this.origin={...t.origin},this.range=t.range,this.requireLineOfSight=t.requireLineOfSight??!0,this.validate=t.validate,this.shape=t.shape??{kind:`single`},this.cursor={...t.cursor??t.origin}}get target(){return{...this.cursor}}get distance(){return this.level.shape===`hex`?Yn(this.origin,this.cursor):FV(this.origin,this.cursor)}get inRange(){return this.distance<=this.range}get inSight(){return RV(this.level,this.origin,this.cursor)}get valid(){return!this.inRange||this.requireLineOfSight&&!this.inSight?!1:!this.validate||this.validate(this.cursor)}move(e,t){if(this.level.shape===`hex`){let n=this.level.neighbors(this.cursor.x,this.cursor.y).find(n=>n.x-this.cursor.x===e&&n.y-this.cursor.y===t);n&&this.moveTo(n)}else this.moveTo({x:this.cursor.x+e,y:this.cursor.y+t})}moveTo(e){this.level.inside(e.x,e.y)&&(this.cursor={x:e.x,y:e.y},this.onMove.dispatch({...this.cursor}))}setShape(e){this.shape=e}preview(){return this.valid?VV(this.level,this.origin,this.cursor,this.shape):[]}confirm(){if(!this.valid)return null;let e={origin:{...this.origin},target:{...this.cursor},shape:this.shape,cells:this.preview()};return this.onConfirm.dispatch(e),e}cancel(){this.onCancel.dispatch()}},QV=class{constructor(e){this.visible=new Set,this.explored=new Set,this.light=new Map,this.level=e,this.fov=e.shape===`hex`?null:new MV.PreciseShadowcasting((t,n)=>e.transparent(t,n))}update(e,t,n=this.level.viewDistance??Math.max(this.level.width,this.level.height),r){if(this.visible.clear(),this.light.clear(),r){this.updateFromHeight(e,t,n,r);return}if(this.fov){this.fov.compute(e,t,n,(e,t,n,r)=>{if(!this.level.inside(e,t))return;let i=this.level.index(e,t);this.visible.add(i),this.explored.add(i),this.light.set(i,r)});return}let i={x:e,y:t};for(let e of Qn(i,n)){if(!this.level.inside(e.x,e.y))continue;let t=Zn(i,e);t.slice(1,-1).some(e=>!this.level.inside(e.x,e.y)||!this.level.transparent(e.x,e.y))||this.lightCell(e.x,e.y,t.length-1,n)}}lightCell(e,t,n,r){let i=this.level.index(e,t);this.visible.add(i),this.explored.add(i),this.light.set(i,r===0?1:Math.max(0,1-n/(r+1)))}updateFromHeight(e,t,n,r){let i=r.height??r.heights.heightAt(e,t),a={x:e,y:t};if(this.level.shape===`hex`)for(let e of Qn(a,n)){if(!this.level.inside(e.x,e.y))continue;let t=Zn(a,e);this.heightBlocked(t,r.heights,i,r.heights.heightAt(e.x,e.y))||this.lightCell(e.x,e.y,t.length-1,n)}else for(let o=t-n;o<=t+n;o++)for(let t=e-n;t<=e+n;t++){if(!this.level.inside(t,o)||FV(a,{x:t,y:o})>n)continue;let e=IV(a,{x:t,y:o});this.heightBlocked(e,r.heights,i,r.heights.heightAt(t,o))||this.lightCell(t,o,e.length-1,n)}}heightBlocked(e,t,n,r){let i=Math.max(n,r);for(let n=1;n<e.length-1;n++){let r=e[n];if(!this.level.inside(r.x,r.y)||!this.level.transparent(r.x,r.y)||t.heightAt(r.x,r.y)>i)return!0}return!1}isVisible(e,t){return this.visible.has(this.level.index(e,t))}isExplored(e,t){return this.explored.has(this.level.index(e,t))}lightAt(e,t){return this.light.get(this.level.index(e,t))??0}reset(){this.visible.clear(),this.explored.clear(),this.light.clear()}revealAll(){for(let e=0;e<this.level.cellCount;e++)this.explored.add(e)}},$V=class{constructor(e){this.level=e,this.heights=new Int32Array(e.cellCount)}heightAt(e,t){return this.level.inside(e,t)?this.heights[this.level.index(e,t)]:0}set(e,t,n){if(!Number.isInteger(n))throw Error(`a cell's height must be a whole number, got ${n}`);this.level.inside(e,t)&&(this.heights[this.level.index(e,t)]=n)}},eH=class{constructor(e){this.level=e}passable(e){let t=e.blocked;return(e,n)=>this.level.passable(e,n)?!t?.has(this.level.index(e,n)):!1}stepper(e){let t=this.passable(e),n=e.heights;if(!n)return(e,n,r,i)=>this.level.inside(e,n)&&this.level.inside(r,i)&&t(r,i);let r=e.climb??1;if(!Number.isInteger(r)||r<0)throw Error(`a climb limit must be a non-negative whole number, got ${e.climb}`);return(e,i,a,o)=>this.level.inside(e,i)&&this.level.inside(a,o)&&t(a,o)&&n.heightAt(a,o)-n.heightAt(e,i)<=r}find(e,t,n={}){if(this.level.shape===`hex`||n.heights){let r=this.distanceMap(t,n),i=[],a=e;for(let e=0;e<this.level.cellCount;e++){let e=this.descend(a,r,n);if(!e||(i.push(e),e.x===t.x&&e.y===t.y))break;a=e}return i}let r=new PV.AStar(t.x,t.y,this.passable(n),{topology:n.topology??8}),i=[];return r.compute(e.x,e.y,(e,t)=>i.push({x:e,y:t})),i.slice(1)}step(e,t,n={}){return this.find(e,t,n)[0]??null}distanceMap(e,t={}){let n=new Int32Array(this.level.cellCount).fill(-1),r=this.passable(t),i=this.stepper(t);if(!r(e.x,e.y))return n;let a=[this.level.index(e.x,e.y)];n[a[0]]=0;for(let e=0;e<a.length;e++){let r=a[e],o=this.level.xOf(r),s=this.level.yOf(r),c=n[r]+1;this.level.forEachNeighbor(o,s,t.topology??8,(e,t)=>{if(!i(e,t,o,s))return;let r=this.level.index(e,t);n[r]===-1&&(n[r]=c,a.push(r))})}return n}descend(e,t,n={}){let r=this.stepper(n),i=t[this.level.index(e.x,e.y)];if(i<=0)return null;let a=null,o=i;return this.level.forEachNeighbor(e.x,e.y,n.topology??8,(n,i)=>{if(!r(e.x,e.y,n,i))return;let s=t[this.level.index(n,i)];s!==-1&&s<o&&(o=s,a={x:n,y:i})}),a}autoExplore(e,t,n={}){let r=this.passable(n),i=this.stepper(n);if(!r(e.x,e.y))return[];let a=new Map,o=new Set([this.level.index(e.x,e.y)]),s=[e];for(let e=0;e<s.length;e++){let r=s[e];if(e>0&&!t.isExplored(r.x,r.y))return this.reconstruct(a,r);this.level.forEachNeighbor(r.x,r.y,n.topology??8,(e,t)=>{if(!i(r.x,r.y,e,t))return;let n=this.level.index(e,t);o.has(n)||(o.add(n),a.set(n,r),s.push({x:e,y:t}))})}return[]}reconstruct(e,t){let n=[t],r=e.get(this.level.index(t.x,t.y));for(;r;)n.push(r),r=e.get(this.level.index(r.x,r.y));return n.reverse()}},tH=class e{constructor(){this.entries=[],this.sequence=0,this.now=0}get size(){return this.entries.length}get actors(){return this.entries.map(e=>e.actor)}has(e){return this.entries.some(t=>t.actor===e)}add(e,t=0,n=e.priority??0){if(!Number.isFinite(t)||t<0)throw Error(`scheduler delay must be finite and non-negative`);if(!Number.isFinite(n))throw Error(`scheduler priority must be finite`);this.entries.push({actor:e,time:this.now+t,sequence:this.sequence++,priority:n}),this.sort()}remove(e){let t=this.entries.findIndex(t=>t.actor===e);t!==-1&&this.entries.splice(t,1)}clear(){this.entries.length=0,this.now=0,this.sequence=0}peek(){let e=this.entries[0];return e?(this.now=Math.max(this.now,e.time),e.actor):null}spend(e){let t=this.entries[0];if(!t)return;let n=t.actor.speed??1;t.time=this.now+e/(n>0?n:1),t.sequence=this.sequence++,this.sort()}postpone(e,t){let n=this.entries.find(t=>t.actor===e);n&&(n.time+=t,n.sequence=this.sequence++,this.sort())}timeOf(e){return this.entries.find(t=>t.actor===e)?.time??null}toJSON(e){return{now:this.now,sequence:this.sequence,entries:this.entries.map(t=>({id:e(t.actor),time:t.time,sequence:t.sequence,...t.priority===0?{}:{priority:t.priority}}))}}static restore(t,n){let r=new e;return r.now=t.now,r.sequence=t.sequence,r.entries=t.entries.map(e=>({actor:n(e.id),time:e.time,sequence:e.sequence,priority:e.priority??0})),r.sort(),r}sort(){this.entries.sort((e,t)=>e.time-t.time||t.priority-e.priority||e.sequence-t.sequence)}};_e();function nH(e,t,n,r,i,a={}){let o=a.sightRadius??6,s=a.fleeBelow??0;if((a.disposition??`hostile`)!==`hostile`&&a.provoked!==!0)return{state:`wander`,step:rH(e,n,a)};let c=new QV(e);return c.update(n.x,n.y,o),c.isVisible(i.x,i.y)?r<=s?{state:`flee`,step:iH(e,n,i,a)}:{state:`hunt`,step:t.step(n,i,a)}:{state:`wander`,step:rH(e,n,a)}}function rH(e,t,n){return re(aH(e,t,n))}function iH(e,t,n,r){let i=aH(e,t,r),a=null,o=oH(t,n);for(let e of i){let t=oH(e,n);t>o&&(o=t,a=e)}return a}function aH(e,t,n){let r=n.blocked,i=[];for(let[a,o]of RB(n.topology??8)){let n={x:t.x+a,y:t.y+o};e.passable(n.x,n.y)&&(r?.has(e.index(n.x,n.y))||i.push(n))}return i}function oH(e,t){return(e.x-t.x)**2+(e.y-t.y)**2}var sH=class e{constructor(e){this.revealedKind=new Map,this.discovered=new Set,this.level=e}conceal(e,t,n,r){let i=this.level.index(e,t);this.revealedKind.set(i,r),this.discovered.delete(i),this.level.set(e,t,n)}isSecret(e,t){let n=this.level.index(e,t);return this.revealedKind.has(n)&&!this.discovered.has(n)}isDiscovered(e,t){return this.discovered.has(this.level.index(e,t))}discover(e,t){if(!this.isSecret(e,t))return!1;let n=this.level.index(e,t);return this.discovered.add(n),this.level.set(e,t,this.revealedKind.get(n)),!0}toJSON(){return{revealed:[...this.revealedKind],discovered:[...this.discovered]}}static fromJSON(t,n){let r=new e(t);for(let[e,t]of n.revealed)r.revealedKind.set(e,t);for(let e of n.discovered)r.discovered.add(e);return r}},cH=class e{constructor(e){this.openKind=new Map,this.closedKind=new Map,this.lockedBy=new Map,this.open_=new Map,this.level=e}place(e,t,n){let r=this.level.index(e,t);this.openKind.set(r,n.open),this.closedKind.set(r,n.closed),this.open_.set(r,n.startOpen??!1),n.locked===void 0?this.lockedBy.delete(r):this.lockedBy.set(r,n.locked),this.level.set(e,t,this.open_.get(r)?n.open:n.closed)}isDoor(e,t){return this.open_.has(this.level.index(e,t))}isOpen(e,t){return this.open_.get(this.level.index(e,t))===!0}isLocked(e,t){return this.lockedBy.has(this.level.index(e,t))}requiredKey(e,t){return this.lockedBy.get(this.level.index(e,t))}open(e,t){let n=this.level.index(e,t);return!this.open_.has(n)||this.open_.get(n)||this.lockedBy.has(n)?!1:(this.open_.set(n,!0),this.level.set(e,t,this.openKind.get(n)),!0)}close(e,t){let n=this.level.index(e,t);return!this.open_.has(n)||!this.open_.get(n)?!1:(this.open_.set(n,!1),this.level.set(e,t,this.closedKind.get(n)),!0)}unlock(e,t){let n=this.level.index(e,t);return this.lockedBy.has(n)?(this.lockedBy.delete(n),!0):!1}toJSON(){let e=[];for(let[t,n]of this.openKind)e.push({cell:t,open:n,closed:this.closedKind.get(t),locked:this.lockedBy.get(t),isOpen:this.open_.get(t)===!0});return{doors:e}}static fromJSON(t,n){let r=new e(t);for(let e of n.doors){let n=t.xOf(e.cell),i=t.yOf(e.cell);r.place(n,i,{open:e.open,closed:e.closed,locked:e.locked,startOpen:e.isOpen})}return r}},lH=class e{constructor(e=[]){this.current=0;for(let t=1;t<e.length;t++)if(e[t]>=e[t-1])throw Error(`boss phase thresholds must descend`);this.thresholds=e}get phase(){return this.current}check(e){let t=0;for(;t<this.thresholds.length&&e<=this.thresholds[t];)t++;let n=[];for(;this.current<t;)this.current++,n.push(this.current);return n}reset(){this.current=0}toJSON(){return{phase:this.current}}static fromJSON(t,n){let r=new e(t);return r.current=n.phase,r}},uH=class e{constructor(e){this.remaining=new Map,this.cooldowns=new Map(Object.entries(e))}advance(e=1){for(let[t,n]of this.remaining)n<=e?this.remaining.delete(t):this.remaining.set(t,n-e)}ready(){let e=[];for(let t of this.cooldowns.keys())this.remaining.has(t)||e.push(t);return e}use(e){let t=this.cooldowns.get(e);return t===void 0||this.remaining.has(e)?!1:(t>0&&this.remaining.set(e,t),!0)}toJSON(){return{remaining:[...this.remaining]}}static fromJSON(t,n){let r=new e(t);for(let[e,t]of n.remaining)r.remaining.set(e,t);return r}},dH=class extends S{modifyDamage(e,t,n){let r={attacker:e,defender:t,amount:n,prevented:!1};return this.emit(`beforeDamage`,r),r.amount=Math.max(0,r.amount),r.amount===0&&(r.prevented=!0),r}},fH=class{constructor(e){this.detected=!1,this.radius=e.radius}get isDetected(){return this.detected}checkDetection(e,t){if(this.detected)return!1;let n=t.some(t=>FV(e,t)<=this.radius);return n&&(this.detected=!0),n}reset(){this.detected=!1}},pH=class e{constructor(e){this.streak=0,this.lastTurn=-1/0,this.window=e}get count(){return this.streak}trigger(e){return this.streak=e-this.lastTurn<=this.window?this.streak+1:1,this.lastTurn=e,this.streak}isActive(e){return e-this.lastTurn<=this.window}reset(){this.streak=0,this.lastTurn=-1/0}toJSON(){return{streak:this.streak,lastTurn:this.lastTurn}}static fromJSON(t,n){let r=new e(t);return r.streak=n.streak,r.lastTurn=n.lastTurn,r}},mH=class e{constructor(e){if(this.index=-1,this.remaining=0,e.length===0)throw Error(`a multi-stage ability needs at least one stage`);this.stages=e}get active(){return this.index>=0}get stage(){return this.index>=0?this.stages[this.index]:null}start(){return!this.active&&(this.index=0,this.remaining=this.stages[0].duration,!0)}advance(){return!this.active||(this.remaining--,this.remaining>0)?null:(this.index++,this.index>=this.stages.length?(this.index=-1,`done`):(this.remaining=this.stages[this.index].duration,this.stages[this.index].name))}cancel(){this.index=-1,this.remaining=0}toJSON(){return{index:this.index,remaining:this.remaining}}static fromJSON(t,n){let r=new e(t);return r.index=n.index,r.remaining=n.remaining,r}},hH=class e{constructor(e){if(this.index=0,this.state=`idle`,typeof e.damage!=`function`&&!Number.isFinite(e.damage))throw Error(`beam damage must be a finite number or a function`);if(typeof e.damage==`number`&&e.damage<0)throw Error(`beam damage must be non-negative`);if(this.options=e,this.shape=e.shape??(e.fronts?`fronts`:`line`),e.fronts){let t=e.fronts([{...e.from}],0);this.fronts=t.length?[t.map(e=>({...e}))]:[]}else this.fronts=VV(e.level,e.from,e.target,{kind:`line`}).slice(1).map(e=>[{...e}])}get active(){return this.state===`active`}get done(){return this.state===`done`||this.state===`blocked`||this.state===`cancelled`}get beamShape(){return this.shape}get currentPath(){return this.fronts.flat().map(e=>({...e}))}start(){return this.state===`idle`&&(this.state=this.fronts.length===0?`done`:`active`,!0)}advance(){if(this.state!==`active`)return this.inactiveStep();let e=this.fronts[this.index]??[],t=Math.max(0,this.fronts.length-this.index-1),n=[],r=[],i=0;for(let a of e){let e={cell:{...a},step:this.index,remaining:t};if(!this.blocked(a,e)){n.push({...a}),this.options.onCell?.({...a},e);for(let t of this.options.targetsAt?.(a)??[]){let n=typeof this.options.damage==`function`?this.options.damage(t,e):this.options.damage;if(!Number.isFinite(n)||n<0)throw Error(`beam damage callback must return a non-negative finite number`);i+=n,r.push(t),this.options.applyDamage?.(t,n,e)}}}let a=this.index;if(this.index++,this.options.fronts&&n.length>0){let e=this.options.fronts(n.map(e=>({...e})),this.index);e.length&&this.fronts.push(e.map(e=>({...e})))}return n.length===0?this.state=`blocked`:this.index>=this.fronts.length&&(this.state=`done`),{status:n.length===0?`blocked`:this.state,cell:n[0]?{...n[0]}:null,cells:n.map(e=>({...e})),step:a,remaining:t,targets:[...r],damage:i}}cancel(){(this.state===`active`||this.state===`idle`)&&(this.state=`cancelled`)}toJSON(){return{state:this.state,fronts:this.fronts.map(e=>e.map(e=>({...e}))),index:this.index,shape:this.shape}}static fromJSON(t,n){let r=n.shape??(t.fronts?`fronts`:`line`);if(t.shape!==void 0&&t.shape!==r)throw Error(`beam save is shape "${r}", not "${t.shape}"`);let i=Object.create(e.prototype);return i.options=t,i.shape=r,i.fronts=n.fronts?n.fronts.map(e=>e.map(e=>({...e}))):(n.path??[]).map(e=>[{...e}]),i.index=n.index,i.state=n.state,i}blocked(e,t){let n=this.options.blocker??(this.options.stopAtOpaque===!1?`none`:`terrain`),r=!1;return n===`terrain`?r=!this.options.level.inside(e.x,e.y)||!this.options.level.transparent(e.x,e.y):n!==`none`&&(r=n({...e},t)===!0),r||this.options.isBlocked?.({...e},t)===!0}inactiveStep(){return{status:this.state,cell:null,cells:[],step:this.index,remaining:Math.max(0,this.fronts.length-this.index),targets:[],damage:0}}};_e();function gH(e,t={}){return(t.within?[...t.within]:yH(e.cellCount)).filter(n=>!(t.occupied?.has(n)||t.terrain&&!t.terrain.has(e.terrain[n])))}function _H(e,t,n){let r=new Set([t]),i=[t];for(let t=0;t<Math.max(0,n);t++){let t=[];for(let n of i)e.forEachNeighbor(e.xOf(n),e.yOf(n),8,(n,i)=>{if(!e.inside(n,i))return;let a=e.index(n,i);r.has(a)||(r.add(a),t.push(a))});i=t}return r.delete(t),[...r]}function vH(e,t){let n=[...new Set(e)];oe(n);let r=n.slice(0,Math.max(0,t));return{cells:r,trace:{requested:t,available:n.length,selected:r}}}function yH(e){let t=Array(e);for(let n=0;n<e;n++)t[n]=n;return t}var bH=l({AbilityCycle:()=>uH,BossPhases:()=>lH,CombatHooks:()=>dH,DUNGEON_KINDS:()=>YB,Doors:()=>cH,Elevation:()=>$V,FLOOR:()=>BB,FeatureLayer:()=>mV,FieldOfView:()=>QV,Level:()=>VB,MultiStageAbility:()=>mH,MultiTurnBeam:()=>hH,Pathfinder:()=>eH,Scheduler:()=>tH,Secrets:()=>sH,Stealth:()=>fH,TargetingController:()=>ZV,TriggerTracker:()=>pH,WALL:()=>zB,areaFalloffMultiplier:()=>YV,ballistica:()=>LV,canTarget:()=>zV,candidateCells:()=>gH,cellsNear:()=>_H,chainTargets:()=>qV,chebyshevDistance:()=>FV,checkDeterminism:()=>bV,compareDungeonArtifacts:()=>yV,coneCells:()=>UV,coneSector:()=>KV,decideMonsterAI:()=>nH,eligibleBuilders:()=>qB,findFreeCell:()=>eV,furthestRoom:()=>tV,generateCave:()=>oV,generateDungeon:()=>ZB,generateDungeonGraph:()=>XB,generateOverworld:()=>fV,hallBuilder:()=>WB,hasLineOfSight:()=>RV,hexConeCells:()=>HV,knockbackPath:()=>XV,neighbourOffsets:()=>RB,pickBuilder:()=>JB,rangeMultiplier:()=>JV,rectCenter:()=>HB,rectsOverlap:()=>UB,resolveArea:()=>BV,resolveAreaOnLevel:()=>VV,rollRoster:()=>hV,selectDistinctCells:()=>vH,traceLine:()=>IV});function xH(e,t){let n=e=>t.filter(t=>t.op===e).sort((e,t)=>(e.order??0)-(t.order??0)),r=e;for(let e of n(`add`))r+=e.value;for(let e of n(`multiply`))r*=e.value;for(let e of n(`set`))r=e.value;return r}var SH=class e{constructor(e){this.modifiers=[],this.cache=null,this.baseValues={...e.base},this.derived=e.derived??[]}base(e){return this.baseValues[e]??0}setBase(e,t){this.baseValues[e]=t,this.cache=null}addModifier(e){this.modifiers.push(e),this.cache=null}removeModifier(e){let t=this.modifiers.indexOf(e);t!==-1&&this.modifiers.splice(t,1),this.cache=null}removeModifiersFrom(e){this.modifiers=this.modifiers.filter(t=>t.source!==e),this.cache=null}get(e){return this.resolveAll()[e]??0}resolveAll(){if(this.cache)return this.cache;let e={...this.baseValues};for(let t of Object.keys(e))e[t]=xH(e[t],this.modifiersFor(t));for(let t of this.derived)e[t.name]=xH(t.from(e),this.modifiersFor(t.name));return this.cache=e,e}modifiersFor(e){return this.modifiers.filter(t=>t.stat===e)}toJSON(){return{base:{...this.baseValues}}}static fromJSON(t,n){let r=new e(t);return r.baseValues={...t.base,...n.base},r.cache=null,r}};function CH(e,t,n){return{maxLevel:n,experienceFor:n=>n<=1?0:Math.round(e*(n-1)**t)}}var wH=class e{constructor(e,t={}){this.curve=e,this.level=t.level??1,this.experience=t.experience??this.curve.experienceFor(this.level)}get experienceToNext(){return this.level>=this.curve.maxLevel?null:this.curve.experienceFor(this.level+1)-this.experience}addExperience(e){this.experience+=e;let t=0;for(;this.level<this.curve.maxLevel&&this.experience>=this.curve.experienceFor(this.level+1);)this.level++,t++;return t}toJSON(){return{level:this.level,experience:this.experience}}static fromJSON(t,n){return new e(t,n)}};_e();function TH(e,t,n=()=>ne(1,20)){return e+n()>=t}var EH=class e{constructor(e,t={}){this.available=0,this.stats=e,this.capFor=t.cap??(()=>1/0),this.costFor=t.cost??(()=>1)}get points(){return this.available}grant(e){this.available+=e}canSpend(e){return this.nextRankCost(e)!==null}spend(e){let t=this.nextRankCost(e);if(t===null)return!1;let n=this.stats.base(e);return this.available-=t,this.stats.setBase(e,n+1),!0}nextRankCost(e){let t=this.stats.base(e);if(t>=this.capFor(e))return null;let n=this.costFor(e,t+1);return this.available>=n?n:null}toJSON(){return{points:this.available}}static fromJSON(t,n,r){let i=new e(t,n);return i.available=r.points,i}},DH=class e{constructor(e,t=null,n={}){this.worn=new Map,this.names=new Set(e),this.stats=t,this.isSlotLocked=n.locked??(()=>!1)}get(e){return this.worn.get(e)}isLocked(e){let t=this.worn.get(e);return t!==void 0&&this.isSlotLocked(e,t)}equip(e,t){if(this.assertSlot(e),this.isLocked(e))return;let n=this.unequip(e);return this.wear(e,t),n}wear(e,t){this.worn.set(e,t);for(let e of t.modifiers??[])this.stats?.addModifier({...e,source:t})}unequip(e){let t=this.worn.get(e);if(t&&!this.isSlotLocked(e,t))return this.worn.delete(e),this.stats?.removeModifiersFrom(t),t}get slots(){return[...this.names]}assertSlot(e){if(!this.names.has(e))throw Error(`no such equipment slot: "${e}"`)}toJSON(e){return{worn:[...this.worn].map(([t,n])=>[t,e(n)])}}static fromJSON(t,n){let r=new e(t.slots,t.stats??null,{locked:t.locked});for(let[e,i]of n.worn)r.assertSlot(e),r.wear(e,t.resolve(i));return r}},OH=class e{constructor(e={}){this.slots=[],this.capacity=e.capacity}get items(){return this.slots}get totalWeight(){return this.slots.reduce((e,t)=>e+this.weightOf(t),0)}weightOf(e){return(e.weight??0)*e.quantity+(e.contents?.totalWeight??0)}find(e,t){return this.slots.find(n=>n.id===e&&(t===void 0||n.instanceId===t))}add(e){if(!Number.isFinite(e.quantity)||e.quantity<=0||e.weight!==void 0&&(!Number.isFinite(e.weight)||e.weight<0)||this.capacity!==void 0&&this.totalWeight+this.weightOf(e)>this.capacity)return!1;if(e.stackable){let t=this.slots.find(t=>t.id===e.id&&t.stackable&&t.instanceId===e.instanceId);if(t)return t.quantity+=e.quantity,!0}return this.slots.push({...e}),!0}remove(e,t,n){if(t!==void 0&&(!Number.isFinite(t)||t<=0))return;let r=this.slots.findIndex(t=>t.id===e&&(n===void 0||t.instanceId===n));if(r===-1)return;let i=this.slots[r];i.quantity-=t??i.quantity,i.quantity<=0&&this.slots.splice(r,1)}take(e,t=1,n){if(!Number.isFinite(t)||t<=0)return;let r=this.slots.findIndex(t=>t.id===e&&(n===void 0||t.instanceId===n));if(r===-1)return;let i=this.slots[r],a=Math.min(Math.floor(t),i.quantity);if(a<=0)return;let o={...i,quantity:a};return i.quantity-=a,i.quantity<=0&&this.slots.splice(r,1),o}toJSON(){return{capacity:this.capacity,slots:this.slots.map(e=>({id:e.id,quantity:e.quantity,instanceId:e.instanceId,identified:e.identified,cursed:e.cursed,blessed:e.blessed,level:e.level,affix:e.affix,durability:e.durability,maxDurability:e.maxDurability,contents:e.contents?.toJSON()}))}}static fromJSON(t,n){let r=new e({capacity:n.capacity});return r.slots=n.slots.map(n=>{let r=t.get(n.id);if(!r)throw Error(`Inventory.fromJSON: no definition for item "${n.id}"`);let{contents:i,...a}=n,o={...r,...kH(a),id:n.id,quantity:n.quantity};return i&&(o.contents=e.fromJSON(t,i)),o}),r}};function kH(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function AH(e,t){return t.matches?t.matches(e):t.category===void 0?typeof t.id==`string`?e.id===t.id:(t.id??[]).includes(e.id):e.category===t.category}function jH(e){return e.matches!==void 0||e.category!==void 0||e.id!==void 0}function MH(e,t){let n=new Map;for(let t of e.items)n.set(t,t.quantity);let r=new Map;for(let i of t.ingredients){if(!jH(i))throw Error(`recipe ingredient must name an id, a category, or a matches predicate`);if(!Number.isFinite(i.quantity)||i.quantity<=0)throw Error(`recipe ingredient quantity must be a positive number`);let t=i.quantity;for(let a of e.items){if(t<=0)break;let e=n.get(a)??0;if(e<=0||!AH(a,i))continue;let o=Math.min(e,t);n.set(a,e-o),t-=o,r.set(a,(r.get(a)??0)+o)}if(t>0)return!1}for(let[t,n]of r)e.remove(t.id,n,t.instanceId);if(e.add(t.result))return!0;for(let[t,n]of r)e.add({...t,quantity:n});return!1}function NH(e,t){let n=e.add({duration:t.duration,tick:e=>t.tick?.(e),onExpire:t.onExpire});return{cancel:()=>{e.remove(n),t.onExpire()}}}function PH(e,t,n){let r=Symbol(`statusEffect`);for(let t of n.modifiers)e.addModifier({...t,source:r});return NH(t,{duration:n.duration,tick:n.tick,onExpire:()=>e.removeModifiersFrom(r)})}_e();function FH(e,t={}){let n=e.entries.filter(e=>e.weight>0&&(t.curse===void 0||!!e.curse===t.curse)&&(t.predicate?.(e)??!0));if(n.length===0)return null;let r=ie(n.map(e=>e.weight));return r===null?null:n[r]}function IH(e){return e.affix}function LH(e,t){let n=e.affix!==void 0;e.affix=t.id,t.curse?e.cursed=!0:n&&(e.cursed=!1)}function RH(e){e.affix!==void 0&&(e.cursed=!1),delete e.affix}function zH(e,t){e.affix===void 0?RH(t):(t.affix=e.affix,t.cursed=e.cursed??!1)}function BH(e,t){return!(e.trigger!==t.trigger||e.kinds&&(t.kind===void 0||!e.kinds.includes(t.kind)))}function VH(e){e.identified=!0}function HH(e,t,n=`keep`){return Number.isFinite(t)?(e.level=(e.level??0)+t,n===`remove`&&RH(e),e.level):e.level??0}function UH(e,t){return e.maxDurability===void 0?!1:!Number.isFinite(t)||t<=0?(e.durability??e.maxDurability)<=0:(e.durability=Math.max(0,(e.durability??e.maxDurability)-t),e.durability<=0)}function WH(e,t){e.maxDurability!==void 0&&(!Number.isFinite(t)||t<=0||(e.durability=Math.min(e.maxDurability,(e.durability??e.maxDurability)+t)))}function GH(e,t,n){let r=new Map;for(let t of Object.keys(n.fields))r.set(t,e[t]),e[t]=n.fields[t];return NH(t,{duration:n.duration,tick:n.tick,onExpire:()=>{for(let[t,n]of r)e[t]=n}})}var KH=class e{constructor(e){this.progress=0,this.max=e.max,this.regenRate=e.regenRate,this.value=e.current??e.max}get current(){return this.value}canAfford(e){return this.value>=e}spend(e){return this.canAfford(e)?(this.value-=e,!0):!1}refund(e=1){let t=Math.min(e,this.max-this.value);return this.value+=t,t}advance(e=1){if(!(this.value>=this.max)){for(this.progress+=e;this.progress>=this.regenRate&&this.value<this.max;)this.progress-=this.regenRate,this.value++;this.value>=this.max&&(this.progress=0)}}toJSON(){return{current:this.value,progress:this.progress}}static fromJSON(t,n){let r=new e({...t,current:n.current});return r.progress=n.progress,r}};_e();function qH(e){if(e.entries.length===0||!A(e.chance??1))return null;let t=ie(e.entries.map(e=>e.weight));if(t===null)return null;let n=e.entries[t];return{id:n.id,quantity:n.quantity??1}}var JH=class e{constructor(e){this.grantedTiers=0,this.balance=0,this.choices=new Map,this.track=e}get points(){return this.balance}openTiers(e){let t=[];return this.track.tiers.forEach((n,r)=>{e>=n.threshold&&t.push(r)}),t}grant(e){let t=0;for(;this.grantedTiers<this.track.tiers.length&&e>=this.track.tiers[this.grantedTiers].threshold;){let e=this.track.tiers[this.grantedTiers];e.kind===`points`&&(this.balance+=e.points??0,t+=e.points??0),this.grantedTiers++}return t}spend(e){return this.balance<e?!1:(this.balance-=e,!0)}choose(e,t,n){let r=this.track.tiers[e];if(!r)throw Error(`no such advancement tier: ${e}`);if(r.kind===`points`)throw Error(`tier ${e} grants points, it has no choice`);if(n<r.threshold)throw Error(`tier ${e} has not opened yet`);if(this.choices.has(e))throw Error(`tier ${e} is already decided`);if(!(r.options??[]).some(e=>e.id===t))throw Error(`tier ${e} has no option "${t}"`);this.choices.set(e,t)}choice(e){return this.choices.get(e)??null}toJSON(){return{grantedTiers:this.grantedTiers,balance:this.balance,choices:[...this.choices]}}static fromJSON(t,n){let r=new e(t);r.grantedTiers=n.grantedTiers,r.balance=n.balance;for(let[e,t]of n.choices)r.choices.set(e,t);return r}};function YH(e,t){return t.map(t=>({stat:t.stat,op:t.op,value:t.base+t.perLevel*e}))}_e();function XH(e){if(e.labels.length<e.kinds.length)throw Error(`not enough appearances: ${e.kinds.length} kinds but only ${e.labels.length} labels`);let t=[...e.labels];for(let e=t.length-1;e>0;e--){let n=O(0,e+1);[t[e],t[n]]=[t[n],t[e]]}let n=new Map;return e.kinds.forEach((e,r)=>n.set(e,t[r])),n}var ZH=class e{constructor(e){this.assigned=new Map,this.tables=e}appearanceOf(e,t){let n=this.assigned.get(e);if(!n){let t=this.tables[e];if(!t)throw Error(`no such appearance category: "${e}"`);n=XH(t),this.assigned.set(e,n)}let r=n.get(t);if(r===void 0)throw Error(`"${t}" is not in appearance category "${e}"`);return r}toJSON(){return{assigned:[...this.assigned].map(([e,t])=>[e,[...t]])}}static fromJSON(t,n){let r=new e(t);for(let[e,t]of n.assigned)r.assigned.set(e,new Map(t));return r}};function QH(e,t,n,r,i,a){let o=a.prices.get(r);if(!o)return!1;let s=t.find(r);if(!s||s.quantity<i)return!1;let c=o.buy*i;return e.base(a.currency)<c?!1:(t.remove(r,i),n.add({...s,quantity:i})?(e.setBase(a.currency,e.base(a.currency)-c),!0):(t.add({...s,quantity:i}),!1))}function $H(e,t,n,r,i,a){let o=a.prices.get(r);if(!o)return!1;let s=n.find(r);return!s||s.quantity<i?!1:(n.remove(r,i),t.add({...s,quantity:i})?(e.setBase(a.currency,e.base(a.currency)+o.sell*i),!0):(n.add({...s,quantity:i}),!1))}function eU(e){let t=Array.isArray(e)?e:[e];for(let e of t)if(!Number.isFinite(e.amount)||e.amount<0)throw Error(`a resource cost must be a non-negative number, "${e.stat}" costs ${e.amount}`);return t}function tU(e){let t=new Map;for(let n of e)t.set(n.stat,(t.get(n.stat)??0)+n.amount);return t}function nU(e,t){return[...tU(eU(t))].every(([t,n])=>e.base(t)>=n)}function rU(e,t){let n=tU(eU(t));if(![...n].every(([t,n])=>e.base(t)>=n))return!1;for(let[t,r]of n)e.setBase(t,e.base(t)-r);return!0}function iU(e,t,n=1){for(let[r,i]of tU(eU(t)))e.setBase(r,e.base(r)+i*n)}function aU(e,t,n,r){return rU(e,t)?n.refund(Math.floor(t.amount/r)):0}var oU=class e{constructor(){this.layers=[]}add(e,t=0){e<=0||this.layers.push({amount:e,decayPerTick:t})}get total(){return this.layers.reduce((e,t)=>e+t.amount,0)}get layerCount(){return this.layers.length}absorb(e){let t=e,n=0;for(;t>0&&this.layers.length>0;){let e=this.layers[this.layers.length-1],r=Math.min(e.amount,t);e.amount-=r,t-=r,n+=r,e.amount<=0&&this.layers.pop()}return n}advance(e=1){for(let t=this.layers.length-1;t>=0;t--){let n=this.layers[t];n.decayPerTick&&(n.amount-=n.decayPerTick*e,n.amount<=0&&this.layers.splice(t,1))}}clear(){this.layers=[]}toJSON(){return{layers:this.layers.map(e=>({...e}))}}static fromJSON(t){let n=new e;return n.layers=t.layers.map(e=>({...e})),n}};_e();function sU(e,t,n){return oe([...t]).slice(0,Math.min(n,t.length)).map(t=>{let n=Symbol(`trait:${t.name}`);for(let r of t.modifiers)e.addModifier({...r,source:n});return{trait:t,source:n}})}var cU=class{constructor(){this.affected=new Map}update(e,t){let n=new Set(e),r=e.filter(e=>!!e.aura),i=new Set(r);for(let i of r){let r=this.affected.get(i);r||(r=new Map,this.affected.set(i,r));for(let n of e){if(n===i)continue;let e=t(i,n),a=r.get(n);if(e&&!a){let e=Symbol(`aura:${i.aura.name}`);for(let t of i.aura.modifiers)n.stats.addModifier({...t,source:e});r.set(n,e)}else!e&&a&&(n.stats.removeModifiersFrom(a),r.delete(n))}for(let[e,t]of[...r])n.has(e)||(e.stats.removeModifiersFrom(t),r.delete(e))}for(let[e,t]of[...this.affected])if(!i.has(e)){for(let[e,n]of t)e.stats.removeModifiersFrom(n);this.affected.delete(e)}}},lU=class e{constructor(e){if(this.points=new Map,e.some(e=>!e.id||!Number.isFinite(e.threshold)||e.threshold<0))throw Error(`support levels need an id and a non-negative threshold`);this.levels=[...e].sort((e,t)=>e.threshold-t.threshold)}get(e,t){return this.points.get(uU(e,t))??0}level(e,t){let n=this.get(e,t),r=null;for(let e of this.levels){if(e.threshold>n)break;r=e}return r}add(e,t,n){if(!e||!t||e===t)throw Error(`support needs two different named units`);if(!Number.isFinite(n))throw Error(`support amount must be finite, got ${n}`);let r=this.level(e,t),i=uU(e,t),a=Math.max(0,(this.points.get(i)??0)+n);return this.points.set(i,a),{a:e,b:t,points:a,previousLevel:r,level:this.level(e,t)}}toJSON(){return{pairs:[...this.points].map(([e,t])=>{let[n,r]=e.split(`\0`);return[n,r,t]})}}static fromJSON(t,n){let r=new e(t);for(let[e,t,i]of n.pairs){if(!e||!t||e===t||!Number.isFinite(i)||i<0)throw Error(`invalid support save data`);let n=uU(e,t);if(r.points.has(n))throw Error(`invalid support save data: duplicate pair "${e}" / "${t}"`);r.points.set(n,i)}return r}};function uU(e,t){return[e,t].sort().join(`\0`)}var dU=new Set([`id`,`growth`,`level`,`startingAffix`,`startingItem`,`lowHpReaction`]);function fU(e,t={},n){let r=new SH({base:_U(e)}),i;e.growth!==void 0&&(i=new wH(gU(e,t),{level:e.level??1}));let a;if(e.startingItem!==void 0){let n=t.items?.[e.startingItem];if(!n)throw Error(`entity template "${e.id}": unknown starting item "${e.startingItem}"`);if(a=n(),e.startingAffix!==void 0){let n=t.affixes?.[e.startingAffix];if(!n)throw Error(`entity template "${e.id}": unknown affix "${e.startingAffix}"`);LH(a,n)}}else if(e.startingAffix!==void 0)throw Error(`entity template "${e.id}": a starting affix needs a starting item to carry it`);let o=new Dn,s={id:e.id,stats:r,progression:i,item:a,reactions:o};if(e.lowHpReaction!==void 0){if(!n)throw Error(`entity template "${e.id}": names a lowHpReaction threshold but no onLowHp callback was given`);let t=e.lowHpReaction;o.add({id:`low-hp`,when:e=>e.hp/e.maxHp<=t,action:()=>n(s)})}return s}function pU(e,t={},n){return e.map(e=>fU(e,t,n))}function mU(e){let t={stats:e.stats.toJSON()};return e.progression&&(t.progression=e.progression.toJSON()),e.item&&(t.item=e.item),t}function hU(e,t,n,r){let i=fU(e,t,r);if(i.stats=SH.fromJSON({base:_U(e)},n.stats),n.progression!==void 0){if(!i.progression)throw Error(`entity template "${e.id}": save data has progression but the row names no growth curve`);i.progression=wH.fromJSON(gU(e,t),n.progression)}return n.item!==void 0&&(i.item=n.item),i}function gU(e,t){let n=t.growthCurves?.[e.growth??``];if(!n)throw Error(`entity template "${e.id}": unknown growth curve "${e.growth}"`);return n}function _U(e){let t={};for(let[n,r]of Object.entries(e))if(!dU.has(n)){if(typeof r!=`number`)throw Error(`entity template "${e.id}": stat "${n}" must be a number, got ${typeof r}`);t[n]=r}return t}var vU=l({Advancement:()=>JH,Appearances:()=>ZH,AuraField:()=>cU,Barrier:()=>oU,Charges:()=>KH,EquipmentSlots:()=>DH,Inventory:()=>OH,Progression:()=>wH,SkillPoints:()=>EH,StatBlock:()=>SH,SupportLedger:()=>lU,affixOf:()=>IH,applyAffix:()=>LH,applyItemStatusEffect:()=>GH,applyStatusEffect:()=>PH,assignAppearances:()=>XH,assignTraits:()=>sU,buildEntities:()=>pU,buildEntity:()=>fU,buy:()=>QH,canAfford:()=>nU,composeModifiers:()=>xH,convertToCharges:()=>aU,copyAffix:()=>zH,craft:()=>MH,damageItem:()=>UH,enchant:()=>HH,fromEntitySaveState:()=>hU,identify:()=>VH,matchesContext:()=>BH,powerCurve:()=>CH,refund:()=>iU,removeAffix:()=>RH,repairItem:()=>WH,rollAffix:()=>FH,rollLoot:()=>qH,scaledModifiers:()=>YH,sell:()=>$H,skillCheck:()=>TH,spend:()=>rU,toEntitySaveState:()=>mU}),yU=class{constructor(){this.factories=new Map,this.loaded=new Map,this.currentId=null}define(e,t,n={}){this.factories.set(e,{create:t,persistent:n.persistent??!0})}enter(e,t){let n=this.factories.get(e);if(!n)throw Error(`no such map: "${e}"`);let r=this.loaded.get(e);return(!r||!n.persistent)&&(r=n.create(),this.loaded.set(e,r)),this.currentId=e,this.lastSpawn=t,r}get current(){return this.currentId?this.loaded.get(this.currentId)??null:null}get currentMapId(){return this.currentId}get spawn(){return this.lastSpawn}isLoaded(e){return this.loaded.has(e)}isPersistent(e){return this.factories.get(e)?.persistent??!0}unload(e){if(e===this.currentId)throw Error(`cannot unload the current map: "${e}"`);this.loaded.delete(e)}},bU=class{constructor(){this.locations=new Map}add(e){this.locations.set(e.id,e)}remove(e){this.locations.delete(e)}get(e){return this.locations.get(e)}at(e,t){for(let n of this.locations.values())if(n.x===e&&n.y===t)return n}get all(){return[...this.locations.values()]}},xU=class{constructor(){this.turn=0,this.effects=new Map}add(e){let t=Symbol();return this.effects.set(t,{...e}),t}remove(e){this.effects.delete(e)}has(e){return this.effects.has(e)}advance(e=1){this.turn+=e;for(let[t,n]of this.effects)n.tick(this.turn),n.duration!==void 0&&(n.duration-=e,n.duration<=0&&(this.effects.delete(t),n.onExpire?.()))}};_e();function SU(e){if(e.entries.length===0||!A(e.rate))return null;let t=ie(e.entries.map(e=>e.weight));return t===null?null:e.entries[t].value}var CU=class e{constructor(e={}){if(this.changed=new p,this.dayLength=e.dayLength??120,!(this.dayLength>0))throw Error(`an environment day must be longer than zero seconds`);if(this.boundaries=e.phaseBoundaries??[.2,.7,.8],this.boundaries[0]<=0||this.boundaries[0]>=this.boundaries[1]||this.boundaries[1]>=this.boundaries[2]||this.boundaries[2]>=1)throw Error(`environment phase boundaries must be ascending fractions strictly between 0 and 1`);if(this.seconds_=e.startSeconds??0,this.weather_=e.startWeather??`clear`,!Number.isFinite(this.seconds_))throw Error(`environment startSeconds must be finite`)}get day(){return Math.floor(this.seconds_/this.dayLength)}get seconds(){return this.seconds_}get weather(){return this.weather_}get phase(){let e=(this.seconds_%this.dayLength+this.dayLength)%this.dayLength/this.dayLength;return e<this.boundaries[0]?`dawn`:e<this.boundaries[1]?`day`:e<this.boundaries[2]?`dusk`:`night`}get night(){return this.phase===`night`}update(e){if(!Number.isFinite(e)||e<0)throw Error(`environment update must be non-negative, got ${e}`);this.seconds_+=e;let t=this.toJSON();return this.changed.dispatch(t),t}setWeather(e){if(!e)throw Error(`weather needs a non-empty id`);this.weather_=e;let t=this.toJSON();return this.changed.dispatch(t),t}toJSON(){return{day:this.day,seconds:this.seconds_,phase:this.phase,weather:this.weather_}}static fromJSON(t,n){return new e({...t,startSeconds:n.seconds,startWeather:n.weather})}},wU=class e{constructor(e){if(e.sides.length===0)throw Error(`SideTurns needs at least one side`);if(e.schedule.length===0)throw Error(`SideTurns needs a non-empty schedule`);let t=e.round??1,n=e.sideIndex??0,r=e.timeIndex??0;if(!Number.isInteger(t)||t<1)throw Error(`SideTurns round must be a positive integer`);if(n<0||n>=e.sides.length)throw Error(`SideTurns side index ${n} is outside ${e.sides.length} sides`);if(r<0||r>=e.schedule.length)throw Error(`SideTurns time index ${r} is outside ${e.schedule.length} times`);this.sides=[...e.sides],this.schedule=[...e.schedule],this.areas=e.areas??[],this.state={round:t,sideIndex:n,timeIndex:r}}get round(){return this.state.round}get side(){return this.sides[this.state.sideIndex]}get timeIndex(){return this.state.timeIndex}get timeOfDay(){return this.schedule[this.state.timeIndex]}get snapshot(){return{...this.state}}timeOfDayAt(e,t){for(let n of this.areas)if(n.contains(e,t))return n.times[this.state.timeIndex]??this.timeOfDay;return this.timeOfDay}lawfulBonusAt(e,t,n){return TU(e,this.timeOfDayAt(t,n).lawfulBonus)}advance(){let e=!1;return this.state.sideIndex++,this.state.sideIndex>=this.sides.length&&(this.state.sideIndex=0,this.state.round++,this.state.timeIndex=(this.state.timeIndex+1)%this.schedule.length,e=!0),{side:this.side,round:this.state.round,newRound:e}}toJSON(){return this.snapshot}static fromJSON(t,n){return new e({...t,round:n.round,sideIndex:n.sideIndex,timeIndex:n.timeIndex})}};function TU(e,t){switch(e){case`lawful`:return t;case`chaotic`:return-t;default:return 0}}var EU=l({EnvironmentClock:()=>CU,Overworld:()=>bU,SideTurns:()=>wU,TurnClock:()=>xU,World:()=>yU,alignmentBonus:()=>TU,rollEncounter:()=>SU});_e();function DU(e,t,n={}){let r=n.pick??O,i=0;return t.forEach((t,n)=>{OU(t,t.name??`#${n+1}`,e.shape);let a=kU(e,t);if(i+=a.length,a.length!==0)for(let[n,i]of a){let a=t.outputs[r(t.outputs.length)];for(let[r,o]of Object.entries(a))for(let a=0;a<t.height;a++)for(let s=0;s<t.width;s++){let c=o[a*t.width+s];c!==-1&&e.setTile(r,n+s,i+a,c)}}}),i}function OU(e,t,n){if(e.topology&&(n===`square`||n===`hex`)&&e.topology!==n)throw Error(`automap rule "${t}" targets ${e.topology} cells, but the map is ${n}`);if(!Number.isInteger(e.width)||e.width<=0||!Number.isInteger(e.height)||e.height<=0)throw Error(`automap rule "${t}" needs a positive width and height`);if(e.outputs.length===0)throw Error(`automap rule "${t}" has no outputs - a rule that matches and writes nothing is a mistake`);let r=e.width*e.height;for(let[n,i]of Object.entries(e.input))if(i.length!==r)throw Error(`automap rule "${t}" input "${n}" has ${i.length} cells, but the pattern is ${r}`);e.outputs.forEach((e,n)=>{for(let[i,a]of Object.entries(e))if(a.length!==r)throw Error(`automap rule "${t}" output ${n+1} "${i}" has ${a.length} cells, but the pattern is ${r}`)})}function kU(e,t){let n=[];for(let r=0;r+t.height<=e.heightInTiles;r++)for(let i=0;i+t.width<=e.widthInTiles;i++)AU(e,t,i,r)&&n.push([i,r]);return n}function AU(e,t,n,r){for(let[i,a]of Object.entries(t.input))for(let o=0;o<t.height;o++)for(let s=0;s<t.width;s++){let c=a[o*t.width+s];if(c!==-1&&e.getTile(i,n+s,r+o)!==c)return!1}return!0}var jU=class e{constructor(){this.switches=new Map,this.variables=new Map}switch(e){return this.switches.get(e)??!1}setSwitch(e,t){this.switches.set(e,t)}variable(e){return this.variables.get(e)??0}setVariable(e,t){this.variables.set(e,t)}toJSON(){return{switches:[...this.switches],variables:[...this.variables]}}static fromJSON(t){let n=new e;for(let[e,r]of t.switches)n.setSwitch(e,r);for(let[e,r]of t.variables)n.setVariable(e,r);return n}};function MU(e,t){return`switch`in e?t.switch(e.switch)===e.equals:t.variable(e.variable)>=e.atLeast}function NU(e,t){let n;for(let r of e.pages)(r.conditions??[]).every(e=>MU(e,t))&&(n=r);return n}var PU=class{constructor(e){this.cancelled=!1,this.options=e,this.state={game:e.game,answers:{}}}cancel(){this.cancelled=!0}async run(e){let t=await this.runList(e);if(t!==void 0){if(this.options.onUnknownCommand)return this.options.onUnknownCommand({goto:t}),this.state;throw Error(`a "goto ${t}" only runs inside runStory, not a straight run`)}return this.state}async runStory(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))throw Error(`this event story has no passage named "${t}"`);let n=e[t],r=0;for(;r<n.length&&!this.cancelled;){let t=await this.step(n[r]);if(r++,t!==void 0){if(!Object.prototype.hasOwnProperty.call(e,t))throw Error(`this event story has no passage named "${t}"`);n=e[t],r=0}}return this.state}async runList(e){for(let t of e){if(this.cancelled)break;let e=await this.step(t);if(e!==void 0)return e}}async step(e){if(`say`in e)await this.speak(e.say,e.speaker,e.portrait);else{if(`ask`in e){let t=await this.speak(e.ask,e.speaker,e.portrait,e.choices);return e.store&&(this.state.answers[e.store]=t),e.choices.find(e=>(e.value??e.text)===t)?.goto}if(`wait`in e)await new Promise(t=>setTimeout(t,e.wait*1e3));else if(`setSwitch`in e)this.state.game.setSwitch(e.setSwitch,e.value);else if(`setVariable`in e)this.state.game.setVariable(e.setVariable,e.value);else if(`addVariable`in e){let t=this.state.game.variable(e.addVariable);this.state.game.setVariable(e.addVariable,t+e.amount)}else{if(`if`in e){let t=MU(e.if,this.state.game);return this.runList(t?e.then:e.else??[])}if(`move`in e)await this.options.move?.(e.move.target,e.move.steps);else{if(`goto`in e)return e.goto;`call`in e?await e.call(this.state):this.options.onUnknownCommand?.(e)}}}}speak(e,t,n,r){return this.options.present({text:e,speaker:t,portrait:n,choices:r})}};function FU(e,t){t&&e.has?.(t)&&e.play?.(t)}var IU=class{constructor(e,t,n,r){this.facing=`down`,this.target=null,this.progress=0,this.sprite=e,this.x=this.fromX=t,this.y=this.fromY=n,this.tileWidth=r.tileWidth,this.tileHeight=r.tileHeight,this.speed=r.speed??4,this.options=r,this.place(),this.playIdle()}get isMoving(){return this.target!==null}turnTo(e,t){this.target||(this.facing=LU(e,t),this.playIdle())}moveBy(e,t){return!this.target&&(this.facing=LU(e,t),this.fromX=this.x,this.fromY=this.y,this.target={x:this.x+e,y:this.y+t},this.progress=0,this.playWalk(),!0)}jumpBy(e,t){return!this.target&&(this.facing=LU(e,t),this.x+=e,this.y+=t,this.fromX=this.x,this.fromY=this.y,this.place(),this.playIdle(),!0)}update(e){this.sprite.update?.(e),this.target&&(this.progress=Math.min(1,this.progress+this.speed*e),this.sprite.x=RU(this.fromX,this.target.x,this.progress)*this.tileWidth,this.sprite.y=RU(this.fromY,this.target.y,this.progress)*this.tileHeight,this.progress>=1&&(this.x=this.target.x,this.y=this.target.y,this.target=null,this.playIdle()))}place(){this.sprite.x=this.x*this.tileWidth,this.sprite.y=this.y*this.tileHeight}playWalk(){FU(this.sprite,this.options.walkAnimation?.(this.facing))}playIdle(){FU(this.sprite,this.options.idleAnimation?.(this.facing))}};function LU(e,t){return e>0?`right`:e<0?`left`:t>0?`down`:`up`}function RU(e,t,n){return e+(t-e)*n}var zU=[`up`,`down`,`left`,`right`],BU={up:{dx:0,dy:-1},down:{dx:0,dy:1},left:{dx:-1,dy:0},right:{dx:1,dy:0}},VU={up:{around:`down`,left90:`left`,right90:`right`},down:{around:`up`,left90:`right`,right90:`left`},left:{around:`right`,left90:`down`,right90:`up`},right:{around:`left`,left90:`up`,right90:`down`}},HU=class{constructor(e,t,n={}){this.index=0,this.waiting=0,this.mover=e,this.route=t,this.options=n}get done(){return!this.route.repeat&&this.index>=this.route.steps.length}update(e){if(this.mover.isMoving||this.done||this.waiting>0&&(this.waiting=Math.max(0,this.waiting-e),this.waiting>0))return;this.index>=this.route.steps.length&&(this.index=0);let t=this.route.steps[this.index];(this.runStep(t)||this.route.skippable)&&this.index++}runStep(e){if(`turn`in e){let{dx:t,dy:n}=this.resolveTurn(e);return this.mover.turnTo(t,n),!0}if(`wait`in e)return this.waiting=e.wait,!0;if(`jump`in e)return this.attempt(e.jump.dx,e.jump.dy,(e,t)=>this.mover.jumpBy(e,t));if(`step`in e)return this.attempt(e.step.dx,e.step.dy,(e,t)=>this.mover.moveBy(e,t));let{dx:t,dy:n}=this.resolveDirection(e);return this.attempt(t,n,(e,t)=>this.mover.moveBy(e,t))}resolveDirection(e){return e.dir===`random`?BU[this.pickDirection()]:e.dir===`forward`?BU[this.mover.facing]:e.dir===`backward`?BU[VU[this.mover.facing].around]:e.dir===`toward`||e.dir===`away`?this.resolveAim(e.dir,e):BU[e.dir]}resolveTurn(e){if(e.turn===`random`)return BU[this.pickDirection()];if(e.turn===`around`||e.turn===`left90`||e.turn===`right90`)return BU[VU[this.mover.facing][e.turn]];if(e.turn===`toward`||e.turn===`away`){let t=this.resolveAim(e.turn,e);return t.dx===0&&t.dy===0?BU[this.mover.facing]:t}return BU[e.turn]}resolveAim(e,t){let n=`target`in t?t.target():t,r=e===`toward`?1:-1,i=n.x-this.mover.x,a=n.y-this.mover.y;return Math.abs(i)>=Math.abs(a)?{dx:r*Math.sign(i)||0,dy:0}:{dx:0,dy:r*Math.sign(a)||0}}attempt(e,t,n){return e===0&&t===0?!0:this.options.canMove&&!this.options.canMove(e,t)?!1:n(e,t)}pickDirection(){let e=this.options.random??Math.random;return zU[Math.floor(e()*zU.length)]}},UU=class{constructor(e,t,n,r={}){this.facing=0,this.moving=!1,this.sprite=e,this.x=t,this.y=n,this.speed=r.speed??4,this.options=r,this.place(),this.playIdle()}get isMoving(){return this.moving}move(e,t,n){let r=Math.hypot(e,t);r>0?(this.facing=Math.atan2(t,e),this.x+=e/r*this.speed*n,this.y+=t/r*this.speed*n,this.moving||(this.moving=!0,this.playWalk())):this.moving&&(this.moving=!1,this.playIdle()),this.place(),this.sprite.update?.(n)}turnTo(e,t){this.moving||e===0&&t===0||(this.facing=Math.atan2(t,e),this.playIdle())}place(){this.sprite.x=this.x,this.sprite.y=this.y}playWalk(){FU(this.sprite,this.options.walkAnimation?.(this.facing))}playIdle(){FU(this.sprite,this.options.idleAnimation?.(this.facing))}};function WU(e,t){return e.x<t.x+t.width&&e.x+e.width>t.x&&e.y<t.y+t.height&&e.y+e.height>t.y}function GU(e,t){let n=e.x-t.x,r=e.y-t.y,i=e.radius+t.radius;return n*n+r*r<i*i}function KU(e,t){let n=kn(e.x,t.x,t.x+t.width),r=kn(e.y,t.y,t.y+t.height),i=e.x-n,a=e.y-r;return i*i+a*a<e.radius*e.radius}function qU(e,t,n,r){let{tileSize:i,isSolid:a}=r;if(!(i>0))throw Error(`collision tileSize must be positive`);let o=JU(e.x,e.y,e.width,e.height,t,i,a,!0);return{x:o,y:JU(o,e.y,e.width,e.height,n,i,a,!1)}}function JU(e,t,n,r,i,a,o,s){if(i===0)return s?e:t;let c=s?e:t,l=s?n:r,u=c+i,d=Math.floor((s?t:e)/a),f=Math.floor(((s?t+r:e+n)-1e-6)/a),p=(e,t)=>s?o(e,t):o(t,e);if(i>0){let e=Math.floor((c+l-1e-6)/a),t=Math.floor((u+l-1e-6)/a);for(let n=e+1;n<=t;n++)for(let e=d;e<=f;e++)if(p(n,e))return n*a-l}else{let e=Math.floor(c/a),t=Math.floor(u/a);for(let n=e-1;n>=t;n--)for(let e=d;e<=f;e++)if(p(n,e))return(n+1)*a}return u}var YU=class e{constructor(){this.definitions=new Map,this.stageIndex=new Map,this.tracked=null}define(e){this.definitions.set(e.id,e)}track(e){e!==null&&this.require(e),this.tracked=e}trackedQuest(){return this.tracked!==null&&this.status(this.tracked)===`active`?this.tracked:null}trackedLocation(){let e=this.trackedQuest();return e?this.currentStage(e)?.location??null:null}markerFor(e,t){return e.some(e=>this.status(e)===`active`&&this.stageSatisfied(e,t))?`turnIn`:e.some(e=>this.status(e)===`available`)?`offer`:`none`}canStart(e){return(this.require(e).requires??[]).every(e=>this.status(e)===`complete`)}start(e){if(!this.canStart(e))throw Error(`quest "${e}" cannot start yet - a prerequisite is incomplete`);this.stageIndex.set(e,0)}status(e){let t=this.require(e),n=this.stageIndex.get(e);return n===void 0?this.canStart(e)?`available`:`unavailable`:n>=t.stages.length?`complete`:`active`}currentStage(e){return this.status(e)===`active`?this.require(e).stages[this.stageIndex.get(e)]:null}progress(e,t){let n=this.currentStage(e);return n?.counter?Math.min(1,t.variable(n.counter.variable)/n.counter.target):null}advanceStage(e,t){return this.stageSatisfied(e,t)?(this.stageIndex.set(e,this.stageIndex.get(e)+1),!0):!1}stageSatisfied(e,t){let n=this.currentStage(e);return n?n.condition?MU(n.condition,t):!n.counter||t.variable(n.counter.variable)>=n.counter.target:!1}require(e){let t=this.definitions.get(e);if(!t)throw Error(`no such quest: "${e}"`);return t}toJSON(){return{stageIndex:[...this.stageIndex],tracked:this.tracked}}static fromJSON(t,n){let r=new e;for(let e of t)r.define(e);for(let[e,t]of n.stageIndex)r.stageIndex.set(e,t);return n.tracked&&(r.tracked=n.tracked),r}};function XU(e){let t=[],n=new Map;for(let r of e){let e=n.get(r.questId);e||(e={id:r.questId,stages:[]},r.requires!==void 0&&(e.requires=r.requires),n.set(r.questId,e),t.push(r.questId)),e.stages.push(ZU(e.id,r))}return t.map(e=>n.get(e))}function ZU(e,t){if(t.conditionSwitch!==void 0&&t.conditionVariable!==void 0)throw Error(`quest "${e}": a stage row cannot name both a condition switch and a condition variable`);let n={};if(t.conditionSwitch!==void 0){if(t.conditionEquals===void 0)throw Error(`quest "${e}": conditionSwitch needs a conditionEquals`);n.condition={switch:t.conditionSwitch,equals:t.conditionEquals}}else if(t.conditionVariable!==void 0){if(t.conditionAtLeast===void 0)throw Error(`quest "${e}": conditionVariable needs a conditionAtLeast`);n.condition={variable:t.conditionVariable,atLeast:t.conditionAtLeast}}if(t.counterVariable!==void 0){if(t.counterTarget===void 0)throw Error(`quest "${e}": counterVariable needs a counterTarget`);n.counter={variable:t.counterVariable,target:t.counterTarget}}if(t.description!==void 0&&(n.description=t.description),t.locationMap!==void 0||t.locationX!==void 0||t.locationY!==void 0){if(t.locationX===void 0||t.locationY===void 0)throw Error(`quest "${e}": a stage location needs both locationX and locationY`);n.location={x:t.locationX,y:t.locationY},t.locationMap!==void 0&&(n.location.map=t.locationMap)}return n}var QU=class{constructor(e){this.name=e}},$U=4,eW=8,tW=new WeakMap;function nW(e){return tW.get(e)}function rW(e,t){return tW.set(e,t),e}var iW=1e3,aW=class{constructor(e){this.pos=0,this.depth=0,this.symbols=[],this.objects=[],this.bytes=e}byte(){if(this.pos>=this.bytes.length)throw Error(`Marshal: unexpected end of input`);return this.bytes[this.pos++]}take(e){if(e<0)throw Error(`Marshal: negative length`);let t=this.bytes.subarray(this.pos,this.pos+e);if(t.length<e)throw Error(`Marshal: unexpected end of input`);return this.pos+=e,t}readFixnum(){let e=this.byte()<<24>>24;if(e===0)return 0;if(e>=5&&e<=127)return e-5;if(e<=-5&&e>=-128)return e+5;if(e>0){let t=0;for(let n=0;n<e;n++)t|=this.byte()<<8*n;return t>>>0}let t=-e,n=0;for(let e=0;e<t;e++)n|=this.byte()<<8*e;return(n>>>0)-2**(8*t)}readBytes(){return this.take(this.readFixnum())}readSymbol(){let e=new TextDecoder().decode(this.readBytes());return this.symbols.push(e),e}readSymbolLink(){let e=this.readFixnum(),t=this.symbols[e];if(t===void 0)throw Error(`Marshal: symbol link ${e} out of range`);return t}readSymbolValue(){let e=String.fromCharCode(this.byte());if(e===`:`)return this.readSymbol();if(e===`;`)return this.readSymbolLink();throw Error(`Marshal: expected a symbol, got tag "${e}"`)}link(e){return this.objects.push(e),e}readBignum(){let e=String.fromCharCode(this.byte())===`-`?-1:1,t=this.readFixnum(),n=0,r=1;for(let e=0;e<t;e++)n+=(this.byte()|this.byte()<<8)*r,r*=65536;return e*n}readFloat(){let e=new TextDecoder().decode(this.readBytes());return e===`inf`?1/0:e===`-inf`?-1/0:e===`nan`?NaN:Number(e)}readArray(){let e=[];this.link(e);let t=this.readFixnum();for(let n=0;n<t;n++)e.push(this.readValue());return e}readHash(e){let t=new Map;this.link(t);let n=this.readFixnum();for(let e=0;e<n;e++)t.set(this.readValue(),this.readValue());return e&&tW.set(t,this.readValue()),t}readIvars(e){let t={};for(let n=0;n<e;n++)t[this.readSymbolValue()]=this.readValue();return t}readObject(){let e={class:``,ivars:{}};return this.link(e),e.class=this.readSymbolValue(),e.ivars=this.readIvars(this.readFixnum()),e}readIvarWrapped(){let e=this.readValue();return this.readIvars(this.readFixnum()),e}readUserDefined(){let e={class:``,raw:new Uint8Array};return this.link(e),e.class=this.readSymbolValue(),e.raw=this.readBytes().slice(),e}readUserMarshal(){let e={class:``,value:null};return this.link(e),e.class=this.readSymbolValue(),e.value=this.readValue(),e}readValue(){if(++this.depth>iW)throw Error(`Marshal: values nested more than ${iW} deep`);try{return this.readTagged()}finally{this.depth--}}readTagged(){let e=String.fromCharCode(this.byte());switch(e){case`0`:return null;case`T`:return!0;case`F`:return!1;case`i`:return this.readFixnum();case`l`:return this.link(this.readBignum());case`f`:return this.link(this.readFloat());case`:`:return this.readSymbol();case`;`:return this.readSymbolLink();case`"`:return this.link(new TextDecoder().decode(this.readBytes()));case`[`:return this.readArray();case`{`:return this.readHash(!1);case`}`:return this.readHash(!0);case`o`:return this.readObject();case`I`:return this.readIvarWrapped();case`u`:return this.readUserDefined();case`U`:return this.readUserMarshal();case`@`:{let e=this.readFixnum(),t=this.objects[e];if(t===void 0)throw Error(`Marshal: object link ${e} out of range`);return t}default:throw Error(`Marshal: unsupported tag "${e}" (0x${e.charCodeAt(0).toString(16)})`)}}readDocument(){let e=this.byte(),t=this.byte();if(e!==$U||t>eW)throw Error(`Marshal: unsupported version ${e}.${t} (expected ${$U}.${eW} or lower)`);return this.readValue()}};function oW(e){return new aW(e).readDocument()}function sW(e){return typeof e==`object`&&!!e&&`class`in e&&`ivars`in e}function cW(e){let t=[$U,eW];return lW(t,e),new Uint8Array(t)}function lW(e,t){if(t==null)e.push(uW(`0`));else if(t===!0)e.push(uW(`T`));else if(t===!1)e.push(uW(`F`));else if(t instanceof QU)e.push(uW(`:`)),dW(e,t.name);else if(typeof t==`number`)Number.isInteger(t)&&Math.abs(t)<2**30?(e.push(uW(`i`)),fW(e,t)):(e.push(uW(`f`)),dW(e,Number.isFinite(t)?String(t):t>0?`inf`:t<0?`-inf`:`nan`));else if(typeof t==`string`)e.push(uW(`"`)),dW(e,t);else if(Array.isArray(t)){e.push(uW(`[`)),fW(e,t.length);for(let n of t)lW(e,n)}else if(t instanceof Map){let n=tW.has(t);e.push(uW(n?`}`:`{`)),fW(e,t.size);for(let[n,r]of t)lW(e,n),lW(e,r);n&&lW(e,tW.get(t))}else if(sW(t)){e.push(uW(`o`)),e.push(uW(`:`)),dW(e,t.class);let n=Object.entries(t.ivars);fW(e,n.length);for(let[t,r]of n)e.push(uW(`:`)),dW(e,t),lW(e,r)}else throw Error(`Marshal: cannot encode a value of type ${typeof t}`)}function uW(e){return e.charCodeAt(0)}function dW(e,t){let n=new TextEncoder().encode(t);fW(e,n.length);for(let t of n)e.push(t)}function fW(e,t){if(t===0)e.push(0);else if(t>0&&t<=122)e.push(t+5);else if(t<0&&t>=-123)e.push(t-5&255);else{if(t>0){for(let n=1;n<=4;n++)if(t<2**(8*n)){e.push(n);for(let r=0;r<n;r++)e.push(t>>>8*r&255);return}}else for(let n=1;n<=4;n++)if(t>=-(2**(8*n))){e.push(-n&255);let r=t+2**(8*n);for(let t=0;t<n;t++)e.push(r>>>8*t&255);return}throw Error(`Marshal: integer ${t} is out of range for a Fixnum`)}}function pW(e){return Wr(e).map(e=>e.speaker===void 0?{say:e.text}:{say:e.text,speaker:e.speaker})}function mW(e,t={}){let n={};for(let t of e)`say`in t?n[t.say]=t.say:`ask`in t&&(n[t.ask]=t.ask);return{locale:t.locale??`en`,direction:t.direction??`ltr`,messages:n}}function hW(e){let{story:t,start:n,title:r}=Gr(e);return r===void 0?{story:t,start:n}:{story:t,start:n,title:r}}var gW=l({AUTOMAP_EMPTY:()=>-1,EventRunner:()=>PU,FreeMover:()=>UU,GameState:()=>jU,GridMover:()=>IU,MoveRouteRunner:()=>HU,QuestLog:()=>YU,RubySymbol:()=>QU,aabbOverlap:()=>WU,activePage:()=>NU,automap:()=>DU,circleAabbOverlap:()=>KU,circleOverlap:()=>GU,conditionHolds:()=>MU,decodeMarshal:()=>oW,encodeMarshal:()=>cW,extractDialogueCatalog:()=>mW,hashDefaultOf:()=>nW,importTwee:()=>hW,parseDialogueText:()=>pW,questsFromRows:()=>XU,resolveAabbAgainstTiles:()=>qU,withHashDefault:()=>rW}),_W=CH(20,2,100),vW=class{constructor(e){this.species=e.species,this.deriveStats=e.deriveStats,this.progression=new wH(e.species.growth??_W,{level:e.level??1}),this.stats=new SH({base:this.computeBase()})}refreshStats(){let e=this.computeBase();for(let[t,n]of Object.entries(e))this.stats.setBase(t,n)}computeBase(){let e=this.progression.level;return this.deriveStats?this.deriveStats(this.species.baseStats,e):{...this.species.baseStats}}},yW=class{constructor(){this.multipliers=new Map}key(e,t){return`${e}:${t}`}set(e,t,n){this.multipliers.set(this.key(e,t),n)}get(e,t){return this.multipliers.get(this.key(e,t))??1}multiplierFor(e,t){return t.reduce((t,n)=>t*this.get(e,n),1)}},bW=class{constructor(e){this.storage=[],this.active=Array(e).fill(null)}get members(){return this.active}get boxed(){return this.storage}add(e){let t=this.active.indexOf(null);t===-1?this.storage.push(e):this.active[t]=e}store(e){let t=this.active[e];t&&(this.active[e]=null,this.storage.push(t))}withdraw(e,t){if(t<0||t>=this.active.length)return;let n=this.storage[e];if(!n)return;this.storage.splice(e,1);let r=this.active[t];this.active[t]=n,r&&this.storage.push(r)}get activeMembers(){return this.active.filter(e=>e!==null)}};function xW(e){return[...e].sort((e,t)=>(t.priority??0)-(e.priority??0)||t.speed-e.speed)}function SW(e,t){let n=null;for(let r of e)r.at(t)&&(n=r.into);return n}var CW=class{constructor(e,t){this.stages=new Map,this.modifiers=new Map,this.stats=e,this.max=t.max,this.multiplierFor=t.multiplier}get(e){return this.stages.get(e)??0}change(e,t){let n=this.get(e),r=Math.max(-this.max,Math.min(this.max,n+t)),i=r-n;return i===0?0:(this.stages.set(e,r),this.applyModifier(e,r),i)}applyModifier(e,t){let n=this.modifiers.get(e);if(n&&this.stats.removeModifier(n),t===0){this.modifiers.delete(e);return}let r={stat:e,op:`multiply`,value:this.multiplierFor(t)};this.stats.addModifier(r),this.modifiers.set(e,r)}resetAll(){for(let e of this.modifiers.values())this.stats.removeModifier(e);this.modifiers.clear(),this.stages.clear()}};function wW(e,t,n,r=(e,n)=>t.multiplierFor(e.type,n)){if(e.length===0)return null;let i=e[0],a=r(i,n);for(let t of e.slice(1)){let e=r(t,n);e>a&&(a=e,i=t)}return i}function TW(e,t,n,r){let i=null,a=EW(e,n,r);return t.forEach((e,t)=>{let o=EW(e.types,n,r);o<a&&(a=o,i=t)}),i}function EW(e,t,n){return Math.max(...n.map(n=>t.multiplierFor(n,e)))}var DW=class extends S{},OW=class{constructor(){this.conditions=new Map}set(e){this.conditions.set(e.id,{...e})}has(e){return this.conditions.has(e)}get(e){return this.conditions.get(e)}clear(e){this.conditions.delete(e)}get active(){return[...this.conditions.values()]}advance(e=1){for(let[t,n]of this.conditions)n.duration!==void 0&&(n.duration-=e,n.duration<=0&&this.conditions.delete(t))}},kW=class{constructor(e){this.chanceToHit=AW(e.chanceToHit??1),this.strikeDuration=Math.max(0,e.strikeDuration??0),this.totalDamage=Math.max(0,e.damage)*Math.max(0,e.strikes),this.expectedDamage=this.totalDamage*this.chanceToHit,this.defenderHp0=e.defender.hp;let t=[],n=e.defender.hp;for(let r=0;r<=e.strikes;r++)r>0&&(e.hits?.[r-1]??!0)&&(n-=Math.max(0,e.damage)),t.push({strike:r,time:r*this.strikeDuration,attackerHp:e.attacker.hp,defenderHp:Math.max(0,n),defenderDamage:this.defenderHp0-Math.max(0,n)});this.frames=t}get duration(){return this.strikeDuration*(this.frames.length-1)}get defenderKilled(){return this.frames[this.frames.length-1].defenderHp===0}sampleAt(e){let t=this.frames.length-1;if(this.strikeDuration<=0)return this.frames[t];let n=0;for(let r=0;r<=t&&this.frames[r].time<=e+1e-9;r++)n=r;return this.frames[n]}};function AW(e){return Math.max(0,Math.min(1,e))}var jW=class{constructor(e){this.onChange=new p,this.stage_=`attacker`,this.charge=null,this.victim=null,this.highlight_=0,this.units=e.units,this.side=e.side,this.disabledOf=e.disabled??(e=>e.disabled??!1),this.canTarget=e.canTarget??(()=>!0)}get stage(){return this.stage_}get attacker(){return this.charge}get target(){return this.victim}get done(){return this.charge!==null&&this.victim!==null}get candidates(){return this.units.filter(e=>(this.side===void 0||e.side===this.side)&&!this.disabledOf(e))}get targets(){let e=this.charge;return e?this.units.filter(t=>t.id!==e.id&&!this.disabledOf(t)&&(e.side===void 0||t.side!==e.side)&&this.canTarget(e,t)):[]}get highlight(){return this.highlight_}get highlighted(){return this.active()[this.highlight_]??null}move(e){let t=this.active();t.length!==0&&(this.highlight_=((this.highlight_+e)%t.length+t.length)%t.length,this.onChange.dispatch())}select(){let e=this.highlighted;return e?(this.stage_===`attacker`?(this.charge=e,this.stage_=`target`,this.highlight_=0):this.victim=e,this.onChange.dispatch(),!0):!1}back(){if(this.stage_===`attacker`)return;let e=this.charge;this.charge=null,this.victim=null,this.stage_=`attacker`;let t=e?this.candidates.findIndex(t=>t.id===e.id):-1;this.highlight_=t>=0?t:0,this.onChange.dispatch()}reset(){this.charge=null,this.victim=null,this.stage_=`attacker`,this.highlight_=0,this.onChange.dispatch()}active(){return this.stage_===`attacker`?this.candidates:this.targets}},MW=class{constructor(e){this.onChange=new p,this.built=null,this.elapsed_=0,this.handleSelectorChange=()=>{if(this.selector.done&&this.attacker&&this.target){let e=this.damageFor(this.attacker,this.target);this.built=new kW({attacker:{hp:this.attacker.hp??0,name:this.attacker.id},defender:{hp:this.target.hp??0,name:this.target.id},damage:e.damage,strikes:e.strikes,...e.chanceToHit===void 0?{}:{chanceToHit:e.chanceToHit},...e.hits===void 0?{}:{hits:e.hits},strikeDuration:this.strikeDuration}),this.elapsed_=0}else this.built=null;this.onChange.dispatch()},this.damageFor=e.damageFor,this.strikeDuration=e.strikeDuration??0,this.selector=new jW({units:e.units,...e.side===void 0?{}:{side:e.side},...e.disabled===void 0?{}:{disabled:e.disabled},...e.canTarget===void 0?{}:{canTarget:e.canTarget}}),this.selector.onChange.add(this.handleSelectorChange)}get stage(){return this.selector.stage}get attacker(){return this.selector.attacker}get target(){return this.selector.target}get preview(){return this.built}get elapsed(){return this.elapsed_}get finished(){return this.built!==null&&this.elapsed_>=this.built.duration}get frame(){return this.built?this.built.sampleAt(this.elapsed_):null}move(e){this.selector.move(e)}select(){return this.selector.select()}back(){this.selector.back()}update(e){return this.built?(this.elapsed_=Math.min(this.built.duration,this.elapsed_+Math.max(0,e)),this.frame):null}finish(){this.built&&(this.elapsed_=this.built.duration)}reset(){this.selector.reset(),this.built=null,this.elapsed_=0}},NW=class{constructor(){this.onChange=new p,this.planned=[],this.undone=[]}get plans(){return this.planned}get isEmpty(){return this.planned.length===0}get canUndo(){return this.planned.length>0}get canRedo(){return this.undone.length>0}plannedFor(e){return this.planned.find(t=>t.unit===e)}plan(e){let t=this.planned.findIndex(t=>t.unit===e.unit);t>=0?this.planned[t]=e:this.planned.push(e),this.undone=[],this.onChange.dispatch()}undo(){let e=this.planned.pop();return e?(this.undone.push(e),this.onChange.dispatch(),e):null}redo(){let e=this.undone.pop();return e?(this.planned=this.planned.filter(t=>t.unit!==e.unit),this.planned.push(e),this.onChange.dispatch(),e):null}clear(){(this.planned.length!==0||this.undone.length!==0)&&(this.planned=[],this.undone=[],this.onChange.dispatch())}commit(){let e=this.planned;return this.planned=[],this.undone=[],e.length>0&&this.onChange.dispatch(),e}},PW=class e{constructor(){this.counts=new Map}record(e,t,n=1){let r=this.counts.get(e)??new Map;r.set(t,(r.get(t)??0)+n),this.counts.set(e,r)}forType(e,t){return this.counts.get(e)?.get(t)??0}total(e){let t=this.counts.get(e);if(!t)return 0;let n=0;for(let e of t.values())n+=e;return n}breakdown(e){let t=this.counts.get(e);return t?[...t.entries()].map(([e,t])=>({unitType:e,count:t})):[]}toJSON(){return{counts:[...this.counts].map(([e,t])=>[e,[...t]])}}static fromJSON(t){let n=new e;for(let[e,r]of t.counts)n.counts.set(e,new Map(r));return n}},FW=l({AttackDialog:()=>MW,AttackPreview:()=>kW,BattleHooks:()=>DW,BattleStats:()=>PW,Creature:()=>vW,Field:()=>OW,Party:()=>bW,StatStages:()=>CW,TypeMatrix:()=>yW,UnitSelector:()=>jW,Whiteboard:()=>NW,battleOrder:()=>xW,checkEvolution:()=>SW,chooseMove:()=>wW,chooseSwitch:()=>TW});function IW(e){let t=e.charCodeAt(0)-97,n=e.charCodeAt(1)-49;if(t<0||t>7||n<0||n>7||e.length!==2)throw Error(`not a square: "${e}"`);return n*8+t}function LW(e){return String.fromCharCode(97+(e&7))+String.fromCharCode(49+(e>>3))}function RW(e){let t=[];for(let n=7;n>=0;n--){let r=``,i=0;for(let t=0;t<8;t++){let a=e.board[n*8+t];if(!a){i++;continue}i>0&&(r+=String(i),i=0);let o={pawn:`p`,knight:`n`,bishop:`b`,rook:`r`,queen:`q`,king:`k`}[a.kind];r+=a.side===`white`?o.toUpperCase():o}i>0&&(r+=String(i)),t.push(r)}let n=(e.castling.whiteKingside?`K`:``)+(e.castling.whiteQueenside?`Q`:``)+(e.castling.blackKingside?`k`:``)+(e.castling.blackQueenside?`q`:``);return`${t.join(`/`)} ${e.turn===`white`?`w`:`b`} ${n||`-`} ${e.enPassant===null?`-`:LW(e.enPassant)}`}function zW(e){let t=e.trim().split(/\s+/);if(t.length<4)throw Error(`not a FEN string: "${e}"`);let n=Array(64).fill(null),r=t[0].split(`/`);if(r.length!==8)throw Error(`a FEN placement needs 8 ranks: "${e}"`);if(r.forEach((t,r)=>{let i=7-r,a=0;for(let r of t)if(r>=`1`&&r<=`8`)a+=r.charCodeAt(0)-48;else{let o=r===r.toUpperCase()?`white`:`black`,s={p:`pawn`,n:`knight`,b:`bishop`,r:`rook`,q:`queen`,k:`king`}[r.toLowerCase()];if(!s||a>7)throw Error(`bad FEN rank "${t}" in "${e}"`);n[i*8+a]={side:o,kind:s},a++}if(a!==8)throw Error(`bad FEN rank "${t}" in "${e}"`)}),t[1]!==`w`&&t[1]!==`b`)throw Error(`a FEN side is "w" or "b": "${e}"`);let i={whiteKingside:!1,whiteQueenside:!1,blackKingside:!1,blackQueenside:!1};if(t[2]!==`-`)for(let n of t[2])if(n===`K`)i.whiteKingside=!0;else if(n===`Q`)i.whiteQueenside=!0;else if(n===`k`)i.blackKingside=!0;else if(n===`q`)i.blackQueenside=!0;else throw Error(`bad FEN castling "${t[2]}" in "${e}"`);let a=t[3]===`-`?null:IW(t[3]);if(a!==null){let n=t[1]===`w`?5:2;if(HW(a)!==n)throw Error(`bad FEN en passant square "${t[3]}" in "${e}"`)}let o={board:n,turn:t[1]===`w`?`white`:`black`,castling:i,enPassant:a};return ZW(n,`white`),ZW(n,`black`),o}function BW(e){return e===`white`?`black`:`white`}function VW(e){return e&7}function HW(e){return e>>3}function UW(e,t){return e>=0&&e<8&&t>=0&&t<8}function WW(){let e=[`rook`,`knight`,`bishop`,`queen`,`king`,`bishop`,`knight`,`rook`],t=Array(64).fill(null);for(let n=0;n<8;n++)t[n]={side:`white`,kind:e[n]},t[8+n]={side:`white`,kind:`pawn`},t[48+n]={side:`black`,kind:`pawn`},t[56+n]={side:`black`,kind:e[n]};return{board:t,turn:`white`,castling:{whiteKingside:!0,whiteQueenside:!0,blackKingside:!0,blackQueenside:!0},enPassant:null}}function GW(e){return{board:e.board.map(e=>e?{side:e.side,kind:e.kind}:null),turn:e.turn,castling:{...e.castling},enPassant:e.enPassant}}var KW=[[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]],qW=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],JW=[[1,1],[-1,1],[-1,-1],[1,-1]],YW=[[1,0],[0,1],[-1,0],[0,-1]];function XW(e,t,n){let r=VW(t),i=HW(t),a=n===`white`?i-1:i+1;for(let t of[-1,1]){if(!UW(r+t,a))continue;let i=e[a*8+r+t];if(i&&i.side===n&&i.kind===`pawn`)return!0}for(let[t,a]of KW){if(!UW(r+t,i+a))continue;let o=e[(i+a)*8+r+t];if(o&&o.side===n&&o.kind===`knight`)return!0}for(let[t,a]of qW){if(!UW(r+t,i+a))continue;let o=e[(i+a)*8+r+t];if(o&&o.side===n&&o.kind===`king`)return!0}let o=[{steps:JW,kinds:[`bishop`,`queen`]},{steps:YW,kinds:[`rook`,`queen`]}];for(let{steps:t,kinds:a}of o)for(let[o,s]of t){let t=r+o,c=i+s;for(;UW(t,c);){let r=e[c*8+t];if(r){if(r.side===n&&a.includes(r.kind))return!0;break}t+=o,c+=s}}return!1}function ZW(e,t){let n=e.findIndex(e=>e!==null&&e.side===t&&e.kind===`king`);if(n===-1)throw Error(`a position without a ${t} king cannot be judged`);return n}function QW(e,t){return XW(e.board,ZW(e.board,t),BW(t))}function $W(e,t){let n=e.board[t];if(!n||n.side!==e.turn)return[];let r=[],i=VW(t),a=HW(t),o=o=>{for(let[s,c]of o){let o=i+s,l=a+c;for(;UW(o,l);){let i=l*8+o,a=e.board[i];if(!a)r.push({from:t,to:i});else{a.side!==n.side&&r.push({from:t,to:i});break}o+=s,l+=c}}};switch(n.kind){case`pawn`:{let o=n.side===`white`?1:-1,s=n.side===`white`?1:6,c=n.side===`white`?7:0;if(UW(i,a+o)&&!e.board[(a+o)*8+i]){let n=(a+o)*8+i;if(a+o===c)for(let e of[`knight`,`bishop`,`rook`,`queen`])r.push({from:t,to:n,promotion:e});else r.push({from:t,to:n}),a===s&&!e.board[(a+2*o)*8+i]&&r.push({from:t,to:(a+2*o)*8+i})}for(let s of[-1,1]){if(!UW(i+s,a+o))continue;let l=(a+o)*8+i+s,u=e.board[l];if(u&&u.side!==n.side){if(a+o===c)for(let e of[`knight`,`bishop`,`rook`,`queen`])r.push({from:t,to:l,promotion:e});else r.push({from:t,to:l})}else!u&&l===e.enPassant&&r.push({from:t,to:l,enPassantTake:a*8+i+s})}break}case`knight`:for(let[o,s]of KW){if(!UW(i+o,a+s))continue;let c=(a+s)*8+i+o,l=e.board[c];(!l||l.side!==n.side)&&r.push({from:t,to:c})}break;case`bishop`:o(JW);break;case`rook`:o(YW);break;case`queen`:o(JW),o(YW);break;case`king`:{for(let[o,s]of qW){if(!UW(i+o,a+s))continue;let c=(a+s)*8+i+o,l=e.board[c];l&&l.side===n.side||l&&l.kind===`king`||r.push({from:t,to:c})}let o=n.side===`white`?0:56,s=n.side===`white`?{king:e.castling.whiteKingside,queen:e.castling.whiteQueenside}:{king:e.castling.blackKingside,queen:e.castling.blackQueenside};t===o+4&&!QW(e,n.side)&&(s.king&&!e.board[o+5]&&!e.board[o+6]&&!XW(e.board,o+5,BW(n.side))&&!XW(e.board,o+6,BW(n.side))&&r.push({from:t,to:o+6,castle:`kingside`}),s.queen&&!e.board[o+3]&&!e.board[o+2]&&!e.board[o+1]&&!XW(e.board,o+3,BW(n.side))&&!XW(e.board,o+2,BW(n.side))&&r.push({from:t,to:o+2,castle:`queenside`}));break}}return r}function eG(e,t){let n=e.board[t.from];if(!n)throw Error(`no piece on ${LW(t.from)} to move`);let r=(e,t)=>{let n=e===`white`?0:56;return t===n||t===n+7};n.kind===`king`&&(n.side===`white`?e.castling.whiteKingside=e.castling.whiteQueenside=!1:e.castling.blackKingside=e.castling.blackQueenside=!1),n.kind===`rook`&&r(n.side,t.from)&&(e.castling[tG(n.side,t.from)]=!1);let i=e.board[t.to];if(i&&i.kind===`rook`&&r(i.side,t.to)&&(e.castling[tG(i.side,t.to)]=!1),e.board[t.to]=t.promotion?{side:n.side,kind:t.promotion}:n,e.board[t.from]=null,t.enPassantTake!==void 0&&(e.board[t.enPassantTake]=null),t.castle){let r=n.side===`white`?0:56;t.castle===`kingside`?(e.board[r+5]=e.board[r+7],e.board[r+7]=null):(e.board[r+3]=e.board[r],e.board[r]=null)}e.enPassant=n.kind===`pawn`&&Math.abs(t.to-t.from)===16?(t.from+t.to)/2:null,e.turn=BW(n.side)}function tG(e,t){let n=VW(t)===7;return e===`white`?n?`whiteKingside`:`whiteQueenside`:n?`blackKingside`:`blackQueenside`}function nG(e){let t=[];for(let n=0;n<64;n++)if(e.board[n]&&e.board[n]?.side===e.turn)for(let r of $W(e,n)){let n=GW(e);eG(n,r),!QW(n,e.turn)&&t.push({from:r.from,to:r.to,...r.promotion?{promotion:r.promotion}:{}})}return t}function rG(e,t){let n=e.board[t.from];if(!n||n.side!==e.turn)throw Error(`no ${e.turn} piece on ${LW(t.from)} to move`);let r=$W(e,t.from).find(e=>e.to===t.to&&(e.promotion??null)===(t.promotion??null));if(!r)throw Error(`${LW(t.from)}-${LW(t.to)} is not a legal move here`);let i=GW(e);if(eG(i,r),QW(i,e.turn))throw Error(`${LW(t.from)}-${LW(t.to)} leaves the king in check`);eG(e,r)}function iG(e){return nG(e).length>0?`ongoing`:QW(e,e.turn)?e.turn===`white`?`black-wins`:`white-wins`:`stalemate`}var aG=1e5;function oG(e,t,n){if(!Number.isInteger(n.depth)||n.depth<1)throw RangeError(`depth must be a positive integer`);let r=n.maxNodes??aG;if(!Number.isInteger(r)||r<1)throw RangeError(`maxNodes must be a positive integer`);let i=e.currentPlayer(t),a=0,o=0,s,c=(t,l,u,d)=>{if(n.signal?.aborted)return s=`cancelled`,0;if(++a>r)return s=`budget-exceeded`,0;let f=e.currentPlayer(t)===i;if(n.onNode?.(l,f),l===0||e.isTerminal(t))return e.evaluate(t,i);let p=e.moves(t);if(!p.length)return e.evaluate(t,i);let m=f?-1/0:1/0;for(let n of p){let r=c(e.apply(t,n),l-1,u,d);if(s)return r;if(f?(m=Math.max(m,r),u=Math.max(u,m)):(m=Math.min(m,r),d=Math.min(d,m)),d<=u){o++;break}}return m},l=e.moves(t),u=null,d=e.evaluate(t,i);if(!e.isTerminal(t)&&l.length){let r=e.currentPlayer(t)===i,a=r?-1/0:1/0,o=-1/0,f=1/0;for(let i of l){let l=c(e.apply(t,i),n.depth-1,o,f);if(s)break;(u===null||(r?l>a:l<a))&&(u=i,a=l),r?o=Math.max(o,a):f=Math.min(f,a)}u!==null&&(d=a)}return{move:s?null:u,score:d,depth:n.depth,nodes:a,cutoffs:o,status:s??`complete`,state:t}}function sG(e,t){return e.moves(t).map(n=>({move:n,child:e.apply(t,n)}))}function cG(e,t){let n=null,r=t?-1/0:1/0;for(let{move:i,score:a}of e)(n===null||(t?a>r:a<r))&&(n=i,r=a);return n}function lG(){return globalThis.process?.getBuiltinModule?.(`node:worker_threads`)}function uG(){let e=globalThis.process?.getBuiltinModule?.(`node:worker_threads`)?.parentPort??null,t=globalThis,n=e=>{let t=[],n=new Set,r=e=>{if(typeof e!=`object`||!e||n.has(e))return;if(n.add(e),ArrayBuffer.isView(e)){let n=e.buffer;n instanceof ArrayBuffer&&!t.includes(n)&&t.push(n);return}if(e instanceof ArrayBuffer){t.includes(e)||t.push(e);return}if(Array.isArray(e)){for(let t of e)r(t);return}let i=Object.getPrototypeOf(e);if(i===Object.prototype||i===null)for(let t of Object.values(e))r(t)};return r(e),t},r=(n,r=[])=>{e?e.postMessage(n,r):t.postMessage(n,r)},i=async e=>{try{let t=await Function(`return (${e.code});`)()(...e.args);r({ok:!0,value:t},n(t))}catch(e){let t=e;r({ok:!1,message:String(t?.message??e),stack:typeof t?.stack==`string`?t.stack:void 0})}};e?e.on(`message`,e=>void i(e)):t.onmessage=e=>void i(e.data)}var dG=e=>{if(typeof Worker>`u`||typeof Blob>`u`||typeof URL>`u`||typeof URL.createObjectURL!=`function`)return null;let t=URL.createObjectURL(new Blob([`(${uG.toString()})()`],{type:`text/javascript`})),n;try{n=new Worker(t)}catch(e){throw URL.revokeObjectURL(t),e}return n.onmessage=t=>e.reply(t.data),n.onerror=t=>e.fail(Error(t.message||`the worker failed to run`)),n.onmessageerror=()=>e.fail(Error(`the worker sent a reply that could not be deserialized`)),{post:(e,t)=>n.postMessage(e,t),terminate:()=>{n.terminate(),URL.revokeObjectURL(t)}}},fG=e=>{let t=lG();if(!t)return null;let n=new t.Worker(`(${uG.toString()})()`,{eval:!0});return n.on(`message`,t=>e.reply(t)),n.on(`error`,t=>e.fail(t instanceof Error?t:Error(String(t)))),n.on(`messageerror`,()=>e.fail(Error(`the worker sent a reply that could not be deserialized`))),n.on(`exit`,t=>e.fail(Error(`the worker exited with code ${t} before answering`))),{post:(e,t)=>n.postMessage(e,t),terminate:()=>void n.terminate()}};function pG(e){let t=Error(e.message);return e.stack&&(t.stack=e.stack),t}function mG(e,t,n={}){return new Promise((r,i)=>{if(n.signal?.aborted){i(n.signal.reason);return}let a=!1,o,s,c=e=>{a||(a=!0,o!==void 0&&clearTimeout(o),n.signal?.removeEventListener(`abort`,l),s?.terminate(),e())};function l(){c(()=>i(n.signal.reason))}let u={reply:e=>c(()=>{e.ok?r(e.value):i(pG(e))}),fail:e=>c(()=>i(e))};try{s=dG(u)??fG(u)}catch(e){i(e);return}if(!s)i(Error(`spawn() needs Web Workers or node:worker_threads, and this environment offers neither`));else{n.timeout!==void 0&&n.timeout>0&&(o=setTimeout(()=>c(()=>i(Error(`the task did not answer within ${n.timeout} ms`))),n.timeout)),n.signal?.addEventListener(`abort`,l,{once:!0});try{s.post({code:e.toString(),args:t??[]},n.transfer??[])}catch(e){c(()=>i(e))}}})}var hG=1e5,gG={pawn:100,knight:320,bishop:330,rook:500,queen:900,king:0};function _G(e,t={}){return vG(e,t).move}function vG(e,t={}){let n=oG(SG,e,{depth:Math.max(1,Math.floor(t.depth??3)),maxNodes:t.maxNodes===void 0?1e5:Math.max(1,Math.floor(t.maxNodes))});return{move:n.move,score:n.score,nodes:n.nodes}}async function yG(e,t={}){let n=Math.max(1,Math.floor(t.depth??3)),r=t.maxNodes===void 0?1e5:Math.max(1,Math.floor(t.maxNodes)),i=t.jobs??bG();if(!Number.isInteger(i)||i<1)throw RangeError(`jobs must be a positive integer`);if(t.signal?.aborted)throw t.signal.reason;let a=SG.currentPlayer(e),o=sG(SG,e);if(SG.isTerminal(e)||!o.length)return{move:null,score:SG.evaluate(e,a),nodes:0};let s=Math.max(1,Math.min(i,o.length)),c=Array(o.length),l=0,u=!1,d=0,f=t.signal?{signal:t.signal}:{};if(await Promise.all(Array.from({length:s},async()=>{for(;;){let e=d++;if(e>=o.length)return;let t=await mG(xG,[o[e].child,a,n-1,r],f);l+=t.nodes,t.budgetExceeded?u=!0:c[e]={move:o[e].move,score:t.score}}})),u)return{move:null,score:SG.evaluate(e,a),nodes:l};let p=c.filter(e=>e!==void 0),m=cG(p,!0);return{move:m,score:p.find(e=>e.move===m)?.score??SG.evaluate(e,a),nodes:l}}function bG(){let e=globalThis,t=e.navigator?.hardwareConcurrency;if(typeof t==`number`&&Number.isInteger(t)&&t>0)return Math.min(t,8);try{let t=e.process?.getBuiltinModule?.(`node:os`)?.availableParallelism?.();if(typeof t==`number`&&Number.isInteger(t)&&t>0)return Math.min(t,8)}catch{}return 4}function xG(e,t,n,r){let i={pawn:100,knight:320,bishop:330,rook:500,queen:900,king:0},a=e=>e===`white`?`black`:`white`,o=e=>e&7,s=e=>e>>3,c=(e,t)=>e>=0&&e<8&&t>=0&&t<8,l=[[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]],u=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],d=[[1,1],[-1,1],[-1,-1],[1,-1]],f=[[1,0],[0,1],[-1,0],[0,-1]],p=(e,t,n)=>{let r=o(t),i=s(t),a=n===`white`?i-1:i+1;for(let t of[-1,1]){if(!c(r+t,a))continue;let i=e[a*8+r+t];if(i&&i.side===n&&i.kind===`pawn`)return!0}for(let[t,a]of l){if(!c(r+t,i+a))continue;let o=e[(i+a)*8+r+t];if(o&&o.side===n&&o.kind===`knight`)return!0}for(let[t,a]of u){if(!c(r+t,i+a))continue;let o=e[(i+a)*8+r+t];if(o&&o.side===n&&o.kind===`king`)return!0}let p=[{steps:d,kinds:[`bishop`,`queen`]},{steps:f,kinds:[`rook`,`queen`]}];for(let{steps:t,kinds:a}of p)for(let[o,s]of t){let t=r+o,l=i+s;for(;c(t,l);){let r=e[l*8+t];if(r){if(r.side===n&&a.includes(r.kind))return!0;break}t+=o,l+=s}}return!1},m=(e,t)=>{let n=e.findIndex(e=>e!==null&&e.side===t&&e.kind===`king`);if(n===-1)throw Error(`a position without a ${t} king cannot be judged`);return n},h=(e,t)=>p(e.board,m(e.board,t),a(t)),g=(e,t)=>{let n=e.board[t];if(!n||n.side!==e.turn)return[];let r=[],i=o(t),m=s(t),g=a=>{for(let[o,s]of a){let a=i+o,l=m+s;for(;c(a,l);){let i=l*8+a,c=e.board[i];if(!c)r.push({from:t,to:i});else{c.side!==n.side&&r.push({from:t,to:i});break}a+=o,l+=s}}};switch(n.kind){case`pawn`:{let a=n.side===`white`?1:-1,o=n.side===`white`?1:6,s=n.side===`white`?7:0;if(c(i,m+a)&&!e.board[(m+a)*8+i]){let n=(m+a)*8+i;if(m+a===s)for(let e of[`knight`,`bishop`,`rook`,`queen`])r.push({from:t,to:n,promotion:e});else r.push({from:t,to:n}),m===o&&!e.board[(m+2*a)*8+i]&&r.push({from:t,to:(m+2*a)*8+i})}for(let o of[-1,1]){if(!c(i+o,m+a))continue;let l=(m+a)*8+i+o,u=e.board[l];if(u&&u.side!==n.side){if(m+a===s)for(let e of[`knight`,`bishop`,`rook`,`queen`])r.push({from:t,to:l,promotion:e});else r.push({from:t,to:l})}else!u&&l===e.enPassant&&r.push({from:t,to:l,enPassantTake:m*8+i+o})}break}case`knight`:for(let[a,o]of l){if(!c(i+a,m+o))continue;let s=(m+o)*8+i+a,l=e.board[s];(!l||l.side!==n.side)&&r.push({from:t,to:s})}break;case`bishop`:g(d);break;case`rook`:g(f);break;case`queen`:g(d),g(f);break;case`king`:{for(let[a,o]of u){if(!c(i+a,m+o))continue;let s=(m+o)*8+i+a,l=e.board[s];l&&l.side===n.side||l&&l.kind===`king`||r.push({from:t,to:s})}let o=n.side===`white`?0:56,s=n.side===`white`?{king:e.castling.whiteKingside,queen:e.castling.whiteQueenside}:{king:e.castling.blackKingside,queen:e.castling.blackQueenside};t===o+4&&!h(e,n.side)&&(s.king&&!e.board[o+5]&&!e.board[o+6]&&!p(e.board,o+5,a(n.side))&&!p(e.board,o+6,a(n.side))&&r.push({from:t,to:o+6,castle:`kingside`}),s.queen&&!e.board[o+3]&&!e.board[o+2]&&!e.board[o+1]&&!p(e.board,o+3,a(n.side))&&!p(e.board,o+2,a(n.side))&&r.push({from:t,to:o+2,castle:`queenside`}));break}}return r},_=(e,t)=>{let n=e.board[t.from];if(!n)throw Error(`no piece on ${t.from} to move`);let r=(e,t)=>{let n=e===`white`?0:56;return t===n||t===n+7},i=(e,t)=>{let n=o(t)===7;return e===`white`?n?`whiteKingside`:`whiteQueenside`:n?`blackKingside`:`blackQueenside`};n.kind===`king`&&(n.side===`white`?e.castling.whiteKingside=e.castling.whiteQueenside=!1:e.castling.blackKingside=e.castling.blackQueenside=!1),n.kind===`rook`&&r(n.side,t.from)&&(e.castling[i(n.side,t.from)]=!1);let s=e.board[t.to];if(s&&s.kind===`rook`&&r(s.side,t.to)&&(e.castling[i(s.side,t.to)]=!1),e.board[t.to]=t.promotion?{side:n.side,kind:t.promotion}:n,e.board[t.from]=null,t.enPassantTake!==void 0&&(e.board[t.enPassantTake]=null),t.castle){let r=n.side===`white`?0:56;t.castle===`kingside`?(e.board[r+5]=e.board[r+7],e.board[r+7]=null):(e.board[r+3]=e.board[r],e.board[r]=null)}e.enPassant=n.kind===`pawn`&&Math.abs(t.to-t.from)===16?(t.from+t.to)/2:null,e.turn=a(n.side)},v=e=>({board:e.board.map(e=>e?{side:e.side,kind:e.kind}:null),turn:e.turn,castling:{...e.castling},enPassant:e.enPassant}),y=e=>{let t=[];for(let n=0;n<64;n++)if(e.board[n]&&e.board[n]?.side===e.turn)for(let r of g(e,n)){let n=v(e);_(n,r),!h(n,e.turn)&&t.push({from:r.from,to:r.to,...r.promotion?{promotion:r.promotion}:{}})}return t},b=e=>y(e).length>0?`ongoing`:h(e,e.turn)?e.turn===`white`?`black-wins`:`white-wins`:`stalemate`,x=(e,t)=>{let n=e.board[t.to];return(t.promotion?i[t.promotion]:0)*10+(n?i[n.kind]:0)},S=(e,t)=>t.slice().sort((t,n)=>x(e,n)-x(e,t)),C=(e,t)=>{let n=0;for(let t of e.board)t&&(n+=(t.side===`white`?1:-1)*i[t.kind]);return t===1?n:-n},ee=(e,t)=>{let n=b(e);return n===`stalemate`||!h(e,e.turn)?0:(n===`white-wins`?1:-1)===t?1e5:-1e5},w=e=>b(e)===`ongoing`?C(e,t):ee(e,t),T=0,E=!1,te=(e,n,i,a)=>{if(++T>r)return E=!0,0;let o=(e.turn===`white`?1:-1)===t;if(n===0||b(e)!==`ongoing`)return w(e);let s=S(e,y(e));if(!s.length)return w(e);let c=o?-1/0:1/0;for(let t of s){let r=v(e),s=g(r,t.from).find(e=>e.to===t.to&&(e.promotion??null)===(t.promotion??null));if(!s)throw Error(`a legal move stopped being legal: ${t.from}-${t.to}`);_(r,s);let l=te(r,n-1,i,a);if(E)return l;if(o?(c=Math.max(c,l),i=Math.max(i,c)):(c=Math.min(c,l),a=Math.min(a,c)),a<=i)break}return c};return{score:te(e,n,-1/0,1/0),nodes:T,budgetExceeded:E}}var SG={currentPlayer:e=>e.turn===`white`?1:-1,moves:e=>TG(e,nG(e)),apply:(e,t)=>{let n=GW(e);return rG(n,t),n},isTerminal:e=>iG(e)!==`ongoing`,evaluate:(e,t)=>iG(e)===`ongoing`?CG(e,t):wG(e,t)};function CG(e,t){let n=0;for(let t of e.board)t&&(n+=(t.side===`white`?1:-1)*gG[t.kind]);return t===1?n:-n}function wG(e,t){let n=iG(e);return n===`stalemate`||!QW(e,e.turn)?0:(n===`white-wins`?1:-1)===t?hG:-1e5}function TG(e,t){return t.slice().sort((t,n)=>EG(e,n)-EG(e,t))}function EG(e,t){let n=e.board[t.to];return(t.promotion?gG[t.promotion]:0)*10+(n?gG[n.kind]:0)}function DG(e,t){return e.positions[RW(t)]??null}var OG={q:`queen`,r:`rook`,b:`bishop`,n:`knight`};function kG(e){let t=/^([a-h][1-8])([a-h][1-8])([qrbn])?$/.exec(e);if(!t)throw Error(`not a UCI move: "${e}"`);let n=t[3]?OG[t[3]]:void 0;return n?{from:IW(t[1]),to:IW(t[2]),promotion:n}:{from:IW(t[1]),to:IW(t[2])}}var AG={pawn:0,knight:1,bishop:2,rook:3,queen:4,king:5},jG=[`queen`,`rook`,`bishop`,`knight`],MG=[[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]],NG=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],PG=[[1,1],[-1,1],[-1,-1],[1,-1]],FG=[[1,0],[0,1],[-1,0],[0,-1]];function IG(e){return 1n<<BigInt(e)}function LG(e){return Math.log2(Number(e))}function RG(e){return Array.from({length:64},(t,n)=>{let r=n&7,i=n>>3,a=0n;for(let[t,n]of e){let e=r+t,o=i+n;e>=0&&e<8&&o>=0&&o<8&&(a|=IG(o*8+e))}return a})}var zG=RG(MG),BG=RG(NG);function VG(e,t){return e.pieces[t]|e.pieces[t+1]|e.pieces[t+2]|e.pieces[t+3]|e.pieces[t+4]|e.pieces[t+5]}function HG(e,t){let n=IG(t);for(let t=0;t<12;t++)if(e.pieces[t]&n)return t;return-1}function UG(e,t,n){let r=n?0:6,i=t&7,a=t>>3,o=n?a-1:a+1;for(let t of[-1,1]){let n=i+t;if(o>=0&&o<8&&n>=0&&n<8&&e.pieces[r]&IG(o*8+n))return!0}if(zG[t]&e.pieces[r+1]||BG[t]&e.pieces[r+5])return!0;let s=[{steps:PG,kinds:[2,4]},{steps:FG,kinds:[3,4]}];for(let{steps:t,kinds:n}of s)for(let[o,s]of t){let t=i+o,c=a+s;for(;t>=0&&t<8&&c>=0&&c<8;){let i=HG(e,c*8+t);if(i!==-1){if(i>=r&&i<r+6&&n.includes(i-r))return!0;break}t+=o,c+=s}}return!1}function WG(e,t){return e===`white`?t?1:2:t?4:8}function GG(e){let t=Array(12).fill(0n),n=[-1,-1];if(e.board.forEach((e,r)=>{if(!e)return;let i=(e.side===`white`?0:6)+AG[e.kind];t[i]|=IG(r),e.kind===`king`&&(n[e.side===`white`?0:1]=r)}),n[0]===-1||n[1]===-1)throw Error(`a position without both kings cannot go on bitboards`);return{pieces:t,turn:e.turn,castling:+!!e.castling.whiteKingside|(e.castling.whiteQueenside?2:0)|(e.castling.blackKingside?4:0)|(e.castling.blackQueenside?8:0),enPassant:e.enPassant,halfmove:0,kings:n}}function KG(){return GG(WW())}function qG(e){let t=e.turn===`white`,n=t?0:6,r=VG(e,n),i=VG(e,n===0?6:0),a=r|i,o=[],s=[];for(let c=0;c<64;c++){if(!(r&IG(c)))continue;let l=-1;for(let t=0;t<6;t++)if(e.pieces[n+t]&IG(c)){l=t;break}s.length=0,JG(e,c,l,a,i,s);for(let n of s){let r=YG(e,n);UG(e,e.kings[+!t],!t)||o.push({...n}),XG(e,n,r)}}return o}function JG(e,t,n,r,i,a){let o=e.turn===`white`,s=t&7,c=t>>3,l=(e,n)=>{a.push(n?{from:t,to:e,promotion:n}:{from:t,to:e})},u=e=>{for(let[t,n]of e){let e=s+t,a=c+n;for(;e>=0&&e<8&&a>=0&&a<8;){let o=a*8+e,s=IG(o);if(!(r&s))l(o);else{i&s&&l(o);break}e+=t,a+=n}}};switch(n){case 0:{let n=o?8:-8,a=o?1:6,u=o?7:0,d=t+n;if(d>=0&&d<64&&!(r&IG(d))){if(d>>3===u)for(let e of jG)l(d,e);else{l(d);let e=t+2*n;c===a&&!(r&IG(e))&&l(e)}}for(let r of[-1,1]){let a=s+r;if(a<0||a>7)continue;let o=t+n+r;if(!(o<0||o>=64)){if(i&IG(o)){if(o>>3===u)for(let e of jG)l(o,e);else l(o)}else o===e.enPassant&&l(o)}}break}case 1:{let n=zG[t]&~VG(e,o?0:6);for(;n;){let e=n&-n;l(LG(e)),n^=e}break}case 2:u(PG);break;case 3:u(FG);break;case 4:u(PG),u(FG);break;case 5:{let n=BG[t]&~VG(e,o?0:6);for(n&=~e.pieces[o?11:5];n;){let e=n&-n;l(LG(e)),n^=e}let i=o?0:56,a=e.castling,s=o?a&1:a&4,c=o?a&2:a&8;t===i+4&&!UG(e,t,!o)&&(s&&!(r&IG(i+5))&&!(r&IG(i+6))&&!UG(e,i+5,!o)&&!UG(e,i+6,!o)&&l(i+6),c&&!(r&IG(i+3))&&!(r&IG(i+2))&&!(r&IG(i+1))&&!UG(e,i+3,!o)&&!UG(e,i+2,!o)&&l(i+2));break}}}function YG(e,t){let n=e.turn===`white`,r=+!n,i=r*6,a=IG(t.from),o=IG(t.to),s=-1;for(let t=0;t<6;t++)if(e.pieces[i+t]&a){s=t;break}if(s===-1)throw Error(`no piece on ${t.from} to move`);let c={captured:null,castling:e.castling,enPassant:e.enPassant,halfmove:e.halfmove,kingSquare:e.kings[r]},l=(1-r)*6,u=n?8:-8,d=t.to;s===0&&t.to===e.enPassant&&(d=t.to-u);let f=IG(d);for(let t=0;t<6;t++)if(e.pieces[l+t]&f){c.captured={color:1-r,kind:t},e.pieces[l+t]^=f;break}let p=n?0:56,m=n?56:0;if(s===5&&(e.castling&=~(WG(e.turn,!0)|WG(e.turn,!1))),s===3&&(t.from===p||t.from===p+7)&&(e.castling&=~WG(e.turn,t.from===p+7)),c.captured?.kind===3&&(d===m||d===m+7)&&(e.castling&=~WG(n?`black`:`white`,d===m+7)),e.pieces[i+s]^=a,t.promotion?e.pieces[i+AG[t.promotion]]|=o:e.pieces[i+s]|=o,s===5&&Math.abs(t.to-t.from)===2){let n=i+3;t.to>t.from?e.pieces[n]^=IG(p+7)|IG(p+5):e.pieces[n]^=IG(p)|IG(p+3)}return e.enPassant=s===0&&Math.abs(t.to-t.from)===16?(t.from+t.to)/2:null,e.halfmove=s===0||c.captured?0:e.halfmove+1,s===5&&(e.kings[r]=t.to),e.turn=n?`black`:`white`,c}function XG(e,t,n){e.turn=e.turn===`white`?`black`:`white`;let r=e.turn===`white`,i=+!r,a=i*6,o=IG(t.to),s=t.promotion?0:(()=>{for(let t=0;t<6;t++)if(e.pieces[a+t]&o)return t;throw Error(`nothing on ${t.to} to take back`)})();if(t.promotion?e.pieces[a+AG[t.promotion]]^=o:e.pieces[a+s]^=o,e.pieces[a+s]|=IG(t.from),s===5&&Math.abs(t.to-t.from)===2){let n=r?0:56,i=a+3;t.to>t.from?e.pieces[i]^=IG(n+7)|IG(n+5):e.pieces[i]^=IG(n)|IG(n+3)}if(n.captured){let a=r?8:-8,o=s===0&&t.to===n.enPassant?t.to-a:t.to;e.pieces[(1-i)*6+n.captured.kind]|=IG(o)}e.castling=n.castling,e.enPassant=n.enPassant,e.halfmove=n.halfmove,e.kings[i]=n.kingSquare}function ZG(e,t){if(!Number.isInteger(t)||t<0)throw RangeError(`perft depth must be a non-negative integer`);if(t===0)return 1;let n=0;for(let r of qG(e)){let i=YG(e,r);n+=ZG(e,t-1),XG(e,r,i)}return n}function QG(e,t={}){let n=1e6,r=[100,320,330,500,900,0],i=Math.max(1,Math.floor(t.depth??3)),a=t.maxNodes===void 0?5e5:Math.max(1,Math.floor(t.maxNodes)),o=t.timeMs===void 0?-1:Date.now()+Math.max(1,t.timeMs),s={pieces:e.pieces.slice(),turn:e.turn,castling:e.castling,enPassant:e.enPassant,halfmove:e.halfmove,kings:[e.kings[0],e.kings[1]]};function c(e){return 1n<<BigInt(e)}function l(e){return Math.log2(Number(e))}let u=[[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]],d=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],f=[[1,1],[-1,1],[-1,-1],[1,-1]],p=[[1,0],[0,1],[-1,0],[0,-1]];function m(e){return Array.from({length:64},(t,n)=>{let r=n&7,i=n>>3,a=0n;for(let[t,n]of e){let e=r+t,o=i+n;e>=0&&e<8&&o>=0&&o<8&&(a|=c(o*8+e))}return a})}let h=m(u),g=m(d);function _(e){return s.pieces[e]|s.pieces[e+1]|s.pieces[e+2]|s.pieces[e+3]|s.pieces[e+4]|s.pieces[e+5]}function v(e){let t=c(e);for(let e=0;e<12;e++)if(s.pieces[e]&t)return e%6;return-1}function y(e,t){let n=t?0:6,r=e&7,i=e>>3,a=t?i-1:i+1;for(let e of[-1,1]){let t=r+e;if(a>=0&&a<8&&t>=0&&t<8&&s.pieces[n]&c(a*8+t))return!0}if(h[e]&s.pieces[n+1]||g[e]&s.pieces[n+5])return!0;let o=[{steps:f,kinds:[2,4]},{steps:p,kinds:[3,4]}];for(let{steps:e,kinds:n}of o)for(let[a,o]of e){let e=r+a,l=i+o;for(;e>=0&&e<8&&l>=0&&l<8;){let r=v(l*8+e);if(r!==-1){if((()=>{let t=c(l*8+e);for(let e=0;e<12;e++)if(s.pieces[e]&t)return e<6?0:1;return-1})()===+!t&&n.includes(r))return!0;break}e+=a,l+=o}}return!1}let b=0n,x=11400714819323198485n;function S(){x=x+11400714819323198485n&18446744073709551615n;let e=x;return e=(e^e>>30n)*13787848793156543929n&18446744073709551615n,e=(e^e>>27n)*10723151780598845931n&18446744073709551615n,e^e>>31n}let C=Array.from({length:12},()=>Array.from({length:64},()=>S())),ee=S(),w=Array.from({length:16},()=>S()),T=Array.from({length:8},()=>S());function E(){let e=0n;for(let t=0;t<12;t++){let n=s.pieces[t];for(;n;){let r=n&-n;e^=C[t][l(r)],n^=r}}return s.turn===`black`&&(e^=ee),e^=w[s.castling],s.enPassant!==null&&(e^=T[s.enPassant&7]),e}b=E();function te(e,t){return e===`white`?t?1:2:t?4:8}function D(e){let t=s.turn===`white`,n=+!t,r=n*6,i=c(e.from),a=c(e.to),o=-1;for(let e=0;e<6;e++)if(s.pieces[r+e]&i){o=e;break}let l={captured:null,castling:s.castling,enPassant:s.enPassant,halfmove:s.halfmove,kingSquare:s.kings[n],key:b,nullMove:!1},u=(1-n)*6,d=t?8:-8,f=e.to;o===0&&e.to===s.enPassant&&(f=e.to-d);let p=c(f);for(let e=0;e<6;e++)if(s.pieces[u+e]&p){l.captured={color:1-n,kind:e},s.pieces[u+e]^=p;break}let m=t?0:56,h=t?56:0;o===5&&(s.castling&=~(te(s.turn,!0)|te(s.turn,!1))),o===3&&(e.from===m||e.from===m+7)&&(s.castling&=~te(s.turn,e.from===m+7)),l.captured&&l.captured.kind===3&&(f===h||f===h+7)&&(s.castling&=~te(t?`black`:`white`,f===h+7));let g={queen:4,rook:3,bishop:2,knight:1};if(s.pieces[r+o]^=i,e.promotion?s.pieces[r+g[e.promotion]]|=a:s.pieces[r+o]|=a,o===5&&Math.abs(e.to-e.from)===2){let t=r+3;e.to>e.from?s.pieces[t]^=c(m+7)|c(m+5):s.pieces[t]^=c(m)|c(m+3)}return s.enPassant=o===0&&Math.abs(e.to-e.from)===16?(e.from+e.to)/2:null,s.halfmove=o===0||l.captured?0:s.halfmove+1,o===5&&(s.kings[n]=e.to),s.turn=t?`black`:`white`,b=E(),l}function O(e,t){s.turn=s.turn===`white`?`black`:`white`;let n=s.turn===`white`,r=+!n,i=r*6,a=c(e.to),o=e.promotion?0:(()=>{for(let e=0;e<6;e++)if(s.pieces[i+e]&a)return e;return-1})(),l={queen:4,rook:3,bishop:2,knight:1};if(e.promotion?s.pieces[i+l[e.promotion]]^=a:s.pieces[i+o]^=a,s.pieces[i+o]|=c(e.from),o===5&&Math.abs(e.to-e.from)===2){let t=n?0:56,r=i+3;e.to>e.from?s.pieces[r]^=c(t+7)|c(t+5):s.pieces[r]^=c(t)|c(t+3)}if(t.captured){let i=n?8:-8,a=o===0&&e.to===t.enPassant?e.to-i:e.to;s.pieces[(1-r)*6+t.captured.kind]|=c(a)}s.castling=t.castling,s.enPassant=t.enPassant,s.halfmove=t.halfmove,s.kings[r]=t.kingSquare,b=t.key}function ne(){let e={captured:null,castling:s.castling,enPassant:s.enPassant,halfmove:s.halfmove,kingSquare:-1,key:b,nullMove:!0};return s.enPassant=null,s.halfmove+=1,s.turn=s.turn===`white`?`black`:`white`,b=E(),e}function k(e){s.turn=s.turn===`white`?`black`:`white`,s.enPassant=e.enPassant,s.halfmove=e.halfmove,b=e.key}function A(e,t,n,r,i){let a=s.turn===`white`,o=e&7,u=e>>3,d=(t,n)=>{i.push(n?{from:e,to:t,promotion:n}:{from:e,to:t})},m=e=>{for(let[t,i]of e){let e=o+t,a=u+i;for(;e>=0&&e<8&&a>=0&&a<8;){let o=a*8+e,s=c(o);if(!(n&s))d(o);else{r&s&&d(o);break}e+=t,a+=i}}},v=[`queen`,`rook`,`bishop`,`knight`];if(t===0){let t=a?8:-8,i=a?1:6,l=a?7:0,f=e+t;if(f>=0&&f<64&&!(n&c(f))){if(f>>3===l)for(let e of v)d(f,e);else{d(f);let r=e+2*t;u===i&&!(n&c(r))&&d(r)}}for(let n of[-1,1]){let i=o+n;if(i<0||i>7)continue;let a=e+t+n;if(!(a<0||a>=64)){if(r&c(a)){if(a>>3===l)for(let e of v)d(a,e);else d(a)}else a===s.enPassant&&d(a)}}}else if(t===1){let t=h[e]&~_(a?0:6);for(;t;){let e=t&-t;d(l(e)),t^=e}}else if(t===2)m(f);else if(t===3)m(p);else if(t===4)m(f),m(p);else{let t=g[e]&~_(a?0:6);for(t&=~s.pieces[a?11:5];t;){let e=t&-t;d(l(e)),t^=e}let r=a?0:56,i=s.castling,o=a?i&1:i&4,u=a?i&2:i&8;e===r+4&&!y(e,!a)&&(o&&!(n&c(r+5))&&!(n&c(r+6))&&!y(r+5,!a)&&!y(r+6,!a)&&d(r+6),u&&!(n&c(r+3))&&!(n&c(r+2))&&!(n&c(r+1))&&!y(r+3,!a)&&!y(r+2,!a)&&d(r+2))}}function re(){let e=s.turn===`white`,t=e?0:6,n=_(t),r=_(t===0?6:0),i=n|r,a=[],o=[];for(let l=0;l<64;l++){if(!(n&c(l)))continue;let u=-1;for(let e=0;e<6;e++)if(s.pieces[t+e]&c(l)){u=e;break}o.length=0,A(l,u,i,r,o);for(let t of o){let n=D(t);y(s.kings[+!e],!e)||a.push({...t}),O(t,n)}}return a}function ie(e){let t=e?0:6;return s.pieces[t+1]!==0n||s.pieces[t+2]!==0n||s.pieces[t+3]!==0n||s.pieces[t+4]!==0n}function ae(){let e=0,t=0;for(let n=0;n<12;n++){if(n%6==5)continue;let r=s.pieces[n];for(;r;)r&=r-1n,e++,(n%6==1||n%6==2)&&t++}return e===0||e===1&&t===1}function oe(){let e=0,t=0;for(let n=0;n<12;n++){let r=s.pieces[n];for(;r;)r&=r-1n,n%6==4?e++:n%6!=5&&n%6!=0&&t++}return e===0||e===2&&t<=2}function se(e,t,n,r){let i=t&7,a=n?t>>3:7-(t>>3),o=3.5-Math.abs(i-3.5),s=3.5-Math.abs(a-3.5);return e===0?(a-1)*12+Math.max(0,o)*4:e===1?(o+s)*6-12:e===2?(o+s)*4:e===3?(o+s)*2+(a===6?12:0):e===4?(o+s)*2:r?(o+s)*10:-a*10+o*2}function j(){let e=oe(),t=0;for(let n=0;n<12;n++){let i=n<6,a=n%6,o=s.pieces[n];for(;o;){let n=o&-o,s=l(n),c=r[a]+se(a,s,i,e);t+=i?c:-c,o^=n}}return s.turn===`white`?t:-t}let ce=65536,le=Array(ce).fill(-1n),ue=Array(ce).fill(-1),de=Array(ce).fill(0),fe=Array(ce).fill(0),pe=Array(ce).fill(0);function me(e){let t=e.promotion===`queen`?1:e.promotion===`rook`?2:e.promotion===`bishop`?3:e.promotion===`knight`?4:0;return e.from|e.to<<6|t<<12}function he(e,t,n,r){let i=Number(b&BigInt(65535));if(le[i]!==b)return{score:null,move:0};let a=pe[i];if(ue[i]<e)return{score:null,move:a};let o=de[i];o>99e3?o-=r:o<-99e3&&(o+=r);let s=fe[i];return s===0||s===1&&o>=n||s===2&&o<=t?{score:o,move:a}:{score:null,move:a}}function ge(e,t,n,r,i){let a=Number(b&BigInt(65535));if(le[a]===b&&ue[a]>e)return;let o=t;t>99e3?o+=i:t<-99e3&&(o-=i),le[a]=b,ue[a]=e,de[a]=o,fe[a]=n,pe[a]=r}let _e=Array.from({length:64},()=>[0,0]),ve=Array.from({length:2},()=>Array.from({length:64},()=>Array(64).fill(0)));function M(e){let t=s.turn===`white`?6:0,n=c(e);for(let e=4;e>=0;e--)if(s.pieces[t+e]&n)return e;return-1}function N(e,t,n){let i=s.turn===`white`?0:1,a=e.map(e=>{let a=me(e);if(a===t)return 3e6;let o=M(e.to),c=v(e.from),l=e.to===s.enPassant&&c===0;if(o!==-1||l){let t=2e6+(l?r[0]:r[o])*8-c;return e.promotion&&(t+=900),t}return e.promotion?15e5:n<64?_e[n][0]===a?1e6:_e[n][1]===a?9e5:ve[i][e.from][e.to]:0}),o=e.map((e,t)=>t);for(let e=0;e<o.length;e++){let t=e;for(let n=e+1;n<o.length;n++)a[o[n]]>a[o[t]]&&(t=n);[o[e],o[t]]=[o[t],o[e]]}return o}let ye=0,be=!1,P=[];function xe(){return be?!0:ye>a||t.signal?.aborted||o!==-1&&!(ye&2047)&&Date.now()>=o?(be=!0,!0):!1}function Se(e,t,n){if(ye++,xe())return 0;let i=s.turn===`white`;if(s.halfmove>=100||ae())return 0;if(y(s.kings[+!i],!i))return F(1,e,t,n,!1);let a=j();if(a>=t)return t;a>e&&(e=a);let o=re().filter(e=>{if(e.promotion||e.to===s.enPassant&&v(e.from)===0)return!0;let t=i?6:0,n=c(e.to);for(let e=0;e<5;e++)if(s.pieces[t+e]&n)return!0;return!1}),l=N(o,0,Math.min(n,63));for(let i of l){let s=o[i],c=M(s.to);if(a+(c===-1?900:r[c])+200<e)continue;let l=D(s);P.push(b);let u=-Se(-t,-e,n+1);if(P.pop(),O(s,l),be)return 0;if(u>=t)return t;u>e&&(e=u)}return e}function F(e,t,n,r,i){if(ye++,xe())return 0;let a=s.turn===`white`;if(s.halfmove>=100||ae())return 0;let o=0;for(let e of P)if(e===b&&++o>=2)return 0;if(r>=64)return j();if(e<=0)return Se(t,n,r);let c=y(s.kings[+!a],!a),l=he(e,t,n,r);if(l.score!==null)return l.score;if(c)i=!1;else if(i&&e>=3&&ie(a)&&n<99e3){let t=e>4?3:2,i=ne();P.push(b);let a=-F(e-1-t,-n,-n+1,r+1,!1);if(P.pop(),k(i),be)return 0;if(a>=n)return n}let u=re();if(u.length===0)return c?-(1e5-r):0;let d=N(u,l.move,Math.min(r,63)),f=+!a,p=-1e6,m=0,h=2;for(let i=0;i<d.length;i++){let a=u[d[i]],o=me(a),l=M(a.to)!==-1||a.to===s.enPassant&&v(a.from)===0,g=D(a);P.push(b);let _;if(i===0)_=-F(e-1,-n,-t,r+1,!0);else{let o=0;e>=3&&i>=4&&!l&&!a.promotion&&!c&&(o=1),o>0?(_=-F(e-1-o,-t-1,-t,r+1,!0),!be&&_>t&&(_=-F(e-1,-n,-t,r+1,!0))):(_=-F(e-1,-t-1,-t,r+1,!0),!be&&_>t&&_<n&&(_=-F(e-1,-n,-t,r+1,!0)))}if(P.pop(),O(a,g),be)return 0;if(_>p&&(p=_,m=o),_>t&&(t=_,h=+(_>=n),!l&&!a.promotion&&r<64&&(ve[f][a.from][a.to]+=e*e,_e[r][0]!==o&&(_e[r][1]=_e[r][0],_e[r][0]=o))),t>=n)break}return ge(e,p,h,m,r),p}let Ce=re();if(Ce.length===0){let e=s.turn===`white`;return{move:null,score:y(s.kings[+!e],!e)?-1e5:0,nodes:ye,depth:0}}P.push(b);let we={from:Ce[0].from,to:Ce[0].to,...Ce[0].promotion?{promotion:Ce[0].promotion}:{}},Te=-1e6,Ee=0,De=Ce.map(e=>({...e}));for(let e=1;e<=i;e++){let t=-1e6,r=n,i=!1,a=we,o=Te;e>=4&&Ee>0&&(i=!0,t=Te-24,r=Te+24);for(let s=0;s<3;s++){let s=t,c=r,l=a,u=-1e6,d=N(De,me({from:a.from,to:a.to,promotion:a.promotion}),0),f=[];for(let n=0;n<d.length;n++){let i=De[d[n]],a=D(i);P.push(b);let o;if(n===0?o=-F(e-1,-r,-t,1,!0):(o=-F(e-1,-t-1,-t,1,!0),!be&&o>t&&o<r&&(o=-F(e-1,-r,-t,1,!0))),P.pop(),O(i,a),be)break;f.push(i),o>u&&(u=o,l=i),o>t&&(t=o)}if(be)break;for(let e of De)f.includes(e)||f.push(e);if(De=f,a=l,o=u,!i)break;if(u<=s||u>=c)t=-1e6,r=n,i=!1;else break}if(be||(we=a,Te=o,De=[we,...De.filter(e=>e!==we)],Ee=e,Te>99e3||Te<-99e3)||xe())break}return P.pop(),Ee===0?{move:null,score:j(),nodes:ye,depth:0}:{move:we,score:Te,nodes:ye,depth:Ee}}function $G(e){let t=`pieces`in e?e:GG(e);return{pieces:t.pieces.slice(),turn:t.turn,castling:t.castling,enPassant:t.enPassant,halfmove:t.halfmove,kings:[t.kings[0],t.kings[1]]}}function eK(e,t={}){return QG($G(e),{depth:t.depth,maxNodes:t.maxNodes,timeMs:t.timeMs,signal:t.signal})}function tK(){let e=globalThis,t=e.navigator?.hardwareConcurrency;if(typeof t==`number`&&Number.isInteger(t)&&t>0)return Math.min(t,8);try{let t=e.process?.getBuiltinModule?.(`node:os`)?.availableParallelism?.();if(typeof t==`number`&&Number.isInteger(t)&&t>0)return Math.min(t,8)}catch{}return 4}async function nK(e,t={}){let n=Math.max(1,Math.floor(t.depth??3)),r=t.maxNodes===void 0?5e5:Math.max(1,Math.floor(t.maxNodes)),i=t.jobs??tK();if(!Number.isInteger(i)||i<1)throw RangeError(`jobs must be a positive integer`);if(t.signal?.aborted)throw t.signal.reason;let a=$G(e),o=qG(a);if(!o.length)return{...QG(a,{depth:n,maxNodes:r}),rootScores:[]};let s=Math.max(1,Math.min(i,o.length)),c=o.map(e=>{let t=$G(a);return YG(t,e),t}),l=Array(o.length),u=0,d=0,f=t.signal?{signal:t.signal}:{};await Promise.all(Array.from({length:s},async()=>{for(;;){let e=d++;if(e>=o.length)return;let i=await mG(QG,[c[e],{depth:Math.max(1,n-1),maxNodes:r,timeMs:t.timeMs}],f);u+=i.nodes,l[e]=-i.score}}));let p=0;for(let e=1;e<o.length;e++)(l[e]??-1/0)>(l[p]??-1/0)&&(p=e);let m=o[p];return{move:{from:m.from,to:m.to,...m.promotion?{promotion:m.promotion}:{}},score:l[p]??0,nodes:u,depth:n,rootScores:o.map((e,t)=>({move:{from:e.from,to:e.to,...e.promotion?{promotion:e.promotion}:{}},score:l[t]??0}))}}var rK={queen:`Q`,rook:`R`,bishop:`B`,knight:`N`},iK={Q:`queen`,R:`rook`,B:`bishop`,N:`knight`},aK={pawn:0,knight:1,bishop:2,rook:3,queen:4,king:5};function oK(e){let t={queen:0,rook:1,bishop:2,knight:3};return`K${e.slice().sort((e,n)=>t[e]-t[n]).map(e=>rK[e]).join(``)}K`}var sK=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`;function cK(e){let t=``;for(let n=0;n<e.length;n+=3){let r=e[n],i=n+1<e.length?e[n+1]:0,a=n+2<e.length?e[n+2]:0;t+=sK[r>>2]+sK[(r&3)<<4|i>>4],t+=n+1<e.length?sK[(i&15)<<2|a>>6]:`=`,t+=n+2<e.length?sK[a&63]:`=`}return t}function lK(e){if(e.length%4!=0)throw Error(`tablebase data is not base64: length is not a multiple of 4`);let t=Array(e.length);for(let n=0;n<e.length;n++){if(e[n]===`=`){t[n]=-1;continue}let r=sK.indexOf(e[n]);if(r===-1)throw Error(`tablebase data is not base64: ${e[n]}`);t[n]=r}let n=[];for(let e=0;e<t.length;e+=4){let[r,i,a,o]=[t[e],t[e+1],t[e+2],t[e+3]];if(r===-1||i===-1)throw Error(`tablebase data is not base64: padding inside a quantum`);n.push(r<<2|i>>4),a!==-1&&n.push((i&15)<<4|a>>2),o!==-1&&n.push((a&3)<<6|o)}return new Uint8Array(n)}function uK(e){let t=Array(256).fill(0);for(let n of e)t[n]++;let n=t.map((e,t)=>({count:e,symbol:t})).filter(e=>e.count>0),r=[1,n.length];if(n.length===0)return cK(new Uint8Array([1,0,0,0,0,0]));if(n.length===1){r.push(n[0].symbol,0);let t=new Uint8Array(r.length+4);return t.set(r,0),t[r.length]=e.length&255,t[r.length+1]=e.length>>8&255,t[r.length+2]=e.length>>16&255,t[r.length+3]=e.length>>24&255,cK(t)}let i=dK(n.map(e=>e.count)),a=n.map((e,t)=>({symbol:e.symbol,length:i[t]})).sort((e,t)=>e.symbol-t.symbol);for(let e of a)r.push(e.symbol);for(let e of a)r.push(e.length);let o=fK(a),s=new Map;for(let e=0;e<a.length;e++)s.set(a[e].symbol,o[e]);let c=0;for(let e of n)c+=e.count*s.get(e.symbol).length;let l=new Uint8Array(r.length+4+Math.ceil(c/8));l.set(r,0),l[r.length]=e.length&255,l[r.length+1]=e.length>>8&255,l[r.length+2]=e.length>>16&255,l[r.length+3]=e.length>>24&255;let u=0,d=r.length+4;for(let t of e){let e=s.get(t);for(let t=e.length-1;t>=0;t--)e.code>>t&1&&(l[d+(u>>3)]|=1<<7-(u&7)),u++}return cK(l)}function dK(e){let t=e.length;if(t===0)return[];let n=e.slice(),r=Array(t).fill(0),i=e.map((e,t)=>t),a=[];for(;i.length>1;){i.sort((e,t)=>n[e]-n[t]);let e=i.shift(),t=i.shift();a.push([e,t]),n[e]+=n[t],n[t]=-1,i.push(e)}for(let e=a.length-1;e>=0;e--){let[t,n]=a[e];r[n]=r[t]+1,r[t]++}if(r.some(e=>e>32))throw Error(`tablebase Huffman code too deep`);return r}function fK(e){let t=e.slice().sort((e,t)=>e.length-t.length||e.symbol-t.symbol),n=0,r=t[0].length,i=new Map;for(let e of t)n<<=e.length-r,i.set(e.symbol,{code:n,length:e.length}),n++,r=e.length;return e.map(e=>i.get(e.symbol))}function pK(e){let t=lK(e);if(t.length<2)throw Error(`tablebase data holds no header`);if(t[0]!==1)throw Error(`tablebase data version ${t[0]} is not 1`);let n=t[1];if(2+2*n>t.length)throw Error(`tablebase data ends inside its header`);let r=[],i=[];for(let e=0;e<n;e++)r.push(t[2+e]);for(let e=0;e<n;e++)i.push(t[2+n+e]);let a=2+2*n;if(n===0){if(a+4!==t.length)throw Error(`tablebase data trails its empty header`);return new Uint8Array}if(n===1){if(a+4!==t.length)throw Error(`tablebase data trails its single-symbol header`);let e=t[a]|t[a+1]<<8|t[a+2]<<16|t[a+3]<<24;return new Uint8Array(e).fill(r[0])}if(a+4>t.length)throw Error(`tablebase data ends before its count`);let o=t[a]|t[a+1]<<8|t[a+2]<<16|t[a+3]<<24,s=r.map((e,t)=>({symbol:e,length:i[t]})),c=fK(s),l={};for(let e=0;e<s.length;e++){let t=l;for(let n=c[e].length-1;n>=0;n--){let r=c[e].code>>n&1;n===0?r?t.one={symbol:s[e].symbol}:t.zero={symbol:s[e].symbol}:(r?t.one=t.one??{}:t.zero=t.zero??{},t=r?t.one:t.zero)}}let u=new Uint8Array(o),d=0,f=0,p=a+4,m=(t.length-p)*8;for(;d<o;){if(f>=m)throw Error(`tablebase data ends before its count`);let e=l;for(;;){let n=t[p+(f>>3)]>>7-(f&7)&1;if(f++,e=n?e.one:e.zero,!e)throw Error(`tablebase data walks off its Huffman tree`);if(e.symbol!==void 0)break}u[d++]=e.symbol}for(;f<m;f++)if(t[p+(f>>3)]>>7-(f&7)&1)throw Error(`tablebase data does not end in zero padding`);return u}function mK(e){let t=pK(e);if(t.length%2!=0)throw Error(`tablebase distances are not byte pairs`);let n=new Uint16Array(t.length/2);for(let e=0;e<n.length;e++)n[e]=t[2*e]|t[2*e+1]<<8;return n}function hK(e){if(e.version!==1)throw Error(`${e.id}: unknown tablebase version ${String(e.version)}`);if(e.id!==oK(e.white))throw Error(`${e.id}: id does not match its extras`);for(let t of e.white)if(!iK[rK[t]])throw Error(`${e.id}: not a tablebase piece: ${String(t)}`);let t=2+e.white.length,n=1;for(let e=0;e<t;e++)n*=64;if(n*=2,e.positions!==n)throw Error(`${e.id}: claims ${e.positions} positions, holds ${n}`);let r=pK(e.wdl);if(r.length!==n)throw Error(`${e.id}: WDL decodes to ${r.length} positions, needs ${n}`);let i=mK(e.dtm);if(i.length!==n)throw Error(`${e.id}: distances decode to ${i.length} positions, need ${n}`);let a={queen:0,rook:1,bishop:2,knight:3};return{id:e.id,extras:e.white.slice().sort((e,t)=>a[e]-a[t]).map(e=>aK[e]),positions:n,wdl:r,dtm:i}}function gK(e){if(`pieces`in e){let t=[];for(let n=0;n<12;n++){let r=e.pieces[n];for(;r;){let e=r&-r;t.push({kind:n%6,side:n<6?`white`:`black`,square:Math.log2(Number(e))}),r^=e}}return t}let t=[];return e.board.forEach((e,n)=>{e&&t.push({kind:aK[e.kind],side:e.side,square:n})}),t}function _K(e){if(`pieces`in e)return e.castling!==0;let t=e.castling;return t.whiteKingside||t.whiteQueenside||t.blackKingside||t.blackQueenside}function vK(e,t,n=0){if(!Number.isInteger(n)||n<0)throw RangeError(`halfmove must be a non-negative integer`);let r=gK(t),i=r.filter(e=>e.kind===5&&e.side===`white`),a=r.filter(e=>e.kind===5&&e.side===`black`);if(i.length!==1||a.length!==1||r.some(e=>e.kind===0)||r.some(e=>e.kind!==5&&e.side===`black`)||_K(t))return null;let o=r.filter(e=>e.kind!==5).sort((e,t)=>t.kind-e.kind).map(e=>e.kind);if(!o.length)return null;let s={4:`Q`,3:`R`,2:`B`,1:`N`},c=e[`K${o.map(e=>s[e]).join(``)}K`];if(!c)return null;let l=r.find(e=>e.kind===5&&e.side===`white`).square,u=r.find(e=>e.kind===5&&e.side===`black`).square,d=o.map((e,t)=>r.filter(t=>t.kind===e&&t.side===`white`).map(e=>e.square).sort((e,t)=>e-t)[yK(o,e,t)]),f=l;for(let e of d)f=f*64+e;f=f*64+u,f=f*2+ +(t.turn===`black`);let p=c.wdl[f];if(p===0)return null;let m=c.dtm[f],h=p===3?`win`:p===1?`loss`:`draw`;return h!==`draw`&&m>100-n&&(h=`draw`),{outcome:h,dtm:m}}function yK(e,t,n){let r=0;for(let i=0;i<n;i++)e[i]===t&&r++;return r}_e();var bK=class{constructor(e,t,n){if(this.width=e,this.height=t,e<1||t<1)throw Error(`a board needs positive dimensions`);if(n&&n.length!==e*t)throw Error(`board cell count does not match dimensions`);this.cells=n?[...n]:Array(e*t).fill(null)}index(e,t){if(!this.inside(e,t))throw Error(`cell (${e},${t}) is outside the board`);return nr(this.width,e,t)}inside(e,t){return tr(this.width,this.height,e,t)}get(e,t){return this.cells[this.index(e,t)]}set(e,t,n){this.cells[this.index(e,t)]=n}move(e,t){let n=this.get(e.x,e.y);if(n===null)throw Error(`cannot move an empty cell`);return this.set(e.x,e.y,null),this.set(t.x,t.y,n),n}};function xK(){let e=Array(64).fill(null);for(let t=0;t<3;t++)for(let n=0;n<8;n++)(n+t)%2&&(e[t*8+n]={side:`black`,king:!1});for(let t=5;t<8;t++)for(let n=0;n<8;n++)(n+t)%2&&(e[t*8+n]={side:`red`,king:!1});return{board:e,turn:`red`,forcedFrom:null}}function SK(e){let t=e.forcedFrom===null?e.board.map((t,n)=>t?.side===e.turn?n:-1).filter(e=>e>=0):[e.forcedFrom],n=t.flatMap(t=>wK(e,t,!0));return n.length>0?n:e.forcedFrom===null?t.flatMap(t=>wK(e,t,!1)):[]}function CK(e,t){if(!SK(e).some(e=>e.from===t.from&&e.to===t.to&&e.captures.length===t.captures.length))throw Error(`illegal checkers move`);let n=e.board[t.from];if(!n)throw Error(`no checkers piece on the source cell`);e.board[t.from]=null;for(let n of t.captures)e.board[n]=null;let r=!n.king&&(n.side===`red`&&Math.floor(t.to/8)===0||n.side===`black`&&Math.floor(t.to/8)===7);e.board[t.to]={...n,king:n.king||r};let i={board:e.board,turn:e.turn,forcedFrom:t.captures.length>0?t.to:null};t.captures.length===0||wK(i,t.to,!0).length===0?(e.turn=e.turn===`red`?`black`:`red`,e.forcedFrom=null):e.forcedFrom=t.to}function wK(e,t,n){let r=e.board[t];if(!r)return[];let i=t%8,a=Math.floor(t/8),o=r.king?[-1,1]:r.side===`red`?[-1]:[1],s=[];for(let c of o)for(let o of[-1,1]){let l=i+o,u=a+c,d=i+o*2,f=a+c*2;if(n){if(d<0||f<0||d>=8||f>=8)continue;let n=u*8+l,i=f*8+d;e.board[n]?.side!==r.side&&e.board[n]&&!e.board[i]&&s.push({from:t,to:i,captures:[n]})}else l>=0&&u>=0&&l<8&&u<8&&!e.board[u*8+l]&&s.push({from:t,to:u*8+l,captures:[]})}return s}function TK(e=9){if(e<2||e>25)throw Error(`Go size must be between 2 and 25`);return{size:e,board:Array(e*e).fill(null),turn:`black`,ko:null,passes:0}}function EK(e,t,n){let r=AK(e,t,n);if(e.board[r]||e.ko===r)throw Error(`Go cell is occupied or forbidden by ko`);let i=[...e.board];i[r]=e.turn;let a=e.turn===`black`?`white`:`black`,o=0,s=null;for(let t of jK(e.size,r)){if(i[t]!==a||NK(i,e.size,t)!==0)continue;let n=MK(i,e.size,t);n.length===1&&(s=n[0]);for(let e of n)i[e]=null;o+=n.length}if(NK(i,e.size,r)===0)throw Error(`suicide is not a legal Go move`);e.ko=o===1&&NK(i,e.size,r)===1?s:null,e.board=i,e.turn=a,e.passes=0}function DK(e){e.turn=e.turn===`black`?`white`:`black`,e.ko=null,e.passes++}function OK(e){return e.passes>=2?`finished`:`ongoing`}function kK(e){let t={black:0,white:0},n=new Set;for(let r=0;r<e.board.length;r++){let i=e.board[r];if(i)t[i]++;else if(!n.has(r)){let i=MK(e.board,e.size,r),a=new Set;for(let t of i)for(let n of jK(e.size,t))e.board[n]&&a.add(e.board[n]);for(let e of i)n.add(e);a.size===1&&(t[[...a][0]]+=i.length)}}return t}function AK(e,t,n){if(t<0||n<0||t>=e.size||n>=e.size)throw Error(`Go cell is outside the board`);return n*e.size+t}function jK(e,t){let n=t%e,r=Math.floor(t/e),i=[];return n>0&&i.push(t-1),n<e-1&&i.push(t+1),r>0&&i.push(t-e),r<e-1&&i.push(t+e),i}function MK(e,t,n){let r=e[n],i=[],a=[n],o=new Set;for(;a.length;){let n=a.pop();if(!(o.has(n)||e[n]!==r)){o.add(n),i.push(n);for(let e of jK(t,n))a.push(e)}}return i}function NK(e,t,n){let r=MK(e,t,n),i=new Set;for(let n of r)for(let r of jK(t,n))e[r]===null&&i.add(r);return i.size}function PK(){let e=Array(24).fill(0);return e[0]=2,e[11]=5,e[16]=3,e[18]=5,e[23]=-2,e[12]=-5,e[7]=-3,e[5]=-5,{points:e,bar:{white:0,black:0},off:{white:0,black:0},turn:`white`}}function FK(){let e=YK(2,6);return e[0]===e[1]?[...e,...e]:e}function IK(e,t){let n=e.turn===`white`?1:-1,r=n===1?[18,23]:[0,5],i=e=>n===1?24-e:e+1,a=!0,o=1/0;for(let t=0;t<24;t++)e.points[t]*n<=0||((t<r[0]||t>r[1])&&(a=!1),o=Math.min(o,i(t)));let s=(e,t)=>{if(!a)return!1;let n=i(e);return t===n||t>n&&n===o},c=[];for(let r of t)if(e.bar[e.turn]>0){let t=e.turn===`white`?r-1:24-r;RK(e,t,n)&&c.push({from:`bar`,to:t,die:r})}else for(let t=0;t<24;t++)if(e.points[t]*n>0){let i=t+r*n;i<0||i>=24?s(t,r)&&c.push({from:t,to:`off`,die:r}):RK(e,i,n)&&c.push({from:t,to:i,die:r})}return c}function LK(e,t){if(!IK(e,[t.die]).some(e=>e.from===t.from&&e.to===t.to))throw Error(`illegal backgammon move`);let n=e.turn===`white`?1:-1;if(t.from===`bar`?e.bar[e.turn]--:e.points[t.from]-=n,t.to===`off`)e.off[e.turn]++;else{if(e.points[t.to]*n<0){let n=e.turn===`white`?`black`:`white`;e.points[t.to]=0,e.bar[n]++}e.points[t.to]+=n}}function RK(e,t,n){return e.points[t]*n>=-1}function zK(e=0){let t=[`clubs`,`diamonds`,`hearts`,`spades`],n=[];for(let e of t)for(let t=1;t<=13;t++)n.push({suit:e,rank:t});return n.concat(Array(e).fill(null).map(()=>({suit:`spades`,rank:1})))}function BK(e){return oe(e)}function VK(e,t,n){if(t<0||n<0||e.length<t*n)throw Error(`not enough cards to deal`);return Array.from({length:t},()=>e.splice(0,n))}function HK(e,t){if(e.length===0)throw Error(`a trick needs at least one play`);let n=e[0].card.suit,r=e=>e.rank===1?14:e.rank;return(t&&e.some(e=>e.card.suit===t)?e.filter(e=>e.card.suit===t):e.filter(e=>e.card.suit===n)).reduce((e,t)=>r(t.card)>r(e.card)?t:e).owner}function UK(e){let t=zK();return e===void 0?BK(t):E(e,()=>BK(t)),{stock:t,waste:[],tableau:Array.from({length:7},(e,n)=>({down:t.splice(0,6-n),up:t.splice(0,1)})),foundations:[[],[],[],[]]}}function WK(e){e.stock.length===0&&(e.stock=e.waste.reverse(),e.waste=[]);let t=e.stock.pop()??null;return t&&e.waste.push(t),t}function GK(e,t,n,r=1){let i=e.tableau[t],a=e.tableau[n],o=i?.up.slice(-r);if(!i||!a||!o?.length||(a.up.length===0?o[0].rank!==13:!JK(o[0],a.up.at(-1))))throw Error(`illegal solitaire tableau move`);i.up.splice(-r,r),a.up.push(...o),i.down.length&&i.up.length===0&&i.up.push(i.down.pop())}function KK(e,t){let n=t===`waste`?e.waste.at(-1):e.tableau[t].up.at(-1);if(!n)throw Error(`no solitaire card to move`);let r=e.foundations.find(e=>e[0]?.suit===n.suit||e.length===0);if(!r||n.rank!==r.length+1)throw Error(`card cannot move to its foundation`);if(t===`waste`)e.waste.pop();else{let n=e.tableau[t];n.up.pop(),n.down.length&&n.up.length===0&&n.up.push(n.down.pop())}r.push(n)}function qK(e){return e.foundations.every(e=>e.length===13)}function JK(e,t){let n=e.suit===`diamonds`||e.suit===`hearts`,r=t.suit===`diamonds`||t.suit===`hearts`;return e.rank===t.rank-1&&n!==r}function YK(e,t){if(!Number.isInteger(e)||e<0||!Number.isInteger(t)||t<1)throw Error(`dice need a non-negative count and positive sides`);return Array.from({length:e},()=>ne(1,t))}function XK(e){let t=/^(\d+)d(\d+)([+-]\d+)?$/i.exec(e.trim());if(!t)throw Error(`bad dice expression: "${e}"`);return YK(Number(t[1]),Number(t[2])).reduce((e,t)=>e+t,Number(t[3]??0))}var ZK=class{constructor(e,t){this.kept=new Set,this.count=e,this.sides=t,this.values=YK(e,t)}reRoll(){for(let e=0;e<this.values.length;e++)this.kept.has(e)||(this.values[e]=ne(1,this.sides))}keep(e){if(e<0||e>=this.count)throw Error(`die index is outside the cup`);this.kept.add(e)}clearKept(){this.kept.clear()}};function QK(e,t){if(e.length!==5||e.some(e=>e<1||e>6))throw Error(`a score sheet needs five d6 values`);let n=new Map;for(let t of e)n.set(t,(n.get(t)??0)+1);let r=e.reduce((e,t)=>e+t,0);if(t===`chance`)return r;if(t===`yahtzee`)return n.size===1?50:0;if(t===`fullHouse`)return[...n.values()].sort().join(`,`)===`2,3`?25:0;if(t===`threeKind`)return[...n.values()].some(e=>e>=3)?r:0;if(t===`fourKind`)return[...n.values()].some(e=>e>=4)?r:0;if(t===`smallStraight`||t===`largeStraight`){let e=[`1234`,`2345`,`3456`],r=[`12345`,`23456`],i=[...n.keys()].sort().join(``);return(t===`smallStraight`?e:r).some(e=>i.includes(e))?t===`smallStraight`?30:40:0}let i=[`ones`,`twos`,`threes`,`fours`,`fives`,`sixes`].indexOf(t)+1;return i>0?(n.get(i)??0)*i:0}function $K(e,t,n=`hex`){if(e<1||t<1)throw Error(`a tactical map needs positive dimensions`);return{width:e,height:t,shape:n,cells:Array.from({length:e*t},()=>({passable:!0,cover:0})),units:[],turn:``,round:1}}function eq(e,t,n){return uq(e,t,n)&&!lq(e,t,n)}function tq(e,t){if(!eq(e,t.x,t.y))throw Error(`tactical unit cannot be placed there`);e.units.push({...t,maxActions:t.maxActions??t.actions}),e.turn||=t.owner}function nq(e,t){let n=cq(e,t);if(n.owner!==e.turn||n.actions<=0)return[];let r=mq(e,n,pq(e,n)),i=[];for(let a=0;a<e.height;a++)for(let o=0;o<e.width;o++){if(o===n.x&&a===n.y||!e.cells[a*e.width+o].passable||lq(e,o,a))continue;let s=hq(e,n,o,a,n.actions,r);s!==null&&i.push({unit:t,x:o,y:a,cost:s})}return i}function rq(e,t){let n=nq(e,t.unit).find(e=>e.x===t.x&&e.y===t.y);if(!n)throw Error(`illegal tactical move`);let r=cq(e,t.unit);r.x=t.x,r.y=t.y,r.actions-=n.cost}function iq(e,t){let n=cq(e,t);if(n.owner!==e.turn||n.actions<=0)throw Error(`only an active unit can enter overwatch`);n.actions=0,n.overwatch=!0}function aq(e,t,n){let r=cq(e,t),i=[];for(let t of[...e.units]){if(!t.overwatch||t.owner===r.owner||fq(e,t,r)>3)continue;let a=e.cells[r.y*e.width+r.x].cover??0,o=Math.max(0,n-a);if(r.hp=Math.max(0,r.hp-o),t.overwatch=!1,i.push({attacker:t.id,defender:r.id,damage:o,cover:a,killed:r.hp===0}),r.hp===0){e.units=e.units.filter(e=>e!==r);break}}return i}function oq(e,t,n,r){let i=cq(e,t),a=cq(e,n);if(i.owner!==e.turn||i.owner===a.owner)throw Error(`invalid tactical attack`);if(fq(e,i,a)>3)throw Error(`tactical target is out of range`);let o=e.cells[a.y*e.width+a.x].cover??0,s=Math.max(0,r-o);a.hp=Math.max(0,a.hp-s);let c=a.hp===0;return c&&(e.units=e.units.filter(e=>e!==a)),{attacker:t,defender:n,damage:s,cover:o,killed:c}}function sq(e){let t=[...new Set(e.units.map(e=>e.owner))];if(t.length===0)return;let n=t.indexOf(e.turn)+1;n>=t.length&&e.round++,e.turn=t[n%t.length];for(let t of e.units)t.owner===e.turn&&(t.actions=t.maxActions??t.actions,t.overwatch=!1)}function cq(e,t){let n=e.units.find(e=>e.id===t);if(!n)throw Error(`unknown tactical unit "${t}"`);return n}function lq(e,t,n){return e.units.some(e=>e.x===t&&e.y===n)}function uq(e,t,n){return t>=0&&n>=0&&t<e.width&&n<e.height}function dq(e,t,n){return e.shape===`hex`?Jn(t,n):[{x:t-1,y:n},{x:t+1,y:n},{x:t,y:n-1},{x:t,y:n+1}]}function fq(e,t,n){return e.shape===`hex`?Yn(t,n):Math.abs(t.x-n.x)+Math.abs(t.y-n.y)}function pq(e,t){return new Set(e.units.filter(n=>n.owner!==t.owner&&dq(e,t.x,t.y).some(e=>e.x===n.x&&e.y===n.y)).map(e=>e.id))}function mq(e,t,n){let r=new Set;for(let i of e.units)if(!(i.owner===t.owner||n.has(i.id)))for(let t of dq(e,i.x,i.y))r.add(`${t.x},${t.y}`);return r}function hq(e,t,n,r,i,a){let o=[{x:t.x,y:t.y,distance:0}],s=0,c=new Set([`${t.x},${t.y}`]);for(;s<o.length;){let t=o[s++];if(t.x===n&&t.y===r)return t.distance;if(!(t.distance>=i||t.distance>0&&a.has(`${t.x},${t.y}`)))for(let i of dq(e,t.x,t.y)){let a=`${i.x},${i.y}`;uq(e,i.x,i.y)&&!c.has(a)&&e.cells[i.y*e.width+i.x].passable&&(!lq(e,i.x,i.y)||i.x===n&&i.y===r)&&(c.add(a),o.push({x:i.x,y:i.y,distance:t.distance+1}))}}return null}var gq=class{constructor(e,t){if(this.visible=new Map,this.explored=new Map,this.shared=new Map,e<1||t<1)throw Error(`fog needs positive dimensions`);this.width=e,this.height=t}share(e){let t=[...new Set(e)].filter(e=>!!e);if(t.length===0)return;let n=new Set(t);for(let e of t)for(let t of this.shared.get(e)??[])n.add(t);for(let e of n)this.shared.set(e,n)}sync(e,t,n){if(!e)throw Error(`fog needs a faction id`);let r=new Set;for(let e of t)for(let t of n(e))this.inside(t.x,t.y)&&r.add(this.index(t.x,t.y));this.visible.set(e,r);let i=this.explored.get(e)??new Set;for(let e of r)i.add(e);this.explored.set(e,i)}reveal(e,t){if(!e)throw Error(`fog needs a faction id`);let n=this.explored.get(e)??new Set;for(let e of t)this.inside(e.x,e.y)&&n.add(this.index(e.x,e.y));this.explored.set(e,n)}isVisible(e,t,n){return this.seenBy(this.visible,e,this.index(t,n))}sees(e){return(t,n)=>this.isVisible(e,t,n)}isExplored(e,t,n){return this.seenBy(this.explored,e,this.index(t,n))}visibleCells(e){return this.cellsSeenBy(this.visible,e)}exploredCells(e){return this.cellsSeenBy(this.explored,e)}seenBy(e,t,n){let r=this.shared.get(t);if(!r)return e.get(t)?.has(n)??!1;for(let t of r)if(e.get(t)?.has(n))return!0;return!1}cellsSeenBy(e,t){let n=this.shared.get(t);if(!n)return[...e.get(t)??[]];let r=new Set;for(let t of n)for(let n of e.get(t)??[])r.add(n);return[...r].sort((e,t)=>e-t)}inside(e,t){return tr(this.width,this.height,e,t)}index(e,t){return this.inside(e,t)?nr(this.width,e,t):-1}};function _q(e){return{currency:e,pool:[]}}function vq(e,t,n,r){return e.currency<r||!eq(t,n.x,n.y)?!1:(tq(t,n),e.currency-=r,!0)}function yq(e,t,n,r,i){let a=e.pool.findIndex(e=>e.id===n);return a===-1||!eq(t,r,i)?!1:(tq(t,{...e.pool[a],x:r,y:i}),e.pool.splice(a,1),!0)}function bq(e,t,n){let r=t.units.findIndex(e=>e.id===n);if(r===-1)return!1;let{x:i,y:a,...o}=t.units[r];return e.pool.push(o),t.units.splice(r,1),!0}function xq(e,t,n){return e.units.filter(e=>e.owner===t).length*(n.incomePerUnit-n.upkeepPerUnit)}function Sq(e,t,n,r){return e.currency+=xq(t,n,r),e.currency}_e();function Cq(e,t,n,r){if(e<1||t<1)throw Error(`a skirmish map needs positive dimensions`);let i=r??Object.keys(n)[0];if(!i||!n[i])throw Error(`a skirmish map needs at least one terrain kind`);return{width:e,height:t,terrainTable:n,cells:Array.from({length:e*t},()=>({terrain:i})),units:[],turn:``,round:1}}function wq(e,t,n,r,i=!1){if(!Pq(e,t,n))throw Error(`cell is outside the skirmish map`);if(!e.terrainTable[r])throw Error(`unknown skirmish terrain "${r}"`);e.cells[n*e.width+t]=i?{terrain:r,village:!0}:{terrain:r}}function Tq(e,t,n){return Pq(e,t,n)&&Lq(e,t,n)<1/0&&!Fq(e,t,n)}function Eq(e,t){if(!Tq(e,t.x,t.y))throw Error(`skirmish unit cannot be placed there`);e.units.push({...t,remainingMoves:t.moves}),e.turn||=t.owner}function Dq(e,t){let n=Nq(e,t),r=n.remainingMoves??n.moves;if(n.owner!==e.turn||r<=0)return[];let i=new Set(e.units.filter(e=>e.id!==n.id).map(e=>`${e.x},${e.y}`)),a=Rq(e,n,r,i),o=[];for(let s=0;s<e.height;s++)for(let c=0;c<e.width;c++){if(c===n.x&&s===n.y||Lq(e,c,s)===1/0||i.has(`${c},${s}`))continue;let l=a.get(`${c},${s}`);l!==void 0&&l<=r&&o.push({unit:t,x:c,y:s,cost:l})}return o}function Oq(e,t){let n=Dq(e,t.unit).find(e=>e.x===t.x&&e.y===t.y);if(!n)throw Error(`illegal skirmish move`);let r=Nq(e,t.unit);r.x=t.x,r.y=t.y,r.remainingMoves=(r.remainingMoves??r.moves)-n.cost;let i=e.cells[t.y*e.width+t.x];i.village&&(i.owner=r.owner)}function kq(e,t,n){let r=Nq(e,t),i=Nq(e,n);if(r.owner!==e.turn||r.owner===i.owner)throw Error(`invalid skirmish attack`);if(Yn(r,i)!==1)throw Error(`skirmish combat is adjacency-only`);let a=[Aq(e,r,i)];return i.hp>0&&a.push(Aq(e,i,r)),e.units=e.units.filter(e=>e.hp>0),{strikes:a}}function Aq(e,t,n){let r=Iq(e,n.x,n.y).defense,i=A(Math.max(0,Math.min(1,t.hitChance*(1-r)))),a=i?Math.min(t.attack,n.hp):0;return n.hp-=a,{attacker:t.id,defender:n.id,hit:i,damage:a,killed:n.hp<=0}}function jq(e,t,n,r){return n+e.cells.filter(e=>e.village&&e.owner===t).length*r}function Mq(e,t=0){let n=[...new Set(e.units.map(e=>e.owner))];if(n.length===0)return;let r=n.indexOf(e.turn)+1;r>=n.length&&e.round++,e.turn=n[r%n.length];for(let n of e.units){if(n.owner!==e.turn)continue;n.remainingMoves=n.moves;let r=e.cells[n.y*e.width+n.x];r.village&&r.owner===n.owner&&t>0&&(n.hp=Math.min(n.maxHp,n.hp+t))}}function Nq(e,t){let n=e.units.find(e=>e.id===t);if(!n)throw Error(`unknown skirmish unit "${t}"`);return n}function Pq(e,t,n){return tr(e.width,e.height,t,n)}function Fq(e,t,n){return e.units.some(e=>e.x===t&&e.y===n)}function Iq(e,t,n){return e.terrainTable[e.cells[n*e.width+t].terrain]}function Lq(e,t,n){return Iq(e,t,n).moveCost}function Rq(e,t,n,r){let i=[],a=(e,t)=>{[i[e],i[t]]=[i[t],i[e]]},o=e=>{i.push(e);let t=i.length-1;for(;t>0;){let e=t-1>>1;if(i[e].cost<=i[t].cost)break;a(t,e),t=e}},s=()=>{if(i.length===0)return;let e=i[0],t=i.pop();if(i.length>0){i[0]=t;let e=0;for(;;){let t=e*2+1,n=t+1,r=e;if(t<i.length&&i[t].cost<i[r].cost&&(r=t),n<i.length&&i[n].cost<i[r].cost&&(r=n),r===e)break;a(e,r),e=r}}return e},c=new Map([[`${t.x},${t.y}`,0]]);for(o({x:t.x,y:t.y,cost:0});;){let t=s();if(t===void 0)break;let i=`${t.x},${t.y}`;if(!(t.cost>(c.get(i)??1/0)))for(let i of Jn(t.x,t.y)){if(!Pq(e,i.x,i.y))continue;let a=Lq(e,i.x,i.y);if(a===1/0||r.has(`${i.x},${i.y}`))continue;let s=t.cost+a;if(s>n)continue;let l=`${i.x},${i.y}`;s<(c.get(l)??1/0)&&(c.set(l,s),o({x:i.x,y:i.y,cost:s}))}}return c}var zq=l({BoardGrid:()=>bK,DiceCup:()=>ZK,FactionFog:()=>gq,addSkirmishUnit:()=>Eq,addTacticalUnit:()=>tq,applyBackgammonMove:()=>LK,applyCheckersMove:()=>CK,applyMove:()=>rG,applyUpkeep:()=>Sq,armyIncome:()=>xq,backgammonMoves:()=>IK,bankUnit:()=>bq,bitboardFromChess:()=>GG,bitboardMoves:()=>qG,canPlaceSkirmishUnit:()=>Tq,canPlaceTacticalUnit:()=>eq,checkersMoves:()=>SK,chessGame:()=>SG,chooseMove:()=>_G,cloneChess:()=>GW,createDeck:()=>zK,deal:()=>VK,dealSolitaire:()=>UK,drawSolitaire:()=>WK,endSkirmishTurn:()=>Mq,endTacticalTurn:()=>sq,gameResult:()=>iG,goResult:()=>OK,goScore:()=>kK,huffDecode:()=>pK,huffEncode:()=>uK,inCheck:()=>QW,legalMoves:()=>nG,loadTablebaseEnding:()=>hK,makeMove:()=>YG,moveSkirmishUnit:()=>Oq,moveSolitaireTableau:()=>GK,moveSolitaireToFoundation:()=>KK,moveTacticalUnit:()=>rq,parseFen:()=>zW,parseUciMove:()=>kG,passGo:()=>DK,perft:()=>ZG,playGo:()=>EK,positionKey:()=>RW,probeBook:()=>DG,probeTablebase:()=>vK,recall:()=>yq,recruit:()=>vq,rollBackgammonDice:()=>FK,rollDice:()=>YK,rollExpression:()=>XK,scoreDice:()=>QK,search:()=>vG,searchAsync:()=>yG,searchTourney:()=>eK,searchTourneyAsync:()=>nK,setSkirmishTerrain:()=>wq,setTacticalOverwatch:()=>iq,shuffleDeck:()=>BK,skirmishAttack:()=>kq,skirmishIncome:()=>jq,skirmishMoves:()=>Dq,solitaireWon:()=>qK,sq:()=>IW,squareName:()=>LW,startingArmy:()=>_q,startingBackgammon:()=>PK,startingBitboard:()=>KG,startingCheckers:()=>xK,startingChess:()=>WW,startingGo:()=>TK,startingSkirmish:()=>Cq,startingTactics:()=>$K,tablebaseId:()=>oK,tacticalAttack:()=>oq,tacticalMoves:()=>nq,tourneyThink:()=>QG,trickWinner:()=>HK,triggerTacticalOverwatch:()=>aq,unmakeMove:()=>XG});function Bq(e){let t;try{t=IN(e)}catch(t){return console.warn(`${t.message} - "${e}" will be silent`),Vq()}return new Audio(t)}function Vq(){return{play(){},pause(){},currentTime:0,volume:1,loop:!1}}var Hq=new p,Uq=class{constructor(e,t={}){this.next=0,this.suspended_=!1,this.plays=0;let n=Math.max(1,t.poolSize??4),r=t.create??Bq;this.volume=t.volume??1,this.caption=t.caption,this.pool=Array.from({length:n},()=>r(e))}play(e=1,t=1){if(this.suspended_)return;this.plays++;let n=this.pool[this.next];this.next=(this.next+1)%this.pool.length,n.volume=this.volume*e,n.playbackRate=t,n.currentTime=0,Promise.resolve(n.play()).catch(()=>{}),this.caption&&Hq.dispatch({text:this.caption})}stopAll(){for(let e of this.pool)e.pause(),e.currentTime=0}suspend(){this.suspended_=!0,this.stopAll()}resume(){this.suspended_=!1}get isSuspended(){return this.suspended_}};function Wq(e={}){let t=e.waveform??`square`,n=e.frequency??440,r=e.duration??.15,i=e.volume??.3,a=e.decay??8,o=e.sampleRate??22050,s=e.seed??1;if(!(r>0))throw Error(`tone duration must be positive`);if(t!==`noise`&&!(n>0))throw Error(`tone frequency must be positive`);if(!(o>0))throw Error(`tone sample rate must be positive`);let c=Math.max(1,Math.round(r*o)),l=new Float32Array(c);for(let e=0;e<c;e++){let r=e/o,u=a>0?Math.exp(-a*e/c):1,d=2*Math.PI*n*r;l[e]=i*u*qq(t,d,s,e)}return Yq(l,o)}function Gq(e={},t=e=>new Audio(e)){let n=t(Wq(e));return Promise.resolve(n.play()).catch(()=>{}),n}function Kq(e={},t={}){return new Uq(Wq(e),t)}function qq(e,t,n,r){switch(e){case`sine`:return Math.sin(t);case`square`:return Math.sin(t)>=0?1:-1;case`sawtooth`:{let e=t/(2*Math.PI);return 2*(e-Math.floor(e))-1}case`triangle`:{let e=t/(2*Math.PI),n=e-Math.floor(e);return 4*Math.abs(n-.5)-1}case`noise`:return Jq(n,r)}}function Jq(e,t){let n=Math.imul(e^t,2654435761)>>>0;return n=Math.imul(n^n>>>15,2246822519)>>>0,n=Math.imul(n^n>>>13,3266489917)>>>0,n^=n>>>16,(n>>>0)/4294967295*2-1}function Yq(e,t){let n=e.length*2,r=new ArrayBuffer(44+n),i=new DataView(r);Xq(i,0,`RIFF`),i.setUint32(4,36+n,!0),Xq(i,8,`WAVE`),Xq(i,12,`fmt `),i.setUint32(16,16,!0),i.setUint16(20,1,!0),i.setUint16(22,1,!0),i.setUint32(24,t,!0),i.setUint32(28,t*2,!0),i.setUint16(32,2,!0),i.setUint16(34,16,!0),Xq(i,36,`data`),i.setUint32(40,n,!0);let a=44;for(let t of e){let e=Math.max(-1,Math.min(1,t));i.setInt16(a,Math.round(e*(e<0?32768:32767)),!0),a+=2}let o=``,s=new Uint8Array(r);for(let e of s)o+=String.fromCharCode(e);return`data:audio/wav;base64,${btoa(o)}`}function Xq(e,t,n){for(let r=0;r<n.length;r++)e.setUint8(t+r,n.charCodeAt(r))}function Zq(e,t){let[n,r]=e,i=n*4*eJ[t]/r;if(!Number.isInteger(i)||i<1)throw Error(`a ${t} grid does not cut a ${n}/${r} bar into whole slots (it needs ${i})`);return i}function Qq(e,t){return e/eJ[t]}function $q(e){if(typeof e!=`object`||!e)throw Error(`a groove template must be an object`);let{name:t,timeSignature:n,ppq:r,tempoBpm:i,subdivision:a,offsets:o}=e;if(typeof t!=`string`||t.length===0)throw Error(`a groove template needs a non-empty name`);if(!Array.isArray(n)||n.length!==2)throw Error(`groove template "${t}": timeSignature must be [beats, beatValue]`);let[s,c]=n;if(!Number.isInteger(s)||s<1)throw Error(`groove template "${t}": time signature numerator must be a positive integer, got ${String(s)}`);if(!Number.isInteger(c)||c<1||c&c-1)throw Error(`groove template "${t}": time signature denominator must be a power of two, got ${String(c)}`);if(!Number.isInteger(r)||r<1)throw Error(`groove template "${t}": ppq must be a positive integer, got ${String(r)}`);if(!Number.isFinite(i)||i<=0)throw Error(`groove template "${t}": tempoBpm must be greater than 0, got ${String(i)}`);if(a!==`8n`&&a!==`16n`&&a!==`32n`)throw Error(`groove template "${t}": subdivision must be 8n, 16n or 32n, got ${String(a)}`);let l=Qq(r,a);if(!Number.isInteger(l)||l<1)throw Error(`groove template "${t}": ${r} ppq does not cut into whole ${a} ticks (it needs ${String(l)})`);let u=Zq(n,a);if(!Array.isArray(o)||o.length!==u)throw Error(`groove template "${t}": a ${a} grid in ${s}/${c} has ${u} slots, this carries ${Array.isArray(o)?o.length:String(o)}`);o.forEach((e,n)=>{if(typeof e!=`object`||!e)throw Error(`groove template "${t}": slot ${n} must be an object`);if(e.subdivisionIndex!==n)throw Error(`groove template "${t}": slots must run in order, slot ${n} carries ${String(e.subdivisionIndex)}`);if(!Number.isInteger(e.timeOffsetTicks))throw Error(`groove template "${t}": slot ${n} has a fractional timeOffsetTicks (${String(e.timeOffsetTicks)}); ticks are whole numbers`);if(!Number.isFinite(e.velocityFactor)||e.velocityFactor<0)throw Error(`groove template "${t}": slot ${n} has velocityFactor ${String(e.velocityFactor)}, which must be a finite number of at least 0`)})}var eJ,tJ=s((()=>{eJ={"8n":2,"16n":4,"32n":8}}));function nJ(e){let t=e.intensity;if(!Number.isFinite(t)||t<0||t>1)throw Error(`humanization intensity must be between 0 and 1, got ${String(e.intensity)}`);let n=e.timingVarianceMs??xJ;if(!Number.isFinite(n)||n<0)throw Error(`timingVarianceMs must be a finite number of at least 0, got ${String(e.timingVarianceMs)}`);let r=e.velocityVariance??SJ;if(!Number.isFinite(r)||r<0)throw Error(`velocityVariance must be a finite number of at least 0, got ${String(e.velocityVariance)}`);let i=e.style?CJ[e.style]:wJ,a=e.grooveTemplate??null;return a&&$q(a),{intensity:t,timingMs:n,velocityVariance:r,timingScale:i.timing,velocityScale:i.velocity,template:a,warn:e.onWarn??(e=>console.warn(e))}}function rJ(e){let t=[];for(let n of e)n.type===`tempo`&&t.push({tick:n.tick,microsecondsPerQuarter:n.microsecondsPerQuarter});t.sort((e,t)=>e.tick-t.tick);let n=[{tick:0,microsecondsPerQuarter:5e5}];for(let e of t)e.tick===n[n.length-1].tick?n[n.length-1]=e:n.push(e);return n}function iJ(e,t){let n=0,r=e.length-1,i=0;for(;n<=r;){let a=n+r>>1;e[a].tick<=t?(i=a,n=a+1):r=a-1}return 6e7/e[i].microsecondsPerQuarter}function aJ(e,t,n){return e*t*n/6e4}function oJ(e,t,n){return e*6e4/(t*n)}function sJ(e){let t=null;return()=>{if(t!==null){let e=t;return t=null,e}let n=Math.sqrt(-2*Math.log(1-e.float())),r=2*Math.PI*e.float();return t=n*Math.sin(r),n*Math.cos(r)}}function cJ(e){let t=new Uint8Array(256);for(let e=0;e<256;e++)t[e]=e;for(let n=255;n>0;n--){let r=e.int(n+1),i=t[n];t[n]=t[r],t[r]=i}let n=(e,t)=>e&1?t:-t;return e=>{let r=Math.floor(e),i=e-r,a=i*i*i*(i*(i*6-15)+10),o=n(t[r&255],i);return o+a*(n(t[r+1&255],i-1)-o)}}function lJ(e){let t=new Map;for(let n of e.offsets)t.set(n.subdivisionIndex,{ms:oJ(n.timeOffsetTicks,e.ppq,e.tempoBpm),factor:n.velocityFactor});return t}function uJ(e){let t=new Uint8Array(e.length),n=new Map;for(let t=0;t<e.length;t++){let r=e[t];if(r.type!==`noteOn`||r.channel===vJ)continue;let i=n.get(r.channel);i?i.push({index:t,note:r.note}):n.set(r.channel,[{index:t,note:r.note}])}for(let e of n.values())for(let n=1;n<e.length-1;n++)e[n].note>e[n-1].note&&e[n].note>e[n+1].note&&(t[e[n].index]=1);return t}function dJ(e){return e.channel===vJ?yJ.includes(e.note):e.note<bJ}function fJ(e,t,n){let r=nJ(t),i=new j(t.seed),a=sJ(i),o=cJ(i),s=e.ticksPerQuarter,c=rJ(e.events),l=r.template?lJ(r.template):null,u=r.template?Qq(s,r.template.subdivision):0,d=r.template?Zq(r.template.timeSignature,r.template.subdivision):0,f=n===`groove`?uJ(e.events):null,p=[],m=new Map,h=!1;for(let t=0;t<e.events.length;t++){let i=e.events[t];if(i.type===`noteOff`){let e=m.get(TJ(i)),t=e&&e.length>0?e.shift():0;p.push(t===0?{...i}:{...i,tick:i.tick+t});continue}if(i.type!==`noteOn`){p.push({...i});continue}let g=iJ(c,i.tick);r.template&&!h&&Math.abs(g-r.template.tempoBpm)>gJ&&(h=!0,r.warn(`groove template "${r.template.name}" is written at ${r.template.tempoBpm} BPM but this file is at ${g.toFixed(1)} BPM by tick ${i.tick}: its offsets are rescaled to keep the same timing in milliseconds`));let _=aJ(r.timingMs*r.timingScale,s,g),v=a()*_+o(i.tick/s*pJ)*_*mJ;if(n===`groove`&&dJ(i)){let e=aJ(_J,s,g);v=Math.min(e,Math.max(-e,v))}let y;l&&(y=l.get(Math.floor(i.tick/u)%d));let b=Math.round(r.intensity*((y?aJ(y.ms,s,g):0)+v));i.tick+b<0&&(b=-i.tick);let x=Math.round(i.velocity*(1+r.intensity*((y?y.factor:1)-1))+r.intensity*a()*r.velocityVariance*r.velocityScale);f&&f[t]===1&&(x=Math.round(x*(1+r.intensity*hJ))),x=Math.min(127,Math.max(1,x));let S=TJ(i),C=m.get(S);C?C.push(b):m.set(S,[b]),p.push({...i,tick:i.tick+b,velocity:x})}return p.sort((e,t)=>e.tick-t.tick),{ticksPerQuarter:s,events:p,loopStartTick:e.loopStartTick}}var pJ,mJ,hJ,gJ,_J,vJ,yJ,bJ,xJ,SJ,CJ,wJ,TJ,EJ=s((()=>{_e(),tJ(),pJ=.25,mJ=.5,hJ=.15,gJ=1,_J=5,vJ=9,yJ=[35,36],bJ=48,xJ=8,SJ=10,CJ={jazz:{timing:1.3,velocity:1.1},rock:{timing:.8,velocity:1.2},classical:{timing:.6,velocity:1.4},funk:{timing:1,velocity:1.3}},wJ={timing:1,velocity:1},TJ=e=>`${e.channel}:${e.note}`})),DJ=l({LiteHumanizer:()=>OJ}),OJ,kJ=s((()=>{EJ(),OJ=class{constructor(){this.tierName=`lite`,this.approximateSizeMb=.05}async initialize(){}async process(e,t){if(t.grooveTemplate)throw Error(`the lite tier applies no groove grid: ask HumanizerFactory for "groove" when a template is in play`);return fJ(e,t,`lite`)}}})),AJ=l({GrooveHumanizer:()=>jJ}),jJ,MJ=s((()=>{EJ(),jJ=class{constructor(){this.tierName=`groove`,this.approximateSizeMb=.5}async initialize(){}async process(e,t){return fJ(e,t,`groove`)}}})),NJ=class e{static async create(t){let n=await e.load(t);return await n.initialize(),n}static async load(e){switch(e){case`lite`:return new(await(Promise.resolve().then(()=>(kJ(),DJ)))).LiteHumanizer;case`groove`:return new(await(Promise.resolve().then(()=>(MJ(),AJ)))).GrooveHumanizer;case`magenta`:throw Error(`the 'magenta' tier is not shipped: it needs @magenta/music and a PerformanceRNN checkpoint, and neither can be fetched from a file:// build`);default:throw Error(`unknown humanizer tier: ${String(e)}`)}}};async function PJ(e,t){let{tier:n,...r}=t,i=n??(r.grooveTemplate?`groove`:`lite`);return(await NJ.create(i)).process(e,r)}var FJ=5e5,IJ=111;function LJ(e){let t=e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength),n=new DataView(t.buffer,t.byteOffset,t.byteLength),r=0,i=e=>{let n=``;for(let i=0;i<e;i++)n+=String.fromCharCode(t[r+i]);return r+=e,n},a=()=>{let e=n.getUint32(r,!1);return r+=4,e},o=()=>{let e=n.getUint16(r,!1);return r+=2,e},s=()=>{let e=0;for(;;){let n=t[r++];if(e=e<<7|n&127,!(n&128))return e}};if(i(4)!==`MThd`||a()!==6)throw Error(`invalid MIDI header chunk`);let c=o(),l=o(),u=o();if(c!==0&&c!==1)throw Error(`unsupported MIDI format ${c}`);if(u&32768)throw Error(`SMPTE-based MIDI timing is not supported`);let d=u,f=[],p=null;for(let e=0;e<l;e++){let e=i(4),n=a();if(e!==`MTrk`){r+=n;continue}let o=r+n,c=0,l=0;for(;r<o;){c+=s();let e=t[r];if(e<128?e=l:(r++,e<240&&(l=e)),e===255){let e=t[r++],n=s();if(e===81&&n===3){let e=t[r]<<16|t[r+1]<<8|t[r+2];f.push({tick:c,type:`tempo`,microsecondsPerQuarter:e})}r+=n}else if(e===240||e===247)r+=s();else{let n=e&240,i=e&15;if(n===128||n===144){let e=t[r++],a=t[r++],o=n===144&&a>0;f.push({tick:c,type:o?`noteOn`:`noteOff`,note:e,velocity:a,channel:i})}else if(n===176){let e=t[r++],n=t[r++];f.push({tick:c,type:`control`,channel:i,controller:e,value:n}),e===IJ&&p===null&&(p=c)}else if(n===192){let e=t[r++];f.push({tick:c,type:`program`,channel:i,program:e})}else if(n===224){let e=t[r++],n=t[r++];f.push({tick:c,type:`pitchBend`,channel:i,value:(n<<7|e)-8192})}else if(n===160||n===208)r+=n===160?2:1;else throw Error(`unsupported MIDI status byte 0x${e.toString(16)}`)}}}return f.sort((e,t)=>e.tick-t.tick),{ticksPerQuarter:d,events:f,loopStartTick:p}}var RJ=2;function zJ(e){let t=[{tick:0,time:0,microsecondsPerQuarter:FJ}];for(let n of e.events){if(n.type!==`tempo`)continue;let r=t[t.length-1];t.push({tick:n.tick,time:r.time+(n.tick-r.tick)*r.microsecondsPerQuarter/e.ticksPerQuarter/1e6,microsecondsPerQuarter:n.microsecondsPerQuarter})}return t}function BJ(e,t,n){let r=e[0];for(let t of e)if(t.tick<=n)r=t;else break;return r.time+(n-r.tick)*r.microsecondsPerQuarter/t/1e6}function VJ(e){return e.loopStartTick===null?null:BJ(zJ(e),e.ticksPerQuarter,e.loopStartTick)}function HJ(e){let t=zJ(e),n=Array.from({length:16},()=>({program:0,bank:0,volume:100,expression:127,pan:64,bend:0})),r=e=>{let t=n[e]??n[0];return{program:t.program,bank:t.bank,gain:t.volume/127*(t.expression/127),pan:(t.pan-64)/64,...t.bend?{bend:t.bend}:{}}},i=[],a=new Map;for(let o of e.events){if(o.type===`tempo`)continue;if(o.type===`pitchBend`){(n[o.channel]??n[0]).bend=o.value/8192*RJ;continue}if(o.type===`program`){(n[o.channel]??n[0]).program=o.program;continue}if(o.type===`control`){let e=n[o.channel]??n[0];o.controller===0?e.bank=o.value:o.controller===7?e.volume=o.value:o.controller===10?e.pan=o.value:o.controller===11&&(e.expression=o.value);continue}let s=BJ(t,e.ticksPerQuarter,o.tick),c=`${o.channel}:${o.note}`;if(o.type===`noteOn`)a.set(c,{time:s,velocity:o.velocity,voice:r(o.channel)});else{let e=a.get(c);e&&(i.push({time:e.time,duration:Math.max(.01,s-e.time),note:o.note,velocity:e.velocity,channel:o.channel,...e.voice}),a.delete(c))}}for(let[e,t]of a){let[n,r]=e.split(`:`).map(Number);i.push({time:t.time,duration:.3,note:r,velocity:t.velocity,channel:n,...t.voice})}return i.sort((e,t)=>e.time-t.time)}function UJ(e){return 440*2**((e-69)/12)}var WJ=class e{constructor(e,t={}){this.elapsed=0,this.index=0,this.playing=!1,this.notes=HJ(e),this.playFn=t.play??Gq,this.waveform=t.waveform??`square`,this.volume=t.volume??.2}static async create(t,n={}){return new e(n.humanize?await PJ(t,n.humanize):t,n)}play(){this.playing=this.index<this.notes.length}pause(){this.playing=!1}stop(){this.playing=!1,this.elapsed=0,this.index=0}update(e){if(this.playing){for(this.elapsed+=e;this.index<this.notes.length&&this.notes[this.index].time<=this.elapsed;){let e=this.notes[this.index];this.playFn({waveform:this.waveform,frequency:UJ(e.note),duration:e.duration,volume:this.volume*(e.velocity/127)}),this.index++}this.index>=this.notes.length&&(this.playing=!1)}}get isPlaying(){return this.playing}get duration(){let e=this.notes.at(-1);return e?e.time+e.duration:0}},GJ=8e3,KJ=96e3;function qJ(e){let t=new Int16Array(e.length);for(let n=0;n<e.length;n++)t[n]=Math.round(Math.max(-1,Math.min(1,e[n]))*32767);return t}function JJ(e,t,n,r){let i=Math.max(1,Math.round(e.length*n/t));if(i>r)throw Error(`a decoded sample is longer than a SoundFont sample may be`);let a=new Float32Array(i);for(let r=0;r<a.length;r++){let i=r*t/n,o=Math.floor(i),s=Math.min(o+1,e.length-1);a[r]=e[o]+(e[s]-e[o])*(i-o)}return a}function YJ(e){if(typeof OfflineAudioContext>`u`)throw Error(`no OfflineAudioContext here: pass a decoder of your own to decode a SoundFont 3`);return new OfflineAudioContext(1,1,e)}function XJ(e=YJ,t={}){let n=t.sampleFrames??16777216;return async(t,r)=>{if(!(r>=400&&r<=2e5))throw Error(`a sample rate of ${r} Hz is not one a SoundFont can state`);let i=Math.max(GJ,Math.min(KJ,r)),a=t.slice().buffer,o=await e(i).decodeAudioData(a);if(o.length>n)throw Error(`a decoded sample is longer than a SoundFont sample may be`);let s=o.getChannelData(0);return qJ(o.sampleRate===r?s:JJ(s,o.sampleRate,r,n))}}var ZJ={keyRange:43,velRange:44,instrument:41,sampleId:53,rootKey:58,coarseTune:51,fineTune:52,sampleModes:54,attenuation:48,pan:17,attack:34,hold:35,decay:36,sustain:37,release:38};function QJ(e){return 2**(e/1200)}function $J(e){return e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}function eY(e,t){let n=``;for(let r=0;r<20;r++){let i=e[t+r];if(i===0)break;n+=String.fromCharCode(i)}return n}function tY(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength),n=t=>String.fromCharCode(e[t],e[t+1],e[t+2],e[t+3]);if(n(0)!==`RIFF`||n(8)!==`sfbk`)throw Error(`not a SoundFont 2 file`);let r=new Map,i=new Map,a=(e,o)=>{let s=e;for(;s+8<=o;){let e=n(s),o=t.getUint32(s+4,!0);e===`LIST`?(i.set(n(s+8),{at:s,size:o}),a(s+12,s+8+o)):r.set(e,{at:s+8,size:o}),s+=8+o+(o&1)}};a(12,e.length);for(let e of[`phdr`,`pbag`,`pgen`,`inst`,`ibag`,`igen`,`shdr`,`smpl`])if(!r.has(e))throw Error(`SoundFont is missing "${e}"`);let o=(e,t,n)=>{let i=r.get(e),a=[];for(let e=i.at;e+t<=i.at+i.size;e+=t)a.push(n(e));return a},s=n=>o(n,4,n=>({oper:t.getUint16(n,!0),lo:e[n+2],hi:e[n+3],amount:t.getInt16(n+2,!0)})),c=e=>o(e,4,e=>t.getUint16(e,!0)),l=o(`phdr`,38,n=>({name:eY(e,n),preset:t.getUint16(n+20,!0),bank:t.getUint16(n+22,!0),bag:t.getUint16(n+24,!0)})),u=o(`inst`,22,n=>({name:eY(e,n),bag:t.getUint16(n+20,!0)})),d=o(`shdr`,46,n=>({name:eY(e,n),start:t.getUint32(n+20,!0),end:t.getUint32(n+24,!0),loopStart:t.getUint32(n+28,!0),loopEnd:t.getUint32(n+32,!0),rate:t.getUint32(n+36,!0),rootKey:e[n+40],correction:t.getInt8(n+41),link:t.getUint16(n+42,!0),type:t.getUint16(n+44,!0)})),f=r.get(`smpl`),p=e.slice(f.at,f.at+f.size),m=d.filter(e=>e.end>e.start&&!(e.type&32768)),h=m.some(e=>e.type&16);if(h&&!m.every(e=>e.type&16))throw Error(`SoundFont mixes compressed and plain samples, which it cannot address consistently`);let g=h?p.length:p.length>>1;if(m.some(e=>e.end>g))throw Error(`a sample points outside the sample data: the SoundFont is damaged`);let _=h?new Int16Array:new Int16Array(p.buffer,0,p.length>>1),v=i.get(`INFO`)??null;return{bytes:e,presets:l,presetBags:c(`pbag`),presetGens:s(`pgen`),instruments:u,instBags:c(`ibag`),instGens:s(`igen`),samples:d,smplBytes:p,smpl:_,compressed:h,info:v?e.slice(v.at,v.at+8+v.size+(v.size&1)):null}}function nY(e,t,n){return t.slice(e[n],e[n+1]??t.length)}function rY(e,t,n,r,i){let a=e[r].bag,o=e[r+1]?.bag??t.length-1,s=[],c=null;for(let e=a;e<o;e++){let r=nY(t,n,e),o=new Map;for(let e of r)o.set(e.oper,e);o.has(i)?s.push({gens:o,global:c}):e===a&&(c=o)}return s}function iY(e,t){return e.gens.get(t)??e.global?.get(t)??null}function aY(e,t,n,r=`piano`){return e.get(`${t}:${n}`)??(t===128?e.get(`128:0`):e.get(`0:${n}`))??(r===`piano`?e.get(`0:0`):void 0)}function oY(e,t={}){let n=tY($J(e));if(n.compressed)throw Error(`SoundFont 3 (Ogg Vorbis samples) needs decoding first: use loadSoundFont() or decodeSoundFont(), or convert it with "mwg-soundfonts convert <in.sf3> <out.sf2>"`);let r=new Map,i=new Map,a=e=>{if(r.has(e))return r.get(e);let t=n.samples[e];if(!t||t.end<=t.start||t.type&32768)return r.set(e,null),null;let a=new Float32Array(t.end-t.start);for(let e=0;e<a.length;e++)a[e]=n.smpl[t.start+e]/32768;let o={data:a,rate:t.rate||22050,loopStart:t.loopStart-t.start,loopEnd:t.loopEnd-t.start};return r.set(e,o),i.set(e,{rootKey:t.rootKey===255?60:t.rootKey,correction:t.correction}),o},o=new Map;for(let e=0;e<n.presets.length-1;e++)o.set(`${n.presets[e].bank}:${n.presets[e].preset}`,e);function s(e,r,s,c){let l=aY(o,e,r,t.missingProgram);if(l===void 0)return[];let u=[],d=(e,t,n)=>{let r=iY(e,t);return!r||n>=r.lo&&n<=r.hi};for(let e of rY(n.presets,n.presetBags,n.presetGens,l,ZJ.instrument)){if(!d(e,ZJ.keyRange,s)||!d(e,ZJ.velRange,c))continue;let t=iY(e,ZJ.instrument).amount;if(n.instruments[t+1])for(let r of rY(n.instruments,n.instBags,n.instGens,t,ZJ.sampleId)){if(!d(r,ZJ.keyRange,s)||!d(r,ZJ.velRange,c))continue;let t=iY(r,ZJ.sampleId).amount,n=a(t);if(!n)continue;let o=(t,n=0)=>(iY(r,t)?.amount??n)+(iY(e,t)?.amount??0),l=iY(r,ZJ.rootKey)?.amount,f=iY(r,ZJ.sampleModes)?.amount??0,p=i.get(t);u.push({sample:n,rootKey:l!==void 0&&l>=0?l:p.rootKey,cents:o(ZJ.coarseTune)*100+o(ZJ.fineTune)+p.correction,loop:(f&3)==1||(f&3)==3,gain:10**(-Math.max(0,o(ZJ.attenuation))/200),pan:Math.max(-1,Math.min(1,o(ZJ.pan)/500)),attack:QJ(o(ZJ.attack,-12e3)),hold:QJ(o(ZJ.hold,-12e3)),decay:QJ(o(ZJ.decay,-12e3)),sustain:10**(-Math.max(0,o(ZJ.sustain))/200),release:QJ(o(ZJ.release,-12e3))})}}return u}return{voices:s,hasPreset:(e,t)=>o.has(`${e}:${t}`)||o.has(`0:${t}`),presetCount:o.size}}function sY(e){let t=new Set,n=[];for(let r of e)for(let e of HJ(r)){let r=e.channel===9?128:e.bank,i=`${r}:${e.program}`;t.has(i)||(t.add(i),n.push({bank:r,program:e.program}))}return n}function cY(e,t){let n=new Set(tY($J(e)).presets.slice(0,-1).map(e=>`${e.bank}:${e.preset}`)),r=new Set,i=[];for(let{bank:e,program:a}of t){let t=`${e}:${a}`;r.has(t)||(r.add(t),!(n.has(t)||e!==128&&n.has(`0:${a}`))&&i.push({bank:e,program:a}))}return i}function lY(e){return[e&255,e>>8&255]}function uY(e){return[e&255,e>>8&255,e>>16&255,e>>24&255]}function dY(e){let t=[...e].map(e=>e.charCodeAt(0)&255).slice(0,20);return[...t,...Array(20-t.length).fill(0)]}function fY(e){return[...e].map(e=>e.charCodeAt(0))}function pY(e,t){let n=new Uint8Array(8+t.length+(t.length&1));return n.set(fY(e),0),new DataView(n.buffer).setUint32(4,t.length,!0),n.set(t,8),n}function mY(e){let t=0;for(let n of e)t+=n.length;let n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.length;return n}function hY(e,t){let n=mY([new Uint8Array(fY(e)),...t]);return mY([new Uint8Array(fY(`LIST`)),new Uint8Array(uY(n.length)),n])}function gY(e){if(e.length===0)throw Error(`mergeSoundFonts needs at least one SoundFont`);let t=e.map(e=>tY($J(e))),n=t[0].compressed;if(t.some(e=>e.compressed!==n))throw Error(`cannot merge a SoundFont 3 with a SoundFont 2: decode it first with decodeSoundFont()`);let r={bytes:new Uint8Array,presets:[],presetBags:[],presetGens:[],instruments:[],instBags:[],instGens:[],samples:[],smplBytes:new Uint8Array,smpl:new Int16Array,compressed:n,info:t[0].info},i=[],a=0;for(let e of t){let t=r.instruments.length,o=r.samples.length,s=r.presetBags.length,c=r.presetGens.length,l=r.instBags.length,u=r.instGens.length,d=n?a:a>>1;r.presets.push(...e.presets.slice(0,-1).map(e=>({...e,bag:e.bag+s}))),r.presetBags.push(...e.presetBags.slice(0,-1).map(e=>e+c)),r.presetGens.push(...e.presetGens.slice(0,e.presetBags[e.presetBags.length-1]).map(e=>e.oper===ZJ.instrument?{...e,amount:e.amount+t}:e)),r.instruments.push(...e.instruments.slice(0,-1).map(e=>({...e,bag:e.bag+l}))),r.instBags.push(...e.instBags.slice(0,-1).map(e=>e+u)),r.instGens.push(...e.instGens.slice(0,e.instBags[e.instBags.length-1]).map(e=>e.oper===ZJ.sampleId?{...e,amount:e.amount+o}:e)),r.samples.push(...e.samples.slice(0,-1).map(e=>({...e,start:e.start+d,end:e.end+d,loopStart:n?e.loopStart:e.loopStart+d,loopEnd:n?e.loopEnd:e.loopEnd+d,link:e.link+o})));let f=n?e.smplBytes:e.smplBytes.subarray(0,e.smplBytes.length&-2);i.push(f),a+=f.length}return r.presetBags.push(r.presetGens.length),r.instBags.push(r.instGens.length),r.presets.push({name:`EOS`,preset:0,bank:0,bag:r.presetBags.length-1}),r.instruments.push({name:`EOS`,bag:r.instBags.length-1}),r.samples.push({name:`EOS`,start:0,end:0,loopStart:0,loopEnd:0,rate:0,rootKey:0,correction:0,link:0,type:0}),r.smplBytes=mY(i),n||(r.smpl=new Int16Array(r.smplBytes.slice().buffer)),xY(r,_Y(r))}function _Y(e){let t=new Set,n=[];for(let r=0;r<e.presets.length-1;r++){let i=`${e.presets[r].bank}:${e.presets[r].preset}`;t.has(i)||(t.add(i),n.push(r))}return n}async function vY(e,t,n={}){let r=n.sampleFrames??16777216,i=n.totalFrames??134217728,a=$J(e),o=tY(a);if(!o.compressed)return a.slice().buffer;let s=tY(new Uint8Array(xY(o,_Y(o)))),c=[],l=new Map,u=0,d=[];for(let e of s.samples){if(!(e.end>e.start)||e.type&32768){d.push(e);continue}let n=`${e.start}:${e.end}`,a=l.get(n);if(!a){if(!(e.rate>=400&&e.rate<=2e5))throw Error(`a sample states ${e.rate} Hz, which no SoundFont does: the font is damaged`);let o=await t(s.smplBytes.subarray(e.start,e.end),e.rate);if(o.length>r||u+o.length>i)throw Error("the decoded sample data is larger than the limits allow: subset the font, or raise `limits`");a={start:u,length:o.length},l.set(n,a),c.push(o),u+=o.length}d.push({...e,start:a.start,end:a.start+a.length,loopStart:a.start+Math.min(e.loopStart,a.length),loopEnd:a.start+Math.min(e.loopEnd,a.length),type:e.type&-17})}let f=new Int16Array(u),p=0;for(let e of c)f.set(e,p),p+=e.length;let m={...s,samples:d,smpl:f,smplBytes:new Uint8Array(f.buffer),compressed:!1};return xY(m,_Y(m))}async function yY(e,t={}){return oY(await vY(e,t.decode??XJ(void 0,t.limits),t.limits),t)}function bY(e,t){let n=tY($J(e)),r=new Map;for(let e=0;e<n.presets.length-1;e++)r.set(`${n.presets[e].bank}:${n.presets[e].preset}`,e);let i=new Set,a=[];for(let{bank:e,program:n}of t){let t=aY(r,e,n);t!==void 0&&!i.has(t)&&(i.add(t),a.push(t))}return a.sort((e,t)=>e-t),xY(n,a)}function xY(e,t){let n=t=>{let n=e.samples[t];return!!n&&n.end>n.start&&!(n.type&32768)},r=(e,t,n)=>e.map(e=>e.oper===t?{oper:t,lo:n.get(e.amount)&255,hi:n.get(e.amount)>>8&255,amount:n.get(e.amount)}:e),i=[],a=new Map;{let n=new Set;for(let r of t){let t=e.presets[r].bag,a=e.presets[r+1]?.bag??e.presetBags.length-1;for(let r=t;r<a;r++){let t=nY(e.presetBags,e.presetGens,r);if(!t.some(e=>e.oper===ZJ.instrument))continue;let a=t.find(e=>e.oper===ZJ.instrument).amount;e.instruments[a+1]&&(n.has(a)||(n.add(a),i.push(a)))}}}let o=new Map(i.map((e,t)=>[e,t]));for(let t of i){let r=e.instruments[t].bag,i=e.instruments[t+1]?.bag??e.instBags.length-1,o=[];for(let t=r;t<i;t++){let r=nY(e.instBags,e.instGens,t);if(!r.some(e=>e.oper===ZJ.sampleId))continue;let i=r.find(e=>e.oper===ZJ.sampleId).amount;n(i)&&o.push(r)}a.set(t,o)}let s=[];{let t=new Set,r=i=>{if(t.has(i)||!n(i))return;t.add(i),s.push(i);let a=e.samples[i].link;a!==i&&r(a)};for(let e of i)for(let t of a.get(e))r(t.find(e=>e.oper===ZJ.sampleId).amount)}let c=new Map(s.map((e,t)=>[e,t])),l=e=>[...lY(e.oper),e.lo,e.hi],u=e=>[...lY(e),...lY(0)],d=[],f=[],p=[];for(let n of t){let t=e.presets[n],i=d.length,a=t.bag,s=e.presets[n+1]?.bag??e.presetBags.length-1;for(let t=a;t<s;t++){let n=nY(e.presetBags,e.presetGens,t);(t===a&&!n.some(e=>e.oper===ZJ.instrument)||n.some(e=>e.oper===ZJ.instrument))&&(d.push(f.length),f.push(...r(n,ZJ.instrument,o)))}p.push({name:t.name,preset:t.preset,bank:t.bank,bag:i})}d.push(f.length);let m=[],h=[],g=[];for(let t of i){let n=m.length,i=a.get(t),o=e.instruments[t].bag,s=e.instruments[t+1]?.bag??e.instBags.length-1;for(let t=o;t<s;t++){let n=nY(e.instBags,e.instGens,t);t===o&&!n.some(e=>e.oper===ZJ.sampleId)&&(m.push(h.length),h.push(...n))}for(let e of i)m.push(h.length),h.push(...r(e,ZJ.sampleId,c));g.push({name:e.instruments[t].name,bag:n})}m.push(h.length);let _=[],v=[];for(let t of s){let n=e.samples[t],r=c.get(t);if(e.compressed){let t=v.length;for(let t=n.start;t<n.end;t++)v.push(e.smplBytes[t]);_.push({...n,start:t,end:t+(n.end-n.start),link:c.get(n.link)??r});continue}let i=v.length/2;for(let t=n.start;t<n.end;t++){let n=e.smpl[t];v.push(n&255,n>>8&255)}_.push({...n,start:i,end:i+(n.end-n.start),loopStart:i+(n.loopStart-n.start),loopEnd:i+(n.loopEnd-n.start),link:c.get(n.link)??r})}let y=e=>[...dY(e.name),...lY(e.preset),...lY(e.bank),...lY(e.bag),...Array(12).fill(0)],b=e.presets[e.presets.length-1],x=pY(`phdr`,[...p.flatMap(y),...y({name:b?.name??`EOS`,preset:0,bank:0,bag:d.length-1})]),S=pY(`pbag`,d.flatMap(u)),C=pY(`pgen`,f.flatMap(l)),ee=pY(`pmod`,Array(10).fill(0)),w=e=>[...dY(e.name),...lY(e.bag)],T=e.instruments[e.instruments.length-1],E=pY(`inst`,[...g.flatMap(w),...w({name:T?.name??`EOS`,bag:m.length-1})]),te=pY(`ibag`,m.flatMap(u)),D=pY(`igen`,h.flatMap(l)),O=pY(`imod`,Array(10).fill(0)),ne=e=>[...dY(e.name),...uY(e.start),...uY(e.end),...uY(e.loopStart),...uY(e.loopEnd),...uY(e.rate),e.rootKey,e.correction&255,...lY(e.link),...lY(e.type)],k={name:``,start:0,end:0,loopStart:0,loopEnd:0,rate:0,rootKey:0,correction:0,link:0,type:0},A=pY(`shdr`,[..._.flatMap(ne),...ne(k)]),re=hY(`sdta`,[pY(`smpl`,v)]),ie=hY(`pdta`,[x,S,ee,C,E,te,O,D,A]),ae=mY([new Uint8Array(fY(`sfbk`)),...e.info?[e.info]:[],re,ie]);return mY([new Uint8Array(fY(`RIFF`)),new Uint8Array(uY(ae.length)),ae]).buffer}var SY=22050,CY=.35,wY=480;function TY(e,t={}){return kY(DY(e,t))}async function EY(e,t={}){return mG(kY,[DY(LJ(e),{soundfont:t.soundFontBytes?oY(t.soundFontBytes,{missingProgram:t.missingProgram}):null,sampleRate:t.sampleRate,gain:t.gain,maxDuration:t.maxDuration})])}function DY(e,t){let n=t.sampleRate??SY,r=t.gain??CY,i=t.maxDuration??wY;if(!(n>0))throw Error(`render sample rate must be positive`);if(!(r>=0))throw Error(`render gain must not be negative`);if(!(i>0))throw Error(`render max duration must be positive`);let a=HJ(e).filter(e=>e.time<i);if(a.length===0)throw Error(`MIDI file has no notes`);let o=t.soundfont??null,s=new Map;return{notes:a.map(e=>({...e,frequency:UJ(e.note),voices:o?OY(o,s,e):void 0})),loopStart:VJ(e),sampleRate:n,gain:r,maxDuration:i}}function OY(e,t,n){let r=n.channel===9?128:n.bank,i=`${r}:${n.program}:${n.note}:${n.velocity>>3}`,a=t.get(i);return a||(a=e.voices(r,n.program,n.note,n.velocity),t.set(i,a)),a}function kY(e){let{sampleRate:t,gain:n,maxDuration:r}=e,i=e.notes,a=i.reduce((e,t)=>Math.max(e,t.time+t.duration),0),o=Math.min(r,a+1.5),s=Math.max(1,Math.ceil(o*t)),c=new Float32Array(s),l=new Float32Array(s),u=Math.min(e.loopStart??0,Math.max(0,o-.1));function d(e){let t=(Math.max(-1,Math.min(1,e))+1)*Math.PI/4;return[Math.cos(t),Math.sin(t)]}function f(e,t,n,r,i,a,o,s){let c=i.sample.data;if(c.length===0)return;let l=2**(((r.note-i.rootKey)*100+i.cents+(r.bend??0)*100)/1200)*i.sample.rate/n;if(!(l>0))return;let u=r.time+r.duration,f=Math.max(.002,i.attack),p=f+i.hold+Math.min(i.decay,30),m=Math.max(.03,Math.min(i.release,4)),h=c.length/i.sample.rate,g=r.channel===9?Math.max(u,r.time+Math.min(2,h)):Math.max(u,r.time+f),_=g-r.time,v=a*i.gain,y=v*i.sustain,[b,x]=d(r.pan+i.pan),S=i.loop&&i.sample.loopEnd>i.sample.loopStart,C=i.sample.loopEnd-i.sample.loopStart,ee=Math.min(s,o+Math.ceil((g+m+.02-r.time)*n)),w=0;for(let a=o;a<ee;a++){let o=a/n-r.time,s;s=o<f?o/f*v:o<f+i.hold?v:o<p?v+(y-v)*((o-f-i.hold)/Math.max(1e-6,p-f-i.hold)):o<_?y:o<_+m?y*(1-(o-_)/m):0,S&&w>=i.sample.loopEnd&&(w=i.sample.loopStart+(w-i.sample.loopStart)%C);let u=Math.floor(w),d=Math.min(1,Math.max(0,w-u)),h;if(!S&&w>=c.length||u<0)h=0;else{let e=c[Math.min(u,c.length-1)];h=e+(c[Math.min(u+1,c.length-1)]-e)*d}e[a]+=h*s*b,t[a]+=h*s*x,w+=l}}function p(e){return e<8?{wave:`triangle`,attack:.005,decay:1.2,sustain:.25,release:.2,detune:0}:e<16?{wave:`sine`,attack:.003,decay:.8,sustain:.1,release:.5,detune:0}:e<24?{wave:`square`,attack:.01,decay:.1,sustain:.7,release:.08,detune:0,cutoff:2500}:e<32?{wave:`sawtooth`,attack:.004,decay:.6,sustain:.15,release:.15,detune:0,cutoff:3e3}:e<40?{wave:`triangle`,attack:.005,decay:.4,sustain:.5,release:.1,detune:0}:e<56?{wave:`sawtooth`,attack:.12,decay:.2,sustain:.8,release:.3,detune:6,cutoff:3500}:e<80?{wave:`sawtooth`,attack:.04,decay:.15,sustain:.75,release:.12,detune:0,cutoff:4500}:e<88?{wave:`square`,attack:.01,decay:.1,sustain:.8,release:.1,detune:0,cutoff:3800}:e<104?{wave:`sawtooth`,attack:.25,decay:.3,sustain:.7,release:.5,detune:8,cutoff:2200}:{wave:`triangle`,attack:.005,decay:.5,sustain:.2,release:.2,detune:0}}function m(e,t){switch(e){case`sine`:return Math.sin(t);case`square`:return Math.sin(t)>=0?1:-1;case`sawtooth`:{let e=t/(2*Math.PI);return 2*(e-Math.floor(e))-1}case`triangle`:{let e=t/(2*Math.PI);return 4*Math.abs(e-Math.floor(e)-.5)-1}}}function h(e,t,n,r,i,a){return e<t?e/t:e<t+n?1-(1-r)*((e-t)/Math.max(1e-6,n)):e<i?r:e<i+a?r*(1-(e-i)/a):0}function g(e,t){let n=Math.imul(e^t,2654435761)>>>0;return n=Math.imul(n^n>>>15,2246822519)>>>0,n=Math.imul(n^n>>>13,3266489917)>>>0,n^=n>>>16,(n>>>0)/4294967295*2-1}function _(e,t,n,r,i,a,o){if(r.channel===9){v(e,t,n,r,i,a,o);return}let s=p(r.program),c=r.frequency*2**((s.detune+(r.bend??0)*100)/1200),l=Math.max(r.duration,s.attack+.01),u=Math.max(.02,s.release),f=Math.min(o,a+Math.ceil((l+u+.02)*n)),[g,_]=d(r.pan),y=s.cutoff!==void 0,b=y?1-Math.exp(-2*Math.PI*Math.min(s.cutoff,c*8+800)/n):0,x=0,S=0,C=2*Math.PI*c/n;for(let o=a;o<f;o++){let a=o/n-r.time,c=m(s.wave,S);S+=C,x=y?x+b*(c-x):c;let d=i*h(a,s.attack,s.decay,s.sustain,l,u);e[o]+=x*d*g,t[o]+=x*d*_}}function v(e,t,n,r,i,a,o){let[s,c]=d(r.pan),l=r.note*7919+a;if(r.note===35||r.note===36||r.note<45){let l=i*1.4,u=Math.min(o,a+Math.ceil(.27*n)),d=0;for(let i=a;i<u;i++){let a=i/n-r.time,o=a<.12?150*(45/150)**(a/.12):45;d+=2*Math.PI*o/n;let u=l*(.001/l)**Math.min(1,a/.22);e[i]+=Math.sin(d)*u*s,t[i]+=Math.sin(d)*u*c}return}let u=r.note===38||r.note===40,f=u?.16:r.note>=49?.5:.06,p=i*(u?.9:.5),m=Math.min(o,a+Math.ceil((f+.02)*n));for(let i=a;i<m;i++){let o=i/n-r.time,u=p*(.001/p)**Math.min(1,o/f),d=g(l,i-a)*u;e[i]+=d*s,t[i]+=d*c}}for(let e of i){let r=Math.floor(e.time*t);if(r>=s)continue;let i=n*Math.max(.02,e.velocity/127*e.gain),a=e.voices??[];if(a.length>0)for(let n of a)f(c,l,t,e,n,i,r,s);else _(c,l,t,e,i,r,s)}return{sampleRate:t,left:c,right:l,loopStart:u,loopEnd:o,duration:o}}function AY(e,t){let n=e.createBuffer(2,Math.max(1,t.left.length),t.sampleRate);return n.getChannelData(0).set(t.left),n.getChannelData(1).set(t.right),n}function jY(e,t={}){let n=new Map,r=t.read??MY;async function i(n){let i=await r(n),a=new Uint8Array(i,0,Math.min(4,i.byteLength));if(a[0]===77&&a[1]===84&&a[2]===104&&a[3]===100){let n=await EY(i,t.midi);return{buffer:AY(e,n),loop:{start:n.loopStart,end:n.loopEnd}}}return{buffer:await e.decodeAudioData(i.slice(0))}}return(e,t)=>{let r=n.get(t);return r||(r=i(t).catch(e=>{throw n.delete(t),e}),n.set(t,r)),r}}async function MY(e){return await WN([e]),GN(e)}var NY=class{constructor(e={}){this.current=null,this.fades=[],this.trackQueue=null,this.playlistFade=1,this.suspended_=!1,this.duckLevel_=1,this.volume=e.volume??1,this.create=e.create??Bq}play(e,t=1){this.trackQueue=null,this.start(e,t,!0)}playTracks(e,t=1){e.length===0?this.stop(t):(this.trackQueue=[...e],this.playlistFade=t,this.startNextTrack())}startNextTrack(){if(!this.trackQueue?.length)return;let e=this.trackQueue.shift();this.trackQueue.push(e),this.start(e,this.playlistFade,!1)}start(e,t,n){let r=this.create(e);r.loop=n,!n&&r.onended!==void 0&&(r.onended=()=>{this.current===r&&this.startNextTrack()});let i=this.current;this.current=r,t<=0?(r.volume=this.volume*this.duckLevel_,Promise.resolve(r.play()).catch(()=>{}),i?.pause()):(r.volume=0,Promise.resolve(r.play()).catch(()=>{}),this.fades.push({audio:r,elapsed:0,duration:t,from:0,to:this.volume*this.duckLevel_,stopAtEnd:!1}),i&&this.fades.push({audio:i,elapsed:0,duration:t,from:i.volume,to:0,stopAtEnd:!0}))}stop(e=1){this.trackQueue=null;let t=this.current;t&&(this.current=null,e<=0?t.pause():this.fades.push({audio:t,elapsed:0,duration:e,from:t.volume,to:0,stopAtEnd:!0}))}suspend(){this.suspended_=!0,this.current?.pause();for(let e of this.fades)e.audio.pause()}resume(){this.suspended_&&(this.suspended_=!1,this.current&&Promise.resolve(this.current.play()).catch(()=>{}))}duck(e=.5,t=.5){let n=Number.isFinite(e)?Math.max(0,Math.min(1,e)):1,r=this.duckLevel_;this.duckLevel_=n;for(let e of this.fades)e.to=r>0?e.to/r*n:this.volume*n;if(this.current){let e=this.volume*n;t<=0?this.current.volume=e:this.fades.push({audio:this.current,elapsed:0,duration:t,from:this.current.volume,to:e,stopAtEnd:!1})}}unduck(e=.5){this.duck(1,e)}get duckLevel(){return this.duckLevel_}get isSuspended(){return this.suspended_}update(e){if(!this.suspended_)for(let t of[...this.fades]){t.elapsed+=e;let n=Math.min(1,t.elapsed/t.duration);t.audio.volume=t.from+(t.to-t.from)*n,n>=1&&(this.fades.splice(this.fades.indexOf(t),1),t.stopAtEnd&&(t.audio.pause(),t.audio.currentTime=0))}}},PY=class{constructor(e){this.states=new Map,this.cues=new Map,this.currentTrack=null,this.music=e}define(e,t){this.states.set(e,t)}enter(e){let t=this.states.get(e);if(!t)throw Error(`Orchestrator: no state defined for "${e}"`);t.track!==this.currentTrack&&(this.music.play(t.track,t.fadeDuration),this.currentTrack=t.track)}on(e,t){this.cues.set(e,t)}trigger(e){this.cues.get(e)?.play()}suspend(){this.music.suspend();for(let e of this.cues.values())e.suspend()}resume(){this.music.resume();for(let e of this.cues.values())e.resume()}};function FY(e,t,n,r,i,a){let o=e.createBufferSource();o.buffer=n,o.playbackRate.value=i;let s=e.createGain();s.gain.value=r;let c=null;return typeof e.createStereoPanner==`function`?(c=e.createStereoPanner(),c.pan.value=a,o.connect(s),s.connect(c),c.connect(t)):(o.connect(s),s.connect(t)),{source:o,gain:s,panner:c}}var IY=class{constructor(e,t){this.source=null,this.gainNode=null,this.pannerNode=null,this.buffer=null,this.params={volume:1,pitch:1,pan:0},this.loopRegion=null,this.repeat=!0,this.startedAt=0,this.offset=0,this.context=e,this.destination=t??e.destination}get isPlaying(){return this.source!==null}get duration(){return this.buffer?.duration??0}play(e,t={}){this.stop();let n=t.volume??1,r=t.pitch??1,i=t.pan??0,{source:a,gain:o,panner:s}=FY(this.context,this.destination,e,n,r,i),c=t.loop??null,l=t.repeat??!0;if(a.loop=l,c&&(a.loopStart=c.start,a.loopEnd=c.end),!l){let e=a;a.onended=()=>{this.source===e&&this.clearNodes()}}this.source=a,this.gainNode=o,this.pannerNode=s,this.buffer=e,this.params={volume:n,pitch:r,pan:i},this.loopRegion=c,this.repeat=l,this.offset=Math.min(Math.max(0,t.pos??0),Math.max(0,e.duration-.001)),this.startedAt=this.context.currentTime,a.start(0,this.offset)}update(e){if(e.volume!==void 0&&(this.params.volume=e.volume),e.pitch!==void 0&&(this.params.pitch=e.pitch),e.pan!==void 0&&(this.params.pan=e.pan),!this.source||!this.gainNode)return;let t=this.context.currentTime;this.gainNode.gain.setTargetAtTime(this.params.volume,t,.02),this.source.playbackRate.value=this.params.pitch,this.pannerNode&&(this.pannerNode.pan.value=this.params.pan)}stop(e=0){let t=this.position(),n=this.source,r=this.gainNode;if(this.clearNodes(),this.offset=t,n)try{if(e>0&&r){let t=this.context.currentTime;r.gain.cancelScheduledValues(t),r.gain.setValueAtTime(r.gain.value,t),r.gain.linearRampToValueAtTime(0,t+e),n.stop(t+e+.02)}else n.stop()}catch{}}position(){if(!this.source||!this.buffer)return this.offset;let e=Math.max(0,this.context.currentTime-this.startedAt)*this.params.pitch,t=this.offset+e;if(this.repeat&&this.duration>0){let e=this.loopRegion?.start??0,n=this.loopRegion?.end??this.buffer.duration;n>e&&t>=n&&(t=e+(t-e)%(n-e))}return t}seek(e){this.restore({...this.state(),pos:e})}state(){return{...this.params,pos:this.position()}}restore(e){let t=this.buffer;this.update({volume:e.volume,pitch:e.pitch,pan:e.pan}),t&&this.source?this.play(t,{volume:e.volume,pitch:e.pitch,pan:e.pan,pos:e.pos,loop:this.loopRegion,repeat:this.repeat}):this.offset=Math.max(0,e.pos)}clearNodes(){this.source&&(this.source.onended=null),this.source=null,this.gainNode=null,this.pannerNode=null}};function LY(e,t,n,r){let i=Number(e);return Math.min(n,Math.max(t,Number.isFinite(i)?i:r))}var RY=class e{constructor(e,t={}){this.tracks={bgm:null,bgs:null},this.saved={bgm:null,bgs:null},this.requests={bgm:0,bgs:0},this.me=null,this.meToken=0,this.suspendedBgm=null,this.seNodes=new Set,this.mixerLevels={bgm:{volume:1,muted:!1},bgs:{volume:1,muted:!1},me:{volume:1,muted:!1},se:{volume:1,muted:!1}},this.context=e,this.destination=t.destination??e.destination,this.load=t.load??jY(e);let n=()=>{let t=e.createGain();return t.connect(this.destination),t};this.kindGains={bgm:n(),bgs:n(),me:n(),se:n()},this.bgmChannel=new IY(e,this.kindGains.bgm),this.bgsChannel=new IY(e,this.kindGains.bgs)}setMixer(e,t){let n=this.mixerLevels[e];t.volume!==void 0&&(n.volume=LY(t.volume,0,1,1)),t.muted!==void 0&&(n.muted=t.muted),this.kindGains[e].gain.value=n.muted?0:n.volume}mixer(e){return{...this.mixerLevels[e]}}playBgm(e){return this.playLoop(`bgm`,e)}playBgs(e){return this.playLoop(`bgs`,e)}stopBgm(){this.requests.bgm++,this.tracks.bgm=null,this.suspendedBgm=null,this.bgmChannel.stop()}stopBgs(){this.requests.bgs++,this.tracks.bgs=null,this.bgsChannel.stop()}fadeOutBgm(e=1){this.requests.bgm++,this.tracks.bgm=null,this.suspendedBgm=null,this.bgmChannel.stop(Math.max(0,e))}fadeOutBgs(e=1){this.requests.bgs++,this.tracks.bgs=null,this.bgsChannel.stop(Math.max(0,e))}currentTrack(e){let t=this.tracks[e];if(t){let n=e===`bgm`?this.bgmChannel:this.bgsChannel;return{...t,pos:n.isPlaying?n.position():t.pos}}return e===`bgm`?this.suspendedBgm:null}saveBgm(){return this.saved.bgm=this.currentTrack(`bgm`),this.saved.bgm}saveBgs(){return this.saved.bgs=this.currentTrack(`bgs`),this.saved.bgs}replayBgm(){return this.saved.bgm?this.playBgm(this.saved.bgm):Promise.resolve()}replayBgs(){return this.saved.bgs?this.playBgs(this.saved.bgs):Promise.resolve()}async playMe(t){let n=e.normalize(t),r=++this.meToken;if(this.stopMeNodes(),!n.name)return;let i=await this.load(`me`,n.name);if(r!==this.meToken||!i)return;let a=this.currentTrack(`bgm`);a&&(this.suspendedBgm=a,this.requests.bgm++,this.bgmChannel.stop(),this.tracks.bgm=null);let{source:o}=FY(this.context,this.kindGains.me,i.buffer,n.volume/100,n.pitch/100,n.pan/100);this.me={source:o,token:r},o.onended=()=>{this.me?.token===r&&this.finishMe()},o.start(0)}stopMe(e=!0){this.stopMeNodes(),e&&this.finishMe()}async playSe(t){let n=e.normalize(t);if(!n.name)return;let r=await this.load(`se`,n.name);if(!r)return;let{source:i}=FY(this.context,this.kindGains.se,r.buffer,n.volume/100,n.pitch/100,n.pan/100),a={source:i};this.seNodes.add(a),i.onended=()=>{this.seNodes.delete(a)},i.start(0)}stopSe(){for(let e of this.seNodes){e.source.onended=null;try{e.source.stop()}catch{}}this.seNodes.clear()}stopAll(){this.requests.bgm++,this.requests.bgs++,this.tracks.bgm=null,this.tracks.bgs=null,this.suspendedBgm=null,this.bgmChannel.stop(),this.bgsChannel.stop(),this.stopMeNodes(),this.stopSe()}snapshot(){return{bgm:this.currentTrack(`bgm`),bgs:this.currentTrack(`bgs`),savedBgm:this.saved.bgm,savedBgs:this.saved.bgs}}restore(e){e&&typeof e==`object`&&(this.saved.bgm=e.savedBgm??null,this.saved.bgs=e.savedBgs??null,e.bgm&&this.playBgm(e.bgm),e.bgs&&this.playBgs(e.bgs))}static normalize(e){return{name:String(e?.name||``),volume:LY(e?.volume,0,100,90),pitch:LY(e?.pitch,10,400,100),pan:LY(e?.pan,-100,100,0),pos:Math.max(0,Number(e?.pos)||0)}}async playLoop(t,n){let r=t===`bgm`?this.bgmChannel:this.bgsChannel,i=e.normalize(n);if(!i.name){this.requests[t]++,this.tracks[t]=null,t===`bgm`&&(this.suspendedBgm=null),r.stop();return}let a=this.tracks[t];if(a&&a.name===i.name&&!(i.pos>0)){this.tracks[t]={...i,pos:0},r.update({volume:i.volume/100,pitch:i.pitch/100,pan:i.pan/100});return}if(t===`bgm`&&this.me){this.requests.bgm++,this.suspendedBgm=i,this.tracks.bgm=null,r.stop();return}let o=++this.requests[t];r.stop(),this.tracks[t]={...i,pos:0};let s=await this.load(t,i.name);o===this.requests[t]&&(s?r.play(s.buffer,{volume:i.volume/100,pitch:i.pitch/100,pan:i.pan/100,pos:i.pos,loop:s.loop??null}):this.tracks[t]=null)}stopMeNodes(){let e=this.me;if(this.me=null,e){e.source.onended=null;try{e.source.stop()}catch{}}}finishMe(){this.me=null;let e=this.suspendedBgm;this.suspendedBgm=null,e&&!this.tracks.bgm&&this.playBgm(e)}},zY=class{constructor(e,t={}){this.onEnded=new p,this.buffer=null,this.loop=null,this.repeat=!1,this.playing=!1,this.paused=!1,this.resumeAt=0,this.context=e,this.channel=new IY(e,t.destination),this.volume_=Math.min(1,Math.max(0,t.volume??1))}load(e){this.stop(),`left`in e?(this.buffer=AY(this.context,e),this.loop={start:e.loopStart,end:e.loopEnd}):(this.buffer=e,this.loop=null)}play(e={}){this.buffer&&(this.repeat=e.repeat??!1,this.paused=!1,this.playing=!0,this.resumeAt=e.pos??0,this.start())}pause(){this.playing&&!this.paused&&(this.resumeAt=this.channel.position(),this.paused=!0,this.channel.stop())}resume(){this.paused&&this.buffer&&(this.paused=!1,this.start())}togglePause(){this.paused?this.resume():this.pause()}stop(){this.channel.stop(),this.playing=!1,this.paused=!1,this.resumeAt=0}get isPlaying(){return this.playing&&!this.paused}get isPaused(){return this.paused}get duration(){return this.buffer?.duration??0}position(){return this.playing?this.paused?this.resumeAt:this.channel.position():0}seek(e){if(!this.buffer)return;let t=Math.min(Math.max(0,e),this.buffer.duration);this.paused?this.resumeAt=t:this.playing&&this.play({pos:t,repeat:this.repeat})}get volume(){return this.volume_}set volume(e){this.volume_=Math.min(1,Math.max(0,e)),this.channel.update({volume:this.volume_})}update(){!this.playing||this.paused||this.channel.isPlaying||(this.playing=!1,this.resumeAt=0,this.onEnded.dispatch())}start(){this.buffer&&this.channel.play(this.buffer,{volume:this.volume_,pos:this.resumeAt,loop:this.loop,repeat:this.repeat})}},BY=65536;function VY(e){let t=UY(e.subarray(0,BY));if(!t)return null;let n=new DataView(t.buffer,t.byteOffset,t.byteLength),r=new TextDecoder(`utf-8`),i=7,a=()=>{if(i+4>t.length)return null;let e=n.getUint32(i,!0);return i+=4,i+e<=t.length?e:null},o=a();if(o===null||(i+=o,i+4>t.length))return null;let s=n.getUint32(i,!0);i+=4;let c=null,l=null;for(let e=0;e<s;e++){let e=a();if(e===null)break;let n=r.decode(t.subarray(i,i+e));i+=e;let o=n.indexOf(`=`);if(o<0)continue;let s=n.slice(0,o).toUpperCase(),u=/^\d+$/.test(n.slice(o+1))?Number(n.slice(o+1)):null;u!==null&&(s===`LOOPSTART`?c=u:s===`LOOPLENGTH`&&(l=u))}return c===null?null:{loopStart:c,loopLength:l}}function HY(e,t,n){if(!e||!(t>0))return null;let r=e.loopStart/t,i=e.loopLength?(e.loopStart+e.loopLength)/t:n;return r>=0&&i>r&&r<n?{start:r,end:Math.min(i,n)}:null}function UY(e){let t=[3,118,111,114,98,105,115],n=[],r=0;for(;r+27<=e.length;){if(e[r]!==79||e[r+1]!==103||e[r+2]!==103||e[r+3]!==83)return null;let i=e[r+26],a=r+27+i;if(a>e.length)return null;let o=a;for(let a=0;a<i;a++){let i=e[r+27+a];if(o+i>e.length)return null;for(let t=0;t<i;t++)n.push(e[o+t]);if(o+=i,i<255){if(t.every((e,t)=>n[t]===e))return Uint8Array.from(n);n=[]}}r=o}return null}function WY(e,t={}){let n=t.refDistance??1,r=t.maxDistance??1/0,i=t.rolloff??1;if(!(e>n))return 1;if(!(e<r))return 0;let a=(n/e)**+i;return Math.max(0,Math.min(1,a))}function GY(e,t){let n=t.x-e.x,r=t.y-e.y,i=Math.hypot(n,r);if(i===0)return 0;let a=Math.sin(e.facing),o=Math.cos(e.facing),s=(n*a+r*o)/i;return Math.max(-1,Math.min(1,s))}var KY=class{constructor(e={}){this.x=e.x??0,this.y=e.y??0,this.facing=e.facing??0}moveTo(e,t){this.x=e,this.y=t}face(e){this.facing=e}},qY=class{constructor(e,t={}){this.sound=e,this.x=t.x??0,this.y=t.y??0,this.falloff={refDistance:t.refDistance,maxDistance:t.maxDistance,rolloff:t.rolloff}}moveTo(e,t){this.x=e,this.y=t}gainTo(e){return WY(Math.hypot(this.x-e.x,this.y-e.y),this.falloff)}panTo(e){return GY(e,this)}playFor(e){let t=this.gainTo(e);return t<=0?0:(this.sound.play(t),t)}};kJ(),MJ();var JY=256,YY=64,XY=10,ZY=2,QY=.05,$Y=4,eX=96;function tX(e,t){let n=e.length,r=0;for(let i=1;i<n;i++){let a=n>>1;for(;r&a;)r^=a,a>>=1;if(r^=a,i<r){let n=e[i];e[i]=e[r],e[r]=n,n=t[i],t[i]=t[r],t[r]=n}}for(let r=2;r<=n;r<<=1){let i=-2*Math.PI/r,a=Math.cos(i),o=Math.sin(i),s=r>>1;for(let i=0;i<n;i+=r){let n=1,r=0;for(let c=0;c<s;c++){let l=i+c,u=l+s,d=e[u]*n-t[u]*r,f=e[u]*r+t[u]*n;e[u]=e[l]-d,t[u]=t[l]-f,e[l]+=d,t[l]+=f;let p=n*a-r*o;r=n*o+r*a,n=p}}}}function nX(e,t){if(e.length===0||t<=0)return[];let n=JY/2,r=new Float32Array(e.length+256);r.set(e,n);let i=new Float64Array(JY);for(let e=0;e<JY;e++)i[e]=.5-.5*Math.cos(2*Math.PI*e/255);let a=new Float64Array(JY),o=new Float64Array(JY),s=new Float64Array(JY/2),c=[],l=[],u=0;for(let e=0;e+JY<=r.length;e+=YY){let t=0;for(let n=0;n<JY;n++)a[n]=r[e+n]*i[n],o[n]=0,t+=a[n]*a[n];l.push(u===0?t===0?0:1/0:t/u-1),u=t,tX(a,o);let n=0;for(let e=0;e<JY/2;e++){let t=Math.hypot(a[e],o[e]),r=t-s[e];r>0&&(n+=r),s[e]=t}c.push(n)}let d=[],f=-1/0;for(let e=0;e<c.length;e++){let r=Math.max(0,e-XY),i=Math.min(c.length-1,e+XY),a=i-r+1,o=0;for(let e=r;e<=i;e++)o+=c[e];o/=a;let s=0;for(let e=r;e<=i;e++)s+=(c[e]-o)**2;let u=o+ZY*Math.sqrt(s/a);if(c[e]<=0||c[e]<u||l[e]<QY&&(e===0||l[e-1]<QY)||e>0&&c[e-1]>c[e]||e+1<c.length&&c[e+1]>=c[e]||e-f<$Y)continue;let p=(e*YY+n-eX)/t;d.push(Math.max(0,p)),f=e}return d}tJ();var rX=`extracted`,iX=[4,4],aX=120,oX=120,sX=480;function cX(e){let t=[...e].sort((e,t)=>e-t),n=t.length>>1;return t.length%2==1?t[n]:(t[n-1]+t[n])/2}function lX(e){return Math.round(cX(e))}function uX(e){for(let t of e.events)if(t.type===`tempo`)return Math.round(6e7/t.microsecondsPerQuarter*100)/100;return aX}function dX(e){return e.events.filter(e=>e.type===`noteOn`)}function fX(e){return dX(e).map(e=>e.velocity)}function pX(e,t,n,r,i){let a=e.map((e,t)=>({subdivisionIndex:t,timeOffsetTicks:e.time.length>0?lX(e.time):0,velocityFactor:e.velocity.length>0?i(e):1}));return{name:rX,timeSignature:[...iX],ppq:n,tempoBpm:r,subdivision:t,offsets:a}}var mX=class{async extractFromMidiPair(e,t,n=`16n`){let r=t.ticksPerQuarter,i=Qq(r,n),a=Zq(iX,n),o=r/e.ticksPerQuarter,s=dX(e).map(e=>({channel:e.channel,note:e.note,tick:e.tick*o,velocity:e.velocity})),c=new Set,l=[];for(let e of dX(t)){let t=-1,n=1/0;for(let r=0;r<s.length;r++){let i=s[r];if(c.has(r)||i.channel!==e.channel||i.note!==e.note)continue;let a=Math.abs(i.tick-e.tick);a<n&&(n=a,t=r)}t<0||n>i/2||(c.add(t),l.push({slotTick:s[t].tick,delta:e.tick-s[t].tick,factor:s[t].velocity>0?e.velocity/s[t].velocity:null}))}let u=Array.from({length:a},()=>({time:[],velocity:[]}));for(let e of l){let t=(Math.round(e.slotTick/i)%a+a)%a;u[t].time.push(e.delta),e.factor!==null&&u[t].velocity.push(e.factor)}return pX(u,n,r,uX(t),e=>cX(e.velocity))}async extractFromSingleMidi(e,t=`16n`){let n=e.ticksPerQuarter,r=Qq(n,t),i=Zq(iX,t),a=Array.from({length:i},()=>({time:[],velocity:[]}));for(let t of dX(e)){let e=Math.round(t.tick/r)*r,n=(Math.round(e/r)%i+i)%i;a[n].time.push(t.tick-e),a[n].velocity.push(t.velocity)}let o=cX(fX(e));return pX(a,t,n,uX(e),e=>o<=0?1:cX(e.velocity)/o)}async extractFromAudioBuffer(e,t=`16n`,n=oX){if(!Number.isFinite(n)||n<=0)throw Error(`tempoBpm must be greater than 0, got ${String(n)}`);let r=[];for(let t=0;t<e.numberOfChannels;t++)r.push(e.getChannelData(t));let i=new Float32Array(e.length);for(let e of r)for(let t=0;t<e.length;t++)i[t]+=e[t]/r.length;let a=nX(i,e.sampleRate);if(a.length===0)throw Error(`no onsets detected in the buffer - a groove needs audible attacks, and this audio has none`);let o=sX,s=Qq(o,t),c=Zq(iX,t),l=n*o/60,u=Array.from({length:c},()=>({time:[],velocity:[]}));for(let e of a){let t=e*l,n=Math.round(t/s)*s;u[(Math.round(n/s)%c+c)%c].time.push(t-n)}return pX(u,t,o,n,()=>1)}};tJ();var hX=`mwg-groove:`,gX=36,_X=64,vX=[`8n`,`16n`,`32n`],yX=new TextEncoder;function bX(e){throw Error(`the ${e} format is not shipped: it is an undocumented proprietary container, and a guessed reader could load a different groove than the file holds`)}function xX(e){return[...e].map(e=>e.charCodeAt(0)&127)}function SX(e){let t=[e&127],n=e>>>7;for(;n>0;)t.unshift(n&127|128),n>>>=7;return t}function CX(e,t){return[255,e,...SX(t.length),...t]}function wX(e){$q(e);let{name:t,timeSignature:n,ppq:r,subdivision:i,offsets:a}=e,o=Zq(n,i),s=Qq(r,i);if(r>32767)throw Error(`groove template "${t}": ppq ${r} does not fit MIDI's 15-bit division`);if(gX+o-1>127)throw Error(`groove template "${t}": ${o} slots need pitches up to ${gX+o-1}, past MIDI's top note of 127`);let c=Math.round(6e7/e.tempoBpm);if(c<1||c>16777215)throw Error(`groove template "${t}": tempoBpm ${e.tempoBpm} does not fit MIDI's three-byte tempo (${c} microseconds)`);a.forEach((e,n)=>{if(Math.abs(e.timeOffsetTicks)>=s)throw Error(`groove template "${t}": slot ${n} is offset by ${e.timeOffsetTicks} ticks, outside the +/-${s} the MIDI encoding's one-slot anchor can tell from a slot shift`);let r=Math.round(_X*e.velocityFactor);if(r<1||r>127)throw Error(`groove template "${t}": slot ${n} has velocityFactor ${e.velocityFactor}, outside the ${1/_X} to ${127/_X} the MIDI encoding can store at ${1/_X} per velocity unit`)});let l=[{tick:0,bytes:CX(81,[c>>16&255,c>>8&255,c&255])},{tick:0,bytes:CX(88,[n[0],Math.log2(n[1]),24,8])},{tick:0,bytes:CX(1,[...yX.encode(hX+t)])}];a.forEach((e,t)=>{let n=s*(t+1)+e.timeOffsetTicks,r=n+Math.max(1,Math.floor(s/4));l.push({tick:n,bytes:[144,gX+t,Math.round(_X*e.velocityFactor)]}),l.push({tick:r,bytes:[128,gX+t,0]})}),l.sort((e,t)=>e.tick-t.tick);let u=[],d=0;for(let e of l)u.push(...SX(e.tick-d),...e.bytes),d=e.tick;return u.push(0,255,47,0),new Uint8Array([...xX(`MThd`),0,0,0,6,0,0,0,1,r>>8&255,r&255,...xX(`MTrk`),u.length>>>24&255,u.length>>>16&255,u.length>>>8&255,u.length&255,...u])}function TX(e,t){for(let n of vX)try{if(Zq(e,n)===t)return n}catch{}throw Error(`a ${t}-slot groove in ${e[0]}/${e[1]} is not one of the 8n, 16n or 32n grids`)}function EX(e){let t=typeof e==`string`?yX.encode(e):e,n=new DataView(t.buffer,t.byteOffset,t.byteLength),r=0,i=(e,n)=>{if(r+e>t.length)throw Error(`truncated MIDI file while reading ${n}`)},a=(e,n)=>{i(e,n);let a=``;for(let n=0;n<e;n++)a+=String.fromCharCode(t[r+n]);return r+=e,a},o=e=>(i(1,e),t[r++]),s=e=>{i(2,e);let t=n.getUint16(r);return r+=2,t},c=e=>{i(4,e);let t=n.getUint32(r);return r+=4,t},l=e=>{let t=0;for(let n=0;n<4;n++){let n=o(e);if(t=t<<7|n&127,!(n&128))return t}throw Error(`a variable-length quantity in ${e} runs past four bytes`)};if(a(4,`the file header`)!==`MThd`)throw Error(`not a Standard MIDI File: the MThd header is missing`);let u=c(`the header length`);if(u<6)throw Error(`MThd is ${u} bytes, expected at least 6`);let d=s(`the format`),f=s(`the track count`),p=s(`the division`);if(r+=u-6,d>1)throw Error(`MIDI format ${d} is not a file this reader understands`);if(p&32768)throw Error(`SMPTE time in the division carries no tick grid to read a groove from`);if(f!==1)throw Error(`an mwg groove file holds one track, this one has ${f}`);if(a(4,`the track header`)!==`MTrk`)throw Error(`the MTrk track header is missing`);let m=c(`the track length`),h=r+m;if(h>t.length)throw Error(`truncated MIDI file: the track runs past the end of the data`);let g=0,_=0,v=null,y=null,b=null,x=!1,S=new Map;for(;r<h;){g+=l(`a delta time`);let e=t[r];if(e<128){if(_===0)throw Error(`data at tick ${g} follows a delta time with no running status to read it under`);e=_}else r++,e<240&&(_=e);if(e===255){let e=o(`a meta type`),n=l(`a meta length`);i(n,`a meta event`);let a=r;if(e===81&&n===3)v=t[a]<<16|t[a+1]<<8|t[a+2];else if(e===88&&n>=2)y=[t[a],2**t[a+1]];else if((e===1||e===3)&&n>0){let e=``;for(let r=0;r<n;r++)e+=String.fromCharCode(t[a+r]);e.startsWith(hX)&&(b=e.slice(11))}r+=n,e===47&&(x=!0),_=0;continue}if(e===240||e===247){r+=l(`a sysex length`),_=0;continue}let n=e&240;if(n===144||n===128){let e=o(`a note number`),t=o(`a note velocity`);if(n===144&&t>0){if(S.has(e))throw Error(`pitch ${e} carries more than one note-on, which no groove encodes`);S.set(e,{tick:g,velocity:t})}}else if(n===176||n===224)i(2,`a controller or bend event`),r+=2;else if(n===192||n===208)i(1,`a program or channel-aftertouch event`),r+=1;else throw Error(`unexpected status byte 0x${e.toString(16)} at tick ${g}`)}if(!x)throw Error(`the track has no end-of-track meta, so the file is incomplete`);if(b===null)throw Error(`no ${hX} text meta: this file was not written as a groove`);if(y===null)throw Error(`no time-signature meta: an mwg groove file always carries one`);let C=p,ee=S.size,w=TX(y,ee),T=Qq(C,w),E=[];for(let e=0;e<ee;e++){let t=S.get(gX+e);if(!t)throw Error(`slot ${e} is missing: expected a note on pitch ${gX+e}`);E.push({subdivisionIndex:e,timeOffsetTicks:t.tick-T*(e+1),velocityFactor:t.velocity/_X})}let te={name:b,timeSignature:y,ppq:C,tempoBpm:v===null?120:Math.round(6e7/v*100)/100,subdivision:w,offsets:E};return $q(te),te}function DX(e){let t=typeof e==`string`?e:new TextDecoder().decode(e),n;try{n=JSON.parse(t)}catch(e){throw Error(`not valid JSON: ${e instanceof Error?e.message:String(e)}`)}if(typeof n!=`object`||!n||Array.isArray(n))throw Error(`a groove JSON export must be an object`);return $q(n),n}var OX=class{async exportFormat(e,t){switch(t){case`json`:return $q(e),JSON.stringify(e,null,2);case`midi`:return wX(e);case`ableton-agr`:case`reaper-groove`:return bX(t);default:throw Error(`unknown groove format: ${String(t)}`)}}async importFormat(e,t){switch(t){case`json`:return DX(e);case`midi`:return EX(e);case`ableton-agr`:case`reaper-groove`:return bX(t);default:throw Error(`unknown groove format: ${String(t)}`)}}},kX=l({AudioBus:()=>RY,AudioListener:()=>KY,Channel:()=>IY,GrooveConverter:()=>OX,GrooveExtractor:()=>mX,GrooveHumanizer:()=>jJ,HumanizerFactory:()=>NJ,LiteHumanizer:()=>OJ,MidiPlayer:()=>WJ,Music:()=>NY,MusicPlayer:()=>zY,Orchestrator:()=>PY,Sound:()=>Uq,SoundSource:()=>qY,assertGrooveTemplate:()=>$q,audioGain:()=>WY,audioPan:()=>GY,collectSoundFontUsage:()=>sY,createAudio:()=>Bq,createAudioLoader:()=>jY,decodeSoundFont:()=>vY,humanizeMidi:()=>PJ,loadSoundFont:()=>yY,loopRegionFromTags:()=>HY,mergeSoundFonts:()=>gY,midiLoopStart:()=>VJ,missingSoundFontPrograms:()=>cY,noteToFrequency:()=>UJ,onCaption:()=>Hq,parseMidi:()=>LJ,parseSoundFont:()=>oY,parseVorbisLoopTags:()=>VY,playTone:()=>Gq,renderMidiToBuffer:()=>TY,renderMidiToBufferAsync:()=>EY,scheduleMidi:()=>HJ,subdivisionCount:()=>Zq,subsetSoundFont:()=>bY,synthesizeSound:()=>Kq,synthesizeTone:()=>Wq,toAudioBuffer:()=>AY,webAudioSampleDecoder:()=>XJ});tJ();function AX(e,t){if(!Number.isSafeInteger(t)||t<0)throw RangeError(`Turn budget must be a non-negative safe integer`);let n=0;for(;n<t;){if(e.finished())return{status:`finished`,steps:n};let t=e.scheduler.peek();if(t===null)return{status:`empty`,steps:n};if(e.needsInput(t))return{status:`input`,actor:t,steps:n};let r=e.act(t);if(r!==null){if(!Number.isFinite(r)||r<0)throw RangeError(`Action cost must be finite and non-negative, or null`);e.scheduler.spend(r)}n++}return{status:`limit`,steps:n}}function jX(e){if(e?.version!==1||typeof e.observationVersion!=`string`||!e.observationVersion.length)throw TypeError(`unsupported neural model or observation version`);if(!Array.isArray(e.layers)||!e.layers.length||e.layers.length>32)throw RangeError(`a neural model needs 1..32 layers`);let t=0;for(let n=0;n<e.layers.length;n++){let r=e.layers[n];if(!r||!Number.isInteger(r.inputSize)||!Number.isInteger(r.outputSize)||r.inputSize<1||r.outputSize<1||r.inputSize>4096||r.outputSize>4096)throw RangeError(`neural layer dimensions must be integers in 1..4096`);if(t+=r.inputSize*r.outputSize+r.outputSize,t>1e6)throw RangeError(`neural model exceeds one million parameters`);if(n&&e.layers[n-1].outputSize!==r.inputSize)throw RangeError(`neural layer dimensions do not connect`);if(!Array.isArray(r.weights)||!Array.isArray(r.biases)||r.weights.length!==r.inputSize*r.outputSize||r.biases.length!==r.outputSize||!Array.from(r.weights).every(Number.isFinite)||!Array.from(r.biases).every(Number.isFinite))throw TypeError(`neural weights and biases must be finite and match layer dimensions`)}let n=e.layers.map(e=>({...e,weights:Float64Array.from(e.weights),biases:Float64Array.from(e.biases),buffer:new Float64Array(e.outputSize)})),r=(e,t)=>{if(e.length!==n[0].inputSize)throw TypeError(`neural input must be finite and match the model`);for(let t=0;t<e.length;t++)if(!Number.isFinite(e[t]))throw TypeError(`neural input must be finite`);let r=n[n.length-1];if(t&&t.length!==r.outputSize)throw RangeError(`neural output buffer has the wrong size`);let i=e;for(let e=0;e<n.length;e++){let t=n[e];for(let r=0;r<t.outputSize;r++){let a=t.biases[r];for(let e=0;e<t.inputSize;e++)a+=t.weights[r*t.inputSize+e]*i[e];if(!Number.isFinite(a))throw RangeError(`neural activation overflow`);t.buffer[r]=e===n.length-1?a:Math.max(0,a)}i=t.buffer}let a=t??new Float64Array(r.outputSize);return a.set(r.buffer),a},i=new Float64Array(n[n.length-1].outputSize);return{predict:r,select(e,t){let n=e.mask;if(n&&(n.length!==i.length||!Array.from(n).every(e=>typeof e==`boolean`)))throw TypeError(`neural action mask must contain one boolean per output`);r(e.input,i);let a=null;for(let e=0;e<i.length;e++)(!n||n[e])&&(a===null||i[e]>i[a])&&(a=e);if(a===null||!t)return a;let o=t();if(!Number.isFinite(o)||o<0||o>=1)throw RangeError(`sampling random must return a value in [0, 1)`);let s=0;for(let e=0;e<i.length;e++)(!n||n[e])&&(s+=Math.exp(i[e]-i[a]));let c=o*s;for(let e=0;e<i.length;e++)if((!n||n[e])&&(c-=Math.exp(i[e]-i[a]),c<0))return e;return a}}}function MX(e,t,n){let r=Function(`return (${e});`)()(t);return n.map(e=>r.predict(e))}var NX=class{constructor(e){this.evaluator=jX(e),this.model=structuredClone(e)}predict(e,t){return this.evaluator.predict(e,t)}selectAction(e,t){return this.evaluator.select(e,t)}exportModel(){return structuredClone(this.model)}behavior(e,t,n,r=!1){if(t.length!==this.model.layers[this.model.layers.length-1].outputSize)throw RangeError(`neural action mapping must match output size`);let i=structuredClone(t);return{id:e,decide:e=>{e.checkpoint();let t=this.selectAction(n(e.perception),r?e.random:void 0);return t===null?null:structuredClone(i[t])}}}predictBatchAsync(e,t={}){let n=this.model.layers[0].inputSize,r=this.model.layers[this.model.layers.length-1].outputSize;if(e.length>65536||e.length*Math.max(n,r)>1e6)return Promise.reject(RangeError(`neural batch exceeds its observation or value limit`));for(let t of e)if(!t||t.length!==n)return Promise.reject(TypeError(`neural batch inputs must match the model`));return mG(MX,[jX.toString(),this.model,e],t)}};_e();var PX=class{get truncated(){return!this.terminated&&this.steps>=this.maxSteps}constructor(e,t,n=j){if(this.steps=0,this.terminated=!1,this.ready=!1,this.agentCount=0,this.rules=e,this.Random=n,this.random=new this.Random(0),!Number.isInteger(t.maxSteps)||t.maxSteps<1||t.maxSteps>1e6)throw RangeError(`training maxSteps must be in 1..1000000`);if(typeof e.observationVersion!=`string`||!e.observationVersion.length)throw TypeError(`training requires an observation version`);this.maxSteps=t.maxSteps,this.observationVersion=e.observationVersion}reset(e){if(!Number.isInteger(e)||e<0||e>4294967295)throw RangeError(`training seed must be uint32`);this.random=new this.Random(e),this.state=this.rules.initial(this.random),this.steps=0,this.terminated=this.rules.finished?.(this.state)??!1,this.ready=!0;let t=this.observations();return this.agentCount=t.length,{observations:t,rewards:t.map(()=>0),terminated:this.terminated,truncated:!1}}step(e){if(!this.ready||this.terminated||this.truncated)throw Error(`training episode needs reset before step`);let t=this.observations();if(e.length!==this.agentCount)throw RangeError(`training action count must match the agent roster`);for(let n=0;n<e.length;n++){let r=e[n],i=t[n].mask;if(r===null?!i||i.some(Boolean):!Number.isInteger(r)||r<0||i&&(r>=i.length||!i[r]))throw RangeError(`training action is not legal`)}let n=structuredClone(this.state),r=this.rules.command(this.state,e),i=this.rules.rule(this.state,r,this.random),a=Array.from(this.rules.rewards(n,r,i));if(a.length!==this.agentCount||!a.every(Number.isFinite))throw TypeError(`training rewards must be finite and match the agent roster`);this.state=i.state,this.steps++,this.terminated=i.status===`finished`;let o=this.observations();if(o.length!==this.agentCount)throw RangeError(`training agent roster changed during an episode`);return{observations:o,rewards:a,terminated:this.terminated,truncated:this.truncated}}snapshot(){if(!this.ready)throw Error(`training environment needs reset before snapshot`);return structuredClone({version:1,observationVersion:this.observationVersion,state:this.state,seed:this.random.seed,random:this.random.getState().map(e=>e>>>0),steps:this.steps,maxSteps:this.maxSteps,terminated:this.terminated,truncated:this.truncated})}restore(e){if(e.version!==1||e.observationVersion!==this.observationVersion||e.maxSteps!==this.maxSteps)throw TypeError(`training snapshot version, schema or step limit does not match`);if(!Number.isInteger(e.steps)||e.steps<0||e.steps>this.maxSteps||!Number.isInteger(e.seed)||e.seed<0||e.seed>4294967295||!Array.isArray(e.random)||e.random.length!==4||!e.random.every(e=>Number.isInteger(e)&&e>=0&&e<=4294967295)||!e.random.some(e=>e!==0)||typeof e.terminated!=`boolean`||typeof e.truncated!=`boolean`||e.terminated&&e.truncated||e.truncated!==(!e.terminated&&e.steps===this.maxSteps))throw TypeError(`invalid training snapshot`);this.state=structuredClone(e.state),this.random=new this.Random(e.seed),this.random.setState(e.random),this.steps=e.steps,this.terminated=e.terminated,this.ready=!0;let t=this.observations();return this.agentCount=t.length,{observations:t,rewards:t.map(()=>0),terminated:this.terminated,truncated:this.truncated}}observations(){let e=structuredClone(Array.from(this.rules.observe(this.state)));if(!e.length||e.length>4096)throw RangeError(`training requires 1..4096 agents`);for(let t of e)if(!t.input.length||t.input.length>4096||!Array.from(t.input).every(Number.isFinite)||t.mask&&(!t.mask.length||t.mask.length>4096||!Array.from(t.mask).every(e=>typeof e==`boolean`)))throw TypeError(`invalid training observation`);return e}};function FX(e,t,n){return IX(n),LX(e,t,n,{Generator:j,createNeuralEvaluator:jX})}function IX(e){let t=e.trajectoryLimit??0;if(!e.seeds.length||e.seeds.length>1e4||!Array.from(e.seeds).every(e=>Number.isInteger(e)&&e>=0&&e<=4294967295)||!Number.isInteger(t)||t<0||t*e.seeds.length>1e4)throw RangeError(`rollouts require 1..10000 uint32 seeds and at most 10000 stored transitions`)}function LX(e,t,n,r){if(t.observationVersion!==e.observationVersion)throw TypeError(`model observation schema does not match environment`);let i=n.trajectoryLimit??0,a=r.createNeuralEvaluator(t);return Array.from(n.seeds,t=>{if(n.signal?.aborted)throw n.signal.reason;let o=new r.Generator((t^2654435769)>>>0),s=e.reset(t),c=s.rewards.map(()=>0),l=[],u=0;for(;!s.terminated&&!s.truncated;){if(n.signal?.aborted)throw n.signal.reason;let t=s.observations.map(e=>a.select(e,n.sample?()=>o.float():void 0)),r=e.step(t);for(let e=0;e<c.length;e++)if(c[e]+=r.rewards[e],!Number.isFinite(c[e]))throw RangeError(`training cumulative reward overflow`);l.length<i&&l.push({before:s,actions:t,after:r}),s=r,u++}return{seed:t,steps:u,rewards:c,terminated:s.terminated,truncated:s.truncated,trajectory:l}})}function RX(e,t,n,r){let i=Function(`return (${e[0]});`)(),a=Function(`return (${e[1]});`)(),o=Function(`return (${e[2]});`)(),s=class extends o{constructor(e,t){super(e,t,i)}};return Function(`return (${e[3]});`)()(Function(`return (${e[4]});`)()({TrainingEnvironment:s},t),n,r,{Generator:i,createNeuralEvaluator:a})}async function zX(e,t,n,r){let i=r.jobs??4;if(!Number.isInteger(i)||i<1||i>64)throw RangeError(`rollout jobs must be in 1..64`);if(r.signal?.aborted)throw r.signal.reason;let a=r.trajectoryLimit??0;IX(r),jX(n);let o=new AbortController,s=()=>o.abort(r.signal?.reason);r.signal?.addEventListener(`abort`,s,{once:!0});let c=[j.toString(),jX.toString(),PX.toString(),LX.toString(),e.toString()],l=Math.min(i,r.seeds.length);try{return(await Promise.all(Array.from({length:l},(e,i)=>{let s=Math.floor(i*r.seeds.length/l),u=Math.floor((i+1)*r.seeds.length/l),d=r.seeds.slice(s,u);return mG(RX,[c,t,n,{seeds:d,sample:r.sample,trajectoryLimit:a}],{signal:o.signal,timeout:r.timeout})}))).flat()}finally{o.abort(),r.signal?.removeEventListener(`abort`,s)}}function BX(e,t){let n=[...t.actions];if(!n.length||n.some(e=>typeof e!=`string`))throw TypeError(`imitation needs the recorded action names in policy order`);let r=pn(t.events),i=e.reset(t.seed);if(i.observations.length!==1)throw Error(`imitation trains the recorded player alone: the environment must expose one agent`);let a=[],o=i,s=0;for(let t of r){if(o.terminated||o.truncated)break;let r=n.indexOf(t.action);if(r<0)throw Error(`a recorded action ${JSON.stringify(t.action)} is not in the action list`);a.push({observation:o.observations[0],action:r,frame:t.frame}),o=e.step([r]),s++}return{samples:a,steps:s,terminated:o.terminated,truncated:o.truncated}}function VX(e,t,n){let r=e.reset(n.seed),i=r.rewards.map(()=>0),a=[],o=0;for(;!r.terminated&&!r.truncated;){let n=t(r.observations);if(!Array.isArray(n)||n.length!==r.observations.length)throw RangeError(`the seeded-run chooser must return one action per agent`);a.push([...n]);let s=e.step(n);for(let e=0;e<i.length;e++)if(i[e]+=s.rewards[e],!Number.isFinite(i[e]))throw RangeError(`seeded-run cumulative reward overflow`);r=s,o++}return{seed:n.seed,steps:o,actions:a,rewards:i,terminated:r.terminated,truncated:r.truncated}}function HX(e){let t=e.state,n=e.status??`ready`,r=[],i=0;for(let a of e.commands){if(n===`finished`)break;let o=e.step(t,a,e.random);t=o.state,n=o.status;for(let e of o.events)r.push(e);i++}return{state:t,events:r,status:n,processedCommands:i}}var UX=class e{constructor(e){if(this._reminders=[],this._results={},this.levels=new Map(e.levels.map(e=>[e.id,e])),this.levels.size!==e.levels.length)throw Error(`campaign level ids must be unique`);if(!this.levels.has(e.start))throw Error(`unknown campaign start level: ${e.start}`);this._currentLevel=e.start,this._state=Wt(e.state,`campaign state`)}get currentLevel(){return this._currentLevel}get state(){return structuredClone(this._state)}get reminders(){return[...this._reminders]}get results(){return structuredClone(this._results)}playCurrent(){if(!this._currentLevel)throw Error(`campaign has no current level`);let e=this.levels.get(this._currentLevel);return this.completeCurrent(e.run(this.state,{levelId:e.id}))}completeCurrent(e){if(!this._currentLevel)throw Error(`campaign has no current level`);let t=this._currentLevel,n=Wt(e.state,`level result state`),r=e.result===void 0?void 0:Wt(e.result,`level result`);if(this._state=n,r!==void 0&&(this._results[t]=r),this._reminders=[...e.reminders??[]],e.outcome!==`completed`)this._currentLevel=null;else if(e.next===void 0)throw Error(`campaign level ${t} did not choose a next level`);else{if(e.next!==null&&!this.levels.has(e.next))throw Error(`unknown campaign transition: ${t} -> ${e.next}`);this._currentLevel=e.next}return{...e,state:this.state}}snapshot(){return{currentLevel:this._currentLevel,state:this.state,reminders:this.reminders,results:this.results}}static restore(t,n){let r=t.currentLevel??n.levels[0]?.id;if(!r)throw Error(`campaign restore requires at least one level`);let i=new e({levels:n.levels,start:r,state:t.state});return i._currentLevel=t.currentLevel,i._reminders=[...t.reminders],i._results=Wt(t.results,`snapshot.results`),i}};_e();function WX(e){let t=new j(e.seed);return{...HX({state:Wt(e.initialState,`initialState`),commands:e.commands,status:e.status,random:t,step:e.step}),seed:e.seed,random:t.getState()}}_e();function GX(e,t,n){let r=KX.restore({...e,journal:[]},n),i=e=>({valid:!1,checked:e.index,state:r.state,journal:r.journal.toJSON(),mismatch:e});for(let e=0;e<t.length;e++){let n=t[e];if(n.sequence!==e)return i({index:e,action:n.action,expectedEvents:n.events,actualEvents:[],reason:`sequence`});let a;try{a=r.dispatch(n.action)}catch(t){return i({index:e,action:n.action,expectedEvents:n.events,actualEvents:[],reason:`execution`,error:t instanceof Error?t.message:String(t)})}if(Rr(a.events)!==Rr(n.events))return i({index:e,action:n.action,expectedEvents:n.events,actualEvents:a.events,reason:`events`})}return n.expectedFinalState!==void 0&&Rr(r.state)!==Rr(n.expectedFinalState)?i({index:t.length,action:t.at(-1)?.action,expectedEvents:[],actualEvents:[],reason:`final-state`}):{valid:!0,checked:t.length,state:r.state,journal:r.journal.toJSON()}}var KX=class e{constructor(e){this._state=e.state,this._scheduler=e.scheduler,this.random=e.random,this.rule=e.rule,this.actorId=e.actorId,this.recordJournal=e.journal!==null,this.journal=e.journal??new wn,this.actorOf=e.history?.actorOf??null,this.history=e.history?new Or(e.history):null,this.history&&this.history.push(this.historySnapshot())}get scheduler(){return this._scheduler}get state(){return this._state}dispatch(e){let t=this.random.getState(),n=this.rule(this._state,e,{random:this.random,scheduler:this._scheduler}),r;try{r=this.history?Wt(n.state,`state`):null,this.recordJournal&&this.journal.append(e,n.events)}catch(e){throw this.random.setState(t),e}return this._state=n.state,n.cost!=null&&this._scheduler.spend(n.cost),this.history&&this.history.push(this.historySnapshot(r)),n}get canUndo(){return this.history?.canUndo??!1}get canRedo(){return this.history?.canRedo??!1}undo(){if(!this.history||!this.actorOf)return null;let e=this.history.undo();return e?(this.restoreCheckpoint(e),this.snapshot()):null}redo(){if(!this.history||!this.actorOf)return null;let e=this.history.redo();return e?(this.restoreCheckpoint(e),this.snapshot()):null}snapshot(e=1){return{version:e,state:this._state,scheduler:this.scheduler.toJSON(this.actorId),random:this.random.getState(),journal:this.journal.toJSON()}}static restore(t,n){let r=n.random??new j;r.setState(t.random);let i=tH.restore(t.scheduler,n.actorOf);return new e({state:t.state,scheduler:i,random:r,journal:wn.fromJSON(t.journal??[]),rule:n.rule,actorId:n.actorId})}historySnapshot(e=Wt(this._state,`state`)){return{...this.snapshot(),state:e}}restoreCheckpoint(e){if(!this.actorOf)throw Error(`simulation history needs actorOf to restore a checkpoint`);this._state=structuredClone(e.state),this._scheduler=tH.restore(e.scheduler,this.actorOf),this.random.setState(e.random),this.journal.replace(e.journal??[])}},qX=class e{constructor(e){this.followUps=[],this.runtime=e.runtime,this.queue=new Pr({play:e.play}),this.followUpOf=e.followUp}get locked(){return this.queue.isBusy}submit(e){return this.locked?null:this.commit(e)}update(e){this.queue.update(e),this.drainFollowUps()}cancel(){this.queue.clear(),this.followUps=[]}snapshot(e=1){return this.runtime.snapshot(e)}static restore(t,n){let r=KX.restore(t,{rule:n.rule,actorOf:n.actorOf,actorId:n.actorId});return new e({runtime:r,play:n.play,followUp:n.followUp})}commit(e){let t=this.runtime.dispatch(e);return this.queue.enqueue(t.events),this.followUpOf&&this.followUps.push(...this.followUpOf(t)),this.drainFollowUps(),t}drainFollowUps(){for(;!this.queue.isBusy&&this.followUps.length>0;){let e=this.followUps.shift();this.commit(e)}}},JX=class{constructor(e){this.saves=new zt(e)}save(e,t,n){this.saves.save(e,{campaign:t.campaign.snapshot(),world:t.world,simulation:t.simulation?t.simulation.snapshot():null},n)}load(e){return this.saves.load(e)?.state??null}list(){return this.saves.list()}delete(e){this.saves.delete(e)}},YX=l({Campaign:()=>UX,CampaignSave:()=>JX,EventPresentation:()=>qX,Scheduler:()=>tH,SimulationRuntime:()=>KX,TrainingEnvironment:()=>PX,advanceToInput:()=>AX,imitationFromReplay:()=>BX,runHeadlessScenario:()=>WX,runRollouts:()=>FX,runRolloutsAsync:()=>zX,runScenario:()=>HX,runSeededEpisode:()=>VX,validateSimulationReplay:()=>GX}),XX=d(c(((e,t,n)=>{(function(n,r){typeof e==`object`&&t!==void 0?t.exports=r():typeof define==`function`&&define.amd?define(r):n.JSON5=r()})(n,(function(){"use strict";function e(e,t){return t={exports:{}},e(t,t.exports),t.exports}var t=e(function(e){var t=e.exports=typeof window<`u`&&window.Math==Math?window:typeof self<`u`&&self.Math==Math?self:Function(`return this`)();typeof __g==`number`&&(__g=t)}),n=e(function(e){var t=e.exports={version:`2.6.5`};typeof __e==`number`&&(__e=t)});n.version;var r=function(e){return typeof e==`object`?e!==null:typeof e==`function`},i=function(e){if(!r(e))throw TypeError(e+` is not an object!`);return e},a=function(e){try{return!!e()}catch{return!0}},o=!a(function(){return Object.defineProperty({},"a",{get:function(){return 7}}).a!=7}),s=t.document,c=r(s)&&r(s.createElement),l=function(e){return c?s.createElement(e):{}},u=!o&&!a(function(){return Object.defineProperty(l(`div`),"a",{get:function(){return 7}}).a!=7}),d=function(e,t){if(!r(e))return e;var n,i;if(t&&typeof(n=e.toString)==`function`&&!r(i=n.call(e))||typeof(n=e.valueOf)==`function`&&!r(i=n.call(e))||!t&&typeof(n=e.toString)==`function`&&!r(i=n.call(e)))return i;throw TypeError(`Can't convert object to primitive value`)},f=Object.defineProperty,p={f:o?Object.defineProperty:function(e,t,n){if(i(e),t=d(t,!0),i(n),u)try{return f(e,t,n)}catch{}if(`get`in n||`set`in n)throw TypeError(`Accessors not supported!`);return`value`in n&&(e[t]=n.value),e}},m=function(e,t){return{enumerable:!(e&1),configurable:!(e&2),writable:!(e&4),value:t}},h=o?function(e,t,n){return p.f(e,t,m(1,n))}:function(e,t,n){return e[t]=n,e},g={}.hasOwnProperty,_=function(e,t){return g.call(e,t)},v=0,y=Math.random(),b=function(e){return`Symbol(${e===void 0?``:e})_${(++v+y).toString(36)}`},x=e(function(e){var r=`__core-js_shared__`,i=t[r]||(t[r]={});(e.exports=function(e,t){return i[e]||(i[e]=t===void 0?{}:t)})(`versions`,[]).push({version:n.version,mode:`global`,copyright:`© 2019 Denis Pushkarev (zloirock.ru)`})})(`native-function-to-string`,Function.toString),S=e(function(e){var r=b(`src`),i=`toString`,a=(``+x).split(i);n.inspectSource=function(e){return x.call(e)},(e.exports=function(e,n,i,o){var s=typeof i==`function`;s&&(_(i,`name`)||h(i,`name`,n)),e[n]!==i&&(s&&(_(i,r)||h(i,r,e[n]?``+e[n]:a.join(String(n)))),e===t?e[n]=i:o?e[n]?e[n]=i:h(e,n,i):(delete e[n],h(e,n,i)))})(Function.prototype,i,function(){return typeof this==`function`&&this[r]||x.call(this)})}),C=function(e){if(typeof e!=`function`)throw TypeError(e+` is not a function!`);return e},ee=function(e,t,n){if(C(e),t===void 0)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}},w=`prototype`,T=function(e,r,i){var a=e&T.F,o=e&T.G,s=e&T.S,c=e&T.P,l=e&T.B,u=o?t:s?t[r]||(t[r]={}):(t[r]||{})[w],d=o?n:n[r]||(n[r]={}),f=d[w]||(d[w]={}),p,m,g,_;for(p in o&&(i=r),i)m=!a&&u&&u[p]!==void 0,g=(m?u:i)[p],_=l&&m?ee(g,t):c&&typeof g==`function`?ee(Function.call,g):g,u&&S(u,p,g,e&T.U),d[p]!=g&&h(d,p,_),c&&f[p]!=g&&(f[p]=g)};t.core=n,T.F=1,T.G=2,T.S=4,T.P=8,T.B=16,T.W=32,T.U=64,T.R=128;var E=T,te=Math.ceil,D=Math.floor,O=function(e){return isNaN(e=+e)?0:(e>0?D:te)(e)},ne=function(e){if(e==null)throw TypeError(`Can't call method on `+e);return e},k=function(e){return function(e,t){var n=String(ne(e)),r=O(t),i=n.length,a,o;return r<0||r>=i?void 0:(a=n.charCodeAt(r),a<55296||a>56319||r+1===i||(o=n.charCodeAt(r+1))<56320||o>57343?a:(a-55296<<10)+(o-56320)+65536)}}(!1);E(E.P,`String`,{codePointAt:function(e){return k(this,e)}}),n.String.codePointAt;var A=Math.max,re=Math.min,ie=function(e,t){return e=O(e),e<0?A(e+t,0):re(e,t)},ae=String.fromCharCode,oe=String.fromCodePoint;E(E.S+E.F*(!!oe&&oe.length!=1),`String`,{fromCodePoint:function(e){for(var t=arguments,n=[],r=arguments.length,i=0,a;r>i;){if(a=+t[i++],ie(a,1114111)!==a)throw RangeError(a+` is not a valid code point`);n.push(a<65536?ae(a):ae(((a-=65536)>>10)+55296,a%1024+56320))}return n.join(``)}}),n.String.fromCodePoint;var se={Space_Separator:/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,ID_Start:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,ID_Continue:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/},j={isSpaceSeparator:function(e){return typeof e==`string`&&se.Space_Separator.test(e)},isIdStartChar:function(e){return typeof e==`string`&&(e>=`a`&&e<=`z`||e>=`A`&&e<=`Z`||e===`$`||e===`_`||se.ID_Start.test(e))},isIdContinueChar:function(e){return typeof e==`string`&&(e>=`a`&&e<=`z`||e>=`A`&&e<=`Z`||e>=`0`&&e<=`9`||e===`$`||e===`_`||e===``||e===``||se.ID_Continue.test(e))},isDigit:function(e){return typeof e==`string`&&/[0-9]/.test(e)},isHexDigit:function(e){return typeof e==`string`&&/[0-9A-Fa-f]/.test(e)}},ce,le,ue,de,fe,pe,me,he,ge,_e=function(e,t){ce=String(e),le=`start`,ue=[],de=0,fe=1,pe=0,me=void 0,he=void 0,ge=void 0;do me=xe(),ke[le]();while(me.type!==`eof`);return typeof t==`function`?ve({"":ge},``,t):ge};function ve(e,t,n){var r=e[t];if(typeof r==`object`&&r){if(Array.isArray(r))for(var i=0;i<r.length;i++){var a=String(i),o=ve(r,a,n);o===void 0?delete r[a]:Object.defineProperty(r,a,{value:o,writable:!0,enumerable:!0,configurable:!0})}else for(var s in r){var c=ve(r,s,n);c===void 0?delete r[s]:Object.defineProperty(r,s,{value:c,writable:!0,enumerable:!0,configurable:!0})}}return n.call(e,t,r)}var M,N,ye,be,P;function xe(){for(M=`default`,N=``,ye=!1,be=1;;){P=Se();var e=Ce[M]();if(e)return e}}function Se(){if(ce[de])return String.fromCodePoint(ce.codePointAt(de))}function F(){var e=Se();return e===`
|
|
1384
|
+
`,n);return[n,r===-1?this.text.length:r]}moveCaretLine(e,t=!1){let[n]=this.lineRange(this.caretLine),r=this.goalColumn??this.caretIndex-n,[i,a]=this.lineRange(this.caretLine+e);this.setCaret(i+Math.min(r,a-i),t),this.goalColumn=r}limit(e){return this.maxLength!==void 0&&e.length>this.maxLength?e.slice(0,this.maxLength):e}},gz=class e extends J{constructor(t){super(),this.onClick=new p,this.onPress=new p,this.onRelease=new p,this.state=`idle`,this.selected_=!1,this.themeListener=()=>this.draw(),this.width_=t.width,this.height_=t.height,this.disabled_=t.disabled??!1,this.colors={...t.colors},this.skin=t.skin,this.labelOptions=t.label??{};let n=Q();this.background=e.createBackground(this.skin,n),this.addChild(this.background),this.icon=t.icon??null,this.iconPlain=this.icon,this.iconSelected=t.iconSelected??null,this.tooltip_=t.tooltip,this.icon&&this.addChild(this.icon),this.labelText=t.text===void 0?null:new OI({align:`center`,...this.labelOptions,text:t.text}),this.labelText&&this.addChild(this.labelText),t.onClick&&this.onClick.add(t.onClick),t.onPress&&this.onPress.add(t.onPress),t.onRelease&&this.onRelease.add(t.onRelease),this.eventMode=`static`,this.on(`pointerover`,()=>this.setState(`hover`)),this.on(`pointerout`,()=>this.setState(`idle`)),this.on(`pointerdown`,()=>{this.setState(`pressed`),this.onPress.dispatch()}),this.on(`pointerup`,()=>{let e=this.state===`pressed`;this.setState(`hover`),e&&(this.onRelease.dispatch(),this.onClick.dispatch())}),this.on(`pointerupoutside`,()=>{let e=this.state===`pressed`;this.setState(`idle`),e&&this.onRelease.dispatch()}),this.setState(this.disabled_?`disabled`:`idle`),$.add(this.themeListener)}static createBackground(e,t){return e?new xL(e.texture,{border:e.border}):t.panel?new xL(t.panel,{border:t.panelBorder}):new Z}resize(e,t){this.width_=e,this.height_=t,this.draw()}setText(e){e===void 0?(this.labelText?.destroy(),this.labelText=null):this.labelText?this.labelText.setText(e):(this.labelText=new OI({align:`center`,...this.labelOptions,text:e}),this.addChild(this.labelText)),this.layoutContent()}setIcon(e){this.iconPlain=e,this.showIcon(this.selected_&&this.iconSelected?this.iconSelected:e)}setSelectedIcon(e){this.iconSelected=e,this.showIcon(this.selected_&&e?e:this.iconPlain)}showIcon(e){e!==this.icon&&(this.icon&&this.removeChild(this.icon),this.icon=e,e&&this.addChild(e),this.draw())}get tooltip(){return typeof this.tooltip_==`function`?this.tooltip_():this.tooltip_}setTooltip(e){this.tooltip_=e}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.setState(e?`disabled`:`idle`)}get selected(){return this.selected_}setSelected(e){this.selected_!==e&&(this.selected_=e,this.iconSelected&&this.showIcon(e?this.iconSelected:this.iconPlain),this.draw())}setColors(e){this.colors={...e},this.draw()}setState(e){this.disabled_&&e!==`disabled`||(this.state=e,this.cursor=this.disabled_?`default`:`pointer`,this.eventMode=this.disabled_?`none`:`static`,this.draw())}layoutContent(){let e=Q().direction===`rtl`;if(this.icon&&!this.labelText)this.icon.x=Math.round((this.width_-this.icon.width)/2),this.icon.y=Math.round((this.height_-this.icon.height)/2);else if(this.icon&&this.labelText){let t=Q().spacing,n=this.icon.width+t+this.labelText.width,r=Math.round((this.width_-n)/2);this.icon.x=e?r+this.labelText.width+t:r,this.icon.y=Math.round((this.height_-this.icon.height)/2),this.labelText.x=e?r:r+this.icon.width+t,this.labelText.y=Math.round((this.height_-this.labelText.height)/2)}else this.labelText&&(this.labelText.x=Math.round((this.width_-this.labelText.width)/2),this.labelText.y=Math.round((this.height_-this.labelText.height)/2))}draw(){let e=Q(),t=this.state===`pressed`?10066329:this.state===`hover`?14540253:this.state===`disabled`?7829367:16777215;if(this.background instanceof xL)this.background.resize(this.width_,this.height_),this.background.tint=this.selected_?this.colors.selection??e.color.selection:this.colors.background??this.skin?.tints?.[this.state]??t;else{let t=this.state===`pressed`||this.selected_?this.colors.selection??e.color.selection:this.colors.background??e.color.panelFill;this.background.clear().roundRect(0,0,this.width_,this.height_,4).fill({color:t,alpha:this.state===`disabled`?.5:1}).stroke({color:this.colors.border??e.color.panelBorder,width:1})}this.labelText?.setColor(this.disabled_?this.colors.disabledText??e.color.textDim:this.colors.text??this.labelOptions.color??e.color.text),this.icon&&(this.icon.alpha=this.disabled_?.4:1),this.layoutContent()}destroy(e){$.remove(this.themeListener),super.destroy(e)}},_z=e=>e.split(``).map(e=>({label:e})),vz={rows:[_z(`QWERTYUIOP`),_z(`ASDFGHJKL`),_z(`ZXCVBNM`),_z(`1234567890`),[{label:`Bksp`,action:`backspace`},{label:`Left`,action:`left`},{label:`Right`,action:`right`},{label:`Space`,text:` `,span:3},{label:`OK`,action:`confirm`},{label:`Esc`,action:`cancel`}]]};function yz(e){e.action===void 0?we(e.text??e.label):Te(e.action)}function bz(e,t){let n=[],r=0;for(let i of e.rows){let e=i.reduce((e,t)=>e+(t.span??1),0),a=(t.width-t.gap*(e-1))/e,o=0;for(let e of i){let i=e.span??1,s=a*i+t.gap*(i-1);n.push({key:e,x:o,y:r,width:s,height:t.keyHeight}),o+=s+t.gap}r+=t.keyHeight+t.gap}return n}var xz=class extends J{constructor(e,t){super();let n=Q().spacing,r=Math.max(Q().font.size*2,18),i=0;for(let a of bz(e,{width:t.width,keyHeight:r,gap:n})){let e=new gz({width:a.width,height:a.height,text:a.key.label,onClick:()=>yz(a.key)});e.position.set(a.x,a.y),this.addChild(e),i=Math.max(i,a.y+a.height)}this.laidOutHeight=i}get contentHeight(){return this.laidOutHeight}},Sz=.5,Cz=class extends TL{constructor(e){super({width:e.width,height:e.height,title:e.title,modal:!0,closable:!1,dims:e.dims,blocker:e.blocker??!0,anchor:e.anchor??`center`}),this.preview=``,this.promptError=null,this.keyboard=null,this.messageLabel=null,this.caretBar=new Z,this.measurer=new OI,this.canMeasureCaret=typeof document<`u`,this.blinkOn=!0,this.blinkElapsed=0,this.promptThemeListener=()=>this.restylePrompt(),this.textListener=e=>!this.closed&&(this.edit(()=>this.model.insert(e)),!0),this.compositionListener=e=>!this.closed&&(e.phase===`end`?this.edit(()=>{this.preview=``,this.model.insert(e.text)}):(this.preview=e.phase===`start`?``:e.text,this.render()),!0),this.model=new hz({value:e.initialValue??``,maxLength:e.maxLength}),this.validate=e.validate,this.onConfirm=e.onConfirm,this.onCancel=e.onCancel,this.announce=e.announce??!0,this.announcer=e.announcer??wL;let t=Q();this.lineHeight=t.font.size*t.font.lineHeight;let n=t.spacing;e.message!==void 0&&(this.messageLabel=new OI({text:e.message}),this.content.addChild(this.messageLabel)),this.valueY=this.messageLabel?this.lineHeight+n:0,this.valueLabel=new OI,this.valueLabel.y=this.valueY,this.content.addChild(this.valueLabel),this.previewLabel=new OI({color:t.color.textDim}),this.previewLabel.y=this.valueY+this.lineHeight+n,this.content.addChild(this.previewLabel),this.errorLabel=new OI({color:t.color.textHighlight}),this.errorLabel.y=this.previewLabel.y+this.lineHeight+n,this.content.addChild(this.errorLabel),this.content.addChild(this.caretBar),e.keyboard&&(this.keyboard=new xz(e.keyboard,{width:this.contentWidth}),this.keyboard.y=this.errorLabel.y+this.lineHeight+n,this.content.addChild(this.keyboard),this.resize(e.width,e.height+this.keyboard.contentHeight+n)),Se.add(this.textListener),F.add(this.compositionListener),$.add(this.promptThemeListener),this.render(),this.announce&&e.message!==void 0&&this.announcer.announce(e.message)}get value(){return this.model.value}get caretIndex(){return this.model.caret}get error(){return this.promptError}handleAction(e){if(this.delegate)return super.handleAction(e);if(this.closed)return!1;switch(e){case`left`:return this.model.moveCaret(-1),this.render(),!0;case`right`:return this.model.moveCaret(1),this.render(),!0;case`backspace`:return this.edit(()=>this.model.backspace()),!0;case`delete`:return this.edit(()=>this.model.deleteForward()),!0;case`confirm`:return this.confirm(),!0;case`cancel`:return this.onCancel?.(),this.close(),!0;default:return!1}}update(e){this.blinkElapsed+=e,!(this.blinkElapsed<Sz)&&(this.blinkElapsed=0,this.blinkOn=!this.blinkOn,this.caretBar.visible=this.blinkOn&&this.canMeasureCaret)}destroy(e){Se.remove(this.textListener),F.remove(this.compositionListener),$.remove(this.promptThemeListener),this.measurer.destroy(),super.destroy(e)}edit(e){let t=this.model.value;e(),this.model.value!==t&&(this.promptError=null),this.render()}confirm(){let e=this.validate?.(this.model.value)??null;e?(this.promptError=e,this.render(),this.announce&&this.announcer.announce(e,{assertive:!0})):(this.onConfirm(this.model.value),this.close())}restylePrompt(){let e=Q();this.previewLabel.setColor(e.color.textDim),this.errorLabel.setColor(e.color.textHighlight),this.render()}render(){this.valueLabel.setText(this.model.value),this.measurer.setText(this.model.value.slice(0,this.model.caret));let e=0;if(this.canMeasureCaret)try{e=this.measurer.width}catch{this.canMeasureCaret=!1}this.caretBar.clear().rect(this.valueLabel.x+e,this.valueY,2,this.lineHeight).fill({color:Q().color.text}),this.caretBar.visible=this.blinkOn&&this.canMeasureCaret,this.previewLabel.setText(this.preview),this.previewLabel.visible=this.preview.length>0,this.errorLabel.setText(this.promptError??``),this.errorLabel.visible=this.promptError!==null}},wz=/[A-Za-z0-9]/;function Tz(e,t){let{lineHeight:n,columnHeight:r}=t,i=t.rotate??wz,a=[],o=0,s=0;for(let t of e){if(t===`
|
|
1385
|
+
`){o++,s=0;continue}s*n>=r&&(o++,s=0);let e=i.test(t),c=o===0?0:-o*n;a.push({char:t,x:e?c-n/2:c,y:e?s*n+n/2:s*n,rotate:e}),s++}return a}var Ez=class extends J{constructor(e){super(),this.themeListener=e=>this.build(e),this.opts=e,this.build(Q()),$.add(this.themeListener)}build(e){this.removeChildren().forEach(e=>e.destroy());let t=this.opts.size??e.font.size,n=Math.ceil(t*e.font.lineHeight),r=Tz(this.opts.text,{lineHeight:n,columnHeight:this.opts.columnHeight,rotate:this.opts.rotate});for(let n of r){let r=new jA({text:n.char,style:{fontFamily:e.font.family,fontSize:t,fill:this.opts.color??e.color.text}});n.rotate&&(r.anchor.set(.5),r.rotation=Math.PI/2),r.x=n.x,r.y=n.y,this.addChild(r)}}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function Dz(e,t=0,n=1){return n>t?kn((e-t)/(n-t),0,1):0}function Oz(e,t=0,n=1,r=0){let i=t+kn(e,0,1)*(n-t);if(!(r>0))return i;let a=(String(r).split(`.`)[1]??``).length,o=t+Math.round((i-t)/r)*r;return Number(Math.max(t,Math.min(n,o)).toFixed(a))}var kz=class extends J{constructor(e){super(),this.onChange=new p,this.track=new Z,this.fill=new Z,this.knob=new Z,this.dragging=!1,this.themeListener=()=>this.draw(),this.handleDown=e=>{this.disabled_||(this.dragging=!0,this.setFraction(this.fractionAt(this.toLocal(e.global).x)))},this.handleMove=e=>{this.dragging&&!this.disabled_&&this.setFraction(this.fractionAt(this.toLocal(e.global).x))},this.handleUp=()=>{this.dragging=!1},this.width_=e.width,this.height_=e.height??6,this.knobSize=e.knobSize??Math.max(12,this.height_*2),this.min=e.min??0,this.max=e.max??1,this.step=e.step??0,this.value_=this.snap(e.value??this.min),this.disabled_=e.disabled??!1,this.addChild(this.track),this.addChild(this.fill),this.addChild(this.knob),this.draw(),this.eventMode=`static`,this.cursor=`pointer`,this.on(`pointerdown`,this.handleDown),this.on(`pointermove`,this.handleMove),this.on(`pointerup`,this.handleUp),this.on(`pointerupoutside`,this.handleUp),$.add(this.themeListener)}get value(){return this.value_}get fraction(){return Dz(this.value_,this.min,this.max)}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.cursor=e?`default`:`pointer`,this.draw()}setValue(e){let t=this.snap(e);t===this.value_?this.draw():(this.value_=t,this.draw(),this.onChange.dispatch(t))}setFraction(e){this.setValue(Oz(e,this.min,this.max,this.step))}resize(e,t){this.width_=e,this.height_=t,this.draw()}get trackLength(){return Math.max(0,this.width_-this.knobSize)}snap(e){return Oz(Dz(e,this.min,this.max),this.min,this.max,this.step)}fractionAt(e){return this.trackLength>0?kn((e-this.knobSize/2)/this.trackLength,0,1):0}draw(){let e=Q(),t=this.disabled_?e.color.textDim:e.color.textHighlight,n=e.color.panelFill,r=(this.knobSize-this.height_)/2;this.track.clear().roundRect(0,r,this.width_,this.height_,this.height_/2).fill({color:n});let i=this.knobSize/2+this.fraction*this.trackLength;this.fill.clear(),i>this.knobSize/2&&this.fill.roundRect(this.knobSize/2,r,i-this.knobSize/2,this.height_,this.height_/2).fill({color:t}),this.knob.clear().circle(i,this.knobSize/2,this.knobSize/2).fill({color:t})}destroy(e){$.remove(this.themeListener),super.destroy(e)}},Az=class extends J{constructor(e={}){super(),this.onChange=new p,this.box=new Z,this.themeListener=()=>this.draw(),this.handleTap=()=>{this.disabled_||this.toggle()},this.size_=e.size??20,this.checked_=e.checked??!1,this.disabled_=e.disabled??!1,this.addChild(this.box),this.draw(),this.eventMode=`static`,this.cursor=`pointer`,this.on(`pointertap`,this.handleTap),$.add(this.themeListener)}get checked(){return this.checked_}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.cursor=e?`default`:`pointer`,this.draw()}setChecked(e){e===this.checked_?this.draw():(this.checked_=e,this.draw(),this.onChange.dispatch(e))}toggle(){this.setChecked(!this.checked_)}resize(e){this.size_=e,this.draw()}draw(){let e=Q(),t=this.disabled_?e.color.textDim:e.color.textHighlight;if(this.box.clear().roundRect(0,0,this.size_,this.size_,4).fill({color:e.color.panelFill}).stroke({color:this.disabled_?e.color.textDim:e.color.panelBorder,width:2}),this.checked_){let e=this.size_*.25;this.box.moveTo(e,this.size_*.55).lineTo(this.size_*.45,this.size_-e).lineTo(this.size_-e,e).stroke({color:t,width:Math.max(2,this.size_*.12),cap:`round`,join:`round`})}}destroy(e){$.remove(this.themeListener),super.destroy(e)}},jz=class extends J{constructor(e={}){super(),this.onChange=new p,this.options_=[],this.rows=[],this.circles=[],this.selected_=-1,this.themeListener=()=>this.draw(),this.size_=e.size??20,this.gap_=e.gap??8,this.buildRows(e.options??[]),this.selected_=this.defaultSelection(e.selected),this.draw(),$.add(this.themeListener)}get selected(){return this.selected_}get selectedOption(){return this.options_[this.selected_]??null}get length(){return this.options_.length}get rowHeight(){return this.size_+this.gap_}setOptions(e,t){this.buildRows(e),this.selected_=this.defaultSelection(t),this.draw()}select(e){let t=this.options_[e];t&&!t.disabled&&(e===this.selected_?this.draw():(this.selected_=e,this.draw(),this.onChange.dispatch(e)))}move(e){let t=this.options_.length;if(t===0)return!1;let n=this.selected_;for(let r=0;r<t;r++){n=(n+e+t)%t;let r=this.options_[n];if(r&&!r.disabled)return this.select(n),!0}return!1}handleAction(e){switch(e){case`up`:case`left`:return this.move(-1);case`down`:case`right`:return this.move(1);default:return!1}}tapRow(e){this.select(e)}defaultSelection(e){if(e!==void 0){let t=this.options_[e];if(t&&!t.disabled)return e}let t=this.options_.findIndex(e=>!e.disabled);return t===-1?-1:t}buildRows(e){for(let e of this.rows)e.destroy({children:!0});this.rows=[],this.circles=[],this.options_=[...e],this.removeChildren(),e.forEach((e,t)=>{let n=new J;n.y=t*this.rowHeight,n.eventMode=`static`,n.cursor=e.disabled?`default`:`pointer`,n.on(`pointertap`,()=>this.tapRow(t));let r=new Z;n.addChild(r),this.circles.push(r);let i=new OI({text:e.text});n.addChild(i),this.rows.push(n),this.addChild(n)})}draw(){let e=Q(),t=e.direction===`rtl`;this.rows.forEach((n,r)=>{let i=this.options_[r].disabled,a=this.circles[r];a.clear().circle(this.size_/2,this.size_/2,this.size_/2-1).fill({color:e.color.panelFill}).stroke({color:i?e.color.textDim:e.color.panelBorder,width:2}),r===this.selected_&&a.circle(this.size_/2,this.size_/2,Math.max(2,this.size_*.28)).fill({color:i?e.color.textDim:e.color.textHighlight});let o=this.size_+e.spacing,s=n.children.find(e=>e instanceof OI),c=s?.width??0;s&&(s.setColor(i?e.color.textDim:e.color.text),s.y=Math.round((this.size_-s.height)/2)),t?(s&&(s.x=0),a.x=c+e.spacing):(a.x=0,s&&(s.x=o))})}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function Mz(e,t,n,r,i=1,a=!1){if(!(r>n))return n;let o=i>0?i:1,s=(String(o).split(`.`)[1]??``).length,c=Math.round((e-n)/o)+Math.round(t),l=Math.round((r-n)/o)+1,u=c;return u=a?(u%l+l)%l:Math.max(0,Math.min(l-1,u)),Number((n+u*o).toFixed(s))}var Nz=class extends J{constructor(e={}){super(),this.onChange=new p,this.face=new Z,this.themeListener=()=>this.draw(),this.handleTap=e=>{this.disabled_||(this.toLocal(e.global).y<this.height_/2?this.increment():this.decrement())},this.width_=e.width??24,this.height_=e.height??32,this.min=e.min??0,this.max=e.max??9,this.step=e.step??1,this.wrap=e.wrap??!1,this.disabled_=e.disabled??!1,this.value_=Mz(e.value??this.min,0,this.min,this.max,this.step,!1),this.addChild(this.face),this.draw(),this.eventMode=`static`,this.cursor=`pointer`,this.on(`pointertap`,this.handleTap),$.add(this.themeListener)}get value(){return this.value_}get disabled(){return this.disabled_}setDisabled(e){this.disabled_=e,this.cursor=e?`default`:`pointer`,this.draw()}setValue(e){this.commit(Mz(e,0,this.min,this.max,this.step,this.wrap))}increment(){this.commit(Mz(this.value_,1,this.min,this.max,this.step,this.wrap))}decrement(){this.commit(Mz(this.value_,-1,this.min,this.max,this.step,this.wrap))}resize(e,t){this.width_=e,this.height_=t,this.draw()}commit(e){e===this.value_?this.draw():(this.value_=e,this.draw(),this.onChange.dispatch(e))}draw(){let e=Q(),t=this.disabled_?e.color.textDim:e.color.textHighlight;this.face.clear().roundRect(0,0,this.width_,this.height_,4).fill({color:e.color.panelFill}).stroke({color:e.color.panelBorder,width:1});let n=this.width_/2,r=Math.min(this.width_/4,this.height_/5);this.face.moveTo(n-r,r*1.6).lineTo(n,r*.6).lineTo(n+r,r*1.6).closePath().fill({color:t}),this.face.moveTo(n-r,this.height_-r*1.6).lineTo(n,this.height_-r*.6).lineTo(n+r,this.height_-r*1.6).closePath().fill({color:t})}destroy(e){$.remove(this.themeListener),super.destroy(e)}},Pz=class{constructor(e){this.onChange=new p,this.open_=!1,this.options_=[...e.options],this.disabled_=e.disabled??!1;let t=e.selectedIndex??this.firstEnabled();this.current=this.options_[t]?.disabled?this.firstEnabled():t,this.highlight_=this.current}get options(){return this.options_}get selectedIndex(){return this.current}get selected(){return this.options_[this.current]??null}get isOpen(){return this.open_}get disabled(){return this.disabled_}get highlight(){return this.highlight_}setDisabled(e){this.disabled_=e,e&&(this.open_=!1)}setOptions(e){this.options_=[...e],this.current=this.firstEnabled(),this.highlight_=this.current,this.open_=!1}open(){this.disabled_||this.open_||(this.open_=!0,this.highlight_=this.current)}close(){this.open_=!1}toggleOpen(){this.open_?this.close():this.open()}move(e){if(!this.open_||this.options_.length===0)return;let t=this.options_.length,n=this.highlight_;for(let r=0;r<t;r++)if(n=((n+e)%t+t)%t,!this.options_[n].disabled){this.highlight_=n;return}}setHighlight(e){e<0||e>=this.options_.length||this.options_[e].disabled||(this.open(),this.open_&&(this.highlight_=e))}confirm(){if(!this.open_)return!1;let e=this.options_[this.highlight_];return!e||e.disabled?!1:(this.open_=!1,this.highlight_!==this.current&&(this.current=this.highlight_,this.onChange.dispatch({option:e,index:this.current})),!0)}cancel(){this.open_=!1,this.highlight_=this.current}firstEnabled(){let e=this.options_.findIndex(e=>!e.disabled);return e===-1?0:e}},Fz=class extends J{constructor(e){super(),this.list=new J,this.backdrop=new Z,this.box=null,this.listHeight=0,this.themeListener=()=>this.refresh(),this.model=new Pz(e),this.rowHeight=e.rowHeight??28,this.maxRows=Math.max(1,e.maxVisibleRows??8),this.autoWidth=e.autoWidth??!1,this.maxWidth=e.maxWidth,this.width_=this.autoWidth?this.capWidth(Math.max(e.width,...this.model.options.map(e=>this.labelWidth(e.label)))):e.width,this.head=new gz({width:this.width_,height:this.rowHeight,text:``,disabled:this.model.disabled,onClick:()=>{this.model.toggleOpen(),this.refresh()}}),this.list.y=this.rowHeight,this.list.addChild(this.backdrop),this.addChild(this.head,this.list),this.refresh(),$.add(this.themeListener)}measureLabel(e){try{let t=new aO({fontFamily:Q().font.family,fontSize:Q().font.size});return QD.measureText(e,t).width}catch{return e.length*Q().font.size*.6}}labelWidth(e){return Math.ceil(this.measureLabel(e))+2*Q().padding+16}get viewWidth(){return this.width_}capWidth(e){return this.maxWidth===void 0?e:Math.min(e,this.maxWidth)}resize(e){this.width_=this.capWidth(e),this.head.resize(this.width_,this.rowHeight),this.refresh()}get visibleRows(){return Math.min(this.maxRows,this.model.options.length)}get scroller(){return this.box}fitBelow(e,t){let n=Math.floor((t-e-this.rowHeight)/this.rowHeight);return Math.max(1,Math.min(this.maxRows,n))}refresh(){let e=this.model;if(this.head.setText(`${e.selected?.label??``} ▾`),this.head.setDisabled(e.disabled),this.box?.destroy({children:!0}),this.box=null,this.list.visible=e.isOpen,this.backdrop.clear(),!e.isOpen)return;let t=this.visibleRows;this.listHeight=t*this.rowHeight;let n=Q();this.backdrop.rect(0,0,this.width_,this.listHeight).fill({color:n.color.panelFill,alpha:1}).stroke({color:n.color.panelBorder,width:1});let r=new kL({width:this.width_,height:this.listHeight,contentHeight:e.options.length*this.rowHeight,touch:!0,lineHeight:this.rowHeight}),i=this.width_-(r.scrollable?8:0);e.options.forEach((t,n)=>{let a=new gz({width:i,height:this.rowHeight,text:t.label,disabled:t.disabled,onClick:()=>{e.setHighlight(n),e.confirm(),this.refresh()}});a.y=n*this.rowHeight,a.setSelected(n===e.highlight),r.content.addChild(a)}),r.scrollIntoView(e.highlight*this.rowHeight,this.rowHeight),this.box=r,this.list.addChild(r)}handleKey(e){let t=this.model;if(t.disabled)return!1;if(!t.isOpen)return e!==`Enter`&&e!==` `&&e!==`ArrowDown`?!1:(t.open(),this.refresh(),!0);let n=t.options.length;switch(e){case`Escape`:t.cancel();break;case`Enter`:case` `:t.confirm();break;case`ArrowUp`:t.move(-1);break;case`ArrowDown`:t.move(1);break;case`PageUp`:t.setHighlight(Math.max(0,t.highlight-this.maxRows));break;case`PageDown`:t.setHighlight(Math.min(n-1,t.highlight+this.maxRows));break;case`Home`:t.setHighlight(0);break;case`End`:t.setHighlight(n-1);break;default:return!1}return this.refresh(),!0}handleOutsideClick(e,t){if(!this.model.isOpen)return!1;let n=this.toLocal(new Gi(e,t));return n.x>=0&&n.x<=this.width_&&n.y>=0&&n.y<=this.rowHeight+this.listHeight?!1:(this.model.cancel(),this.refresh(),!0)}destroy(e){$.remove(this.themeListener),super.destroy(e)}},Iz=class{constructor(e){this.onChange=new p,this.current=0,this.sortKey_=null,this.ascending=!0,this.columns_=[...e.columns],this.rows_=[...e.rows??[]],this.pageSize_=e.pageSize??0,this.disabledOf=e.disabled??(()=>!1),this.current=this.firstEnabled()}get columns(){return this.columns_}get rows(){return this.rows_}get pageSize(){return this.pageSize_}get sortKey(){return this.sortKey_}get sortAscending(){return this.ascending}get selectedIndex(){return this.current}get selected(){return this.rows_[this.current]??null}get page(){return this.pageSize_>0?Math.floor(this.current/this.pageSize_):0}get pageCount(){return this.pageSize_>0?Math.max(1,Math.ceil(this.rows_.length/this.pageSize_)):1}get pageRows(){if(this.pageSize_<=0)return this.rows_;let e=this.page*this.pageSize_;return this.rows_.slice(e,e+this.pageSize_)}setRows(e){this.rows_=[...e],this.current=this.firstEnabled(),this.onChange.dispatch()}setColumns(e){this.columns_=[...e],this.sortKey_&&!this.columns_.some(e=>e.key===this.sortKey_)&&(this.sortKey_=null),this.onChange.dispatch()}setPageSize(e){this.pageSize_=Math.max(0,e),this.onChange.dispatch()}sortBy(e){let t=this.columns_.find(t=>t.key===e);if(!t)return;this.sortKey_===e?this.ascending=!this.ascending:(this.sortKey_=e,this.ascending=!0);let n=t.compare??((t,n)=>Rz(Lz(t,e),Lz(n,e)));this.rows_.sort((e,t)=>(this.ascending?1:-1)*n(e,t)),this.current=this.firstEnabled(),this.onChange.dispatch()}select(e){e<0||e>=this.rows_.length||this.disabledOf(this.rows_[e])||(this.current=e,this.onChange.dispatch())}move(e){let t=this.rows_.length;if(t===0)return;let n=this.current;for(let r=0;r<t;r++){if(n+=e,n<0||n>=t)return;if(!this.disabledOf(this.rows_[n])){this.current=n,this.onChange.dispatch();return}}}setPage(e){if(this.pageSize_<=0)return;let t=Math.max(0,Math.min(this.pageCount-1,e))*this.pageSize_,n=Math.min(t+this.pageSize_,this.rows_.length);for(let e=t;e<n;e++)if(!this.disabledOf(this.rows_[e])){this.current=e,this.onChange.dispatch();return}}nextPage(e=1){this.setPage(this.page+e)}firstEnabled(){let e=this.rows_.findIndex(e=>!this.disabledOf(e));return e===-1?0:e}};function Lz(e,t){return e&&typeof e==`object`?e[t]:void 0}function Rz(e,t){return e===t?0:e===void 0?-1:t===void 0?1:typeof e==`number`&&typeof t==`number`?e-t:String(e).localeCompare(String(t))}var zz=class{constructor(e){this.onChange=new p,this.expanded=new Set,this.current=0,this.roots_=e.roots;for(let t of e.expanded??[])this.expanded.add(t);this.disabledOf=e.disabled??(()=>!1),this.current=this.firstEnabled()}get roots(){return this.roots_}get rows(){let e=[],t=(n,r)=>{for(let i of n){let n=(i.children?.length??0)>0,a=n&&this.expanded.has(i.id);e.push({node:i,depth:r,expanded:a,hasChildren:n}),a&&t(i.children,r+1)}};return t(this.roots_,0),e}get selectedIndex(){return this.current}get selected(){return this.rows[this.current]?.node??null}isExpanded(e){return this.expanded.has(e)}expand(e){this.expanded.has(e)||(this.expanded.add(e),this.onChange.dispatch())}collapse(e){if(!this.expanded.has(e))return;let t=this.rows[this.current]?.node.id;if(this.expanded.delete(e),t!==void 0&&!this.rows.some(e=>e.node.id===t)){let t=this.rows.findIndex(t=>t.node.id===e);t>=0&&(this.current=t)}this.onChange.dispatch()}toggle(e){this.expanded.has(e)?this.collapse(e):this.expand(e)}expandAll(){let e=t=>{for(let n of t)n.children?.length&&(this.expanded.add(n.id),e(n.children))};e(this.roots_),this.onChange.dispatch()}collapseAll(){this.expanded.clear(),this.select(0),this.onChange.dispatch()}select(e){let t=this.rows[e];t&&!this.disabledOf(t.node)&&(this.current=e,this.onChange.dispatch())}move(e){let t=this.rows.length;if(t===0)return;let n=this.current;for(let r=0;r<t;r++){if(n+=e,n<0||n>=t)return;if(!this.disabledOf(this.rows[n].node)){this.current=n,this.onChange.dispatch();return}}}firstEnabled(){let e=this.rows.findIndex(e=>!this.disabledOf(e.node));return e===-1?0:e}};function Bz(e){switch(e){case`top`:case`bottom`:return{x:.5,y:e===`top`?0:1};case`left`:case`right`:return{x:e===`left`?0:1,y:.5};case`top-left`:return{x:0,y:0};case`top-right`:return{x:1,y:0};case`bottom-left`:return{x:0,y:1};case`bottom-right`:return{x:1,y:1};default:return{x:.5,y:.5}}}function Vz(e,t,n={width:0,height:0}){let r=e.margin??0,i=t.x+r,a=t.y+r,o=Math.max(0,t.width-r*2),s=Math.max(0,t.height-r*2);if(e.anchor===`fill`){let t=i+(e.offsetX??0),n=a+(e.offsetY??0);return{x:t,y:n,width:e.width??Math.max(0,i+o-t),height:e.height??Math.max(0,a+s-n)}}let c=Bz(e.anchor??`center`),l=e.alignX??c.x,u=e.alignY??c.y,d=e.width??n.width,f=e.height??n.height;return{x:i+l*Math.max(0,o-d)+(e.offsetX??0),y:a+u*Math.max(0,s-f)+(e.offsetY??0),width:d,height:f}}var Hz=class{constructor(e){this.spec=e}get columns(){return this.spec.columns}get rows(){return this.spec.rows}columnSizes(e){return Uz(this.spec.columns,e,this.gap)}rowSizes(e){return Uz(this.spec.rows,e,this.gap)}rect(e,t,n,r={}){let i=this.columnSizes(n.width),a=this.rowSizes(n.height),o=r.columnSpan??1,s=r.rowSpan??1;return{x:n.x+Gz(i,t,this.gap),y:n.y+Gz(a,e,this.gap),width:Kz(i,t,o,this.gap),height:Kz(a,e,s,this.gap)}}get gap(){return this.spec.gap??0}};function Uz(e,t,n){let r=n*Math.max(0,e.length-1),i=Math.max(0,t-r),a=e.reduce((e,t)=>e+(t.size??0),0),o=e.reduce((e,t)=>e+(t.grow??0),0),s=Math.max(0,i-a),c=0;return e.map((t,n)=>{if(t.size!==void 0)return t.size;if(!t.grow||o===0)return 0;let r=n===Wz(e)?s-c:Math.floor(s*t.grow/o);return c+=r,r})}function Wz(e){for(let t=e.length-1;t>=0;t--)if(e[t].grow)return t;return-1}function Gz(e,t,n){let r=0;for(let i=0;i<t&&i<e.length;i++)r+=e[i]+n;return r}function Kz(e,t,n,r){let i=0;for(let a=t;a<t+n&&a<e.length;a++)i+=e[a],a>t&&(i+=r);return Math.max(0,i)}function qz(e,t,n={}){let r=n.gap??0,i=n.align??`start`,a=Array(e.length),o=0,s=[],c=0,l=0,u=()=>{if(s.length===0)return;let n=Math.max(0,t-c),u=i===`center`?n/2:i===`end`?n:0;for(let t of s)a[t]={x:u,y:o},u+=e[t].width+r;o+=l+r,s=[],c=0,l=0};return e.forEach((e,n)=>{let i=s.length===0?e.width:c+r+e.width;s.length>0&&i>t&&u(),c=s.length===0?e.width:c+r+e.width,l=Math.max(l,e.height),s.push(n)}),u(),{positions:a,height:Math.max(0,o-r)}}var Jz=[`idle`,`hover`,`pressed`,`disabled`,`selected`,`focused`],Yz=class e{constructor(){this.map=new Map}static{this.ANY=`*`}define(e,t,n){let r=this.map.get(e)??{};r[t]={...r[t],...n},this.map.set(e,r)}has(e){return this.map.has(e)}widgets(){return[...this.map.keys()]}resolve(t,n=`idle`){return this.map.get(t)?.[n]??this.map.get(t)?.idle??this.map.get(e.ANY)?.[n]??this.map.get(e.ANY)?.idle??{}}statesOf(e){let t=this.map.get(e);return t?Jz.filter(e=>t[e]!==void 0):[]}static from(t){let n=new e;for(let[e,r]of Object.entries(t))if(Xz(r))for(let t of Jz){let i=r[t];i&&n.define(e,t,i)}else n.define(e,`idle`,r);return n}};function Xz(e){return Jz.some(t=>e[t]!==void 0)}var Zz=class extends J{constructor(e){super(),this.capturing=null,this.onKeyCaptured=e=>this.capturing?(e.preventDefault(),e.code===`Escape`?this.cancelCapture():this.finishCapture(this.capturing,e.code),!0):!1,this.actions=[...e.actions],this.labelFor=e.label??(e=>e),this.onConflict=e.onConflict??(()=>!0),this.list=new jL({width:e.width,height:e.height,rowHeight:e.rowHeight,items:this.rows()}),this.addChild(this.list)}rows(){return this.actions.map(e=>({text:this.rowText(e),value:e,disabled:this.capturing!==null&&this.capturing!==e}))}rowText(e){if(this.capturing===e)return`${this.labelFor(e)}: press a key...`;let t=Ie(e);return`${this.labelFor(e)}: ${t.length?t.join(`, `):`(unbound)`}`}refresh(){let e=this.list.selectedIndex;this.list.setItems(this.rows()),this.list.select(e)}startCapture(e){this.capturing=e,this.refresh(),queueMicrotask(()=>{this.capturing===e&&xe.add(this.onKeyCaptured)})}cancelCapture(){xe.remove(this.onKeyCaptured),this.capturing=null,this.refresh()}finishCapture(e,t){xe.remove(this.onKeyCaptured),this.capturing=null;let n=Pe(t).filter(t=>t!==e);if(n.length>0&&!this.onConflict(t,e,n))this.refresh();else{for(let e of n)Me(e,Ie(e).filter(e=>e!==t));Me(e,[t]),this.refresh()}}get isCapturing(){return this.capturing!==null}handleAction(e){if(this.capturing)return!0;if(e===`confirm`){let e=this.list.selected?.value;return e&&this.startCapture(e),!0}return this.list.handleAction(e)}destroy(e){xe.remove(this.onKeyCaptured),super.destroy(e)}},Qz=class extends J{constructor(e){super(),this.highlight=new Z,this.main=new J,this.rebindLayer=new J,this.rows=[],this.selected=0,this.rebind=null,this.themeListener=()=>this.drawHighlight(),this.settings=e.settings,this.width_=e.width??320,this.rowHeight=e.rowHeight??36,this.labels={music:`Music`,sfx:`Sound effects`,muted:`Mute`,zoom:`Zoom`,controls:`Controls...`,reset:`Reset to defaults`,rebindHint:`Keys (cancel: back)`,...e.labels},this.zoomMin=e.zoomMin??.5,this.zoomMax=e.zoomMax??4,this.zoomStep=e.zoomStep??.25,this.customRows=e.custom??[],this.actionsOption=e.actions,this.onConflict=e.onConflict,this.addChild(this.highlight),this.addChild(this.main),this.addChild(this.rebindLayer),this.rebindLayer.visible=!1,this.buildMain(),this.refresh(),this.drawHighlight(),$.add(this.themeListener)}get selectedRow(){return this.rows[this.selected]?.id??``}get isRebinding(){return this.rebind!==null}handleAction(e){if(this.rebind)return e===`cancel`&&!this.rebind.isCapturing?(this.closeRebind(),!0):this.rebind.handleAction(e);let t=this.rows[this.selected];if(!t)return!1;switch(e){case`up`:return this.select((this.selected+this.rows.length-1)%this.rows.length),!0;case`down`:return this.select((this.selected+1)%this.rows.length),!0;case`left`:return t.adjust(-1),!0;case`right`:return t.adjust(1),!0;case`confirm`:return t.activate(),!0;default:return!1}}refresh(){for(let e of this.rows)e.refresh()}select(e){this.selected=e,this.drawHighlight()}drawHighlight(){this.rows.length===0?this.highlight.clear():this.highlight.clear().rect(0,this.selected*this.rowHeight,this.width_,this.rowHeight).fill({color:Q().color.selection})}buildMain(){let e=this.settings.current;this.addSliderRow(`music`,this.labels.music,0,100,1,10,Math.round(e.musicVolume*100),e=>this.settings.setMusicVolume(e/100)),this.addSliderRow(`sfx`,this.labels.sfx,0,100,1,10,Math.round(e.sfxVolume*100),e=>this.settings.setSfxVolume(e/100)),this.addToggleRow(`muted`,this.labels.muted,e.muted,e=>this.settings.setMuted(e)),this.addSliderRow(`zoom`,this.labels.zoom,this.zoomMin,this.zoomMax,this.zoomStep,this.zoomStep,e.zoom,e=>this.settings.setZoom(e));for(let e of this.customRows)this.addCustomRow(e);this.addActionRow(`controls`,this.labels.controls,()=>this.openRebind()),this.addActionRow(`reset`,this.labels.reset,()=>{this.settings.reset(),this.refresh()}),this.main.children.forEach((e,t)=>{e.y=t*this.rowHeight})}addSliderRow(e,t,n,r,i,a,o,s){let c=new J,l=new OI({text:t});l.y=10;let u=new kz({width:140,min:n,max:r,step:i,value:o});u.x=this.width_-148,u.y=10,c.addChild(l,u),this.main.addChild(c);let d=()=>{l.setText(`${t}: ${u.value}`)};d(),u.onChange.add(e=>{s(e),d()}),this.rows.push({id:e,root:c,adjust:e=>u.setValue(u.value+e*a),activate:()=>{},refresh:()=>{u.setValue(this.readSlider(e)),d()}})}readSlider(e){let t=this.settings.current;switch(e){case`music`:return Math.round(t.musicVolume*100);case`sfx`:return Math.round(t.sfxVolume*100);case`zoom`:return t.zoom;default:return 0}}addToggleRow(e,t,n,r){let i=new J,a=new OI({text:t});a.y=10;let o=new Az({checked:n});o.x=this.width_-28,o.y=8,i.addChild(a,o),this.main.addChild(i),o.onChange.add(r),this.rows.push({id:e,root:i,adjust:()=>o.toggle(),activate:()=>o.toggle(),refresh:()=>o.setChecked(this.readToggle(e))})}readToggle(e){return e===`muted`?this.settings.current.muted:this.settings.getCustom(e.slice(7),!1)===!0}addCustomRow(e){let t=`custom:${e.key}`;if(e.kind===`boolean`){let n=this.settings.getCustom(e.key,!1);this.addToggleRow(t,e.label,n===!0,t=>this.settings.setCustom(e.key,t))}else if(e.kind===`number`){let n=this.settings.getCustom(e.key,e.min),r=typeof n==`number`?n:e.min,i=e.step??0,a=i>0?i:(e.max-e.min)/20,o=new J,s=new OI({text:e.label});s.y=10;let c=new kz({width:140,min:e.min,max:e.max,step:e.step??0,value:r});c.x=this.width_-148,c.y=10,o.addChild(s,c),this.main.addChild(o);let l=()=>{s.setText(`${e.label}: ${c.value}`)};l(),c.onChange.add(t=>{this.settings.setCustom(e.key,t),l()}),this.rows.push({id:t,root:o,adjust:e=>c.setValue(c.value+e*a),activate:()=>{},refresh:()=>{let t=this.settings.getCustom(e.key,e.min);c.setValue(typeof t==`number`?t:e.min),l()}})}else{let n=e.options,r=new J,i=new OI({text:e.label});i.y=10;let a=new Nz({min:0,max:n.length-1,step:1,value:0,wrap:!0});a.x=this.width_-32,a.y=2,r.addChild(i,a),this.main.addChild(r);let o=e=>{let t=typeof e==`string`?n.indexOf(e):-1;return t>=0?t:0},s=()=>{i.setText(`${e.label}: ${n[a.value]}`)};a.setValue(o(this.settings.getCustom(e.key,n[0]))),s(),a.onChange.add(t=>{this.settings.setCustom(e.key,n[t]),s()}),this.rows.push({id:t,root:r,adjust:e=>e>0?a.increment():a.decrement(),activate:()=>a.increment(),refresh:()=>{a.setValue(o(this.settings.getCustom(e.key,n[0]))),s()}})}}addActionRow(e,t,n){let r=new J,i=new gz({width:this.width_-16,height:28,text:t,onClick:n});i.x=8,i.y=4,r.addChild(i),this.main.addChild(r),this.rows.push({id:e,root:r,adjust:()=>{},activate:n,refresh:()=>{}})}openRebind(){let e=this.actionsOption??Object.keys(this.settings.current.bindings),t=new OI({text:this.labels.rebindHint}),n=new Zz({width:this.width_,height:Math.max(1,e.length)*this.rowHeight,actions:e,onConflict:this.onConflict});t.y=0,n.y=this.rowHeight,this.rebindLayer.addChild(t,n),this.rebindLayer.visible=!0,this.main.visible=!1,this.highlight.visible=!1,this.rebind=n}closeRebind(){this.settings.setBindings(Le()),this.rebindLayer.removeChildren(),this.rebind?.destroy(),this.rebind=null,this.rebindLayer.visible=!1,this.main.visible=!0,this.highlight.visible=!0}destroy(e){$.remove(this.themeListener),this.rebind?.destroy(),this.rebind=null,super.destroy(e)}},$z=class extends J{constructor(e){if(super(),this.emptyLayer=new J,this.filledLayer=new J,this.maskShape=new Z,this.themeListener=()=>this.draw(),e.filledTexture===void 0!=(e.emptyTexture===void 0))throw Error(`a Meter takes filledTexture and emptyTexture together, or neither`);this.count_=tB(e.count),this.size_=e.size??16,this.gap_=e.gap??4,this.value_=eB(e.value??this.count_,this.count_),this.explicitColor=e.color!==void 0,this.fillColor=e.color??Q().color.textHighlight,this.emptyColor_=e.emptyColor,this.filledTexture=e.filledTexture,this.emptyTexture=e.emptyTexture,this.addChild(this.emptyLayer),this.addChild(this.filledLayer),this.addChild(this.maskShape),this.filledLayer.mask=this.maskShape,this.draw(),$.add(this.themeListener)}get value(){return this.value_}get count(){return this.count_}get color(){return this.fillColor}setValue(e,t=this.count_){this.count_=tB(t),this.value_=eB(e,this.count_),this.draw()}setColor(e){this.explicitColor=!0,this.fillColor=e,this.draw()}resize(e,t=this.gap_){this.size_=e,this.gap_=t,this.draw()}get totalWidth(){return this.count_*this.size_+(this.count_-1)*this.gap_}iconX(e){let t=e*(this.size_+this.gap_);return Q().direction===`rtl`?this.totalWidth-t-this.size_:t}draw(){let e=Q();this.explicitColor||(this.fillColor=e.color.textHighlight);let t=this.emptyColor_??e.color.panelFill;this.emptyLayer.removeChildren(),this.filledLayer.removeChildren();for(let e=0;e<this.count_;e++){let n=this.iconX(e);this.emptyLayer.addChild(this.icon(n,t,this.emptyTexture,!1)),this.filledLayer.addChild(this.icon(n,this.fillColor,this.filledTexture,!0))}let n=this.totalWidth*(this.count_>0?this.value_/this.count_:0),r=e.direction===`rtl`?this.totalWidth-n:0;this.maskShape.clear().rect(r,0,n,this.size_).fill({color:16777215})}icon(e,t,n,r){if(n){let i=new wl(n);return i.x=e,i.width=this.size_,i.height=this.size_,r&&this.explicitColor&&(i.tint=t),i}let i=new Z,a=this.size_/2;return i.circle(e+a,a,a).fill({color:t}),i}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function eB(e,t){return Number.isFinite(e)?Math.max(0,Math.min(t,e)):t}function tB(e){return Number.isFinite(e)?Math.max(1,Math.floor(e)):1}var nB=class extends J{constructor(e){super(),this.track=new Z,this.fill=new Z,this.themeListener=()=>this.draw(),this.width_=e.width,this.height_=e.height,this.explicitColor=e.color!==void 0,this.fillColor=e.color??Q().color.textHighlight,this.fraction=kn((e.value??1)/(e.max??1),0,1),this.fillTexture=e.fillTexture,this.backgroundTexture=e.backgroundTexture,this.background_=e.background,this.roundUpToPixel=e.roundUpToPixel??!1,this.addChild(this.track),this.addChild(this.fill),this.draw(),$.add(this.themeListener)}get value(){return this.fraction}setValue(e,t=1){this.fraction=kn(t>0?e/t:0,0,1),this.draw()}get color(){return this.fillColor}setColor(e){this.explicitColor=!0,this.fillColor=e,this.draw()}get background(){return this.background_??Q().color.panelFill}setBackground(e){this.background_=e,this.draw()}resize(e,t){this.width_=e,this.height_=t,this.draw()}draw(){let e=Q();if(this.explicitColor||(this.fillColor=e.color.textHighlight),this.track.clear().rect(0,0,this.width_,this.height_),this.track.fill(this.backgroundTexture?{texture:this.backgroundTexture}:{color:this.background}),this.fill.clear(),this.fraction>0){let t=this.width_*this.fraction,n=this.roundUpToPixel?Math.ceil(t):t,r=e.direction===`rtl`?this.width_-n:0;this.fill.rect(r,0,n,this.height_),this.fill.fill(this.fillTexture?this.explicitColor?{texture:this.fillTexture,color:this.fillColor}:{texture:this.fillTexture}:{color:this.fillColor})}}destroy(e){$.remove(this.themeListener),super.destroy(e)}};function rB(e,t){return t<=0?1-e:t>=1||e<=t?1:1-(e-t)/(1-t)}function iB(e,t,n=!1){return n||e<=0?0:-t*e}function aB(e,t,n){return n<=0?e:Math.max(e,Math.min(n,t))}var oB=class extends J{constructor(e){super(),this.rising=new J,this.elapsed=0,this.done=!1,this.duration=e.duration??.8,this.rise=e.rise??24,this.hold=kn(e.hold??0,0,1);let t=new OI({text:e.text,color:e.color,size:e.size});t.anchor.set(.5),this.rising.addChild(t),this.addChild(this.rising)}get finished(){return this.done}get riseOffset(){return this.rising.y}ageAtLeast(e){this.elapsed=aB(this.elapsed,this.duration,e)}update(e){if(this.done)return;this.elapsed=Math.min(this.duration,this.elapsed+e);let t=this.duration>0?this.elapsed/this.duration:1;this.rising.y=iB(t,this.rise,br()),this.alpha=rB(t,this.hold),t>=1&&(this.done=!0,this.parent?.removeChild(this),this.destroy({children:!0}))}},sB=4;function cB(e){return Math.max(0,e)/5}function lB(e,t,n=4){let r=t.y-t.height/2;return e.y+e.height/2+n<=r?e.y:r-e.height/2-n}function uB(e,t,n=4){let r=[];if(t.key===void 0)return r;let i=t;for(let a=e.length-1;a>=0;a--){let o=e[a];if(o.key!==t.key)continue;let s=lB(o,i,n);if(s===o.y)break;r.push({index:a,y:s,ageAtLeast:cB(r.length+1)}),i={...o,y:s}}return r}var dB=class extends J{constructor(...e){super(...e),this.live=[]}push(e){let t=new oB({text:e.text,color:e.color,size:e.size,duration:e.duration,rise:e.rise,hold:e.hold});e.scale!==void 0&&t.scale.set(e.scale);let n={key:e.key,x:e.x,y:e.y,height:t.height};for(let e of uB(this.live.map(e=>e.entry),n)){let t=this.live[e.index];t.entry.y=e.y,t.popup.y=e.y,t.popup.ageAtLeast(e.ageAtLeast)}return t.position.set(e.x,e.y),this.addChild(t),this.live.push({popup:t,entry:n}),t}update(e){for(let{popup:t}of this.live)t.update(e);for(let e=this.live.length-1;e>=0;e--)this.live[e].popup.finished&&this.live.splice(e,1)}get count(){return this.live.length}clear(){for(let{popup:e}of this.live)this.removeChild(e),e.destroy({children:!0});this.live.length=0}},fB=class extends J{constructor(e={}){super(),this.queue=[],this.current=null,this.phase=`fadeIn`,this.elapsed=0,this.fadeIn=e.fadeIn??.25,this.hold=e.hold??1,this.fadeOut=e.fadeOut??1.75,this.scaleFrom=e.scaleFrom??2}show(e){this.queue.push(e),this.current||this.start(this.queue.shift())}get isBusy(){return this.current!==null||this.queue.length>0}start(e){this.current=e,this.phase=`fadeIn`,this.elapsed=0,this.addChild(e),e.alpha=this.fadeIn>0?0:1,e.scale.set(this.fadeIn>0?this.scaleFrom:1)}update(e){let t=this.current;if(!t)return;if(this.elapsed+=e,this.phase===`fadeIn`){let e=this.fadeIn,n=e>0?Math.min(1,this.elapsed/e):1,r=Er.easeOutCubic(n);t.alpha=r,t.scale.set(this.scaleFrom+(1-this.scaleFrom)*r),n>=1&&this.advance();return}if(this.phase===`hold`){this.elapsed>=this.hold&&this.advance();return}let n=this.fadeOut,r=n>0?Math.min(1,this.elapsed/n):1;t.alpha=1-r,r>=1&&this.finish()}advance(){this.phase=this.phase===`fadeIn`?`hold`:`fadeOut`,this.elapsed=0}finish(){let e=this.current;if(!e)return;this.removeChild(e),e.destroy({children:!0}),this.current=null;let t=this.queue.shift();t&&this.start(t)}},pB=class extends J{constructor(e={}){super(),this.viewWidth=0,this.viewHeight=0,this.panelWidth=0,this.panelHeight=0,this.pending=null,this.waited=0,this.delay=e.delay??.4,this.maxWidth=e.maxWidth??200,this.offsetX=e.offset?.x??12,this.offsetY=e.offset?.y??16,this.margin=e.margin??4,this.panel=new TL({width:0,height:0,modal:!1,closable:!1,dims:!1}),this.body=new OI({text:``,wrapWidth:this.maxWidth}),this.panel.content.addChild(this.body),this.addChild(this.panel),this.visible=!1}setViewport(e,t){this.viewWidth=e,this.viewHeight=t,this.visible&&this.place()}hover(e,t,n,r=this.delay){this.pending&&this.pending.text===e?(this.pending.x=t,this.pending.y=n,this.visible&&this.place()):(this.pending={text:e,x:t,y:n,delay:r},this.waited=0,this.visible=!1)}leave(){this.pending=null,this.waited=0,this.visible=!1}get isShowing(){return this.visible}get text(){return this.pending?.text??null}get panelPosition(){return{x:this.panel.x,y:this.panel.y}}get size(){return{width:this.panelWidth,height:this.panelHeight}}update(e){if(!this.pending||this.visible||(this.waited+=e,this.waited<this.pending.delay))return!1;this.body.setText(this.pending.text);let t=Q(),n=(t.panel?t.panelBorder:2)+t.padding,r=this.measureBody();return this.panelWidth=Math.ceil(r.width)+n*2,this.panelHeight=Math.ceil(r.height)+n*2,this.panel.resize(this.panelWidth,this.panelHeight),this.visible=!0,this.place(),!0}measureBody(){return{width:this.body.width,height:this.body.height}}place(){let e=this.pending;if(!e)return;let t=this.panelWidth,n=this.panelHeight,r=e.x+this.offsetX,i=e.y+this.offsetY;this.viewWidth>0&&(r+t+this.margin>this.viewWidth&&(r=e.x-this.offsetX-t),r=Math.max(this.margin,Math.min(r,Math.max(this.margin,this.viewWidth-t-this.margin)))),this.viewHeight>0&&(i+n+this.margin>this.viewHeight&&(i=e.y-this.offsetY-n),i=Math.max(this.margin,Math.min(i,Math.max(this.margin,this.viewHeight-n-this.margin)))),this.panel.x=r,this.panel.y=i}},mB=class extends J{constructor(e={}){super(),this.targets=[],this.tooltip=e.tooltip??new pB,this.longPress=e.longPress??.5,this.addChild(this.tooltip)}add(e){return this.targets.push(e),()=>{let t=this.targets.indexOf(e);t>=0&&this.targets.splice(t,1)}}addButton(e){return this.add({bounds:()=>{let t=e.getBounds();return{x:t.x,y:t.y,width:t.width,height:t.height}},text:()=>e.tooltip,active:()=>{for(let t=e;t;t=t.parent)if(!t.visible)return!1;return!0}})}targetAt(e,t){for(let n=this.targets.length-1;n>=0;n--){let r=this.targets[n];if(r.active&&!r.active())continue;let i=r.bounds();if(e>=i.x&&e<=i.x+i.width&&t>=i.y&&t<=i.y+i.height)return r.text()===void 0?null:r}return null}pointerMove(e,t){let n=this.targetAt(e,t)?.text();n?this.tooltip.hover(n,e,t):this.tooltip.leave()}pointerDown(e,t){let n=this.targetAt(e,t)?.text();n?this.tooltip.hover(n,e,t,this.longPress):this.tooltip.leave()}pointerUp(){this.tooltip.leave()}attach(e){let t=e=>this.pointerMove(e.x,e.y),n=e=>this.pointerDown(e.x,e.y),r=()=>this.pointerUp();return e.move.add(t),e.down.add(n),e.up.add(r),()=>{e.move.remove(t),e.down.remove(n),e.up.remove(r)}}update(e){return this.tooltip.update(e)}},hB=class extends J{constructor(e){super(),this.topics=e.topics;let t=e.listWidth??Math.floor(e.width/3),n=e.width-t-Q().spacing,r=Q().direction===`rtl`;this.list=new jL({width:t,height:e.height,items:this.topics.map(e=>({text:e.title})),onHighlight:(e,t)=>this.showBody(t),onSelect:(e,t)=>this.showBody(t)}),this.list.x=r?e.width-t:0,this.addChild(this.list),this.body=new OI({wrapWidth:n}),this.body.x=r?0:t+Q().spacing,this.addChild(this.body),this.topics.length>0&&this.showBody(this.list.selectedIndex)}showBody(e){this.body.setText(this.topics[e]?.body??``)}handleAction(e){return this.list.handleAction(e)}},gB=class e extends J{constructor(t){super(),this.text=new OI({text:e.format(t.stats),wrapWidth:t.width}),this.addChild(this.text)}setStats(t,n){this.text.setText(e.format(t)),n!==void 0&&(this.text.style.wordWrapWidth=n)}static format(e){return e.map(e=>`${e.label}: ${e.value}`).join(`
|
|
1386
|
+
`)}},_B=class extends J{constructor(e){super(),this.backdrop=new Z,this.progress=new nB({width:240,height:10,value:0}),this.width_=e.width,this.height_=e.height,this.onRetry=e.onRetry,this.onCancel=e.onCancel,this.title=new OI({text:e.title??`Loading`,size:18,bold:!0,align:`center`}),this.status=new OI({text:`Preparing...`,align:`center`}),this.addChild(this.backdrop,this.title,this.status,this.progress),this.layout()}setSnapshot(e){let t=e.total>0?e.completed/e.total:0;this.progress.setValue(t),e.status===`failed`?this.status.setText(`Loading failed. Retry or cancel.`):e.status===`cancelled`?this.status.setText(`Loading cancelled.`):e.status===`ready`?this.status.setText(`Ready`):this.status.setText(e.current?`Loading ${e.current}...`:`Preparing...`)}bind(e){this.setSnapshot(e.snapshot);let t=e=>this.setSnapshot(e);return e.changed.add(t),()=>e.changed.remove(t)}retry(){this.onRetry?.()}cancel(){this.onCancel?.()}resize(e,t){this.width_=e,this.height_=t,this.layout()}layout(){let e=Q().color;this.backdrop.clear().rect(0,0,this.width_,this.height_).fill({color:e.overlay,alpha:.92});let t=this.width_/2,n=this.height_/2;this.title.anchor.set(.5),this.status.anchor.set(.5),this.title.position.set(t,n-36),this.status.position.set(t,n-8),this.progress.position.set(t-120,n+16)}};function vB(e,t={}){return n=>new Promise(r=>{e.push(new mz({width:t.width??480,height:t.height??120,speed:t.speed??45,pages:[{text:n.text,speaker:n.speaker,portrait:n.portrait}],choices:n.choices,anchor:t.anchor??`bottom`,onDone:e=>r(e)}))})}function yB(e){let t=e/255;return t<=.03928?t/12.92:((t+.055)/1.055)**2.4}function bB(e){return .2126*yB(e>>16&255)+.7152*yB(e>>8&255)+.0722*yB(e&255)}function xB(e,t){let[n,r]=[bB(e),bB(t)].sort((e,t)=>t-e);return(n+.05)/(r+.05)}function SB(e,t,n=`AA`,r=!1){let i=n===`AAA`?r?4.5:7:r?3:4.5;return xB(e,t)>=i}function CB(e,t,n,r=`…`){if(n(e)<=t)return e;let i=0,a=e.length;for(;i<a;){let o=Math.ceil((i+a)/2);n(e.slice(0,o).trimEnd()+r)<=t?i=o:a=o-1}return i===0?r:e.slice(0,i).trimEnd()+r}function wB(e,t,n,r,i=`…`){let a=[],o=``;for(let n of e.split(/\s+/).filter(Boolean)){let e=o?`${o} ${n}`:n;r(e)<=t||!o?o=e:(a.push(o),o=n)}if(o&&a.push(o),a.length<=n)return a.map(e=>CB(e,t,r,i));let s=a.slice(0,n),c=a.slice(n-1).join(` `);return s[n-1]=CB(c+i,t,r,i),s}function TB(e,t,n,r=40,i=1){let a=e-t;if(a<=0)return 0;let o=a/r,s=2*(i+o),c=(n%s+s)%s;return c<i?0:c<i+o?(c-i)*r:c<2*i+o?a:a-(c-2*i-o)*r}var EB=class extends J{constructor(e){super(),this.width_=e.width,this.maxHeight=e.maxHeight,this.body=new OI({...e.label,text:e.text??``,wrapWidth:e.width-10}),this.box=new kL({width:e.width,height:e.maxHeight,autoHeight:!0,touch:e.touch??!0,keyboard:!0}),this.box.content.addChild(this.body),this.addChild(this.box),this.measure()}measureHeight(){return this.body.height}measure(){this.box.setContentHeight(this.measureHeight())}get viewWidth(){return this.width_}resize(e){this.width_=e,this.body.setWrapWidth(e-10),this.box.resize(e,this.maxHeight),this.measure()}setText(e){this.body.setText(e),this.measure(),this.box.scrollTo(0)}update(e){this.box.update(e)}},DB=class extends J{constructor(e){super(),this.clip=new Z,this.source=``,this.fullWidth=0,this.time=0,this.width_=e.width,this.speed=e.speed??40,this.pause=e.pause??1,this.labelOptions=e.label??{},this.body=new OI({...this.labelOptions,text:``}),this.clip.rect(0,0,e.width,4096).fill({color:16777215}),this.addChild(this.body,this.clip),this.body.mask=this.clip,this.setText(e.text??``)}measureWidth(e){let t=new OI({...this.labelOptions,text:e}),n=t.width;return t.destroy(),n}setText(e){this.source=e,this.fullWidth=this.measureWidth(e),this.time=0,this.apply()}apply(){br()?(this.body.setText(CB(this.source,this.width_,e=>this.measureWidth(e))),this.body.x=0):(this.body.setText(this.source),this.body.x=-TB(this.fullWidth,this.width_,this.time,this.speed,this.pause))}get shift(){return 0-this.body.x}update(e){this.time+=e,this.apply()}},OB={farLeft:.12,left:.28,center:.5,right:.72,farRight:.88},kB=class extends J{constructor(e,t){super(),this.backdropLayer=new J,this.actorLayer=new J,this.backdrop=null,this.outgoingBackdrop=null,this.actors=new Map,this.definitions=new Map,this.focused=null,this.tweener=new Dr,this.dimAmount=.45,this.stageWidth=e,this.stageHeight=t,this.addChild(this.backdropLayer),this.addChild(this.actorLayer)}defineCharacter(e,t){this.definitions.set(e,t)}resize(e,t){this.stageWidth=e,this.stageHeight=t;for(let e of[this.backdrop,this.outgoingBackdrop])e&&this.fitBackdrop(e);for(let e of this.actors.values())this.placeActor(e)}setBackdrop(e,t=.4){this.outgoingBackdrop?.destroy();let n=this.backdrop;this.outgoingBackdrop=n;let r=new wl(e);this.fitBackdrop(r),this.backdrop=r,this.backdropLayer.addChild(r);let i=()=>{this.outgoingBackdrop===n&&(n?.destroy(),this.outgoingBackdrop=null)};return t<=0?(i(),Promise.resolve()):(r.alpha=0,this.tweener.tween(t,e=>{r.alpha=e}).then(i))}fitBackdrop(e){let t=e.texture,n=Math.max(this.stageWidth/t.width,this.stageHeight/t.height);e.scale.set(n),e.x=Math.round((this.stageWidth-t.width*n)/2),e.y=Math.round((this.stageHeight-t.height*n)/2)}show(e,t={}){let n=this.definitions.get(e);if(!n)throw Error(`no character defined as "${e}"`);let r=t.expression??Object.keys(n.expressions)[0],i=this.actors.get(e);if(i)return t.at!==void 0&&(i.slot=this.slotOf(t.at)),this.setExpression(e,r),this.placeActor(i),Promise.resolve();let a=new wM(n.sheet.get(n.expressions[r])),o={id:e,sprite:a,definition:n,slot:this.slotOf(t.at??`center`),expression:r};this.actors.set(e,o),this.actorLayer.addChild(a),this.placeActor(o),this.applyFocus();let s=t.fade??.25;return s<=0?Promise.resolve():(a.alpha=0,this.tweener.tween(s,e=>{a.alpha=e}))}hide(e,t=.25){let n=this.actors.get(e);return n?(this.actors.delete(e),this.focused===e&&(this.focused=null),this.applyFocus(),t<=0?(n.sprite.destroy(),Promise.resolve()):this.tweener.tween(t,e=>{n.sprite.alpha=1-e}).then(()=>n.sprite.destroy())):Promise.resolve()}hideAll(e=.25){return Promise.all([...this.actors.keys()].map(t=>this.hide(t,e))).then(()=>void 0)}setExpression(e,t){let n=this.actors.get(e);if(!n)return;let r=n.definition.expressions[t];if(r===void 0)throw Error(`character "${e}" has no expression "${t}"`);n.expression=t,n.sprite.texture=n.definition.sheet.get(r)}focus(e){this.focused=e,this.applyFocus()}applyFocus(){let e=Math.round(255*(1-this.dimAmount)),t=e<<16|e<<8|e;for(let e of this.actors.values()){let n=this.focused!==null&&e.id!==this.focused;e.sprite.tint=n?t:16777215}}slotOf(e){return typeof e==`number`?e:OB[e]}placeActor(e){let t=e.definition,n=(t.height??.7)*this.stageHeight,r=n/t.sheet.frameHeight;e.sprite.scale.set(r),e.sprite.x=Math.round(e.slot*this.stageWidth-t.sheet.frameWidth*r/2),e.sprite.y=Math.round((t.baseline??.92)*this.stageHeight-n)}update(e){this.tweener.update(e)}get isBusy(){return this.tweener.isBusy}},AB=class{constructor(e){this.state={answers:{}},this.cancelled=!1,this.historyLog=[],this.seenLines=new Set,this.skipSeen=!1,this.options=e}cancel(){this.cancelled=!0}get history(){return this.historyLog}async showLast(){let e=this.historyLog.at(-1);if(!e)return!1;let{windows:t}=this.options;return await new Promise(n=>{t.push(new mz({width:this.options.boxWidth??480,height:this.options.boxHeight??120,speed:0,pages:[{text:e.text,speaker:e.speaker}],dims:!1,anchor:`bottom`,onDone:()=>n()}))}),!0}async run(e){for(let t of e){if(this.cancelled)break;let e=await this.step(t);if(e!==void 0)throw Error(`a "goto ${e}" only runs inside runStory, not a straight run`)}return this.state}async runStory(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))throw Error(`this story has no passage named "${t}"`);let n=e[t],r=0;for(;r<n.length&&!this.cancelled;){let t=await this.step(n[r]);if(r++,t!==void 0){if(!Object.prototype.hasOwnProperty.call(e,t))throw Error(`this story has no passage named "${t}"`);n=e[t],r=0}}return this.state}async step(e){let{stage:t}=this.options;if(`backdrop`in e)await t.setBackdrop(this.options.backdrop(e.backdrop),e.fade);else if(`show`in e)await t.show(e.show,{at:e.at,expression:e.expression,fade:e.fade});else if(`hide`in e)await t.hide(e.hide,e.fade);else if(`hideAll`in e)await t.hideAll(e.fade);else if(`expression`in e)t.setExpression(e.of,e.expression);else if(`say`in e)await this.speak(e.say,e.as,e.speaker),this.recordHistory(e.say,e.as,e.speaker);else{if(`ask`in e){let t=await this.speak(e.ask,e.as,e.speaker,e.choices);return this.recordHistory(e.ask,e.as,e.speaker,t),e.store&&(this.state.answers[e.store]=t),e.choices.find(e=>(e.value??e.text)===t)?.goto}if(`goto`in e)return e.goto;`wait`in e?await new Promise(t=>setTimeout(t,e.wait*1e3)):`call`in e&&await e.call(this.state)}}recordHistory(e,t,n,r){let i=n??(t?this.options.displayName?.(t)??t:void 0);this.seenLines.add(jB(t,e)),this.historyLog.push({text:e,speaker:i,chosen:r})}speak(e,t,n,r){let{stage:i,windows:a}=this.options;i.focus(t??null);let o=n??(t?this.options.displayName?.(t)??t:void 0),s=this.skipSeen&&!r&&this.seenLines.has(jB(t,e));return new Promise(t=>{a.push(new mz({width:this.options.boxWidth??480,height:this.options.boxHeight??120,speed:s?0:this.options.speed??45,autoAdvance:s?0:void 0,mode:this.options.mode,pages:[{text:e,speaker:o}],choices:r,dims:!1,anchor:`bottom`,onDone:e=>t(e)}))})}};function jB(e,t){return`${e??``}\u0000${t}`}function MB(e){let{story:t,start:n,title:r}=Gr(e);return r===void 0?{story:t,start:n}:{story:t,start:n,title:r}}function NB(e){return Wr(e).map(e=>e.speaker===void 0?{say:e.text}:{say:e.text,as:e.speaker})}function PB(e,t={}){let n={},r=e=>{for(let t of e)`say`in t?n[t.say]=t.say:`ask`in t&&(n[t.ask]=t.ask)};if(Array.isArray(e))r(e);else for(let t of Object.values(e))r(t);return{locale:t.locale??`en`,direction:t.direction??`ltr`,messages:n}}var FB=class{constructor(e){this.onChange=new p,this.onMusic=new p,this.index=0,this.beats=e}get length(){return this.beats.length}get position(){return this.index}get current(){return this.beats[this.index]??null}get done(){return this.beats.length===0||this.index>=this.beats.length-1}get music(){return this.current?.music??null}goTo(e){let t=Math.max(0,Math.min(this.beats.length-1,e));this.index=t,this.report()}advance(){return!this.done&&(this.goTo(this.index+1),!0)}back(){return this.index!==0&&(this.goTo(this.index-1),!0)}skip(){this.goTo(this.beats.length-1)}restart(){this.goTo(0)}report(){let e=this.current;e&&this.onChange.dispatch(e),this.onMusic.dispatch(this.music)}},IB=class extends J{constructor(e){super(),this.backdrop=new wl(q.EMPTY),this.handleAdvance=()=>{this.advance()},this.handleBeat=e=>{this.applyBeat(e)},this.sequence=e.sequence,this.textureFor=e.textureFor??(()=>null),this.playMusic=e.playMusic??(()=>{}),this.width_=e.width,this.height_=e.height,this.titleLabel=new OI({text:``,color:Q().color.textHighlight}),this.textLabel=new OI({text:``,wrapWidth:this.width_*.8}),this.addChild(this.backdrop),this.addChild(this.titleLabel),this.addChild(this.textLabel),this.eventMode=`static`,this.on(`pointertap`,this.handleAdvance),this.sequence.onChange.add(this.handleBeat),this.sequence.onMusic.add(this.playMusic),this.applyBeat(this.sequence.current)}get current(){return this.sequence.current}advance(){return this.sequence.advance()}skip(){this.sequence.skip()}resize(e,t){this.width_=e,this.height_=t,this.applyBeat(this.current)}applyBeat(e){if(!e){this.backdrop.visible=!1;return}let t=e.image?this.textureFor(e.image):null;if(this.backdrop.visible=t!==null,t){this.backdrop.texture=t;let e=Math.max(this.width_/t.width,this.height_/t.height);this.backdrop.scale.set(e),this.backdrop.x=(this.width_-t.width*e)/2,this.backdrop.y=(this.height_-t.height*e)/2}this.titleLabel.setText(e.title??``),this.titleLabel.x=this.width_*.1,this.titleLabel.y=this.height_*.12,this.textLabel.setText(e.text),this.textLabel.x=this.width_*.1,this.textLabel.y=this.height_*.24,this.textLabel.style.wordWrapWidth=this.width_*.8}destroy(e){this.sequence.onChange.remove(this.handleBeat),this.sequence.onMusic.remove(this.playMusic),super.destroy(e)}},LB=[[1,0],[1,-1],[0,-1],[-1,-1],[-1,0],[0,1]],RB=[[1,1],[1,0],[0,-1],[-1,0],[-1,1],[0,1]];function zB(e){return e===4?sr:lr}var BB={passable:!1,transparent:!1},VB={passable:!0,transparent:!0},HB=class e{constructor(e,t,n,r=0,i=`square`,a){if(this.rooms=[],this.width=e,this.shape=i,this.height=t,a!==void 0&&(!Number.isFinite(a)||a<0))throw Error(`viewDistance must be a finite non-negative number`);this.viewDistance=a,this.kinds=n,this.terrain=new Uint8Array(e*t).fill(r)}get cellCount(){return this.width*this.height}index(e,t){return nr(this.width,e,t)}xOf(e){return rr(this.width,e)}yOf(e){return ir(this.width,e)}inside(e,t){return tr(this.width,this.height,e,t)}neighbors(e,t,n=8){return this.shape===`hex`?Jn(e,t):zB(n).map(([n,r])=>({x:e+n,y:t+r}))}forEachNeighbor(e,t,n,r){let i=this.shape===`hex`?e&1?RB:LB:zB(n);for(let[n,a]of i)r(e+n,t+a)}insideWithBorder(e,t){return e>0&&t>0&&e<this.width-1&&t<this.height-1}get(e,t){return this.inside(e,t)?this.terrain[this.index(e,t)]:0}set(e,t,n){this.inside(e,t)&&(this.terrain[this.index(e,t)]=n)}kindAt(e,t){return this.kinds[this.get(e,t)]??BB}passable(e,t){return this.inside(e,t)&&this.kindAt(e,t).passable}transparent(e,t){return this.inside(e,t)&&this.kindAt(e,t).transparent}fillRect(e,t){for(let n=e.top;n<=e.bottom;n++)for(let r=e.left;r<=e.right;r++)this.set(r,n,t)}passableCells(){let e=[];for(let t=0;t<this.terrain.length;t++)this.kinds[this.terrain[t]]?.passable&&e.push(t);return e}toJSON(){return{width:this.width,height:this.height,shape:this.shape,terrain:[...this.terrain],rooms:this.rooms.map(e=>({...e})),...this.viewDistance===void 0?{}:{viewDistance:this.viewDistance}}}static fromJSON(t,n){let r=new e(n.width,n.height,t,0,n.shape,n.viewDistance);return r.terrain.set(n.terrain.slice(0,r.terrain.length)),r.rooms=n.rooms.map(e=>({...e})),r}};function UB(e){return{x:Math.floor((e.left+e.right)/2),y:Math.floor((e.top+e.bottom)/2)}}function WB(e,t,n=0){return!(e.right+n<t.left||t.right+n<e.left||e.bottom+n<t.top||t.bottom+n<e.top)}_e();var GB={id:`hall`,paint:(e,t,n)=>e.fillRect(t,n)};function KB(e){return Math.min(e.right-e.left+1,e.bottom-e.top+1)}function qB(e){return Math.max(e.right-e.left+1,e.bottom-e.top+1)}function JB(e,t){let n=KB(t),r=qB(t);return e.filter(e=>n>=(e.minSize??0)&&r<=(e.maxSize??1/0))}function YB(e,t){let n=JB(e,t);if(n.length===0)return null;let r=ie(n.map(e=>e.weight??1));return r===null?null:n[r]}_e();var XB=[{passable:!1,transparent:!1},{passable:!0,transparent:!0}];function ZB(e){let{width:t,height:n,rooms:r=14,minRoomSize:i=4,maxRoomSize:a=10,extraCorridors:o=3,wall:s=0,floor:c=1,kinds:l=[],hooks:u,builders:d}=e,f=new HB(t,n,[...XB,...l],s,e.shape),p=[],m=[],h=[],g=0;for(let e=0;e<r*6&&p.length<r;e++){let e=ne(i,a),r=ne(i,a),o=O(1,Math.max(2,t-e-1)),s=O(1,Math.max(2,n-r-1)),l={left:o,top:s,right:o+e-1,bottom:s+r-1};if(l.right>=t-1||l.bottom>=n-1||p.some(e=>WB(l,e,2))){g++;continue}p.push(l);let m=(d?.length?YB(d,l):null)??GB;m.paint(f,l,c),h.push(m.id),u?.onRoomPlaced?.(l,p.length-1)}for(let e=1;e<p.length;e++){$B(f,UB(p[e-1]),UB(p[e]),c);let t={a:e-1,b:e,extra:!1};m.push(t),u?.onCorridorCarved?.(t,p[e-1],p[e])}for(let e=0;e<o&&p.length>2;e++){let e=O(p.length),t=O(p.length);if(e!==t){$B(f,UB(p[e]),UB(p[t]),c);let n={a:e,b:t,extra:!0};m.push(n),u?.onCorridorCarved?.(n,p[e],p[t])}}return f.rooms=p,{level:f,graph:m,retries:g,roomBuilders:h}}function QB(e){return ZB(e).level}function $B(e,t,n,r){let i=A(.5);if(e.shape===`hex`){let a=i?{x:n.x,y:t.y}:{x:t.x,y:n.y};for(let i of[...Zn(t,a),...Zn(a,n)])e.insideWithBorder(i.x,i.y)&&e.set(i.x,i.y,r)}else i?(eV(e,t.x,n.x,t.y,!0,r),eV(e,t.y,n.y,n.x,!1,r)):(eV(e,t.y,n.y,t.x,!1,r),eV(e,t.x,n.x,n.y,!0,r))}function eV(e,t,n,r,i,a){let o=t<=n?1:-1;for(let s=t;s!==n+o;s+=o){let t=i?s:r,n=i?r:s;e.insideWithBorder(t,n)&&e.set(t,n,a)}}function tV(e,t=new Set){let n=e.passableCells().filter(e=>!t.has(e));return n.length>0?n[O(n.length)]:null}function nV(e,t){let n=null,r=-1;for(let i of e.rooms){let a=UB(i),o=e.shape===`hex`?Yn(a,t):(a.x-t.x)**2+(a.y-t.y)**2;o>r&&(r=o,n=i)}return n}_e();function rV(e,t){return[[e,t-1],[e,t+1],[e-1,t],[e+1,t]]}function iV(e,t){return Jn(e,t).map(e=>[e.x,e.y])}var aV=2/Math.sqrt(3);function oV(e,t,n,r){let i=$n(e,t,aV,1),a=$n(n,r,aV,1);return(i.x-a.x)**2+(i.y-a.y)**2}function sV(e){let{width:t,height:n}=e;if(t<5||n<5)throw Error(`a cave needs at least 5x5 cells`);if(e.chambers.length<1)throw Error(`a cave needs at least one chamber`);let r=e.wall??0,i=e.floor??1,a=e.kinds??[],o=e.shape??`square`,s=o===`hex`,c=s?iV:rV,l=(e,t,n,r)=>s?Yn({x:e,y:t},{x:n,y:r}):Math.abs(e-n)+Math.abs(t-r),u=(e,t,n,r)=>s?oV(e,t,n,r):(e-n)**2+(t-r)**2;if(e.random===void 0&&e.seed===void 0)throw Error(`a cave needs a seed or a random source`);let d=e.random,f=e=>O(e,void 0,d),p=new HB(t,n,[...XB,...a],r,o),m=(e,n)=>n*t+e,h=(e,t)=>p.insideWithBorder(e,t),g=new Uint8Array(t*n),_=(e,t)=>{h(e,t)&&(g[m(e,t)]=1)};d===void 0&&w(e.seed);try{let r=new Map,a=new Map;for(let i of e.chambers){if(i.size<1)throw Error(`cave chamber ${i.id} needs at least one cell`);let e=ne(Math.max(1,i.xRange[0]),Math.min(t-2,i.xRange[1]),d),o=ne(Math.max(1,i.yRange[0]),Math.min(n-2,i.yRange[1]),d);r.set(i.id,{x:e,y:o});let s=[{x:e,y:o}],u=new Set([m(e,o)]),p=[],g=(e,t)=>{for(let[n,r]of c(e,t))h(n,r)&&!u.has(m(n,r))&&(u.add(m(n,r)),p.push([n,r]))};for(g(e,o);s.length<i.size&&p.length;){let t=0;if(f(100)<(i.jagged??0))t=f(p.length);else{let n=1/0;for(let r=0;r<p.length;r++){let i=l(p[r][0],p[r][1],e,o);i<n&&(n=i,t=r)}}let[n,r]=p.splice(t,1)[0];s.push({x:n,y:r}),g(n,r)}for(let e of s)_(e.x,e.y);a.set(i.id,s)}let o=(e,r,i,a)=>{let o=e.x,s=e.y;for(let e=0;e<t*n&&(o!==r.x||s!==r.y);e++){if(_(o,s),i>1)for(let[e,t]of c(o,s).slice(0,i-1))_(e,t);let e=c(o,s).filter(([e,t])=>h(e,t)),t=e[0];if(f(100)<a)t=e[f(e.length)];else{let n=1/0;for(let i of e){let e=u(i[0],i[1],r.x,r.y);e<n&&(n=e,t=i)}}[o,s]=t}_(r.x,r.y)};for(let t of e.chambers)for(let e of t.passages){let n=r.get(t.id),i=r.get(e.to);if(!n||!i)throw Error(`cave passage ${t.id} -> ${e.to} names no chamber`);f(100)>=(e.chance??100)||o(n,i,Math.max(1,e.width??1),e.windiness??0)}let s=e.mustBeClear??[];for(let e of s){_(e.x,e.y);for(let[t,n]of c(e.x,e.y))_(t,n)}let v=r.get(e.chambers[0].id);if(v){let e=()=>{let e=new Set([m(v.x,v.y)]),t=[[v.x,v.y]];for(;t.length;){let[n,r]=t.pop();for(let[i,a]of c(n,r))h(i,a)&&g[m(i,a)]&&!e.has(m(i,a))&&(e.add(m(i,a)),t.push([i,a]))}return e};for(let t of[...r.values(),...s])h(t.x,t.y)&&!e().has(m(t.x,t.y))&&o(t,v,1,15)}let y=new Set,b=[];for(let t of e.starts??[]){let e=r.get(t.chamber);if(!e)throw Error(`cave start ${t.side} names no chamber`);if(_(e.x,e.y),y.add(m(e.x,e.y)),t.ring)for(let[t,n]of c(e.x,e.y))h(t,n)&&(_(t,n),y.add(m(t,n)));b.push({side:t.side,x:e.x,y:e.y})}let x=[],S=e.villageDensity??0;if(S>0){let e=[];for(let t=0;t<g.length;t++)g[t]&&!y.has(t)&&e.push(t);let n=Math.floor(e.length*S/1e3);for(let r=0;r<n&&e.length;r++){let n=f(e.length),r=e.splice(n,1)[0];x.push({x:r%t,y:Math.floor(r/t)})}}for(let e=0;e<g.length;e++)g[e]&&p.set(e%t,Math.floor(e/t),i);return{level:p,chambers:[...a.entries()].map(([e,t])=>({id:e,centre:r.get(e),cells:t})),starts:b,villages:x}}finally{d===void 0&&T()}}_e();function cV(e,t,n,r,i){let a=e=>Math.max(2,Math.ceil(e/r)+2),o=a(t),s=a(n),c=new Float64Array(o*s);for(let t=0;t<c.length;t++)c[t]=e();let l=e=>e*e*(3-2*e),u=Array(t*n).fill(0);for(let e=0;e<3;e++){let a=1<<e,d=1/(a*a);for(let e=0;e<n;e++)for(let n=0;n<t;n++){let f=(i?n*lV:n)/r*a,p=(i?e+(n&1)/2:e)/r*a,m=Math.floor(f)%(o-1),h=Math.floor(p)%(s-1),g=l(f-Math.floor(f)),_=l(p-Math.floor(p)),v=(e,t)=>c[(h+t)%s*o+(m+e)%o],y=v(0,0)*(1-g)+v(1,0)*g,b=v(0,1)*(1-g)+v(1,1)*g;u[e*t+n]+=(y*(1-_)+b*_)*d}}for(let e=0;e<u.length;e++)u[e]/=1.3125;return u}var lV=Math.sqrt(3)/2,uV=[[0,-1],[0,1],[-1,0],[1,0],[-1,-1],[1,-1],[-1,1],[1,1]];function dV(e,t,n,r){if(e)for(let e of Jn(t,n))r(e.x,e.y,!1);else for(let[e,i]of uV)r(t+e,n+i,e!==0&&i!==0)}var fV={plains:1,forest:3,hills:5,desert:2,swamp:6,water:24,mountains:40};function pV(e){let{width:t,height:n}=e;if(t<16||n<16)throw Error(`an overworld needs at least 16x16 tiles`);let r=e.seaLevel??.4;if(!(r>0&&r<1))throw Error(`seaLevel must be between 0 and 1`);let i=e.noiseScale??6,a=e.shape===`hex`,o=(e,n)=>n*t+e,s=(e,r)=>e>=0&&r>=0&&e<t&&r<n;w(e.seed);try{let c=cV(()=>D(),t,n,i,a),l=cV(()=>D(),t,n,i*1.5,a),u=Array(t*n),d=(e,t)=>{let n=o(e,t),i=c[n],a=l[n];return i<r?`water`:i>.78?`mountains`:i>.62?`hills`:a<.3?`desert`:a>.72?i<r+.08?`swamp`:`forest`:`plains`};for(let e=0;e<n;e++)for(let n=0;n<t;n++)u[o(n,e)]=d(n,e);let f=new Set,p=[],m=e.rivers??Math.max(1,Math.floor(t*n/600)),h=[];for(let e=0;e<u.length;e++)c[e]>.7&&u[e]!==`water`&&h.push(e);for(let e=0;e<m*4&&p.length<m&&h.length!==0;e++){let e=h[O(h.length)],r=[],i=e%t,l=Math.floor(e/t),d=new Set;for(let e=0;e<t+n;e++){let e=o(i,l);if(f.has(e)||u[e]===`water`){r.length>0&&r.push({x:i,y:l});break}r.push({x:i,y:l}),d.add(e);let t;if(dV(a,i,l,(e,n)=>{if(!s(e,n))return;let r={x:e,y:n,up:c[o(e,n)]};(!t||r.up<t.up)&&(t=r)}),!t||t.up>=c[o(i,l)]){u[o(i,l)]=`water`;break}[i,l]=[t.x,t.y]}if(r.length>=2){for(let e of r)f.add(o(e.x,e.y));p.push(r)}}let g=[],_=(e,t)=>{if(a)return Qn({x:e,y:t},3).some(e=>s(e.x,e.y)&&u[o(e.x,e.y)]===`water`);for(let n=-3;n<=3;n++)for(let r=-3;r<=3;r++){let i=e+r,a=t+n;if(s(i,a)&&u[o(i,a)]===`water`)return!0}return!1},v=(e,t,n)=>g.every(r=>(a?Yn(r,{x:e,y:t}):Math.abs(r.x-e)+Math.abs(r.y-t))>=n),y=e.settlements??Math.max(2,Math.floor(t*n/500));for(let e=0;e<y*60&&g.length<y;e++){let e=O(t),r=O(n),i=u[o(e,r)];i!==`plains`&&i!==`hills`&&i!==`forest`||!_(e,r)||v(e,r,8)&&g.push({x:e,y:r,kind:i===`hills`?`castle`:`town`})}for(let e of g)e.kind===`town`&&O(2)===0&&(e.kind=`village`);let b=[],x=g[0];if(x){let e=[x],r=g.slice(1);for(;r.length;){let i;for(let o of r)for(let r of e){let e=mV(u,t,n,r,o,a);e&&(!i||e.length<i.path.length)&&(i={path:e,to:o})}if(!i)break;b.push(i.path),e.push(i.to),r.splice(r.indexOf(i.to),1)}}let S=[],C=e.pointsOfInterest??Math.max(1,Math.floor(t*n/900));for(let e=0;e<C*40&&S.length<C;e++){let e=O(t),r=O(n),i=u[o(e,r)];if(i===`water`||i===`mountains`||!v(e,r,6))continue;let a=[`ruin`,`shrine`,`dungeon`],s=a[O(a.length)];S.push({x:e,y:r,kind:s,leadsTo:`overworld-${s}-${S.length}`})}let ee=Math.max(2,e.regionSize??12),w=Math.ceil(t/ee),T=Array(t*n);for(let e=0;e<n;e++)for(let n=0;n<t;n++)T[o(n,e)]=Math.floor(e/ee)*w+Math.floor(n/ee);return{terrain:u,elevation:c,moisture:l,rivers:p,roads:b,settlements:g,pointsOfInterest:S,regions:T,regionColumns:w}}finally{T()}}function mV(e,t,n,r,i,a){let o=(e,n)=>n*t+e,s=(e,r)=>e>=0&&r>=0&&e<t&&r<n,c=t*n,l=new Float64Array(c).fill(1/0),u=new Int32Array(c).fill(-1),d=o(r.x,r.y),f=o(i.x,i.y);l[d]=0;let p=[d],m=new Uint8Array(c),h=e=>{for(;;){let t=e*2+1,n=t+1,r=e;if(t<p.length&&l[p[t]]<l[p[r]]&&(r=t),n<p.length&&l[p[n]]<l[p[r]]&&(r=n),r===e)return;[p[e],p[r]]=[p[r],p[e]],e=r}},g=()=>{let e=p[0],t=p.pop();return p.length&&(p[0]=t,h(0)),m[e]=0,e},_=e=>{p.push(e),m[e]=1;let t=p.length-1;for(;t>0;){let e=t-1>>1;if(l[p[e]]<=l[p[t]])break;[p[t],p[e]]=[p[e],p[t]],t=e}};for(;p.length;){let n=g();if(n===f){let e=[];for(let n=f;n!==-1;n=u[n])e.push({x:n%t,y:Math.floor(n/t)});return e.reverse()}dV(a,n%t,Math.floor(n/t),(t,r,i)=>{if(!s(t,r))return;let a=o(t,r);if(l[n]===1/0)return;let c=fV[e[a]]*(i?1.5:1);l[n]+c<l[a]&&(l[a]=l[n]+c,u[a]=n,m[a]||_(a))})}}var hV=class e{constructor(){this.defs=new Map,this.placed=new Map}define(e,t){this.defs.set(e,t)}place(e,t){if(!this.defs.has(t))throw Error(`FeatureLayer.place: no definition for kind "${t}"`);this.placed.set(e,t)}has(e){return this.placed.has(e)}kindAt(e){return this.placed.get(e)}remove(e){this.placed.delete(e)}inspect(e,t){this.defAt(e)?.inspect?.(e,t)}interact(e,t){let n=this.defAt(e);n&&(n.interact&&n.interact(e,t)===!1||(n.consequence?.(e,t),n.persistent===!1&&this.remove(e)))}defAt(e){let t=this.placed.get(e);return t===void 0?void 0:this.defs.get(t)}toJSON(){return{cells:[...this.placed.entries()]}}static fromJSON(t,n){let r=new e;for(let[e,n]of t)r.define(e,n);for(let[e,t]of n.cells)r.place(e,t);return r}};_e();function gV(e,t=[],n=!0){let r=[],i=e.map(e=>e.value);t.forEach((e,t)=>{if(e.enabled===!1){r.push({step:`rare`,index:t,outcome:`deferred`});return}let n=A(e.chance);r.push({step:`rare`,index:t,outcome:n?`added`:`skipped`}),n&&i.push(e.value)});for(let t=0;t<e.length;t++){let n=e[t].alternative;if(!n)continue;let a=A(n.chance);r.push({step:`alternative`,index:t,outcome:a?`swapped`:`kept`}),a&&(i[t]=n.value)}return n&&(oe(i),r.push({step:`shuffle`,index:-1,outcome:`shuffled`})),{roster:i,trace:r}}function _V(e,t){return e.length===t.length&&e.every((e,n)=>e.a===t[n].a&&e.b===t[n].b&&e.extra===t[n].extra)}function vV(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function yV(e,t){if(e.length!==t.length)return!1;let n=[...e].sort((e,t)=>e[0]-t[0]),r=[...t].sort((e,t)=>e[0]-t[0]);return n.every(([e,t],n)=>e===r[n][0]&&t===r[n][1])}function bV(e,t){let n=[];return e.retries!==t.retries&&n.push({stage:`graph`,field:`retries`,expected:e.retries,actual:t.retries}),_V(e.graph,t.graph)||n.push({stage:`graph`,field:`graph`,expected:e.graph,actual:t.graph}),(e.width!==t.width||e.height!==t.height||!vV(e.terrain,t.terrain))&&n.push({stage:`paint`,field:`terrain`,expected:e.terrain,actual:t.terrain}),(e.roomBuilders.length!==t.roomBuilders.length||e.roomBuilders.some((e,n)=>e!==t.roomBuilders[n]))&&n.push({stage:`paint`,field:`roomBuilders`,expected:e.roomBuilders,actual:t.roomBuilders}),yV(e.features,t.features)||n.push({stage:`paint`,field:`features`,expected:e.features,actual:t.features}),JSON.stringify(e.content)!==JSON.stringify(t.content)&&n.push({stage:`paint`,field:`content`,expected:e.content,actual:t.content}),e.rngDraws!==t.rngDraws&&n.push({stage:`paint`,field:`rngDraws`,expected:e.rngDraws,actual:t.rngDraws}),n}function xV(e,t=2){let n=e(),r=[];for(let i=1;i<t;i++)r.push(...bV(n,e()));return r}var SV=23283064365386963e-26;new class e{constructor(){this._seed=0,this._s0=0,this._s1=0,this._s2=0,this._c=0}getSeed(){return this._seed}setSeed(e){return e=e<1?1/e:e,this._seed=e,this._s0=(e>>>0)*SV,e=e*69069+1>>>0,this._s1=e*SV,e=e*69069+1>>>0,this._s2=e*SV,this._c=1,this}getUniform(){let e=2091639*this._s0+this._c*SV;return this._s0=this._s1,this._s1=this._s2,this._c=e|0,this._s2=e-this._c,this._s2}getUniformInt(e,t){let n=Math.max(e,t),r=Math.min(e,t);return Math.floor(this.getUniform()*(n-r+1))+r}getNormal(e=0,t=1){let n,r,i;do n=2*this.getUniform()-1,r=2*this.getUniform()-1,i=n*n+r*r;while(i>1||i==0);return e+n*Math.sqrt(-2*Math.log(i)/i)*t}getPercentage(){return 1+Math.floor(this.getUniform()*100)}getItem(e){return e.length?e[Math.floor(this.getUniform()*e.length)]:null}shuffle(e){let t=[],n=e.slice();for(;n.length;){let e=n.indexOf(this.getItem(n));t.push(n.splice(e,1)[0])}return t}getWeightedValue(e){let t=0;for(let n in e)t+=e[n];let n=this.getUniform()*t,r,i=0;for(r in e)if(i+=e[r],n<i)return r;return r}getState(){return[this._s0,this._s1,this._s2,this._c]}setState(e){return this._s0=e[0],this._s1=e[1],this._s2=e[2],this._c=e[3],this}clone(){return new e().setState(this.getState())}}().setSeed(Date.now());var CV=class{getContainer(){return null}setOptions(e){this._options=e}},wV=class extends CV{constructor(){super(),this._ctx=document.createElement(`canvas`).getContext(`2d`)}schedule(e){requestAnimationFrame(e)}getContainer(){return this._ctx.canvas}setOptions(e){super.setOptions(e);let t=`${e.fontStyle?`${e.fontStyle} `:``} ${e.fontSize}px ${e.fontFamily}`;this._ctx.font=t,this._updateSize(),this._ctx.font=t,this._ctx.textAlign=`center`,this._ctx.textBaseline=`middle`}clear(){let e=this._ctx.globalCompositeOperation;this._ctx.globalCompositeOperation=`copy`,this._ctx.fillStyle=this._options.bg,this._ctx.fillRect(0,0,this._ctx.canvas.width,this._ctx.canvas.height),this._ctx.globalCompositeOperation=e}eventToPosition(e,t){let n=this._ctx.canvas,r=n.getBoundingClientRect();return e-=r.left,t-=r.top,e*=n.width/r.width,t*=n.height/r.height,e<0||t<0||e>=n.width||t>=n.height?[-1,-1]:this._normalizedEventToPosition(e,t)}};function TV(e){return e.charAt(0).toUpperCase()+e.substring(1)}function EV(e,...t){let n=EV.map;return e.replace(/%(?:([a-z]+)|(?:{([^}]+)}))/gi,function(r,i,a,o){if(e.charAt(o-1)==`%`)return r.substring(1);if(!t.length)return r;let s=t[0],c=(i||a).split(`,`),l=c.shift()||``,u=n[l.toLowerCase()];if(!u)return r;s=t.shift();let d=s[u].apply(s,c),f=l.charAt(0);return f!=f.toLowerCase()&&(d=TV(d)),d})}EV.map={s:`toString`};var DV=class e extends wV{constructor(){super(),this._spacingX=0,this._spacingY=0,this._canvasCache={}}setOptions(e){super.setOptions(e),this._canvasCache={}}draw(t,n){e.cache?this._drawWithCache(t):this._drawNoCache(t,n)}_drawWithCache(e){let[t,n,r,i,a]=e,o=``+r+i+a,s;if(o in this._canvasCache)s=this._canvasCache[o];else{let e=this._options.border;s=document.createElement(`canvas`);let t=s.getContext(`2d`);if(s.width=this._spacingX,s.height=this._spacingY,t.fillStyle=a,t.fillRect(e,e,s.width-e,s.height-e),r){t.fillStyle=i,t.font=this._ctx.font,t.textAlign=`center`,t.textBaseline=`middle`;let e=[].concat(r);for(let n=0;n<e.length;n++)t.fillText(e[n],this._spacingX/2,Math.ceil(this._spacingY/2))}this._canvasCache[o]=s}this._ctx.drawImage(s,t*this._spacingX,n*this._spacingY)}_drawNoCache(e,t){let[n,r,i,a,o]=e;if(t){let e=this._options.border;this._ctx.fillStyle=o,this._ctx.fillRect(n*this._spacingX+e,r*this._spacingY+e,this._spacingX-e,this._spacingY-e)}if(!i)return;this._ctx.fillStyle=a;let s=[].concat(i);for(let e=0;e<s.length;e++)this._ctx.fillText(s[e],(n+.5)*this._spacingX,Math.ceil((r+.5)*this._spacingY))}computeSize(e,t){return[Math.floor(e/this._spacingX),Math.floor(t/this._spacingY)]}computeFontSize(e,t){let n=Math.floor(e/this._options.width),r=Math.floor(t/this._options.height),i=this._ctx.font;this._ctx.font=`100px `+this._options.fontFamily;let a=Math.ceil(this._ctx.measureText(`W`).width);this._ctx.font=i;let o=a/100*r/n;return o>1&&(r=Math.floor(r/o)),Math.floor(r/this._options.spacing)}_normalizedEventToPosition(e,t){return[Math.floor(e/this._spacingX),Math.floor(t/this._spacingY)]}_updateSize(){let e=this._options,t=Math.ceil(this._ctx.measureText(`W`).width);this._spacingX=Math.ceil(e.spacing*t),this._spacingY=Math.ceil(e.spacing*e.fontSize),e.forceSquareRatio&&(this._spacingX=this._spacingY=Math.max(this._spacingX,this._spacingY)),this._ctx.canvas.width=e.width*this._spacingX,this._ctx.canvas.height=e.height*this._spacingY}};DV.cache=!1;var OV={4:[[0,-1],[1,0],[0,1],[-1,0]],8:[[0,-1],[1,-1],[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1]],6:[[-1,-1],[1,-1],[2,0],[1,1],[-1,1],[-2,0]]},kV=class{constructor(e,t={}){this._lightPasses=e,this._options=Object.assign({topology:8},t)}_getCircle(e,t,n){let r=[],i,a,o;switch(this._options.topology){case 4:a=1,o=[0,1],i=[OV[8][7],OV[8][1],OV[8][3],OV[8][5]];break;case 6:i=OV[6],a=1,o=[-1,1];break;case 8:i=OV[4],a=2,o=[-1,1];break;default:throw Error(`Incorrect topology for FOV computation`)}let s=e+o[0]*n,c=t+o[1]*n;for(let e=0;e<i.length;e++)for(let t=0;t<n*a;t++)r.push([s,c]),s+=i[e][0],c+=i[e][1];return r}},AV=class extends kV{compute(e,t,n,r){if(r(e,t,0,1),!this._lightPasses(e,t))return;let i=[],a,o,s,c,l;for(let u=1;u<=n;u++){let n=this._getCircle(e,t,u),d=360/n.length;for(let e=0;e<n.length;e++)if(s=n[e][0],c=n[e][1],a=d*(e-.5),o=a+d,l=!this._lightPasses(s,c),this._visibleCoords(Math.floor(a),Math.ceil(o),l,i)&&r(s,c,u,1),i.length==2&&i[0]==0&&i[1]==360)return}}_visibleCoords(e,t,n,r){if(e<0){let i=this._visibleCoords(0,t,n,r),a=this._visibleCoords(360+e,360,n,r);return i||a}let i=0;for(;i<r.length&&r[i]<e;)i++;if(i==r.length)return n&&r.push(e,t),!0;let a=0;if(i%2){for(;i<r.length&&r[i]<t;)i++,a++;return a!=0&&(n&&(a%2?r.splice(i-a,a,t):r.splice(i-a,a)),!0)}for(;i<r.length&&r[i]<t;)i++,a++;return e==r[i-a]&&a==1?!1:(n&&(a%2?r.splice(i-a,a,e):r.splice(i-a,a,e,t)),!0)}},jV=class extends kV{compute(e,t,n,r){if(r(e,t,0,1),!this._lightPasses(e,t))return;let i=[],a,o,s,c,l,u;for(let d=1;d<=n;d++){let n=this._getCircle(e,t,d),f=n.length;for(let e=0;e<f;e++)if(a=n[e][0],o=n[e][1],c=[e?2*e-1:2*f-1,2*f],l=[2*e+1,2*f],s=!this._lightPasses(a,o),u=this._checkVisibility(c,l,s,i),u&&r(a,o,d,u),i.length==2&&i[0][0]==0&&i[1][0]==i[1][1])return}}_checkVisibility(e,t,n,r){if(e[0]>t[0])return(this._checkVisibility(e,[e[1],e[1]],n,r)+this._checkVisibility([0,1],t,n,r))/2;let i=0,a=!1;for(;i<r.length;){let t=r[i],n=t[0]*e[1]-e[0]*t[1];if(n>=0){n==0&&!(i%2)&&(a=!0);break}i++}let o=r.length,s=!1;for(;o--;){let e=r[o],n=t[0]*e[1]-e[0]*t[1];if(n>=0){n==0&&o%2&&(s=!0);break}}let c=!0;if((i==o&&(a||s)||a&&s&&i+1==o&&o%2||i>o&&i%2)&&(c=!1),!c)return 0;let l,u=o-i+1;if(u%2){if(i%2){let e=r[i];l=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]),n&&r.splice(i,u,t)}else{let t=r[o];l=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]),n&&r.splice(i,u,e)}}else if(i%2){let e=r[i],t=r[o];l=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]),n&&r.splice(i,u)}else return n&&r.splice(i,u,e,t),1;let d=(t[0]*e[1]-e[0]*t[1])/(e[1]*t[1]);return l/d}},MV=[[-1,0,0,1],[0,-1,1,0],[0,-1,-1,0],[-1,0,0,-1],[1,0,0,-1],[0,1,-1,0],[0,1,1,0],[1,0,0,1]],NV={DiscreteShadowcasting:AV,PreciseShadowcasting:jV,RecursiveShadowcasting:class extends kV{compute(e,t,n,r){r(e,t,0,1);for(let i=0;i<MV.length;i++)this._renderOctant(e,t,MV[i],n,r)}compute180(e,t,n,r,i){i(e,t,0,1);let a=(r-1+8)%8,o=(r-2+8)%8,s=(r+1+8)%8;this._renderOctant(e,t,MV[o],n,i),this._renderOctant(e,t,MV[a],n,i),this._renderOctant(e,t,MV[r],n,i),this._renderOctant(e,t,MV[s],n,i)}compute90(e,t,n,r,i){i(e,t,0,1);let a=(r-1+8)%8;this._renderOctant(e,t,MV[r],n,i),this._renderOctant(e,t,MV[a],n,i)}_renderOctant(e,t,n,r,i){this._castVisibility(e,t,1,1,0,r+1,n[0],n[1],n[2],n[3],i)}_castVisibility(e,t,n,r,i,a,o,s,c,l,u){if(!(r<i))for(let d=n;d<=a;d++){let n=-d-1,f=-d,p=!1,m=0;for(;n<=0;){n+=1;let h=e+n*o+f*s,g=t+n*c+f*l,_=(n-.5)/(f+.5),v=(n+.5)/(f-.5);if(!(v>r)){if(_<i)break;if(n*n+f*f<a*a&&u(h,g,d,1),!p)!this._lightPasses(h,g)&&d<a&&(p=!0,this._castVisibility(e,t,d+1,r,_,a,o,s,c,l,u),m=v);else{if(!this._lightPasses(h,g)){m=v;continue}p=!1,r=m}}}if(p)break}}}};.5*(Math.sqrt(3)-1),(3-Math.sqrt(3))/6;var PV=class{constructor(e,t,n,r={}){this._toX=e,this._toY=t,this._passableCallback=n,this._options=Object.assign({topology:8},r),this._dirs=OV[this._options.topology],this._options.topology==8&&(this._dirs=[this._dirs[0],this._dirs[2],this._dirs[4],this._dirs[6],this._dirs[1],this._dirs[3],this._dirs[5],this._dirs[7]])}_getNeighbors(e,t){let n=[];for(let r=0;r<this._dirs.length;r++){let i=this._dirs[r],a=e+i[0],o=t+i[1];this._passableCallback(a,o)&&n.push([a,o])}return n}},FV={Dijkstra:class extends PV{constructor(e,t,n,r){super(e,t,n,r),this._computed={},this._todo=[],this._add(e,t,null)}compute(e,t,n){let r=e+`,`+t;if(r in this._computed||this._compute(e,t),!(r in this._computed))return;let i=this._computed[r];for(;i;)n(i.x,i.y),i=i.prev}_compute(e,t){for(;this._todo.length;){let n=this._todo.shift();if(n.x==e&&n.y==t)return;let r=this._getNeighbors(n.x,n.y);for(let e=0;e<r.length;e++){let t=r[e],i=t[0],a=t[1];i+`,`+a in this._computed||this._add(i,a,n)}}}_add(e,t,n){let r={x:e,y:t,prev:n};this._computed[e+`,`+t]=r,this._todo.push(r)}},AStar:class extends PV{constructor(e,t,n,r={}){super(e,t,n,r),this._todo=[],this._done={}}compute(e,t,n){for(this._todo=[],this._done={},this._fromX=e,this._fromY=t,this._add(this._toX,this._toY,null);this._todo.length;){let n=this._todo.shift(),r=n.x+`,`+n.y;if(r in this._done)continue;if(this._done[r]=n,n.x==e&&n.y==t)break;let i=this._getNeighbors(n.x,n.y);for(let e=0;e<i.length;e++){let t=i[e],r=t[0],a=t[1];r+`,`+a in this._done||this._add(r,a,n)}}let r=this._done[e+`,`+t];if(r)for(;r;)n(r.x,r.y),r=r.prev}_add(e,t,n){let r=this._distance(e,t),i={x:e,y:t,prev:n,g:n?n.g+1:0,h:r},a=i.g+i.h;for(let e=0;e<this._todo.length;e++){let t=this._todo[e],n=t.g+t.h;if(a<n||a==n&&r<t.h){this._todo.splice(e,0,i);return}}this._todo.push(i)}_distance(e,t){switch(this._options.topology){case 4:return Math.abs(e-this._fromX)+Math.abs(t-this._fromY);case 6:let n=Math.abs(e-this._fromX),r=Math.abs(t-this._fromY);return r+Math.max(0,(n-r)/2);case 8:return Math.max(Math.abs(e-this._fromX),Math.abs(t-this._fromY))}}}};function IV(e,t){return dr(e,t)}function LV(e,t){let n=[],r=e.x,i=e.y,a=Math.abs(t.x-e.x),o=-Math.abs(t.y-e.y),s=e.x<t.x?1:-1,c=e.y<t.y?1:-1,l=a+o;for(;n.push({x:r,y:i}),r!==t.x||i!==t.y;){let e=l*2;e>=o&&(l+=o,r+=s),e<=a&&(l+=a,i+=c)}return n}function RV(e,t,n,r={}){let i=e.shape===`hex`?Zn(t,n):LV(t,n),a=r.stop??`opaque`,o=[],s=null;for(let t of i)if(o.push(t),o.length!==1&&a!==`none`&&(a===`outside`&&!e.inside(t.x,t.y)||a===`opaque`&&e.inside(t.x,t.y)&&!e.transparent(t.x,t.y)||a===`impassable`&&e.inside(t.x,t.y)&&!e.passable(t.x,t.y))){s=t;break}return{cells:o,stop:s}}function zV(e,t,n){let r=e.shape===`hex`?Zn(t,n):LV(t,n);for(let t=1;t<r.length-1;t++)if(!e.transparent(r[t].x,r[t].y))return!1;return!0}function BV(e,t,n,r){return!((e.shape===`hex`?Yn(t,n):IV(t,n))>r.range||(r.requireLineOfSight??!0)&&!zV(e,t,n))}function VV(e,t,n){switch(n.kind){case`single`:return[t];case`line`:return LV(e,t);case`cone`:return WV(e,t,n.width);case`burst`:{let e=[],r=n.radius;for(let n=-r;n<=r;n++)for(let i=-r;i<=r;i++)i*i+n*n>r*r||e.push({x:t.x+i,y:t.y+n});return e}}}function HV(e,t,n,r){return e.shape===`hex`?r.kind===`single`?[{...n}]:r.kind===`line`?Zn(t,n):r.kind===`burst`?Qn(n,r.radius):UV(t,n,r.width):VV(t,n,r)}function UV(e,t,n){let r=Yn(e,t);if(r===0)return[{...e}];let i=Zn(e,t),a=[];for(let t=1;t<=r;t++){let o=i[t],s=Math.round(t/r*n);for(let n of Qn(o,s))Yn(e,n)===t&&a.push(n)}return a}function WV(e,t,n){let r=t.x-e.x,i=t.y-e.y,a=Math.max(Math.abs(r),Math.abs(i));if(a===0)return[{...e}];let o=Math.sign(r),s=Math.sign(i),c=r!==0&&i!==0?o:s,l=r!==0&&i!==0?-s:o,u=[];for(let t=1;t<=a;t++){let r=e.x+o*t,i=e.y+s*t,d=Math.round(t/a*n);for(let e=-d;e<=d;e++)u.push({x:r+c*e,y:i+l*e})}return u}var GV=.5;function KV(e){return e<0?-Math.round(-e):Math.round(e)}function qV(e,t,n,r){if(!Number.isFinite(r.degrees)||r.degrees<0)throw Error(`a cone sector needs a finite non-negative angle in degrees`);if(!Number.isFinite(r.range)||r.range<0)throw Error(`a cone sector needs a finite non-negative range`);let i=n.x-t.x,a=n.y-t.y;if(i===0&&a===0)return[{...t}];let o=Math.atan2(a,i),s=r.degrees*Math.PI/360,c=Math.max(1,Math.round(r.degrees/GV)),l=r.stop??`opaque`,u=new Set,d=[];for(let n=0;n<=c;n++){let i=o-s+2*s*n/c,a={x:t.x+KV(Math.cos(i)*r.range),y:t.y+KV(Math.sin(i)*r.range)};for(let n of RV(e,t,a,{stop:l}).cells){if(n.x===t.x&&n.y===t.y||!e.inside(n.x,n.y))continue;let r=e.index(n.x,n.y);u.has(r)||(u.add(r),d.push({x:n.x,y:n.y}))}}return d}function JV(e,t,n,r){let i=new Set,a=[],o=t;for(let t=0;t<n;t++){let t=-1,n=r+1;for(let a=0;a<e.length;a++){if(i.has(a))continue;let s=IV(o,e[a]);s<=r&&s<n&&(n=s,t=a)}if(t===-1)break;i.add(t),a.push(e[t]),o=e[t]}return a}function YV(e,t,n=1){for(let n of t)if(e<=n.max)return n.multiplier;return n}function XV(e,t){return t.length===0?1:t[Math.min(e,t.length-1)]}function ZV(e,t,n,r){let i=[];for(let a=1;a<=r;a++){let r={x:t.x+n.x*a,y:t.y+n.y*a};if(!e.passable(r.x,r.y))break;i.push(r)}return i}var QV=class{constructor(e,t){if(this.onMove=new p,this.onConfirm=new p,this.onCancel=new p,!Number.isFinite(t.range)||t.range<0)throw Error(`targeting range must be a finite non-negative number`);this.level=e,this.origin={...t.origin},this.range=t.range,this.requireLineOfSight=t.requireLineOfSight??!0,this.validate=t.validate,this.shape=t.shape??{kind:`single`},this.cursor={...t.cursor??t.origin}}get target(){return{...this.cursor}}get distance(){return this.level.shape===`hex`?Yn(this.origin,this.cursor):IV(this.origin,this.cursor)}get inRange(){return this.distance<=this.range}get inSight(){return zV(this.level,this.origin,this.cursor)}get valid(){return!this.inRange||this.requireLineOfSight&&!this.inSight?!1:!this.validate||this.validate(this.cursor)}move(e,t){if(this.level.shape===`hex`){let n=this.level.neighbors(this.cursor.x,this.cursor.y).find(n=>n.x-this.cursor.x===e&&n.y-this.cursor.y===t);n&&this.moveTo(n)}else this.moveTo({x:this.cursor.x+e,y:this.cursor.y+t})}moveTo(e){this.level.inside(e.x,e.y)&&(this.cursor={x:e.x,y:e.y},this.onMove.dispatch({...this.cursor}))}setShape(e){this.shape=e}preview(){return this.valid?HV(this.level,this.origin,this.cursor,this.shape):[]}confirm(){if(!this.valid)return null;let e={origin:{...this.origin},target:{...this.cursor},shape:this.shape,cells:this.preview()};return this.onConfirm.dispatch(e),e}cancel(){this.onCancel.dispatch()}},$V=class{constructor(e){this.visible=new Set,this.explored=new Set,this.light=new Map,this.level=e,this.fov=e.shape===`hex`?null:new NV.PreciseShadowcasting((t,n)=>e.transparent(t,n))}update(e,t,n=this.level.viewDistance??Math.max(this.level.width,this.level.height),r){if(this.visible.clear(),this.light.clear(),r){this.updateFromHeight(e,t,n,r);return}if(this.fov){this.fov.compute(e,t,n,(e,t,n,r)=>{if(!this.level.inside(e,t))return;let i=this.level.index(e,t);this.visible.add(i),this.explored.add(i),this.light.set(i,r)});return}let i={x:e,y:t};for(let e of Qn(i,n)){if(!this.level.inside(e.x,e.y))continue;let t=Zn(i,e);t.slice(1,-1).some(e=>!this.level.inside(e.x,e.y)||!this.level.transparent(e.x,e.y))||this.lightCell(e.x,e.y,t.length-1,n)}}lightCell(e,t,n,r){let i=this.level.index(e,t);this.visible.add(i),this.explored.add(i),this.light.set(i,r===0?1:Math.max(0,1-n/(r+1)))}updateFromHeight(e,t,n,r){let i=r.height??r.heights.heightAt(e,t),a={x:e,y:t};if(this.level.shape===`hex`)for(let e of Qn(a,n)){if(!this.level.inside(e.x,e.y))continue;let t=Zn(a,e);this.heightBlocked(t,r.heights,i,r.heights.heightAt(e.x,e.y))||this.lightCell(e.x,e.y,t.length-1,n)}else for(let o=t-n;o<=t+n;o++)for(let t=e-n;t<=e+n;t++){if(!this.level.inside(t,o)||IV(a,{x:t,y:o})>n)continue;let e=LV(a,{x:t,y:o});this.heightBlocked(e,r.heights,i,r.heights.heightAt(t,o))||this.lightCell(t,o,e.length-1,n)}}heightBlocked(e,t,n,r){let i=Math.max(n,r);for(let n=1;n<e.length-1;n++){let r=e[n];if(!this.level.inside(r.x,r.y)||!this.level.transparent(r.x,r.y)||t.heightAt(r.x,r.y)>i)return!0}return!1}isVisible(e,t){return this.visible.has(this.level.index(e,t))}isExplored(e,t){return this.explored.has(this.level.index(e,t))}lightAt(e,t){return this.light.get(this.level.index(e,t))??0}reset(){this.visible.clear(),this.explored.clear(),this.light.clear()}revealAll(){for(let e=0;e<this.level.cellCount;e++)this.explored.add(e)}},eH=class{constructor(e){this.level=e,this.heights=new Int32Array(e.cellCount)}heightAt(e,t){return this.level.inside(e,t)?this.heights[this.level.index(e,t)]:0}set(e,t,n){if(!Number.isInteger(n))throw Error(`a cell's height must be a whole number, got ${n}`);this.level.inside(e,t)&&(this.heights[this.level.index(e,t)]=n)}},tH=class{constructor(e){this.level=e}passable(e){let t=e.blocked;return(e,n)=>this.level.passable(e,n)?!t?.has(this.level.index(e,n)):!1}stepper(e){let t=this.passable(e),n=e.heights;if(!n)return(e,n,r,i)=>this.level.inside(e,n)&&this.level.inside(r,i)&&t(r,i);let r=e.climb??1;if(!Number.isInteger(r)||r<0)throw Error(`a climb limit must be a non-negative whole number, got ${e.climb}`);return(e,i,a,o)=>this.level.inside(e,i)&&this.level.inside(a,o)&&t(a,o)&&n.heightAt(a,o)-n.heightAt(e,i)<=r}find(e,t,n={}){if(this.level.shape===`hex`||n.heights){let r=this.distanceMap(t,n),i=[],a=e;for(let e=0;e<this.level.cellCount;e++){let e=this.descend(a,r,n);if(!e||(i.push(e),e.x===t.x&&e.y===t.y))break;a=e}return i}let r=new FV.AStar(t.x,t.y,this.passable(n),{topology:n.topology??8}),i=[];return r.compute(e.x,e.y,(e,t)=>i.push({x:e,y:t})),i.slice(1)}step(e,t,n={}){return this.find(e,t,n)[0]??null}distanceMap(e,t={}){let n=new Int32Array(this.level.cellCount).fill(-1),r=this.passable(t),i=this.stepper(t);if(!r(e.x,e.y))return n;let a=[this.level.index(e.x,e.y)];n[a[0]]=0;for(let e=0;e<a.length;e++){let r=a[e],o=this.level.xOf(r),s=this.level.yOf(r),c=n[r]+1;this.level.forEachNeighbor(o,s,t.topology??8,(e,t)=>{if(!i(e,t,o,s))return;let r=this.level.index(e,t);n[r]===-1&&(n[r]=c,a.push(r))})}return n}descend(e,t,n={}){let r=this.stepper(n),i=t[this.level.index(e.x,e.y)];if(i<=0)return null;let a=null,o=i;return this.level.forEachNeighbor(e.x,e.y,n.topology??8,(n,i)=>{if(!r(e.x,e.y,n,i))return;let s=t[this.level.index(n,i)];s!==-1&&s<o&&(o=s,a={x:n,y:i})}),a}autoExplore(e,t,n={}){let r=this.passable(n),i=this.stepper(n);if(!r(e.x,e.y))return[];let a=new Map,o=new Set([this.level.index(e.x,e.y)]),s=[e];for(let e=0;e<s.length;e++){let r=s[e];if(e>0&&!t.isExplored(r.x,r.y))return this.reconstruct(a,r);this.level.forEachNeighbor(r.x,r.y,n.topology??8,(e,t)=>{if(!i(r.x,r.y,e,t))return;let n=this.level.index(e,t);o.has(n)||(o.add(n),a.set(n,r),s.push({x:e,y:t}))})}return[]}reconstruct(e,t){let n=[t],r=e.get(this.level.index(t.x,t.y));for(;r;)n.push(r),r=e.get(this.level.index(r.x,r.y));return n.reverse()}},nH=class e{constructor(){this.entries=[],this.sequence=0,this.now=0}get size(){return this.entries.length}get actors(){return this.entries.map(e=>e.actor)}has(e){return this.entries.some(t=>t.actor===e)}add(e,t=0,n=e.priority??0){if(!Number.isFinite(t)||t<0)throw Error(`scheduler delay must be finite and non-negative`);if(!Number.isFinite(n))throw Error(`scheduler priority must be finite`);this.entries.push({actor:e,time:this.now+t,sequence:this.sequence++,priority:n}),this.sort()}remove(e){let t=this.entries.findIndex(t=>t.actor===e);t!==-1&&this.entries.splice(t,1)}clear(){this.entries.length=0,this.now=0,this.sequence=0}peek(){let e=this.entries[0];return e?(this.now=Math.max(this.now,e.time),e.actor):null}spend(e){let t=this.entries[0];if(!t)return;let n=t.actor.speed??1;t.time=this.now+e/(n>0?n:1),t.sequence=this.sequence++,this.sort()}postpone(e,t){let n=this.entries.find(t=>t.actor===e);n&&(n.time+=t,n.sequence=this.sequence++,this.sort())}timeOf(e){return this.entries.find(t=>t.actor===e)?.time??null}toJSON(e){return{now:this.now,sequence:this.sequence,entries:this.entries.map(t=>({id:e(t.actor),time:t.time,sequence:t.sequence,...t.priority===0?{}:{priority:t.priority}}))}}static restore(t,n){let r=new e;return r.now=t.now,r.sequence=t.sequence,r.entries=t.entries.map(e=>({actor:n(e.id),time:e.time,sequence:e.sequence,priority:e.priority??0})),r.sort(),r}sort(){this.entries.sort((e,t)=>e.time-t.time||t.priority-e.priority||e.sequence-t.sequence)}};_e();function rH(e,t,n,r,i,a={}){let o=a.sightRadius??6,s=a.fleeBelow??0;if((a.disposition??`hostile`)!==`hostile`&&a.provoked!==!0)return{state:`wander`,step:iH(e,n,a)};let c=new $V(e);return c.update(n.x,n.y,o),c.isVisible(i.x,i.y)?r<=s?{state:`flee`,step:aH(e,n,i,a)}:{state:`hunt`,step:t.step(n,i,a)}:{state:`wander`,step:iH(e,n,a)}}function iH(e,t,n){return re(oH(e,t,n))}function aH(e,t,n,r){let i=oH(e,t,r),a=null,o=sH(t,n);for(let e of i){let t=sH(e,n);t>o&&(o=t,a=e)}return a}function oH(e,t,n){let r=n.blocked,i=[];for(let[a,o]of zB(n.topology??8)){let n={x:t.x+a,y:t.y+o};e.passable(n.x,n.y)&&(r?.has(e.index(n.x,n.y))||i.push(n))}return i}function sH(e,t){return(e.x-t.x)**2+(e.y-t.y)**2}var cH=class e{constructor(e){this.revealedKind=new Map,this.discovered=new Set,this.level=e}conceal(e,t,n,r){let i=this.level.index(e,t);this.revealedKind.set(i,r),this.discovered.delete(i),this.level.set(e,t,n)}isSecret(e,t){let n=this.level.index(e,t);return this.revealedKind.has(n)&&!this.discovered.has(n)}isDiscovered(e,t){return this.discovered.has(this.level.index(e,t))}discover(e,t){if(!this.isSecret(e,t))return!1;let n=this.level.index(e,t);return this.discovered.add(n),this.level.set(e,t,this.revealedKind.get(n)),!0}toJSON(){return{revealed:[...this.revealedKind],discovered:[...this.discovered]}}static fromJSON(t,n){let r=new e(t);for(let[e,t]of n.revealed)r.revealedKind.set(e,t);for(let e of n.discovered)r.discovered.add(e);return r}},lH=class e{constructor(e){this.openKind=new Map,this.closedKind=new Map,this.lockedBy=new Map,this.open_=new Map,this.level=e}place(e,t,n){let r=this.level.index(e,t);this.openKind.set(r,n.open),this.closedKind.set(r,n.closed),this.open_.set(r,n.startOpen??!1),n.locked===void 0?this.lockedBy.delete(r):this.lockedBy.set(r,n.locked),this.level.set(e,t,this.open_.get(r)?n.open:n.closed)}isDoor(e,t){return this.open_.has(this.level.index(e,t))}isOpen(e,t){return this.open_.get(this.level.index(e,t))===!0}isLocked(e,t){return this.lockedBy.has(this.level.index(e,t))}requiredKey(e,t){return this.lockedBy.get(this.level.index(e,t))}open(e,t){let n=this.level.index(e,t);return!this.open_.has(n)||this.open_.get(n)||this.lockedBy.has(n)?!1:(this.open_.set(n,!0),this.level.set(e,t,this.openKind.get(n)),!0)}close(e,t){let n=this.level.index(e,t);return!this.open_.has(n)||!this.open_.get(n)?!1:(this.open_.set(n,!1),this.level.set(e,t,this.closedKind.get(n)),!0)}unlock(e,t){let n=this.level.index(e,t);return this.lockedBy.has(n)?(this.lockedBy.delete(n),!0):!1}toJSON(){let e=[];for(let[t,n]of this.openKind)e.push({cell:t,open:n,closed:this.closedKind.get(t),locked:this.lockedBy.get(t),isOpen:this.open_.get(t)===!0});return{doors:e}}static fromJSON(t,n){let r=new e(t);for(let e of n.doors){let n=t.xOf(e.cell),i=t.yOf(e.cell);r.place(n,i,{open:e.open,closed:e.closed,locked:e.locked,startOpen:e.isOpen})}return r}},uH=class e{constructor(e=[]){this.current=0;for(let t=1;t<e.length;t++)if(e[t]>=e[t-1])throw Error(`boss phase thresholds must descend`);this.thresholds=e}get phase(){return this.current}check(e){let t=0;for(;t<this.thresholds.length&&e<=this.thresholds[t];)t++;let n=[];for(;this.current<t;)this.current++,n.push(this.current);return n}reset(){this.current=0}toJSON(){return{phase:this.current}}static fromJSON(t,n){let r=new e(t);return r.current=n.phase,r}},dH=class e{constructor(e){this.remaining=new Map,this.cooldowns=new Map(Object.entries(e))}advance(e=1){for(let[t,n]of this.remaining)n<=e?this.remaining.delete(t):this.remaining.set(t,n-e)}ready(){let e=[];for(let t of this.cooldowns.keys())this.remaining.has(t)||e.push(t);return e}use(e){let t=this.cooldowns.get(e);return t===void 0||this.remaining.has(e)?!1:(t>0&&this.remaining.set(e,t),!0)}toJSON(){return{remaining:[...this.remaining]}}static fromJSON(t,n){let r=new e(t);for(let[e,t]of n.remaining)r.remaining.set(e,t);return r}},fH=class extends S{modifyDamage(e,t,n){let r={attacker:e,defender:t,amount:n,prevented:!1};return this.emit(`beforeDamage`,r),r.amount=Math.max(0,r.amount),r.amount===0&&(r.prevented=!0),r}},pH=class{constructor(e){this.detected=!1,this.radius=e.radius}get isDetected(){return this.detected}checkDetection(e,t){if(this.detected)return!1;let n=t.some(t=>IV(e,t)<=this.radius);return n&&(this.detected=!0),n}reset(){this.detected=!1}},mH=class e{constructor(e){this.streak=0,this.lastTurn=-1/0,this.window=e}get count(){return this.streak}trigger(e){return this.streak=e-this.lastTurn<=this.window?this.streak+1:1,this.lastTurn=e,this.streak}isActive(e){return e-this.lastTurn<=this.window}reset(){this.streak=0,this.lastTurn=-1/0}toJSON(){return{streak:this.streak,lastTurn:this.lastTurn}}static fromJSON(t,n){let r=new e(t);return r.streak=n.streak,r.lastTurn=n.lastTurn,r}},hH=class e{constructor(e){if(this.index=-1,this.remaining=0,e.length===0)throw Error(`a multi-stage ability needs at least one stage`);this.stages=e}get active(){return this.index>=0}get stage(){return this.index>=0?this.stages[this.index]:null}start(){return!this.active&&(this.index=0,this.remaining=this.stages[0].duration,!0)}advance(){return!this.active||(this.remaining--,this.remaining>0)?null:(this.index++,this.index>=this.stages.length?(this.index=-1,`done`):(this.remaining=this.stages[this.index].duration,this.stages[this.index].name))}cancel(){this.index=-1,this.remaining=0}toJSON(){return{index:this.index,remaining:this.remaining}}static fromJSON(t,n){let r=new e(t);return r.index=n.index,r.remaining=n.remaining,r}},gH=class e{constructor(e){if(this.index=0,this.state=`idle`,typeof e.damage!=`function`&&!Number.isFinite(e.damage))throw Error(`beam damage must be a finite number or a function`);if(typeof e.damage==`number`&&e.damage<0)throw Error(`beam damage must be non-negative`);if(this.options=e,this.shape=e.shape??(e.fronts?`fronts`:`line`),e.fronts){let t=e.fronts([{...e.from}],0);this.fronts=t.length?[t.map(e=>({...e}))]:[]}else this.fronts=HV(e.level,e.from,e.target,{kind:`line`}).slice(1).map(e=>[{...e}])}get active(){return this.state===`active`}get done(){return this.state===`done`||this.state===`blocked`||this.state===`cancelled`}get beamShape(){return this.shape}get currentPath(){return this.fronts.flat().map(e=>({...e}))}start(){return this.state===`idle`&&(this.state=this.fronts.length===0?`done`:`active`,!0)}advance(){if(this.state!==`active`)return this.inactiveStep();let e=this.fronts[this.index]??[],t=Math.max(0,this.fronts.length-this.index-1),n=[],r=[],i=0;for(let a of e){let e={cell:{...a},step:this.index,remaining:t};if(!this.blocked(a,e)){n.push({...a}),this.options.onCell?.({...a},e);for(let t of this.options.targetsAt?.(a)??[]){let n=typeof this.options.damage==`function`?this.options.damage(t,e):this.options.damage;if(!Number.isFinite(n)||n<0)throw Error(`beam damage callback must return a non-negative finite number`);i+=n,r.push(t),this.options.applyDamage?.(t,n,e)}}}let a=this.index;if(this.index++,this.options.fronts&&n.length>0){let e=this.options.fronts(n.map(e=>({...e})),this.index);e.length&&this.fronts.push(e.map(e=>({...e})))}return n.length===0?this.state=`blocked`:this.index>=this.fronts.length&&(this.state=`done`),{status:n.length===0?`blocked`:this.state,cell:n[0]?{...n[0]}:null,cells:n.map(e=>({...e})),step:a,remaining:t,targets:[...r],damage:i}}cancel(){(this.state===`active`||this.state===`idle`)&&(this.state=`cancelled`)}toJSON(){return{state:this.state,fronts:this.fronts.map(e=>e.map(e=>({...e}))),index:this.index,shape:this.shape}}static fromJSON(t,n){let r=n.shape??(t.fronts?`fronts`:`line`);if(t.shape!==void 0&&t.shape!==r)throw Error(`beam save is shape "${r}", not "${t.shape}"`);let i=Object.create(e.prototype);return i.options=t,i.shape=r,i.fronts=n.fronts?n.fronts.map(e=>e.map(e=>({...e}))):(n.path??[]).map(e=>[{...e}]),i.index=n.index,i.state=n.state,i}blocked(e,t){let n=this.options.blocker??(this.options.stopAtOpaque===!1?`none`:`terrain`),r=!1;return n===`terrain`?r=!this.options.level.inside(e.x,e.y)||!this.options.level.transparent(e.x,e.y):n!==`none`&&(r=n({...e},t)===!0),r||this.options.isBlocked?.({...e},t)===!0}inactiveStep(){return{status:this.state,cell:null,cells:[],step:this.index,remaining:Math.max(0,this.fronts.length-this.index),targets:[],damage:0}}};_e();function _H(e,t={}){return(t.within?[...t.within]:bH(e.cellCount)).filter(n=>!(t.occupied?.has(n)||t.terrain&&!t.terrain.has(e.terrain[n])))}function vH(e,t,n){let r=new Set([t]),i=[t];for(let t=0;t<Math.max(0,n);t++){let t=[];for(let n of i)e.forEachNeighbor(e.xOf(n),e.yOf(n),8,(n,i)=>{if(!e.inside(n,i))return;let a=e.index(n,i);r.has(a)||(r.add(a),t.push(a))});i=t}return r.delete(t),[...r]}function yH(e,t){let n=[...new Set(e)];oe(n);let r=n.slice(0,Math.max(0,t));return{cells:r,trace:{requested:t,available:n.length,selected:r}}}function bH(e){let t=Array(e);for(let n=0;n<e;n++)t[n]=n;return t}var xH=l({AbilityCycle:()=>dH,BossPhases:()=>uH,CombatHooks:()=>fH,DUNGEON_KINDS:()=>XB,Doors:()=>lH,Elevation:()=>eH,FLOOR:()=>VB,FeatureLayer:()=>hV,FieldOfView:()=>$V,Level:()=>HB,MultiStageAbility:()=>hH,MultiTurnBeam:()=>gH,Pathfinder:()=>tH,Scheduler:()=>nH,Secrets:()=>cH,Stealth:()=>pH,TargetingController:()=>QV,TriggerTracker:()=>mH,WALL:()=>BB,areaFalloffMultiplier:()=>XV,ballistica:()=>RV,canTarget:()=>BV,candidateCells:()=>_H,cellsNear:()=>vH,chainTargets:()=>JV,chebyshevDistance:()=>IV,checkDeterminism:()=>xV,compareDungeonArtifacts:()=>bV,coneCells:()=>WV,coneSector:()=>qV,decideMonsterAI:()=>rH,eligibleBuilders:()=>JB,findFreeCell:()=>tV,furthestRoom:()=>nV,generateCave:()=>sV,generateDungeon:()=>QB,generateDungeonGraph:()=>ZB,generateOverworld:()=>pV,hallBuilder:()=>GB,hasLineOfSight:()=>zV,hexConeCells:()=>UV,knockbackPath:()=>ZV,neighbourOffsets:()=>zB,pickBuilder:()=>YB,rangeMultiplier:()=>YV,rectCenter:()=>UB,rectsOverlap:()=>WB,resolveArea:()=>VV,resolveAreaOnLevel:()=>HV,rollRoster:()=>gV,selectDistinctCells:()=>yH,traceLine:()=>LV});function SH(e,t){let n=e=>t.filter(t=>t.op===e).sort((e,t)=>(e.order??0)-(t.order??0)),r=e;for(let e of n(`add`))r+=e.value;for(let e of n(`multiply`))r*=e.value;for(let e of n(`set`))r=e.value;return r}var CH=class e{constructor(e){this.modifiers=[],this.cache=null,this.baseValues={...e.base},this.derived=e.derived??[]}base(e){return this.baseValues[e]??0}setBase(e,t){this.baseValues[e]=t,this.cache=null}addModifier(e){this.modifiers.push(e),this.cache=null}removeModifier(e){let t=this.modifiers.indexOf(e);t!==-1&&this.modifiers.splice(t,1),this.cache=null}removeModifiersFrom(e){this.modifiers=this.modifiers.filter(t=>t.source!==e),this.cache=null}get(e){return this.resolveAll()[e]??0}resolveAll(){if(this.cache)return this.cache;let e={...this.baseValues};for(let t of Object.keys(e))e[t]=SH(e[t],this.modifiersFor(t));for(let t of this.derived)e[t.name]=SH(t.from(e),this.modifiersFor(t.name));return this.cache=e,e}modifiersFor(e){return this.modifiers.filter(t=>t.stat===e)}toJSON(){return{base:{...this.baseValues}}}static fromJSON(t,n){let r=new e(t);return r.baseValues={...t.base,...n.base},r.cache=null,r}};function wH(e,t,n){return{maxLevel:n,experienceFor:n=>n<=1?0:Math.round(e*(n-1)**t)}}var TH=class e{constructor(e,t={}){this.curve=e,this.level=t.level??1,this.experience=t.experience??this.curve.experienceFor(this.level)}get experienceToNext(){return this.level>=this.curve.maxLevel?null:this.curve.experienceFor(this.level+1)-this.experience}addExperience(e){this.experience+=e;let t=0;for(;this.level<this.curve.maxLevel&&this.experience>=this.curve.experienceFor(this.level+1);)this.level++,t++;return t}toJSON(){return{level:this.level,experience:this.experience}}static fromJSON(t,n){return new e(t,n)}};_e();function EH(e,t,n=()=>ne(1,20)){return e+n()>=t}var DH=class e{constructor(e,t={}){this.available=0,this.stats=e,this.capFor=t.cap??(()=>1/0),this.costFor=t.cost??(()=>1)}get points(){return this.available}grant(e){this.available+=e}canSpend(e){return this.nextRankCost(e)!==null}spend(e){let t=this.nextRankCost(e);if(t===null)return!1;let n=this.stats.base(e);return this.available-=t,this.stats.setBase(e,n+1),!0}nextRankCost(e){let t=this.stats.base(e);if(t>=this.capFor(e))return null;let n=this.costFor(e,t+1);return this.available>=n?n:null}toJSON(){return{points:this.available}}static fromJSON(t,n,r){let i=new e(t,n);return i.available=r.points,i}},OH=class e{constructor(e,t=null,n={}){this.worn=new Map,this.names=new Set(e),this.stats=t,this.isSlotLocked=n.locked??(()=>!1)}get(e){return this.worn.get(e)}isLocked(e){let t=this.worn.get(e);return t!==void 0&&this.isSlotLocked(e,t)}equip(e,t){if(this.assertSlot(e),this.isLocked(e))return;let n=this.unequip(e);return this.wear(e,t),n}wear(e,t){this.worn.set(e,t);for(let e of t.modifiers??[])this.stats?.addModifier({...e,source:t})}unequip(e){let t=this.worn.get(e);if(t&&!this.isSlotLocked(e,t))return this.worn.delete(e),this.stats?.removeModifiersFrom(t),t}get slots(){return[...this.names]}assertSlot(e){if(!this.names.has(e))throw Error(`no such equipment slot: "${e}"`)}toJSON(e){return{worn:[...this.worn].map(([t,n])=>[t,e(n)])}}static fromJSON(t,n){let r=new e(t.slots,t.stats??null,{locked:t.locked});for(let[e,i]of n.worn)r.assertSlot(e),r.wear(e,t.resolve(i));return r}},kH=class e{constructor(e={}){this.slots=[],this.capacity=e.capacity}get items(){return this.slots}get totalWeight(){return this.slots.reduce((e,t)=>e+this.weightOf(t),0)}weightOf(e){return(e.weight??0)*e.quantity+(e.contents?.totalWeight??0)}find(e,t){return this.slots.find(n=>n.id===e&&(t===void 0||n.instanceId===t))}add(e){if(!Number.isFinite(e.quantity)||e.quantity<=0||e.weight!==void 0&&(!Number.isFinite(e.weight)||e.weight<0)||this.capacity!==void 0&&this.totalWeight+this.weightOf(e)>this.capacity)return!1;if(e.stackable){let t=this.slots.find(t=>t.id===e.id&&t.stackable&&t.instanceId===e.instanceId);if(t)return t.quantity+=e.quantity,!0}return this.slots.push({...e}),!0}remove(e,t,n){if(t!==void 0&&(!Number.isFinite(t)||t<=0))return;let r=this.slots.findIndex(t=>t.id===e&&(n===void 0||t.instanceId===n));if(r===-1)return;let i=this.slots[r];i.quantity-=t??i.quantity,i.quantity<=0&&this.slots.splice(r,1)}take(e,t=1,n){if(!Number.isFinite(t)||t<=0)return;let r=this.slots.findIndex(t=>t.id===e&&(n===void 0||t.instanceId===n));if(r===-1)return;let i=this.slots[r],a=Math.min(Math.floor(t),i.quantity);if(a<=0)return;let o={...i,quantity:a};return i.quantity-=a,i.quantity<=0&&this.slots.splice(r,1),o}toJSON(){return{capacity:this.capacity,slots:this.slots.map(e=>({id:e.id,quantity:e.quantity,instanceId:e.instanceId,identified:e.identified,cursed:e.cursed,blessed:e.blessed,level:e.level,affix:e.affix,durability:e.durability,maxDurability:e.maxDurability,contents:e.contents?.toJSON()}))}}static fromJSON(t,n){let r=new e({capacity:n.capacity});return r.slots=n.slots.map(n=>{let r=t.get(n.id);if(!r)throw Error(`Inventory.fromJSON: no definition for item "${n.id}"`);let{contents:i,...a}=n,o={...r,...AH(a),id:n.id,quantity:n.quantity};return i&&(o.contents=e.fromJSON(t,i)),o}),r}};function AH(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function jH(e,t){return t.matches?t.matches(e):t.category===void 0?typeof t.id==`string`?e.id===t.id:(t.id??[]).includes(e.id):e.category===t.category}function MH(e){return e.matches!==void 0||e.category!==void 0||e.id!==void 0}function NH(e,t){let n=new Map;for(let t of e.items)n.set(t,t.quantity);let r=new Map;for(let i of t.ingredients){if(!MH(i))throw Error(`recipe ingredient must name an id, a category, or a matches predicate`);if(!Number.isFinite(i.quantity)||i.quantity<=0)throw Error(`recipe ingredient quantity must be a positive number`);let t=i.quantity;for(let a of e.items){if(t<=0)break;let e=n.get(a)??0;if(e<=0||!jH(a,i))continue;let o=Math.min(e,t);n.set(a,e-o),t-=o,r.set(a,(r.get(a)??0)+o)}if(t>0)return!1}for(let[t,n]of r)e.remove(t.id,n,t.instanceId);if(e.add(t.result))return!0;for(let[t,n]of r)e.add({...t,quantity:n});return!1}function PH(e,t){let n=e.add({duration:t.duration,tick:e=>t.tick?.(e),onExpire:t.onExpire});return{cancel:()=>{e.remove(n),t.onExpire()}}}function FH(e,t,n){let r=Symbol(`statusEffect`);for(let t of n.modifiers)e.addModifier({...t,source:r});return PH(t,{duration:n.duration,tick:n.tick,onExpire:()=>e.removeModifiersFrom(r)})}_e();function IH(e,t={}){let n=e.entries.filter(e=>e.weight>0&&(t.curse===void 0||!!e.curse===t.curse)&&(t.predicate?.(e)??!0));if(n.length===0)return null;let r=ie(n.map(e=>e.weight));return r===null?null:n[r]}function LH(e){return e.affix}function RH(e,t){let n=e.affix!==void 0;e.affix=t.id,t.curse?e.cursed=!0:n&&(e.cursed=!1)}function zH(e){e.affix!==void 0&&(e.cursed=!1),delete e.affix}function BH(e,t){e.affix===void 0?zH(t):(t.affix=e.affix,t.cursed=e.cursed??!1)}function VH(e,t){return!(e.trigger!==t.trigger||e.kinds&&(t.kind===void 0||!e.kinds.includes(t.kind)))}function HH(e){e.identified=!0}function UH(e,t,n=`keep`){return Number.isFinite(t)?(e.level=(e.level??0)+t,n===`remove`&&zH(e),e.level):e.level??0}function WH(e,t){return e.maxDurability===void 0?!1:!Number.isFinite(t)||t<=0?(e.durability??e.maxDurability)<=0:(e.durability=Math.max(0,(e.durability??e.maxDurability)-t),e.durability<=0)}function GH(e,t){e.maxDurability!==void 0&&(!Number.isFinite(t)||t<=0||(e.durability=Math.min(e.maxDurability,(e.durability??e.maxDurability)+t)))}function KH(e,t,n){let r=new Map;for(let t of Object.keys(n.fields))r.set(t,e[t]),e[t]=n.fields[t];return PH(t,{duration:n.duration,tick:n.tick,onExpire:()=>{for(let[t,n]of r)e[t]=n}})}var qH=class e{constructor(e){this.progress=0,this.max=e.max,this.regenRate=e.regenRate,this.value=e.current??e.max}get current(){return this.value}canAfford(e){return this.value>=e}spend(e){return this.canAfford(e)?(this.value-=e,!0):!1}refund(e=1){let t=Math.min(e,this.max-this.value);return this.value+=t,t}advance(e=1){if(!(this.value>=this.max)){for(this.progress+=e;this.progress>=this.regenRate&&this.value<this.max;)this.progress-=this.regenRate,this.value++;this.value>=this.max&&(this.progress=0)}}toJSON(){return{current:this.value,progress:this.progress}}static fromJSON(t,n){let r=new e({...t,current:n.current});return r.progress=n.progress,r}};_e();function JH(e){if(e.entries.length===0||!A(e.chance??1))return null;let t=ie(e.entries.map(e=>e.weight));if(t===null)return null;let n=e.entries[t];return{id:n.id,quantity:n.quantity??1}}var YH=class e{constructor(e){this.grantedTiers=0,this.balance=0,this.choices=new Map,this.track=e}get points(){return this.balance}openTiers(e){let t=[];return this.track.tiers.forEach((n,r)=>{e>=n.threshold&&t.push(r)}),t}grant(e){let t=0;for(;this.grantedTiers<this.track.tiers.length&&e>=this.track.tiers[this.grantedTiers].threshold;){let e=this.track.tiers[this.grantedTiers];e.kind===`points`&&(this.balance+=e.points??0,t+=e.points??0),this.grantedTiers++}return t}spend(e){return this.balance<e?!1:(this.balance-=e,!0)}choose(e,t,n){let r=this.track.tiers[e];if(!r)throw Error(`no such advancement tier: ${e}`);if(r.kind===`points`)throw Error(`tier ${e} grants points, it has no choice`);if(n<r.threshold)throw Error(`tier ${e} has not opened yet`);if(this.choices.has(e))throw Error(`tier ${e} is already decided`);if(!(r.options??[]).some(e=>e.id===t))throw Error(`tier ${e} has no option "${t}"`);this.choices.set(e,t)}choice(e){return this.choices.get(e)??null}toJSON(){return{grantedTiers:this.grantedTiers,balance:this.balance,choices:[...this.choices]}}static fromJSON(t,n){let r=new e(t);r.grantedTiers=n.grantedTiers,r.balance=n.balance;for(let[e,t]of n.choices)r.choices.set(e,t);return r}};function XH(e,t){return t.map(t=>({stat:t.stat,op:t.op,value:t.base+t.perLevel*e}))}_e();function ZH(e){if(e.labels.length<e.kinds.length)throw Error(`not enough appearances: ${e.kinds.length} kinds but only ${e.labels.length} labels`);let t=[...e.labels];for(let e=t.length-1;e>0;e--){let n=O(0,e+1);[t[e],t[n]]=[t[n],t[e]]}let n=new Map;return e.kinds.forEach((e,r)=>n.set(e,t[r])),n}var QH=class e{constructor(e){this.assigned=new Map,this.tables=e}appearanceOf(e,t){let n=this.assigned.get(e);if(!n){let t=this.tables[e];if(!t)throw Error(`no such appearance category: "${e}"`);n=ZH(t),this.assigned.set(e,n)}let r=n.get(t);if(r===void 0)throw Error(`"${t}" is not in appearance category "${e}"`);return r}toJSON(){return{assigned:[...this.assigned].map(([e,t])=>[e,[...t]])}}static fromJSON(t,n){let r=new e(t);for(let[e,t]of n.assigned)r.assigned.set(e,new Map(t));return r}};function $H(e,t,n,r,i,a){let o=a.prices.get(r);if(!o)return!1;let s=t.find(r);if(!s||s.quantity<i)return!1;let c=o.buy*i;return e.base(a.currency)<c?!1:(t.remove(r,i),n.add({...s,quantity:i})?(e.setBase(a.currency,e.base(a.currency)-c),!0):(t.add({...s,quantity:i}),!1))}function eU(e,t,n,r,i,a){let o=a.prices.get(r);if(!o)return!1;let s=n.find(r);return!s||s.quantity<i?!1:(n.remove(r,i),t.add({...s,quantity:i})?(e.setBase(a.currency,e.base(a.currency)+o.sell*i),!0):(n.add({...s,quantity:i}),!1))}function tU(e){let t=Array.isArray(e)?e:[e];for(let e of t)if(!Number.isFinite(e.amount)||e.amount<0)throw Error(`a resource cost must be a non-negative number, "${e.stat}" costs ${e.amount}`);return t}function nU(e){let t=new Map;for(let n of e)t.set(n.stat,(t.get(n.stat)??0)+n.amount);return t}function rU(e,t){return[...nU(tU(t))].every(([t,n])=>e.base(t)>=n)}function iU(e,t){if(!rU(e,t))return!1;for(let[n,r]of nU(tU(t)))e.setBase(n,e.base(n)-r);return!0}function aU(e,t,n=1){for(let[r,i]of nU(tU(t)))e.setBase(r,e.base(r)+i*n)}function oU(e,t,n,r){return iU(e,t)?n.refund(Math.floor(t.amount/r)):0}var sU=class e{constructor(){this.layers=[]}add(e,t=0){e<=0||this.layers.push({amount:e,decayPerTick:t})}get total(){return this.layers.reduce((e,t)=>e+t.amount,0)}get layerCount(){return this.layers.length}absorb(e){let t=e,n=0;for(;t>0&&this.layers.length>0;){let e=this.layers[this.layers.length-1],r=Math.min(e.amount,t);e.amount-=r,t-=r,n+=r,e.amount<=0&&this.layers.pop()}return n}advance(e=1){for(let t=this.layers.length-1;t>=0;t--){let n=this.layers[t];n.decayPerTick&&(n.amount-=n.decayPerTick*e,n.amount<=0&&this.layers.splice(t,1))}}clear(){this.layers=[]}toJSON(){return{layers:this.layers.map(e=>({...e}))}}static fromJSON(t){let n=new e;return n.layers=t.layers.map(e=>({...e})),n}};_e();function cU(e,t,n){return oe([...t]).slice(0,Math.min(n,t.length)).map(t=>{let n=Symbol(`trait:${t.name}`);for(let r of t.modifiers)e.addModifier({...r,source:n});return{trait:t,source:n}})}var lU=class{constructor(){this.affected=new Map}update(e,t){let n=new Set(e),r=e.filter(e=>!!e.aura),i=new Set(r);for(let i of r){let r=this.affected.get(i);r||(r=new Map,this.affected.set(i,r));for(let n of e){if(n===i)continue;let e=t(i,n),a=r.get(n);if(e&&!a){let e=Symbol(`aura:${i.aura.name}`);for(let t of i.aura.modifiers)n.stats.addModifier({...t,source:e});r.set(n,e)}else!e&&a&&(n.stats.removeModifiersFrom(a),r.delete(n))}for(let[e,t]of[...r])n.has(e)||(e.stats.removeModifiersFrom(t),r.delete(e))}for(let[e,t]of[...this.affected])if(!i.has(e)){for(let[e,n]of t)e.stats.removeModifiersFrom(n);this.affected.delete(e)}}},uU=class e{constructor(e){if(this.points=new Map,e.some(e=>!e.id||!Number.isFinite(e.threshold)||e.threshold<0))throw Error(`support levels need an id and a non-negative threshold`);this.levels=[...e].sort((e,t)=>e.threshold-t.threshold)}get(e,t){return this.points.get(dU(e,t))??0}level(e,t){let n=this.get(e,t),r=null;for(let e of this.levels){if(e.threshold>n)break;r=e}return r}add(e,t,n){if(!e||!t||e===t)throw Error(`support needs two different named units`);if(!Number.isFinite(n))throw Error(`support amount must be finite, got ${n}`);let r=this.level(e,t),i=dU(e,t),a=Math.max(0,(this.points.get(i)??0)+n);return this.points.set(i,a),{a:e,b:t,points:a,previousLevel:r,level:this.level(e,t)}}toJSON(){return{pairs:[...this.points].map(([e,t])=>{let[n,r]=e.split(`\0`);return[n,r,t]})}}static fromJSON(t,n){let r=new e(t);for(let[e,t,i]of n.pairs){if(!e||!t||e===t||!Number.isFinite(i)||i<0)throw Error(`invalid support save data`);let n=dU(e,t);if(r.points.has(n))throw Error(`invalid support save data: duplicate pair "${e}" / "${t}"`);r.points.set(n,i)}return r}};function dU(e,t){return[e,t].sort().join(`\0`)}var fU=new Set([`id`,`growth`,`level`,`startingAffix`,`startingItem`,`lowHpReaction`]);function pU(e,t={},n){let r=new CH({base:vU(e)}),i;e.growth!==void 0&&(i=new TH(_U(e,t),{level:e.level??1}));let a;if(e.startingItem!==void 0){let n=t.items?.[e.startingItem];if(!n)throw Error(`entity template "${e.id}": unknown starting item "${e.startingItem}"`);if(a=n(),e.startingAffix!==void 0){let n=t.affixes?.[e.startingAffix];if(!n)throw Error(`entity template "${e.id}": unknown affix "${e.startingAffix}"`);RH(a,n)}}else if(e.startingAffix!==void 0)throw Error(`entity template "${e.id}": a starting affix needs a starting item to carry it`);let o=new Dn,s={id:e.id,stats:r,progression:i,item:a,reactions:o};if(e.lowHpReaction!==void 0){if(!n)throw Error(`entity template "${e.id}": names a lowHpReaction threshold but no onLowHp callback was given`);let t=e.lowHpReaction;o.add({id:`low-hp`,when:e=>e.hp/e.maxHp<=t,action:()=>n(s)})}return s}function mU(e,t={},n){return e.map(e=>pU(e,t,n))}function hU(e){let t={stats:e.stats.toJSON()};return e.progression&&(t.progression=e.progression.toJSON()),e.item&&(t.item=e.item),t}function gU(e,t,n,r){let i=pU(e,t,r);if(i.stats=CH.fromJSON({base:vU(e)},n.stats),n.progression!==void 0){if(!i.progression)throw Error(`entity template "${e.id}": save data has progression but the row names no growth curve`);i.progression=TH.fromJSON(_U(e,t),n.progression)}return n.item!==void 0&&(i.item=n.item),i}function _U(e,t){let n=t.growthCurves?.[e.growth??``];if(!n)throw Error(`entity template "${e.id}": unknown growth curve "${e.growth}"`);return n}function vU(e){let t={};for(let[n,r]of Object.entries(e))if(!fU.has(n)){if(typeof r!=`number`)throw Error(`entity template "${e.id}": stat "${n}" must be a number, got ${typeof r}`);t[n]=r}return t}var yU=l({Advancement:()=>YH,Appearances:()=>QH,AuraField:()=>lU,Barrier:()=>sU,Charges:()=>qH,EquipmentSlots:()=>OH,Inventory:()=>kH,Progression:()=>TH,SkillPoints:()=>DH,StatBlock:()=>CH,SupportLedger:()=>uU,affixOf:()=>LH,applyAffix:()=>RH,applyItemStatusEffect:()=>KH,applyStatusEffect:()=>FH,assignAppearances:()=>ZH,assignTraits:()=>cU,buildEntities:()=>mU,buildEntity:()=>pU,buy:()=>$H,canAfford:()=>rU,composeModifiers:()=>SH,convertToCharges:()=>oU,copyAffix:()=>BH,craft:()=>NH,damageItem:()=>WH,enchant:()=>UH,fromEntitySaveState:()=>gU,identify:()=>HH,matchesContext:()=>VH,powerCurve:()=>wH,refund:()=>aU,removeAffix:()=>zH,repairItem:()=>GH,rollAffix:()=>IH,rollLoot:()=>JH,scaledModifiers:()=>XH,sell:()=>eU,skillCheck:()=>EH,spend:()=>iU,toEntitySaveState:()=>hU}),bU=class{constructor(){this.factories=new Map,this.loaded=new Map,this.currentId=null}define(e,t,n={}){this.factories.set(e,{create:t,persistent:n.persistent??!0})}enter(e,t){let n=this.factories.get(e);if(!n)throw Error(`no such map: "${e}"`);let r=this.loaded.get(e);return(!r||!n.persistent)&&(r=n.create(),this.loaded.set(e,r)),this.currentId=e,this.lastSpawn=t,r}get current(){return this.currentId?this.loaded.get(this.currentId)??null:null}get currentMapId(){return this.currentId}get spawn(){return this.lastSpawn}isLoaded(e){return this.loaded.has(e)}isPersistent(e){return this.factories.get(e)?.persistent??!0}unload(e){if(e===this.currentId)throw Error(`cannot unload the current map: "${e}"`);this.loaded.delete(e)}},xU=class{constructor(){this.locations=new Map}add(e){this.locations.set(e.id,e)}remove(e){this.locations.delete(e)}get(e){return this.locations.get(e)}at(e,t){for(let n of this.locations.values())if(n.x===e&&n.y===t)return n}get all(){return[...this.locations.values()]}},SU=class{constructor(){this.turn=0,this.effects=new Map}add(e){let t=Symbol();return this.effects.set(t,{...e}),t}remove(e){this.effects.delete(e)}has(e){return this.effects.has(e)}advance(e=1){this.turn+=e;for(let[t,n]of this.effects)n.tick(this.turn),n.duration!==void 0&&(n.duration-=e,n.duration<=0&&(this.effects.delete(t),n.onExpire?.()))}};_e();function CU(e){if(e.entries.length===0||!A(e.rate))return null;let t=ie(e.entries.map(e=>e.weight));return t===null?null:e.entries[t].value}var wU=class e{constructor(e={}){if(this.changed=new p,this.dayLength=e.dayLength??120,!(this.dayLength>0))throw Error(`an environment day must be longer than zero seconds`);if(this.boundaries=e.phaseBoundaries??[.2,.7,.8],this.boundaries[0]<=0||this.boundaries[0]>=this.boundaries[1]||this.boundaries[1]>=this.boundaries[2]||this.boundaries[2]>=1)throw Error(`environment phase boundaries must be ascending fractions strictly between 0 and 1`);if(this.seconds_=e.startSeconds??0,this.weather_=e.startWeather??`clear`,!Number.isFinite(this.seconds_))throw Error(`environment startSeconds must be finite`)}get day(){return Math.floor(this.seconds_/this.dayLength)}get seconds(){return this.seconds_}get weather(){return this.weather_}get phase(){let e=(this.seconds_%this.dayLength+this.dayLength)%this.dayLength/this.dayLength;return e<this.boundaries[0]?`dawn`:e<this.boundaries[1]?`day`:e<this.boundaries[2]?`dusk`:`night`}get night(){return this.phase===`night`}update(e){if(!Number.isFinite(e)||e<0)throw Error(`environment update must be non-negative, got ${e}`);this.seconds_+=e;let t=this.toJSON();return this.changed.dispatch(t),t}setWeather(e){if(!e)throw Error(`weather needs a non-empty id`);this.weather_=e;let t=this.toJSON();return this.changed.dispatch(t),t}toJSON(){return{day:this.day,seconds:this.seconds_,phase:this.phase,weather:this.weather_}}static fromJSON(t,n){return new e({...t,startSeconds:n.seconds,startWeather:n.weather})}},TU=class e{constructor(e){if(e.sides.length===0)throw Error(`SideTurns needs at least one side`);if(e.schedule.length===0)throw Error(`SideTurns needs a non-empty schedule`);let t=e.round??1,n=e.sideIndex??0,r=e.timeIndex??0;if(!Number.isInteger(t)||t<1)throw Error(`SideTurns round must be a positive integer`);if(n<0||n>=e.sides.length)throw Error(`SideTurns side index ${n} is outside ${e.sides.length} sides`);if(r<0||r>=e.schedule.length)throw Error(`SideTurns time index ${r} is outside ${e.schedule.length} times`);this.sides=[...e.sides],this.schedule=[...e.schedule],this.areas=e.areas??[],this.state={round:t,sideIndex:n,timeIndex:r}}get round(){return this.state.round}get side(){return this.sides[this.state.sideIndex]}get timeIndex(){return this.state.timeIndex}get timeOfDay(){return this.schedule[this.state.timeIndex]}get snapshot(){return{...this.state}}timeOfDayAt(e,t){for(let n of this.areas)if(n.contains(e,t))return n.times[this.state.timeIndex]??this.timeOfDay;return this.timeOfDay}lawfulBonusAt(e,t,n){return EU(e,this.timeOfDayAt(t,n).lawfulBonus)}advance(){let e=!1;return this.state.sideIndex++,this.state.sideIndex>=this.sides.length&&(this.state.sideIndex=0,this.state.round++,this.state.timeIndex=(this.state.timeIndex+1)%this.schedule.length,e=!0),{side:this.side,round:this.state.round,newRound:e}}toJSON(){return this.snapshot}static fromJSON(t,n){return new e({...t,round:n.round,sideIndex:n.sideIndex,timeIndex:n.timeIndex})}};function EU(e,t){switch(e){case`lawful`:return t;case`chaotic`:return-t;default:return 0}}var DU=l({EnvironmentClock:()=>wU,Overworld:()=>xU,SideTurns:()=>TU,TurnClock:()=>SU,World:()=>bU,alignmentBonus:()=>EU,rollEncounter:()=>CU});_e();function OU(e,t,n={}){let r=n.pick??O,i=0;return t.forEach((t,n)=>{kU(t,t.name??`#${n+1}`,e.shape);let a=AU(e,t);if(i+=a.length,a.length!==0)for(let[n,i]of a){let a=t.outputs[r(t.outputs.length)];for(let[r,o]of Object.entries(a))for(let a=0;a<t.height;a++)for(let s=0;s<t.width;s++){let c=o[a*t.width+s];c!==-1&&e.setTile(r,n+s,i+a,c)}}}),i}function kU(e,t,n){if(e.topology&&(n===`square`||n===`hex`)&&e.topology!==n)throw Error(`automap rule "${t}" targets ${e.topology} cells, but the map is ${n}`);if(!Number.isInteger(e.width)||e.width<=0||!Number.isInteger(e.height)||e.height<=0)throw Error(`automap rule "${t}" needs a positive width and height`);if(e.outputs.length===0)throw Error(`automap rule "${t}" has no outputs - a rule that matches and writes nothing is a mistake`);let r=e.width*e.height;for(let[n,i]of Object.entries(e.input))if(i.length!==r)throw Error(`automap rule "${t}" input "${n}" has ${i.length} cells, but the pattern is ${r}`);e.outputs.forEach((e,n)=>{for(let[i,a]of Object.entries(e))if(a.length!==r)throw Error(`automap rule "${t}" output ${n+1} "${i}" has ${a.length} cells, but the pattern is ${r}`)})}function AU(e,t){let n=[];for(let r=0;r+t.height<=e.heightInTiles;r++)for(let i=0;i+t.width<=e.widthInTiles;i++)jU(e,t,i,r)&&n.push([i,r]);return n}function jU(e,t,n,r){for(let[i,a]of Object.entries(t.input))for(let o=0;o<t.height;o++)for(let s=0;s<t.width;s++){let c=a[o*t.width+s];if(c!==-1&&e.getTile(i,n+s,r+o)!==c)return!1}return!0}var MU=class e{constructor(){this.switches=new Map,this.variables=new Map}switch(e){return this.switches.get(e)??!1}setSwitch(e,t){this.switches.set(e,t)}variable(e){return this.variables.get(e)??0}setVariable(e,t){this.variables.set(e,t)}toJSON(){return{switches:[...this.switches],variables:[...this.variables]}}static fromJSON(t){let n=new e;for(let[e,r]of t.switches)n.setSwitch(e,r);for(let[e,r]of t.variables)n.setVariable(e,r);return n}};function NU(e,t){return`switch`in e?t.switch(e.switch)===e.equals:t.variable(e.variable)>=e.atLeast}function PU(e,t){let n;for(let r of e.pages)(r.conditions??[]).every(e=>NU(e,t))&&(n=r);return n}var FU=class{constructor(e){this.cancelled=!1,this.options=e,this.state={game:e.game,answers:{}}}cancel(){this.cancelled=!0}async run(e){let t=await this.runList(e);if(t!==void 0){if(this.options.onUnknownCommand)return this.options.onUnknownCommand({goto:t}),this.state;throw Error(`a "goto ${t}" only runs inside runStory, not a straight run`)}return this.state}async runStory(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))throw Error(`this event story has no passage named "${t}"`);let n=e[t],r=0;for(;r<n.length&&!this.cancelled;){let t=await this.step(n[r]);if(r++,t!==void 0){if(!Object.prototype.hasOwnProperty.call(e,t))throw Error(`this event story has no passage named "${t}"`);n=e[t],r=0}}return this.state}async runList(e){for(let t of e){if(this.cancelled)break;let e=await this.step(t);if(e!==void 0)return e}}async step(e){if(`say`in e)await this.speak(e.say,e.speaker,e.portrait);else{if(`ask`in e){let t=await this.speak(e.ask,e.speaker,e.portrait,e.choices);return e.store&&(this.state.answers[e.store]=t),e.choices.find(e=>(e.value??e.text)===t)?.goto}if(`wait`in e)await new Promise(t=>setTimeout(t,e.wait*1e3));else if(`setSwitch`in e)this.state.game.setSwitch(e.setSwitch,e.value);else if(`setVariable`in e)this.state.game.setVariable(e.setVariable,e.value);else if(`addVariable`in e){let t=this.state.game.variable(e.addVariable);this.state.game.setVariable(e.addVariable,t+e.amount)}else{if(`if`in e){let t=NU(e.if,this.state.game);return this.runList(t?e.then:e.else??[])}if(`move`in e)await this.options.move?.(e.move.target,e.move.steps);else{if(`goto`in e)return e.goto;`call`in e?await e.call(this.state):this.options.onUnknownCommand?.(e)}}}}speak(e,t,n,r){return this.options.present({text:e,speaker:t,portrait:n,choices:r})}};function IU(e,t){t&&e.has?.(t)&&e.play?.(t)}var LU=class{constructor(e,t,n,r){this.facing=`down`,this.target=null,this.progress=0,this.sprite=e,this.x=this.fromX=t,this.y=this.fromY=n,this.tileWidth=r.tileWidth,this.tileHeight=r.tileHeight,this.speed=r.speed??4,this.options=r,this.place(),this.playIdle()}get isMoving(){return this.target!==null}turnTo(e,t){this.target||(this.facing=RU(e,t),this.playIdle())}moveBy(e,t){return!this.target&&(this.facing=RU(e,t),this.fromX=this.x,this.fromY=this.y,this.target={x:this.x+e,y:this.y+t},this.progress=0,this.playWalk(),!0)}jumpBy(e,t){return!this.target&&(this.facing=RU(e,t),this.x+=e,this.y+=t,this.fromX=this.x,this.fromY=this.y,this.place(),this.playIdle(),!0)}update(e){this.sprite.update?.(e),this.target&&(this.progress=Math.min(1,this.progress+this.speed*e),this.sprite.x=zU(this.fromX,this.target.x,this.progress)*this.tileWidth,this.sprite.y=zU(this.fromY,this.target.y,this.progress)*this.tileHeight,this.progress>=1&&(this.x=this.target.x,this.y=this.target.y,this.target=null,this.playIdle()))}place(){this.sprite.x=this.x*this.tileWidth,this.sprite.y=this.y*this.tileHeight}playWalk(){IU(this.sprite,this.options.walkAnimation?.(this.facing))}playIdle(){IU(this.sprite,this.options.idleAnimation?.(this.facing))}};function RU(e,t){return e>0?`right`:e<0?`left`:t>0?`down`:`up`}function zU(e,t,n){return e+(t-e)*n}var BU=[`up`,`down`,`left`,`right`],VU={up:{dx:0,dy:-1},down:{dx:0,dy:1},left:{dx:-1,dy:0},right:{dx:1,dy:0}},HU={up:{around:`down`,left90:`left`,right90:`right`},down:{around:`up`,left90:`right`,right90:`left`},left:{around:`right`,left90:`down`,right90:`up`},right:{around:`left`,left90:`up`,right90:`down`}},UU=class{constructor(e,t,n={}){this.index=0,this.waiting=0,this.mover=e,this.route=t,this.options=n}get done(){return!this.route.repeat&&this.index>=this.route.steps.length}update(e){if(this.mover.isMoving||this.done||this.waiting>0&&(this.waiting=Math.max(0,this.waiting-e),this.waiting>0))return;this.index>=this.route.steps.length&&(this.index=0);let t=this.route.steps[this.index];(this.runStep(t)||this.route.skippable)&&this.index++}runStep(e){if(`turn`in e){let{dx:t,dy:n}=this.resolveTurn(e);return this.mover.turnTo(t,n),!0}if(`wait`in e)return this.waiting=e.wait,!0;if(`jump`in e)return this.attempt(e.jump.dx,e.jump.dy,(e,t)=>this.mover.jumpBy(e,t));if(`step`in e)return this.attempt(e.step.dx,e.step.dy,(e,t)=>this.mover.moveBy(e,t));let{dx:t,dy:n}=this.resolveDirection(e);return this.attempt(t,n,(e,t)=>this.mover.moveBy(e,t))}resolveDirection(e){return e.dir===`random`?VU[this.pickDirection()]:e.dir===`forward`?VU[this.mover.facing]:e.dir===`backward`?VU[HU[this.mover.facing].around]:e.dir===`toward`||e.dir===`away`?this.resolveAim(e.dir,e):VU[e.dir]}resolveTurn(e){if(e.turn===`random`)return VU[this.pickDirection()];if(e.turn===`around`||e.turn===`left90`||e.turn===`right90`)return VU[HU[this.mover.facing][e.turn]];if(e.turn===`toward`||e.turn===`away`){let t=this.resolveAim(e.turn,e);return t.dx===0&&t.dy===0?VU[this.mover.facing]:t}return VU[e.turn]}resolveAim(e,t){let n=`target`in t?t.target():t,r=e===`toward`?1:-1,i=n.x-this.mover.x,a=n.y-this.mover.y;return Math.abs(i)>=Math.abs(a)?{dx:r*Math.sign(i)||0,dy:0}:{dx:0,dy:r*Math.sign(a)||0}}attempt(e,t,n){return e===0&&t===0?!0:this.options.canMove&&!this.options.canMove(e,t)?!1:n(e,t)}pickDirection(){let e=this.options.random??Math.random;return BU[Math.floor(e()*BU.length)]}},WU=class{constructor(e,t,n,r={}){this.facing=0,this.moving=!1,this.sprite=e,this.x=t,this.y=n,this.speed=r.speed??4,this.options=r,this.place(),this.playIdle()}get isMoving(){return this.moving}move(e,t,n){let r=Math.hypot(e,t);r>0?(this.facing=Math.atan2(t,e),this.x+=e/r*this.speed*n,this.y+=t/r*this.speed*n,this.moving||(this.moving=!0,this.playWalk())):this.moving&&(this.moving=!1,this.playIdle()),this.place(),this.sprite.update?.(n)}turnTo(e,t){this.moving||e===0&&t===0||(this.facing=Math.atan2(t,e),this.playIdle())}place(){this.sprite.x=this.x,this.sprite.y=this.y}playWalk(){IU(this.sprite,this.options.walkAnimation?.(this.facing))}playIdle(){IU(this.sprite,this.options.idleAnimation?.(this.facing))}};function GU(e,t){return e.x<t.x+t.width&&e.x+e.width>t.x&&e.y<t.y+t.height&&e.y+e.height>t.y}function KU(e,t){let n=e.x-t.x,r=e.y-t.y,i=e.radius+t.radius;return n*n+r*r<i*i}function qU(e,t){let n=kn(e.x,t.x,t.x+t.width),r=kn(e.y,t.y,t.y+t.height),i=e.x-n,a=e.y-r;return i*i+a*a<e.radius*e.radius}function JU(e,t,n,r){let{tileSize:i,isSolid:a}=r;if(!(i>0))throw Error(`collision tileSize must be positive`);let o=YU(e.x,e.y,e.width,e.height,t,i,a,!0);return{x:o,y:YU(o,e.y,e.width,e.height,n,i,a,!1)}}function YU(e,t,n,r,i,a,o,s){if(i===0)return s?e:t;let c=s?e:t,l=s?n:r,u=c+i,d=Math.floor((s?t:e)/a),f=Math.floor(((s?t+r:e+n)-1e-6)/a),p=(e,t)=>s?o(e,t):o(t,e);if(i>0){let e=Math.floor((c+l-1e-6)/a),t=Math.floor((u+l-1e-6)/a);for(let n=e+1;n<=t;n++)for(let e=d;e<=f;e++)if(p(n,e))return n*a-l}else{let e=Math.floor(c/a),t=Math.floor(u/a);for(let n=e-1;n>=t;n--)for(let e=d;e<=f;e++)if(p(n,e))return(n+1)*a}return u}var XU=class e{constructor(){this.definitions=new Map,this.stageIndex=new Map,this.tracked=null}define(e){this.definitions.set(e.id,e)}track(e){e!==null&&this.require(e),this.tracked=e}trackedQuest(){return this.tracked!==null&&this.status(this.tracked)===`active`?this.tracked:null}trackedLocation(){let e=this.trackedQuest();return e?this.currentStage(e)?.location??null:null}markerFor(e,t){return e.some(e=>this.status(e)===`active`&&this.stageSatisfied(e,t))?`turnIn`:e.some(e=>this.status(e)===`available`)?`offer`:`none`}canStart(e){return(this.require(e).requires??[]).every(e=>this.status(e)===`complete`)}start(e){if(!this.canStart(e))throw Error(`quest "${e}" cannot start yet - a prerequisite is incomplete`);this.stageIndex.set(e,0)}status(e){let t=this.require(e),n=this.stageIndex.get(e);return n===void 0?this.canStart(e)?`available`:`unavailable`:n>=t.stages.length?`complete`:`active`}currentStage(e){return this.status(e)===`active`?this.require(e).stages[this.stageIndex.get(e)]:null}progress(e,t){let n=this.currentStage(e);return n?.counter?Math.min(1,t.variable(n.counter.variable)/n.counter.target):null}advanceStage(e,t){return this.stageSatisfied(e,t)?(this.stageIndex.set(e,this.stageIndex.get(e)+1),!0):!1}stageSatisfied(e,t){let n=this.currentStage(e);return n?n.condition?NU(n.condition,t):!n.counter||t.variable(n.counter.variable)>=n.counter.target:!1}require(e){let t=this.definitions.get(e);if(!t)throw Error(`no such quest: "${e}"`);return t}toJSON(){return{stageIndex:[...this.stageIndex],tracked:this.tracked}}static fromJSON(t,n){let r=new e;for(let e of t)r.define(e);for(let[e,t]of n.stageIndex)r.stageIndex.set(e,t);return n.tracked&&(r.tracked=n.tracked),r}};function ZU(e){let t=[],n=new Map;for(let r of e){let e=n.get(r.questId);e||(e={id:r.questId,stages:[]},r.requires!==void 0&&(e.requires=r.requires),n.set(r.questId,e),t.push(r.questId)),e.stages.push(QU(e.id,r))}return t.map(e=>n.get(e))}function QU(e,t){if(t.conditionSwitch!==void 0&&t.conditionVariable!==void 0)throw Error(`quest "${e}": a stage row cannot name both a condition switch and a condition variable`);let n={};if(t.conditionSwitch!==void 0){if(t.conditionEquals===void 0)throw Error(`quest "${e}": conditionSwitch needs a conditionEquals`);n.condition={switch:t.conditionSwitch,equals:t.conditionEquals}}else if(t.conditionVariable!==void 0){if(t.conditionAtLeast===void 0)throw Error(`quest "${e}": conditionVariable needs a conditionAtLeast`);n.condition={variable:t.conditionVariable,atLeast:t.conditionAtLeast}}if(t.counterVariable!==void 0){if(t.counterTarget===void 0)throw Error(`quest "${e}": counterVariable needs a counterTarget`);n.counter={variable:t.counterVariable,target:t.counterTarget}}if(t.description!==void 0&&(n.description=t.description),t.locationMap!==void 0||t.locationX!==void 0||t.locationY!==void 0){if(t.locationX===void 0||t.locationY===void 0)throw Error(`quest "${e}": a stage location needs both locationX and locationY`);n.location={x:t.locationX,y:t.locationY},t.locationMap!==void 0&&(n.location.map=t.locationMap)}return n}var $U=class{constructor(e){this.name=e}},eW=4,tW=8,nW=new WeakMap;function rW(e){return nW.get(e)}function iW(e,t){return nW.set(e,t),e}var aW=1e3,oW=class{constructor(e){this.pos=0,this.depth=0,this.symbols=[],this.objects=[],this.bytes=e}byte(){if(this.pos>=this.bytes.length)throw Error(`Marshal: unexpected end of input`);return this.bytes[this.pos++]}take(e){if(e<0)throw Error(`Marshal: negative length`);let t=this.bytes.subarray(this.pos,this.pos+e);if(t.length<e)throw Error(`Marshal: unexpected end of input`);return this.pos+=e,t}readFixnum(){let e=this.byte()<<24>>24;if(e===0)return 0;if(e>=5&&e<=127)return e-5;if(e<=-5&&e>=-128)return e+5;if(e>0){let t=0;for(let n=0;n<e;n++)t|=this.byte()<<8*n;return t>>>0}let t=-e,n=0;for(let e=0;e<t;e++)n|=this.byte()<<8*e;return(n>>>0)-2**(8*t)}readBytes(){return this.take(this.readFixnum())}readSymbol(){let e=new TextDecoder().decode(this.readBytes());return this.symbols.push(e),e}readSymbolLink(){let e=this.readFixnum(),t=this.symbols[e];if(t===void 0)throw Error(`Marshal: symbol link ${e} out of range`);return t}readSymbolValue(){let e=String.fromCharCode(this.byte());if(e===`:`)return this.readSymbol();if(e===`;`)return this.readSymbolLink();throw Error(`Marshal: expected a symbol, got tag "${e}"`)}link(e){return this.objects.push(e),e}readBignum(){let e=String.fromCharCode(this.byte())===`-`?-1:1,t=this.readFixnum(),n=0,r=1;for(let e=0;e<t;e++)n+=(this.byte()|this.byte()<<8)*r,r*=65536;return e*n}readFloat(){let e=new TextDecoder().decode(this.readBytes());return e===`inf`?1/0:e===`-inf`?-1/0:e===`nan`?NaN:Number(e)}readArray(){let e=[];this.link(e);let t=this.readFixnum();for(let n=0;n<t;n++)e.push(this.readValue());return e}readHash(e){let t=new Map;this.link(t);let n=this.readFixnum();for(let e=0;e<n;e++)t.set(this.readValue(),this.readValue());return e&&nW.set(t,this.readValue()),t}readIvars(e){let t={};for(let n=0;n<e;n++)t[this.readSymbolValue()]=this.readValue();return t}readObject(){let e={class:``,ivars:{}};return this.link(e),e.class=this.readSymbolValue(),e.ivars=this.readIvars(this.readFixnum()),e}readIvarWrapped(){let e=this.readValue();return this.readIvars(this.readFixnum()),e}readUserDefined(){let e={class:``,raw:new Uint8Array};return this.link(e),e.class=this.readSymbolValue(),e.raw=this.readBytes().slice(),e}readUserMarshal(){let e={class:``,value:null};return this.link(e),e.class=this.readSymbolValue(),e.value=this.readValue(),e}readValue(){if(++this.depth>aW)throw Error(`Marshal: values nested more than ${aW} deep`);try{return this.readTagged()}finally{this.depth--}}readTagged(){let e=String.fromCharCode(this.byte());switch(e){case`0`:return null;case`T`:return!0;case`F`:return!1;case`i`:return this.readFixnum();case`l`:return this.link(this.readBignum());case`f`:return this.link(this.readFloat());case`:`:return this.readSymbol();case`;`:return this.readSymbolLink();case`"`:return this.link(new TextDecoder().decode(this.readBytes()));case`[`:return this.readArray();case`{`:return this.readHash(!1);case`}`:return this.readHash(!0);case`o`:return this.readObject();case`I`:return this.readIvarWrapped();case`u`:return this.readUserDefined();case`U`:return this.readUserMarshal();case`@`:{let e=this.readFixnum(),t=this.objects[e];if(t===void 0)throw Error(`Marshal: object link ${e} out of range`);return t}default:throw Error(`Marshal: unsupported tag "${e}" (0x${e.charCodeAt(0).toString(16)})`)}}readDocument(){let e=this.byte(),t=this.byte();if(e!==eW||t>tW)throw Error(`Marshal: unsupported version ${e}.${t} (expected ${eW}.${tW} or lower)`);return this.readValue()}};function sW(e){return new oW(e).readDocument()}function cW(e){return typeof e==`object`&&!!e&&`class`in e&&`ivars`in e}function lW(e){let t=[eW,tW];return uW(t,e),new Uint8Array(t)}function uW(e,t){if(t==null)e.push(dW(`0`));else if(t===!0)e.push(dW(`T`));else if(t===!1)e.push(dW(`F`));else if(t instanceof $U)e.push(dW(`:`)),fW(e,t.name);else if(typeof t==`number`)Number.isInteger(t)&&Math.abs(t)<2**30?(e.push(dW(`i`)),pW(e,t)):(e.push(dW(`f`)),fW(e,Number.isFinite(t)?String(t):t>0?`inf`:t<0?`-inf`:`nan`));else if(typeof t==`string`)e.push(dW(`"`)),fW(e,t);else if(Array.isArray(t)){e.push(dW(`[`)),pW(e,t.length);for(let n of t)uW(e,n)}else if(t instanceof Map){let n=nW.has(t);e.push(dW(n?`}`:`{`)),pW(e,t.size);for(let[n,r]of t)uW(e,n),uW(e,r);n&&uW(e,nW.get(t))}else if(cW(t)){e.push(dW(`o`)),e.push(dW(`:`)),fW(e,t.class);let n=Object.entries(t.ivars);pW(e,n.length);for(let[t,r]of n)e.push(dW(`:`)),fW(e,t),uW(e,r)}else throw Error(`Marshal: cannot encode a value of type ${typeof t}`)}function dW(e){return e.charCodeAt(0)}function fW(e,t){let n=new TextEncoder().encode(t);pW(e,n.length);for(let t of n)e.push(t)}function pW(e,t){if(t===0)e.push(0);else if(t>0&&t<=122)e.push(t+5);else if(t<0&&t>=-123)e.push(t-5&255);else{if(t>0){for(let n=1;n<=4;n++)if(t<2**(8*n)){e.push(n);for(let r=0;r<n;r++)e.push(t>>>8*r&255);return}}else for(let n=1;n<=4;n++)if(t>=-(2**(8*n))){e.push(-n&255);let r=t+2**(8*n);for(let t=0;t<n;t++)e.push(r>>>8*t&255);return}throw Error(`Marshal: integer ${t} is out of range for a Fixnum`)}}function mW(e){return Wr(e).map(e=>e.speaker===void 0?{say:e.text}:{say:e.text,speaker:e.speaker})}function hW(e,t={}){let n={};for(let t of e)`say`in t?n[t.say]=t.say:`ask`in t&&(n[t.ask]=t.ask);return{locale:t.locale??`en`,direction:t.direction??`ltr`,messages:n}}function gW(e){let{story:t,start:n,title:r}=Gr(e);return r===void 0?{story:t,start:n}:{story:t,start:n,title:r}}var _W=l({AUTOMAP_EMPTY:()=>-1,EventRunner:()=>FU,FreeMover:()=>WU,GameState:()=>MU,GridMover:()=>LU,MoveRouteRunner:()=>UU,QuestLog:()=>XU,RubySymbol:()=>$U,aabbOverlap:()=>GU,activePage:()=>PU,automap:()=>OU,circleAabbOverlap:()=>qU,circleOverlap:()=>KU,conditionHolds:()=>NU,decodeMarshal:()=>sW,encodeMarshal:()=>lW,extractDialogueCatalog:()=>hW,hashDefaultOf:()=>rW,importTwee:()=>gW,parseDialogueText:()=>mW,questsFromRows:()=>ZU,resolveAabbAgainstTiles:()=>JU,withHashDefault:()=>iW}),vW=wH(20,2,100),yW=class{constructor(e){this.species=e.species,this.deriveStats=e.deriveStats,this.progression=new TH(e.species.growth??vW,{level:e.level??1}),this.stats=new CH({base:this.computeBase()})}refreshStats(){let e=this.computeBase();for(let[t,n]of Object.entries(e))this.stats.setBase(t,n)}computeBase(){let e=this.progression.level;return this.deriveStats?this.deriveStats(this.species.baseStats,e):{...this.species.baseStats}}},bW=class{constructor(){this.multipliers=new Map}key(e,t){return`${e}:${t}`}set(e,t,n){this.multipliers.set(this.key(e,t),n)}get(e,t){return this.multipliers.get(this.key(e,t))??1}multiplierFor(e,t){return t.reduce((t,n)=>t*this.get(e,n),1)}},xW=class{constructor(e){this.storage=[],this.active=Array(e).fill(null)}get members(){return this.active}get boxed(){return this.storage}add(e){let t=this.active.indexOf(null);t===-1?this.storage.push(e):this.active[t]=e}store(e){let t=this.active[e];t&&(this.active[e]=null,this.storage.push(t))}withdraw(e,t){if(t<0||t>=this.active.length)return;let n=this.storage[e];if(!n)return;this.storage.splice(e,1);let r=this.active[t];this.active[t]=n,r&&this.storage.push(r)}get activeMembers(){return this.active.filter(e=>e!==null)}};function SW(e){return[...e].sort((e,t)=>(t.priority??0)-(e.priority??0)||t.speed-e.speed)}function CW(e,t){let n=null;for(let r of e)r.at(t)&&(n=r.into);return n}var wW=class{constructor(e,t){this.stages=new Map,this.modifiers=new Map,this.stats=e,this.max=t.max,this.multiplierFor=t.multiplier}get(e){return this.stages.get(e)??0}change(e,t){let n=this.get(e),r=kn(n+t,-this.max,this.max),i=r-n;return i===0?0:(this.stages.set(e,r),this.applyModifier(e,r),i)}applyModifier(e,t){let n=this.modifiers.get(e);if(n&&this.stats.removeModifier(n),t===0){this.modifiers.delete(e);return}let r={stat:e,op:`multiply`,value:this.multiplierFor(t)};this.stats.addModifier(r),this.modifiers.set(e,r)}resetAll(){for(let e of this.modifiers.values())this.stats.removeModifier(e);this.modifiers.clear(),this.stages.clear()}};function TW(e,t,n,r=(e,n)=>t.multiplierFor(e.type,n)){if(e.length===0)return null;let i=e[0],a=r(i,n);for(let t of e.slice(1)){let e=r(t,n);e>a&&(a=e,i=t)}return i}function EW(e,t,n,r){let i=null,a=DW(e,n,r);return t.forEach((e,t)=>{let o=DW(e.types,n,r);o<a&&(a=o,i=t)}),i}function DW(e,t,n){return Math.max(...n.map(n=>t.multiplierFor(n,e)))}var OW=class extends S{},kW=class{constructor(){this.conditions=new Map}set(e){this.conditions.set(e.id,{...e})}has(e){return this.conditions.has(e)}get(e){return this.conditions.get(e)}clear(e){this.conditions.delete(e)}get active(){return[...this.conditions.values()]}advance(e=1){for(let[t,n]of this.conditions)n.duration!==void 0&&(n.duration-=e,n.duration<=0&&this.conditions.delete(t))}},AW=class{constructor(e){let t=Math.max(0,e.damage);this.chanceToHit=kn(e.chanceToHit??1,0,1),this.strikeDuration=Math.max(0,e.strikeDuration??0),this.totalDamage=t*Math.max(0,e.strikes),this.expectedDamage=this.totalDamage*this.chanceToHit,this.defenderHp0=e.defender.hp;let n=[],r=e.defender.hp;for(let i=0;i<=e.strikes;i++){i>0&&(e.hits?.[i-1]??!0)&&(r-=t);let a=Math.max(0,r);n.push({strike:i,time:i*this.strikeDuration,attackerHp:e.attacker.hp,defenderHp:a,defenderDamage:this.defenderHp0-a})}this.frames=n}get duration(){return this.strikeDuration*(this.frames.length-1)}get defenderKilled(){return this.frames[this.frames.length-1].defenderHp===0}sampleAt(e){let t=this.frames.length-1;if(this.strikeDuration<=0)return this.frames[t];let n=0;for(let r=0;r<=t&&this.frames[r].time<=e+1e-9;r++)n=r;return this.frames[n]}},jW=class{constructor(e){this.onChange=new p,this.stage_=`attacker`,this.charge=null,this.victim=null,this.highlight_=0,this.units=e.units,this.side=e.side,this.disabledOf=e.disabled??(e=>e.disabled??!1),this.canTarget=e.canTarget??(()=>!0)}get stage(){return this.stage_}get attacker(){return this.charge}get target(){return this.victim}get done(){return this.charge!==null&&this.victim!==null}get candidates(){return this.units.filter(e=>(this.side===void 0||e.side===this.side)&&!this.disabledOf(e))}get targets(){let e=this.charge;return e?this.units.filter(t=>t.id!==e.id&&!this.disabledOf(t)&&(e.side===void 0||t.side!==e.side)&&this.canTarget(e,t)):[]}get highlight(){return this.highlight_}get highlighted(){return this.active()[this.highlight_]??null}move(e){let t=this.active();t.length!==0&&(this.highlight_=((this.highlight_+e)%t.length+t.length)%t.length,this.onChange.dispatch())}select(){let e=this.highlighted;return e?(this.stage_===`attacker`?(this.charge=e,this.stage_=`target`,this.highlight_=0):this.victim=e,this.onChange.dispatch(),!0):!1}back(){if(this.stage_===`attacker`)return;let e=this.charge;this.charge=null,this.victim=null,this.stage_=`attacker`;let t=e?this.candidates.findIndex(t=>t.id===e.id):-1;this.highlight_=t>=0?t:0,this.onChange.dispatch()}reset(){this.charge=null,this.victim=null,this.stage_=`attacker`,this.highlight_=0,this.onChange.dispatch()}active(){return this.stage_===`attacker`?this.candidates:this.targets}},MW=class{constructor(e){this.onChange=new p,this.built=null,this.elapsed_=0,this.handleSelectorChange=()=>{if(this.selector.done&&this.attacker&&this.target){let e=this.damageFor(this.attacker,this.target);this.built=new AW({attacker:{hp:this.attacker.hp??0,name:this.attacker.id},defender:{hp:this.target.hp??0,name:this.target.id},damage:e.damage,strikes:e.strikes,...e.chanceToHit===void 0?{}:{chanceToHit:e.chanceToHit},...e.hits===void 0?{}:{hits:e.hits},strikeDuration:this.strikeDuration}),this.elapsed_=0}else this.built=null;this.onChange.dispatch()},this.damageFor=e.damageFor,this.strikeDuration=e.strikeDuration??0,this.selector=new jW({units:e.units,...e.side===void 0?{}:{side:e.side},...e.disabled===void 0?{}:{disabled:e.disabled},...e.canTarget===void 0?{}:{canTarget:e.canTarget}}),this.selector.onChange.add(this.handleSelectorChange)}get stage(){return this.selector.stage}get attacker(){return this.selector.attacker}get target(){return this.selector.target}get preview(){return this.built}get elapsed(){return this.elapsed_}get finished(){return this.built!==null&&this.elapsed_>=this.built.duration}get frame(){return this.built?this.built.sampleAt(this.elapsed_):null}move(e){this.selector.move(e)}select(){return this.selector.select()}back(){this.selector.back()}update(e){return this.built?(this.elapsed_=Math.min(this.built.duration,this.elapsed_+Math.max(0,e)),this.frame):null}finish(){this.built&&(this.elapsed_=this.built.duration)}reset(){this.selector.reset(),this.built=null,this.elapsed_=0}},NW=class{constructor(){this.onChange=new p,this.planned=[],this.undone=[]}get plans(){return this.planned}get isEmpty(){return this.planned.length===0}get canUndo(){return this.planned.length>0}get canRedo(){return this.undone.length>0}plannedFor(e){return this.planned.find(t=>t.unit===e)}plan(e){let t=this.planned.findIndex(t=>t.unit===e.unit);t>=0?this.planned[t]=e:this.planned.push(e),this.undone=[],this.onChange.dispatch()}undo(){let e=this.planned.pop();return e?(this.undone.push(e),this.onChange.dispatch(),e):null}redo(){let e=this.undone.pop();return e?(this.planned=this.planned.filter(t=>t.unit!==e.unit),this.planned.push(e),this.onChange.dispatch(),e):null}clear(){(this.planned.length!==0||this.undone.length!==0)&&(this.planned=[],this.undone=[],this.onChange.dispatch())}commit(){let e=this.planned;return this.planned=[],this.undone=[],e.length>0&&this.onChange.dispatch(),e}},PW=class e{constructor(){this.counts=new Map}record(e,t,n=1){let r=this.counts.get(e)??new Map;r.set(t,(r.get(t)??0)+n),this.counts.set(e,r)}forType(e,t){return this.counts.get(e)?.get(t)??0}total(e){let t=this.counts.get(e);if(!t)return 0;let n=0;for(let e of t.values())n+=e;return n}breakdown(e){let t=this.counts.get(e);return t?[...t.entries()].map(([e,t])=>({unitType:e,count:t})):[]}toJSON(){return{counts:[...this.counts].map(([e,t])=>[e,[...t]])}}static fromJSON(t){let n=new e;for(let[e,r]of t.counts)n.counts.set(e,new Map(r));return n}},FW=l({AttackDialog:()=>MW,AttackPreview:()=>AW,BattleHooks:()=>OW,BattleStats:()=>PW,Creature:()=>yW,Field:()=>kW,Party:()=>xW,StatStages:()=>wW,TypeMatrix:()=>bW,UnitSelector:()=>jW,Whiteboard:()=>NW,battleOrder:()=>SW,checkEvolution:()=>CW,chooseMove:()=>TW,chooseSwitch:()=>EW});function IW(e){let t=e.charCodeAt(0)-97,n=e.charCodeAt(1)-49;if(t<0||t>7||n<0||n>7||e.length!==2)throw Error(`not a square: "${e}"`);return n*8+t}function LW(e){return String.fromCharCode(97+(e&7))+String.fromCharCode(49+(e>>3))}function RW(e){let t=[];for(let n=7;n>=0;n--){let r=``,i=0;for(let t=0;t<8;t++){let a=e.board[n*8+t];if(!a){i++;continue}i>0&&(r+=String(i),i=0);let o={pawn:`p`,knight:`n`,bishop:`b`,rook:`r`,queen:`q`,king:`k`}[a.kind];r+=a.side===`white`?o.toUpperCase():o}i>0&&(r+=String(i)),t.push(r)}let n=(e.castling.whiteKingside?`K`:``)+(e.castling.whiteQueenside?`Q`:``)+(e.castling.blackKingside?`k`:``)+(e.castling.blackQueenside?`q`:``);return`${t.join(`/`)} ${e.turn===`white`?`w`:`b`} ${n||`-`} ${e.enPassant===null?`-`:LW(e.enPassant)}`}function zW(e){let t=e.trim().split(/\s+/);if(t.length<4)throw Error(`not a FEN string: "${e}"`);let n=Array(64).fill(null),r=t[0].split(`/`);if(r.length!==8)throw Error(`a FEN placement needs 8 ranks: "${e}"`);if(r.forEach((t,r)=>{let i=7-r,a=0;for(let r of t)if(r>=`1`&&r<=`8`)a+=r.charCodeAt(0)-48;else{let o=r===r.toUpperCase()?`white`:`black`,s={p:`pawn`,n:`knight`,b:`bishop`,r:`rook`,q:`queen`,k:`king`}[r.toLowerCase()];if(!s||a>7)throw Error(`bad FEN rank "${t}" in "${e}"`);n[i*8+a]={side:o,kind:s},a++}if(a!==8)throw Error(`bad FEN rank "${t}" in "${e}"`)}),t[1]!==`w`&&t[1]!==`b`)throw Error(`a FEN side is "w" or "b": "${e}"`);let i={whiteKingside:!1,whiteQueenside:!1,blackKingside:!1,blackQueenside:!1};if(t[2]!==`-`)for(let n of t[2])if(n===`K`)i.whiteKingside=!0;else if(n===`Q`)i.whiteQueenside=!0;else if(n===`k`)i.blackKingside=!0;else if(n===`q`)i.blackQueenside=!0;else throw Error(`bad FEN castling "${t[2]}" in "${e}"`);let a=t[3]===`-`?null:IW(t[3]);if(a!==null){let n=t[1]===`w`?5:2;if(HW(a)!==n)throw Error(`bad FEN en passant square "${t[3]}" in "${e}"`)}let o={board:n,turn:t[1]===`w`?`white`:`black`,castling:i,enPassant:a};return ZW(n,`white`),ZW(n,`black`),o}function BW(e){return e===`white`?`black`:`white`}function VW(e){return e&7}function HW(e){return e>>3}function UW(e,t){return e>=0&&e<8&&t>=0&&t<8}function WW(){let e=[`rook`,`knight`,`bishop`,`queen`,`king`,`bishop`,`knight`,`rook`],t=Array(64).fill(null);for(let n=0;n<8;n++)t[n]={side:`white`,kind:e[n]},t[8+n]={side:`white`,kind:`pawn`},t[48+n]={side:`black`,kind:`pawn`},t[56+n]={side:`black`,kind:e[n]};return{board:t,turn:`white`,castling:{whiteKingside:!0,whiteQueenside:!0,blackKingside:!0,blackQueenside:!0},enPassant:null}}function GW(e){return{board:e.board.map(e=>e?{side:e.side,kind:e.kind}:null),turn:e.turn,castling:{...e.castling},enPassant:e.enPassant}}var KW=[[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]],qW=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],JW=[[1,1],[-1,1],[-1,-1],[1,-1]],YW=[[1,0],[0,1],[-1,0],[0,-1]];function XW(e,t,n){let r=VW(t),i=HW(t),a=n===`white`?i-1:i+1;for(let t of[-1,1]){if(!UW(r+t,a))continue;let i=e[a*8+r+t];if(i&&i.side===n&&i.kind===`pawn`)return!0}for(let[t,a]of KW){if(!UW(r+t,i+a))continue;let o=e[(i+a)*8+r+t];if(o&&o.side===n&&o.kind===`knight`)return!0}for(let[t,a]of qW){if(!UW(r+t,i+a))continue;let o=e[(i+a)*8+r+t];if(o&&o.side===n&&o.kind===`king`)return!0}let o=[{steps:JW,kinds:[`bishop`,`queen`]},{steps:YW,kinds:[`rook`,`queen`]}];for(let{steps:t,kinds:a}of o)for(let[o,s]of t){let t=r+o,c=i+s;for(;UW(t,c);){let r=e[c*8+t];if(r){if(r.side===n&&a.includes(r.kind))return!0;break}t+=o,c+=s}}return!1}function ZW(e,t){let n=e.findIndex(e=>e!==null&&e.side===t&&e.kind===`king`);if(n===-1)throw Error(`a position without a ${t} king cannot be judged`);return n}function QW(e,t){return XW(e.board,ZW(e.board,t),BW(t))}function $W(e,t){let n=e.board[t];if(!n||n.side!==e.turn)return[];let r=[],i=VW(t),a=HW(t),o=o=>{for(let[s,c]of o){let o=i+s,l=a+c;for(;UW(o,l);){let i=l*8+o,a=e.board[i];if(!a)r.push({from:t,to:i});else{a.side!==n.side&&r.push({from:t,to:i});break}o+=s,l+=c}}};switch(n.kind){case`pawn`:{let o=n.side===`white`?1:-1,s=n.side===`white`?1:6,c=n.side===`white`?7:0;if(UW(i,a+o)&&!e.board[(a+o)*8+i]){let n=(a+o)*8+i;if(a+o===c)for(let e of[`knight`,`bishop`,`rook`,`queen`])r.push({from:t,to:n,promotion:e});else r.push({from:t,to:n}),a===s&&!e.board[(a+2*o)*8+i]&&r.push({from:t,to:(a+2*o)*8+i})}for(let s of[-1,1]){if(!UW(i+s,a+o))continue;let l=(a+o)*8+i+s,u=e.board[l];if(u&&u.side!==n.side){if(a+o===c)for(let e of[`knight`,`bishop`,`rook`,`queen`])r.push({from:t,to:l,promotion:e});else r.push({from:t,to:l})}else!u&&l===e.enPassant&&r.push({from:t,to:l,enPassantTake:a*8+i+s})}break}case`knight`:for(let[o,s]of KW){if(!UW(i+o,a+s))continue;let c=(a+s)*8+i+o,l=e.board[c];(!l||l.side!==n.side)&&r.push({from:t,to:c})}break;case`bishop`:o(JW);break;case`rook`:o(YW);break;case`queen`:o(JW),o(YW);break;case`king`:{for(let[o,s]of qW){if(!UW(i+o,a+s))continue;let c=(a+s)*8+i+o,l=e.board[c];l&&l.side===n.side||l&&l.kind===`king`||r.push({from:t,to:c})}let o=n.side===`white`?0:56,s=n.side===`white`?{king:e.castling.whiteKingside,queen:e.castling.whiteQueenside}:{king:e.castling.blackKingside,queen:e.castling.blackQueenside};t===o+4&&!QW(e,n.side)&&(s.king&&!e.board[o+5]&&!e.board[o+6]&&!XW(e.board,o+5,BW(n.side))&&!XW(e.board,o+6,BW(n.side))&&r.push({from:t,to:o+6,castle:`kingside`}),s.queen&&!e.board[o+3]&&!e.board[o+2]&&!e.board[o+1]&&!XW(e.board,o+3,BW(n.side))&&!XW(e.board,o+2,BW(n.side))&&r.push({from:t,to:o+2,castle:`queenside`}));break}}return r}function eG(e,t){let n=e.board[t.from];if(!n)throw Error(`no piece on ${LW(t.from)} to move`);let r=(e,t)=>{let n=e===`white`?0:56;return t===n||t===n+7};n.kind===`king`&&(n.side===`white`?e.castling.whiteKingside=e.castling.whiteQueenside=!1:e.castling.blackKingside=e.castling.blackQueenside=!1),n.kind===`rook`&&r(n.side,t.from)&&(e.castling[tG(n.side,t.from)]=!1);let i=e.board[t.to];if(i&&i.kind===`rook`&&r(i.side,t.to)&&(e.castling[tG(i.side,t.to)]=!1),e.board[t.to]=t.promotion?{side:n.side,kind:t.promotion}:n,e.board[t.from]=null,t.enPassantTake!==void 0&&(e.board[t.enPassantTake]=null),t.castle){let r=n.side===`white`?0:56;t.castle===`kingside`?(e.board[r+5]=e.board[r+7],e.board[r+7]=null):(e.board[r+3]=e.board[r],e.board[r]=null)}e.enPassant=n.kind===`pawn`&&Math.abs(t.to-t.from)===16?(t.from+t.to)/2:null,e.turn=BW(n.side)}function tG(e,t){let n=VW(t)===7;return e===`white`?n?`whiteKingside`:`whiteQueenside`:n?`blackKingside`:`blackQueenside`}function nG(e){let t=[];for(let n=0;n<64;n++)if(e.board[n]&&e.board[n]?.side===e.turn)for(let r of $W(e,n)){let n=GW(e);eG(n,r),!QW(n,e.turn)&&t.push({from:r.from,to:r.to,...r.promotion?{promotion:r.promotion}:{}})}return t}function rG(e,t){let n=e.board[t.from];if(!n||n.side!==e.turn)throw Error(`no ${e.turn} piece on ${LW(t.from)} to move`);let r=$W(e,t.from).find(e=>e.to===t.to&&(e.promotion??null)===(t.promotion??null));if(!r)throw Error(`${LW(t.from)}-${LW(t.to)} is not a legal move here`);let i=GW(e);if(eG(i,r),QW(i,e.turn))throw Error(`${LW(t.from)}-${LW(t.to)} leaves the king in check`);eG(e,r)}function iG(e){return nG(e).length>0?`ongoing`:QW(e,e.turn)?e.turn===`white`?`black-wins`:`white-wins`:`stalemate`}var aG=1e5;function oG(e,t,n){if(!Number.isInteger(n.depth)||n.depth<1)throw RangeError(`depth must be a positive integer`);let r=n.maxNodes??aG;if(!Number.isInteger(r)||r<1)throw RangeError(`maxNodes must be a positive integer`);let i=e.currentPlayer(t),a=0,o=0,s,c=(t,l,u,d)=>{if(n.signal?.aborted)return s=`cancelled`,0;if(++a>r)return s=`budget-exceeded`,0;let f=e.currentPlayer(t)===i;if(n.onNode?.(l,f),l===0||e.isTerminal(t))return e.evaluate(t,i);let p=e.moves(t);if(!p.length)return e.evaluate(t,i);let m=f?-1/0:1/0;for(let n of p){let r=c(e.apply(t,n),l-1,u,d);if(s)return r;if(f?(m=Math.max(m,r),u=Math.max(u,m)):(m=Math.min(m,r),d=Math.min(d,m)),d<=u){o++;break}}return m},l=e.moves(t),u=null,d=e.evaluate(t,i);if(!e.isTerminal(t)&&l.length){let r=e.currentPlayer(t)===i,a=r?-1/0:1/0,o=-1/0,f=1/0;for(let i of l){let l=c(e.apply(t,i),n.depth-1,o,f);if(s)break;(u===null||(r?l>a:l<a))&&(u=i,a=l),r?o=Math.max(o,a):f=Math.min(f,a)}u!==null&&(d=a)}return{move:s?null:u,score:d,depth:n.depth,nodes:a,cutoffs:o,status:s??`complete`,state:t}}function sG(e,t){return e.moves(t).map(n=>({move:n,child:e.apply(t,n)}))}function cG(e,t){let n=null,r=t?-1/0:1/0;for(let{move:i,score:a}of e)(n===null||(t?a>r:a<r))&&(n=i,r=a);return n}function lG(){return globalThis.process?.getBuiltinModule?.(`node:worker_threads`)}function uG(){let e=globalThis.process?.getBuiltinModule?.(`node:worker_threads`)?.parentPort??null,t=globalThis,n=e=>{let t=[],n=new Set,r=e=>{if(typeof e!=`object`||!e||n.has(e))return;if(n.add(e),ArrayBuffer.isView(e)){let n=e.buffer;n instanceof ArrayBuffer&&!t.includes(n)&&t.push(n);return}if(e instanceof ArrayBuffer){t.includes(e)||t.push(e);return}if(Array.isArray(e)){for(let t of e)r(t);return}let i=Object.getPrototypeOf(e);if(i===Object.prototype||i===null)for(let t of Object.values(e))r(t)};return r(e),t},r=(n,r=[])=>{e?e.postMessage(n,r):t.postMessage(n,r)},i=async e=>{try{let t=await Function(`return (${e.code});`)()(...e.args);r({ok:!0,value:t},n(t))}catch(e){let t=e;r({ok:!1,message:String(t?.message??e),stack:typeof t?.stack==`string`?t.stack:void 0})}};e?e.on(`message`,e=>void i(e)):t.onmessage=e=>void i(e.data)}var dG=(e,t)=>{if(typeof Worker>`u`||typeof Blob>`u`||typeof URL>`u`||typeof URL.createObjectURL!=`function`)return null;let n=URL.createObjectURL(new Blob([e],{type:`text/javascript`})),r;try{r=new Worker(n)}catch(e){throw URL.revokeObjectURL(n),e}return r.onmessage=e=>t.message(e.data),r.onerror=e=>t.fail(Error(e.message||`the worker failed to run`)),r.onmessageerror=()=>t.fail(Error(`the worker sent a reply that could not be deserialized`)),{post:(e,t=[])=>r.postMessage(e,t),terminate:()=>{r.terminate(),URL.revokeObjectURL(n)}}},fG=(e,t)=>{let n=lG();if(!n)return null;let r=new n.Worker(e,{eval:!0});return r.on(`message`,e=>t.message(e)),r.on(`error`,e=>t.fail(e instanceof Error?e:Error(String(e)))),r.on(`messageerror`,()=>t.fail(Error(`the worker sent a reply that could not be deserialized`))),r.on(`exit`,e=>t.fail(Error(`the worker exited with code ${e} before answering`))),{post:(e,t=[])=>r.postMessage(e,t),terminate:()=>void r.terminate()}};function pG(e,t){return dG(e,t)??fG(e,t)}function mG(e){let t=Error(e.message);return e.stack&&(t.stack=e.stack),t}function hG(e,t,n={}){return new Promise((r,i)=>{if(n.signal?.aborted){i(n.signal.reason);return}let a=!1,o,s,c=e=>{a||(a=!0,o!==void 0&&clearTimeout(o),n.signal?.removeEventListener(`abort`,l),s?.terminate(),e())};function l(){c(()=>i(n.signal.reason))}let u={message:e=>c(()=>{let t=e;t.ok?r(t.value):i(mG(t))}),fail:e=>c(()=>i(e))};try{s=pG(`(${uG.toString()})()`,u)}catch(e){i(e);return}if(!s)i(Error(`spawn() needs Web Workers or node:worker_threads, and this environment offers neither`));else{n.timeout!==void 0&&n.timeout>0&&(o=setTimeout(()=>c(()=>i(Error(`the task did not answer within ${n.timeout} ms`))),n.timeout)),n.signal?.addEventListener(`abort`,l,{once:!0});try{s.post({code:e.toString(),args:t??[]},n.transfer??[])}catch(e){c(()=>i(e))}}})}var gG=1e5,_G={pawn:100,knight:320,bishop:330,rook:500,queen:900,king:0};function vG(e,t={}){return yG(e,t).move}function yG(e,t={}){let n=oG(CG,e,{depth:Math.max(1,Math.floor(t.depth??3)),maxNodes:t.maxNodes===void 0?1e5:Math.max(1,Math.floor(t.maxNodes))});return{move:n.move,score:n.score,nodes:n.nodes}}async function bG(e,t={}){let n=Math.max(1,Math.floor(t.depth??3)),r=t.maxNodes===void 0?1e5:Math.max(1,Math.floor(t.maxNodes)),i=t.jobs??xG();if(!Number.isInteger(i)||i<1)throw RangeError(`jobs must be a positive integer`);if(t.signal?.aborted)throw t.signal.reason;let a=CG.currentPlayer(e),o=sG(CG,e);if(CG.isTerminal(e)||!o.length)return{move:null,score:CG.evaluate(e,a),nodes:0};let s=Math.max(1,Math.min(i,o.length)),c=Array(o.length),l=0,u=!1,d=0,f=t.signal?{signal:t.signal}:{};if(await Promise.all(Array.from({length:s},async()=>{for(;;){let e=d++;if(e>=o.length)return;let t=await hG(SG,[o[e].child,a,n-1,r],f);l+=t.nodes,t.budgetExceeded?u=!0:c[e]={move:o[e].move,score:t.score}}})),u)return{move:null,score:CG.evaluate(e,a),nodes:l};let p=c.filter(e=>e!==void 0),m=cG(p,!0);return{move:m,score:p.find(e=>e.move===m)?.score??CG.evaluate(e,a),nodes:l}}function xG(){let e=globalThis,t=e.navigator?.hardwareConcurrency;if(typeof t==`number`&&Number.isInteger(t)&&t>0)return Math.min(t,8);try{let t=e.process?.getBuiltinModule?.(`node:os`)?.availableParallelism?.();if(typeof t==`number`&&Number.isInteger(t)&&t>0)return Math.min(t,8)}catch{}return 4}function SG(e,t,n,r){let i={pawn:100,knight:320,bishop:330,rook:500,queen:900,king:0},a=e=>e===`white`?`black`:`white`,o=e=>e&7,s=e=>e>>3,c=(e,t)=>e>=0&&e<8&&t>=0&&t<8,l=[[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]],u=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],d=[[1,1],[-1,1],[-1,-1],[1,-1]],f=[[1,0],[0,1],[-1,0],[0,-1]],p=(e,t,n)=>{let r=o(t),i=s(t),a=n===`white`?i-1:i+1;for(let t of[-1,1]){if(!c(r+t,a))continue;let i=e[a*8+r+t];if(i&&i.side===n&&i.kind===`pawn`)return!0}for(let[t,a]of l){if(!c(r+t,i+a))continue;let o=e[(i+a)*8+r+t];if(o&&o.side===n&&o.kind===`knight`)return!0}for(let[t,a]of u){if(!c(r+t,i+a))continue;let o=e[(i+a)*8+r+t];if(o&&o.side===n&&o.kind===`king`)return!0}let p=[{steps:d,kinds:[`bishop`,`queen`]},{steps:f,kinds:[`rook`,`queen`]}];for(let{steps:t,kinds:a}of p)for(let[o,s]of t){let t=r+o,l=i+s;for(;c(t,l);){let r=e[l*8+t];if(r){if(r.side===n&&a.includes(r.kind))return!0;break}t+=o,l+=s}}return!1},m=(e,t)=>{let n=e.findIndex(e=>e!==null&&e.side===t&&e.kind===`king`);if(n===-1)throw Error(`a position without a ${t} king cannot be judged`);return n},h=(e,t)=>p(e.board,m(e.board,t),a(t)),g=(e,t)=>{let n=e.board[t];if(!n||n.side!==e.turn)return[];let r=[],i=o(t),m=s(t),g=a=>{for(let[o,s]of a){let a=i+o,l=m+s;for(;c(a,l);){let i=l*8+a,c=e.board[i];if(!c)r.push({from:t,to:i});else{c.side!==n.side&&r.push({from:t,to:i});break}a+=o,l+=s}}};switch(n.kind){case`pawn`:{let a=n.side===`white`?1:-1,o=n.side===`white`?1:6,s=n.side===`white`?7:0;if(c(i,m+a)&&!e.board[(m+a)*8+i]){let n=(m+a)*8+i;if(m+a===s)for(let e of[`knight`,`bishop`,`rook`,`queen`])r.push({from:t,to:n,promotion:e});else r.push({from:t,to:n}),m===o&&!e.board[(m+2*a)*8+i]&&r.push({from:t,to:(m+2*a)*8+i})}for(let o of[-1,1]){if(!c(i+o,m+a))continue;let l=(m+a)*8+i+o,u=e.board[l];if(u&&u.side!==n.side){if(m+a===s)for(let e of[`knight`,`bishop`,`rook`,`queen`])r.push({from:t,to:l,promotion:e});else r.push({from:t,to:l})}else!u&&l===e.enPassant&&r.push({from:t,to:l,enPassantTake:m*8+i+o})}break}case`knight`:for(let[a,o]of l){if(!c(i+a,m+o))continue;let s=(m+o)*8+i+a,l=e.board[s];(!l||l.side!==n.side)&&r.push({from:t,to:s})}break;case`bishop`:g(d);break;case`rook`:g(f);break;case`queen`:g(d),g(f);break;case`king`:{for(let[a,o]of u){if(!c(i+a,m+o))continue;let s=(m+o)*8+i+a,l=e.board[s];l&&l.side===n.side||l&&l.kind===`king`||r.push({from:t,to:s})}let o=n.side===`white`?0:56,s=n.side===`white`?{king:e.castling.whiteKingside,queen:e.castling.whiteQueenside}:{king:e.castling.blackKingside,queen:e.castling.blackQueenside};t===o+4&&!h(e,n.side)&&(s.king&&!e.board[o+5]&&!e.board[o+6]&&!p(e.board,o+5,a(n.side))&&!p(e.board,o+6,a(n.side))&&r.push({from:t,to:o+6,castle:`kingside`}),s.queen&&!e.board[o+3]&&!e.board[o+2]&&!e.board[o+1]&&!p(e.board,o+3,a(n.side))&&!p(e.board,o+2,a(n.side))&&r.push({from:t,to:o+2,castle:`queenside`}));break}}return r},_=(e,t)=>{let n=e.board[t.from];if(!n)throw Error(`no piece on ${t.from} to move`);let r=(e,t)=>{let n=e===`white`?0:56;return t===n||t===n+7},i=(e,t)=>{let n=o(t)===7;return e===`white`?n?`whiteKingside`:`whiteQueenside`:n?`blackKingside`:`blackQueenside`};n.kind===`king`&&(n.side===`white`?e.castling.whiteKingside=e.castling.whiteQueenside=!1:e.castling.blackKingside=e.castling.blackQueenside=!1),n.kind===`rook`&&r(n.side,t.from)&&(e.castling[i(n.side,t.from)]=!1);let s=e.board[t.to];if(s&&s.kind===`rook`&&r(s.side,t.to)&&(e.castling[i(s.side,t.to)]=!1),e.board[t.to]=t.promotion?{side:n.side,kind:t.promotion}:n,e.board[t.from]=null,t.enPassantTake!==void 0&&(e.board[t.enPassantTake]=null),t.castle){let r=n.side===`white`?0:56;t.castle===`kingside`?(e.board[r+5]=e.board[r+7],e.board[r+7]=null):(e.board[r+3]=e.board[r],e.board[r]=null)}e.enPassant=n.kind===`pawn`&&Math.abs(t.to-t.from)===16?(t.from+t.to)/2:null,e.turn=a(n.side)},v=e=>({board:e.board.map(e=>e?{side:e.side,kind:e.kind}:null),turn:e.turn,castling:{...e.castling},enPassant:e.enPassant}),y=e=>{let t=[];for(let n=0;n<64;n++)if(e.board[n]&&e.board[n]?.side===e.turn)for(let r of g(e,n)){let n=v(e);_(n,r),!h(n,e.turn)&&t.push({from:r.from,to:r.to,...r.promotion?{promotion:r.promotion}:{}})}return t},b=e=>y(e).length>0?`ongoing`:h(e,e.turn)?e.turn===`white`?`black-wins`:`white-wins`:`stalemate`,x=(e,t)=>{let n=e.board[t.to];return(t.promotion?i[t.promotion]:0)*10+(n?i[n.kind]:0)},S=(e,t)=>t.slice().sort((t,n)=>x(e,n)-x(e,t)),C=(e,t)=>{let n=0;for(let t of e.board)t&&(n+=(t.side===`white`?1:-1)*i[t.kind]);return t===1?n:-n},ee=(e,t)=>{let n=b(e);return n===`stalemate`||!h(e,e.turn)?0:(n===`white-wins`?1:-1)===t?1e5:-1e5},w=e=>b(e)===`ongoing`?C(e,t):ee(e,t),T=0,E=!1,te=(e,n,i,a)=>{if(++T>r)return E=!0,0;let o=(e.turn===`white`?1:-1)===t;if(n===0||b(e)!==`ongoing`)return w(e);let s=S(e,y(e));if(!s.length)return w(e);let c=o?-1/0:1/0;for(let t of s){let r=v(e),s=g(r,t.from).find(e=>e.to===t.to&&(e.promotion??null)===(t.promotion??null));if(!s)throw Error(`a legal move stopped being legal: ${t.from}-${t.to}`);_(r,s);let l=te(r,n-1,i,a);if(E)return l;if(o?(c=Math.max(c,l),i=Math.max(i,c)):(c=Math.min(c,l),a=Math.min(a,c)),a<=i)break}return c};return{score:te(e,n,-1/0,1/0),nodes:T,budgetExceeded:E}}var CG={currentPlayer:e=>e.turn===`white`?1:-1,moves:e=>EG(e,nG(e)),apply:(e,t)=>{let n=GW(e);return rG(n,t),n},isTerminal:e=>iG(e)!==`ongoing`,evaluate:(e,t)=>iG(e)===`ongoing`?wG(e,t):TG(e,t)};function wG(e,t){let n=0;for(let t of e.board)t&&(n+=(t.side===`white`?1:-1)*_G[t.kind]);return t===1?n:-n}function TG(e,t){let n=iG(e);return n===`stalemate`||!QW(e,e.turn)?0:(n===`white-wins`?1:-1)===t?gG:-1e5}function EG(e,t){return t.slice().sort((t,n)=>DG(e,n)-DG(e,t))}function DG(e,t){let n=e.board[t.to];return(t.promotion?_G[t.promotion]:0)*10+(n?_G[n.kind]:0)}function OG(e,t){return e.positions[RW(t)]??null}var kG={q:`queen`,r:`rook`,b:`bishop`,n:`knight`};function AG(e){let t=/^([a-h][1-8])([a-h][1-8])([qrbn])?$/.exec(e);if(!t)throw Error(`not a UCI move: "${e}"`);let n=t[3]?kG[t[3]]:void 0;return n?{from:IW(t[1]),to:IW(t[2]),promotion:n}:{from:IW(t[1]),to:IW(t[2])}}var jG={pawn:0,knight:1,bishop:2,rook:3,queen:4,king:5},MG=[`queen`,`rook`,`bishop`,`knight`],NG=[[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]],PG=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],FG=[[1,1],[-1,1],[-1,-1],[1,-1]],IG=[[1,0],[0,1],[-1,0],[0,-1]];function LG(e){return 1n<<BigInt(e)}function RG(e){return Math.log2(Number(e))}function zG(e){return Array.from({length:64},(t,n)=>{let r=n&7,i=n>>3,a=0n;for(let[t,n]of e){let e=r+t,o=i+n;e>=0&&e<8&&o>=0&&o<8&&(a|=LG(o*8+e))}return a})}var BG=zG(NG),VG=zG(PG);function HG(e,t){return e.pieces[t]|e.pieces[t+1]|e.pieces[t+2]|e.pieces[t+3]|e.pieces[t+4]|e.pieces[t+5]}function UG(e,t){let n=LG(t);for(let t=0;t<12;t++)if(e.pieces[t]&n)return t;return-1}function WG(e,t,n){let r=n?0:6,i=t&7,a=t>>3,o=n?a-1:a+1;for(let t of[-1,1]){let n=i+t;if(o>=0&&o<8&&n>=0&&n<8&&e.pieces[r]&LG(o*8+n))return!0}if(BG[t]&e.pieces[r+1]||VG[t]&e.pieces[r+5])return!0;let s=[{steps:FG,kinds:[2,4]},{steps:IG,kinds:[3,4]}];for(let{steps:t,kinds:n}of s)for(let[o,s]of t){let t=i+o,c=a+s;for(;t>=0&&t<8&&c>=0&&c<8;){let i=UG(e,c*8+t);if(i!==-1){if(i>=r&&i<r+6&&n.includes(i-r))return!0;break}t+=o,c+=s}}return!1}function GG(e,t){return e===`white`?t?1:2:t?4:8}function KG(e){let t=Array(12).fill(0n),n=[-1,-1];if(e.board.forEach((e,r)=>{if(!e)return;let i=(e.side===`white`?0:6)+jG[e.kind];t[i]|=LG(r),e.kind===`king`&&(n[e.side===`white`?0:1]=r)}),n[0]===-1||n[1]===-1)throw Error(`a position without both kings cannot go on bitboards`);return{pieces:t,turn:e.turn,castling:+!!e.castling.whiteKingside|(e.castling.whiteQueenside?2:0)|(e.castling.blackKingside?4:0)|(e.castling.blackQueenside?8:0),enPassant:e.enPassant,halfmove:0,kings:n}}function qG(){return KG(WW())}function JG(e){let t=e.turn===`white`,n=t?0:6,r=HG(e,n),i=HG(e,n===0?6:0),a=r|i,o=[],s=[];for(let c=0;c<64;c++){if(!(r&LG(c)))continue;let l=-1;for(let t=0;t<6;t++)if(e.pieces[n+t]&LG(c)){l=t;break}s.length=0,YG(e,c,l,a,i,s);for(let n of s){let r=XG(e,n);WG(e,e.kings[+!t],!t)||o.push({...n}),ZG(e,n,r)}}return o}function YG(e,t,n,r,i,a){let o=e.turn===`white`,s=t&7,c=t>>3,l=(e,n)=>{a.push(n?{from:t,to:e,promotion:n}:{from:t,to:e})},u=e=>{for(let[t,n]of e){let e=s+t,a=c+n;for(;e>=0&&e<8&&a>=0&&a<8;){let o=a*8+e,s=LG(o);if(!(r&s))l(o);else{i&s&&l(o);break}e+=t,a+=n}}};switch(n){case 0:{let n=o?8:-8,a=o?1:6,u=o?7:0,d=t+n;if(d>=0&&d<64&&!(r&LG(d))){if(d>>3===u)for(let e of MG)l(d,e);else{l(d);let e=t+2*n;c===a&&!(r&LG(e))&&l(e)}}for(let r of[-1,1]){let a=s+r;if(a<0||a>7)continue;let o=t+n+r;if(!(o<0||o>=64)){if(i&LG(o)){if(o>>3===u)for(let e of MG)l(o,e);else l(o)}else o===e.enPassant&&l(o)}}break}case 1:{let n=BG[t]&~HG(e,o?0:6);for(;n;){let e=n&-n;l(RG(e)),n^=e}break}case 2:u(FG);break;case 3:u(IG);break;case 4:u(FG),u(IG);break;case 5:{let n=VG[t]&~HG(e,o?0:6);for(n&=~e.pieces[o?11:5];n;){let e=n&-n;l(RG(e)),n^=e}let i=o?0:56,a=e.castling,s=o?a&1:a&4,c=o?a&2:a&8;t===i+4&&!WG(e,t,!o)&&(s&&!(r&LG(i+5))&&!(r&LG(i+6))&&!WG(e,i+5,!o)&&!WG(e,i+6,!o)&&l(i+6),c&&!(r&LG(i+3))&&!(r&LG(i+2))&&!(r&LG(i+1))&&!WG(e,i+3,!o)&&!WG(e,i+2,!o)&&l(i+2));break}}}function XG(e,t){let n=e.turn===`white`,r=+!n,i=r*6,a=LG(t.from),o=LG(t.to),s=-1;for(let t=0;t<6;t++)if(e.pieces[i+t]&a){s=t;break}if(s===-1)throw Error(`no piece on ${t.from} to move`);let c={captured:null,castling:e.castling,enPassant:e.enPassant,halfmove:e.halfmove,kingSquare:e.kings[r]},l=(1-r)*6,u=n?8:-8,d=t.to;s===0&&t.to===e.enPassant&&(d=t.to-u);let f=LG(d);for(let t=0;t<6;t++)if(e.pieces[l+t]&f){c.captured={color:1-r,kind:t},e.pieces[l+t]^=f;break}let p=n?0:56,m=n?56:0;if(s===5&&(e.castling&=~(GG(e.turn,!0)|GG(e.turn,!1))),s===3&&(t.from===p||t.from===p+7)&&(e.castling&=~GG(e.turn,t.from===p+7)),c.captured?.kind===3&&(d===m||d===m+7)&&(e.castling&=~GG(n?`black`:`white`,d===m+7)),e.pieces[i+s]^=a,t.promotion?e.pieces[i+jG[t.promotion]]|=o:e.pieces[i+s]|=o,s===5&&Math.abs(t.to-t.from)===2){let n=i+3;t.to>t.from?e.pieces[n]^=LG(p+7)|LG(p+5):e.pieces[n]^=LG(p)|LG(p+3)}return e.enPassant=s===0&&Math.abs(t.to-t.from)===16?(t.from+t.to)/2:null,e.halfmove=s===0||c.captured?0:e.halfmove+1,s===5&&(e.kings[r]=t.to),e.turn=n?`black`:`white`,c}function ZG(e,t,n){e.turn=e.turn===`white`?`black`:`white`;let r=e.turn===`white`,i=+!r,a=i*6,o=LG(t.to),s=t.promotion?0:(()=>{for(let t=0;t<6;t++)if(e.pieces[a+t]&o)return t;throw Error(`nothing on ${t.to} to take back`)})();if(t.promotion?e.pieces[a+jG[t.promotion]]^=o:e.pieces[a+s]^=o,e.pieces[a+s]|=LG(t.from),s===5&&Math.abs(t.to-t.from)===2){let n=r?0:56,i=a+3;t.to>t.from?e.pieces[i]^=LG(n+7)|LG(n+5):e.pieces[i]^=LG(n)|LG(n+3)}if(n.captured){let a=r?8:-8,o=s===0&&t.to===n.enPassant?t.to-a:t.to;e.pieces[(1-i)*6+n.captured.kind]|=LG(o)}e.castling=n.castling,e.enPassant=n.enPassant,e.halfmove=n.halfmove,e.kings[i]=n.kingSquare}function QG(e,t){if(!Number.isInteger(t)||t<0)throw RangeError(`perft depth must be a non-negative integer`);if(t===0)return 1;let n=0;for(let r of JG(e)){let i=XG(e,r);n+=QG(e,t-1),ZG(e,r,i)}return n}function $G(e,t={}){let n=1e6,r=[100,320,330,500,900,0],i=Math.max(1,Math.floor(t.depth??3)),a=t.maxNodes===void 0?5e5:Math.max(1,Math.floor(t.maxNodes)),o=t.timeMs===void 0?-1:Date.now()+Math.max(1,t.timeMs),s={pieces:e.pieces.slice(),turn:e.turn,castling:e.castling,enPassant:e.enPassant,halfmove:e.halfmove,kings:[e.kings[0],e.kings[1]]};function c(e){return 1n<<BigInt(e)}function l(e){return Math.log2(Number(e))}let u=[[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]],d=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]],f=[[1,1],[-1,1],[-1,-1],[1,-1]],p=[[1,0],[0,1],[-1,0],[0,-1]];function m(e){return Array.from({length:64},(t,n)=>{let r=n&7,i=n>>3,a=0n;for(let[t,n]of e){let e=r+t,o=i+n;e>=0&&e<8&&o>=0&&o<8&&(a|=c(o*8+e))}return a})}let h=m(u),g=m(d);function _(e){return s.pieces[e]|s.pieces[e+1]|s.pieces[e+2]|s.pieces[e+3]|s.pieces[e+4]|s.pieces[e+5]}function v(e){let t=c(e);for(let e=0;e<12;e++)if(s.pieces[e]&t)return e%6;return-1}function y(e,t){let n=t?0:6,r=e&7,i=e>>3,a=t?i-1:i+1;for(let e of[-1,1]){let t=r+e;if(a>=0&&a<8&&t>=0&&t<8&&s.pieces[n]&c(a*8+t))return!0}if(h[e]&s.pieces[n+1]||g[e]&s.pieces[n+5])return!0;let o=[{steps:f,kinds:[2,4]},{steps:p,kinds:[3,4]}];for(let{steps:e,kinds:n}of o)for(let[a,o]of e){let e=r+a,l=i+o;for(;e>=0&&e<8&&l>=0&&l<8;){let r=v(l*8+e);if(r!==-1){if((()=>{let t=c(l*8+e);for(let e=0;e<12;e++)if(s.pieces[e]&t)return e<6?0:1;return-1})()===+!t&&n.includes(r))return!0;break}e+=a,l+=o}}return!1}let b=0n,x=11400714819323198485n;function S(){x=x+11400714819323198485n&18446744073709551615n;let e=x;return e=(e^e>>30n)*13787848793156543929n&18446744073709551615n,e=(e^e>>27n)*10723151780598845931n&18446744073709551615n,e^e>>31n}let C=Array.from({length:12},()=>Array.from({length:64},()=>S())),ee=S(),w=Array.from({length:16},()=>S()),T=Array.from({length:8},()=>S());function E(){let e=0n;for(let t=0;t<12;t++){let n=s.pieces[t];for(;n;){let r=n&-n;e^=C[t][l(r)],n^=r}}return s.turn===`black`&&(e^=ee),e^=w[s.castling],s.enPassant!==null&&(e^=T[s.enPassant&7]),e}b=E();function te(e,t){return e===`white`?t?1:2:t?4:8}function D(e){let t=s.turn===`white`,n=+!t,r=n*6,i=c(e.from),a=c(e.to),o=-1;for(let e=0;e<6;e++)if(s.pieces[r+e]&i){o=e;break}let l={captured:null,castling:s.castling,enPassant:s.enPassant,halfmove:s.halfmove,kingSquare:s.kings[n],key:b,nullMove:!1},u=(1-n)*6,d=t?8:-8,f=e.to;o===0&&e.to===s.enPassant&&(f=e.to-d);let p=c(f);for(let e=0;e<6;e++)if(s.pieces[u+e]&p){l.captured={color:1-n,kind:e},s.pieces[u+e]^=p;break}let m=t?0:56,h=t?56:0;o===5&&(s.castling&=~(te(s.turn,!0)|te(s.turn,!1))),o===3&&(e.from===m||e.from===m+7)&&(s.castling&=~te(s.turn,e.from===m+7)),l.captured&&l.captured.kind===3&&(f===h||f===h+7)&&(s.castling&=~te(t?`black`:`white`,f===h+7));let g={queen:4,rook:3,bishop:2,knight:1};if(s.pieces[r+o]^=i,e.promotion?s.pieces[r+g[e.promotion]]|=a:s.pieces[r+o]|=a,o===5&&Math.abs(e.to-e.from)===2){let t=r+3;e.to>e.from?s.pieces[t]^=c(m+7)|c(m+5):s.pieces[t]^=c(m)|c(m+3)}return s.enPassant=o===0&&Math.abs(e.to-e.from)===16?(e.from+e.to)/2:null,s.halfmove=o===0||l.captured?0:s.halfmove+1,o===5&&(s.kings[n]=e.to),s.turn=t?`black`:`white`,b=E(),l}function O(e,t){s.turn=s.turn===`white`?`black`:`white`;let n=s.turn===`white`,r=+!n,i=r*6,a=c(e.to),o=e.promotion?0:(()=>{for(let e=0;e<6;e++)if(s.pieces[i+e]&a)return e;return-1})(),l={queen:4,rook:3,bishop:2,knight:1};if(e.promotion?s.pieces[i+l[e.promotion]]^=a:s.pieces[i+o]^=a,s.pieces[i+o]|=c(e.from),o===5&&Math.abs(e.to-e.from)===2){let t=n?0:56,r=i+3;e.to>e.from?s.pieces[r]^=c(t+7)|c(t+5):s.pieces[r]^=c(t)|c(t+3)}if(t.captured){let i=n?8:-8,a=o===0&&e.to===t.enPassant?e.to-i:e.to;s.pieces[(1-r)*6+t.captured.kind]|=c(a)}s.castling=t.castling,s.enPassant=t.enPassant,s.halfmove=t.halfmove,s.kings[r]=t.kingSquare,b=t.key}function ne(){let e={captured:null,castling:s.castling,enPassant:s.enPassant,halfmove:s.halfmove,kingSquare:-1,key:b,nullMove:!0};return s.enPassant=null,s.halfmove+=1,s.turn=s.turn===`white`?`black`:`white`,b=E(),e}function k(e){s.turn=s.turn===`white`?`black`:`white`,s.enPassant=e.enPassant,s.halfmove=e.halfmove,b=e.key}function A(e,t,n,r,i){let a=s.turn===`white`,o=e&7,u=e>>3,d=(t,n)=>{i.push(n?{from:e,to:t,promotion:n}:{from:e,to:t})},m=e=>{for(let[t,i]of e){let e=o+t,a=u+i;for(;e>=0&&e<8&&a>=0&&a<8;){let o=a*8+e,s=c(o);if(!(n&s))d(o);else{r&s&&d(o);break}e+=t,a+=i}}},v=[`queen`,`rook`,`bishop`,`knight`];if(t===0){let t=a?8:-8,i=a?1:6,l=a?7:0,f=e+t;if(f>=0&&f<64&&!(n&c(f))){if(f>>3===l)for(let e of v)d(f,e);else{d(f);let r=e+2*t;u===i&&!(n&c(r))&&d(r)}}for(let n of[-1,1]){let i=o+n;if(i<0||i>7)continue;let a=e+t+n;if(!(a<0||a>=64)){if(r&c(a)){if(a>>3===l)for(let e of v)d(a,e);else d(a)}else a===s.enPassant&&d(a)}}}else if(t===1){let t=h[e]&~_(a?0:6);for(;t;){let e=t&-t;d(l(e)),t^=e}}else if(t===2)m(f);else if(t===3)m(p);else if(t===4)m(f),m(p);else{let t=g[e]&~_(a?0:6);for(t&=~s.pieces[a?11:5];t;){let e=t&-t;d(l(e)),t^=e}let r=a?0:56,i=s.castling,o=a?i&1:i&4,u=a?i&2:i&8;e===r+4&&!y(e,!a)&&(o&&!(n&c(r+5))&&!(n&c(r+6))&&!y(r+5,!a)&&!y(r+6,!a)&&d(r+6),u&&!(n&c(r+3))&&!(n&c(r+2))&&!(n&c(r+1))&&!y(r+3,!a)&&!y(r+2,!a)&&d(r+2))}}function re(){let e=s.turn===`white`,t=e?0:6,n=_(t),r=_(t===0?6:0),i=n|r,a=[],o=[];for(let l=0;l<64;l++){if(!(n&c(l)))continue;let u=-1;for(let e=0;e<6;e++)if(s.pieces[t+e]&c(l)){u=e;break}o.length=0,A(l,u,i,r,o);for(let t of o){let n=D(t);y(s.kings[+!e],!e)||a.push({...t}),O(t,n)}}return a}function ie(e){let t=e?0:6;return s.pieces[t+1]!==0n||s.pieces[t+2]!==0n||s.pieces[t+3]!==0n||s.pieces[t+4]!==0n}function ae(){let e=0,t=0;for(let n=0;n<12;n++){if(n%6==5)continue;let r=s.pieces[n];for(;r;)r&=r-1n,e++,(n%6==1||n%6==2)&&t++}return e===0||e===1&&t===1}function oe(){let e=0,t=0;for(let n=0;n<12;n++){let r=s.pieces[n];for(;r;)r&=r-1n,n%6==4?e++:n%6!=5&&n%6!=0&&t++}return e===0||e===2&&t<=2}function se(e,t,n,r){let i=t&7,a=n?t>>3:7-(t>>3),o=3.5-Math.abs(i-3.5),s=3.5-Math.abs(a-3.5);return e===0?(a-1)*12+Math.max(0,o)*4:e===1?(o+s)*6-12:e===2?(o+s)*4:e===3?(o+s)*2+(a===6?12:0):e===4?(o+s)*2:r?(o+s)*10:-a*10+o*2}function j(){let e=oe(),t=0;for(let n=0;n<12;n++){let i=n<6,a=n%6,o=s.pieces[n];for(;o;){let n=o&-o,s=l(n),c=r[a]+se(a,s,i,e);t+=i?c:-c,o^=n}}return s.turn===`white`?t:-t}let ce=65536,le=Array(ce).fill(-1n),ue=Array(ce).fill(-1),de=Array(ce).fill(0),fe=Array(ce).fill(0),pe=Array(ce).fill(0);function me(e){let t=e.promotion===`queen`?1:e.promotion===`rook`?2:e.promotion===`bishop`?3:e.promotion===`knight`?4:0;return e.from|e.to<<6|t<<12}function he(e,t,n,r){let i=Number(b&BigInt(65535));if(le[i]!==b)return{score:null,move:0};let a=pe[i];if(ue[i]<e)return{score:null,move:a};let o=de[i];o>99e3?o-=r:o<-99e3&&(o+=r);let s=fe[i];return s===0||s===1&&o>=n||s===2&&o<=t?{score:o,move:a}:{score:null,move:a}}function ge(e,t,n,r,i){let a=Number(b&BigInt(65535));if(le[a]===b&&ue[a]>e)return;let o=t;t>99e3?o+=i:t<-99e3&&(o-=i),le[a]=b,ue[a]=e,de[a]=o,fe[a]=n,pe[a]=r}let _e=Array.from({length:64},()=>[0,0]),ve=Array.from({length:2},()=>Array.from({length:64},()=>Array(64).fill(0)));function M(e){let t=s.turn===`white`?6:0,n=c(e);for(let e=4;e>=0;e--)if(s.pieces[t+e]&n)return e;return-1}function N(e,t,n){let i=s.turn===`white`?0:1,a=e.map(e=>{let a=me(e);if(a===t)return 3e6;let o=M(e.to),c=v(e.from),l=e.to===s.enPassant&&c===0;if(o!==-1||l){let t=2e6+(l?r[0]:r[o])*8-c;return e.promotion&&(t+=900),t}return e.promotion?15e5:n<64?_e[n][0]===a?1e6:_e[n][1]===a?9e5:ve[i][e.from][e.to]:0}),o=e.map((e,t)=>t);for(let e=0;e<o.length;e++){let t=e;for(let n=e+1;n<o.length;n++)a[o[n]]>a[o[t]]&&(t=n);[o[e],o[t]]=[o[t],o[e]]}return o}let ye=0,be=!1,P=[];function xe(){return be?!0:ye>a||t.signal?.aborted||o!==-1&&!(ye&2047)&&Date.now()>=o?(be=!0,!0):!1}function Se(e,t,n){if(ye++,xe())return 0;let i=s.turn===`white`;if(s.halfmove>=100||ae())return 0;if(y(s.kings[+!i],!i))return F(1,e,t,n,!1);let a=j();if(a>=t)return t;a>e&&(e=a);let o=re().filter(e=>{if(e.promotion||e.to===s.enPassant&&v(e.from)===0)return!0;let t=i?6:0,n=c(e.to);for(let e=0;e<5;e++)if(s.pieces[t+e]&n)return!0;return!1}),l=N(o,0,Math.min(n,63));for(let i of l){let s=o[i],c=M(s.to);if(a+(c===-1?900:r[c])+200<e)continue;let l=D(s);P.push(b);let u=-Se(-t,-e,n+1);if(P.pop(),O(s,l),be)return 0;if(u>=t)return t;u>e&&(e=u)}return e}function F(e,t,n,r,i){if(ye++,xe())return 0;let a=s.turn===`white`;if(s.halfmove>=100||ae())return 0;let o=0;for(let e of P)if(e===b&&++o>=2)return 0;if(r>=64)return j();if(e<=0)return Se(t,n,r);let c=y(s.kings[+!a],!a),l=he(e,t,n,r);if(l.score!==null)return l.score;if(c)i=!1;else if(i&&e>=3&&ie(a)&&n<99e3){let t=e>4?3:2,i=ne();P.push(b);let a=-F(e-1-t,-n,-n+1,r+1,!1);if(P.pop(),k(i),be)return 0;if(a>=n)return n}let u=re();if(u.length===0)return c?-(1e5-r):0;let d=N(u,l.move,Math.min(r,63)),f=+!a,p=-1e6,m=0,h=2;for(let i=0;i<d.length;i++){let a=u[d[i]],o=me(a),l=M(a.to)!==-1||a.to===s.enPassant&&v(a.from)===0,g=D(a);P.push(b);let _;if(i===0)_=-F(e-1,-n,-t,r+1,!0);else{let o=0;e>=3&&i>=4&&!l&&!a.promotion&&!c&&(o=1),o>0?(_=-F(e-1-o,-t-1,-t,r+1,!0),!be&&_>t&&(_=-F(e-1,-n,-t,r+1,!0))):(_=-F(e-1,-t-1,-t,r+1,!0),!be&&_>t&&_<n&&(_=-F(e-1,-n,-t,r+1,!0)))}if(P.pop(),O(a,g),be)return 0;if(_>p&&(p=_,m=o),_>t&&(t=_,h=+(_>=n),!l&&!a.promotion&&r<64&&(ve[f][a.from][a.to]+=e*e,_e[r][0]!==o&&(_e[r][1]=_e[r][0],_e[r][0]=o))),t>=n)break}return ge(e,p,h,m,r),p}let Ce=re();if(Ce.length===0){let e=s.turn===`white`;return{move:null,score:y(s.kings[+!e],!e)?-1e5:0,nodes:ye,depth:0}}P.push(b);let we={from:Ce[0].from,to:Ce[0].to,...Ce[0].promotion?{promotion:Ce[0].promotion}:{}},Te=-1e6,Ee=0,De=Ce.map(e=>({...e}));for(let e=1;e<=i;e++){let t=-1e6,r=n,i=!1,a=we,o=Te;e>=4&&Ee>0&&(i=!0,t=Te-24,r=Te+24);for(let s=0;s<3;s++){let s=t,c=r,l=a,u=-1e6,d=N(De,me({from:a.from,to:a.to,promotion:a.promotion}),0),f=[];for(let n=0;n<d.length;n++){let i=De[d[n]],a=D(i);P.push(b);let o;if(n===0?o=-F(e-1,-r,-t,1,!0):(o=-F(e-1,-t-1,-t,1,!0),!be&&o>t&&o<r&&(o=-F(e-1,-r,-t,1,!0))),P.pop(),O(i,a),be)break;f.push(i),o>u&&(u=o,l=i),o>t&&(t=o)}if(be)break;for(let e of De)f.includes(e)||f.push(e);if(De=f,a=l,o=u,!i)break;if(u<=s||u>=c)t=-1e6,r=n,i=!1;else break}if(be||(we=a,Te=o,De=[we,...De.filter(e=>e!==we)],Ee=e,Te>99e3||Te<-99e3)||xe())break}return P.pop(),Ee===0?{move:null,score:j(),nodes:ye,depth:0}:{move:we,score:Te,nodes:ye,depth:Ee}}function eK(e){let t=`pieces`in e?e:KG(e);return{pieces:t.pieces.slice(),turn:t.turn,castling:t.castling,enPassant:t.enPassant,halfmove:t.halfmove,kings:[t.kings[0],t.kings[1]]}}function tK(e,t={}){return $G(eK(e),{depth:t.depth,maxNodes:t.maxNodes,timeMs:t.timeMs,signal:t.signal})}async function nK(e,t={}){let n=Math.max(1,Math.floor(t.depth??3)),r=t.maxNodes===void 0?5e5:Math.max(1,Math.floor(t.maxNodes)),i=t.jobs??xG();if(!Number.isInteger(i)||i<1)throw RangeError(`jobs must be a positive integer`);if(t.signal?.aborted)throw t.signal.reason;let a=eK(e),o=JG(a);if(!o.length)return{...$G(a,{depth:n,maxNodes:r}),rootScores:[]};let s=Math.max(1,Math.min(i,o.length)),c=o.map(e=>{let t=eK(a);return XG(t,e),t}),l=Array(o.length),u=0,d=0,f=t.signal?{signal:t.signal}:{};await Promise.all(Array.from({length:s},async()=>{for(;;){let e=d++;if(e>=o.length)return;let i=await hG($G,[c[e],{depth:Math.max(1,n-1),maxNodes:r,timeMs:t.timeMs}],f);u+=i.nodes,l[e]=-i.score}}));let p=0;for(let e=1;e<o.length;e++)(l[e]??-1/0)>(l[p]??-1/0)&&(p=e);let m=o[p];return{move:{from:m.from,to:m.to,...m.promotion?{promotion:m.promotion}:{}},score:l[p]??0,nodes:u,depth:n,rootScores:o.map((e,t)=>({move:{from:e.from,to:e.to,...e.promotion?{promotion:e.promotion}:{}},score:l[t]??0}))}}var rK={queen:`Q`,rook:`R`,bishop:`B`,knight:`N`},iK={Q:`queen`,R:`rook`,B:`bishop`,N:`knight`},aK={pawn:0,knight:1,bishop:2,rook:3,queen:4,king:5};function oK(e){let t={queen:0,rook:1,bishop:2,knight:3};return`K${e.slice().sort((e,n)=>t[e]-t[n]).map(e=>rK[e]).join(``)}K`}var sK=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`;function cK(e){let t=``;for(let n=0;n<e.length;n+=3){let r=e[n],i=n+1<e.length?e[n+1]:0,a=n+2<e.length?e[n+2]:0;t+=sK[r>>2]+sK[(r&3)<<4|i>>4],t+=n+1<e.length?sK[(i&15)<<2|a>>6]:`=`,t+=n+2<e.length?sK[a&63]:`=`}return t}function lK(e){if(e.length%4!=0)throw Error(`tablebase data is not base64: length is not a multiple of 4`);let t=Array(e.length);for(let n=0;n<e.length;n++){if(e[n]===`=`){t[n]=-1;continue}let r=sK.indexOf(e[n]);if(r===-1)throw Error(`tablebase data is not base64: ${e[n]}`);t[n]=r}let n=[];for(let e=0;e<t.length;e+=4){let[r,i,a,o]=[t[e],t[e+1],t[e+2],t[e+3]];if(r===-1||i===-1)throw Error(`tablebase data is not base64: padding inside a quantum`);n.push(r<<2|i>>4),a!==-1&&n.push((i&15)<<4|a>>2),o!==-1&&n.push((a&3)<<6|o)}return new Uint8Array(n)}function uK(e){let t=Array(256).fill(0);for(let n of e)t[n]++;let n=t.map((e,t)=>({count:e,symbol:t})).filter(e=>e.count>0),r=[1,n.length];if(n.length===0)return cK(new Uint8Array([1,0,0,0,0,0]));if(n.length===1){r.push(n[0].symbol,0);let t=new Uint8Array(r.length+4);return t.set(r,0),t[r.length]=e.length&255,t[r.length+1]=e.length>>8&255,t[r.length+2]=e.length>>16&255,t[r.length+3]=e.length>>24&255,cK(t)}let i=dK(n.map(e=>e.count)),a=n.map((e,t)=>({symbol:e.symbol,length:i[t]})).sort((e,t)=>e.symbol-t.symbol);for(let e of a)r.push(e.symbol);for(let e of a)r.push(e.length);let o=fK(a),s=new Map;for(let e=0;e<a.length;e++)s.set(a[e].symbol,o[e]);let c=0;for(let e of n)c+=e.count*s.get(e.symbol).length;let l=new Uint8Array(r.length+4+Math.ceil(c/8));l.set(r,0),l[r.length]=e.length&255,l[r.length+1]=e.length>>8&255,l[r.length+2]=e.length>>16&255,l[r.length+3]=e.length>>24&255;let u=0,d=r.length+4;for(let t of e){let e=s.get(t);for(let t=e.length-1;t>=0;t--)e.code>>t&1&&(l[d+(u>>3)]|=1<<7-(u&7)),u++}return cK(l)}function dK(e){let t=e.length;if(t===0)return[];let n=e.slice(),r=Array(t).fill(0),i=e.map((e,t)=>t),a=[];for(;i.length>1;){i.sort((e,t)=>n[e]-n[t]);let e=i.shift(),t=i.shift();a.push([e,t]),n[e]+=n[t],n[t]=-1,i.push(e)}for(let e=a.length-1;e>=0;e--){let[t,n]=a[e];r[n]=r[t]+1,r[t]++}if(r.some(e=>e>32))throw Error(`tablebase Huffman code too deep`);return r}function fK(e){let t=e.slice().sort((e,t)=>e.length-t.length||e.symbol-t.symbol),n=0,r=t[0].length,i=new Map;for(let e of t)n<<=e.length-r,i.set(e.symbol,{code:n,length:e.length}),n++,r=e.length;return e.map(e=>i.get(e.symbol))}function pK(e){let t=lK(e);if(t.length<2)throw Error(`tablebase data holds no header`);if(t[0]!==1)throw Error(`tablebase data version ${t[0]} is not 1`);let n=t[1];if(2+2*n>t.length)throw Error(`tablebase data ends inside its header`);let r=[],i=[];for(let e=0;e<n;e++)r.push(t[2+e]);for(let e=0;e<n;e++)i.push(t[2+n+e]);let a=2+2*n;if(n===0){if(a+4!==t.length)throw Error(`tablebase data trails its empty header`);return new Uint8Array}if(n===1){if(a+4!==t.length)throw Error(`tablebase data trails its single-symbol header`);let e=t[a]|t[a+1]<<8|t[a+2]<<16|t[a+3]<<24;return new Uint8Array(e).fill(r[0])}if(a+4>t.length)throw Error(`tablebase data ends before its count`);let o=t[a]|t[a+1]<<8|t[a+2]<<16|t[a+3]<<24,s=r.map((e,t)=>({symbol:e,length:i[t]})),c=fK(s),l={};for(let e=0;e<s.length;e++){let t=l;for(let n=c[e].length-1;n>=0;n--){let r=c[e].code>>n&1;n===0?r?t.one={symbol:s[e].symbol}:t.zero={symbol:s[e].symbol}:(r?t.one=t.one??{}:t.zero=t.zero??{},t=r?t.one:t.zero)}}let u=new Uint8Array(o),d=0,f=0,p=a+4,m=(t.length-p)*8;for(;d<o;){if(f>=m)throw Error(`tablebase data ends before its count`);let e=l;for(;;){let n=t[p+(f>>3)]>>7-(f&7)&1;if(f++,e=n?e.one:e.zero,!e)throw Error(`tablebase data walks off its Huffman tree`);if(e.symbol!==void 0)break}u[d++]=e.symbol}for(;f<m;f++)if(t[p+(f>>3)]>>7-(f&7)&1)throw Error(`tablebase data does not end in zero padding`);return u}function mK(e){let t=pK(e);if(t.length%2!=0)throw Error(`tablebase distances are not byte pairs`);let n=new Uint16Array(t.length/2);for(let e=0;e<n.length;e++)n[e]=t[2*e]|t[2*e+1]<<8;return n}function hK(e){if(e.version!==1)throw Error(`${e.id}: unknown tablebase version ${String(e.version)}`);if(e.id!==oK(e.white))throw Error(`${e.id}: id does not match its extras`);for(let t of e.white)if(!iK[rK[t]])throw Error(`${e.id}: not a tablebase piece: ${String(t)}`);let t=2+e.white.length,n=1;for(let e=0;e<t;e++)n*=64;if(n*=2,e.positions!==n)throw Error(`${e.id}: claims ${e.positions} positions, holds ${n}`);let r=pK(e.wdl);if(r.length!==n)throw Error(`${e.id}: WDL decodes to ${r.length} positions, needs ${n}`);let i=mK(e.dtm);if(i.length!==n)throw Error(`${e.id}: distances decode to ${i.length} positions, need ${n}`);let a={queen:0,rook:1,bishop:2,knight:3};return{id:e.id,extras:e.white.slice().sort((e,t)=>a[e]-a[t]).map(e=>aK[e]),positions:n,wdl:r,dtm:i}}function gK(e){if(`pieces`in e){let t=[];for(let n=0;n<12;n++){let r=e.pieces[n];for(;r;){let e=r&-r;t.push({kind:n%6,side:n<6?`white`:`black`,square:Math.log2(Number(e))}),r^=e}}return t}let t=[];return e.board.forEach((e,n)=>{e&&t.push({kind:aK[e.kind],side:e.side,square:n})}),t}function _K(e){if(`pieces`in e)return e.castling!==0;let t=e.castling;return t.whiteKingside||t.whiteQueenside||t.blackKingside||t.blackQueenside}function vK(e,t,n=0){if(!Number.isInteger(n)||n<0)throw RangeError(`halfmove must be a non-negative integer`);let r=gK(t),i=r.filter(e=>e.kind===5&&e.side===`white`),a=r.filter(e=>e.kind===5&&e.side===`black`);if(i.length!==1||a.length!==1||r.some(e=>e.kind===0)||r.some(e=>e.kind!==5&&e.side===`black`)||_K(t))return null;let o=r.filter(e=>e.kind!==5).sort((e,t)=>t.kind-e.kind).map(e=>e.kind);if(!o.length)return null;let s={4:`Q`,3:`R`,2:`B`,1:`N`},c=e[`K${o.map(e=>s[e]).join(``)}K`];if(!c)return null;let l=r.find(e=>e.kind===5&&e.side===`white`).square,u=r.find(e=>e.kind===5&&e.side===`black`).square,d=o.map((e,t)=>r.filter(t=>t.kind===e&&t.side===`white`).map(e=>e.square).sort((e,t)=>e-t)[yK(o,e,t)]),f=l;for(let e of d)f=f*64+e;f=f*64+u,f=f*2+ +(t.turn===`black`);let p=c.wdl[f];if(p===0)return null;let m=c.dtm[f],h=p===3?`win`:p===1?`loss`:`draw`;return h!==`draw`&&m>100-n&&(h=`draw`),{outcome:h,dtm:m}}function yK(e,t,n){let r=0;for(let i=0;i<n;i++)e[i]===t&&r++;return r}_e();var bK=class{constructor(e,t,n){if(this.width=e,this.height=t,e<1||t<1)throw Error(`a board needs positive dimensions`);if(n&&n.length!==e*t)throw Error(`board cell count does not match dimensions`);this.cells=n?[...n]:Array(e*t).fill(null)}index(e,t){if(!this.inside(e,t))throw Error(`cell (${e},${t}) is outside the board`);return nr(this.width,e,t)}inside(e,t){return tr(this.width,this.height,e,t)}get(e,t){return this.cells[this.index(e,t)]}set(e,t,n){this.cells[this.index(e,t)]=n}move(e,t){let n=this.get(e.x,e.y);if(n===null)throw Error(`cannot move an empty cell`);return this.set(e.x,e.y,null),this.set(t.x,t.y,n),n}};function xK(){let e=Array(64).fill(null);for(let t=0;t<3;t++)for(let n=0;n<8;n++)(n+t)%2&&(e[t*8+n]={side:`black`,king:!1});for(let t=5;t<8;t++)for(let n=0;n<8;n++)(n+t)%2&&(e[t*8+n]={side:`red`,king:!1});return{board:e,turn:`red`,forcedFrom:null}}function SK(e){let t=e.forcedFrom===null?e.board.map((t,n)=>t?.side===e.turn?n:-1).filter(e=>e>=0):[e.forcedFrom],n=t.flatMap(t=>wK(e,t,!0));return n.length>0?n:e.forcedFrom===null?t.flatMap(t=>wK(e,t,!1)):[]}function CK(e,t){if(!SK(e).some(e=>e.from===t.from&&e.to===t.to&&e.captures.length===t.captures.length))throw Error(`illegal checkers move`);let n=e.board[t.from];if(!n)throw Error(`no checkers piece on the source cell`);e.board[t.from]=null;for(let n of t.captures)e.board[n]=null;let r=!n.king&&(n.side===`red`&&Math.floor(t.to/8)===0||n.side===`black`&&Math.floor(t.to/8)===7);e.board[t.to]={...n,king:n.king||r};let i={board:e.board,turn:e.turn,forcedFrom:t.captures.length>0?t.to:null};t.captures.length===0||wK(i,t.to,!0).length===0?(e.turn=e.turn===`red`?`black`:`red`,e.forcedFrom=null):e.forcedFrom=t.to}function wK(e,t,n){let r=e.board[t];if(!r)return[];let i=t%8,a=Math.floor(t/8),o=r.king?[-1,1]:r.side===`red`?[-1]:[1],s=[];for(let c of o)for(let o of[-1,1]){let l=i+o,u=a+c,d=i+o*2,f=a+c*2;if(n){if(d<0||f<0||d>=8||f>=8)continue;let n=u*8+l,i=f*8+d;e.board[n]?.side!==r.side&&e.board[n]&&!e.board[i]&&s.push({from:t,to:i,captures:[n]})}else l>=0&&u>=0&&l<8&&u<8&&!e.board[u*8+l]&&s.push({from:t,to:u*8+l,captures:[]})}return s}function TK(e=9){if(e<2||e>25)throw Error(`Go size must be between 2 and 25`);return{size:e,board:Array(e*e).fill(null),turn:`black`,ko:null,passes:0}}function EK(e,t,n){let r=AK(e,t,n);if(e.board[r]||e.ko===r)throw Error(`Go cell is occupied or forbidden by ko`);let i=[...e.board];i[r]=e.turn;let a=e.turn===`black`?`white`:`black`,o=0,s=null;for(let t of jK(e.size,r)){if(i[t]!==a||NK(i,e.size,t)!==0)continue;let n=MK(i,e.size,t);n.length===1&&(s=n[0]);for(let e of n)i[e]=null;o+=n.length}if(NK(i,e.size,r)===0)throw Error(`suicide is not a legal Go move`);e.ko=o===1&&NK(i,e.size,r)===1?s:null,e.board=i,e.turn=a,e.passes=0}function DK(e){e.turn=e.turn===`black`?`white`:`black`,e.ko=null,e.passes++}function OK(e){return e.passes>=2?`finished`:`ongoing`}function kK(e){let t={black:0,white:0},n=new Set;for(let r=0;r<e.board.length;r++){let i=e.board[r];if(i)t[i]++;else if(!n.has(r)){let i=MK(e.board,e.size,r),a=new Set;for(let t of i)for(let n of jK(e.size,t))e.board[n]&&a.add(e.board[n]);for(let e of i)n.add(e);a.size===1&&(t[[...a][0]]+=i.length)}}return t}function AK(e,t,n){if(t<0||n<0||t>=e.size||n>=e.size)throw Error(`Go cell is outside the board`);return n*e.size+t}function jK(e,t){let n=t%e,r=Math.floor(t/e),i=[];return n>0&&i.push(t-1),n<e-1&&i.push(t+1),r>0&&i.push(t-e),r<e-1&&i.push(t+e),i}function MK(e,t,n){let r=e[n],i=[],a=[n],o=new Set;for(;a.length;){let n=a.pop();if(!(o.has(n)||e[n]!==r)){o.add(n),i.push(n);for(let e of jK(t,n))a.push(e)}}return i}function NK(e,t,n){let r=MK(e,t,n),i=new Set;for(let n of r)for(let r of jK(t,n))e[r]===null&&i.add(r);return i.size}function PK(){let e=Array(24).fill(0);return e[0]=2,e[11]=5,e[16]=3,e[18]=5,e[23]=-2,e[12]=-5,e[7]=-3,e[5]=-5,{points:e,bar:{white:0,black:0},off:{white:0,black:0},turn:`white`}}function FK(){let e=YK(2,6);return e[0]===e[1]?[...e,...e]:e}function IK(e,t){let n=e.turn===`white`?1:-1,r=n===1?[18,23]:[0,5],i=e=>n===1?24-e:e+1,a=!0,o=1/0;for(let t=0;t<24;t++)e.points[t]*n<=0||((t<r[0]||t>r[1])&&(a=!1),o=Math.min(o,i(t)));let s=(e,t)=>{if(!a)return!1;let n=i(e);return t===n||t>n&&n===o},c=[];for(let r of t)if(e.bar[e.turn]>0){let t=e.turn===`white`?r-1:24-r;RK(e,t,n)&&c.push({from:`bar`,to:t,die:r})}else for(let t=0;t<24;t++)if(e.points[t]*n>0){let i=t+r*n;i<0||i>=24?s(t,r)&&c.push({from:t,to:`off`,die:r}):RK(e,i,n)&&c.push({from:t,to:i,die:r})}return c}function LK(e,t){if(!IK(e,[t.die]).some(e=>e.from===t.from&&e.to===t.to))throw Error(`illegal backgammon move`);let n=e.turn===`white`?1:-1;if(t.from===`bar`?e.bar[e.turn]--:e.points[t.from]-=n,t.to===`off`)e.off[e.turn]++;else{if(e.points[t.to]*n<0){let n=e.turn===`white`?`black`:`white`;e.points[t.to]=0,e.bar[n]++}e.points[t.to]+=n}}function RK(e,t,n){return e.points[t]*n>=-1}function zK(e=0){let t=[`clubs`,`diamonds`,`hearts`,`spades`],n=[];for(let e of t)for(let t=1;t<=13;t++)n.push({suit:e,rank:t});return n.concat(Array(e).fill(null).map(()=>({suit:`spades`,rank:1})))}function BK(e){return oe(e)}function VK(e,t,n){if(t<0||n<0||e.length<t*n)throw Error(`not enough cards to deal`);return Array.from({length:t},()=>e.splice(0,n))}function HK(e,t){if(e.length===0)throw Error(`a trick needs at least one play`);let n=e[0].card.suit,r=e=>e.rank===1?14:e.rank;return(t&&e.some(e=>e.card.suit===t)?e.filter(e=>e.card.suit===t):e.filter(e=>e.card.suit===n)).reduce((e,t)=>r(t.card)>r(e.card)?t:e).owner}function UK(e){let t=zK();return e===void 0?BK(t):E(e,()=>BK(t)),{stock:t,waste:[],tableau:Array.from({length:7},(e,n)=>({down:t.splice(0,6-n),up:t.splice(0,1)})),foundations:[[],[],[],[]]}}function WK(e){e.stock.length===0&&(e.stock=e.waste.reverse(),e.waste=[]);let t=e.stock.pop()??null;return t&&e.waste.push(t),t}function GK(e,t,n,r=1){let i=e.tableau[t],a=e.tableau[n],o=i?.up.slice(-r);if(!i||!a||!o?.length||(a.up.length===0?o[0].rank!==13:!JK(o[0],a.up.at(-1))))throw Error(`illegal solitaire tableau move`);i.up.splice(-r,r),a.up.push(...o),i.down.length&&i.up.length===0&&i.up.push(i.down.pop())}function KK(e,t){let n=t===`waste`?e.waste.at(-1):e.tableau[t].up.at(-1);if(!n)throw Error(`no solitaire card to move`);let r=e.foundations.find(e=>e[0]?.suit===n.suit||e.length===0);if(!r||n.rank!==r.length+1)throw Error(`card cannot move to its foundation`);if(t===`waste`)e.waste.pop();else{let n=e.tableau[t];n.up.pop(),n.down.length&&n.up.length===0&&n.up.push(n.down.pop())}r.push(n)}function qK(e){return e.foundations.every(e=>e.length===13)}function JK(e,t){let n=e.suit===`diamonds`||e.suit===`hearts`,r=t.suit===`diamonds`||t.suit===`hearts`;return e.rank===t.rank-1&&n!==r}function YK(e,t){if(!Number.isInteger(e)||e<0||!Number.isInteger(t)||t<1)throw Error(`dice need a non-negative count and positive sides`);return Array.from({length:e},()=>ne(1,t))}function XK(e){let t=/^(\d+)d(\d+)([+-]\d+)?$/i.exec(e.trim());if(!t)throw Error(`bad dice expression: "${e}"`);return YK(Number(t[1]),Number(t[2])).reduce((e,t)=>e+t,Number(t[3]??0))}var ZK=class{constructor(e,t){this.kept=new Set,this.count=e,this.sides=t,this.values=YK(e,t)}reRoll(){for(let e=0;e<this.values.length;e++)this.kept.has(e)||(this.values[e]=ne(1,this.sides))}keep(e){if(e<0||e>=this.count)throw Error(`die index is outside the cup`);this.kept.add(e)}clearKept(){this.kept.clear()}};function QK(e,t){if(e.length!==5||e.some(e=>e<1||e>6))throw Error(`a score sheet needs five d6 values`);let n=new Map;for(let t of e)n.set(t,(n.get(t)??0)+1);let r=e.reduce((e,t)=>e+t,0);if(t===`chance`)return r;if(t===`yahtzee`)return n.size===1?50:0;if(t===`fullHouse`)return[...n.values()].sort().join(`,`)===`2,3`?25:0;if(t===`threeKind`)return[...n.values()].some(e=>e>=3)?r:0;if(t===`fourKind`)return[...n.values()].some(e=>e>=4)?r:0;if(t===`smallStraight`||t===`largeStraight`){let e=[`1234`,`2345`,`3456`],r=[`12345`,`23456`],i=[...n.keys()].sort().join(``);return(t===`smallStraight`?e:r).some(e=>i.includes(e))?t===`smallStraight`?30:40:0}let i=[`ones`,`twos`,`threes`,`fours`,`fives`,`sixes`].indexOf(t)+1;return i>0?(n.get(i)??0)*i:0}function $K(e,t,n=`hex`){if(e<1||t<1)throw Error(`a tactical map needs positive dimensions`);return{width:e,height:t,shape:n,cells:Array.from({length:e*t},()=>({passable:!0,cover:0})),units:[],turn:``,round:1}}function eq(e,t,n){return tr(e.width,e.height,t,n)&&!lq(e,t,n)}function tq(e,t){if(!eq(e,t.x,t.y))throw Error(`tactical unit cannot be placed there`);e.units.push({...t,maxActions:t.maxActions??t.actions}),e.turn||=t.owner}function nq(e,t){let n=cq(e,t);if(n.owner!==e.turn||n.actions<=0)return[];let r=pq(e,n,fq(e,n)),i=[];for(let a=0;a<e.height;a++)for(let o=0;o<e.width;o++){if(o===n.x&&a===n.y||!e.cells[a*e.width+o].passable||lq(e,o,a))continue;let s=mq(e,n,o,a,n.actions,r);s!==null&&i.push({unit:t,x:o,y:a,cost:s})}return i}function rq(e,t){let n=nq(e,t.unit).find(e=>e.x===t.x&&e.y===t.y);if(!n)throw Error(`illegal tactical move`);let r=cq(e,t.unit);r.x=t.x,r.y=t.y,r.actions-=n.cost}function iq(e,t){let n=cq(e,t);if(n.owner!==e.turn||n.actions<=0)throw Error(`only an active unit can enter overwatch`);n.actions=0,n.overwatch=!0}function aq(e,t,n){let r=cq(e,t),i=[];for(let t of[...e.units]){if(!t.overwatch||t.owner===r.owner||dq(e,t,r)>3)continue;let a=e.cells[r.y*e.width+r.x].cover??0,o=Math.max(0,n-a);if(r.hp=Math.max(0,r.hp-o),t.overwatch=!1,i.push({attacker:t.id,defender:r.id,damage:o,cover:a,killed:r.hp===0}),r.hp===0){e.units=e.units.filter(e=>e!==r);break}}return i}function oq(e,t,n,r){let i=cq(e,t),a=cq(e,n);if(i.owner!==e.turn||i.owner===a.owner)throw Error(`invalid tactical attack`);if(dq(e,i,a)>3)throw Error(`tactical target is out of range`);let o=e.cells[a.y*e.width+a.x].cover??0,s=Math.max(0,r-o);a.hp=Math.max(0,a.hp-s);let c=a.hp===0;return c&&(e.units=e.units.filter(e=>e!==a)),{attacker:t,defender:n,damage:s,cover:o,killed:c}}function sq(e){let t=[...new Set(e.units.map(e=>e.owner))];if(t.length===0)return;let n=t.indexOf(e.turn)+1;n>=t.length&&e.round++,e.turn=t[n%t.length];for(let t of e.units)t.owner===e.turn&&(t.actions=t.maxActions??t.actions,t.overwatch=!1)}function cq(e,t){let n=e.units.find(e=>e.id===t);if(!n)throw Error(`unknown tactical unit "${t}"`);return n}function lq(e,t,n){return e.units.some(e=>e.x===t&&e.y===n)}function uq(e,t,n){return e.shape===`hex`?Jn(t,n):[{x:t-1,y:n},{x:t+1,y:n},{x:t,y:n-1},{x:t,y:n+1}]}function dq(e,t,n){return e.shape===`hex`?Yn(t,n):Math.abs(t.x-n.x)+Math.abs(t.y-n.y)}function fq(e,t){return new Set(e.units.filter(n=>n.owner!==t.owner&&uq(e,t.x,t.y).some(e=>e.x===n.x&&e.y===n.y)).map(e=>e.id))}function pq(e,t,n){let r=new Set;for(let i of e.units)if(!(i.owner===t.owner||n.has(i.id)))for(let t of uq(e,i.x,i.y))r.add(`${t.x},${t.y}`);return r}function mq(e,t,n,r,i,a){let o=[{x:t.x,y:t.y,distance:0}],s=0,c=new Set([`${t.x},${t.y}`]);for(;s<o.length;){let t=o[s++];if(t.x===n&&t.y===r)return t.distance;if(!(t.distance>=i||t.distance>0&&a.has(`${t.x},${t.y}`)))for(let i of uq(e,t.x,t.y)){let a=`${i.x},${i.y}`;tr(e.width,e.height,i.x,i.y)&&!c.has(a)&&e.cells[i.y*e.width+i.x].passable&&(!lq(e,i.x,i.y)||i.x===n&&i.y===r)&&(c.add(a),o.push({x:i.x,y:i.y,distance:t.distance+1}))}}return null}var hq=class{constructor(e,t){if(this.visible=new Map,this.explored=new Map,this.shared=new Map,e<1||t<1)throw Error(`fog needs positive dimensions`);this.width=e,this.height=t}share(e){let t=[...new Set(e)].filter(e=>!!e);if(t.length===0)return;let n=new Set(t);for(let e of t)for(let t of this.shared.get(e)??[])n.add(t);for(let e of n)this.shared.set(e,n)}sync(e,t,n){if(!e)throw Error(`fog needs a faction id`);let r=new Set;for(let e of t)for(let t of n(e))this.inside(t.x,t.y)&&r.add(this.index(t.x,t.y));this.visible.set(e,r);let i=this.explored.get(e)??new Set;for(let e of r)i.add(e);this.explored.set(e,i)}reveal(e,t){if(!e)throw Error(`fog needs a faction id`);let n=this.explored.get(e)??new Set;for(let e of t)this.inside(e.x,e.y)&&n.add(this.index(e.x,e.y));this.explored.set(e,n)}isVisible(e,t,n){return this.seenBy(this.visible,e,this.index(t,n))}sees(e){return(t,n)=>this.isVisible(e,t,n)}isExplored(e,t,n){return this.seenBy(this.explored,e,this.index(t,n))}visibleCells(e){return this.cellsSeenBy(this.visible,e)}exploredCells(e){return this.cellsSeenBy(this.explored,e)}seenBy(e,t,n){let r=this.shared.get(t);if(!r)return e.get(t)?.has(n)??!1;for(let t of r)if(e.get(t)?.has(n))return!0;return!1}cellsSeenBy(e,t){let n=this.shared.get(t);if(!n)return[...e.get(t)??[]];let r=new Set;for(let t of n)for(let n of e.get(t)??[])r.add(n);return[...r].sort((e,t)=>e-t)}inside(e,t){return tr(this.width,this.height,e,t)}index(e,t){return this.inside(e,t)?nr(this.width,e,t):-1}};function gq(e){return{currency:e,pool:[]}}function _q(e,t,n,r){return e.currency<r||!eq(t,n.x,n.y)?!1:(tq(t,n),e.currency-=r,!0)}function vq(e,t,n,r,i){let a=e.pool.findIndex(e=>e.id===n);return a===-1||!eq(t,r,i)?!1:(tq(t,{...e.pool[a],x:r,y:i}),e.pool.splice(a,1),!0)}function yq(e,t,n){let r=t.units.findIndex(e=>e.id===n);if(r===-1)return!1;let{x:i,y:a,...o}=t.units[r];return e.pool.push(o),t.units.splice(r,1),!0}function bq(e,t,n){return e.units.filter(e=>e.owner===t).length*(n.incomePerUnit-n.upkeepPerUnit)}function xq(e,t,n,r){return e.currency+=bq(t,n,r),e.currency}_e();function Sq(e,t,n,r){if(e<1||t<1)throw Error(`a skirmish map needs positive dimensions`);let i=r??Object.keys(n)[0];if(!i||!n[i])throw Error(`a skirmish map needs at least one terrain kind`);return{width:e,height:t,terrainTable:n,cells:Array.from({length:e*t},()=>({terrain:i})),units:[],turn:``,round:1}}function Cq(e,t,n,r,i=!1){if(!Nq(e,t,n))throw Error(`cell is outside the skirmish map`);if(!e.terrainTable[r])throw Error(`unknown skirmish terrain "${r}"`);e.cells[n*e.width+t]=i?{terrain:r,village:!0}:{terrain:r}}function wq(e,t,n){return Nq(e,t,n)&&Iq(e,t,n)<1/0&&!Pq(e,t,n)}function Tq(e,t){if(!wq(e,t.x,t.y))throw Error(`skirmish unit cannot be placed there`);e.units.push({...t,remainingMoves:t.moves}),e.turn||=t.owner}function Eq(e,t){let n=Mq(e,t),r=n.remainingMoves??n.moves;if(n.owner!==e.turn||r<=0)return[];let i=new Set(e.units.filter(e=>e.id!==n.id).map(e=>`${e.x},${e.y}`)),a=Lq(e,n,r,i),o=[];for(let s=0;s<e.height;s++)for(let c=0;c<e.width;c++){if(c===n.x&&s===n.y||Iq(e,c,s)===1/0||i.has(`${c},${s}`))continue;let l=a.get(`${c},${s}`);l!==void 0&&l<=r&&o.push({unit:t,x:c,y:s,cost:l})}return o}function Dq(e,t){let n=Eq(e,t.unit).find(e=>e.x===t.x&&e.y===t.y);if(!n)throw Error(`illegal skirmish move`);let r=Mq(e,t.unit);r.x=t.x,r.y=t.y,r.remainingMoves=(r.remainingMoves??r.moves)-n.cost;let i=e.cells[t.y*e.width+t.x];i.village&&(i.owner=r.owner)}function Oq(e,t,n){let r=Mq(e,t),i=Mq(e,n);if(r.owner!==e.turn||r.owner===i.owner)throw Error(`invalid skirmish attack`);if(Yn(r,i)!==1)throw Error(`skirmish combat is adjacency-only`);let a=[kq(e,r,i)];return i.hp>0&&a.push(kq(e,i,r)),e.units=e.units.filter(e=>e.hp>0),{strikes:a}}function kq(e,t,n){let r=Fq(e,n.x,n.y).defense,i=A(Math.max(0,Math.min(1,t.hitChance*(1-r)))),a=i?Math.min(t.attack,n.hp):0;return n.hp-=a,{attacker:t.id,defender:n.id,hit:i,damage:a,killed:n.hp<=0}}function Aq(e,t,n,r){return n+e.cells.filter(e=>e.village&&e.owner===t).length*r}function jq(e,t=0){let n=[...new Set(e.units.map(e=>e.owner))];if(n.length===0)return;let r=n.indexOf(e.turn)+1;r>=n.length&&e.round++,e.turn=n[r%n.length];for(let n of e.units){if(n.owner!==e.turn)continue;n.remainingMoves=n.moves;let r=e.cells[n.y*e.width+n.x];r.village&&r.owner===n.owner&&t>0&&(n.hp=Math.min(n.maxHp,n.hp+t))}}function Mq(e,t){let n=e.units.find(e=>e.id===t);if(!n)throw Error(`unknown skirmish unit "${t}"`);return n}function Nq(e,t,n){return tr(e.width,e.height,t,n)}function Pq(e,t,n){return e.units.some(e=>e.x===t&&e.y===n)}function Fq(e,t,n){return e.terrainTable[e.cells[n*e.width+t].terrain]}function Iq(e,t,n){return Fq(e,t,n).moveCost}function Lq(e,t,n,r){let i=kr({x:t.x,y:t.y},{key:e=>ar(e.x,e.y),neighbors:t=>Jn(t.x,t.y).filter(t=>Nq(e,t.x,t.y)),cost:(t,n)=>Iq(e,n.x,n.y),canEnter:e=>!r.has(ar(e.x,e.y)),maxCost:Number.isFinite(n)?n:Number.MAX_VALUE});return new Map([...i].map(([e,t])=>[e,t.cost]))}var Rq=l({BoardGrid:()=>bK,DiceCup:()=>ZK,FactionFog:()=>hq,addSkirmishUnit:()=>Tq,addTacticalUnit:()=>tq,applyBackgammonMove:()=>LK,applyCheckersMove:()=>CK,applyMove:()=>rG,applyUpkeep:()=>xq,armyIncome:()=>bq,backgammonMoves:()=>IK,bankUnit:()=>yq,bitboardFromChess:()=>KG,bitboardMoves:()=>JG,canPlaceSkirmishUnit:()=>wq,canPlaceTacticalUnit:()=>eq,checkersMoves:()=>SK,chessGame:()=>CG,chooseMove:()=>vG,cloneChess:()=>GW,createDeck:()=>zK,deal:()=>VK,dealSolitaire:()=>UK,drawSolitaire:()=>WK,endSkirmishTurn:()=>jq,endTacticalTurn:()=>sq,gameResult:()=>iG,goResult:()=>OK,goScore:()=>kK,huffDecode:()=>pK,huffEncode:()=>uK,inCheck:()=>QW,legalMoves:()=>nG,loadTablebaseEnding:()=>hK,makeMove:()=>XG,moveSkirmishUnit:()=>Dq,moveSolitaireTableau:()=>GK,moveSolitaireToFoundation:()=>KK,moveTacticalUnit:()=>rq,parseFen:()=>zW,parseUciMove:()=>AG,passGo:()=>DK,perft:()=>QG,playGo:()=>EK,positionKey:()=>RW,probeBook:()=>OG,probeTablebase:()=>vK,recall:()=>vq,recruit:()=>_q,rollBackgammonDice:()=>FK,rollDice:()=>YK,rollExpression:()=>XK,scoreDice:()=>QK,search:()=>yG,searchAsync:()=>bG,searchTourney:()=>tK,searchTourneyAsync:()=>nK,setSkirmishTerrain:()=>Cq,setTacticalOverwatch:()=>iq,shuffleDeck:()=>BK,skirmishAttack:()=>Oq,skirmishIncome:()=>Aq,skirmishMoves:()=>Eq,solitaireWon:()=>qK,sq:()=>IW,squareName:()=>LW,startingArmy:()=>gq,startingBackgammon:()=>PK,startingBitboard:()=>qG,startingCheckers:()=>xK,startingChess:()=>WW,startingGo:()=>TK,startingSkirmish:()=>Sq,startingTactics:()=>$K,tablebaseId:()=>oK,tacticalAttack:()=>oq,tacticalMoves:()=>nq,tourneyThink:()=>$G,trickWinner:()=>HK,triggerTacticalOverwatch:()=>aq,unmakeMove:()=>ZG});function zq(e){let t;try{t=RN(e)}catch(t){return console.warn(`${t.message} - "${e}" will be silent`),Bq()}return new Audio(t)}function Bq(){return{play(){},pause(){},currentTime:0,volume:1,loop:!1}}var Vq=new p,Hq=class{constructor(e,t={}){this.next=0,this.suspended_=!1,this.plays=0;let n=Math.max(1,t.poolSize??4),r=t.create??zq;this.volume=t.volume??1,this.caption=t.caption,this.pool=Array.from({length:n},()=>r(e))}play(e=1,t=1){if(this.suspended_)return;this.plays++;let n=this.pool[this.next];this.next=(this.next+1)%this.pool.length,n.volume=this.volume*e,n.playbackRate=t,n.currentTime=0,Promise.resolve(n.play()).catch(()=>{}),this.caption&&Vq.dispatch({text:this.caption})}stopAll(){for(let e of this.pool)e.pause(),e.currentTime=0}suspend(){this.suspended_=!0,this.stopAll()}resume(){this.suspended_=!1}get isSuspended(){return this.suspended_}};function Uq(e){return e.length*e.numberOfChannels*4}var Wq=class{constructor(e={}){this.entries=new Map,this.hits=0,this.misses=0,this.evictions=0,this.policy=e}async load(e,t){let n=this.entries.get(e);if(n)return this.hits++,this.entries.delete(e),this.entries.set(e,n),n.promise;this.misses++;let r={promise:t(),bytes:0};this.entries.set(e,r);try{let t=await r.promise;return t?(r.bytes=Uq(t.buffer),this.enforce(e),t):(this.entries.get(e)===r&&this.entries.delete(e),null)}catch(t){throw this.entries.get(e)===r&&this.entries.delete(e),t}}evict(e){return this.entries.delete(e)}clear(){this.entries.clear()}stats(){let e=0;for(let t of this.entries.values())e+=t.bytes;return{entries:this.entries.size,bytes:e,hits:this.hits,misses:this.misses,evictions:this.evictions}}enforce(e){let t=(this.policy.maxMegabytes??1/0)*1024*1024,n=this.policy.maxEntries??1/0;for(let r of this.entries.keys()){let{bytes:i,entries:a}=this.stats();if(i<=t&&a<=n)return;r!==e&&(this.entries.delete(r),this.evictions++)}}};function Gq(e,t){let n=new Wq(t),r=((t,r,i)=>n.load(`${t}:${r}`,()=>e(t,r,i)));return Object.defineProperty(r,"cache",{value:n,enumerable:!0}),r}function Kq(e={}){let t=e.waveform??`square`,n=e.frequency??440,r=e.duration??.15,i=e.volume??.3,a=e.decay??8,o=e.sampleRate??22050,s=e.seed??1;if(!(r>0))throw Error(`tone duration must be positive`);if(t!==`noise`&&!(n>0))throw Error(`tone frequency must be positive`);if(!(o>0))throw Error(`tone sample rate must be positive`);let c=Math.max(1,Math.round(r*o)),l=new Float32Array(c);for(let e=0;e<c;e++){let r=e/o,u=a>0?Math.exp(-a*e/c):1,d=2*Math.PI*n*r;l[e]=i*u*Yq(t,d,s,e)}return Zq(l,o)}function qq(e={},t=e=>new Audio(e)){let n=t(Kq(e));return Promise.resolve(n.play()).catch(()=>{}),n}function Jq(e={},t={}){return new Hq(Kq(e),t)}function Yq(e,t,n,r){switch(e){case`sine`:return Math.sin(t);case`square`:return Math.sin(t)>=0?1:-1;case`sawtooth`:{let e=t/(2*Math.PI);return 2*(e-Math.floor(e))-1}case`triangle`:{let e=t/(2*Math.PI),n=e-Math.floor(e);return 4*Math.abs(n-.5)-1}case`noise`:return Xq(n,r)}}function Xq(e,t){let n=Math.imul(e^t,2654435761)>>>0;return n=Math.imul(n^n>>>15,2246822519)>>>0,n=Math.imul(n^n>>>13,3266489917)>>>0,n^=n>>>16,(n>>>0)/4294967295*2-1}function Zq(e,t){let n=e.length*2,r=new ArrayBuffer(44+n),i=new DataView(r);Qq(i,0,`RIFF`),i.setUint32(4,36+n,!0),Qq(i,8,`WAVE`),Qq(i,12,`fmt `),i.setUint32(16,16,!0),i.setUint16(20,1,!0),i.setUint16(22,1,!0),i.setUint32(24,t,!0),i.setUint32(28,t*2,!0),i.setUint16(32,2,!0),i.setUint16(34,16,!0),Qq(i,36,`data`),i.setUint32(40,n,!0);let a=44;for(let t of e){let e=Math.max(-1,Math.min(1,t));i.setInt16(a,Math.round(e*(e<0?32768:32767)),!0),a+=2}let o=``,s=new Uint8Array(r);for(let e of s)o+=String.fromCharCode(e);return`data:audio/wav;base64,${btoa(o)}`}function Qq(e,t,n){for(let r=0;r<n.length;r++)e.setUint8(t+r,n.charCodeAt(r))}function $q(e,t){let[n,r]=e,i=n*4*nJ[t]/r;if(!Number.isInteger(i)||i<1)throw Error(`a ${t} grid does not cut a ${n}/${r} bar into whole slots (it needs ${i})`);return i}function eJ(e,t){return e/nJ[t]}function tJ(e){if(typeof e!=`object`||!e)throw Error(`a groove template must be an object`);let{name:t,timeSignature:n,ppq:r,tempoBpm:i,subdivision:a,offsets:o}=e;if(typeof t!=`string`||t.length===0)throw Error(`a groove template needs a non-empty name`);if(!Array.isArray(n)||n.length!==2)throw Error(`groove template "${t}": timeSignature must be [beats, beatValue]`);let[s,c]=n;if(!Number.isInteger(s)||s<1)throw Error(`groove template "${t}": time signature numerator must be a positive integer, got ${String(s)}`);if(!Number.isInteger(c)||c<1||c&c-1)throw Error(`groove template "${t}": time signature denominator must be a power of two, got ${String(c)}`);if(!Number.isInteger(r)||r<1)throw Error(`groove template "${t}": ppq must be a positive integer, got ${String(r)}`);if(!Number.isFinite(i)||i<=0)throw Error(`groove template "${t}": tempoBpm must be greater than 0, got ${String(i)}`);if(a!==`8n`&&a!==`16n`&&a!==`32n`)throw Error(`groove template "${t}": subdivision must be 8n, 16n or 32n, got ${String(a)}`);let l=eJ(r,a);if(!Number.isInteger(l)||l<1)throw Error(`groove template "${t}": ${r} ppq does not cut into whole ${a} ticks (it needs ${String(l)})`);let u=$q(n,a);if(!Array.isArray(o)||o.length!==u)throw Error(`groove template "${t}": a ${a} grid in ${s}/${c} has ${u} slots, this carries ${Array.isArray(o)?o.length:String(o)}`);o.forEach((e,n)=>{if(typeof e!=`object`||!e)throw Error(`groove template "${t}": slot ${n} must be an object`);if(e.subdivisionIndex!==n)throw Error(`groove template "${t}": slots must run in order, slot ${n} carries ${String(e.subdivisionIndex)}`);if(!Number.isInteger(e.timeOffsetTicks))throw Error(`groove template "${t}": slot ${n} has a fractional timeOffsetTicks (${String(e.timeOffsetTicks)}); ticks are whole numbers`);if(!Number.isFinite(e.velocityFactor)||e.velocityFactor<0)throw Error(`groove template "${t}": slot ${n} has velocityFactor ${String(e.velocityFactor)}, which must be a finite number of at least 0`)})}var nJ,rJ=s((()=>{nJ={"8n":2,"16n":4,"32n":8}}));function iJ(e){let t=e.intensity;if(!Number.isFinite(t)||t<0||t>1)throw Error(`humanization intensity must be between 0 and 1, got ${String(e.intensity)}`);let n=e.timingVarianceMs??CJ;if(!Number.isFinite(n)||n<0)throw Error(`timingVarianceMs must be a finite number of at least 0, got ${String(e.timingVarianceMs)}`);let r=e.velocityVariance??wJ;if(!Number.isFinite(r)||r<0)throw Error(`velocityVariance must be a finite number of at least 0, got ${String(e.velocityVariance)}`);let i=e.style?TJ[e.style]:EJ,a=e.grooveTemplate??null;return a&&tJ(a),{intensity:t,timingMs:n,velocityVariance:r,timingScale:i.timing,velocityScale:i.velocity,template:a,warn:e.onWarn??(e=>console.warn(e))}}function aJ(e){let t=[];for(let n of e)n.type===`tempo`&&t.push({tick:n.tick,microsecondsPerQuarter:n.microsecondsPerQuarter});t.sort((e,t)=>e.tick-t.tick);let n=[{tick:0,microsecondsPerQuarter:5e5}];for(let e of t)e.tick===n[n.length-1].tick?n[n.length-1]=e:n.push(e);return n}function oJ(e,t){let n=0,r=e.length-1,i=0;for(;n<=r;){let a=n+r>>1;e[a].tick<=t?(i=a,n=a+1):r=a-1}return 6e7/e[i].microsecondsPerQuarter}function sJ(e,t,n){return e*t*n/6e4}function cJ(e,t,n){return e*6e4/(t*n)}function lJ(e){let t=null;return()=>{if(t!==null){let e=t;return t=null,e}let n=Math.sqrt(-2*Math.log(1-e.float())),r=2*Math.PI*e.float();return t=n*Math.sin(r),n*Math.cos(r)}}function uJ(e){let t=new Uint8Array(256);for(let e=0;e<256;e++)t[e]=e;for(let n=255;n>0;n--){let r=e.int(n+1),i=t[n];t[n]=t[r],t[r]=i}let n=(e,t)=>e&1?t:-t;return e=>{let r=Math.floor(e),i=e-r,a=i*i*i*(i*(i*6-15)+10),o=n(t[r&255],i);return o+a*(n(t[r+1&255],i-1)-o)}}function dJ(e){let t=new Map;for(let n of e.offsets)t.set(n.subdivisionIndex,{ms:cJ(n.timeOffsetTicks,e.ppq,e.tempoBpm),factor:n.velocityFactor});return t}function fJ(e){let t=new Uint8Array(e.length),n=new Map;for(let t=0;t<e.length;t++){let r=e[t];if(r.type!==`noteOn`||r.channel===bJ)continue;let i=n.get(r.channel);i?i.push({index:t,note:r.note}):n.set(r.channel,[{index:t,note:r.note}])}for(let e of n.values())for(let n=1;n<e.length-1;n++)e[n].note>e[n-1].note&&e[n].note>e[n+1].note&&(t[e[n].index]=1);return t}function pJ(e){return e.channel===bJ?xJ.includes(e.note):e.note<SJ}function mJ(e,t,n){let r=iJ(t),i=new j(t.seed),a=lJ(i),o=uJ(i),s=e.ticksPerQuarter,c=aJ(e.events),l=r.template?dJ(r.template):null,u=r.template?eJ(s,r.template.subdivision):0,d=r.template?$q(r.template.timeSignature,r.template.subdivision):0,f=n===`groove`?fJ(e.events):null,p=[],m=new Map,h=!1;for(let t=0;t<e.events.length;t++){let i=e.events[t];if(i.type===`noteOff`){let e=m.get(DJ(i)),t=e&&e.length>0?e.shift():0;p.push(t===0?{...i}:{...i,tick:i.tick+t});continue}if(i.type!==`noteOn`){p.push({...i});continue}let g=oJ(c,i.tick);r.template&&!h&&Math.abs(g-r.template.tempoBpm)>vJ&&(h=!0,r.warn(`groove template "${r.template.name}" is written at ${r.template.tempoBpm} BPM but this file is at ${g.toFixed(1)} BPM by tick ${i.tick}: its offsets are rescaled to keep the same timing in milliseconds`));let _=sJ(r.timingMs*r.timingScale,s,g),v=a()*_+o(i.tick/s*hJ)*_*gJ;if(n===`groove`&&pJ(i)){let e=sJ(yJ,s,g);v=Math.min(e,Math.max(-e,v))}let y;l&&(y=l.get(Math.floor(i.tick/u)%d));let b=Math.round(r.intensity*((y?sJ(y.ms,s,g):0)+v));i.tick+b<0&&(b=-i.tick);let x=Math.round(i.velocity*(1+r.intensity*((y?y.factor:1)-1))+r.intensity*a()*r.velocityVariance*r.velocityScale);f&&f[t]===1&&(x=Math.round(x*(1+r.intensity*_J))),x=Math.min(127,Math.max(1,x));let S=DJ(i),C=m.get(S);C?C.push(b):m.set(S,[b]),p.push({...i,tick:i.tick+b,velocity:x})}return p.sort((e,t)=>e.tick-t.tick),{ticksPerQuarter:s,events:p,loopStartTick:e.loopStartTick}}var hJ,gJ,_J,vJ,yJ,bJ,xJ,SJ,CJ,wJ,TJ,EJ,DJ,OJ=s((()=>{_e(),rJ(),hJ=.25,gJ=.5,_J=.15,vJ=1,yJ=5,bJ=9,xJ=[35,36],SJ=48,CJ=8,wJ=10,TJ={jazz:{timing:1.3,velocity:1.1},rock:{timing:.8,velocity:1.2},classical:{timing:.6,velocity:1.4},funk:{timing:1,velocity:1.3}},EJ={timing:1,velocity:1},DJ=e=>`${e.channel}:${e.note}`})),kJ=l({LiteHumanizer:()=>AJ}),AJ,jJ=s((()=>{OJ(),AJ=class{constructor(){this.tierName=`lite`,this.approximateSizeMb=.05}async initialize(){}async process(e,t){if(t.grooveTemplate)throw Error(`the lite tier applies no groove grid: ask HumanizerFactory for "groove" when a template is in play`);return mJ(e,t,`lite`)}}})),MJ=l({GrooveHumanizer:()=>NJ}),NJ,PJ=s((()=>{OJ(),NJ=class{constructor(){this.tierName=`groove`,this.approximateSizeMb=.5}async initialize(){}async process(e,t){return mJ(e,t,`groove`)}}})),FJ=class e{static async create(t){let n=await e.load(t);return await n.initialize(),n}static async load(e){switch(e){case`lite`:return new(await(Promise.resolve().then(()=>(jJ(),kJ)))).LiteHumanizer;case`groove`:return new(await(Promise.resolve().then(()=>(PJ(),MJ)))).GrooveHumanizer;case`magenta`:throw Error(`the 'magenta' tier is not shipped: it needs @magenta/music and a PerformanceRNN checkpoint, and neither can be fetched from a file:// build`);default:throw Error(`unknown humanizer tier: ${String(e)}`)}}};async function IJ(e,t){let{tier:n,...r}=t,i=n??(r.grooveTemplate?`groove`:`lite`);return(await FJ.create(i)).process(e,r)}var LJ=5e5,RJ=111;function zJ(e){let t=e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength),n=new DataView(t.buffer,t.byteOffset,t.byteLength),r=0,i=e=>{let n=``;for(let i=0;i<e;i++)n+=String.fromCharCode(t[r+i]);return r+=e,n},a=()=>{let e=n.getUint32(r,!1);return r+=4,e},o=()=>{let e=n.getUint16(r,!1);return r+=2,e},s=()=>{let e=0;for(;;){let n=t[r++];if(e=e<<7|n&127,!(n&128))return e}};if(i(4)!==`MThd`||a()!==6)throw Error(`invalid MIDI header chunk`);let c=o(),l=o(),u=o();if(c!==0&&c!==1)throw Error(`unsupported MIDI format ${c}`);if(u&32768)throw Error(`SMPTE-based MIDI timing is not supported`);let d=u,f=[],p=null;for(let e=0;e<l;e++){let e=i(4),n=a();if(e!==`MTrk`){r+=n;continue}let o=r+n,c=0,l=0;for(;r<o;){c+=s();let e=t[r];if(e<128?e=l:(r++,e<240&&(l=e)),e===255){let e=t[r++],n=s();if(e===81&&n===3){let e=t[r]<<16|t[r+1]<<8|t[r+2];f.push({tick:c,type:`tempo`,microsecondsPerQuarter:e})}r+=n}else if(e===240||e===247)r+=s();else{let n=e&240,i=e&15;if(n===128||n===144){let e=t[r++],a=t[r++],o=n===144&&a>0;f.push({tick:c,type:o?`noteOn`:`noteOff`,note:e,velocity:a,channel:i})}else if(n===176){let e=t[r++],n=t[r++];f.push({tick:c,type:`control`,channel:i,controller:e,value:n}),e===RJ&&p===null&&(p=c)}else if(n===192){let e=t[r++];f.push({tick:c,type:`program`,channel:i,program:e})}else if(n===224){let e=t[r++],n=t[r++];f.push({tick:c,type:`pitchBend`,channel:i,value:(n<<7|e)-8192})}else if(n===160||n===208)r+=n===160?2:1;else throw Error(`unsupported MIDI status byte 0x${e.toString(16)}`)}}}return f.sort((e,t)=>e.tick-t.tick),{ticksPerQuarter:d,events:f,loopStartTick:p}}var BJ=2;function VJ(e){let t=[{tick:0,time:0,microsecondsPerQuarter:LJ}];for(let n of e.events){if(n.type!==`tempo`)continue;let r=t[t.length-1];t.push({tick:n.tick,time:r.time+(n.tick-r.tick)*r.microsecondsPerQuarter/e.ticksPerQuarter/1e6,microsecondsPerQuarter:n.microsecondsPerQuarter})}return t}function HJ(e,t,n){let r=e[0];for(let t of e)if(t.tick<=n)r=t;else break;return r.time+(n-r.tick)*r.microsecondsPerQuarter/t/1e6}function UJ(e){return e.loopStartTick===null?null:HJ(VJ(e),e.ticksPerQuarter,e.loopStartTick)}function WJ(e){let t=VJ(e),n=Array.from({length:16},()=>({program:0,bank:0,volume:100,expression:127,pan:64,bend:0})),r=e=>{let t=n[e]??n[0];return{program:t.program,bank:t.bank,gain:t.volume/127*(t.expression/127),pan:(t.pan-64)/64,...t.bend?{bend:t.bend}:{}}},i=[],a=new Map;for(let o of e.events){if(o.type===`tempo`)continue;if(o.type===`pitchBend`){(n[o.channel]??n[0]).bend=o.value/8192*BJ;continue}if(o.type===`program`){(n[o.channel]??n[0]).program=o.program;continue}if(o.type===`control`){let e=n[o.channel]??n[0];o.controller===0?e.bank=o.value:o.controller===7?e.volume=o.value:o.controller===10?e.pan=o.value:o.controller===11&&(e.expression=o.value);continue}let s=HJ(t,e.ticksPerQuarter,o.tick),c=`${o.channel}:${o.note}`;if(o.type===`noteOn`)a.set(c,{time:s,velocity:o.velocity,voice:r(o.channel)});else{let e=a.get(c);e&&(i.push({time:e.time,duration:Math.max(.01,s-e.time),note:o.note,velocity:e.velocity,channel:o.channel,...e.voice}),a.delete(c))}}for(let[e,t]of a){let[n,r]=e.split(`:`).map(Number);i.push({time:t.time,duration:.3,note:r,velocity:t.velocity,channel:n,...t.voice})}return i.sort((e,t)=>e.time-t.time)}function GJ(e){let t=VJ(e),n=[];for(let r of e.events){if(r.type===`tempo`)continue;let i=HJ(t,e.ticksPerQuarter,r.tick),a=r.channel&15;switch(r.type){case`noteOn`:n.push({time:i,status:144|a,data1:r.note,data2:r.velocity});break;case`noteOff`:n.push({time:i,status:128|a,data1:r.note,data2:r.velocity});break;case`program`:n.push({time:i,status:192|a,data1:r.program,data2:0});break;case`control`:n.push({time:i,status:176|a,data1:r.controller,data2:r.value});break;case`pitchBend`:{let e=r.value+8192;n.push({time:i,status:224|a,data1:e&127,data2:e>>7&127});break}}}return n}function KJ(e){return 440*2**((e-69)/12)}var qJ=class e{constructor(e,t={}){this.messages=[],this.elapsed=0,this.index=0,this.playing=!1,this.notes=WJ(e),this.playFn=t.play??qq,this.waveform=t.waveform??`square`,this.volume=t.volume??.2,t.synth&&(this.synth=t.synth,this.messages=GJ(e))}static async create(t,n={}){return new e(n.humanize?await IJ(t,n.humanize):t,n)}play(){this.playing=this.index<(this.synth?this.messages:this.notes).length}pause(){this.playing=!1,this.silenceSynth()}stop(){this.playing=!1,this.elapsed=0,this.index=0,this.synth?.reset()}update(e){if(this.playing){if(this.elapsed+=e,this.synth){for(;this.index<this.messages.length&&this.messages[this.index].time<=this.elapsed;){let{status:e,data1:t,data2:n}=this.messages[this.index++];this.synth.event(e,t,n)}this.index>=this.messages.length&&(this.playing=!1)}else{for(;this.index<this.notes.length&&this.notes[this.index].time<=this.elapsed;){let e=this.notes[this.index];this.playFn({waveform:this.waveform,frequency:KJ(e.note),duration:e.duration,volume:this.volume*(e.velocity/127)}),this.index++}this.index>=this.notes.length&&(this.playing=!1)}}}get isPlaying(){return this.playing}silenceSynth(){if(this.synth)for(let e=0;e<16;e++)this.synth.event(176|e,123,0)}get duration(){if(this.synth)return this.messages.at(-1)?.time??0;let e=this.notes.at(-1);return e?e.time+e.duration:0}},JJ=8e3,YJ=96e3;function XJ(e){let t=new Int16Array(e.length);for(let n=0;n<e.length;n++)t[n]=Math.round(Math.max(-1,Math.min(1,e[n]))*32767);return t}function ZJ(e,t,n,r){let i=Math.max(1,Math.round(e.length*n/t));if(i>r)throw Error(`a decoded sample is longer than a SoundFont sample may be`);let a=new Float32Array(i);for(let r=0;r<a.length;r++){let i=r*t/n,o=Math.floor(i),s=Math.min(o+1,e.length-1);a[r]=e[o]+(e[s]-e[o])*(i-o)}return a}function QJ(e){if(typeof OfflineAudioContext>`u`)throw Error(`no OfflineAudioContext here: pass a decoder of your own to decode a SoundFont 3`);return new OfflineAudioContext(1,1,e)}function $J(e=QJ,t={}){let n=t.sampleFrames??16777216;return async(t,r)=>{if(!(r>=400&&r<=2e5))throw Error(`a sample rate of ${r} Hz is not one a SoundFont can state`);let i=Math.max(JJ,Math.min(YJ,r)),a=t.slice().buffer,o=await e(i).decodeAudioData(a);if(o.length>n)throw Error(`a decoded sample is longer than a SoundFont sample may be`);let s=o.getChannelData(0);return XJ(o.sampleRate===r?s:ZJ(s,o.sampleRate,r,n))}}var eY={keyRange:43,velRange:44,instrument:41,sampleId:53,rootKey:58,coarseTune:51,fineTune:52,sampleModes:54,attenuation:48,pan:17,attack:34,hold:35,decay:36,sustain:37,release:38};function tY(e){return 2**(e/1200)}function nY(e){return e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}function rY(e,t){let n=``;for(let r=0;r<20;r++){let i=e[t+r];if(i===0)break;n+=String.fromCharCode(i)}return n}function iY(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength),n=t=>String.fromCharCode(e[t],e[t+1],e[t+2],e[t+3]);if(n(0)!==`RIFF`||n(8)!==`sfbk`)throw Error(`not a SoundFont 2 file`);let r=new Map,i=new Map,a=(e,o)=>{let s=e;for(;s+8<=o;){let e=n(s),o=t.getUint32(s+4,!0);e===`LIST`?(i.set(n(s+8),{at:s,size:o}),a(s+12,s+8+o)):r.set(e,{at:s+8,size:o}),s+=8+o+(o&1)}};a(12,e.length);for(let e of[`phdr`,`pbag`,`pgen`,`inst`,`ibag`,`igen`,`shdr`,`smpl`])if(!r.has(e))throw Error(`SoundFont is missing "${e}"`);let o=(e,t,n)=>{let i=r.get(e),a=[];for(let e=i.at;e+t<=i.at+i.size;e+=t)a.push(n(e));return a},s=n=>o(n,4,n=>({oper:t.getUint16(n,!0),lo:e[n+2],hi:e[n+3],amount:t.getInt16(n+2,!0)})),c=e=>o(e,4,e=>t.getUint16(e,!0)),l=o(`phdr`,38,n=>({name:rY(e,n),preset:t.getUint16(n+20,!0),bank:t.getUint16(n+22,!0),bag:t.getUint16(n+24,!0)})),u=o(`inst`,22,n=>({name:rY(e,n),bag:t.getUint16(n+20,!0)})),d=o(`shdr`,46,n=>({name:rY(e,n),start:t.getUint32(n+20,!0),end:t.getUint32(n+24,!0),loopStart:t.getUint32(n+28,!0),loopEnd:t.getUint32(n+32,!0),rate:t.getUint32(n+36,!0),rootKey:e[n+40],correction:t.getInt8(n+41),link:t.getUint16(n+42,!0),type:t.getUint16(n+44,!0)})),f=r.get(`smpl`),p=e.slice(f.at,f.at+f.size),m=d.filter(e=>e.end>e.start&&!(e.type&32768)),h=m.some(e=>e.type&16);if(h&&!m.every(e=>e.type&16))throw Error(`SoundFont mixes compressed and plain samples, which it cannot address consistently`);let g=h?p.length:p.length>>1;if(m.some(e=>e.end>g))throw Error(`a sample points outside the sample data: the SoundFont is damaged`);let _=h?new Int16Array:new Int16Array(p.buffer,0,p.length>>1),v=i.get(`INFO`)??null;return{bytes:e,presets:l,presetBags:c(`pbag`),presetGens:s(`pgen`),instruments:u,instBags:c(`ibag`),instGens:s(`igen`),samples:d,smplBytes:p,smpl:_,compressed:h,info:v?e.slice(v.at,v.at+8+v.size+(v.size&1)):null}}function aY(e,t,n){return t.slice(e[n],e[n+1]??t.length)}function oY(e,t,n,r,i){let a=e[r].bag,o=e[r+1]?.bag??t.length-1,s=[],c=null;for(let e=a;e<o;e++){let r=aY(t,n,e),o=new Map;for(let e of r)o.set(e.oper,e);o.has(i)?s.push({gens:o,global:c}):e===a&&(c=o)}return s}function sY(e,t){return e.gens.get(t)??e.global?.get(t)??null}function cY(e,t,n,r=`piano`){return e.get(`${t}:${n}`)??(t===128?e.get(`128:0`):e.get(`0:${n}`))??(r===`piano`?e.get(`0:0`):void 0)}function lY(e,t={}){let n=iY(nY(e));if(n.compressed)throw Error(`SoundFont 3 (Ogg Vorbis samples) needs decoding first: use loadSoundFont() or decodeSoundFont(), or convert it with "mwg-soundfonts convert <in.sf3> <out.sf2>"`);let r=new Map,i=new Map,a=e=>{if(r.has(e))return r.get(e);let t=n.samples[e];if(!t||t.end<=t.start||t.type&32768)return r.set(e,null),null;let a=new Float32Array(t.end-t.start);for(let e=0;e<a.length;e++)a[e]=n.smpl[t.start+e]/32768;let o={data:a,rate:t.rate||22050,loopStart:t.loopStart-t.start,loopEnd:t.loopEnd-t.start};return r.set(e,o),i.set(e,{rootKey:t.rootKey===255?60:t.rootKey,correction:t.correction}),o},o=new Map;for(let e=0;e<n.presets.length-1;e++)o.set(`${n.presets[e].bank}:${n.presets[e].preset}`,e);function s(e,r,s,c){let l=cY(o,e,r,t.missingProgram);if(l===void 0)return[];let u=[],d=(e,t,n)=>{let r=sY(e,t);return!r||n>=r.lo&&n<=r.hi};for(let e of oY(n.presets,n.presetBags,n.presetGens,l,eY.instrument)){if(!d(e,eY.keyRange,s)||!d(e,eY.velRange,c))continue;let t=sY(e,eY.instrument).amount;if(n.instruments[t+1])for(let r of oY(n.instruments,n.instBags,n.instGens,t,eY.sampleId)){if(!d(r,eY.keyRange,s)||!d(r,eY.velRange,c))continue;let t=sY(r,eY.sampleId).amount,n=a(t);if(!n)continue;let o=(t,n=0)=>(sY(r,t)?.amount??n)+(sY(e,t)?.amount??0),l=sY(r,eY.rootKey)?.amount,f=sY(r,eY.sampleModes)?.amount??0,p=i.get(t);u.push({sample:n,rootKey:l!==void 0&&l>=0?l:p.rootKey,cents:o(eY.coarseTune)*100+o(eY.fineTune)+p.correction,loop:(f&3)==1||(f&3)==3,gain:10**(-Math.max(0,o(eY.attenuation))/200),pan:Math.max(-1,Math.min(1,o(eY.pan)/500)),attack:tY(o(eY.attack,-12e3)),hold:tY(o(eY.hold,-12e3)),decay:tY(o(eY.decay,-12e3)),sustain:10**(-Math.max(0,o(eY.sustain))/200),release:tY(o(eY.release,-12e3))})}}return u}return{voices:s,hasPreset:(e,t)=>o.has(`${e}:${t}`)||o.has(`0:${t}`),presetCount:o.size}}function uY(e){let t=new Set,n=[];for(let r of e)for(let e of WJ(r)){let r=e.channel===9?128:e.bank,i=`${r}:${e.program}`;t.has(i)||(t.add(i),n.push({bank:r,program:e.program}))}return n}function dY(e,t){let n=new Set(iY(nY(e)).presets.slice(0,-1).map(e=>`${e.bank}:${e.preset}`)),r=new Set,i=[];for(let{bank:e,program:a}of t){let t=`${e}:${a}`;r.has(t)||(r.add(t),!(n.has(t)||e!==128&&n.has(`0:${a}`))&&i.push({bank:e,program:a}))}return i}function fY(e){return[e&255,e>>8&255]}function pY(e){return[e&255,e>>8&255,e>>16&255,e>>24&255]}function mY(e){let t=[...e].map(e=>e.charCodeAt(0)&255).slice(0,20);return[...t,...Array(20-t.length).fill(0)]}function hY(e){return[...e].map(e=>e.charCodeAt(0))}function gY(e,t){let n=new Uint8Array(8+t.length+(t.length&1));return n.set(hY(e),0),new DataView(n.buffer).setUint32(4,t.length,!0),n.set(t,8),n}function _Y(e){let t=0;for(let n of e)t+=n.length;let n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.length;return n}function vY(e,t){let n=_Y([new Uint8Array(hY(e)),...t]);return _Y([new Uint8Array(hY(`LIST`)),new Uint8Array(pY(n.length)),n])}function yY(e){if(e.length===0)throw Error(`mergeSoundFonts needs at least one SoundFont`);let t=e.map(e=>iY(nY(e))),n=t[0].compressed;if(t.some(e=>e.compressed!==n))throw Error(`cannot merge a SoundFont 3 with a SoundFont 2: decode it first with decodeSoundFont()`);let r={bytes:new Uint8Array,presets:[],presetBags:[],presetGens:[],instruments:[],instBags:[],instGens:[],samples:[],smplBytes:new Uint8Array,smpl:new Int16Array,compressed:n,info:t[0].info},i=[],a=0;for(let e of t){let t=r.instruments.length,o=r.samples.length,s=r.presetBags.length,c=r.presetGens.length,l=r.instBags.length,u=r.instGens.length,d=n?a:a>>1;r.presets.push(...e.presets.slice(0,-1).map(e=>({...e,bag:e.bag+s}))),r.presetBags.push(...e.presetBags.slice(0,-1).map(e=>e+c)),r.presetGens.push(...e.presetGens.slice(0,e.presetBags[e.presetBags.length-1]).map(e=>e.oper===eY.instrument?{...e,amount:e.amount+t}:e)),r.instruments.push(...e.instruments.slice(0,-1).map(e=>({...e,bag:e.bag+l}))),r.instBags.push(...e.instBags.slice(0,-1).map(e=>e+u)),r.instGens.push(...e.instGens.slice(0,e.instBags[e.instBags.length-1]).map(e=>e.oper===eY.sampleId?{...e,amount:e.amount+o}:e)),r.samples.push(...e.samples.slice(0,-1).map(e=>({...e,start:e.start+d,end:e.end+d,loopStart:n?e.loopStart:e.loopStart+d,loopEnd:n?e.loopEnd:e.loopEnd+d,link:e.link+o})));let f=n?e.smplBytes:e.smplBytes.subarray(0,e.smplBytes.length&-2);i.push(f),a+=f.length}return r.presetBags.push(r.presetGens.length),r.instBags.push(r.instGens.length),r.presets.push({name:`EOS`,preset:0,bank:0,bag:r.presetBags.length-1}),r.instruments.push({name:`EOS`,bag:r.instBags.length-1}),r.samples.push({name:`EOS`,start:0,end:0,loopStart:0,loopEnd:0,rate:0,rootKey:0,correction:0,link:0,type:0}),r.smplBytes=_Y(i),n||(r.smpl=new Int16Array(r.smplBytes.slice().buffer)),wY(r,bY(r))}function bY(e){let t=new Set,n=[];for(let r=0;r<e.presets.length-1;r++){let i=`${e.presets[r].bank}:${e.presets[r].preset}`;t.has(i)||(t.add(i),n.push(r))}return n}async function xY(e,t,n={}){let r=n.sampleFrames??16777216,i=n.totalFrames??134217728,a=nY(e),o=iY(a);if(!o.compressed)return a.slice().buffer;let s=iY(new Uint8Array(wY(o,bY(o)))),c=[],l=new Map,u=0,d=[];for(let e of s.samples){if(!(e.end>e.start)||e.type&32768){d.push(e);continue}let n=`${e.start}:${e.end}`,a=l.get(n);if(!a){if(!(e.rate>=400&&e.rate<=2e5))throw Error(`a sample states ${e.rate} Hz, which no SoundFont does: the font is damaged`);let o=await t(s.smplBytes.subarray(e.start,e.end),e.rate);if(o.length>r||u+o.length>i)throw Error("the decoded sample data is larger than the limits allow: subset the font, or raise `limits`");a={start:u,length:o.length},l.set(n,a),c.push(o),u+=o.length}d.push({...e,start:a.start,end:a.start+a.length,loopStart:a.start+Math.min(e.loopStart,a.length),loopEnd:a.start+Math.min(e.loopEnd,a.length),type:e.type&-17})}let f=new Int16Array(u),p=0;for(let e of c)f.set(e,p),p+=e.length;let m={...s,samples:d,smpl:f,smplBytes:new Uint8Array(f.buffer),compressed:!1};return wY(m,bY(m))}async function SY(e,t={}){return lY(await xY(e,t.decode??$J(void 0,t.limits),t.limits),t)}function CY(e,t){let n=iY(nY(e)),r=new Map;for(let e=0;e<n.presets.length-1;e++)r.set(`${n.presets[e].bank}:${n.presets[e].preset}`,e);let i=new Set,a=[];for(let{bank:e,program:n}of t){let t=cY(r,e,n);t!==void 0&&!i.has(t)&&(i.add(t),a.push(t))}return a.sort((e,t)=>e-t),wY(n,a)}function wY(e,t){let n=t=>{let n=e.samples[t];return!!n&&n.end>n.start&&!(n.type&32768)},r=(e,t,n)=>e.map(e=>e.oper===t?{oper:t,lo:n.get(e.amount)&255,hi:n.get(e.amount)>>8&255,amount:n.get(e.amount)}:e),i=[],a=new Map;{let n=new Set;for(let r of t){let t=e.presets[r].bag,a=e.presets[r+1]?.bag??e.presetBags.length-1;for(let r=t;r<a;r++){let t=aY(e.presetBags,e.presetGens,r);if(!t.some(e=>e.oper===eY.instrument))continue;let a=t.find(e=>e.oper===eY.instrument).amount;e.instruments[a+1]&&(n.has(a)||(n.add(a),i.push(a)))}}}let o=new Map(i.map((e,t)=>[e,t]));for(let t of i){let r=e.instruments[t].bag,i=e.instruments[t+1]?.bag??e.instBags.length-1,o=[];for(let t=r;t<i;t++){let r=aY(e.instBags,e.instGens,t);if(!r.some(e=>e.oper===eY.sampleId))continue;let i=r.find(e=>e.oper===eY.sampleId).amount;n(i)&&o.push(r)}a.set(t,o)}let s=[];{let t=new Set,r=i=>{if(t.has(i)||!n(i))return;t.add(i),s.push(i);let a=e.samples[i].link;a!==i&&r(a)};for(let e of i)for(let t of a.get(e))r(t.find(e=>e.oper===eY.sampleId).amount)}let c=new Map(s.map((e,t)=>[e,t])),l=e=>[...fY(e.oper),e.lo,e.hi],u=e=>[...fY(e),...fY(0)],d=[],f=[],p=[];for(let n of t){let t=e.presets[n],i=d.length,a=t.bag,s=e.presets[n+1]?.bag??e.presetBags.length-1;for(let t=a;t<s;t++){let n=aY(e.presetBags,e.presetGens,t);(t===a&&!n.some(e=>e.oper===eY.instrument)||n.some(e=>e.oper===eY.instrument))&&(d.push(f.length),f.push(...r(n,eY.instrument,o)))}p.push({name:t.name,preset:t.preset,bank:t.bank,bag:i})}d.push(f.length);let m=[],h=[],g=[];for(let t of i){let n=m.length,i=a.get(t),o=e.instruments[t].bag,s=e.instruments[t+1]?.bag??e.instBags.length-1;for(let t=o;t<s;t++){let n=aY(e.instBags,e.instGens,t);t===o&&!n.some(e=>e.oper===eY.sampleId)&&(m.push(h.length),h.push(...n))}for(let e of i)m.push(h.length),h.push(...r(e,eY.sampleId,c));g.push({name:e.instruments[t].name,bag:n})}m.push(h.length);let _=[],v=[];for(let t of s){let n=e.samples[t],r=c.get(t);if(e.compressed){let t=v.length;for(let t=n.start;t<n.end;t++)v.push(e.smplBytes[t]);_.push({...n,start:t,end:t+(n.end-n.start),link:c.get(n.link)??r});continue}let i=v.length/2;for(let t=n.start;t<n.end;t++){let n=e.smpl[t];v.push(n&255,n>>8&255)}_.push({...n,start:i,end:i+(n.end-n.start),loopStart:i+(n.loopStart-n.start),loopEnd:i+(n.loopEnd-n.start),link:c.get(n.link)??r})}let y=e=>[...mY(e.name),...fY(e.preset),...fY(e.bank),...fY(e.bag),...Array(12).fill(0)],b=e.presets[e.presets.length-1],x=gY(`phdr`,[...p.flatMap(y),...y({name:b?.name??`EOS`,preset:0,bank:0,bag:d.length-1})]),S=gY(`pbag`,d.flatMap(u)),C=gY(`pgen`,f.flatMap(l)),ee=gY(`pmod`,Array(10).fill(0)),w=e=>[...mY(e.name),...fY(e.bag)],T=e.instruments[e.instruments.length-1],E=gY(`inst`,[...g.flatMap(w),...w({name:T?.name??`EOS`,bag:m.length-1})]),te=gY(`ibag`,m.flatMap(u)),D=gY(`igen`,h.flatMap(l)),O=gY(`imod`,Array(10).fill(0)),ne=e=>[...mY(e.name),...pY(e.start),...pY(e.end),...pY(e.loopStart),...pY(e.loopEnd),...pY(e.rate),e.rootKey,e.correction&255,...fY(e.link),...fY(e.type)],k={name:``,start:0,end:0,loopStart:0,loopEnd:0,rate:0,rootKey:0,correction:0,link:0,type:0},A=gY(`shdr`,[..._.flatMap(ne),...ne(k)]),re=vY(`sdta`,[gY(`smpl`,v)]),ie=vY(`pdta`,[x,S,ee,C,E,te,O,D,A]),ae=_Y([new Uint8Array(hY(`sfbk`)),...e.info?[e.info]:[],re,ie]);return _Y([new Uint8Array(hY(`RIFF`)),new Uint8Array(pY(ae.length)),ae]).buffer}var TY=[`gm-soundfont`,`builtin`],EY=new p,DY=new Map;function OY(e,t){if(TY.includes(e))throw Error(`"${e}" is a reserved MIDI engine name`);DY.set(e,t)}function kY(e){return DY.delete(e)}function AY(){return[...TY,...DY.keys()]}function jY(e,t,n){let r=typeof e==`string`||typeof e==`function`?[e]:e,i=e=>typeof e==`string`?e:`custom`,a=``,o=`unknown`,s,c=null;for(let e of r){if(a||=i(e),typeof e==`string`&&TY.includes(e))break;let n=typeof e==`string`?DY.get(e):e;if(!n)o=`unknown`,s=`no MIDI engine named "${String(e)}" is registered`;else try{let r=n(t);if(!NY(r))throw Error(`the factory did not return a MidiSynth`);c={synth:r,name:i(e)};break}catch(e){o=`failed`,s=e instanceof Error?e.message:String(e)}}let l=c??{synth:null,name:n};return a&&l.name!==a&&MY(a,l.name,o,s),l}function MY(e,t,n,r){EY.dispatch({requested:e,used:t,reason:n,...r?{message:r}:{}})}function NY(e){let t=e;return!!t&&typeof t.event==`function`&&typeof t.render==`function`&&typeof t.reset==`function`&&typeof t.sysex==`function`&&typeof t.sampleRate==`number`&&t.sampleRate>0}var PY=1.5,FY=480,IY=1024;function LY(e,t,n={}){let r=n.tail??PY,i=n.maxDuration??FY,a=n.gain??1,o=Math.max(1,Math.floor(n.blockSize??IY));if(!(i>0))throw Error(`render max duration must be positive`);if(!(a>=0))throw Error(`render gain must not be negative`);let s=new Set(n.mutedChannels??[]),c=GJ(e).filter(e=>e.time<i&&!s.has(e.status&15));if(!c.some(e=>(e.status&240)==144&&e.data2>0))throw Error(`MIDI file has no notes`);let l=t.sampleRate,u=c.reduce((e,t)=>Math.max(e,t.time),0),d=Math.min(i,u+r),f=Math.max(1,Math.ceil(d*l)),p=new Float32Array(f),m=new Float32Array(f);t.reset();try{let e=0;for(let n of c){let r=Math.min(f,Math.floor(n.time*l));e=RY(t,p,m,e,r,o),t.event(n.status,n.data1,n.data2)}RY(t,p,m,e,f,o)}finally{t.reset()}if(a!==1)for(let e=0;e<f;e++)p[e]*=a,m[e]*=a;return{sampleRate:l,left:p,right:m,loopStart:Math.min(UJ(e)??0,Math.max(0,d-.1)),loopEnd:d,duration:d}}function RY(e,t,n,r,i,a){let o=r;for(;o<i;){let r=Math.min(a,i-o);e.render(t,n,o,r),o+=r}return o}var zY=22050,BY=.35,VY=480;function HY(e,t={}){return WY(e,t)??JY(KY(e,t))}function UY(e){return Array.from({length:16},(e,t)=>t).filter(t=>!e.includes(t))}function WY(e,t){if(!t.synth)return null;let{synth:n}=jY(t.synth,t.sampleRate??zY,t.soundfont?`gm-soundfont`:`builtin`);if(!n)return null;try{return LY(e,n,{maxDuration:t.maxDuration,mutedChannels:t.channels?UY(t.channels):void 0})}catch(e){if(e.message===`MIDI file has no notes`)throw e;return EY.dispatch({requested:`custom`,used:t.soundfont?`gm-soundfont`:`builtin`,reason:`failed`,message:e.message}),null}}async function GY(e,t={}){let n=zJ(e),r=t.soundFontBytes?lY(t.soundFontBytes,{missingProgram:t.missingProgram}):null;return WY(n,{...t,soundfont:r})||hG(JY,[KY(n,{soundfont:r,channels:t.channels,sampleRate:t.sampleRate,gain:t.gain,maxDuration:t.maxDuration})])}function KY(e,t){let n=t.sampleRate??zY,r=t.gain??BY,i=t.maxDuration??VY;if(!(n>0))throw Error(`render sample rate must be positive`);if(!(r>=0))throw Error(`render gain must not be negative`);if(!(i>0))throw Error(`render max duration must be positive`);let a=t.channels?new Set(t.channels):null,o=WJ(e).filter(e=>e.time<i&&(!a||a.has(e.channel)));if(o.length===0)throw Error(`MIDI file has no notes`);let s=t.soundfont??null,c=new Map;return{notes:o.map(e=>({...e,frequency:KJ(e.note),voices:s?qY(s,c,e):void 0})),loopStart:UJ(e),sampleRate:n,gain:r,maxDuration:i}}function qY(e,t,n){let r=n.channel===9?128:n.bank,i=`${r}:${n.program}:${n.note}:${n.velocity>>3}`,a=t.get(i);return a||(a=e.voices(r,n.program,n.note,n.velocity),t.set(i,a)),a}function JY(e){let{sampleRate:t,gain:n,maxDuration:r}=e,i=e.notes,a=i.reduce((e,t)=>Math.max(e,t.time+t.duration),0),o=Math.min(r,a+1.5),s=Math.max(1,Math.ceil(o*t)),c=new Float32Array(s),l=new Float32Array(s),u=Math.min(e.loopStart??0,Math.max(0,o-.1));function d(e){let t=(Math.max(-1,Math.min(1,e))+1)*Math.PI/4;return[Math.cos(t),Math.sin(t)]}function f(e,t,n,r,i,a,o,s){let c=i.sample.data;if(c.length===0)return;let l=2**(((r.note-i.rootKey)*100+i.cents+(r.bend??0)*100)/1200)*i.sample.rate/n;if(!(l>0))return;let u=r.time+r.duration,f=Math.max(.002,i.attack),p=f+i.hold+Math.min(i.decay,30),m=Math.max(.03,Math.min(i.release,4)),h=c.length/i.sample.rate,g=r.channel===9?Math.max(u,r.time+Math.min(2,h)):Math.max(u,r.time+f),_=g-r.time,v=a*i.gain,y=v*i.sustain,[b,x]=d(r.pan+i.pan),S=i.loop&&i.sample.loopEnd>i.sample.loopStart,C=i.sample.loopEnd-i.sample.loopStart,ee=Math.min(s,o+Math.ceil((g+m+.02-r.time)*n)),w=0;for(let a=o;a<ee;a++){let o=a/n-r.time,s;s=o<f?o/f*v:o<f+i.hold?v:o<p?v+(y-v)*((o-f-i.hold)/Math.max(1e-6,p-f-i.hold)):o<_?y:o<_+m?y*(1-(o-_)/m):0,S&&w>=i.sample.loopEnd&&(w=i.sample.loopStart+(w-i.sample.loopStart)%C);let u=Math.floor(w),d=Math.min(1,Math.max(0,w-u)),h;if(!S&&w>=c.length||u<0)h=0;else{let e=c[Math.min(u,c.length-1)];h=e+(c[Math.min(u+1,c.length-1)]-e)*d}e[a]+=h*s*b,t[a]+=h*s*x,w+=l}}function p(e){return e<8?{wave:`triangle`,attack:.005,decay:1.2,sustain:.25,release:.2,detune:0}:e<16?{wave:`sine`,attack:.003,decay:.8,sustain:.1,release:.5,detune:0}:e<24?{wave:`square`,attack:.01,decay:.1,sustain:.7,release:.08,detune:0,cutoff:2500}:e<32?{wave:`sawtooth`,attack:.004,decay:.6,sustain:.15,release:.15,detune:0,cutoff:3e3}:e<40?{wave:`triangle`,attack:.005,decay:.4,sustain:.5,release:.1,detune:0}:e<56?{wave:`sawtooth`,attack:.12,decay:.2,sustain:.8,release:.3,detune:6,cutoff:3500}:e<80?{wave:`sawtooth`,attack:.04,decay:.15,sustain:.75,release:.12,detune:0,cutoff:4500}:e<88?{wave:`square`,attack:.01,decay:.1,sustain:.8,release:.1,detune:0,cutoff:3800}:e<104?{wave:`sawtooth`,attack:.25,decay:.3,sustain:.7,release:.5,detune:8,cutoff:2200}:{wave:`triangle`,attack:.005,decay:.5,sustain:.2,release:.2,detune:0}}function m(e,t){switch(e){case`sine`:return Math.sin(t);case`square`:return Math.sin(t)>=0?1:-1;case`sawtooth`:{let e=t/(2*Math.PI);return 2*(e-Math.floor(e))-1}case`triangle`:{let e=t/(2*Math.PI);return 4*Math.abs(e-Math.floor(e)-.5)-1}}}function h(e,t,n,r,i,a){return e<t?e/t:e<t+n?1-(1-r)*((e-t)/Math.max(1e-6,n)):e<i?r:e<i+a?r*(1-(e-i)/a):0}function g(e,t){let n=Math.imul(e^t,2654435761)>>>0;return n=Math.imul(n^n>>>15,2246822519)>>>0,n=Math.imul(n^n>>>13,3266489917)>>>0,n^=n>>>16,(n>>>0)/4294967295*2-1}function _(e,t,n,r,i,a,o){if(r.channel===9){v(e,t,n,r,i,a,o);return}let s=p(r.program),c=r.frequency*2**((s.detune+(r.bend??0)*100)/1200),l=Math.max(r.duration,s.attack+.01),u=Math.max(.02,s.release),f=Math.min(o,a+Math.ceil((l+u+.02)*n)),[g,_]=d(r.pan),y=s.cutoff!==void 0,b=y?1-Math.exp(-2*Math.PI*Math.min(s.cutoff,c*8+800)/n):0,x=0,S=0,C=2*Math.PI*c/n;for(let o=a;o<f;o++){let a=o/n-r.time,c=m(s.wave,S);S+=C,x=y?x+b*(c-x):c;let d=i*h(a,s.attack,s.decay,s.sustain,l,u);e[o]+=x*d*g,t[o]+=x*d*_}}function v(e,t,n,r,i,a,o){let[s,c]=d(r.pan),l=r.note*7919+a;if(r.note===35||r.note===36||r.note<45){let l=i*1.4,u=Math.min(o,a+Math.ceil(.27*n)),d=0;for(let i=a;i<u;i++){let a=i/n-r.time,o=a<.12?150*(45/150)**(a/.12):45;d+=2*Math.PI*o/n;let u=l*(.001/l)**Math.min(1,a/.22);e[i]+=Math.sin(d)*u*s,t[i]+=Math.sin(d)*u*c}return}let u=r.note===38||r.note===40,f=u?.16:r.note>=49?.5:.06,p=i*(u?.9:.5),m=Math.min(o,a+Math.ceil((f+.02)*n));for(let i=a;i<m;i++){let o=i/n-r.time,u=p*(.001/p)**Math.min(1,o/f),d=g(l,i-a)*u;e[i]+=d*s,t[i]+=d*c}}for(let e of i){let r=Math.floor(e.time*t);if(r>=s)continue;let i=n*Math.max(.02,e.velocity/127*e.gain),a=e.voices??[];if(a.length>0)for(let n of a)f(c,l,t,e,n,i,r,s);else _(c,l,t,e,i,r,s)}return{sampleRate:t,left:c,right:l,loopStart:u,loopEnd:o,duration:o}}function YY(e,t,n={}){let r=WJ(e),i={};for(let[a,o]of Object.entries(t)){let t=new Set(o);i[a]=r.some(e=>t.has(e.channel))?HY(e,{...n,channels:o}):null}let a=Math.max(1,...Object.values(i).map(e=>e?.left.length??0)),o=Object.values(i).find(e=>e)?.sampleRate??n.sampleRate??zY,s=a/o,c=Math.min(UJ(e)??0,Math.max(0,s-.1)),l={};for(let[e,t]of Object.entries(i)){let n=new Float32Array(a),r=new Float32Array(a);t&&(n.set(t.left),r.set(t.right)),l[e]={sampleRate:o,left:n,right:r,loopStart:c,loopEnd:s,duration:s}}return l}function XY(e,t){let n=e.createBuffer(2,Math.max(1,t.left.length),t.sampleRate);return n.getChannelData(0).set(t.left),n.getChannelData(1).set(t.right),n}function ZY(e,t){if(!(t>0))throw Error(`target sample rate must be positive`);if(t===e.sampleRate)return e;let n=Math.max(1,Math.round(e.left.length*t/e.sampleRate)),r=e.sampleRate/t,i=new Float32Array(n),a=new Float32Array(n),o=e.left.length-1;for(let t=0;t<n;t++){let n=t*r,s=Math.min(o,Math.floor(n)),c=Math.min(o,s+1),l=n-s;i[t]=e.left[s]+(e.left[c]-e.left[s])*l,a[t]=e.right[s]+(e.right[c]-e.right[s])*l}return{...e,sampleRate:t,left:i,right:a}}function QY(e,t){let n=e;if(t.maxSeconds!==void 0){if(!(t.maxSeconds>0))throw Error(`budget maxSeconds must be positive`);let e=Math.max(1,Math.floor(t.maxSeconds*n.sampleRate));if(n.left.length>e){let r=n.left.slice(0,e),i=n.right.slice(0,e),a=Math.min(e,Math.floor((t.fadeSeconds??.5)*n.sampleRate));for(let t=0;t<a;t++){let n=t/a;r[e-1-t]*=n,i[e-1-t]*=n}let o=e/n.sampleRate;n=$Y({...n,left:r,right:i},o)}}if(t.mono){let e=new Float32Array(n.left.length);for(let t=0;t<e.length;t++)e[t]=(n.left[t]+n.right[t])/2;n={...n,left:e,right:e}}return t.halfRate&&(n=ZY(n,n.sampleRate/2)),n}function $Y(e,t){let n={...e};return n.duration!==void 0&&(n.duration=t),n.loopEnd!==void 0&&(n.loopEnd=Math.min(n.loopEnd,t)),n.loopStart!==void 0&&(n.loopStart=Math.min(n.loopStart,Math.max(0,t-.1))),n}function eX(e,t={}){let n=new Wq(t.budget),r=t.read??tX;async function i(n,i){i?.progress(0);let a=await r(n);if(i?.signal.aborted)return null;i?.progress(.5);let o=new Uint8Array(a,0,Math.min(4,a.byteLength)),s;if(o[0]===77&&o[1]===84&&o[2]===104&&o[3]===100){let n=await GY(a,t.midi);t.budget?.render&&(n=QY(n,t.budget.render)),s={buffer:XY(e,n),loop:{start:n.loopStart,end:n.loopEnd}}}else s={buffer:await e.decodeAudioData(a.slice(0))};return i?.progress(1),s}return(e,t,r)=>n.load(t,()=>i(t,r))}async function tX(e){return await KN([e]),qN(e)}var nX=class{constructor(e={}){this.current=null,this.fades=[],this.trackQueue=null,this.playlistFade=1,this.suspended_=!1,this.duckLevel_=1,this.volume=e.volume??1,this.create=e.create??zq}play(e,t=1){this.trackQueue=null,this.start(e,t,!0)}playTracks(e,t=1){e.length===0?this.stop(t):(this.trackQueue=[...e],this.playlistFade=t,this.startNextTrack())}startNextTrack(){if(!this.trackQueue?.length)return;let e=this.trackQueue.shift();this.trackQueue.push(e),this.start(e,this.playlistFade,!1)}start(e,t,n){let r=this.create(e);r.loop=n,!n&&r.onended!==void 0&&(r.onended=()=>{this.current===r&&this.startNextTrack()});let i=this.current;this.current=r,t<=0?(r.volume=this.volume*this.duckLevel_,Promise.resolve(r.play()).catch(()=>{}),i?.pause()):(r.volume=0,Promise.resolve(r.play()).catch(()=>{}),this.fades.push({audio:r,elapsed:0,duration:t,from:0,to:this.volume*this.duckLevel_,stopAtEnd:!1}),i&&this.fades.push({audio:i,elapsed:0,duration:t,from:i.volume,to:0,stopAtEnd:!0}))}stop(e=1){this.trackQueue=null;let t=this.current;t&&(this.current=null,e<=0?t.pause():this.fades.push({audio:t,elapsed:0,duration:e,from:t.volume,to:0,stopAtEnd:!0}))}suspend(){this.suspended_=!0,this.current?.pause();for(let e of this.fades)e.audio.pause()}resume(){this.suspended_&&(this.suspended_=!1,this.current&&Promise.resolve(this.current.play()).catch(()=>{}))}duck(e=.5,t=.5){let n=Number.isFinite(e)?Math.max(0,Math.min(1,e)):1,r=this.duckLevel_;this.duckLevel_=n;for(let e of this.fades)e.to=r>0?e.to/r*n:this.volume*n;if(this.current){let e=this.volume*n;t<=0?this.current.volume=e:this.fades.push({audio:this.current,elapsed:0,duration:t,from:this.current.volume,to:e,stopAtEnd:!1})}}unduck(e=.5){this.duck(1,e)}get duckLevel(){return this.duckLevel_}get isSuspended(){return this.suspended_}update(e){if(!this.suspended_)for(let t of[...this.fades]){t.elapsed+=e;let n=Math.min(1,t.elapsed/t.duration);t.audio.volume=t.from+(t.to-t.from)*n,n>=1&&(this.fades.splice(this.fades.indexOf(t),1),t.stopAtEnd&&(t.audio.pause(),t.audio.currentTime=0))}}},rX=class{constructor(e){this.states=new Map,this.cues=new Map,this.currentTrack=null,this.music=e}define(e,t){this.states.set(e,t)}enter(e){let t=this.states.get(e);if(!t)throw Error(`Orchestrator: no state defined for "${e}"`);t.track!==this.currentTrack&&(this.music.play(t.track,t.fadeDuration),this.currentTrack=t.track)}on(e,t){this.cues.set(e,t)}trigger(e){this.cues.get(e)?.play()}suspend(){this.music.suspend();for(let e of this.cues.values())e.suspend()}resume(){this.music.resume();for(let e of this.cues.values())e.resume()}},iX=new p,aX=2048,oX=class{constructor(e,t,n={}){this.onEnded=new p,this.onUnderrun=new p,this.onError=new p,this.timer=null,this.source=null,this.gainNode=null,this.pannerNode=null,this.params={volume:1,pitch:1,pan:0},this.repeat=!1,this.loopStart=0,this.loopEnd=null,this.endAfterFrames=1/0,this.endFadeFrames=0,this.chunks=[],this.nextWhen=0,this.active=!1,this.drained=!1,this.lastTimeline=0,this.outputFrames=0,this.underruns=0,this.pendingLeft=new Float32Array(aX*4),this.pendingRight=new Float32Array(aX*4),this.pendingLength=0,this.cursor=0,this.readFrame=0,this.timeline=0,this.sourceEnded=!1,this.context=e,this.destination=t??e.destination,this.chunkSeconds=n.chunkSeconds??.5,this.lookahead=n.lookaheadSeconds??2,this.pumpMs=n.pumpMs??100,this.schedule=n.schedule??((e,t)=>{let n=setTimeout(e,t);return n.unref?.(),n}),this.unschedule=n.unschedule??(e=>clearTimeout(e))}get isPlaying(){return this.active}get underrunCount(){return this.underruns}get duration(){return this.source?.length===void 0?1/0:this.source.length/this.source.sampleRate}play(e,t={}){if(this.stop(),this.source=e,this.params={volume:t.volume??1,pitch:t.pitch??1,pan:t.pan??0},!(this.params.pitch>0))throw Error(`stream pitch must be positive`);this.repeat=t.repeat??!1;let n=e.sampleRate,r=e.length;this.loopStart=Math.max(0,Math.floor((t.loop?.start??0)*n)),this.loopEnd=t.loop?Math.floor(t.loop.end*n):r??null,this.loopEnd!==null&&this.loopEnd<=this.loopStart&&(this.loopEnd=null),this.endAfterFrames=t.endAfterSeconds===void 0?1/0:Math.floor(t.endAfterSeconds*this.context.sampleRate),this.endFadeFrames=Math.floor((t.endFadeSeconds??2)*this.context.sampleRate),this.wire(),this.begin(Math.max(0,Math.floor((t.pos??0)*n))),this.active=!0,this.pump()}update(e={}){if(e.volume!==void 0&&(this.params.volume=e.volume),e.pitch!==void 0){if(!(e.pitch>0))throw Error(`stream pitch must be positive`);this.params.pitch=e.pitch}e.pan!==void 0&&(this.params.pan=e.pan),this.gainNode&&this.gainNode.gain.setTargetAtTime(this.params.volume,this.context.currentTime,.02),this.pannerNode&&(this.pannerNode.pan.value=this.params.pan),this.active&&this.pump()}stop(e=0){let t=this.active||this.chunks.length>0;t&&this.source&&(this.lastTimeline=this.positionFrames());let n=this.gainNode,r=this.chunks,i=this.context.currentTime;if(this.cancelTimer(),this.active=!1,this.chunks=[],this.gainNode=null,this.pannerNode=null,!t)return;let a=e>0&&n;a&&(n.gain.cancelScheduledValues(i),n.gain.setValueAtTime(n.gain.value,i),n.gain.linearRampToValueAtTime(0,i+e));for(let t of r){t.source.onended=null;try{t.source.stop(a?i+e+.02:void 0)}catch{}}}position(){return this.source?this.positionFrames()/this.source.sampleRate:0}positionFrames(){let e=this.source;if(!e)return 0;let t=this.context.currentTime,n;for(let e of this.chunks)e.when<=t&&(n=e);if(!n)return Math.floor(this.timelineAt(this.chunks[0]?.timeline??this.lastTimeline));let r=this.params.pitch*e.sampleRate/this.context.sampleRate,i=Math.min(t-n.when,n.seconds)*this.context.sampleRate*r;return Math.floor(this.timelineAt(n.timeline+i))}seek(e){let t=this.source;if(!t)return;let n=this.active;this.stop(),this.begin(Math.max(0,Math.floor(e*t.sampleRate))),n&&(this.wire(),this.active=!0,this.pump())}pump(){if(!this.active||!this.source||!this.gainNode)return;let e=this.context.currentTime;this.chunks=this.chunks.filter(t=>t.when+t.seconds>=e-.5),this.nextWhen<e&&((this.chunks.length>0||this.outputFrames>0)&&(this.underruns++,this.onUnderrun.dispatch(e-this.nextWhen),iX.dispatch({source:`stream`,lateSeconds:e-this.nextWhen})),this.nextWhen=e+.02);try{for(;!this.drained&&this.nextWhen<e+this.lookahead;)this.queueChunk()}catch(e){this.stop(),this.onError.dispatch(e instanceof Error?e:Error(String(e)));return}this.active&&!this.drained&&this.pumpMs>0&&this.timer===null&&(this.timer=this.schedule(()=>{this.timer=null,this.pump()},this.pumpMs))}wire(){let e=this.context.createGain();if(e.gain.value=this.params.volume,typeof this.context.createStereoPanner==`function`){let t=this.context.createStereoPanner();t.pan.value=this.params.pan,e.connect(t),t.connect(this.destination),this.pannerNode=t}else e.connect(this.destination);this.gainNode=e}cancelTimer(){this.timer!==null&&this.unschedule(this.timer),this.timer=null}begin(e){this.source?.seek(e),this.readFrame=e,this.timeline=e,this.lastTimeline=e,this.pendingLength=0,this.cursor=0,this.sourceEnded=!1,this.drained=!1,this.outputFrames=0,this.nextWhen=this.context.currentTime+.02}timelineAt(e){return this.repeat&&this.loopEnd!==null&&e>=this.loopEnd?this.loopStart+(e-this.loopStart)%(this.loopEnd-this.loopStart):e}queueChunk(){let e=this.context.sampleRate,t=Math.max(1,Math.ceil(this.chunkSeconds*e)),n=new Float32Array(t),r=new Float32Array(t),i=this.timeline,a=this.fill(n,r,t);if(a===0){this.finish(null);return}let o=this.context.createBuffer(2,a,e);o.getChannelData(0).set(n.subarray(0,a)),o.getChannelData(1).set(r.subarray(0,a));let s=this.context.createBufferSource();s.buffer=o,s.connect(this.gainNode);let c=this.nextWhen,l=a/e;s.start(c),this.chunks.push({source:s,when:c,seconds:l,timeline:i}),this.nextWhen=c+l,a<t&&this.finish(s)}finish(e){this.drained=!0,this.cancelTimer();let t=e??this.chunks.at(-1)?.source??null,n=()=>{this.active&&(this.active=!1,this.chunks=[],this.lastTimeline=this.timeline,this.onEnded.dispatch())},r=this.chunks.at(-1);t&&r&&r.when+r.seconds>this.context.currentTime?t.onended=n:n()}fill(e,t,n){let r=this.source,i=this.params.pitch*r.sampleRate/this.context.sampleRate,a=0;for(;a<n;){if(this.outputFrames>=this.endAfterFrames+this.endFadeFrames){this.sourceEnded=!0;break}let n=Math.floor(this.cursor);if(n+1>=this.pendingLength&&!this.sourceEnded){this.readMore();continue}if(n>=this.pendingLength)break;let r=Math.min(n+1,this.pendingLength-1),o=this.cursor-n,s=this.pendingLeft[n]+(this.pendingLeft[r]-this.pendingLeft[n])*o,c=this.pendingRight[n]+(this.pendingRight[r]-this.pendingRight[n])*o;if(this.outputFrames>=this.endAfterFrames){let e=1-(this.outputFrames-this.endAfterFrames)/Math.max(1,this.endFadeFrames);s*=e,c*=e}e[a]=s,t[a]=c,a++,this.outputFrames++,this.cursor+=i,this.timeline+=i,this.repeat&&this.loopEnd!==null&&this.timeline>=this.loopEnd&&(this.timeline=this.loopStart+(this.timeline-this.loopEnd))}return this.compact(),a}readMore(){let e=this.source,t=aX;this.repeat&&this.loopEnd!==null&&(this.readFrame>=this.loopEnd&&(e.seek(this.loopStart),this.readFrame=this.loopStart),t=Math.min(t,this.loopEnd-this.readFrame)),this.ensureCapacity(this.pendingLength+t);let n=e.read(this.pendingLeft,this.pendingRight,this.pendingLength,t);this.pendingLength+=n,this.readFrame+=n,n<t&&!(this.repeat&&this.loopEnd!==null)&&(this.sourceEnded=!0),n===0&&this.repeat&&this.loopEnd!==null&&this.readFrame<this.loopEnd&&(this.sourceEnded=!0)}ensureCapacity(e){if(e<=this.pendingLeft.length)return;let t=Math.max(e,this.pendingLeft.length*2),n=new Float32Array(t),r=new Float32Array(t);n.set(this.pendingLeft.subarray(0,this.pendingLength)),r.set(this.pendingRight.subarray(0,this.pendingLength)),this.pendingLeft=n,this.pendingRight=r}compact(){let e=Math.floor(this.cursor);e<aX||(this.pendingLeft.copyWithin(0,e,this.pendingLength),this.pendingRight.copyWithin(0,e,this.pendingLength),this.pendingLength-=e,this.cursor-=e)}};function sX(e,t,n,r,i,a){let o=e.createBufferSource();o.buffer=n,o.playbackRate.value=i;let s=e.createGain();s.gain.value=r;let c=null;return typeof e.createStereoPanner==`function`?(c=e.createStereoPanner(),c.pan.value=a,o.connect(s),s.connect(c),c.connect(t)):(o.connect(s),s.connect(t)),{source:o,gain:s,panner:c}}var cX=class{constructor(e,t){this.source=null,this.gainNode=null,this.pannerNode=null,this.buffer=null,this.params={volume:1,pitch:1,pan:0},this.loopRegion=null,this.repeat=!0,this.startedAt=0,this.offset=0,this.context=e,this.destination=t??e.destination}get isPlaying(){return this.source!==null}get duration(){return this.buffer?.duration??0}play(e,t={}){this.stop();let n=t.volume??1,r=t.pitch??1,i=t.pan??0,{source:a,gain:o,panner:s}=sX(this.context,this.destination,e,n,r,i),c=t.loop??null,l=t.repeat??!0;if(a.loop=l,c&&(a.loopStart=c.start,a.loopEnd=c.end),!l){let e=a;a.onended=()=>{this.source===e&&this.clearNodes()}}this.source=a,this.gainNode=o,this.pannerNode=s,this.buffer=e,this.params={volume:n,pitch:r,pan:i},this.loopRegion=c,this.repeat=l,this.offset=Math.min(Math.max(0,t.pos??0),Math.max(0,e.duration-.001)),this.startedAt=this.context.currentTime,a.start(0,this.offset)}update(e){if(e.volume!==void 0&&(this.params.volume=e.volume),e.pitch!==void 0&&(this.params.pitch=e.pitch),e.pan!==void 0&&(this.params.pan=e.pan),!this.source||!this.gainNode)return;let t=this.context.currentTime;this.gainNode.gain.setTargetAtTime(this.params.volume,t,.02),this.source.playbackRate.value=this.params.pitch,this.pannerNode&&(this.pannerNode.pan.value=this.params.pan)}stop(e=0){let t=this.position(),n=this.source,r=this.gainNode;if(this.clearNodes(),this.offset=t,n)try{if(e>0&&r){let t=this.context.currentTime;r.gain.cancelScheduledValues(t),r.gain.setValueAtTime(r.gain.value,t),r.gain.linearRampToValueAtTime(0,t+e),n.stop(t+e+.02)}else n.stop()}catch{}}position(){if(!this.source||!this.buffer)return this.offset;let e=Math.max(0,this.context.currentTime-this.startedAt)*this.params.pitch,t=this.offset+e;if(this.repeat&&this.duration>0){let e=this.loopRegion?.start??0,n=this.loopRegion?.end??this.buffer.duration;n>e&&t>=n&&(t=e+(t-e)%(n-e))}return t}seek(e){this.restore({...this.state(),pos:e})}state(){return{...this.params,pos:this.position()}}restore(e){let t=this.buffer;this.update({volume:e.volume,pitch:e.pitch,pan:e.pan}),t&&this.source?this.play(t,{volume:e.volume,pitch:e.pitch,pan:e.pan,pos:e.pos,loop:this.loopRegion,repeat:this.repeat}):this.offset=Math.max(0,e.pos)}clearNodes(){this.source&&(this.source.onended=null),this.source=null,this.gainNode=null,this.pannerNode=null}};function lX(e,t,n,r){let i=Number(e);return Math.min(n,Math.max(t,Number.isFinite(i)?i:r))}var uX=class e{constructor(e,t={}){this.aborts={bgm:null,bgs:null},this.onLoadProgress=new p,this.tracks={bgm:null,bgs:null},this.saved={bgm:null,bgs:null},this.requests={bgm:0,bgs:0},this.me=null,this.meToken=0,this.suspendedBgm=null,this.seNodes=new Set,this.mixerLevels={bgm:{volume:1,muted:!1},bgs:{volume:1,muted:!1},me:{volume:1,muted:!1},se:{volume:1,muted:!1}},this.context=e,this.destination=t.destination??e.destination,this.load=t.load??eX(e);let n=()=>{let t=e.createGain();return t.connect(this.destination),t};this.kindGains={bgm:n(),bgs:n(),me:n(),se:n()},this.bgmChannel=new cX(e,this.kindGains.bgm),this.bgsChannel=new cX(e,this.kindGains.bgs),this.streamLoader=t.stream??null,this.arbiter=t.arbiter??null,this.streams={bgm:new oX(e,this.kindGains.bgm),bgs:new oX(e,this.kindGains.bgs)}}streamChannel(e){return this.streams[e]}cancelLoad(e){this.requests[e]++,this.aborts[e]?.abort(),this.aborts[e]=null}stopLoop(e,t=0){(e===`bgm`?this.bgmChannel:this.bgsChannel).stop(t),this.streams[e].stop(t)}loopPlaying(e){return(e===`bgm`?this.bgmChannel:this.bgsChannel).isPlaying||this.streams[e].isPlaying}loopPosition(e){return this.streams[e].isPlaying?this.streams[e].position():(e===`bgm`?this.bgmChannel:this.bgsChannel).position()}loopFrame(e){return this.streams[e].isPlaying?this.streams[e].positionFrames():void 0}setMixer(e,t){let n=this.mixerLevels[e];t.volume!==void 0&&(n.volume=lX(t.volume,0,1,1)),t.muted!==void 0&&(n.muted=t.muted),this.kindGains[e].gain.value=n.muted?0:n.volume}mixer(e){return{...this.mixerLevels[e]}}playBgm(e){return this.playLoop(`bgm`,e)}playBgs(e){return this.playLoop(`bgs`,e)}stopBgm(){this.cancelLoad(`bgm`),this.tracks.bgm=null,this.suspendedBgm=null,this.stopLoop(`bgm`)}stopBgs(){this.cancelLoad(`bgs`),this.tracks.bgs=null,this.stopLoop(`bgs`)}fadeOutBgm(e=1){this.cancelLoad(`bgm`),this.tracks.bgm=null,this.suspendedBgm=null,this.stopLoop(`bgm`,Math.max(0,e))}fadeOutBgs(e=1){this.cancelLoad(`bgs`),this.tracks.bgs=null,this.stopLoop(`bgs`,Math.max(0,e))}currentTrack(e){let t=this.tracks[e];if(t){let n=this.loopFrame(e);return{...t,pos:this.loopPlaying(e)?this.loopPosition(e):t.pos,...n===void 0?{}:{frame:n}}}return e===`bgm`?this.suspendedBgm:null}saveBgm(){return this.saved.bgm=this.currentTrack(`bgm`),this.saved.bgm}saveBgs(){return this.saved.bgs=this.currentTrack(`bgs`),this.saved.bgs}replayBgm(){return this.saved.bgm?this.playBgm(this.saved.bgm):Promise.resolve()}replayBgs(){return this.saved.bgs?this.playBgs(this.saved.bgs):Promise.resolve()}async playMe(t){let n=e.normalize(t),r=++this.meToken;if(this.stopMeNodes(),!n.name)return;let i=await this.load(`me`,n.name);if(r!==this.meToken||!i)return;let a=this.currentTrack(`bgm`);a&&(this.suspendedBgm=a,this.cancelLoad(`bgm`),this.stopLoop(`bgm`),this.tracks.bgm=null);let{source:o}=sX(this.context,this.kindGains.me,i.buffer,n.volume/100,n.pitch/100,n.pan/100);this.me={source:o,token:r},o.onended=()=>{this.me?.token===r&&this.finishMe()},o.start(0)}stopMe(e=!0){this.stopMeNodes(),e&&this.finishMe()}async playSe(t){let n=e.normalize(t);if(!n.name)return;let r=await this.load(`se`,n.name);if(!r)return;let i=null,a=this.arbiter?.request(Math.floor(Number(t.priority)||0),()=>{i&&this.cutSe(i)},()=>!i||this.seNodes.has(i))??null;if(this.arbiter&&!a)return;let{source:o}=sX(this.context,this.kindGains.se,r.buffer,n.volume/100,n.pitch/100,n.pan/100);i={source:o},this.seNodes.add(i),o.onended=()=>{this.seNodes.delete(i),a?.release()},o.start(0)}cutSe(e){e.source.onended=null,this.seNodes.delete(e);try{e.source.stop()}catch{}}stopSe(){for(let e of this.seNodes){e.source.onended=null;try{e.source.stop()}catch{}}this.seNodes.clear()}stopAll(){this.cancelLoad(`bgm`),this.cancelLoad(`bgs`),this.tracks.bgm=null,this.tracks.bgs=null,this.suspendedBgm=null,this.stopLoop(`bgm`),this.stopLoop(`bgs`),this.stopMeNodes(),this.stopSe()}snapshot(){return{bgm:this.currentTrack(`bgm`),bgs:this.currentTrack(`bgs`),savedBgm:this.saved.bgm,savedBgs:this.saved.bgs}}restore(e){e&&typeof e==`object`&&(this.saved.bgm=e.savedBgm??null,this.saved.bgs=e.savedBgs??null,e.bgm&&this.playBgm(e.bgm),e.bgs&&this.playBgs(e.bgs))}static normalize(e){return{name:String(e?.name||``),volume:lX(e?.volume,0,100,90),pitch:lX(e?.pitch,10,400,100),pan:lX(e?.pan,-100,100,0),pos:Math.max(0,Number(e?.pos)||0),...typeof e?.contentId==`string`?{contentId:e.contentId}:{},...typeof e?.engine==`string`?{engine:e.engine}:{},...Number.isFinite(e?.frame)?{frame:Math.max(0,Math.floor(e.frame))}:{}}}async playLoop(t,n){let r=e.normalize(n);if(!r.name){this.cancelLoad(t),this.tracks[t]=null,t===`bgm`&&(this.suspendedBgm=null),this.stopLoop(t);return}let i=this.tracks[t];if(i&&i.name===r.name&&!(r.pos>0)){this.tracks[t]={...r,pos:0};let e={volume:r.volume/100,pitch:r.pitch/100,pan:r.pan/100};(t===`bgm`?this.bgmChannel:this.bgsChannel).update(e),this.streams[t].update(e);return}if(t===`bgm`&&this.me){this.cancelLoad(`bgm`),this.suspendedBgm=r,this.tracks.bgm=null,this.stopLoop(`bgm`);return}this.cancelLoad(t);let a=this.requests[t],o=new AbortController;this.aborts[t]=o;let s={track:r,signal:o.signal,progress:e=>{a===this.requests[t]&&this.onLoadProgress.dispatch({kind:t,name:r.name,fraction:e})}};this.stopLoop(t),this.tracks[t]={...r,pos:0};let c={volume:r.volume/100,pitch:r.pitch/100,pan:r.pan/100},l=this.streamLoader?await this.streamLoader(t,r.name,s):null;if(a!==this.requests[t])return;if(l){this.streams[t].play(l.source,{...c,pos:r.pos,repeat:!0,loop:l.loop,endAfterSeconds:l.endAfterSeconds,endFadeSeconds:l.endFadeSeconds});return}let u=await this.load(t,r.name,s);a===this.requests[t]&&(u?(t===`bgm`?this.bgmChannel:this.bgsChannel).play(u.buffer,{...c,pos:r.pos,loop:u.loop??null}):this.tracks[t]=null)}stopMeNodes(){let e=this.me;if(this.me=null,e){e.source.onended=null;try{e.source.stop()}catch{}}}finishMe(){this.me=null;let e=this.suspendedBgm;this.suspendedBgm=null,e&&!this.tracks.bgm&&this.playBgm(e)}},dX=class{constructor(e,t={}){this.onEnded=new p,this.buffer=null,this.loop=null,this.repeat=!1,this.playing=!1,this.paused=!1,this.resumeAt=0,this.context=e,this.channel=new cX(e,t.destination),this.volume_=Math.min(1,Math.max(0,t.volume??1))}load(e){this.stop(),`left`in e?(this.buffer=XY(this.context,e),this.loop={start:e.loopStart,end:e.loopEnd}):(this.buffer=e,this.loop=null)}play(e={}){this.buffer&&(this.repeat=e.repeat??!1,this.paused=!1,this.playing=!0,this.resumeAt=e.pos??0,this.start())}pause(){this.playing&&!this.paused&&(this.resumeAt=this.channel.position(),this.paused=!0,this.channel.stop())}resume(){this.paused&&this.buffer&&(this.paused=!1,this.start())}togglePause(){this.paused?this.resume():this.pause()}stop(){this.channel.stop(),this.playing=!1,this.paused=!1,this.resumeAt=0}get isPlaying(){return this.playing&&!this.paused}get isPaused(){return this.paused}get duration(){return this.buffer?.duration??0}position(){return this.playing?this.paused?this.resumeAt:this.channel.position():0}seek(e){if(!this.buffer)return;let t=Math.min(Math.max(0,e),this.buffer.duration);this.paused?this.resumeAt=t:this.playing&&this.play({pos:t,repeat:this.repeat})}get volume(){return this.volume_}set volume(e){this.volume_=Math.min(1,Math.max(0,e)),this.channel.update({volume:this.volume_})}update(){!this.playing||this.paused||this.channel.isPlaying||(this.playing=!1,this.resumeAt=0,this.onEnded.dispatch())}start(){this.buffer&&this.channel.play(this.buffer,{volume:this.volume_,pos:this.resumeAt,loop:this.loop,repeat:this.repeat})}},fX=65536;function pX(e){let t=gX(e.subarray(0,fX));if(!t)return null;let n=new DataView(t.buffer,t.byteOffset,t.byteLength),r=new TextDecoder(`utf-8`),i=7,a=()=>{if(i+4>t.length)return null;let e=n.getUint32(i,!0);return i+=4,i+e<=t.length?e:null},o=a();if(o===null||(i+=o,i+4>t.length))return null;let s=n.getUint32(i,!0);i+=4;let c=null,l=null;for(let e=0;e<s;e++){let e=a();if(e===null)break;let n=r.decode(t.subarray(i,i+e));i+=e;let o=n.indexOf(`=`);if(o<0)continue;let s=n.slice(0,o).toUpperCase(),u=/^\d+$/.test(n.slice(o+1))?Number(n.slice(o+1)):null;u!==null&&(s===`LOOPSTART`?c=u:s===`LOOPLENGTH`&&(l=u))}return c===null?null:{loopStart:c,loopLength:l}}function mX(e,t,n){if(!e||!(t>0))return null;let r=e.loopStart/t,i=e.loopLength?(e.loopStart+e.loopLength)/t:n;return r>=0&&i>r&&r<n?{start:r,end:Math.min(i,n)}:null}function hX(e){let t=e.loopStartSeconds;if(t==null||!(t>=0))return null;let n=Math.min(e.loopEndSeconds??e.durationSeconds,e.durationSeconds);return n>t&&t<e.durationSeconds?{start:t,end:n}:null}function gX(e){let t=[3,118,111,114,98,105,115],n=[],r=0;for(;r+27<=e.length;){if(e[r]!==79||e[r+1]!==103||e[r+2]!==103||e[r+3]!==83)return null;let i=e[r+26],a=r+27+i;if(a>e.length)return null;let o=a;for(let a=0;a<i;a++){let i=e[r+27+a];if(o+i>e.length)return null;for(let t=0;t<i;t++)n.push(e[o+t]);if(o+=i,i<255){if(t.every((e,t)=>n[t]===e))return Uint8Array.from(n);n=[]}}r=o}return null}var _X=Object.freeze({maxInputBytes:16777216,maxOutputBytes:67108864,maxInstructionsPerSecond:4e6,maxSeconds:3600,maxRealtimeRatio:1,maxStarvedReads:8}),vX=class extends Error{constructor(e,t){super(t),this.name=`DecodeBudgetError`,this.limit=e}};function yX(e={}){let t={..._X,...e};for(let[e,n]of Object.entries(t))if(!(n>0))throw Error(`decoder limit ${e} must be positive`);return t}function bX(e,t={},n=`input`){let{maxInputBytes:r}=yX(t);if(e.byteLength>r)throw new vX(`maxInputBytes`,`${n} is ${e.byteLength} bytes, over the ${r} byte limit`)}var xX=class e{constructor(e){if(!(e>0))throw Error(`instruction allowance must be positive`);this.left=e}static forSeconds(t,n={}){let{maxInstructionsPerSecond:r}=yX(n);return new e(Math.max(1,Math.ceil(t*r)))}get remaining(){return this.left}spend(e=1){if(this.left-=e,this.left<0)throw new vX(`maxInstructionsPerSecond`,`the emulated program ran past its instruction budget`)}};async function SX(e,t={},n=`deflate-raw`){let{maxOutputBytes:r}=yX(t),i=new Blob([e]).stream().pipeThrough(new DecompressionStream(n)).getReader(),a=[],o=0;for(;;){let{done:e,value:t}=await i.read();if(e)break;if(o+=t.byteLength,o>r)throw await i.cancel(),new vX(`maxOutputBytes`,`inflated data passed the ${r} byte limit`);a.push(t)}let s=new Uint8Array(o),c=0;for(let e of a)s.set(e,c),c+=e.byteLength;return s}function CX(e,t={},n={}){let r=yX(t),i=n.now??(()=>performance.now()),a=Math.floor(r.maxSeconds*e.sampleRate),o=0,s=0;return{sampleRate:e.sampleRate,get length(){return e.length===void 0?void 0:Math.min(e.length,a)},read(t,n,c,l){let u=Math.min(l,Math.max(0,a-o));if(u===0)return 0;let d=i(),f=e.read(t,n,c,u),p=i()-d;if(!(f>=0)||f>u)throw new vX(`maxOutputBytes`,`a source returned ${f} frames for a request of ${u}`);for(let e=c;e<c+f;e++){let r=t[e],i=n[e];t[e]=Number.isFinite(r)?Math.max(-4,Math.min(4,r)):0,n[e]=Number.isFinite(i)?Math.max(-4,Math.min(4,i)):0}o+=f;let m=f/e.sampleRate*1e3;if(s=f>0&&p>m*r.maxRealtimeRatio?s+1:0,s>=r.maxStarvedReads)throw new vX(`maxRealtimeRatio`,`a source took longer than real time to render ${s} reads in a row`);return f},seek(t){e.seek(t),o=Math.min(t,a)}}}function wX(e,t=`pcm16`){let n=e.left.length;if(e.right.length!==n)throw Error(`the two channels must have the same length`);let r=t===`pcm16`?2:4,i=n*2*r,a=new Uint8Array(44+i),o=new DataView(a.buffer),s=(e,t)=>{for(let n=0;n<t.length;n++)a[e+n]=t.charCodeAt(n)};s(0,`RIFF`),o.setUint32(4,36+i,!0),s(8,`WAVE`),s(12,`fmt `),o.setUint32(16,16,!0),o.setUint16(20,t===`pcm16`?1:3,!0),o.setUint16(22,2,!0),o.setUint32(24,Math.round(e.sampleRate),!0),o.setUint32(28,Math.round(e.sampleRate)*2*r,!0),o.setUint16(32,2*r,!0),o.setUint16(34,r*8,!0),s(36,`data`),o.setUint32(40,i,!0);let c=44;for(let i=0;i<n;i++)for(let n of[e.left[i],e.right[i]])t===`pcm16`?o.setInt16(c,Math.round(Math.max(-1,Math.min(1,n))*32767),!0):o.setFloat32(c,n,!0),c+=r;return a}function TX(e){if(e.length<12||String.fromCharCode(...e.subarray(0,4))!==`RIFF`)throw Error(`not a RIFF file`);if(String.fromCharCode(...e.subarray(8,12))!==`WAVE`)throw Error(`not a WAVE file`);let t=new DataView(e.buffer,e.byteOffset,e.byteLength),n=null,r=12;for(;r+8<=e.length;){let i=String.fromCharCode(...e.subarray(r,r+4)),a=t.getUint32(r+4,!0),o=r+8;if(i===`fmt `){if(a<16||o+16>e.length)throw Error(`truncated fmt chunk`);n={tag:t.getUint16(o,!0),channels:t.getUint16(o+2,!0),rate:t.getUint32(o+4,!0),bits:t.getUint16(o+14,!0)}}else if(i===`data`){if(!n)throw Error(`data chunk before fmt chunk`);let t=Math.min(a,e.length-o),r=n.tag===3?`float`:`pcm`;if(n.tag!==1&&n.tag!==3)throw Error(`unsupported WAVE format tag ${n.tag}`);if(n.channels<1||n.bits%8!=0||n.bits<8)throw Error(`unsupported sample layout`);let i=Math.floor(t/(n.channels*(n.bits/8)));return{info:{channels:n.channels,sampleRate:n.rate,bitsPerSample:n.bits,encoding:r,frames:i,seconds:n.rate>0?i/n.rate:0},dataOffset:o}}r=o+a+a%2}throw Error(`no data chunk`)}function EX(e){return TX(e).info}function DX(e){let{info:t,dataOffset:n}=TX(e),r=new DataView(e.buffer,e.byteOffset,e.byteLength),i=t.bitsPerSample/8,a=new Float32Array(t.frames),o=new Float32Array(t.frames),s=e=>{if(t.encoding===`float`){if(i!==4)throw Error(`only 32-bit float is supported`);return r.getFloat32(e,!0)}switch(i){case 1:return(r.getUint8(e)-128)/128;case 2:return r.getInt16(e,!0)/32768;case 3:return(r.getUint8(e)|r.getUint8(e+1)<<8|r.getInt8(e+2)<<16)/8388608;case 4:return r.getInt32(e,!0)/2147483648;default:throw Error(`unsupported sample width ${t.bitsPerSample}`)}};for(let e=0;e<t.frames;e++){let r=n+e*t.channels*i;a[e]=s(r),o[e]=t.channels>1?s(r+i):a[e]}return{sampleRate:t.sampleRate,left:a,right:o}}function OX(e,t){let n=e.length,r=0;for(let i=1;i<n;i++){let a=n>>1;for(;r&a;)r^=a,a>>=1;if(r^=a,i<r){let n=e[i];e[i]=e[r],e[r]=n,n=t[i],t[i]=t[r],t[r]=n}}for(let r=2;r<=n;r<<=1){let i=-2*Math.PI/r,a=Math.cos(i),o=Math.sin(i),s=r>>1;for(let i=0;i<n;i+=r){let n=1,r=0;for(let c=0;c<s;c++){let l=i+c,u=l+s,d=e[u]*n-t[u]*r,f=e[u]*r+t[u]*n;e[u]=e[l]-d,t[u]=t[l]-f,e[l]+=d,t[l]+=f;let p=n*a-r*o;r=n*o+r*a,n=p}}}}function kX(e,t,n){let r=new Float64Array(n),i=new Float64Array(n);for(let i=0;i<n;i++){let a=t+i<e.length?e[t+i]:0;r[i]=a*(.5-.5*Math.cos(2*Math.PI*i/(n-1)))}OX(r,i);let a=new Float64Array(n/2);for(let e=0;e<a.length;e++)a[e]=20*Math.log10(Math.hypot(r[e],i[e])+1e-12);return a}function AX(e,t,n={}){let r=n.windowSize??2048;if(r<4||r&r-1)throw Error(`window size must be a power of two of at least 4`);let i=Math.max(1,Math.floor(n.hop??r/2)),a=n.floorDb??80,o=ZY(t,e.sampleRate),s=e=>e.left.map((t,n)=>(t+e.right[n])/2),c=s(e),l=s(o),u=Math.max(c.length,l.length),d=0,f=0,p=0;for(let e=0;e===0||e+r/2<u;e+=i){let t=kX(c,e,r),n=kX(l,e,r),i=-1/0;for(let e=0;e<t.length;e++)i=Math.max(i,t[e],n[e]);for(let e=0;e<t.length;e++)Math.max(t[e],n[e])<i-a||(d+=Math.abs(t[e]-n[e]),f++);p++}return{decibels:f===0?0:d/f,windows:p}}function jX(e,t=`ntsc`){return e===t?1:e===`pal`?50/60:60/50}function MX(e,t){let n=18e3*(3500/18e3)**kn(e,0,1);return Math.min(n,t/2)}function NX(e,t){let n=kn(t,0,1);if(n===0)return e;let r=Math.tanh(e);return e*(1-n)+r*n}var PX=class{constructor(e={}){this.data={busVolumes:{bgm:90,bgs:90,me:90,se:90},preferredEngine:null,region:`ntsc`,outputStage:`faithful`,captions:!1,dynamics:0,soften:0},this.restore(e)}snapshot(){return{...this.data,busVolumes:{...this.data.busVolumes}}}restore(e){if(e.busVolumes)for(let t of Object.keys(e.busVolumes))this.data.busVolumes[t]=kn(e.busVolumes[t],0,100);e.preferredEngine!==void 0&&(this.data.preferredEngine=e.preferredEngine),e.region!==void 0&&(this.data.region=e.region),e.outputStage!==void 0&&(this.data.outputStage=e.outputStage),e.captions!==void 0&&(this.data.captions=e.captions),e.dynamics!==void 0&&(this.data.dynamics=kn(e.dynamics,0,1)),e.soften!==void 0&&(this.data.soften=kn(e.soften,0,1))}setBusVolume(e,t){this.data.busVolumes[e]=kn(t,0,100)}applyToBus(e){for(let t of Object.keys(this.data.busVolumes))e.setMixer(t,{volume:this.data.busVolumes[t]/100})}playbackRate(e=`ntsc`){return jX(this.data.region,e)}cutoff(e){let t=this.data.outputStage===`clean`?.25:0;return MX(kn(this.data.soften+t,0,1),e)}limit(e){return NX(e,this.data.dynamics)}};function FX(e,t){let n=[];for(let r of e.inputs.values())r.onmidimessage=e=>{let n=e.data;n&&n.length!==0&&(n[0]===240?t.sysex(n):(n[0]&240)!=240&&t.event(n[0],n[1]??0,n[2]??0))},n.push(r);let r=!0;return{ports:n.length,disconnect(){if(r){r=!1;for(let e of n)e.onmidimessage=null}}}}async function IX(e){let t=navigator;if(typeof t.requestMIDIAccess!=`function`)return null;try{return FX(await t.requestMIDIAccess({sysex:!0}),e)}catch{try{return FX(await t.requestMIDIAccess(),e)}catch{return null}}}function LX(e){let t=[],n=-1;for(let r=0;r<e.length;r++)e[r]===240?n=r:e[r]===247&&n>=0&&(t.push(e.slice(n,r+1)),n=-1);return t}var RX=32,zX=128;function BX(e){if(e.length!==4104||e[0]!==240||e[1]!==67||e[2]&240||e[3]!==9||e[4]!==32||e[5]!==0)return null;let t=e.subarray(6,4102),n=e[4102];for(let e of t)n+=e;return n%128==0?t:null}function VX(e){let t=[];return LX(e).forEach((e,n)=>{let r=BX(e);if(r)for(let e=0;e<RX;e++){let i=e*zX+118,a=String.fromCharCode(...r.subarray(i,i+10)).replaceAll(`\0`,` `).trim();t.push({name:a,message:n,voice:e})}}),t}var HX=class{constructor(e){this.messages=LX(e),this.patches=VX(e)}audition(e,t,n=60,r=.5){let i=e.sampleRate,a=.25,o=Math.max(1,Math.ceil((r+a)*i)),s=new Float32Array(o),c=new Float32Array(o);e.reset();let l=this.messages[t.message];l&&e.sysex(l),e.event(144,n,96);let u=Math.min(o,Math.ceil(r*i));return e.render(s,c,0,u),e.event(128,n,0),o>u&&e.render(s,c,u,o-u),e.reset(),{sampleRate:i,left:s,right:c,loopStart:0,loopEnd:r+a,duration:r+a}}};function UX(e,t){if(t<1||e.length===0)return[];let n=[];for(let r=0;r<t;r++){let i=Math.floor(r*e.length/t),a=Math.max(i+1,Math.floor((r+1)*e.length/t)),o=1/0,s=-1/0;for(let t=i;t<Math.min(a,e.length);t++)e[t]<o&&(o=e[t]),e[t]>s&&(s=e[t]);n.push({min:o===1/0?0:o,max:s===-1/0?0:s})}return n}function WX(e,t,n){return[UX(e,n),UX(t,n)]}var GX=[`C`,`C#`,`D`,`D#`,`E`,`F`,`F#`,`G`,`G#`,`A`,`A#`,`B`];function KX(e){return`${GX[(e%12+12)%12]}${Math.floor(e/12)-1}`}function qX(e,t=4){let n=[];for(let t of e.events)t.type===`noteOn`&&t.velocity>0&&n.push(t);if(n.length===0)return[];let r=GJ(e).filter(e=>(e.status&240)==144&&e.data2>0).map(e=>e.time),i=Math.max(...n.map(e=>e.channel))+1,a=e.ticksPerQuarter/t,o=new Map,s=0,c=new Map;n.forEach((e,t)=>{let n=Math.floor(e.tick/a);s=Math.max(s,n),o.has(n)||o.set(n,new Map);let i=o.get(n);e.note>(i.get(e.channel)??-1)&&i.set(e.channel,e.note),c.has(n)||c.set(n,r[t]??0)});let l=[],u=0;for(let e=0;e<=s;e++){c.has(e)&&(u=c.get(e));let t=Array(i).fill(null);for(let[n,r]of o.get(e)??[])t[n]=KX(r);l.push({step:e,time:u,notes:t})}return l}var JX=class{constructor(e,t={}){this.versions=new Map,this.running=null,this.startedAt=0,this.offsetFrames=0,this.levels_={},this.context=e,this.destination=t.destination??e.destination,this.defaultFade=Math.max(0,t.fadeSeconds??1)}get isPlaying(){return this.running!==null}get version(){return this.running?.version??null}load(e,t,n={}){let r=Object.keys(t);if(r.length===0)throw Error(`adaptive version "${e}" has no stems`);let i=t[r[0]];for(let n of r){let a=t[n];if(a.length!==i.length||a.sampleRate!==i.sampleRate)throw Error(`stem "${n}" of "${e}" differs in length or sample rate from "${r[0]}"`)}let a=[...this.versions.values()][0];if(a&&a.sampleRate!==i.sampleRate)throw Error(`version "${e}" is at ${i.sampleRate} Hz but the others are at ${a.sampleRate} Hz`);let o=n.groups??{};for(let[n,r]of Object.entries(o)){let i=r.find(e=>!(e in t));if(i!==void 0)throw Error(`group "${n}" names stem "${i}", which "${e}" lacks`);if(n in t)throw Error(`group "${n}" has the name of a stem`)}this.versions.set(e,{stems:t,groups:o,loop:n.loop??null,frames:i.length,sampleRate:i.sampleRate})}play(e={}){this.stop();let t=e.version??[...this.versions.keys()][0],n=t===void 0?void 0:this.versions.get(t);if(!n||t===void 0)throw Error(`no adaptive version "${e.version??``}" is loaded`);this.levels_={};let r=Math.min(Math.max(0,Math.floor((e.pos??0)*n.sampleRate)),n.frames-1);this.offsetFrames=r,this.startedAt=this.context.currentTime,this.running=this.startVersion(t,n,r,e.levels??{},0)}setLevel(e,t,n){let r=this.running;if(!r)throw Error(`adaptive music is not playing`);let i=this.versions.get(r.version),a=this.membersOf(i,e),o=Math.min(1,Math.max(0,t)),s=Math.max(0,n??this.defaultFade);for(let e of a){this.levels_[e]=o;let t=r.voices.get(e)?.gain.gain;t&&this.ramp(t,o,s)}}levels(){return{...this.levels_}}positionFrames(){let e=this.running;if(!e)return 0;let t=this.versions.get(e.version),n=this.offsetFrames+Math.max(0,this.context.currentTime-this.startedAt)*t.sampleRate,r=t.loop?Math.floor(t.loop.start*t.sampleRate):0,i=t.loop?Math.floor(t.loop.end*t.sampleRate):t.frames;return i>r&&n>=i&&(n=r+(n-r)%(i-r)),Math.floor(n)}position(){let e=this.running;return e?this.positionFrames()/this.versions.get(e.version).sampleRate:0}switchVersion(e,t){let n=this.running;if(!n)throw Error(`adaptive music is not playing`);let r=this.versions.get(e);if(!r)throw Error(`no adaptive version "${e}" is loaded`);if(e===n.version)return;let i=Math.max(0,t??this.defaultFade),a=this.positionFrames(),o=n,s=this.context.currentTime;this.ramp(o.master.gain,0,i);for(let{source:e}of o.voices.values())this.stopAt(e,s+i+.05);this.offsetFrames=Math.min(a,r.frames-1),this.startedAt=s,this.running=this.startVersion(e,r,this.offsetFrames,this.levels_,i)}stop(e=0){let t=this.running;if(this.running=null,this.levels_={},!t)return;let n=this.context.currentTime;e>0&&this.ramp(t.master.gain,0,e);for(let{source:r}of t.voices.values())this.stopAt(r,e>0?n+e+.05:void 0)}startVersion(e,t,n,r,i){let a=this.context.createGain();a.gain.value=i>0?0:1,a.connect(this.destination),i>0&&this.ramp(a.gain,1,i);let o=new Map,s=this.context.currentTime,c=n/t.sampleRate,l={};for(let[e,n]of Object.entries(r))if(e in t.groups)for(let r of t.groups[e])l[r]=n;for(let[e,n]of Object.entries(r))e in t.stems&&(l[e]=n);for(let[e,n]of Object.entries(t.stems)){let r=this.context.createGain(),i=Math.min(1,Math.max(0,l[e]??0));r.gain.value=i,this.levels_[e]=i,r.connect(a);let u=this.context.createBufferSource();u.buffer=n,u.loop=!0,t.loop&&(u.loopStart=t.loop.start,u.loopEnd=t.loop.end),u.connect(r),u.start(s,c),o.set(e,{source:u,gain:r})}return{version:e,voices:o,master:a}}membersOf(e,t){if(t in e.stems)return[t];let n=e.groups[t];if(!n)throw Error(`"${t}" is neither a stem nor a group of "${this.running?.version}"`);return n}ramp(e,t,n){if(n<=0){e.value=t;return}let r=this.context.currentTime;e.cancelScheduledValues(r),e.setValueAtTime(e.value,r),e.linearRampToValueAtTime(t,r+n)}stopAt(e,t){try{e.stop(t)}catch{}}};function YX(e,t){let n=Function(`return (${e});`)()(t),r=0,i=[],a=()=>typeof performance>`u`?Date.now():performance.now(),o=e=>{e.sysex?n.sysex(e.sysex):n.event(e.status,e.data1,e.data2)};return{handle(e){if(e.type===`events`)return i=i.concat(e.events).sort((e,t)=>e.frame-t.frame),null;if(e.type===`reset`)return n.reset(),i=[],r=e.frame,null;let t=e.frames,s=new Float32Array(t),c=new Float32Array(t),l=a(),u=r,d=u+t,f=0,p=0;for(;p<i.length&&i[p].frame<d;){let e=Math.max(0,i[p].frame-u);e>f&&(n.render(s,c,f,e-f),f=e),o(i[p++])}return i=i.slice(p),f<t&&n.render(s,c,f,t-f),r=d,{type:`block`,start:u,left:s,right:c,renderMs:a()-l}}}}function XX(e){let t=globalThis.process?.getBuiltinModule?.(`node:worker_threads`)?.parentPort??null,n=globalThis,r=(e,r=[])=>{t?t.postMessage(e,r):n.postMessage(e,r)},i=null,a=t=>{try{if(t.type===`init`){i=e(t.factory,t.sampleRate),r({type:`ready`});return}let n=i?.handle(t);n&&r(n,[n.left.buffer,n.right.buffer])}catch(e){r({type:`error`,message:String(e?.message??e)})}};t?t.on(`message`,e=>a(e)):n.onmessage=e=>a(e.data)}var ZX=class{constructor(e){if(this.onUnderrun=new p,this.link=null,this.runner=null,this.mode_=`inline`,this.warm=!1,this.failure=null,this.disposed=!1,this.readFrame=0,this.requestedUntil=0,this.blocks=[],this.underruns=0,this.load=0,!(e.sampleRate>0))throw Error(`core host sample rate must be positive`);if(this.sampleRate=e.sampleRate,this.factorySource=e.factory.toString(),this.blockFrames=Math.max(64,Math.floor(e.blockFrames??1024)),this.queueFrames=Math.max(this.blockFrames,Math.floor((e.queueSeconds??.3)*e.sampleRate)),this.requested=e.mode??`auto`,this.requested!==`inline`&&this.openWorker(),!this.link){if(this.requested===`worker`)throw Error(`the core host needs a worker: ${this.fallbackReason}`);if(this.goInline(this.fallbackReason??`inline mode was requested`),!this.runner&&this.failure)throw this.failure}this.pump(0)}get mode(){return this.mode_}stats(){return{mode:this.mode_,...this.fallbackReason?{fallbackReason:this.fallbackReason}:{},underruns:this.underruns,queuedFrames:this.blocks.reduce((e,t)=>e+t.left.length,0),load:this.load}}event(e,t,n,r){this.send({frame:r??this.requestedUntil,status:e,data1:t,data2:n})}sysex(e,t){this.send({frame:t??this.requestedUntil,status:240,data1:0,data2:0,sysex:e})}reset(){this.blocks=[],this.requestedUntil=this.readFrame,this.post({type:`reset`,frame:this.readFrame}),this.pump(0)}seek(e){let t=Math.max(0,Math.floor(e));t!==this.readFrame&&(this.readFrame=t,this.reset())}pump(e=0){if(this.disposed)return;let t=this.mode_===`worker`?Math.max(this.queueFrames,e):e,n=this.readFrame+t;for(;this.requestedUntil<n;)this.requestedUntil+=this.blockFrames,this.post({type:`render`,frames:this.blockFrames})}read(e,t,n,r){this.pump(r);let i=this.readFrame,a=i+r,o=0;this.blocks=this.blocks.filter(e=>e.start+e.left.length>i);for(let r of this.blocks){let s=Math.max(r.start,i+o);if(s>=a||s>i+o)break;let c=s-r.start,l=Math.min(r.left.length-c,a-s);e.set(r.left.subarray(c,c+l),n+o),t.set(r.right.subarray(c,c+l),n+o),o+=l}if(o<r&&(e.fill(0,n+o,n+r),t.fill(0,n+o,n+r),this.warm)){this.underruns++;let e=(r-o)/this.sampleRate;this.onUnderrun.dispatch(e),iX.dispatch({source:`core`,lateSeconds:e})}return this.readFrame=a,this.pump(0),r}dispose(){this.disposed=!0,this.link?.terminate(),this.link=null,this.blocks=[]}openWorker(){let e=`const createCoreRunner = ${YX.toString()};(${XX.toString()})(createCoreRunner);`;try{this.link=pG(e,{message:e=>this.onWorkerMessage(e),fail:e=>{this.disposed||(this.link?.terminate(),this.link=null,this.goInline(e.message))}})}catch(e){this.link=null,this.fallbackReason=e instanceof Error?e.message:String(e);return}this.link?(this.mode_=`worker`,this.link.post({type:`init`,factory:this.factorySource,sampleRate:this.sampleRate})):this.fallbackReason=`no Web Worker or worker_threads here`}goInline(e){this.mode_=`inline`,this.fallbackReason=e;try{this.runner=YX(this.factorySource,this.sampleRate)}catch(t){this.runner=null,this.failure=t instanceof Error?t:Error(String(t)),this.fallbackReason=`${e}; the core also failed here: ${this.failure.message}`;return}this.blocks=[],this.runner.handle({type:`reset`,frame:this.readFrame}),this.requestedUntil=this.readFrame}onWorkerMessage(e){if(e.type!==`ready`){if(e.type===`error`)this.link?.terminate(),this.link=null,this.goInline(String(e.message));else if(e.type===`block`){let t=e;this.noteLoad(t),this.blocks.push(t),this.warm=!0}}}noteLoad(e){let t=e.left.length/this.sampleRate*1e3,n=e.renderMs/t;this.load=this.load===0?n:this.load*.9+n*.1}send(e){this.post({type:`events`,events:[e]})}post(e){if(this.disposed)return;if(this.mode_===`worker`&&this.link){this.link.post(e,[]);return}let t=this.runner?.handle(e);t&&(this.noteLoad(t),this.blocks.push(t),this.warm=!0)}},QX=class{constructor(e,t,n={}){this.onended=null,this.volume_=1,this.loop_=!1,this.rate_=1,this.position_=0,this.paused_=!0,this.ended_=!1,this.context=e,this.source=t,this.options=n,this.channel=new oX(e,n.destination,n.channel),this.channel.onEnded.add(()=>{this.ended_=!0,this.paused_=!0,this.position_=this.duration,this.onended&&this.onended(typeof Event==`function`?new Event(`ended`):{})})}get duration(){return this.source.length===void 0?1/0:this.source.length/this.source.sampleRate}get paused(){return this.paused_}get ended(){return this.ended_}get currentTime(){return this.ended_?Number.isFinite(this.duration)?this.duration:this.position_:this.channel.isPlaying?this.channel.position():this.position_}set currentTime(e){let t=Math.max(0,Number(e)||0);this.ended_=!1,this.channel.isPlaying?this.channel.seek(t):this.position_=t}get volume(){return this.volume_}set volume(e){this.volume_=Math.min(1,Math.max(0,e)),this.channel.update({volume:this.volume_})}get loop(){return this.loop_}set loop(e){e!==this.loop_&&(this.loop_=e,this.channel.isPlaying&&this.start(this.channel.position()))}get playbackRate(){return this.rate_}set playbackRate(e){e>0&&(this.rate_=e,this.channel.update({pitch:e}))}async play(){this.context.state===`suspended`&&await this.context.resume(),this.ended_&&(this.position_=0),this.ended_=!1,this.paused_=!1,this.start(this.position_)}pause(){this.paused_||(this.position_=this.channel.isPlaying?this.channel.position():this.position_,this.paused_=!0,this.channel.stop())}start(e){this.channel.play(this.source,{volume:this.volume_,pitch:this.rate_,pos:e,repeat:this.loop_,loop:this.options.loopRegion,endAfterSeconds:this.options.endAfterSeconds,endFadeSeconds:this.options.endFadeSeconds})}},$X=class{constructor(e=[]){this.definitions=new Map;for(let t of e)this.define(t)}define(e){if(!e.id)throw Error(`a sound effect needs an id`);this.definitions.set(e.id,e)}has(e){return this.definitions.has(e)}get(e){let t=this.definitions.get(e);if(!t)throw Error(`no sound effect "${e}" in the bank`);return t}ids(){return[...this.definitions.keys()]}},eZ=class{constructor(e={}){this.voices=[],this.maxVoices=Math.max(1,Math.floor(e.maxVoices??8))}get active(){return this.voices.length}request(e,t,n=()=>!0){for(let e=this.voices.length-1;e>=0;e--)this.voices[e].active()||this.voices.splice(e,1);if(this.voices.length>=this.maxVoices){let t=0;for(let e=1;e<this.voices.length;e++)this.voices[e].priority<this.voices[t].priority&&(t=e);if(this.voices[t].priority>e)return null;let[n]=this.voices.splice(t,1);n.stop()}let r={priority:e,stop:t,active:n};return this.voices.push(r),{release:()=>{let e=this.voices.indexOf(r);e!==-1&&this.voices.splice(e,1)}}}};function tZ(e,t,n=0){let r=2166136261,i=e=>{r=Math.imul(r^e&255,16777619),r=Math.imul(r^e>>>8&255,16777619),r=Math.imul(r^e>>>16&255,16777619),r=Math.imul(r^e>>>24&255,16777619)};for(let t=0;t<e.length;t++)i(e.charCodeAt(t));return i(Math.floor(t)),i(n),r>>>0}var nZ=class{constructor(e,t,n={}){if(this.plays=0,this.live=[],this.suspended_=!1,this.lastFrame=NaN,this.ordinal=0,this.backend=e,this.options=n,this.volume=n.volume??1,typeof t==`string`){if(!n.bank)throw Error(`a sound effect given by id ("${t}") needs a bank`);this.definition=n.bank.get(t)}else this.definition=t}get isSuspended(){return this.suspended_}get activeVoices(){return this.prune(),this.live.length}play(e=1,t=1,n=0){if(this.suspended_)return!1;this.prune();let r=this.definition.retrigger??`restart`;if(this.live.length>0&&r===`ignore`)return!1;this.live.length>0&&r===`restart`&&this.stopAll();let i=this.options.frame?.()??0;this.ordinal=i===this.lastFrame?this.ordinal+1:0,this.lastFrame=i;let a=null,o=this.options.arbiter?.request(this.definition.priority??0,()=>{a?.stop()},()=>a?.active??!0)??null;if(this.options.arbiter&&!o)return!1;if(a=this.backend.play(this.definition,{gain:Math.max(0,Math.min(1,e*this.volume)),pan:Math.max(-1,Math.min(1,n)),pitch:t,seed:tZ(this.definition.id,i,this.ordinal)}),!a)return o?.release(),!1;this.live.push({voice:a,grant:o}),this.plays++;let s=this.definition.caption??this.options.caption;return s&&Vq.dispatch({text:s}),!0}stopAll(){for(let{voice:e,grant:t}of this.live.splice(0))e.stop(),t?.release()}suspend(){this.suspended_=!0,this.stopAll()}resume(){this.suspended_=!1}prune(){for(let e=this.live.length-1;e>=0;e--)this.live[e].voice.active||(this.live[e].grant?.release(),this.live.splice(e,1))}};function rZ(e,t={}){let n=t.refDistance??1,r=t.maxDistance??1/0,i=t.rolloff??1;if(!(e>n))return 1;if(!(e<r))return 0;let a=(n/e)**+i;return Math.max(0,Math.min(1,a))}function iZ(e,t){let n=t.x-e.x,r=t.y-e.y,i=Math.hypot(n,r);if(i===0)return 0;let a=Math.sin(e.facing),o=Math.cos(e.facing),s=(n*a+r*o)/i;return Math.max(-1,Math.min(1,s))}var aZ=class{constructor(e={}){this.x=e.x??0,this.y=e.y??0,this.facing=e.facing??0}moveTo(e,t){this.x=e,this.y=t}face(e){this.facing=e}},oZ=class{constructor(e,t={}){this.sound=e,this.x=t.x??0,this.y=t.y??0,this.falloff={refDistance:t.refDistance,maxDistance:t.maxDistance,rolloff:t.rolloff}}moveTo(e,t){this.x=e,this.y=t}gainTo(e){return rZ(Math.hypot(this.x-e.x,this.y-e.y),this.falloff)}panTo(e){return iZ(e,this)}playFor(e){let t=this.gainTo(e);return t<=0?0:(this.sound.play(t,1,`facing`in e?this.panTo(e):0),t)}};jJ(),PJ();var sZ=256,cZ=64,lZ=10,uZ=2,dZ=.05,fZ=4,pZ=96;function mZ(e,t){if(e.length===0||t<=0)return[];let n=sZ/2,r=new Float32Array(e.length+256);r.set(e,n);let i=new Float64Array(sZ);for(let e=0;e<sZ;e++)i[e]=.5-.5*Math.cos(2*Math.PI*e/255);let a=new Float64Array(sZ),o=new Float64Array(sZ),s=new Float64Array(sZ/2),c=[],l=[],u=0;for(let e=0;e+sZ<=r.length;e+=cZ){let t=0;for(let n=0;n<sZ;n++)a[n]=r[e+n]*i[n],o[n]=0,t+=a[n]*a[n];l.push(u===0?t===0?0:1/0:t/u-1),u=t,OX(a,o);let n=0;for(let e=0;e<sZ/2;e++){let t=Math.hypot(a[e],o[e]),r=t-s[e];r>0&&(n+=r),s[e]=t}c.push(n)}let d=[],f=-1/0;for(let e=0;e<c.length;e++){let r=Math.max(0,e-lZ),i=Math.min(c.length-1,e+lZ),a=i-r+1,o=0;for(let e=r;e<=i;e++)o+=c[e];o/=a;let s=0;for(let e=r;e<=i;e++)s+=(c[e]-o)**2;let u=o+uZ*Math.sqrt(s/a);if(c[e]<=0||c[e]<u||l[e]<dZ&&(e===0||l[e-1]<dZ)||e>0&&c[e-1]>c[e]||e+1<c.length&&c[e+1]>=c[e]||e-f<fZ)continue;let p=(e*cZ+n-pZ)/t;d.push(Math.max(0,p)),f=e}return d}rJ();var hZ=`extracted`,gZ=[4,4],_Z=120,vZ=120,yZ=480;function bZ(e){let t=[...e].sort((e,t)=>e-t),n=t.length>>1;return t.length%2==1?t[n]:(t[n-1]+t[n])/2}function xZ(e){return Math.round(bZ(e))}function SZ(e){for(let t of e.events)if(t.type===`tempo`)return Math.round(6e7/t.microsecondsPerQuarter*100)/100;return _Z}function CZ(e){return e.events.filter(e=>e.type===`noteOn`)}function wZ(e){return CZ(e).map(e=>e.velocity)}function TZ(e,t,n,r,i){let a=e.map((e,t)=>({subdivisionIndex:t,timeOffsetTicks:e.time.length>0?xZ(e.time):0,velocityFactor:e.velocity.length>0?i(e):1}));return{name:hZ,timeSignature:[...gZ],ppq:n,tempoBpm:r,subdivision:t,offsets:a}}var EZ=class{async extractFromMidiPair(e,t,n=`16n`){let r=t.ticksPerQuarter,i=eJ(r,n),a=$q(gZ,n),o=r/e.ticksPerQuarter,s=CZ(e).map(e=>({channel:e.channel,note:e.note,tick:e.tick*o,velocity:e.velocity})),c=new Set,l=[];for(let e of CZ(t)){let t=-1,n=1/0;for(let r=0;r<s.length;r++){let i=s[r];if(c.has(r)||i.channel!==e.channel||i.note!==e.note)continue;let a=Math.abs(i.tick-e.tick);a<n&&(n=a,t=r)}t<0||n>i/2||(c.add(t),l.push({slotTick:s[t].tick,delta:e.tick-s[t].tick,factor:s[t].velocity>0?e.velocity/s[t].velocity:null}))}let u=Array.from({length:a},()=>({time:[],velocity:[]}));for(let e of l){let t=(Math.round(e.slotTick/i)%a+a)%a;u[t].time.push(e.delta),e.factor!==null&&u[t].velocity.push(e.factor)}return TZ(u,n,r,SZ(t),e=>bZ(e.velocity))}async extractFromSingleMidi(e,t=`16n`){let n=e.ticksPerQuarter,r=eJ(n,t),i=$q(gZ,t),a=Array.from({length:i},()=>({time:[],velocity:[]}));for(let t of CZ(e)){let e=Math.round(t.tick/r)*r,n=(Math.round(e/r)%i+i)%i;a[n].time.push(t.tick-e),a[n].velocity.push(t.velocity)}let o=bZ(wZ(e));return TZ(a,t,n,SZ(e),e=>o<=0?1:bZ(e.velocity)/o)}async extractFromAudioBuffer(e,t=`16n`,n=vZ){if(!Number.isFinite(n)||n<=0)throw Error(`tempoBpm must be greater than 0, got ${String(n)}`);let r=[];for(let t=0;t<e.numberOfChannels;t++)r.push(e.getChannelData(t));let i=new Float32Array(e.length);for(let e of r)for(let t=0;t<e.length;t++)i[t]+=e[t]/r.length;let a=mZ(i,e.sampleRate);if(a.length===0)throw Error(`no onsets detected in the buffer - a groove needs audible attacks, and this audio has none`);let o=yZ,s=eJ(o,t),c=$q(gZ,t),l=n*o/60,u=Array.from({length:c},()=>({time:[],velocity:[]}));for(let e of a){let t=e*l,n=Math.round(t/s)*s;u[(Math.round(n/s)%c+c)%c].time.push(t-n)}return TZ(u,t,o,n,()=>1)}};rJ();var DZ=`mwg-groove:`,OZ=36,kZ=64,AZ=[`8n`,`16n`,`32n`],jZ=new TextEncoder;function MZ(e){throw Error(`the ${e} format is not shipped: it is an undocumented proprietary container, and a guessed reader could load a different groove than the file holds`)}function NZ(e){return[...e].map(e=>e.charCodeAt(0)&127)}function PZ(e){let t=[e&127],n=e>>>7;for(;n>0;)t.unshift(n&127|128),n>>>=7;return t}function FZ(e,t){return[255,e,...PZ(t.length),...t]}function IZ(e){tJ(e);let{name:t,timeSignature:n,ppq:r,subdivision:i,offsets:a}=e,o=$q(n,i),s=eJ(r,i);if(r>32767)throw Error(`groove template "${t}": ppq ${r} does not fit MIDI's 15-bit division`);if(OZ+o-1>127)throw Error(`groove template "${t}": ${o} slots need pitches up to ${OZ+o-1}, past MIDI's top note of 127`);let c=Math.round(6e7/e.tempoBpm);if(c<1||c>16777215)throw Error(`groove template "${t}": tempoBpm ${e.tempoBpm} does not fit MIDI's three-byte tempo (${c} microseconds)`);a.forEach((e,n)=>{if(Math.abs(e.timeOffsetTicks)>=s)throw Error(`groove template "${t}": slot ${n} is offset by ${e.timeOffsetTicks} ticks, outside the +/-${s} the MIDI encoding's one-slot anchor can tell from a slot shift`);let r=Math.round(kZ*e.velocityFactor);if(r<1||r>127)throw Error(`groove template "${t}": slot ${n} has velocityFactor ${e.velocityFactor}, outside the ${1/kZ} to ${127/kZ} the MIDI encoding can store at ${1/kZ} per velocity unit`)});let l=[{tick:0,bytes:FZ(81,[c>>16&255,c>>8&255,c&255])},{tick:0,bytes:FZ(88,[n[0],Math.log2(n[1]),24,8])},{tick:0,bytes:FZ(1,[...jZ.encode(DZ+t)])}];a.forEach((e,t)=>{let n=s*(t+1)+e.timeOffsetTicks,r=n+Math.max(1,Math.floor(s/4));l.push({tick:n,bytes:[144,OZ+t,Math.round(kZ*e.velocityFactor)]}),l.push({tick:r,bytes:[128,OZ+t,0]})}),l.sort((e,t)=>e.tick-t.tick);let u=[],d=0;for(let e of l)u.push(...PZ(e.tick-d),...e.bytes),d=e.tick;return u.push(0,255,47,0),new Uint8Array([...NZ(`MThd`),0,0,0,6,0,0,0,1,r>>8&255,r&255,...NZ(`MTrk`),u.length>>>24&255,u.length>>>16&255,u.length>>>8&255,u.length&255,...u])}function LZ(e,t){for(let n of AZ)try{if($q(e,n)===t)return n}catch{}throw Error(`a ${t}-slot groove in ${e[0]}/${e[1]} is not one of the 8n, 16n or 32n grids`)}function RZ(e){let t=typeof e==`string`?jZ.encode(e):e,n=new DataView(t.buffer,t.byteOffset,t.byteLength),r=0,i=(e,n)=>{if(r+e>t.length)throw Error(`truncated MIDI file while reading ${n}`)},a=(e,n)=>{i(e,n);let a=``;for(let n=0;n<e;n++)a+=String.fromCharCode(t[r+n]);return r+=e,a},o=e=>(i(1,e),t[r++]),s=e=>{i(2,e);let t=n.getUint16(r);return r+=2,t},c=e=>{i(4,e);let t=n.getUint32(r);return r+=4,t},l=e=>{let t=0;for(let n=0;n<4;n++){let n=o(e);if(t=t<<7|n&127,!(n&128))return t}throw Error(`a variable-length quantity in ${e} runs past four bytes`)};if(a(4,`the file header`)!==`MThd`)throw Error(`not a Standard MIDI File: the MThd header is missing`);let u=c(`the header length`);if(u<6)throw Error(`MThd is ${u} bytes, expected at least 6`);let d=s(`the format`),f=s(`the track count`),p=s(`the division`);if(r+=u-6,d>1)throw Error(`MIDI format ${d} is not a file this reader understands`);if(p&32768)throw Error(`SMPTE time in the division carries no tick grid to read a groove from`);if(f!==1)throw Error(`an mwg groove file holds one track, this one has ${f}`);if(a(4,`the track header`)!==`MTrk`)throw Error(`the MTrk track header is missing`);let m=c(`the track length`),h=r+m;if(h>t.length)throw Error(`truncated MIDI file: the track runs past the end of the data`);let g=0,_=0,v=null,y=null,b=null,x=!1,S=new Map;for(;r<h;){g+=l(`a delta time`);let e=t[r];if(e<128){if(_===0)throw Error(`data at tick ${g} follows a delta time with no running status to read it under`);e=_}else r++,e<240&&(_=e);if(e===255){let e=o(`a meta type`),n=l(`a meta length`);i(n,`a meta event`);let a=r;if(e===81&&n===3)v=t[a]<<16|t[a+1]<<8|t[a+2];else if(e===88&&n>=2)y=[t[a],2**t[a+1]];else if((e===1||e===3)&&n>0){let e=``;for(let r=0;r<n;r++)e+=String.fromCharCode(t[a+r]);e.startsWith(DZ)&&(b=e.slice(11))}r+=n,e===47&&(x=!0),_=0;continue}if(e===240||e===247){r+=l(`a sysex length`),_=0;continue}let n=e&240;if(n===144||n===128){let e=o(`a note number`),t=o(`a note velocity`);if(n===144&&t>0){if(S.has(e))throw Error(`pitch ${e} carries more than one note-on, which no groove encodes`);S.set(e,{tick:g,velocity:t})}}else if(n===176||n===224)i(2,`a controller or bend event`),r+=2;else if(n===192||n===208)i(1,`a program or channel-aftertouch event`),r+=1;else throw Error(`unexpected status byte 0x${e.toString(16)} at tick ${g}`)}if(!x)throw Error(`the track has no end-of-track meta, so the file is incomplete`);if(b===null)throw Error(`no ${DZ} text meta: this file was not written as a groove`);if(y===null)throw Error(`no time-signature meta: an mwg groove file always carries one`);let C=p,ee=S.size,w=LZ(y,ee),T=eJ(C,w),E=[];for(let e=0;e<ee;e++){let t=S.get(OZ+e);if(!t)throw Error(`slot ${e} is missing: expected a note on pitch ${OZ+e}`);E.push({subdivisionIndex:e,timeOffsetTicks:t.tick-T*(e+1),velocityFactor:t.velocity/kZ})}let te={name:b,timeSignature:y,ppq:C,tempoBpm:v===null?120:Math.round(6e7/v*100)/100,subdivision:w,offsets:E};return tJ(te),te}function zZ(e){let t=typeof e==`string`?e:new TextDecoder().decode(e),n;try{n=JSON.parse(t)}catch(e){throw Error(`not valid JSON: ${e instanceof Error?e.message:String(e)}`)}if(typeof n!=`object`||!n||Array.isArray(n))throw Error(`a groove JSON export must be an object`);return tJ(n),n}var BZ=class{async exportFormat(e,t){switch(t){case`json`:return tJ(e),JSON.stringify(e,null,2);case`midi`:return IZ(e);case`ableton-agr`:case`reaper-groove`:return MZ(t);default:throw Error(`unknown groove format: ${String(t)}`)}}async importFormat(e,t){switch(t){case`json`:return zZ(e);case`midi`:return RZ(e);case`ableton-agr`:case`reaper-groove`:return MZ(t);default:throw Error(`unknown groove format: ${String(t)}`)}}},VZ=l({AdaptiveMusic:()=>JX,AudioBus:()=>uX,AudioCoreHost:()=>ZX,AudioListener:()=>aZ,AudioSettings:()=>PX,Channel:()=>cX,DEFAULT_DECODER_LIMITS:()=>_X,DecodeBudgetError:()=>vX,GrooveConverter:()=>BZ,GrooveExtractor:()=>EZ,GrooveHumanizer:()=>NJ,HumanizerFactory:()=>FJ,INTERNAL_MIDI_ENGINES:()=>TY,InstructionBudget:()=>xX,LiteHumanizer:()=>AJ,MidiPlayer:()=>qJ,Music:()=>nX,MusicPlayer:()=>dX,Orchestrator:()=>rX,SfxArbiter:()=>eZ,SfxBank:()=>$X,SfxSound:()=>nZ,Sound:()=>Hq,SoundSource:()=>oZ,StreamChannel:()=>oX,StreamPlayable:()=>QX,SyxBank:()=>HX,TrackCache:()=>Wq,assertGrooveTemplate:()=>tJ,assertInputSize:()=>bX,audioGain:()=>rZ,audioPan:()=>iZ,bufferBytes:()=>Uq,channelEnvelopes:()=>WX,collectSoundFontUsage:()=>uY,connectWebMidi:()=>FX,createAudio:()=>zq,createAudioLoader:()=>eX,createBudgetedLoader:()=>Gq,decodeSoundFont:()=>xY,decodeWav:()=>DX,decoderLimits:()=>yX,dx7PatchNames:()=>VX,dynamicsLimit:()=>NX,encodeWav:()=>wX,fitToBudget:()=>QY,guardBlockSource:()=>CX,humanizeMidi:()=>IJ,inflateBounded:()=>SX,loadSoundFont:()=>SY,loopRegionFromFile:()=>hX,loopRegionFromTags:()=>mX,mergeSoundFonts:()=>yY,midiLoopStart:()=>UJ,midiSynthNames:()=>AY,missingSoundFontPrograms:()=>dY,noteToFrequency:()=>KJ,onAudioUnderrun:()=>iX,onCaption:()=>Vq,onMidiSynthFallback:()=>EY,parseMidi:()=>zJ,parseSoundFont:()=>lY,parseVorbisLoopTags:()=>pX,playTone:()=>qq,regionPlaybackRate:()=>jX,registerMidiSynth:()=>OY,renderMidiStems:()=>YY,renderMidiThroughSynth:()=>LY,renderMidiToBuffer:()=>HY,renderMidiToBufferAsync:()=>GY,requestWebMidiInput:()=>IX,resampleStereo:()=>ZY,resolveMidiSynth:()=>jY,scheduleMidi:()=>WJ,sfxSeed:()=>tZ,softenCutoff:()=>MX,spectralDistance:()=>AX,splitSysex:()=>LX,subdivisionCount:()=>$q,subsetSoundFont:()=>CY,synthesizeSound:()=>Jq,synthesizeTone:()=>Kq,timedMidiMessages:()=>GJ,toAudioBuffer:()=>XY,trackerNoteName:()=>KX,trackerPattern:()=>qX,unregisterMidiSynth:()=>kY,wavInfo:()=>EX,waveformEnvelope:()=>UX,webAudioSampleDecoder:()=>$J});rJ();function HZ(e,t){if(!Number.isSafeInteger(t)||t<0)throw RangeError(`Turn budget must be a non-negative safe integer`);let n=0;for(;n<t;){if(e.finished())return{status:`finished`,steps:n};let t=e.scheduler.peek();if(t===null)return{status:`empty`,steps:n};if(e.needsInput(t))return{status:`input`,actor:t,steps:n};let r=e.act(t);if(r!==null){if(!Number.isFinite(r)||r<0)throw RangeError(`Action cost must be finite and non-negative, or null`);e.scheduler.spend(r)}n++}return{status:`limit`,steps:n}}function UZ(e){if(e?.version!==1||typeof e.observationVersion!=`string`||!e.observationVersion.length)throw TypeError(`unsupported neural model or observation version`);if(!Array.isArray(e.layers)||!e.layers.length||e.layers.length>32)throw RangeError(`a neural model needs 1..32 layers`);let t=0;for(let n=0;n<e.layers.length;n++){let r=e.layers[n];if(!r||!Number.isInteger(r.inputSize)||!Number.isInteger(r.outputSize)||r.inputSize<1||r.outputSize<1||r.inputSize>4096||r.outputSize>4096)throw RangeError(`neural layer dimensions must be integers in 1..4096`);if(t+=r.inputSize*r.outputSize+r.outputSize,t>1e6)throw RangeError(`neural model exceeds one million parameters`);if(n&&e.layers[n-1].outputSize!==r.inputSize)throw RangeError(`neural layer dimensions do not connect`);if(!Array.isArray(r.weights)||!Array.isArray(r.biases)||r.weights.length!==r.inputSize*r.outputSize||r.biases.length!==r.outputSize||!Array.from(r.weights).every(Number.isFinite)||!Array.from(r.biases).every(Number.isFinite))throw TypeError(`neural weights and biases must be finite and match layer dimensions`)}let n=e.layers.map(e=>({...e,weights:Float64Array.from(e.weights),biases:Float64Array.from(e.biases),buffer:new Float64Array(e.outputSize)})),r=(e,t)=>{if(e.length!==n[0].inputSize)throw TypeError(`neural input must be finite and match the model`);for(let t=0;t<e.length;t++)if(!Number.isFinite(e[t]))throw TypeError(`neural input must be finite`);let r=n[n.length-1];if(t&&t.length!==r.outputSize)throw RangeError(`neural output buffer has the wrong size`);let i=e;for(let e=0;e<n.length;e++){let t=n[e];for(let r=0;r<t.outputSize;r++){let a=t.biases[r];for(let e=0;e<t.inputSize;e++)a+=t.weights[r*t.inputSize+e]*i[e];if(!Number.isFinite(a))throw RangeError(`neural activation overflow`);t.buffer[r]=e===n.length-1?a:Math.max(0,a)}i=t.buffer}let a=t??new Float64Array(r.outputSize);return a.set(r.buffer),a},i=new Float64Array(n[n.length-1].outputSize);return{predict:r,select(e,t){let n=e.mask;if(n&&(n.length!==i.length||!Array.from(n).every(e=>typeof e==`boolean`)))throw TypeError(`neural action mask must contain one boolean per output`);r(e.input,i);let a=null;for(let e=0;e<i.length;e++)(!n||n[e])&&(a===null||i[e]>i[a])&&(a=e);if(a===null||!t)return a;let o=t();if(!Number.isFinite(o)||o<0||o>=1)throw RangeError(`sampling random must return a value in [0, 1)`);let s=0;for(let e=0;e<i.length;e++)(!n||n[e])&&(s+=Math.exp(i[e]-i[a]));let c=o*s;for(let e=0;e<i.length;e++)if((!n||n[e])&&(c-=Math.exp(i[e]-i[a]),c<0))return e;return a}}}function WZ(e,t,n){let r=Function(`return (${e});`)()(t);return n.map(e=>r.predict(e))}var GZ=class{constructor(e){this.evaluator=UZ(e),this.model=structuredClone(e)}predict(e,t){return this.evaluator.predict(e,t)}selectAction(e,t){return this.evaluator.select(e,t)}exportModel(){return structuredClone(this.model)}behavior(e,t,n,r=!1){if(t.length!==this.model.layers[this.model.layers.length-1].outputSize)throw RangeError(`neural action mapping must match output size`);let i=structuredClone(t);return{id:e,decide:e=>{e.checkpoint();let t=this.selectAction(n(e.perception),r?e.random:void 0);return t===null?null:structuredClone(i[t])}}}predictBatchAsync(e,t={}){let n=this.model.layers[0].inputSize,r=this.model.layers[this.model.layers.length-1].outputSize;if(e.length>65536||e.length*Math.max(n,r)>1e6)return Promise.reject(RangeError(`neural batch exceeds its observation or value limit`));for(let t of e)if(!t||t.length!==n)return Promise.reject(TypeError(`neural batch inputs must match the model`));return hG(WZ,[UZ.toString(),this.model,e],t)}};_e();var KZ=class{get truncated(){return!this.terminated&&this.steps>=this.maxSteps}constructor(e,t,n=j){if(this.steps=0,this.terminated=!1,this.ready=!1,this.agentCount=0,this.rules=e,this.Random=n,this.random=new this.Random(0),!Number.isInteger(t.maxSteps)||t.maxSteps<1||t.maxSteps>1e6)throw RangeError(`training maxSteps must be in 1..1000000`);if(typeof e.observationVersion!=`string`||!e.observationVersion.length)throw TypeError(`training requires an observation version`);this.maxSteps=t.maxSteps,this.observationVersion=e.observationVersion}reset(e){if(!Number.isInteger(e)||e<0||e>4294967295)throw RangeError(`training seed must be uint32`);this.random=new this.Random(e),this.state=this.rules.initial(this.random),this.steps=0,this.terminated=this.rules.finished?.(this.state)??!1,this.ready=!0;let t=this.observations();return this.agentCount=t.length,{observations:t,rewards:t.map(()=>0),terminated:this.terminated,truncated:!1}}step(e){if(!this.ready||this.terminated||this.truncated)throw Error(`training episode needs reset before step`);let t=this.observations();if(e.length!==this.agentCount)throw RangeError(`training action count must match the agent roster`);for(let n=0;n<e.length;n++){let r=e[n],i=t[n].mask;if(r===null?!i||i.some(Boolean):!Number.isInteger(r)||r<0||i&&(r>=i.length||!i[r]))throw RangeError(`training action is not legal`)}let n=structuredClone(this.state),r=this.rules.command(this.state,e),i=this.rules.rule(this.state,r,this.random),a=Array.from(this.rules.rewards(n,r,i));if(a.length!==this.agentCount||!a.every(Number.isFinite))throw TypeError(`training rewards must be finite and match the agent roster`);this.state=i.state,this.steps++,this.terminated=i.status===`finished`;let o=this.observations();if(o.length!==this.agentCount)throw RangeError(`training agent roster changed during an episode`);return{observations:o,rewards:a,terminated:this.terminated,truncated:this.truncated}}snapshot(){if(!this.ready)throw Error(`training environment needs reset before snapshot`);return structuredClone({version:1,observationVersion:this.observationVersion,state:this.state,seed:this.random.seed,random:this.random.getState().map(e=>e>>>0),steps:this.steps,maxSteps:this.maxSteps,terminated:this.terminated,truncated:this.truncated})}restore(e){if(e.version!==1||e.observationVersion!==this.observationVersion||e.maxSteps!==this.maxSteps)throw TypeError(`training snapshot version, schema or step limit does not match`);if(!Number.isInteger(e.steps)||e.steps<0||e.steps>this.maxSteps||!Number.isInteger(e.seed)||e.seed<0||e.seed>4294967295||!Array.isArray(e.random)||e.random.length!==4||!e.random.every(e=>Number.isInteger(e)&&e>=0&&e<=4294967295)||!e.random.some(e=>e!==0)||typeof e.terminated!=`boolean`||typeof e.truncated!=`boolean`||e.terminated&&e.truncated||e.truncated!==(!e.terminated&&e.steps===this.maxSteps))throw TypeError(`invalid training snapshot`);this.state=structuredClone(e.state),this.random=new this.Random(e.seed),this.random.setState(e.random),this.steps=e.steps,this.terminated=e.terminated,this.ready=!0;let t=this.observations();return this.agentCount=t.length,{observations:t,rewards:t.map(()=>0),terminated:this.terminated,truncated:this.truncated}}observations(){let e=structuredClone(Array.from(this.rules.observe(this.state)));if(!e.length||e.length>4096)throw RangeError(`training requires 1..4096 agents`);for(let t of e)if(!t.input.length||t.input.length>4096||!Array.from(t.input).every(Number.isFinite)||t.mask&&(!t.mask.length||t.mask.length>4096||!Array.from(t.mask).every(e=>typeof e==`boolean`)))throw TypeError(`invalid training observation`);return e}};function qZ(e,t,n){return JZ(n),YZ(e,t,n,{Generator:j,createNeuralEvaluator:UZ})}function JZ(e){let t=e.trajectoryLimit??0;if(!e.seeds.length||e.seeds.length>1e4||!Array.from(e.seeds).every(e=>Number.isInteger(e)&&e>=0&&e<=4294967295)||!Number.isInteger(t)||t<0||t*e.seeds.length>1e4)throw RangeError(`rollouts require 1..10000 uint32 seeds and at most 10000 stored transitions`)}function YZ(e,t,n,r){if(t.observationVersion!==e.observationVersion)throw TypeError(`model observation schema does not match environment`);let i=n.trajectoryLimit??0,a=r.createNeuralEvaluator(t);return Array.from(n.seeds,t=>{if(n.signal?.aborted)throw n.signal.reason;let o=new r.Generator((t^2654435769)>>>0),s=e.reset(t),c=s.rewards.map(()=>0),l=[],u=0;for(;!s.terminated&&!s.truncated;){if(n.signal?.aborted)throw n.signal.reason;let t=s.observations.map(e=>a.select(e,n.sample?()=>o.float():void 0)),r=e.step(t);for(let e=0;e<c.length;e++)if(c[e]+=r.rewards[e],!Number.isFinite(c[e]))throw RangeError(`training cumulative reward overflow`);l.length<i&&l.push({before:s,actions:t,after:r}),s=r,u++}return{seed:t,steps:u,rewards:c,terminated:s.terminated,truncated:s.truncated,trajectory:l}})}function XZ(e,t,n,r){let i=Function(`return (${e[0]});`)(),a=Function(`return (${e[1]});`)(),o=Function(`return (${e[2]});`)(),s=class extends o{constructor(e,t){super(e,t,i)}};return Function(`return (${e[3]});`)()(Function(`return (${e[4]});`)()({TrainingEnvironment:s},t),n,r,{Generator:i,createNeuralEvaluator:a})}async function ZZ(e,t,n,r){let i=r.jobs??4;if(!Number.isInteger(i)||i<1||i>64)throw RangeError(`rollout jobs must be in 1..64`);if(r.signal?.aborted)throw r.signal.reason;let a=r.trajectoryLimit??0;JZ(r),UZ(n);let o=new AbortController,s=()=>o.abort(r.signal?.reason);r.signal?.addEventListener(`abort`,s,{once:!0});let c=[j.toString(),UZ.toString(),KZ.toString(),YZ.toString(),e.toString()],l=Math.min(i,r.seeds.length);try{return(await Promise.all(Array.from({length:l},(e,i)=>{let s=Math.floor(i*r.seeds.length/l),u=Math.floor((i+1)*r.seeds.length/l),d=r.seeds.slice(s,u);return hG(XZ,[c,t,n,{seeds:d,sample:r.sample,trajectoryLimit:a}],{signal:o.signal,timeout:r.timeout})}))).flat()}finally{o.abort(),r.signal?.removeEventListener(`abort`,s)}}function QZ(e,t){let n=[...t.actions];if(!n.length||n.some(e=>typeof e!=`string`))throw TypeError(`imitation needs the recorded action names in policy order`);let r=pn(t.events),i=e.reset(t.seed);if(i.observations.length!==1)throw Error(`imitation trains the recorded player alone: the environment must expose one agent`);let a=[],o=i,s=0;for(let t of r){if(o.terminated||o.truncated)break;let r=n.indexOf(t.action);if(r<0)throw Error(`a recorded action ${JSON.stringify(t.action)} is not in the action list`);a.push({observation:o.observations[0],action:r,frame:t.frame}),o=e.step([r]),s++}return{samples:a,steps:s,terminated:o.terminated,truncated:o.truncated}}function $Z(e,t,n){let r=e.reset(n.seed),i=r.rewards.map(()=>0),a=[],o=0;for(;!r.terminated&&!r.truncated;){let n=t(r.observations);if(!Array.isArray(n)||n.length!==r.observations.length)throw RangeError(`the seeded-run chooser must return one action per agent`);a.push([...n]);let s=e.step(n);for(let e=0;e<i.length;e++)if(i[e]+=s.rewards[e],!Number.isFinite(i[e]))throw RangeError(`seeded-run cumulative reward overflow`);r=s,o++}return{seed:n.seed,steps:o,actions:a,rewards:i,terminated:r.terminated,truncated:r.truncated}}function eQ(e){let t=e.state,n=e.status??`ready`,r=[],i=0;for(let a of e.commands){if(n===`finished`)break;let o=e.step(t,a,e.random);t=o.state,n=o.status;for(let e of o.events)r.push(e);i++}return{state:t,events:r,status:n,processedCommands:i}}var tQ=class e{constructor(e){if(this._reminders=[],this._results={},this.levels=new Map(e.levels.map(e=>[e.id,e])),this.levels.size!==e.levels.length)throw Error(`campaign level ids must be unique`);if(!this.levels.has(e.start))throw Error(`unknown campaign start level: ${e.start}`);this._currentLevel=e.start,this._state=Wt(e.state,`campaign state`)}get currentLevel(){return this._currentLevel}get state(){return structuredClone(this._state)}get reminders(){return[...this._reminders]}get results(){return structuredClone(this._results)}playCurrent(){if(!this._currentLevel)throw Error(`campaign has no current level`);let e=this.levels.get(this._currentLevel);return this.completeCurrent(e.run(this.state,{levelId:e.id}))}completeCurrent(e){if(!this._currentLevel)throw Error(`campaign has no current level`);let t=this._currentLevel,n=Wt(e.state,`level result state`),r=e.result===void 0?void 0:Wt(e.result,`level result`);if(this._state=n,r!==void 0&&(this._results[t]=r),this._reminders=[...e.reminders??[]],e.outcome!==`completed`)this._currentLevel=null;else if(e.next===void 0)throw Error(`campaign level ${t} did not choose a next level`);else{if(e.next!==null&&!this.levels.has(e.next))throw Error(`unknown campaign transition: ${t} -> ${e.next}`);this._currentLevel=e.next}return{...e,state:this.state}}snapshot(){return{currentLevel:this._currentLevel,state:this.state,reminders:this.reminders,results:this.results}}static restore(t,n){let r=t.currentLevel??n.levels[0]?.id;if(!r)throw Error(`campaign restore requires at least one level`);let i=new e({levels:n.levels,start:r,state:t.state});return i._currentLevel=t.currentLevel,i._reminders=[...t.reminders],i._results=Wt(t.results,`snapshot.results`),i}};_e();function nQ(e){let t=new j(e.seed);return{...eQ({state:Wt(e.initialState,`initialState`),commands:e.commands,status:e.status,random:t,step:e.step}),seed:e.seed,random:t.getState()}}_e();function rQ(e,t,n){let r=iQ.restore({...e,journal:[]},n),i=e=>({valid:!1,checked:e.index,state:r.state,journal:r.journal.toJSON(),mismatch:e});for(let e=0;e<t.length;e++){let n=t[e];if(n.sequence!==e)return i({index:e,action:n.action,expectedEvents:n.events,actualEvents:[],reason:`sequence`});let a;try{a=r.dispatch(n.action)}catch(t){return i({index:e,action:n.action,expectedEvents:n.events,actualEvents:[],reason:`execution`,error:t instanceof Error?t.message:String(t)})}if(Rr(a.events)!==Rr(n.events))return i({index:e,action:n.action,expectedEvents:n.events,actualEvents:a.events,reason:`events`})}return n.expectedFinalState!==void 0&&Rr(r.state)!==Rr(n.expectedFinalState)?i({index:t.length,action:t.at(-1)?.action,expectedEvents:[],actualEvents:[],reason:`final-state`}):{valid:!0,checked:t.length,state:r.state,journal:r.journal.toJSON()}}var iQ=class e{constructor(e){this._state=e.state,this._scheduler=e.scheduler,this.random=e.random,this.rule=e.rule,this.actorId=e.actorId,this.recordJournal=e.journal!==null,this.journal=e.journal??new wn,this.actorOf=e.history?.actorOf??null,this.history=e.history?new Or(e.history):null,this.history&&this.history.push(this.historySnapshot())}get scheduler(){return this._scheduler}get state(){return this._state}dispatch(e){let t=this.random.getState(),n=this.rule(this._state,e,{random:this.random,scheduler:this._scheduler}),r;try{r=this.history?Wt(n.state,`state`):null,this.recordJournal&&this.journal.append(e,n.events)}catch(e){throw this.random.setState(t),e}return this._state=n.state,n.cost!=null&&this._scheduler.spend(n.cost),this.history&&this.history.push(this.historySnapshot(r)),n}get canUndo(){return this.history?.canUndo??!1}get canRedo(){return this.history?.canRedo??!1}undo(){if(!this.history||!this.actorOf)return null;let e=this.history.undo();return e?(this.restoreCheckpoint(e),this.snapshot()):null}redo(){if(!this.history||!this.actorOf)return null;let e=this.history.redo();return e?(this.restoreCheckpoint(e),this.snapshot()):null}snapshot(e=1){return{version:e,state:this._state,scheduler:this.scheduler.toJSON(this.actorId),random:this.random.getState(),journal:this.journal.toJSON()}}static restore(t,n){let r=n.random??new j;r.setState(t.random);let i=nH.restore(t.scheduler,n.actorOf);return new e({state:t.state,scheduler:i,random:r,journal:wn.fromJSON(t.journal??[]),rule:n.rule,actorId:n.actorId})}historySnapshot(e=Wt(this._state,`state`)){return{...this.snapshot(),state:e}}restoreCheckpoint(e){if(!this.actorOf)throw Error(`simulation history needs actorOf to restore a checkpoint`);this._state=structuredClone(e.state),this._scheduler=nH.restore(e.scheduler,this.actorOf),this.random.setState(e.random),this.journal.replace(e.journal??[])}},aQ=class e{constructor(e){this.followUps=[],this.runtime=e.runtime,this.queue=new Pr({play:e.play}),this.followUpOf=e.followUp}get locked(){return this.queue.isBusy}submit(e){return this.locked?null:this.commit(e)}update(e){this.queue.update(e),this.drainFollowUps()}cancel(){this.queue.clear(),this.followUps=[]}snapshot(e=1){return this.runtime.snapshot(e)}static restore(t,n){let r=iQ.restore(t,{rule:n.rule,actorOf:n.actorOf,actorId:n.actorId});return new e({runtime:r,play:n.play,followUp:n.followUp})}commit(e){let t=this.runtime.dispatch(e);return this.queue.enqueue(t.events),this.followUpOf&&this.followUps.push(...this.followUpOf(t)),this.drainFollowUps(),t}drainFollowUps(){for(;!this.queue.isBusy&&this.followUps.length>0;){let e=this.followUps.shift();this.commit(e)}}},oQ=class{constructor(e){this.saves=new zt(e)}save(e,t,n){this.saves.save(e,{campaign:t.campaign.snapshot(),world:t.world,simulation:t.simulation?t.simulation.snapshot():null},n)}load(e){return this.saves.load(e)?.state??null}list(){return this.saves.list()}delete(e){this.saves.delete(e)}},sQ=l({Campaign:()=>tQ,CampaignSave:()=>oQ,EventPresentation:()=>aQ,Scheduler:()=>nH,SimulationRuntime:()=>iQ,TrainingEnvironment:()=>KZ,advanceToInput:()=>HZ,imitationFromReplay:()=>QZ,runHeadlessScenario:()=>nQ,runRollouts:()=>qZ,runRolloutsAsync:()=>ZZ,runScenario:()=>eQ,runSeededEpisode:()=>$Z,validateSimulationReplay:()=>rQ}),cQ=d(c(((e,t,n)=>{(function(n,r){typeof e==`object`&&t!==void 0?t.exports=r():typeof define==`function`&&define.amd?define(r):n.JSON5=r()})(n,(function(){"use strict";function e(e,t){return t={exports:{}},e(t,t.exports),t.exports}var t=e(function(e){var t=e.exports=typeof window<`u`&&window.Math==Math?window:typeof self<`u`&&self.Math==Math?self:Function(`return this`)();typeof __g==`number`&&(__g=t)}),n=e(function(e){var t=e.exports={version:`2.6.5`};typeof __e==`number`&&(__e=t)});n.version;var r=function(e){return typeof e==`object`?e!==null:typeof e==`function`},i=function(e){if(!r(e))throw TypeError(e+` is not an object!`);return e},a=function(e){try{return!!e()}catch{return!0}},o=!a(function(){return Object.defineProperty({},"a",{get:function(){return 7}}).a!=7}),s=t.document,c=r(s)&&r(s.createElement),l=function(e){return c?s.createElement(e):{}},u=!o&&!a(function(){return Object.defineProperty(l(`div`),"a",{get:function(){return 7}}).a!=7}),d=function(e,t){if(!r(e))return e;var n,i;if(t&&typeof(n=e.toString)==`function`&&!r(i=n.call(e))||typeof(n=e.valueOf)==`function`&&!r(i=n.call(e))||!t&&typeof(n=e.toString)==`function`&&!r(i=n.call(e)))return i;throw TypeError(`Can't convert object to primitive value`)},f=Object.defineProperty,p={f:o?Object.defineProperty:function(e,t,n){if(i(e),t=d(t,!0),i(n),u)try{return f(e,t,n)}catch{}if(`get`in n||`set`in n)throw TypeError(`Accessors not supported!`);return`value`in n&&(e[t]=n.value),e}},m=function(e,t){return{enumerable:!(e&1),configurable:!(e&2),writable:!(e&4),value:t}},h=o?function(e,t,n){return p.f(e,t,m(1,n))}:function(e,t,n){return e[t]=n,e},g={}.hasOwnProperty,_=function(e,t){return g.call(e,t)},v=0,y=Math.random(),b=function(e){return`Symbol(${e===void 0?``:e})_${(++v+y).toString(36)}`},x=e(function(e){var r=`__core-js_shared__`,i=t[r]||(t[r]={});(e.exports=function(e,t){return i[e]||(i[e]=t===void 0?{}:t)})(`versions`,[]).push({version:n.version,mode:`global`,copyright:`© 2019 Denis Pushkarev (zloirock.ru)`})})(`native-function-to-string`,Function.toString),S=e(function(e){var r=b(`src`),i=`toString`,a=(``+x).split(i);n.inspectSource=function(e){return x.call(e)},(e.exports=function(e,n,i,o){var s=typeof i==`function`;s&&(_(i,`name`)||h(i,`name`,n)),e[n]!==i&&(s&&(_(i,r)||h(i,r,e[n]?``+e[n]:a.join(String(n)))),e===t?e[n]=i:o?e[n]?e[n]=i:h(e,n,i):(delete e[n],h(e,n,i)))})(Function.prototype,i,function(){return typeof this==`function`&&this[r]||x.call(this)})}),C=function(e){if(typeof e!=`function`)throw TypeError(e+` is not a function!`);return e},ee=function(e,t,n){if(C(e),t===void 0)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}},w=`prototype`,T=function(e,r,i){var a=e&T.F,o=e&T.G,s=e&T.S,c=e&T.P,l=e&T.B,u=o?t:s?t[r]||(t[r]={}):(t[r]||{})[w],d=o?n:n[r]||(n[r]={}),f=d[w]||(d[w]={}),p,m,g,_;for(p in o&&(i=r),i)m=!a&&u&&u[p]!==void 0,g=(m?u:i)[p],_=l&&m?ee(g,t):c&&typeof g==`function`?ee(Function.call,g):g,u&&S(u,p,g,e&T.U),d[p]!=g&&h(d,p,_),c&&f[p]!=g&&(f[p]=g)};t.core=n,T.F=1,T.G=2,T.S=4,T.P=8,T.B=16,T.W=32,T.U=64,T.R=128;var E=T,te=Math.ceil,D=Math.floor,O=function(e){return isNaN(e=+e)?0:(e>0?D:te)(e)},ne=function(e){if(e==null)throw TypeError(`Can't call method on `+e);return e},k=function(e){return function(e,t){var n=String(ne(e)),r=O(t),i=n.length,a,o;return r<0||r>=i?void 0:(a=n.charCodeAt(r),a<55296||a>56319||r+1===i||(o=n.charCodeAt(r+1))<56320||o>57343?a:(a-55296<<10)+(o-56320)+65536)}}(!1);E(E.P,`String`,{codePointAt:function(e){return k(this,e)}}),n.String.codePointAt;var A=Math.max,re=Math.min,ie=function(e,t){return e=O(e),e<0?A(e+t,0):re(e,t)},ae=String.fromCharCode,oe=String.fromCodePoint;E(E.S+E.F*(!!oe&&oe.length!=1),`String`,{fromCodePoint:function(e){for(var t=arguments,n=[],r=arguments.length,i=0,a;r>i;){if(a=+t[i++],ie(a,1114111)!==a)throw RangeError(a+` is not a valid code point`);n.push(a<65536?ae(a):ae(((a-=65536)>>10)+55296,a%1024+56320))}return n.join(``)}}),n.String.fromCodePoint;var se={Space_Separator:/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,ID_Start:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,ID_Continue:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/},j={isSpaceSeparator:function(e){return typeof e==`string`&&se.Space_Separator.test(e)},isIdStartChar:function(e){return typeof e==`string`&&(e>=`a`&&e<=`z`||e>=`A`&&e<=`Z`||e===`$`||e===`_`||se.ID_Start.test(e))},isIdContinueChar:function(e){return typeof e==`string`&&(e>=`a`&&e<=`z`||e>=`A`&&e<=`Z`||e>=`0`&&e<=`9`||e===`$`||e===`_`||e===``||e===``||se.ID_Continue.test(e))},isDigit:function(e){return typeof e==`string`&&/[0-9]/.test(e)},isHexDigit:function(e){return typeof e==`string`&&/[0-9A-Fa-f]/.test(e)}},ce,le,ue,de,fe,pe,me,he,ge,_e=function(e,t){ce=String(e),le=`start`,ue=[],de=0,fe=1,pe=0,me=void 0,he=void 0,ge=void 0;do me=xe(),ke[le]();while(me.type!==`eof`);return typeof t==`function`?ve({"":ge},``,t):ge};function ve(e,t,n){var r=e[t];if(typeof r==`object`&&r){if(Array.isArray(r))for(var i=0;i<r.length;i++){var a=String(i),o=ve(r,a,n);o===void 0?delete r[a]:Object.defineProperty(r,a,{value:o,writable:!0,enumerable:!0,configurable:!0})}else for(var s in r){var c=ve(r,s,n);c===void 0?delete r[s]:Object.defineProperty(r,s,{value:c,writable:!0,enumerable:!0,configurable:!0})}}return n.call(e,t,r)}var M,N,ye,be,P;function xe(){for(M=`default`,N=``,ye=!1,be=1;;){P=Se();var e=Ce[M]();if(e)return e}}function Se(){if(ce[de])return String.fromCodePoint(ce.codePointAt(de))}function F(){var e=Se();return e===`
|
|
1387
1387
|
`?(fe++,pe=0):e?pe+=e.length:pe++,e&&(de+=e.length),e}var Ce={default:function(){switch(P){case` `:case`\v`:case`\f`:case` `:case`\xA0`:case``:case`
|
|
1388
1388
|
`:case`\r`:case`\u2028`:case`\u2029`:F();return;case`/`:F(),M=`comment`;return;case void 0:return F(),we(`eof`)}if(j.isSpaceSeparator(P))F();else return Ce[le]()},comment:function(){switch(P){case`*`:F(),M=`multiLineComment`;return;case`/`:F(),M=`singleLineComment`;return}throw Me(F())},multiLineComment:function(){switch(P){case`*`:F(),M=`multiLineCommentAsterisk`;return;case void 0:throw Me(F())}F()},multiLineCommentAsterisk:function(){switch(P){case`*`:F();return;case`/`:F(),M=`default`;return;case void 0:throw Me(F())}F(),M=`multiLineComment`},singleLineComment:function(){switch(P){case`
|
|
1389
1389
|
`:case`\r`:case`\u2028`:case`\u2029`:F(),M=`default`;return;case void 0:return F(),we(`eof`)}F()},value:function(){switch(P){case`{`:case`[`:return we(`punctuator`,F());case`n`:return F(),Te(`ull`),we(`null`,null);case`t`:return F(),Te(`rue`),we(`boolean`,!0);case`f`:return F(),Te(`alse`),we(`boolean`,!1);case`-`:case`+`:F()===`-`&&(be=-1),M=`sign`;return;case`.`:N=F(),M=`decimalPointLeading`;return;case`0`:N=F(),M=`zero`;return;case`1`:case`2`:case`3`:case`4`:case`5`:case`6`:case`7`:case`8`:case`9`:N=F(),M=`decimalInteger`;return;case`I`:return F(),Te(`nfinity`),we(`numeric`,1/0);case`N`:return F(),Te(`aN`),we(`numeric`,NaN);case`"`:case`'`:ye=F()===`"`,N=``,M=`string`;return}throw Me(F())},identifierNameStartEscape:function(){if(P!==`u`)throw Me(F());F();var e=Oe();switch(e){case`$`:case`_`:break;default:if(!j.isIdStartChar(e))throw Pe()}N+=e,M=`identifierName`},identifierName:function(){switch(P){case`$`:case`_`:case``:case``:N+=F();return;case`\\`:F(),M=`identifierNameEscape`;return}if(j.isIdContinueChar(P))N+=F();else return we(`identifier`,N)},identifierNameEscape:function(){if(P!==`u`)throw Me(F());F();var e=Oe();switch(e){case`$`:case`_`:case``:case``:break;default:if(!j.isIdContinueChar(e))throw Pe()}N+=e,M=`identifierName`},sign:function(){switch(P){case`.`:N=F(),M=`decimalPointLeading`;return;case`0`:N=F(),M=`zero`;return;case`1`:case`2`:case`3`:case`4`:case`5`:case`6`:case`7`:case`8`:case`9`:N=F(),M=`decimalInteger`;return;case`I`:return F(),Te(`nfinity`),we(`numeric`,be*(1/0));case`N`:return F(),Te(`aN`),we(`numeric`,NaN)}throw Me(F())},zero:function(){switch(P){case`.`:N+=F(),M=`decimalPoint`;return;case`e`:case`E`:N+=F(),M=`decimalExponent`;return;case`x`:case`X`:N+=F(),M=`hexadecimal`;return}return we(`numeric`,be*0)},decimalInteger:function(){switch(P){case`.`:N+=F(),M=`decimalPoint`;return;case`e`:case`E`:N+=F(),M=`decimalExponent`;return}if(j.isDigit(P))N+=F();else return we(`numeric`,be*Number(N))},decimalPointLeading:function(){if(j.isDigit(P))N+=F(),M=`decimalFraction`;else throw Me(F())},decimalPoint:function(){switch(P){case`e`:case`E`:N+=F(),M=`decimalExponent`;return}if(j.isDigit(P))N+=F(),M=`decimalFraction`;else return we(`numeric`,be*Number(N))},decimalFraction:function(){switch(P){case`e`:case`E`:N+=F(),M=`decimalExponent`;return}if(j.isDigit(P))N+=F();else return we(`numeric`,be*Number(N))},decimalExponent:function(){switch(P){case`+`:case`-`:N+=F(),M=`decimalExponentSign`;return}if(j.isDigit(P))N+=F(),M=`decimalExponentInteger`;else throw Me(F())},decimalExponentSign:function(){if(j.isDigit(P))N+=F(),M=`decimalExponentInteger`;else throw Me(F())},decimalExponentInteger:function(){if(j.isDigit(P))N+=F();else return we(`numeric`,be*Number(N))},hexadecimal:function(){if(j.isHexDigit(P))N+=F(),M=`hexadecimalInteger`;else throw Me(F())},hexadecimalInteger:function(){if(j.isHexDigit(P))N+=F();else return we(`numeric`,be*Number(N))},string:function(){switch(P){case`\\`:F(),N+=Ee();return;case`"`:if(ye)return F(),we(`string`,N);N+=F();return;case`'`:if(!ye)return F(),we(`string`,N);N+=F();return;case`
|
|
@@ -1396,12 +1396,15 @@ fn mainFragment(
|
|
|
1396
1396
|
`+t+`}`}}return r.pop(),i=t,m}function g(e){if(e.length===0)return m(e,!0);var t=String.fromCodePoint(e.codePointAt(0));if(!j.isIdStartChar(t))return m(e,!0);for(var n=t.length;n<e.length;n++)if(!j.isIdContinueChar(String.fromCodePoint(e.codePointAt(n))))return m(e,!0);return e}function _(e){if(r.indexOf(e)>=0)throw TypeError(`Converting circular structure to JSON5`);r.push(e);var t=i;i+=s;for(var n=[],a=0;a<e.length;a++){var o=p(String(a),e);n.push(o===void 0?`null`:o)}var c;if(n.length===0)c=`[]`;else if(s===``)c=`[`+n.join(`,`)+`]`;else{var l=`,
|
|
1397
1397
|
`+i,u=n.join(l);c=`[
|
|
1398
1398
|
`+i+u+`,
|
|
1399
|
-
`+t+`]`}return r.pop(),i=t,c}}}}))}))(),1),
|
|
1400
|
-
`)}),s=null;continue}if(i===`ifdef`||i===`ifndef`){let e=r.has(u);o.push(o.at(-1)===!0&&(i===`ifdef`?e:!e));continue}if(i===`else`){if(o.length<2)throw
|
|
1401
|
-
`),n,t))}function
|
|
1402
|
-
`)return r;r++}}return r}function
|
|
1403
|
-
`,t):e.indexOf(`*/`,t+2);return n<0?e.length:r===`/`?n:n+2}return t}function
|
|
1404
|
-
`?(r++,i=1):i++;return{file:t,line:r,column:i}}function gZ(e,t,n){let r=t.split(/\r?\n/),i=e,a=typeof i?.lineNumber==`number`?i.lineNumber:1,o=typeof i?.columnNumber==`number`?i.columnNumber:1,s=e instanceof Error?e.message:String(e);return s.includes(`'_'`)&&(s+=` (write translatable text as _("..."))`),new ZX({code:`MWL_SYNTAX`,message:s,location:{file:n,line:Math.max(1,a),column:Math.max(1,o)},lineText:r[Math.max(1,a)-1]})}function _Z(e,t,n=e){let r=e.trim(),i=/^_\(\s*([\s\S]*?)\s*\)$/.exec(r),a=i?i[1]:r;if(a.startsWith(`"`)||a.startsWith(`'`)){try{let e=XX.default.parse(a);if(typeof e==`string`)return e}catch{}throw new ZX({code:`MWL_STRING`,message:`unterminated string value`,location:t,lineText:n})}if(i)throw new ZX({code:`MWL_STRING`,message:`_("...") needs a quoted string`,location:t,lineText:n});return r}function vZ(e){return/^_\(\s*["']/.test(e.trim())}function yZ(e){let t=[],n=``,r=!1;for(let i=0;i<e.length;i++){let a=e[i];a===`"`&&(r=!r),/\s/.test(a)&&!r?(n&&t.push(n),n=``):n+=a}return n&&t.push(n),t}function bZ(e){return e.startsWith(`"`)&&e.endsWith(`"`)?e.slice(1,-1):e}function xZ(e,t,n,r,i){return new ZX({code:e,message:t,location:{file:n??`<mwl>`,line:r+1,column:1},lineText:i})}function SZ(e,t,n,r,i){let a=hZ(n,r??`<mwl>`,i);return new ZX({code:e,message:t,location:a,lineText:n.split(/\r?\n/)[a.line-1]})}function CZ(e,t,n,r){if(!Number.isInteger(t.version)||t.version<1)throw Error(`MWL save version must be a positive integer`);let i={format:`mwl-save`,version:t.version,world:e,...n===void 0?{}:{hookState:OZ(n)},...r===void 0?{}:{journal:kZ(r)}};return JSON.stringify(i)}function wZ(e,t){return TZ(e,t).world}function TZ(e,t){let n=JSON.parse(e),r=DZ(n)?n:{format:`mwl-save`,version:1,world:n};if(r.version>t.version)throw Error(`MWL save version ${r.version} is newer than supported version ${t.version}`);let i=EZ(r.world);for(let e=r.version;e<t.version;e++){let n=t.migrations?.[e+1];if(!n)throw Error(`missing MWL save migration to version ${e+1}`);i=EZ(n(i))}return{format:`mwl-save`,version:t.version,world:i,...r.hookState===void 0?{}:{hookState:OZ(r.hookState)},...r.journal===void 0?{}:{journal:kZ(r.journal)}}}function EZ(e){if(!e||typeof e!=`object`)throw Error(`invalid MWL saved world`);Mt(e);let t=e;if(!Number.isInteger(t.turn)||!t.variables||typeof t.variables!=`object`||!t.units||typeof t.units!=`object`)throw Error(`invalid MWL saved world: turn, variables, and units are required`);if(t.status!==void 0&&![`playing`,`won`,`lost`].includes(t.status))throw Error(`invalid MWL saved world status`);return Wt(t,`saved world`)}function DZ(e){return!!e&&typeof e==`object`&&e.format===`mwl-save`&&typeof e.version==`number`&&`world`in e}function OZ(e){if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`invalid MWL hook state`);Mt(e);let t;try{t=JSON.stringify(e)}catch{throw Error(`MWL hook state must be JSON-serialisable`)}let n=JSON.parse(t);if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`invalid MWL hook state`);return n}function kZ(e){try{let t=JSON.stringify(e),n=JSON.parse(t);if(!Array.isArray(n))throw Error();return Mt(n),n}catch{throw Error(`MWL journal must be JSON-serialisable`)}}function AZ(e,t,n={}){let r=e.search(/\s+where\s+/),i=r<0?e:e.slice(0,r),a={...t};if(r>=0)for(let t of e.slice(r).replace(/^\s+where\s+/,``).split(`,`)){let e=/^\s*([A-Za-z_][A-Za-z0-9_.-]*)\s*=\s*(.+)\s*$/.exec(t);if(!e)throw Error(`invalid MWL where binding: ${t}`);let r=new jZ(e[2],a,n.helpers??{});if(a[e[1]]=r.parseOr(),!r.atEnd())throw Error(`invalid MWL where binding: ${t}`)}let o=new jZ(i,a,n.helpers??{}),s=o.parseOr();if(!o.atEnd())throw Error(`unexpected token in MWL condition: ${o.peek()}`);return NZ(s)}var jZ=class{constructor(e,t,n){this.index=0,this.tokens=MZ(e),this.context=t,this.helpers=n}parseOr(){let e=this.parseAnd();for(;this.take(`or`);)e=NZ(e)||NZ(this.parseAnd());return e}parseAnd(){let e=this.parseNot();for(;this.take(`and`);)e=NZ(e)&&NZ(this.parseNot());return e}parseNot(){return this.take(`not`)?!NZ(this.parseNot()):this.parseComparison()}parseComparison(){let e=this.parseAdditive(),t=this.peek();if(![`==`,`~=`,`<`,`<=`,`>`,`>=`].includes(t))return e;this.index++;let n=this.parseAdditive();if(t===`==`)return e===n;if(t===`~=`)return e!==n;if(typeof e!=`number`||typeof n!=`number`)throw Error(`${t} requires numeric operands`);return t===`<`?e<n:t===`<=`?e<=n:t===`>`?e>n:e>=n}parseAdditive(){let e=this.parseMultiplicative();for(;this.peek()===`+`||this.peek()===`-`;){let t=this.tokens[this.index++],n=this.parseMultiplicative();if(typeof e!=`number`||typeof n!=`number`)throw Error(`${t} requires numeric operands`);e=t===`+`?e+n:e-n}return e}parseMultiplicative(){let e=this.parsePrimary();for(;this.peek()===`*`||this.peek()===`/`;){let t=this.tokens[this.index++],n=this.parsePrimary();if(typeof e!=`number`||typeof n!=`number`)throw Error(`${t} requires numeric operands`);if(t===`/`&&n===0)throw Error(`division by zero in MWL condition`);e=t===`*`?e*n:e/n}return e}parsePrimary(){if(this.take(`(`)){let e=this.parseOr();return this.expect(`)`),e}let e=this.tokens[this.index++];if(e===void 0)throw Error(`incomplete MWL condition`);if(/^-?(?:\d+(?:\.\d*)?|\.\d+)$/.test(e))return Number(e);if(e===`true`||e===`yes`)return!0;if(e===`false`||e===`no`)return!1;if(e.startsWith(`"`)||e.startsWith(`'`))return e.slice(1,-1);let t=this.helpers[e];if(t&&this.take(`(`)){let e=[];if(!this.take(`)`)){do e.push(this.parseOr());while(this.take(`,`));this.expect(`)`)}return t(...e)}let n=this.context[e];if(n===void 0)throw Error(`missing MWL condition variable "${e}"`);return n}take(e){return this.peek()===e&&(this.index++,!0)}expect(e){if(!this.take(e))throw Error(`expected "${e}" in MWL condition`)}peek(){return this.tokens[this.index]??`<end>`}atEnd(){return this.index>=this.tokens.length}};function MZ(e){let t=[],n=/\s*(?:("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')|([A-Za-z_][A-Za-z0-9_.-]*)|(-?(?:\d+(?:\.\d*)?|\.\d+))|(==|~=|<=|>=|[()+*/,<>-]))/y,r=0;for(;r<e.length;){n.lastIndex=r;let i=n.exec(e);if(!i)throw Error(`invalid MWL condition near "${e.slice(r)}"`);t.push(i[1]??i[2]??i[3]??i[4]),r=n.lastIndex}return t}function NZ(e){return e!==!1&&e!==0&&e!==``}function PZ(e){let t=new BZ(e),n=t.expression();if(t.skip(),!t.atEnd())throw Error(`invalid MWL expression near "${t.rest()}"`);return n}function FZ(e,t){let n=typeof e==`string`?PZ(e):e;if(n.kind===`number`)return n.value;if(n.kind===`variable`){let e=t[n.name];if(e===void 0||!Number.isFinite(e))throw Error(`missing MWL expression variable "${n.name}"`);return e}let r=FZ(n.left,t),i=FZ(n.right,t);if(n.op===`+`)return r+i;if(n.op===`-`)return r-i;if(n.op===`*`)return r*i;if(n.op===`/`){if(i===0)throw Error(`division by zero in MWL expression`);return r/i}return r**i}var IZ=256,LZ=4096,RZ=/(?:\d+(?:\.\d*)?|\.\d+)/y,zZ=/[A-Za-z_][A-Za-z0-9_.-]*/y,BZ=class{constructor(e){this.index=0,this.depth=0,this.operators=0,this.source=e}expression(){return this.additive()}additive(){let e=this.multiplicative();for(;;){this.skip();let t=this.peek(`+`)?`+`:this.peek(`-`)?`-`:null;if(!t)return e;this.index++,this.operator(),e={kind:`binary`,op:t,left:e,right:this.multiplicative()}}}multiplicative(){let e=this.power();for(;;){this.skip();let t=this.peek(`*`)?`*`:this.peek(`/`)?`/`:null;if(!t)return e;this.index++,this.operator(),e={kind:`binary`,op:t,left:e,right:this.power()}}}power(){let e=this.primary();return this.skip(),this.peek(`^`)&&(this.index++,this.operator(),e={kind:`binary`,op:`^`,left:e,right:this.nested(()=>this.power())}),e}primary(){if(this.skip(),this.peek(`(`)){this.index++;let e=this.nested(()=>this.expression());if(this.skip(),!this.peek(`)`))throw Error(`missing closing parenthesis in MWL expression`);return this.index++,e}let e=this.match(RZ);if(e)return this.index+=e[0].length,{kind:`number`,value:Number(e[0])};let t=this.match(zZ);if(t)return this.index+=t[0].length,{kind:`variable`,name:t[0]};throw Error(`expected number, variable, or parenthesis near "${this.rest()}"`)}match(e){return e.lastIndex=this.index,e.exec(this.source)}nested(e){if(++this.depth>IZ)throw Error(`MWL expression is nested more than ${IZ} deep`);try{return e()}finally{this.depth--}}operator(){if(++this.operators>LZ)throw Error(`MWL expression has more than ${LZ} operators`)}peek(e){return this.source[this.index]===e}skip(){for(;/\s/.test(this.source[this.index]??``);)this.index++}atEnd(){return this.index>=this.source.length}rest(){let e=this.source.slice(this.index,this.index+40);return this.index+40<this.source.length?`${e}...`:e}};function VZ(e){let t=[],n=e=>{t.push(e),e.children.forEach(n)};return e.forEach(n),t}function HZ(e,t){let n=e.attributes[t];if(!n)throw Error(`MWL ${e.tag} is missing ${t}`);return n}function UZ(e,t){let n=e.attributes[t];if(n===void 0)return;let r=Number(n);return Number.isFinite(r)?r:void 0}function WZ(e,t,n){let r=e.attributes[t];if(r===void 0)return n;let i=Number.parseInt(r,10);return Number.isFinite(i)?i:n}function GZ(e,t){return KZ(e.attributes[t])}function KZ(e){return e===void 0?void 0:e===`true`||e===`yes`}function qZ(e,t){return e!==void 0&&t.includes(e)?e:void 0}function JZ(e,t,n){let r=n.carryoverPercentage??80,i=t?e.gold[t.id]??e.sides[t.id]?.gold??0:0;return{result:n.result,gold:Math.floor(i*r/100)+(n.bonus??0),add:n.carryoverAdd??!1,recall:t?Object.entries(e.units).filter(([,e])=>e.alive&&e.side===t.id).map(([e])=>e).sort():[],nextScenario:n.nextScenario??null}}function YZ(e,t){return e.add?t+e.gold:Math.max(t,e.gold)}_e();var XZ=HZ,ZZ=(e,t,n)=>WZ(e,t,n)??n;function QZ(){return{variables:{},units:{},sides:{},maps:{},gold:{},turn:1,status:`playing`,sideStatus:{},map:null,timeOfDay:``,scheduleIndex:0}}var $Z=1048576;function eQ(e){let t=e.split(/\r?\n/).filter(e=>e.trim()!==``).map(e=>e.split(`,`).map(e=>e.trim())),n=t.length,r=t.reduce((e,t)=>Math.max(e,t.length),0);if(r*n>$Z)throw Error(`MWL terrain is ${r}x${n}, more than ${$Z} cells`);let i=[],a={};for(let e=0;e<n;e++)for(let n=0;n<r;n++){let r=t[e]?.[n]??`_off^_usr`,o=/^([A-Za-z0-9_][\w.-]*)\s+(\S.*)$/.exec(r);o?(i.push(o[2]),(a[o[1]]??=[]).push({x:n,y:e})):i.push(r)}return{width:r,height:n,codes:i,starts:a}}var tQ=/\$\(([^)]*)\)/g,nQ=/\$([A-Za-z_][A-Za-z0-9_.]*)/g,rQ=class e{constructor(e,t={}){this.journal=new wn,this.unitTypes=new Map,this.schedule=[],this.pendingDialogue=null,this.dialogueCounter=0,this.traceBatch=null,this.game=e,this.world=t.world??QZ(),this.onMessage=t.onMessage,this.resolveMap=t.resolveMap,this.hooks=t.hooks,this.onTrace=t.onTrace,this.persistence=t.persistence??{version:1},this.random=t.random??new j,!t.random&&this.world.random&&this.random.setState(this.world.random),this.loadUnitTypes(),this.loadSchedule(),this.loadInitialContent(),this.loadInitialUnits(),this.loadLeaders(),this.loadScenarioExtras()}run(e){this.recordAction({type:`run`,trigger:e},()=>this.runInternal(e))}runInternal(e){for(let t of this.nodes(`event`))(t.attributes.on??t.attributes.trigger)===e&&this.eventFiltersMatch(t)&&this.claimEvent(t)&&this.executeTracedEvent(t,e);this.checkObjectives()}fireEvent(e){return this.recordAction({type:`fire_event`,id:e},()=>this.fireEventInternal(e))}fireEventInternal(e){let t=this.nodes(`event`).find(t=>t.attributes.id===e);return!t||!this.eventFiltersMatch(t)||!this.claimEvent(t)?!1:(this.executeTracedEvent(t,`fireEvent`),this.checkObjectives(),!0)}fireMoveto(e){this.recordAction({type:`fire_moveto`,unit:e},()=>this.fireMovetoInternal(e))}fireMovetoInternal(e){let t=this.world.units[e];if(t&&t.alive){for(let n of this.nodes(`event`))(n.attributes.on??n.attributes.trigger)===`moveto`&&(n.attributes.x===void 0||wQ(n.attributes.x,t.x))&&(n.attributes.y===void 0||wQ(n.attributes.y,t.y))&&(n.attributes.unit===void 0||n.attributes.unit===e)&&(n.attributes.side===void 0||n.attributes.side===t.side)&&this.eventFiltersMatch(n)&&this.claimEvent(n)&&this.executeTracedEvent(n,`moveto`);this.checkObjectives()}}claimEvent(e){if(!(e.attributes.once===void 0?e.attributes.on===`moveto`:e.attributes.once!==`false`))return!0;let t=e.attributes.id??`${e.attributes.on??e.attributes.trigger??`event`}@${e.location?.line??0}`,n=this.world.firedEvents??=[];return!n.includes(t)&&(n.push(t),!0)}eventFiltersMatch(e){if(!this.conditionMatches(e)||!this.filterConditionMatches(e))return!1;let t=e.children.find(e=>e.tag===`filter`);return!t||this.filterMatches(t)}executeEvent(e){this.runBlock(this.commandChildren(e))}runBlock(e){for(let t=0;t<e.length;t++){let n=e[t];this.isConsumedElse(e,t)||(n.tag===`say`?this.showSay(n):n.tag===`dialogue`?this.showDialogue(n):this.executeNode(n))}}isConsumedElse(e,t){let n=e[t-1];return e[t]?.tag===`else`&&n?.tag===`if`&&this.nodeConditionMatches(n)}executeTracedEvent(e,t){let n=e.attributes.id??`${e.attributes.on??e.attributes.trigger??`event`}@${e.location?.line??0}`;this.trace({type:`event`,phase:`claimed`,id:n,trigger:t});try{this.executeEvent(e),this.trace({type:`event`,phase:`completed`,id:n,trigger:t})}catch(e){throw this.trace({type:`error`,message:String(e),event:n}),e}}showDialogue(e){let t=null;for(let n of e.children)n.tag===`message`?(this.showMessage(n.attributes),t={text:n.attributes.text??n.attributes.value??``,...n.attributes.speaker===void 0?{}:{speaker:n.attributes.speaker},...n.attributes.portrait===void 0?{}:{portrait:n.attributes.portrait},...n.attributes.side===void 0||n.attributes.side===``?{}:{side:n.attributes.side}}):n.tag===`say`&&(this.showSay(n),t={text:n.attributes.text??``,speaker:n.attributes.speaker});let n=[];for(let t of e.children){if(t.tag!==`choice`||!t.attributes.text||t.attributes.variable!==void 0&&!gQ(this.variableAt(t.attributes.variable),t.attributes.equals))continue;let e=t.children.filter(e=>e.tag===`branch`);if(e.length)for(let r of e)n.push({text:r.attributes.text??t.attributes.text,branch:r.children});else t.attributes.event&&n.push({text:t.attributes.text,event:t.attributes.event})}if(n.length===0)return;this.dialogueCounter+=1;let r=`dialogue-${this.dialogueCounter}`;this.pendingDialogue={id:r,choices:n},this.world.pendingDialogue={id:r,choices:n},this.onMessage?.({text:t?.text??``,...t?.speaker===void 0?{}:{speaker:t.speaker},choices:n,dialogueId:r})}showSay(e){this.onMessage&&this.onMessage({text:e.attributes.text??``,...e.attributes.speaker===void 0?{}:{speaker:e.attributes.speaker}})}answerDialogue(e,t){return this.recordAction({type:`answer_dialogue`,dialogueId:e,choiceIndex:t},()=>this.answerDialogueInternal(e,t))}answerDialogueInternal(e,t){let n=this.pendingDialogue;if(!n||n.id!==e)return!1;let r=n.choices[t];if(!r)return!1;if(this.pendingDialogue=null,delete this.world.pendingDialogue,r.event){let e=this.nodes(`event`).find(e=>e.attributes.id===r.event);if(!e)throw Error(`MWL dialogue choice points at unknown event: ${r.event}`);if(!this.claimEvent(e))return!0;this.executeEvent(e)}else this.runBlock(r.branch??[]);return this.checkObjectives(),!0}evaluate(){return this.checkObjectives(),this.world.status}save(){let e=this.hooks?.saveable,t=e?Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.save()])):void 0;return CZ(this.world,this.persistence,t,this.journal.toJSON())}snapshot(){return JSON.stringify(this.world)}restore(e){let t=TZ(e,this.persistence),n=t.world;Object.assign(this.world.variables,n.variables),Object.assign(this.world.units,n.units),Object.assign(this.world.sides,n.sides??{}),Object.assign(this.world.maps,n.maps??{}),Object.assign(this.world.gold,n.gold??{}),this.world.turn=n.turn,this.world.status=n.status,this.world.sideStatus={...n.sideStatus??{}},this.world.map=n.map??null,this.world.timeOfDay=n.timeOfDay??this.schedule[0]??``,this.world.scheduleIndex=n.scheduleIndex??0,this.world.random=n.random,this.random.setState(n.random??new j().getState()),this.world.firedEvents=[...n.firedEvents??[]],this.world.villages=n.villages?structuredClone(n.villages):void 0,this.world.clearedShroud=n.clearedShroud?structuredClone(n.clearedShroud):void 0,this.world.roles=n.roles?structuredClone(n.roles):void 0,this.world.objects=n.objects?structuredClone(n.objects):void 0,this.world.story=n.story?structuredClone(n.story):void 0,this.world.pendingDialogue=n.pendingDialogue,this.pendingDialogue=n.pendingDialogue?{id:n.pendingDialogue.id,choices:[...n.pendingDialogue.choices]}:null;let r=n.pendingDialogue?.id.match(/^dialogue-(\d+)$/);r&&(this.dialogueCounter=Math.max(this.dialogueCounter,Number(r[1])));for(let[e,n]of Object.entries(t.hookState??{}))this.hooks?.saveable?.[e]?.restore(n);this.journal.replace(t.journal??[])}recordAction(e,t){let n=this.traceBatch===null;n&&(this.traceBatch=[]);try{let r=t();return n&&this.journal.append(e,this.traceBatch??[]),r}finally{n&&(this.traceBatch=null)}}trace(e){this.traceBatch?.push(e),this.onTrace?.(e)}loadUnitTypes(){for(let e of this.nodes(`unit_type`)){let t=e.attributes.id;t&&this.unitTypes.set(t,{hitpoints:ZZ(e,`hitpoints`,1),movement:ZZ(e,`movement`,0)})}}loadSchedule(){this.schedule=this.nodes(`schedule`).flatMap(e=>e.children.filter(e=>e.tag===`time`).map(e=>e.attributes.id).filter(e=>!!e)),this.world.scheduleIndex=0,this.world.timeOfDay=this.schedule[0]??``}loadInitialContent(){for(let e of this.nodes(`side`)){let t={gold:ZZ(e,`gold`,0),income:ZZ(e,`income`,0)};e.attributes.leader!==void 0&&(t.leader=e.attributes.leader),e.attributes.controller!==void 0&&(t.controller=e.attributes.controller),e.attributes.recruit!==void 0&&(t.recruit=e.attributes.recruit),e.attributes.team_name!==void 0&&(t.teamName=e.attributes.team_name),e.attributes.user_team_name!==void 0&&(t.userTeamName=e.attributes.user_team_name),e.attributes.share_vision!==void 0&&(t.shareVision=e.attributes.share_vision),e.attributes.flag!==void 0&&(t.flag=e.attributes.flag),e.attributes.village_gold!==void 0&&(t.villageGold=ZZ(e,`village_gold`,0));for(let n of[`heal`,`fog`,`shroud`,`hidden`]){let r=e.attributes[n];r!==void 0&&(t[n]=r===`yes`||r===`true`)}this.world.sides[XZ(e,`id`)]=t}for(let e of this.nodes(`map`)){let t=e.attributes.id??e.attributes.name??`map`;this.world.maps[t]={terrain:e.attributes.terrain??``,file:e.attributes.file},this.world.map||(this.world.map=this.buildMap(t,e))}}topLevelNodes(e){return(this.game.roots.find(e=>e.tag===`game`)?.children??this.game.roots).filter(t=>t.tag===e)}loadScenarioExtras(){for(let e of this.topLevelNodes(`object`)){let t={x:ZZ(e,`x`,0),y:ZZ(e,`y`,0)};e.attributes.id!==void 0&&(t.id=e.attributes.id),e.attributes.name!==void 0&&(t.name=e.attributes.name),e.attributes.image!==void 0&&(t.image=e.attributes.image),e.attributes.side!==void 0&&(t.side=e.attributes.side),(this.world.objects??=[]).push(t)}for(let e of this.topLevelNodes(`story`)){let t=e.attributes.text??e.attributes.value;if(t===void 0)continue;let n={text:t};e.attributes.title!==void 0&&(n.title=e.attributes.title),e.attributes.image!==void 0&&(n.image=e.attributes.image),e.attributes.music!==void 0&&(n.music=e.attributes.music),(this.world.story??=[]).push(n)}for(let e of this.topLevelNodes(`role`)){let t=e.attributes.role??e.attributes.name;if(t===void 0)continue;let n=hQ(e.attributes,`role`,`name`),r=Object.entries(this.world.units).filter(([e,t])=>t.alive&&mQ(t,e,n));for(let[,e]of r)e.role=t;(this.world.roles??={})[t]=r.map(([e])=>e)}}buildMap(e,t){let n=t.attributes.terrain;if(!n&&t.attributes.file&&this.resolveMap&&(n=this.resolveMap(t.attributes.file)),!n)return null;let r=eQ(n);for(let e of t.children){if(e.tag!==`start`)continue;let t=e.attributes.side,n=fQ(e,`x`),i=fQ(e,`y`);t!==void 0&&n!==void 0&&i!==void 0&&(r.starts[t]??=[]).push({x:n,y:i})}return{id:e,...r}}loadInitialUnits(){for(let e of this.nodes(`unit`)){let t=XZ(e,`id`),n={hp:ZZ(e,`hp`,1),x:ZZ(e,`x`,0),y:ZZ(e,`y`,0),alive:!0};if(e.attributes.type!==void 0){n.type=e.attributes.type;let t=this.unitTypes.get(e.attributes.type);t&&(n.moves=t.movement)}e.attributes.side!==void 0&&(n.side=e.attributes.side),e.attributes.name!==void 0&&(n.name=e.attributes.name),e.attributes.role!==void 0&&(n.role=e.attributes.role);let r=GZ(e,`can_recruit`);r!==void 0&&(n.can_recruit=r),this.world.units[t]=n}}loadLeaders(){for(let e of this.nodes(`side`)){let t=e.attributes.leader;if(!t)continue;let n=e.attributes.id;if(!n)continue;let r=this.world.map?.starts[n];if(!r?.length||this.world.units[t])continue;let i=this.unitTypes.get(t);if(!i)throw Error(`MWL side ${n} leader "${t}" is neither a unit nor a unit type`);for(let e of r){if(this.unitAt(e.x,e.y))continue;let r=`${t} ${n} (${e.x},${e.y})`;this.world.units[r]={hp:i.hitpoints,x:e.x,y:e.y,alive:!0,type:t,side:n,moves:i.movement,can_recruit:!0,leader:!0}}}}unitAt(e,t){return Object.values(this.world.units).find(n=>n.alive&&n.x===e&&n.y===t)}static{this.commandHandlers={message:(e,t)=>e.showMessage(t.attributes),spawn:(e,t)=>e.cmdSpawn(t),move:(e,t)=>e.cmdMove(t),kill:(e,t)=>e.cmdKill(t),fire_event:(e,t)=>e.cmdFireEvent(t),store_unit:(e,t)=>e.cmdStoreUnit(t),unstore_unit:(e,t)=>e.cmdUnstoreUnit(t),recall:(e,t)=>e.cmdRecall(t),modify_unit:(e,t)=>e.cmdModifyUnit(t),heal_unit:(e,t)=>e.cmdHealUnit(t),set_terrain:(e,t)=>e.setTerrain(ZZ(t,`x`,0),ZZ(t,`y`,0),XZ(t,`terrain`)),capture_village:(e,t)=>e.cmdCaptureVillage(t),clear_shroud:(e,t)=>e.cmdClearShroud(t),role:(e,t)=>e.cmdRole(t),attack:(e,t)=>e.attack(t.attributes.defender??t.attributes.target??XZ(t,`target`),ZZ(t,`amount`,0)),modify_gold:(e,t)=>e.addGold(t.attributes.side??XZ(t,`target`),ZZ(t,`delta`,ZZ(t,`amount`,0))),gold:(e,t)=>e.addGold(XZ(t,`side`),ZZ(t,`delta`,ZZ(t,`amount`,0))),set_variable:(e,t)=>e.cmdSetVariable(t),while:(e,t)=>e.cmdWhile(t),foreach:(e,t)=>e.cmdForeach(t),switch:(e,t)=>e.cmdSwitch(t),end_turn:e=>e.endTurn(),win:(e,t)=>e.cmdWin(t),lose:(e,t)=>e.cmdLose(t),endlevel:(e,t)=>e.cmdEndlevel(t),if:(e,t)=>e.cmdIf(t),else:(e,t)=>e.runBlock(e.commandChildren(t)),hook:(e,t)=>e.runHook(t)}}executeNode(t){let n=t.tag===`command`?t.attributes.name:t.tag;if(!n)throw Error(`MWL command is missing name`);let r=e.commandHandlers[n];if(!r)throw Error(`unknown MWL command: ${n}`);r(this,t)}cmdSpawn(e){this.spawnUnit(e.attributes.type??``,e.attributes.side,ZZ(e,`x`,0),ZZ(e,`y`,0),e.attributes.id??e.attributes.target,e.attributes.hp===void 0?void 0:ZZ(e,`hp`,1))}cmdMove(e){this.applyMove(e.attributes.unit??XZ(e,`target`),ZZ(e,`x`,0),ZZ(e,`y`,0))}cmdKill(e){let t=e.attributes.unit??e.attributes.target;t===void 0?cQ(this.world,e.attributes):this.killUnit(t)}cmdFireEvent(e){let t=e.attributes.id??e.attributes.name;if(!t)throw Error(`[fire_event] requires id`);this.fireEvent(t)}cmdStoreUnit(e){let t=e.attributes.variable??e.attributes.name??XZ(e,`variable`);this.setVariableAt(t,this.matchingUnits(e,[`variable`,`name`]).map(([e,t])=>({id:e,...lQ(t)})))}cmdUnstoreUnit(e){let t=XZ(e,`variable`);for(let e of this.storedUnits(t))this.restoreUnit(e,{})}cmdRecall(e){let t=this.storedUnits(XZ(e,`variable`)),n=e.attributes.id??e.attributes.unit,r=n===void 0?t[0]:t.find(e=>e.id===n);if(!r)throw Error(`[recall] found no stored unit${n===void 0?``:` named ${n}`}`);let i={};e.attributes.x!==void 0&&(i.x=ZZ(e,`x`,0)),e.attributes.y!==void 0&&(i.y=ZZ(e,`y`,0)),e.attributes.side!==void 0&&(i.side=e.attributes.side),this.restoreUnit(r,i)}cmdModifyUnit(e){let t=e.children.find(e=>e.tag===`set`)?.attributes??e.attributes;for(let[,n]of this.matchingUnits(e))uQ(n,t)}cmdHealUnit(e){let t=fQ(e,`amount`),n=fQ(e,`hp`);if(t===void 0&&n===void 0)throw Error(`[heal_unit] requires amount or hp`);for(let[,r]of this.matchingUnits(e))r.hp=n??r.hp+(t??0)}cmdCaptureVillage(e){let t=ZZ(e,`x`,0),n=ZZ(e,`y`,0),r={x:t,y:n,side:XZ(e,`side`)};e.attributes.name!==void 0&&(r.name=e.attributes.name),(this.world.villages??={})[`${t},${n}`]=r}cmdClearShroud(e){let t=XZ(e,`side`),n=ZZ(e,`x`,0),r=ZZ(e,`y`,0),i=ZZ(e,`radius`,1),a=new Set(this.world.clearedShroud?.[t]??[]);for(let e=-i;e<=i;e++)for(let t=-i;t<=i;t++)a.add(`${n+t},${r+e}`);(this.world.clearedShroud??={})[t]=[...a]}cmdRole(e){let t=e.attributes.role??e.attributes.name;if(!t)throw Error(`[role] requires role`);let n=this.matchingUnits(e,[`role`,`name`]);for(let[,e]of n)e.role=t;(this.world.roles??={})[t]=n.map(([e])=>e)}cmdSetVariable(e){let t=e.attributes.path;this.setVariable(t===void 0?e.tag===`command`?XZ(e,`target`):XZ(e,`name`):this.expandPath(t),e.attributes.value??``,e.attributes.mode)}cmdWhile(e){let t=ZZ(e,`max_iterations`,1e3);if(t<1||t>1e5)throw Error(`MWL while max_iterations must be between 1 and 100000`);let n=0;for(;n<t&&this.nodeConditionMatches(e);)this.runBlock(this.commandChildren(e)),n++;if(n===t&&this.nodeConditionMatches(e)){if(e.attributes.on_limit===`error`)throw Error(`MWL while reached its max_iterations cap of ${t}`);this.onTrace?.({type:`while_limit`,iterations:t})}}cmdForeach(e){let t=this.variableAt(XZ(e,`variable`)),n=Array.isArray(t)?t.map((e,t)=>[String(t),e]):typeof t==`string`?t.split(`,`).map((e,t)=>[String(t),e.trim()]).filter(([,e])=>e!==``):t&&typeof t==`object`?Object.entries(t):[],r=e.attributes.item??`item`,i=e.attributes.index??`index`;for(let t=0;t<n.length;t++)this.setVariableAt(r,n[t][1]),this.setVariableAt(i,t),this.runBlock(this.commandChildren(e))}cmdSwitch(e){let t=this.variableAt(XZ(e,`variable`)),n=e.children.find(e=>e.tag===`case`&&e.attributes.equals!==void 0&&gQ(t,e.attributes.equals)),r=e.children.find(e=>e.tag==="default");this.runBlock((n??r)?.children??[])}cmdWin(e){this.markSideResult(e.attributes.side,`won`),this.world.status=`won`}cmdLose(e){this.markSideResult(e.attributes.side,`lost`),this.world.status=`lost`}cmdEndlevel(e){let t=e.attributes.result===`defeat`?`defeat`:`victory`;this.world.status=t===`defeat`?`lost`:`won`,this.world.carryover=JZ(this.world,aQ(this.world,e.attributes.side),{result:t,bonus:WZ(e,`bonus`),carryoverPercentage:UZ(e,`carryover_percentage`),carryoverAdd:GZ(e,`carryover_add`),nextScenario:e.attributes.next_scenario??null})}cmdIf(e){let t=e.children.find(e=>e.tag===`else`),n=this.nodeConditionMatches(e)?e:t;this.runBlock(n?this.commandChildren(n):[])}commandChildren(e){return e.children.filter(e=>e.tag!==`condition`&&e.tag!==`filter`&&e.tag!==`filter_condition`)}runHook(e){let t=e.attributes.name??``,n=this.hooks?.command?.[t];if(!n)throw Error(`MWL hook ${t} is not implemented`);let{name:r,...i}=e.attributes;n(this.worldView(),this.emit(),i)}applyMove(e,t,n){let r=this.world.units[e];if(!r||!r.alive)throw Error(`MWL unit is not alive: ${e}`);let i=this.world.map??null;if(i){if(t<0||n<0||t>=i.width||n>=i.height)throw Error(`MWL move out of bounds: ${t},${n}`);let e=this.unitAt(t,n);if(e&&e!==r)throw Error(`MWL move onto an occupied cell: ${t},${n}`)}if(typeof r.moves==`number`){if(r.moves<=0)throw Error(`MWL unit has no moves left: ${e}`);--r.moves}r.x=t,r.y=n,this.fireMoveto(e)}showMessage(e){if(!this.onMessage)return;let t={text:this.interpolate(e.text??e.value??``),...e.speaker===void 0?{}:{speaker:e.speaker},...e.portrait===void 0?{}:{portrait:e.portrait},...e.side===void 0||e.side===``?{}:{side:e.side}};this.onMessage(t)}interpolate(e){let t=this.numericVariables();return e.replace(tQ,(e,n)=>{try{return String(FZ(n,t))}catch{return``}}).replace(nQ,(e,t)=>{let n=this.variableAt(t);return n===void 0||typeof n==`boolean`?``:String(n)})}expandPath(e){return e.replace(tQ,(e,t)=>String(FZ(t,this.numericVariables()))).replace(nQ,(e,t)=>{let n=this.variableAt(t);if(n===void 0)throw Error(`MWL variable path reference "$${t}" names no variable`);if(typeof n==`boolean`||typeof n==`object`)throw Error(`MWL variable path reference "$${t}" is not a name or number`);return String(n)})}setVariable(e,t,n){if(n===`literal`){this.setVariableAt(e,t);return}if(n===`number`){let n=Number(t);if(t.trim()===``||!Number.isFinite(n))throw Error(`MWL set_variable mode="number" needs a number, got "${t}"`);this.setVariableAt(e,n);return}if(n===`expression`){this.setVariableAt(e,FZ(t,this.numericVariables()));return}if(n!==void 0)throw Error(`unknown MWL set_variable mode "${n}"`);let r=Number(t);if(t.trim()!==``&&Number.isFinite(r)){this.setVariableAt(e,r);return}let i=/^\$([A-Za-z_][A-Za-z0-9_.]*)$/.exec(t.trim());if(i){let t=this.variableAt(i[1]);this.setVariableAt(e,t===void 0?``:t);return}let a=this.numericVariables();/[+*/^()]|\s-\s/.test(t)||Object.prototype.hasOwnProperty.call(a,t.trim())?this.setVariableAt(e,FZ(t,a)):this.setVariableAt(e,t)}numericVariables(){return Object.fromEntries(Object.entries(this.world.variables).filter(e=>typeof e[1]==`number`))}variableAt(e){return SQ(this.world.variables,e)}setVariableAt(e,t){let n=this.variableAt(e);xQ(this.world.variables,e,t),this.trace({type:`variable`,name:e,...n===void 0?{}:{previous:n},value:t})}spawnUnit(e,t,n,r,i,a){let o=e?this.unitTypes.get(e):void 0,s=i??`${e||`unit`}#${t??``}@${n},${r}`;this.world.units[s]={hp:a??o?.hitpoints??1,x:n,y:r,alive:!0,...e?{type:e}:{},...t===void 0?{}:{side:t},...o?{moves:o.movement}:{}}}killUnit(e){let t=this.world.units[e];if(!t||!t.alive)throw Error(`MWL unit is not alive: ${e}`);t.alive=!1}matchingUnits(e,t=[]){let n=e.children.find(e=>e.tag===`filter`),r=n?n.attributes:hQ(e.attributes,...t);return Object.entries(this.world.units).filter(([e,t])=>t.alive&&mQ(t,e,r))}storedUnits(e){let t=this.variableAt(e);if(!Array.isArray(t))throw Error(`MWL variable ${e} is not a stored unit list; store one first`);return t.filter(e=>!!e&&typeof e==`object`&&!Array.isArray(e))}restoreUnit(e,t){let n=typeof e.id==`string`?e.id:void 0;if(!n)throw Error(`a stored unit snapshot is missing its id`);let r={hp:typeof e.hp==`number`?e.hp:1,x:t.x??(typeof e.x==`number`?e.x:0),y:t.y??(typeof e.y==`number`?e.y:0),alive:e.alive!==!1};typeof e.type==`string`&&(r.type=e.type);let i=t.side??(typeof e.side==`string`?e.side:void 0);i!==void 0&&(r.side=i),typeof e.moves==`number`&&(r.moves=e.moves),typeof e.name==`string`&&(r.name=e.name),typeof e.role==`string`&&(r.role=e.role),typeof e.can_recruit==`boolean`&&(r.can_recruit=e.can_recruit),typeof e.leader==`boolean`&&(r.leader=e.leader),this.world.units[n]=r}setTerrain(e,t,n){let r=this.world.map;if(!r)throw Error(`[set_terrain] needs a loaded map`);if(e<0||t<0||e>=r.width||t>=r.height)throw Error(`[set_terrain] is outside the map: ${e},${t}`);let i=[...r.codes];i[t*r.width+e]=n,this.world.map={...r,codes:i}}addGold(e,t){this.world.gold[e]=(this.world.gold[e]??0)+t}endTurn(){this.world.turn+=1,this.advanceSchedule(),this.resetMoves(),this.run(`turn`),this.checkTimeOver()}checkTimeOver(){let e=WZ(this.game.roots[0],`turn_limit`);e===void 0||this.world.turn<=e||this.world.variables.time_over===`yes`||(this.world.variables.time_over=`yes`,this.run(`time_over`))}advanceSchedule(){if(!this.schedule.length)return;let e=((this.world.scheduleIndex??0)+1)%this.schedule.length;this.world.scheduleIndex=e,this.world.timeOfDay=this.schedule[e]}resetMoves(){for(let e of Object.values(this.world.units)){if(!e.alive)continue;let t=e.type?this.unitTypes.get(e.type):void 0;t&&(e.moves=t.movement)}}filterMatches(e){return Object.entries(this.world.units).some(([t,n])=>n.alive&&mQ(n,t,e.attributes))}conditionMatches(e){return e.children.filter(e=>e.tag===`condition`).every(e=>{if(e.attributes.condition===`hook`){let t=e.attributes.hook,n=t?.startsWith(`predicate:`)?t.slice(10):void 0,r=n?this.hooks?.predicate?.[n]:void 0;if(!r)throw Error(`MWL predicate ${n??`<missing>`} is not implemented`);let{condition:i,hook:a,...o}=e.attributes;return!!r(this.worldView(),o)}return pQ(this.variableAt(e.attributes.variable),e.attributes,CQ(this.world.variables))})}nodeConditionMatches(e){return e.attributes.test===void 0?this.conditionMatches(e):AZ(e.attributes.test,_Q(this.world.variables),{helpers:this.conditionHelpers()})}conditionHelpers(){if(this.testHelpers)return this.testHelpers;let e=e=>{let t={};for(let n of e){let e=String(n),r=e.indexOf(`=`);r<=0?t.value=e:t[e.slice(0,r)]=e.slice(r+1)}return t},t={have_unit:(...t)=>{let n=e(t);return Object.entries(this.world.units).some(([e,t])=>t.alive&&(n.id===void 0||e===n.id)&&mQ(t,e,n))},have_location:(...t)=>{let n=e(t),r=this.world.map,i=Number(n.x),a=Number(n.y);if(!r||!Number.isInteger(i)||!Number.isInteger(a)||i<0||a<0||i>=r.width||a>=r.height)return!1;let o=r.codes[a*r.width+i];return n.terrain===void 0||o===n.terrain}};for(let[n,r]of Object.entries(this.hooks?.predicate??{}))t[n]=(...t)=>!!r(this.worldView(),e(t));return this.testHelpers=t,t}filterConditionMatches(e){let t=e.children.find(e=>e.tag===`filter_condition`);return!t||t.children.every(e=>{if(e.tag===`variable`){let t=e.attributes.name;return t!==void 0&&pQ(this.variableAt(t),e.attributes,CQ(this.world.variables))}if(e.tag===`predicate`){let t=e.attributes.name,n=t?this.hooks?.predicate?.[t]:void 0;if(!n)throw Error(`MWL predicate ${t??`<missing>`} is not implemented`);let{name:r,...i}=e.attributes;return!!n(this.worldView(),i)}return e.tag!==`have_unit`||Object.entries(this.world.units).some(([t,n])=>n.alive&&(e.attributes.id===void 0||t===e.attributes.id)&&mQ(n,t,e.attributes))})}conditionMet(e,t){let n=e.attributes.condition??``,r=e.attributes.side??t;switch(n){case`units_dead`:{let t=e.attributes.side_filter??r;return t!==void 0&&!Object.values(this.world.units).some(e=>e.alive&&e.side===t)}case`turns_elapsed`:{let t=fQ(e,`turns`);return t!==void 0&&this.world.turn>=t}case`gold_at_least`:{let n=fQ(e,`gold`),r=e.attributes.side??t;return n!==void 0&&r!==void 0&&(this.world.gold[r]??0)>=n}case`unit_at`:{let t=fQ(e,`x`),n=fQ(e,`y`),i=e.attributes.side_filter??r;return Object.values(this.world.units).some(r=>r.alive&&(i===void 0||r.side===i)&&(e.attributes.type===void 0||r.type===e.attributes.type)&&r.x===t&&r.y===n)}case`hook`:{let t=e.attributes.hook??``,n=this.hooks?.predicate?.[t];if(!n)throw Error(`MWL hook ${t} is not implemented`);let{hook:r,condition:i,...a}=e.attributes;return!!n(this.worldView(),a)}default:return!1}}checkObjectives(){if(this.world.status!==`playing`)return;let e=new Set,t=this.nodes(`side`);for(let n of t)for(let t of n.children)(t.tag===`victory`||t.tag===`defeat`)&&e.add(t);if(this.nodes(`victory`).some(t=>!e.has(t)&&this.conditionMet(t))){this.world.status=`won`;return}if(this.nodes(`defeat`).some(t=>!e.has(t)&&this.conditionMet(t))){this.world.status=`lost`;return}let n=!1,r=!1;for(let e of t){let t=e.attributes.id;t&&(this.world.sideStatus?.[t]??`playing`)===`playing`&&(e.children.some(e=>e.tag===`victory`&&this.conditionMet(e,t))?(this.markSideResult(t,`won`),n=!0):e.children.some(e=>e.tag===`defeat`&&this.conditionMet(e,t))&&(this.markSideResult(t,`lost`),r=!0))}n?this.world.status=`won`:r&&(this.world.status=`lost`)}markSideResult(e,t){e!==void 0&&e!==``&&((this.world.sideStatus??={})[e]=t)}worldView(){return{variables:this.world.variables,variableAt:e=>this.variableAt(e),units:this.world.units,sides:this.world.sides,turn:this.world.turn,random:{float:()=>this.drawRandom(e=>e.float()),int:e=>this.drawRandom(t=>t.int(e))}}}drawRandom(e){let t=e(this.random);return this.world.random=this.random.getState(),t}emit(){return{move:(e,t,n)=>this.applyMove(e,t,n),attack:(e,t,n)=>{throw Error(`MWL hook attack is not available in the framework runtime; the engine adapter owns combat`)},spawn:(e,t,n,r)=>this.spawnUnit(e,t,n,r),kill:e=>this.killUnit(e),gold:(e,t)=>this.addGold(e,t),setVariable:(e,t)=>{xQ(this.world.variables,e,t)},message:(e,t)=>this.onMessage?.({text:t,...e?{speaker:e}:{}}),endTurn:()=>this.endTurn(),win:e=>{this.markSideResult(e,`won`),this.world.status=`won`},lose:e=>{this.markSideResult(e,`lost`),this.world.status=`lost`}}}attack(e,t){let n=this.world.units[e];if(!n||!n.alive)throw Error(`MWL unit is not alive: ${e}`);n.hp=Math.max(0,n.hp-t),n.hp===0&&(n.alive=!1)}nodes(e){let t=[],n=r=>{r.tag===e&&t.push(r),r.children.forEach(n)};return this.game.roots.forEach(n),t}};function iQ(e,t){if(e.status===`playing`||t.name===`win`||t.name===`lose`)switch(t.name){case`set_variable`:xQ(e.variables,t.target,t.value);break;case`modify_gold`:e.gold[t.target]=(e.gold[t.target]??0)+t.amount;break;case`move`:{let n=sQ(e,t.target);n.x=t.x,n.y=t.y;break}case`spawn`:e.units[t.target]={hp:t.hp,x:t.x,y:t.y,alive:!0};break;case`kill`:t.target===void 0?cQ(e,t.filter??{}):sQ(e,t.target).alive=!1;break;case`end_turn`:e.turn++;break;case`win`:t.side!==void 0&&t.side!==``&&((e.sideStatus??={})[t.side]=`won`),e.status=`won`;break;case`lose`:t.side!==void 0&&t.side!==``&&((e.sideStatus??={})[t.side]=`lost`),e.status=`lost`;break;case`endlevel`:e.status=t.result===`defeat`?`lost`:`won`,e.carryover=JZ(e,t.side??null,t)}}function aQ(e,t){let n=t??Object.entries(e.sides).find(([,e])=>e.controller===`human`)?.[0];return!n||!(n in e.sides)?null:{id:n}}function oQ(e){let t=new Map;for(let[n,r]of Object.entries(e.sides)){if(!r.teamName||r.shareVision===`none`)continue;let e=t.get(r.teamName);e?e.push(n):t.set(r.teamName,[n])}return[...t.values()].filter(e=>e.length>1)}function sQ(e,t){let n=e.units[t];if(!n||!n.alive)throw Error(`MWL unit is not alive: ${t}`);return n}function cQ(e,t){let n=0;for(let[r,i]of Object.entries(e.units))i.alive&&mQ(i,r,t)&&(i.alive=!1,n++);return n}function lQ(e){let t={hp:e.hp,x:e.x,y:e.y,alive:e.alive};return e.type!==void 0&&(t.type=e.type),e.side!==void 0&&(t.side=e.side),e.moves!==void 0&&(t.moves=e.moves),e.name!==void 0&&(t.name=e.name),e.role!==void 0&&(t.role=e.role),e.can_recruit!==void 0&&(t.can_recruit=e.can_recruit),e.leader!==void 0&&(t.leader=e.leader),t}function uQ(e,t){let n=dQ(t.hp);n!==void 0&&(e.hp=n);let r=dQ(t.moves);r!==void 0&&(e.moves=r),t.type!==void 0&&(e.type=t.type),t.side!==void 0&&(e.side=t.side);let i=KZ(t.alive);i!==void 0&&(e.alive=i),t.name!==void 0&&(e.name=t.name),t.role!==void 0&&(e.role=t.role);let a=KZ(t.can_recruit);a!==void 0&&(e.can_recruit=a)}function dQ(e){if(e===void 0||e===``)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function fQ(e,t){let n=e.attributes[t];if(n===void 0||n===``)return;let r=Number.parseInt(n,10);return Number.isFinite(r)?r:void 0}function pQ(e,t,n){let r=e=>{if(!e.startsWith(`$`))return e;let t=n(e.slice(1));return typeof t==`string`||typeof t==`number`||typeof t==`boolean`?t:void 0};if(t.equals!==void 0)return gQ(e,r(t.equals));if(t.not_equals!==void 0)return!gQ(e,r(t.not_equals));if(t.in!==void 0)return t.in.split(`,`).map(e=>e.trim()).some(t=>gQ(e,t));if(t.not_in!==void 0)return!t.not_in.split(`,`).map(e=>e.trim()).some(t=>gQ(e,t));let i=typeof e==`number`?e:Number(e),a=e=>Number(t[e]);return t.less_than!==void 0||t.greater_than!==void 0||t.less_than_or_equal_to!==void 0||t.greater_than_or_equal_to!==void 0?!(typeof e==`boolean`||!Number.isFinite(i)||t.less_than!==void 0&&!(i<a(`less_than`))||t.greater_than!==void 0&&!(i>a(`greater_than`))||t.less_than_or_equal_to!==void 0&&!(i<=a(`less_than_or_equal_to`))||t.greater_than_or_equal_to!==void 0&&!(i>=a(`greater_than_or_equal_to`))):e!==void 0}function mQ(e,t,n){let r=(n.not_type??``).split(`,`).map(e=>e.trim()).filter(Boolean),i=KZ(n.can_recruit),a=KZ(n.leader),o=n.unit??n.id;return(o===void 0||t===o)&&(n.side===void 0||e.side===n.side)&&(n.type===void 0||e.type===n.type)&&(r.length===0||!r.includes(e.type??``))&&(n.name===void 0||e.name===n.name)&&(n.role===void 0||e.role===n.role)&&(i===void 0||(e.can_recruit??!1)===i)&&(a===void 0||(e.leader??!1)===a)&&(n.x===void 0||wQ(n.x,e.x))&&(n.y===void 0||wQ(n.y,e.y))}function hQ(e,...t){if(t.length===0)return{...e};let n={...e};for(let e of t)delete n[e];return n}function gQ(e,t){if(e===void 0||t===void 0||typeof t!=`string`)return e===t;let n=Number(t);return typeof e==`number`&&t.trim()!==``&&Number.isFinite(n)?e===n:e===t}function _Q(e){return Object.fromEntries(Object.entries(e).filter(e=>typeof e[1]==`string`||typeof e[1]==`number`||typeof e[1]==`boolean`))}function vQ(e){return e.split(`.`).flatMap(e=>{let t=/^([^[\]]*)((?:\[[^\]]*\])*)$/.exec(e);if(!t)return[e];let n=t[1]===``?[]:[t[1]];for(let e of t[2].matchAll(/\[([^\]]*)\]/g)){let t=Number(e[1]);n.push({index:/^\d+$/.test(e[1].trim())?t:void 0})}return n}).filter(e=>typeof e!=`string`||e!==``)}function yQ(e){let t=vQ(e);if(t.some(e=>typeof e!=`string`&&e.index===void 0))throw Error(`invalid variable path: ${e}`);return t}function bQ(e){return typeof e!=`string`}function xQ(e,t,n){let r=yQ(t),i=e=>typeof e==`string`?e:e.index,a=e;for(let e=0;e<r.length-1;e++){let t=i(r[e]),n=a[t];(!n||typeof n!=`object`)&&(a[t]=bQ(r[e+1])?[]:{}),a=a[t]}a[i(r[r.length-1])]=n}function SQ(e,t){let n=e;for(let e of vQ(t))if(typeof e==`string`){if(!n||typeof n!=`object`||Array.isArray(n))return;n=n[e]}else{if(!Array.isArray(n)||e.index===void 0)return;n=n[e.index]}return n}function CQ(e){return t=>SQ(e,t)}function wQ(e,t){return e.split(`,`).some(e=>{let n=e.trim(),r=n.match(/^(-?\d+)\s*-\s*(-?\d+)$/);if(r){let e=Number(r[1]),n=Number(r[2]);return t>=Math.min(e,n)&&t<=Math.max(e,n)}return/^-?\d+$/.test(n)&&Number(n)===t})}var TQ=/^\s*([A-Za-z_][\w]*)\s*=\s*(.*?)\s*$/;function EQ(e){let t=e.split(/\r?\n/),n={},r=0;for(;r<t.length;r++){let e=t[r];if(e.trim()===``)continue;let i=TQ.exec(e);if(!i)break;n[i[1]]=i[2]}return{header:n,...eQ(t.slice(r).map(DQ).join(`
|
|
1405
|
-
`))}}function DQ(e){let t=e.length;for(;t>0&&(e[t-1]===`,`||/\s/.test(e[t-1]));)t--;return e.slice(0,t)}function OQ(e){let t=[];for(let n of e.split(`|`)){let e=n.indexOf(`:`);if(e<=0||e===n.length-1)throw Error(`invalid table column "${n}"`);let r=n.slice(0,e).trim(),i=n.slice(e+1).trim();if(!/^[A-Za-z_][\w.-]*$/.test(r))throw Error(`invalid table column name "${r}"`);if(![`string`,`number`,`boolean`,`list`,`map`].includes(i))throw Error(`invalid table column type "${i}"`);if(t.some(e=>e.name===r))throw Error(`duplicate table column "${r}"`);t.push({name:r,type:i})}if(t.length===0)throw Error(`table must declare at least one column`);return t}var kQ={game:{attributes:{schema:`string`,title:`string`,data_root:`string`,start_scene:`id`,default_schedule:`id`,save_slot:`string`,turn_limit:`integer`},children:`campaign.terrain_type.movetype.unit_type.unit.side.map.schedule.event.objectives.trait.weapon_special.dialogue.save.item.inventory.monster.status.loot.turn_clock.battle_move.type_matchup.evolution.table.object.story.role`.split(`.`)},campaign:{attributes:{id:`id`,name:`string`,title:`string`,description:`string`,start_scene:`id`,first_scenario:`id`},openChildren:!0},table:{attributes:{id:`id`,columns:`string`,list_delimiter:`string`,map_delimiter:`string`},children:[`row`]},row:{openAttributes:`string`},terrain_type:{attributes:{id:`id`,string:`string`,aliasof:`string`,mvt_alias:`string`,default_base:`string`,heals:`integer`,gives_income:`boolean`,map_code:`string`,base_tile:`string`,overlay_tile:`string`,defense:`number`,healing:`number`}},movetype:{attributes:{id:`id`,name:`string`},children:[`movement_costs`,`defense`,`resistance`]},movement_costs:{openAttributes:`number`},defense:{openAttributes:`number`},resistance:{openAttributes:`number`},unit_type:{attributes:{id:`string`,name:`string`,description:`string`,image:`string`,image_icon:`string`,profile:`string`,sound:`string`,hitpoints:`integer`,movement:`integer`,movement_type:`id`,movetype:`id`,experience:`integer`,level:`integer`,alignment:`id`,cost:`integer`,advances_to:`string`,race:`id`,usage:`id`},children:[`attack`,`trait`,`ability`]},unit:{attributes:{id:`id`,type:`string`,side:`string`,name:`string`,role:`string`,can_recruit:`boolean`,hp:`integer`,x:`integer`,y:`integer`}},attack:{attributes:{id:`id`,attacker:`string`,defender:`string`,target:`string`,amount:`integer`,weapon:`id`,name:`string`,sound:`string`,description:`string`,type:`id`,range:`id`,damage:`integer`,number:`integer`,strikes:`integer`,icon:`string`,specials:`string`}},side:{attributes:{id:`string`,controller:`id`,gold:`integer`,income:`integer`,income_base:`integer`,income_per_village:`integer`,leader:`id`,team:`integer`,recruit:`string`,color:`string`,team_name:`string`,user_team_name:`string`,share_vision:`string`,village_gold:`integer`,heal:`boolean`,fog:`boolean`,shroud:`boolean`,hidden:`boolean`,flag:`string`}},map:{attributes:{id:`id`,name:`string`,file:`string`,terrain:`string`},children:[`start`]},start:{attributes:{side:`string`,x:`integer`,y:`integer`}},schedule:{attributes:{id:`id`},children:[`time`]},time:{attributes:{id:`id`,name:`string`,lawful_bonus:`number`}},event:{attributes:{id:`id`,on:`id`,trigger:`id`,x:`coordinate`,y:`coordinate`,side:`string`,unit:`string`,once:`boolean`},children:`condition.filter.filter_condition.while.foreach.switch.command.say.dialogue.move.attack.spawn.kill.gold.endlevel.set_variable.if.else.message.teleport.end_turn.win.lose.hook.fire_event.store_unit.unstore_unit.recall.modify_unit.heal_unit.set_terrain.capture_village.clear_shroud.role`.split(`.`)},objectives:{attributes:{side:`string`,victory:`string`,defeat:`string`},children:[`victory`,`defeat`]},victory:{attributes:{side:`string`,condition:`id`,type:`string`,x:`integer`,y:`integer`,side_filter:`string`,turns:`integer`,gold:`integer`,hook:`string`,value:`integer`}},defeat:{attributes:{side:`string`,condition:`id`,type:`string`,x:`integer`,y:`integer`,side_filter:`string`,turns:`integer`,gold:`integer`,hook:`string`,value:`integer`}},condition:{attributes:{condition:`id`,hook:`string`,variable:`string`,equals:`string`,not_equals:`string`,in:`string`,not_in:`string`,less_than:`string`,greater_than:`string`,less_than_or_equal_to:`string`,greater_than_or_equal_to:`string`},openAttributes:`string`},filter:{attributes:{side:`string`,type:`string`,not_type:`string`,unit:`string`,name:`string`,role:`string`,x:`coordinate`,y:`coordinate`,level:`integer`,alignment:`id`,can_recruit:`boolean`,leader:`boolean`}},filter_condition:{children:[`variable`,`have_unit`,`predicate`]},variable:{attributes:{name:`id`,equals:`string`,not_equals:`string`,in:`string`,not_in:`string`,less_than:`string`,greater_than:`string`,less_than_or_equal_to:`string`,greater_than_or_equal_to:`string`}},have_unit:{attributes:{id:`string`,type:`string`,side:`string`,name:`string`,role:`string`,can_recruit:`boolean`,x:`coordinate`,y:`coordinate`}},predicate:{attributes:{name:`id`},openAttributes:`string`},command:{attributes:{name:`id`,target:`string`,path:`string`,value:`string`,mode:[`literal`,`number`,`expression`],amount:`integer`,x:`integer`,y:`integer`,hp:`integer`}},move:{attributes:{unit:`string`,target:`string`,x:`integer`,y:`integer`}},spawn:{attributes:{id:`string`,type:`string`,side:`string`,x:`integer`,y:`integer`,hp:`integer`}},kill:{attributes:{unit:`string`,target:`string`},openAttributes:`string`},gold:{attributes:{side:`string`,delta:`integer`,amount:`integer`}},endlevel:{attributes:{result:`id`,side:`string`,bonus:`integer`,carryover_percentage:`integer`,carryover_add:`boolean`,next_scenario:`id`}},set_variable:{attributes:{name:`id`,target:`id`,path:`string`,value:`string`,mode:[`literal`,`number`,`expression`]}},if:{attributes:{test:`string`},children:[`condition`,`while`,`foreach`,`switch`,`if`,`else`,`command`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},else:{children:[`condition`,`while`,`foreach`,`switch`,`if`,`else`,`command`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},while:{attributes:{test:`string`,max_iterations:`integer`,on_limit:`id`},children:[`condition`,`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},foreach:{attributes:{variable:`id`,item:`id`,index:`id`},children:[`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},switch:{attributes:{variable:`id`},children:[`case`,`default`]},case:{attributes:{equals:`string`},children:[`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`,`dialogue`]},default:{children:[`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`,`dialogue`]},message:{attributes:{speaker:`string`,text:`string`,value:`string`,portrait:`string`,side:`string`}},teleport:{attributes:{unit:`string`,target:`string`,x:`integer`,y:`integer`}},end_turn:{attributes:{}},win:{attributes:{side:`string`}},lose:{attributes:{side:`string`}},say:{attributes:{speaker:`id`,text:`string`}},dialogue:{attributes:{id:`id`,ref:`id`},children:[`say`,`choice`,`branch`,`message`]},choice:{attributes:{text:`string`,event:`id`,variable:`id`,equals:`string`},children:[`branch`]},branch:{attributes:{text:`string`},children:[`message`,`say`,`command`,`set_variable`,`move`,`attack`,`spawn`,`kill`,`gold`,`hook`]},trait:{attributes:{id:`id`,name:`string`},children:[`effect`]},ability:{attributes:{id:`id`,name:`string`},children:[`effect`]},weapon_special:{attributes:{id:`id`,name:`string`}},hook:{attributes:{name:`string`},openAttributes:`string`},fire_event:{attributes:{id:`id`,name:`string`}},store_unit:{attributes:{variable:`string`,name:`string`},children:[`filter`]},unstore_unit:{attributes:{variable:`string`,name:`string`}},recall:{attributes:{variable:`string`,id:`string`,unit:`string`,side:`string`,x:`integer`,y:`integer`}},modify_unit:{attributes:{hp:`integer`,moves:`integer`,type:`string`,side:`string`,alive:`boolean`},children:[`filter`,`set`]},set:{openAttributes:`string`},heal_unit:{attributes:{amount:`integer`,hp:`integer`,side:`string`,type:`string`,x:`integer`,y:`integer`},children:[`filter`]},set_terrain:{attributes:{terrain:`string`,x:`integer`,y:`integer`}},capture_village:{attributes:{side:`string`,x:`integer`,y:`integer`,name:`string`}},clear_shroud:{attributes:{side:`string`,x:`integer`,y:`integer`,radius:`integer`}},role:{attributes:{role:`string`,name:`string`,type:`string`,not_type:`string`,unit:`string`,side:`string`,can_recruit:`boolean`,x:`integer`,y:`integer`},children:[`filter`]},object:{attributes:{id:`id`,name:`string`,image:`string`,side:`string`,x:`integer`,y:`integer`},children:[`filter`]},story:{attributes:{text:`string`,value:`string`,title:`string`,image:`string`,music:`string`}},item:{attributes:{id:`id`,name:`string`,slot:`id`,stackable:`boolean`,weight:`number`,image:`string`,icon:`string`},children:[`effect`]},inventory:{attributes:{unit:`string`,side:`string`,items:`string`}},monster:{attributes:{id:`string`,name:`string`,hp:`integer`,types:`string`,attack:`number`,defense:`number`,speed:`number`,accuracy:`number`,evasion:`number`,damage_min:`integer`,damage_max:`integer`,armor_min:`integer`,armor_max:`integer`,experience:`integer`,max_level:`integer`,image:`string`},children:[`ability`,`loot`]},status:{attributes:{id:`id`,name:`string`,duration:`integer`,tick:`string`,modifiers:`string`}},loot:{attributes:{item:`id`,chance:`number`,quantity:`integer`,weight:`number`}},turn_clock:{attributes:{id:`id`,tick:`number`,hunger:`number`}},ai:{attributes:{id:`id`,strategy:`id`,target:`id`,difficulty:`number`,scope:`id`,provider:`id`,algorithm:`id`,depth:`integer`,max_nodes:`integer`,player:`string`,moves:`string`,apply:`string`,terminal:`string`,evaluate:`string`},children:[`behavior`]},behavior:{attributes:{id:`id`,when:`string`,action:`string`,hook:`string`}},battle_move:{attributes:{id:`id`,type:`id`,target:`id`,power:`number`,cost:`number`}},type_matchup:{attributes:{attacker:`id`,defender:`id`,multiplier:`number`}},evolution:{attributes:{from:`id`,into:`id`,level:`integer`}},effect:{attributes:{apply_to:`id`,range:`id`,increase:`string`,increase_total:`string`,increase_damage:`string`,add:`string`,sub:`string`,multiply:`string`,divide:`string`,set:`string`}},save:{attributes:{version:`integer`,fields:`string`,migration:`string`}}},AQ={...kQ,game:{...kQ.game,required:[`schema`]},table:{...kQ.table,required:[`id`,`columns`],cardinality:{row:{min:1}}},terrain_type:{...kQ.terrain_type,required:[`id`]},movetype:{...kQ.movetype,required:[`id`]},unit_type:{...kQ.unit_type,required:[`id`]},unit:{...kQ.unit,required:[`id`,`type`,`side`]}};function jQ(e,t=kQ){let n=[],r=new Map,i=e=>{let t=e.attributes.id;t&&r.set(t,[...r.get(t)??[],e]),e.children.forEach(i)};e.forEach(i);let a=[],o=(e,i=!1)=>{let s=t[e.tag];if(s){for(let t of Object.keys(e.attributes))s.openAttributes||(!s.attributes||!(t in s.attributes))&&n.push({code:`MWL_UNKNOWN_ATTRIBUTE`,message:`unknown attribute ${t} on ${e.tag}`,location:e.attributeLocations?.[t]??e.location});for(let t of s.required??[])e.attributes[t]===void 0&&n.push({code:`MWL_REQUIRED_ATTRIBUTE`,message:`${t} is required on ${e.tag}`,location:e.location});for(let[t,i]of Object.entries(s.attributes??{})){let o=e.attributes[t];if(o!==void 0&&!FQ(o,i)&&n.push({code:`MWL_VALUE`,message:`${t} must be ${IQ(i)}`,location:e.valueLocations?.[t]??e.attributeLocations?.[t]??e.location}),o!==void 0&&i===`ref`){let i=(r.get(o)??[]).filter(e=>{let n=s.refTargets?.[t];return!n||n===`*`||e.tag===n});i.length===0?n.push({code:`MWL_REF_MISSING`,message:`${t} references missing target ${o}`,location:e.location}):i.length>1?n.push({code:`MWL_REF_DUPLICATE`,message:`${t} references ambiguous target ${o}`,location:e.location}):s.acyclicRefs?.includes(t)&&a.push({from:e,to:i[0],name:t})}}if(s.openAttributes)for(let[t,r]of Object.entries(e.attributes))FQ(r,s.openAttributes)||n.push({code:`MWL_VALUE`,message:`${t} must be ${s.openAttributes}`,location:e.valueLocations?.[t]??e.attributeLocations?.[t]??e.location});for(let t of e.children)!s.openChildren&&s.children&&!s.children.includes(t.tag)&&n.push({code:`MWL_CHILD`,message:`${t.tag} is not allowed inside ${e.tag}`,location:t.location}),o(t,s.openChildren===!0);for(let[t,r]of Object.entries(s.cardinality??{})){let i=e.children.filter(e=>e.tag===t).length;r.min!==void 0&&i<r.min&&n.push({code:`MWL_CARDINALITY`,message:`${e.tag} needs at least ${r.min} ${t} child${r.min===1?``:`ren`}`,location:e.location}),r.max!==void 0&&i>r.max&&n.push({code:`MWL_CARDINALITY`,message:`${e.tag} allows at most ${r.max} ${t} child${r.max===1?``:`ren`}`,location:e.location})}}else{if(i){e.children.forEach(e=>o(e,!0));return}n.push({code:`MWL_UNKNOWN_TAG`,message:`unknown tag ${e.tag}`,location:e.location})}};e.forEach(e=>o(e)),MQ(e,n);let s=new Set,c=new Set,l=(e,t)=>{if(s.has(e)){let r=t.indexOf(e);n.push({code:`MWL_REF_CYCLE`,message:`reference cycle through ${t.slice(r).map(e=>e.attributes.id??e.tag).join(` -> `)}`,location:e.location})}else if(!c.has(e)){s.add(e);for(let n of a.filter(t=>t.from===e))l(n.to,[...t,e]);s.delete(e),c.add(e)}};for(let e of a)l(e.from,[]);return n.sort((e,t)=>e.location.line-t.location.line||e.location.column-t.location.column)}function MQ(e,t){let n=e=>{if(e.tag===`table`){let n;try{n=OQ(e.attributes.columns??``)}catch(r){t.push({code:`MWL_TABLE`,message:String(r).replace(/^Error: /,``),location:e.location}),n=[]}let r=new Map(n.map(e=>[e.name,e]));for(let i of e.children.filter(e=>e.tag===`row`)){for(let e of Object.keys(i.attributes))r.has(e)||t.push({code:`MWL_TABLE`,message:`unknown table column ${e}`,location:i.location});for(let r of n){let n=i.attributes[r.name];if(n===void 0)t.push({code:`MWL_TABLE`,message:`missing table column ${r.name}`,location:i.location});else try{NQ(n,r.type,r.name,e.attributes.list_delimiter,e.attributes.map_delimiter)}catch(e){t.push({code:`MWL_TABLE`,message:String(e).replace(/^Error: /,``),location:i.location})}}}}e.children.forEach(n)};e.forEach(n)}function NQ(e,t,n,r=`;`,i=`=`){return Hr(e,t,{column:n,listDelimiter:r,mapDelimiter:i,acceptYesNo:!0})}function PQ(e){return/^[A-Za-z_][\w.[\]-]*$/.test(e)}function FQ(e,t){return LQ(t)?t.includes(e):t===`number`?Number.isFinite(Number(e)):t===`integer`?/^-?\d+$/.test(e):t===`boolean`?e===`true`||e===`false`||e===`yes`||e===`no`:t===`ref`?/^[A-Za-z_][\w.-]*$/.test(e):t===`coordinate`?/^-?\d+(?:\s*,\s*-?\d+|\s*-\s*-?\d+)*$/.test(e):t!==`id`||PQ(e)}function IQ(e){return LQ(e)?`one of ${e.join(`, `)}`:e}function LQ(e){return Array.isArray(e)}function RQ(e,t={}){return BQ(aZ($X(e,t),t.file),t)}function zQ(e,t={}){let n=[];for(let r of[...e].sort((e,t)=>e.file<t.file?-1:+(e.file>t.file))){let e=$X(r.source,{...t,file:r.file});n.push(...aZ(e,r.file))}return BQ(n,t)}function BQ(e,t={}){let n=e.find(e=>e.tag===`game`)?.attributes.schema,r=jQ(e,t.schemas??(n===`1.0`?AQ:void 0));if(r.length){let e=r[0];throw Error(`${e.location.file}:${e.location.line}:${e.location.column}: ${e.message}`)}let i=new Set,a=new Set,o=e=>{for(let[t,n]of Object.entries(e.attributes))if(VQ(t))for(let e of UQ(n).map(e=>e.trim()).filter(HQ))i.add(WQ(e));let t=e.gettext??[`name`,`text`,`title`];for(let n of t){let t=e.attributes[n];t!==void 0&&a.add(t)}let n={tag:e.tag,attributes:{...e.attributes},children:e.children.map(o),location:e.location};return Object.defineProperties(n,{attributeLocations:{value:e.attributeLocations,enumerable:!1},valueLocations:{value:e.valueLocations,enumerable:!1}}),e.gettext&&Object.assign(n,{gettext:[...e.gettext]}),n};return{schema:e.find(e=>e.tag===`game`)?.attributes.schema??`0.1`,roots:e.map(o),assets:[...i].sort(),messages:[...a].sort()}}function VQ(e){return e===`file`||e===`image`||e===`image_icon`||e===`icon`||e===`profile`||e===`sound`||e.endsWith(`_sound`)||e.endsWith(`_image`)}function HQ(e){return e.includes(`/`)||/\.(?:png|jpg|jpeg|gif|svg|webp|wav|ogg|mp3|flac|glb|gltf|vox|map|cfg)$/i.test(e)||e.startsWith(`data:`)}function UQ(e){let t=[],n=0,r=0,i=0;for(let a=0;a<e.length;a+=1)e[a]===`(`?r+=1:e[a]===`)`&&r>0?--r:e[a]===`[`?i+=1:e[a]===`]`&&i>0?--i:e[a]===`,`&&r===0&&i===0&&(t.push(e.slice(n,a)),n=a+1);return t.push(e.slice(n)),t}function WQ(e){let t=e.match(/~[A-Za-z][A-Za-z0-9_-]*(?:\(|$)/);return t?e.slice(0,t.index).trim():e}function GQ(e,t={}){let n={};for(let t of e.messages)n[t]=t;return{locale:t.locale??`en`,direction:t.direction??`ltr`,messages:n}}function KQ(e,t=`gameData`){return`export const ${t} = ${JSON.stringify(e,null,` `)} as const;\n`}function qQ(e,t={}){let n=[{name:`game-data.ts`,content:KQ(e,t.variable??`gameData`)},{name:`i18n.json`,content:`${JSON.stringify(GQ(e),null,` `)}\n`},{name:`assets.json`,content:`${JSON.stringify({assets:e.assets},null,` `)}\n`},...Object.entries(t.artifacts??{}).sort(([e],[t])=>e<t?-1:+(e>t)).map(([e,t])=>({name:e,content:t}))];for(let e of n)t.onEmit?.(e);return n}function JQ(e,t={},n={}){let r=qQ(zQ(e,t),n),i=qQ(zQ(e,t),n);if(r.length!==i.length||r.some((e,t)=>e.name!==i[t]?.name||e.content!==i[t]?.content))throw Error(`MWL generated artifacts are not deterministic`);return r}var YQ=/^[A-Za-z_][\w-]*$/,XQ=[`predicate`,`modifier`,`generator`,`command`,`ai`,`migration`];function ZQ(e){let t=e.indexOf(`:`);if(t<=0)return null;let n=e.slice(0,t),r=e.slice(t+1).trim();return!YQ.test(n)||!YQ.test(r)?null:{type:n,name:r}}function QQ(e,t=[`hook`,`migration`]){let n=new Map,r=new Set(t),i=e=>{for(let[t,n]of Object.entries(e.attributes))r.has(t)&&a(n,e.location),e.tag===`hook`&&t===`name`&&a(n,e.location);e.children.forEach(i)},a=(e,t)=>{let r=ZQ(e);if(!r)return;let i=`${r.type}:${r.name}`;n.has(i)||n.set(i,{...r,location:t})};return e.roots.forEach(i),[...n.values()].sort((e,t)=>e.type.localeCompare(t.type)||e.name.localeCompare(t.name))}function $Q(e,t){if(t.attributes===void 0&&t.openAttributes===void 0)return[];let n=e.location??{file:`<hook>`,line:0,column:0},r=[];for(let[i,a]of Object.entries(e.attributes)){if(i===`name`)continue;let e=t.attributes?.[i]??t.openAttributes;e===void 0?r.push({code:`MWL_UNKNOWN_ATTRIBUTE`,message:`unknown attribute ${i} on hook ${t.id}`,location:n}):FQ(a,e)||r.push({code:`MWL_VALUE`,message:`${i} must be ${IQ(e)} on hook ${t.id}`,location:n})}return r}function e$(e,t){let n=new Set(t),r=[];for(let t of e){let e=`${t.type}:${t.name}`;n.has(e)||r.push({code:`MWL_HOOK`,message:`hook ${e} is not implemented`,location:t.location??{file:`<hook>`,line:0,column:0}})}return r}function t$(e){let t=[];t.push(`// Generated by mwl - do not edit.`),t.push(`import type { AiHook, CommandHook, GeneratorHook, MigrationHook, ModifierHook, PredicateHook } from '@datamoc/mw_games/mwl';`),t.push(``),t.push(`export interface MwlHooks {`);for(let n of e){let e=XQ.includes(n.type)?`${n.type[0].toUpperCase()}${n.type.slice(1)}Hook`:`MwlDomainHook`;t.push(`\t'${n.type}:${n.name}': ${e};`)}return t.push(`}`),t.push(``),t.join(`
|
|
1406
|
-
`)}function
|
|
1407
|
-
`)}\n`}function h$(e,t){let n=e.split(/[^A-Za-z0-9]+/).filter(e=>e.length>0).map(e=>e[0].toUpperCase()+e.slice(1)).join(``)||`Table`,r=/^[A-Za-z_$]/.test(n)?n:`_${n}`,i=r;for(let e=2;t.has(i);e++)i=`${r}${e}`;return t.add(i),i}function g$(e){return/^[A-Za-z_$][\w$]*$/.test(e)?e:JSON.stringify(e)}function _$(e){switch(e){case`number`:return`number`;case`boolean`:return`boolean`;case`list`:return`string[]`;case`map`:return`Record<string, string>`;default:return`string`}}function v$(e,t={}){return{id:e.id,stackable:e.stackable,weight:e.weight,slot:e.slot,modifiers:e.effects.map(e=>x$(e,t))}}function y$(e,t=1){return{id:e.id,quantity:t,stackable:e.stackable,weight:e.weight}}function b$(e,t,n={}){return xH(e,t.map(e=>x$(e,n)))}function x$(e,t={}){let n=e.operation;if(n!==`add`&&n!==`sub`&&n!==`multiply`&&n!==`divide`&&n!==`set`)throw Error(`MWL effect operation "${n??``}" is not a StatBlock modifier`);let r=e.value;if(r===void 0)throw Error(`MWL effect has no value`);let i=FZ(r,t);return{stat:e.applyTo,op:n===`sub`?`add`:n===`divide`?`multiply`:n,value:n===`sub`?-i:n===`divide`?1/i:i}}function S$(e,t={}){let n=[],r=new Map,i=VZ(e.roots);for(let e of i){let i=e.attributes.id;if(i){let a=`${t.rowIdScope===`file`?e.location?.file??`<mwl>`:``}\0${e.tag}:${i}`,o=r.get(a);o?n.push(E$(`MWL_DUPLICATE_ID`,`duplicate ${e.tag} id "${i}"`,e.location??o.location)):r.set(a,e)}if(e.tag===`item`&&t.slots&&e.attributes.slot&&!t.slots.includes(e.attributes.slot)&&n.push(E$(`MWL_UNKNOWN_SLOT`,`unknown equipment slot "${e.attributes.slot}"`,e.location)),e.tag===`effect`){let t=[`add`,`sub`,`multiply`,`divide`,`set`,`increase`,`increase_total`,`increase_damage`].filter(t=>e.attributes[t]!==void 0);(!e.attributes.apply_to||t.length!==1)&&n.push(E$(`MWL_INCOMPLETE_EFFECT`,`an effect needs apply_to and exactly one operation`,e.location))}O$(e,t.mapBounds,n)}C$(i,n),w$(i,t.tableReferences,n);let a=QQ(e,[`hook`,`migration`,...t.hookAttributes??[]]),o=new Map;for(let e of t.hooks??[])o.set(typeof e==`string`?e:e.id,typeof e==`string`?{id:e}:e);for(let e of i){let t=e.attributes.hook??(e.tag===`hook`?e.attributes.name:void 0);t!==void 0&&!ZQ(t)&&n.push(E$(`MWL_INVALID_HOOK`,`invalid hook reference "${t}"`,e.location));let r=e.tag===`hook`&&e.attributes.name?o.get(e.attributes.name):void 0;r&&n.push(...$Q(e,r))}if(t.hooks)for(let e of a)o.has(`${e.type}:${e.name}`)||n.push(E$(`MWL_UNKNOWN_HOOK`,`hook ${e.type}:${e.name} is not declared by the game`,e.location));return n}function C$(e,t){let n=new Map;for(let t of e){let e=t.attributes.id;e&&n.set(`${t.tag}\0${e}`,t)}let r=new Set,i=new Set,a=new Set,o=(e,s)=>{if(r.has(e)){let n=s.indexOf(e),r=s.slice(n).map(e=>`${e.tag}:${e.attributes.id??`<anonymous>`}`).sort().join(`|`);if(a.has(r))return;a.add(r),t.push({code:`MWL_ALIAS_CYCLE`,message:`alias cycle through ${s.slice(n).map(e=>e.attributes.id??e.tag).join(` -> `)}`,location:e.valueLocations?.aliasof??e.attributeLocations?.aliasof??e.location??D$()})}else if(!i.has(e)){r.add(e);for(let t of(e.attributes.aliasof??``).split(`,`).map(e=>e.trim()).filter(Boolean)){let r=n.get(`${e.tag}\0${t}`);r&&o(r,[...s,e])}r.delete(e),i.add(e)}};for(let t of e)t.attributes.aliasof!==void 0&&o(t,[])}function w$(e,t,n){if(!t)return;let r=new Map;for(let t of e){let e=t.tag===`table`?t.attributes.id:void 0;e&&!r.has(e)&&r.set(e,t)}let i=e=>{try{return OQ(e.attributes.columns??``)}catch{return}},a=e=>e.children.filter(e=>e.tag===`row`);for(let o of t){let t=r.get(o.table);if(!t){n.push(E$(`MWL_TABLE_REFERENCE`,`unknown table "${o.table}" in tableReferences`,D$()));continue}let s=i(t)?.find(e=>e.name===o.column);if(!s){n.push(E$(`MWL_TABLE_REFERENCE`,`unknown column "${o.column}" in table "${o.table}"`,t.location));continue}let c,l;if(`oneOf`in o)c=new Set(o.oneOf),l=`one of the declared values`;else if(`node`in o.references){let t=new Set;for(let n of e)n.tag===o.references.node&&n.attributes.id&&t.add(n.attributes.id);c=t,l=`node "${o.references.node}"`}else{let e=o.references,s=r.get(e.table),u=s?i(s)?.find(t=>t.name===e.column):void 0;if(!s||!u){n.push(E$(`MWL_TABLE_REFERENCE`,`unknown reference target "${e.table}.${e.column}" for table "${o.table}" column "${o.column}"`,t.location));continue}let d=new Set;for(let e of a(s))for(let t of T$(e,u,s.attributes.list_delimiter))d.add(t);c=d,l=`${e.table}.${e.column}`}let u=t.attributes.list_delimiter;a(t).forEach((e,t)=>{for(let r of T$(e,s,u))c.has(r)||n.push({code:`MWL_TABLE_REFERENCE`,message:`table "${o.table}" row ${t+1} column "${o.column}": unknown value "${r}" (expected ${l})`,location:e.valueLocations?.[o.column]??e.attributeLocations?.[o.column]??e.location??D$()})})}}function T$(e,t,n){let r=e.attributes[t.name];return r===void 0||r===``?[]:t.type===`list`?r.split(n??`;`).map(e=>e.trim()).filter(e=>e.length>0):[r]}function E$(e,t,n){return{code:e,message:t,location:n??D$()}}function D$(){return{file:`<mwl>`,line:1,column:1}}function O$(e,t,n){if(t)for(let r of[`x`,`y`]){let i=e.attributes[r];if(i===void 0)continue;let a=r===`x`?t.width:t.height;if(!Number.isInteger(a)||a<=0)continue;let o=i.split(`,`).flatMap(e=>{let t=e.trim(),n=/^(-?\d+)\s*-\s*(-?\d+)$/.exec(t);return n?[Number(n[1]),Number(n[2])]:/^-?\d+$/.test(t)?[Number(t)]:[]});o.length>0&&o.some(e=>e<0||e>=a)&&n.push({code:`MWL_COORDINATE`,message:`${r} coordinate is outside the ${a}-cell map bound`,location:e.valueLocations?.[r]??e.attributeLocations?.[r]??e.location??{file:`<mwl>`,line:1,column:1}})}}function k$(e,t={}){return S$({schema:`0.1`,roots:e,assets:[],messages:[]},t)}function A$(e,t={}){try{let n=zQ(e,t),r=j$(n),i=[];for(let e of r.opaqueTags)i.push({severity:`warning`,code:`opaque-tag`,message:`ignored opaque tag: ${e}`});for(let e of r.danglingReferences)i.push({severity:`error`,code:`dangling-reference`,message:`dangling content reference: ${e}`});return{game:n,resources:[...n.assets],dependencies:[...r.references],ignored:[...r.opaqueTags],diagnostics:i}}catch(e){return{resources:[],dependencies:[],ignored:[],diagnostics:[{severity:`error`,code:`compile`,message:String(e)}]}}}function j$(e){let t=VZ(e.roots),n={},r=new Set;for(let e of t)n[e.tag]=(n[e.tag]??0)+1,e.attributes.id&&r.add(e.attributes.id);let i=new Set(Object.keys(kQ)),a=t.filter(e=>!i.has(e.tag)).map(e=>e.tag).filter((e,t,n)=>n.indexOf(e)===t).sort(),o=new Set;for(let e of t)for(let[t,n]of Object.entries(e.attributes))if(/^(?:ability|item|terrain|unit|unit_type|weapon)(?:_id)?$/.test(t))for(let e of n.split(`,`).map(e=>e.trim()).filter(Boolean))o.add(e);return{tags:Object.fromEntries(Object.entries(n).sort(([e],[t])=>e.localeCompare(t))),opaqueTags:a,references:[...o].sort(),danglingReferences:[...o].filter(e=>!r.has(e)).sort()}}function M$(e,t){let n={},r=[];for(let[i,a]of Object.entries(t)){let t=a.source??i,o=e.attributes[t];if(o===void 0){a.required?r.push(H$(`MWL_REQUIRED_FIELD`,`missing required attribute "${t}"`,e)):a.default!==void 0&&(n[i]=a.default);continue}let s=V$(o,a.type);s===void 0?r.push(H$(`MWL_FIELD_TYPE`,`invalid ${a.type} attribute "${t}": "${o}"`,e)):n[i]=s}return{value:n,diagnostics:r}}function N$(e,t,n){let r=[],i=[];for(let a of e.children){if(a.tag!==t)continue;let e=n(a);r.push(e.value),i.push(...e.diagnostics)}return{value:r,diagnostics:i}}function P$(e,t){let n=new Map;for(let r of e){let e=I$(...L$(r,t.key));if(n.has(e)&&t.duplicate!==`last`)throw Error(`duplicate table key: ${e}`);n.set(e,t.value?t.value(r):r)}return n}function F$(e,t){let n=new Map;for(let r of e){let e=I$(...L$(r,t.key)),i=n.get(e);i?i.push(r):n.set(e,[r])}return n}function I$(...e){return JSON.stringify(e)}function L$(e,t){if(typeof t==`function`){let n=t(e);return R$(n)?[...n]:[n]}return z$(t)?t.map(t=>B$(e[t],String(t))):[B$(e[t],String(t))]}function R$(e){return Array.isArray(e)}function z$(e){return Array.isArray(e)}function B$(e,t){if(e===null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return e;throw TypeError(`table key column "${t}" must be a string, number, boolean, or null`)}function V$(e,t){if(t===`string`)return e;if(t===`id`)return PQ(e)?e:void 0;if(t===`number`)return Number.isFinite(Number(e))?Number(e):void 0;if(t===`integer`)return/^-?\d+$/.test(e)?Number(e):void 0;if(t===`boolean`)return e===`true`||e===`yes`?!0:e===`false`||e===`no`?!1:void 0;let n=e.split(`,`).map(e=>e.trim()).filter(Boolean);return t===`id-list`?n.every(e=>PQ(e))?n:void 0:n.every(e=>Number.isFinite(Number(e)))?n.map(Number):void 0}function H$(e,t,n){return{code:e,message:t,location:n.location??{file:`<mwl>`,line:1,column:1}}}function U$(){return{evaluate(e,t={}){let n={};for(let[e,r]of Object.entries(t)){if(typeof r!=`number`)throw Error(`MWL expression context value must be numeric: ${e}`);n[e]=r}return FZ(e,n)},execute(){throw Error(`the expression ScriptHost cannot execute statements`)},call(){throw Error(`the expression ScriptHost cannot call functions`)},dispose(){}}}var W$=l({MWL_DEFAULT_CARRYOVER_PERCENTAGE:()=>80,MWL_SCHEMA_01:()=>`0.1`,MWL_SCHEMA_10:()=>`1.0`,MwlRuntime:()=>rQ,MwlSyntaxError:()=>ZX,attributeTypeDescription:()=>IQ,campaignChain:()=>n$,carryoverIntoScenario:()=>YZ,coerceTableValue:()=>NQ,collectHookReferences:()=>QQ,compile:()=>RQ,compileAndEmitSources:()=>JQ,compileNodes:()=>BQ,compileSources:()=>zQ,composeEffects:()=>b$,contentCatalog:()=>c$,contentReport:()=>j$,createExpressionScriptHost:()=>U$,createWorld:()=>QZ,decodeSave:()=>wZ,decodeSaveEnvelope:()=>TZ,effectToModifier:()=>x$,emitArtifacts:()=>qQ,emitHooksDeclaration:()=>t$,emitModule:()=>KQ,emitTableTypes:()=>m$,encodeSave:()=>CZ,endLevelCarryover:()=>JZ,evaluateCondition:()=>AZ,evaluateExpression:()=>FZ,execute:()=>iQ,extractCatalog:()=>GQ,hookTypes:()=>XQ,inventoryItem:()=>y$,isGettext:()=>vZ,isMwlId:()=>PQ,itemDefinition:()=>v$,loadContent:()=>A$,nodesToObjects:()=>f$,parse:()=>aZ,parseExpression:()=>PZ,parseHookReference:()=>ZQ,parseMapFile:()=>EQ,parseTableColumns:()=>OQ,parseTerrain:()=>eQ,parseValue:()=>_Z,preprocess:()=>$X,readAttributes:()=>M$,readChildren:()=>N$,readTableIndex:()=>F$,readTableMap:()=>P$,schema01:()=>kQ,schema10:()=>AQ,sideVisionGroups:()=>oQ,tableKey:()=>I$,typedRows:()=>p$,validAttributeValue:()=>FQ,validate:()=>jQ,validateCatalog:()=>S$,validateCatalogNodes:()=>k$,validateHookAttributes:()=>$Q,validateHookReferences:()=>e$,validateWorld:()=>EZ}),G$=class{constructor(e,t={}){if(this.latestDecision=null,this.decide=e,this.every=t.every??1,!Number.isInteger(this.every)||this.every<1||this.every>1e6)throw RangeError(`a suggestion budget must be a frame count in 1..1000000`);this.since=this.every-1}update(e){return this.since++,this.since<this.every?null:(this.since=0,this.latestDecision=this.decide(e),this.latestDecision)}get latest(){return this.latestDecision}clear(){this.latestDecision=null}};function K$(e,t){return e.filter(e=>(t.side===void 0||e.side===t.side)&&(t.type===void 0||e.type===t.type)&&(t.role===void 0||e.role===t.role)&&(t.can_recruit===void 0||(e.can_recruit??!1)===t.can_recruit)&&(t.name===void 0||e.name===t.name))}function q$(e,t,n,r){let i=0,a=0,o=1;for(let s of t)s.id!==e.id&&r(s.x,s.y)&&(o++,s.side===e.side?i+=n(s.id):a+=n(s.id));return{own:n(e.id),allies:i,enemies:a,seen:o}}function J$(e,t,n,r){let i=0,a=0,o=0;for(let s of t)r(s.x,s.y)&&(o++,s.side===e?i+=n(s.id):a+=n(s.id));return{own:0,allies:i,enemies:a,seen:o}}function Y$(e,t){return e.own*t.own+e.allies*t.allies+e.enemies*t.enemies}var X$=class e{constructor(e={}){this.values={};for(let[t,n]of Object.entries(e))n!==void 0&&(this.values[t]=n)}has(e){return this.values[e]!==void 0}get(e){return this.values[e]}set(e,t){this.values[e]=t}number(e,t=0){let n=this.values[e];return typeof n==`number`&&Number.isFinite(n)?n:typeof n==`boolean`?+!!n:t}flag(e,t=!1){let n=this.values[e];return typeof n==`boolean`?n:t}list(e){let t=this.values[e];return Array.isArray(t)?t:typeof t==`string`?[t]:[]}names(){return Object.keys(this.values)}with(t){let n=new e(this.values);for(let[e,r]of Object.entries(t))r!==void 0&&n.set(e,r);return n}toJSON(){return{...this.values}}static fromJSON(t){return new e(t)}},Z$=class{constructor(e=[],t={}){this.levels=new Map,this.base=new X$(t);for(let t of e){if(this.levels.has(t.id))throw Error(`duplicate difficulty level: ${t.id}`);this.levels.set(t.id,t)}}get ids(){return[...this.levels.keys()]}get(e){return this.levels.get(e)}aspectsFor(e){let t=this.levels.get(e);if(!t)throw Error(`unknown difficulty level: ${e}`);return this.base.with(t.aspects??{})}},Q$=class{constructor(){this.byUnit=new Map}set(e){this.byUnit.set(e.unit,{...e})}clear(e){this.byUnit.delete(e)}get(e){return this.byUnit.get(e)}all(){return[...this.byUnit.values()]}get isEmpty(){return this.byUnit.size===0}},$$=class{constructor(e,t=null){this.order=e,this.fallback=t}get length(){return this.order.length}at(e){if(this.order.length===0)return this.fallback;let t=(e%this.order.length+this.order.length)%this.order.length;return this.order[t]}next(e){if(this.order.length===0)return this.fallback;if(e===null)return this.order[0];let t=this.order.indexOf(e);return this.at(t<0?0:t+1)}},e1=class{constructor(e){this.stages=e.stages}decide(e,t){if(e.length===0)return null;for(let n of this.stages){if(n.when&&!n.when(t))continue;let r=n.weigh??t1,i=null;for(let a of e){let e=r(a,t);(!i||e>i.score)&&(i={candidate:a,stage:n.id,score:e})}return i}return null}};function t1(e,t){let n=0;for(let[r,i]of Object.entries(e.factors??{}))r!==`distance`&&(n+=i*t.aspects.number(r,1));let r=e.factors?.distance;return r!==void 0&&(n+=n1(r,t.aspects.number(`keep_away`,0))),n}function n1(e,t){return!(t>0)||e>=t?0:-(t-e)}function r1(e){return e?Math.max(0,e.priority??1):0}var i1=l({AIBudgetExceededError:()=>l1,AICancelledError:()=>c1,Aspects:()=>X$,Difficulty:()=>Z$,Goals:()=>Q$,HeuristicAI:()=>e1,JavaScriptAI:()=>s1,NeuralPolicy:()=>NX,RecruitmentPattern:()=>$$,Suggester:()=>G$,alphaBetaSearch:()=>oG,defaultWeigh:()=>t1,firstWins:()=>cG,goalScore:()=>r1,keepAwayScore:()=>n1,personalScoreView:()=>q$,rootSplits:()=>sG,scoreWith:()=>Y$,sideScoreView:()=>J$,subjectsWhere:()=>K$}),a1=1e4,o1=16,s1=class{constructor(e={}){this.agents=new Map,this.states=new Map,this.options=e,m1(e.maxSteps??a1,`maxSteps`),h1(e.maxMilliseconds??o1,`maxMilliseconds`)}register(e){if(!/^[A-Za-z_][A-Za-z0-9_.-]*$/.test(e.id))throw Error(`invalid AI agent id: ${e.id}`);if(this.agents.has(e.id))throw Error(`AI agent already registered: ${e.id}`);if(!e.behaviors.length)throw Error(`AI agent has no behaviours: ${e.id}`);let t=new Set;for(let n of e.behaviors){if(!n.id||t.has(n.id))throw Error(`duplicate AI behaviour: ${n.id}`);t.add(n.id)}this.agents.set(e.id,e),this.states.set(e.id,{})}decide(e,t){let n=this.agents.get(e);if(!n)throw Error(`unknown AI agent: ${e}`);let r=d1(t.state??this.states.get(e)??{}),i=t.maxSteps??this.options.maxSteps??a1,a=t.maxMilliseconds??this.options.maxMilliseconds??o1;m1(i,`maxSteps`),h1(a,`maxMilliseconds`);let o=0,s=g1(),c=[],l=p1(t.seed??this.options.seed??7173991),u=()=>{if(o++,t.signal?.aborted)throw new c1;if(o>i||g1()-s>a)throw new l1},d={perception:f1(t.perception),state:r,random:()=>(u(),l()),checkpoint:u,emit(e,t){if(!e)throw Error(`AI event name must not be empty`);u(),c.push(t===void 0?{name:e}:{name:e,payload:f1(t)})}},f=null,p,m=`idle`;try{for(let e of n.behaviors)if(u(),!e.when||e.when(d)){p=e.id,f=u1(e.decide(d)),m=f?`action`:`idle`;break}}catch(e){if(e instanceof c1)m=`cancelled`;else if(e instanceof l1)m=`budget-exceeded`;else throw e}let h={agent:e,action:f,state:d1(r),behavior:p,status:m,steps:o,events:c};return this.states.set(e,d1(r)),this.options.onDecision?.(h),h}search(e,t,n){return oG(e,t,n)}exportState(){return{version:1,agents:Object.fromEntries([...this.states].map(([e,t])=>[e,d1(t)]))}}importState(e){if(e.version!==1)throw Error(`unsupported AI state version: ${e.version}`);for(let[t,n]of Object.entries(e.agents)){if(!this.agents.has(t))throw Error(`AI state names unknown agent: ${t}`);this.states.set(t,d1(n))}}dispose(){this.agents.clear(),this.states.clear()}},c1=class extends Error{constructor(){super(`AI decision cancelled`),this.name=`AICancelledError`}},l1=class extends Error{constructor(){super(`AI decision budget exceeded`),this.name=`AIBudgetExceededError`}};function u1(e){if(e===null)return null;if(!e||typeof e!=`object`||Array.isArray(e)||typeof e.type!=`string`||!e.type)throw Error(`AI action must be an object with a non-empty string type`);return f1(e)}function d1(e){return f1(e)}function f1(e){return typeof e!=`object`||!e?e:Array.isArray(e)?e.map(f1):Object.fromEntries(Object.entries(e).map(([e,t])=>[e,f1(t)]))}function p1(e){if(!Number.isInteger(e))throw TypeError(`AI seed must be an integer`);let t=e>>>0;return()=>(t=Math.imul(t,1664525)+1013904223>>>0,t/4294967296)}function m1(e,t){if(!Number.isInteger(e)||e<1)throw RangeError(`${t} must be a positive integer`)}function h1(e,t){if(!Number.isFinite(e)||e<0)throw RangeError(`${t} must be a non-negative number`)}function g1(){return typeof performance>`u`?Date.now():performance.now()}return _e(),Pa(),$o(),xs(),Object.defineProperty(e,"AI",{enumerable:!0,get:function(){return i1}}),e.Achievements=En,e.ActionJournal=wn,e.ActorAnimator=xF,Object.defineProperty(e,"Actors",{enumerable:!0,get:function(){return vU}}),e.AnimatedSprite=nN,e.Animation=eN,e.ArticulatedChain=EN,Object.defineProperty(e,"Audio",{enumerable:!0,get:function(){return kX}}),e.BLOB_SHAPES=VF,e.Bar=eB,Object.defineProperty(e,"Battle",{enumerable:!0,get:function(){return FW}}),e.Beam=sF,e.Beams=cF,e.BitmapLabel=_L,e.Blob=wr,Object.defineProperty(e,"Board",{enumerable:!0,get:function(){return zq}}),e.Button=dz,e.CIRCLE8=lr,e.COLOR_BLINDNESS_MATRICES=mP,e.Camera=cP,e.CanonicalState=Gt,e.ChainRig=DN,e.Checkbox=Tz,e.ClothSprite=OF,e.Collection=cn,e.ColorTransformBatcher=fM,e.Container2D=J,e.DataTable=Pz,e.DeformableSprite=lN,e.DialogueStage=OB,e.Dropdown=kz,e.DropdownView=Nz,e.EMPTY=XP,e.Easing=Er,e.EntityRegistry=Nr,e.FLOATING_TEXT_STACK_GAP=oB,e.FeedbackClient=Un,e.FixedStepper=Tr,e.Flights=oF,e.FloatingText=aB,e.FloatingTextStack=uB,e.FogLayer=pF,e.Game=nM,e.Generator=j,e.Gradient=aI,e.Grid=Bz,e.HALO_ANIMATION=mF,e.Halo=hF,e.HazeLayer=IF,e.HelpScreen=mB,e.HookRegistry=S,e.HttpTransport=Yt,Object.defineProperty(e,"I18n",{enumerable:!0,get:function(){return NR}}),e.IconGrid=DL,Object.defineProperty(e,"Input",{enumerable:!0,get:function(){return ve}}),e.JavaRandom=St,e.Label=EI,e.LastRun=vn,e.LayeredSprite=rF,e.LightningArc=lF,e.LiquidLayer=dF,e.ListView=EL,e.LoadQueue=Mr,e.LoadingScreen=gB,e.LockstepClient=Qt,e.Logger=b,e.MarkupText=dL,e.MarqueeLabel=EB,e.MersenneTwister=he,e.MessageBox=lz,e.MessageLog=AI,e.Meter=Zz,e.Minimap=vP,Object.defineProperty(e,"Mwl",{enumerable:!0,get:function(){return W$}}),e.NEIGHBOURS4=sr,e.NEIGHBOURS8=cr,e.NO_COLOR_ADD=SM,e.NeonGlow=BF,e.NewsClient=an,e.NewsSeenTracker=sn,e.NinePatch=yL,e.Node2D=$F,e.OnScreenKeyboard=gz,e.ParticleEmitter=yF,e.PinnedDeform=cN,e.Player=un,e.PlayerInput=vt,e.PlayerStats=nn,e.PresentationQueue=Pr,e.Projectile=iF,e.QualityScaler=jj,e.RENDERING_DECISIONS=sI,e.RPGM_AUTOTILE_SLOT_BASES=OP,e.RPGM_AUTOTILE_SLOT_COUNTS=kP,e.RPGM_FLOOR_AUTOTILE_TABLE=jP,e.RPGM_WALL_AUTOTILE_TABLE=MP,e.RadioGroup=Ez,Object.defineProperty(e,"Random",{enumerable:!0,get:function(){return C}}),e.RandomStreams=ge,e.ReactionTable=Dn,e.RebindScreen=Yz,e.Recorder=ln,e.Rectangle2D=G,e.Registry=g,Object.defineProperty(e,"Resources",{enumerable:!0,get:function(){return aP}}),e.RichLabel=KI,Object.defineProperty(e,"Roguelike",{enumerable:!0,get:function(){return bH}}),Object.defineProperty(e,"Rpg",{enumerable:!0,get:function(){return gW}}),e.RpgmAutotileAtlas=DP,e.RunHistory=tn,e.SaveSyncClient=Xt,e.SaveSystem=zt,e.Scene=m,e.Scene2D=rM,e.SceneComponentHost=v,e.SceneStack=h,e.ScreenEffects=bF,e.ScreenReader=xL,e.ScrollBox=Mz,e.ScrollDrag=jz,e.ScrollText=TB,e.Session=On,e.Settings=Nn,e.SettingsScreen=Xz,e.Shape2D=tI,e.Signal=p,Object.defineProperty(e,"Simulation",{enumerable:!0,get:function(){return YX}}),e.SkeletalSprite=TN,Object.defineProperty(e,"Skeleton",{enumerable:!0,get:function(){return uN}}),e.Skins=qz,e.Slider=wz,e.Spawner=Wn,e.Spinner=Oz,e.SpringSprite=kF,e.Sprite2D=rI,e.SpriteAttachment=uF,e.SpriteGroup=aN,e.SpriteMotion=TF,e.SpriteSheet=sP,e.StageScript=kB,e.StateRegistry=Kt,e.StatsScreen=hB,e.StatusVisuals=SF,e.StoredValue=Bt,e.StoryScreen=FB,e.StorySequence=PB,e.SyncGuard=zr,e.TabbedList=OL,e.TelemetryClient=rn,e.TerrainGraphicsLayer=oI,e.Text2D=nI,e.TextModel=uz,e.TextPrompt=vz,e.Texture2D=q,e.TileMap=nF,e.TiledSprite=iI,e.TintedSprite=CM,e.Toast=dB,e.Tooltip=fB,e.TooltipHost=pB,e.TransitionRunner=Zj,e.TreeView=Lz,e.Tweener=Dr,e.UPPERCASE_KEYBOARD=pz,e.UndoHistory=Or,e.VerticalLabel=xz,e.Viewport=fP,e.Window=CL,e.WindowStack=wL,Object.defineProperty(e,"World",{enumerable:!0,get:function(){return EU}}),e.XP_AUTOTILE_PATTERNS=NP,e.XP_NEIGHBORS_TO_PATTERN=PP,e.advanceReveal=CI,e.anchorAlign=Rz,e.applyAllImageModifiers=UM,e.applyImageModifiers=HM,e.applyTextureModifiers=JM,e.assertAutotileLayout=RP,e.autotileCellParts=WP,e.autotileFrames=KF,e.bitmapLabelStyle=vL,e.blendMatrix=LM,e.blendPixels=ZM,e.blobIndex=GF,e.cellFromKey=or,e.cellIndex=nr,e.cellInside=tr,e.cellKey=ar,e.cellX=rr,e.cellY=ir,e.channelScaleMatrix=IM,e.channelSwapMatrix=RM,e.chebyshev=dr,e.checkNoControlCharacters=kt,e.checkSize=Ot,e.clamp=kn,e.cloneData=Wt,e.colorShiftMatrix=FM,e.completeReveal=wI,e.contrastRatio=bB,e.createCamera=dP,e.createColorBlindnessFilter=hP,e.createHandles=_,e.createLayers=eI,e.croppedTexture=WM,e.defaultSettings=An,e.defaultStorage=Rt,e.defaultTheme=gI,e.deserializeReplay=fn,e.detectWebGpu=lI,e.dissolve=Yj,e.distance=pr,e.downloadReplayFile=xn,e.effectiveMusicVolume=jn,e.effectiveSfxVolume=Mn,e.ellipsize=SB,e.escapeHtml=iL,e.euclidean=ur,e.exportReplayFile=gn,e.extractDialogueCatalog=NB,e.fitWindowZoom=jI,e.floatingTextAgeAtLeast=iB,e.floatingTextAlpha=nB,e.floatingTextRise=rB,e.floatingTextStackLifePenalty=sB,e.floatingTextStackLift=cB,e.floatingTextStackMoves=lB,e.flowLayout=Gz,e.glowFalloff=RF,e.grow=Kj,e.hazeField=PF,e.hexDistance=Yn,e.hexLine=Zn,e.hexNeighbors=Jn,e.hexRange=Qn,e.hexRotate=JF,e.hexToPixel=$n,e.highContrastTheme=_I,e.imageModifier=NM,e.importReplayFile=_n,e.importTwee=jB,e.inspectGraphicsCapabilities=cI,e.iris=Jj,e.isOnScreen=iN,e.layoutMarkupLines=tL,e.layoutVertical=bz,e.linesToDrop=kI,e.loadSvgSkeleton=hI,e.loadTiledMap=mI,e.manhattan=fr,e.markupAccessibilityText=eL,e.markupToHtml=$I,e.marqueeOffset=wB,e.maskPixels=XM,e.matchTerrainRule=XF,e.meetsContrast=xB,e.messageBoxPresenter=_B,e.minimapCellCenter=_P,e.motionDuration=Cr,e.newlyRevealed=gP,e.openAnimationFrame=Xj,e.packColorAdd=yM,e.packTintAdd=bM,e.paintFogPixels=fF,e.paintGlowPixels=zF,e.paintHazePixels=FF,e.paletteRangeMapping=OM,e.parseCSV=Br,e.parseColorPairs=KM,e.parseDialogueLines=Wr,e.parseDialogueText=MB,e.parseImagePath=MM,e.parseInbound=Pt,e.parseMarkdown=UI,e.parseMarkup=ZI,e.parsePaletteLists=qM,e.parseReplayEvents=pn,e.parseRotateMode=PM,e.parseTwee=Gr,e.pickReplayFile=Cn,e.pixelToHex=er,e.pop=Gj,e.popScale=Lj,e.positionMarkupLines=rL,e.prefersReducedMotion=yr,e.readReplayFile=Sn,e.recolorTexture=jM,e.rectOf=oP,e.reducedMotion=br,e.registerColorTransform=vM,e.relativeLuminance=yB,e.remapPixels=kM,e.resolveAnchor=zz,e.resolveEasing=Rj,e.resolveTerrainGraphics=ZF,e.resumeRunPlayer=bn,e.revealComplete=TI,e.rotatePixels=QM,e.rpgmAutotileFrame=EP,e.rpgmAutotileSlot=AP,e.rpgmTableEdgeCells=YP,e.runCheckpoint=yn,e.sanitizeInboundText=At,e.scramble=Ct,e.screenReader=SL,e.scrollOffset=Az,e.serializeReplay=dn,e.setReducedMotion=xr,e.setTheme=yI,e.sharpenText=NI,e.shrink=Uj,e.sliceSpans=GI,e.slide=qj,e.sliderFraction=Sz,e.sliderValueAt=Cz,e.snapZoom=uP,e.spinValue=Dz,e.splitScreenHalves=pP,e.spriteColorMatrix=zM,e.squareRotate=qF,e.startReveal=SI,e.stateChecksum=Rr,e.stripMarkdown=WI,e.stripMarkup=QI,e.takeLastEntries=OI,e.theme=Q,e.themeChanged=$,e.tileDelays=Fj,e.tileFrame=$P,e.tileFrameIndex=tF,e.tileFrameSheet=eF,e.tileProgress=Ij,e.tileShrink=Hj,e.truncateLines=CB,e.uncloneablePath=Vt,e.unscramble=wt,e.validateSchema=Nt,e.version=f,e.watchReducedMotion=Sr,e.weightedFlood=kr,e.withTextureCanvas=AM,e.xpAutotilePattern=IP,e.xpAutotileRef=FP,e})({});
|
|
1399
|
+
`+t+`]`}return r.pop(),i=t,c}}}}))}))(),1),lQ=class extends Error{constructor(e){super(`${e.location.file}:${e.location.line}:${e.location.column}: ${e.message}`),this.name=`MwlSyntaxError`,this.diagnostic=e}},uQ=new Set([`define`,`enddef`,`arg`,`ifdef`,`ifndef`,`else`,`endif`,`include`]);function dQ(e,t={}){let n=new Map,r=new Set(t.defines??[]),i=e.split(/\r?\n/),a=[],o=[!0],s=null;for(let e=0;e<i.length;e++){let c=i[e],l=/^\s*#([A-Za-z_][\w-]*)(?:\s+(.*))?$/.exec(c);if(l&&uQ.has(l[1])){let i=l[1],u=l[2]?.trim()??``;if(i===`define`){if(!o.at(-1)||s)continue;let n=jQ(u);if(n.length===0)throw NQ(`MWL_DEFINE`,`macro name is required`,t.file,e,c);s={name:n[0],parameters:n.slice(1),body:[]},r.add(n[0]);continue}if(i===`arg`){s&&u&&s.parameters.push(u.split(/\s+/)[0]);continue}if(i===`enddef`){if(!s)throw NQ(`MWL_ENDDEF`,`unexpected #enddef`,t.file,e,c);n.set(s.name,{name:s.name,parameters:s.parameters,body:s.body.join(`
|
|
1400
|
+
`)}),s=null;continue}if(i===`ifdef`||i===`ifndef`){let e=r.has(u);o.push(o.at(-1)===!0&&(i===`ifdef`?e:!e));continue}if(i===`else`){if(o.length<2)throw NQ(`MWL_ELSE`,`unexpected #else`,t.file,e,c);o[o.length-1]=o[o.length-2]&&!o.at(-1);continue}if(i===`endif`){if(o.length<2)throw NQ(`MWL_ENDIF`,`unexpected #endif`,t.file,e,c);o.pop();continue}if(i===`include`){if(o.at(-1)){let n=t.includes?.[MQ(u)];if(n===void 0)throw NQ(`MWL_INCLUDE`,`include not supplied: ${u}`,t.file,e,c);a.push(dQ(n,t))}continue}}s?o.at(-1)&&s.body.push(c):o.at(-1)&&!/^\s*#/.test(c)&&a.push(c)}if(s)throw NQ(`MWL_ENDDEF`,`macro ${s.name} is missing #enddef`,t.file,i.length-1,i.at(-1)??``);if(o.length!==1)throw NQ(`MWL_ENDIF`,`conditional is missing #endif`,t.file,i.length-1,i.at(-1)??``);return mQ(fQ(a.join(`
|
|
1401
|
+
`),n,t))}function fQ(e,t,n){let r=``,i=0;for(;i<e.length;){let a=gQ(e,i);if(a!==i){r+=e.slice(i,a),i=a;continue}let o=e[i];if(o!==`{`){r+=o,i++;continue}let s=e.indexOf(`}`,i+1);if(s<0){r+=o,i++;continue}let c=e.slice(i,s+1),l=jQ(e.slice(i+1,s)),u=t.get(l[0]);if(u){let e=u.body;for(let t=0;t<u.parameters.length;t++){let n=u.parameters[t],r=l.find(e=>e.startsWith(`${n}=`)),i=r?r.slice(n.length+1):l[t+1]??``;e=e.replaceAll(`{${n}}`,i)}r+=fQ(e,t,n)}else if(n.macroPolicy!==`ignore`&&pQ(l[0]))throw PQ(`MWL_MACRO`,`unknown macro "${l[0]}"`,e,n.file,i);else r+=c;i=s+1}return r}function pQ(e){return e!==void 0&&wQ.test(e)}function mQ(e){let t=/^_\(\s*("(?:[^"\\]|\\[\s\S])*"|'(?:[^'\\]|\\[\s\S])*')\s*\)/,n=``,r=0;for(;r<e.length;){let i=gQ(e,r);if(i!==r){n+=e.slice(r,i),r=i;continue}let a=e[r];if(a===`_`){let i=t.exec(e.slice(r));if(i){n+=`{"$gettext": ${i[1]}}`,r+=i[0].length;continue}}n+=a,r++}return n}function hQ(e,t){let n=e[t],r=t+1;for(;r<e.length;){let t=e[r];if(t===`\\`)r+=2;else{if(t===n)return r+1;if(t===`
|
|
1402
|
+
`)return r;r++}}return r}function gQ(e,t){let n=e[t];if(n===`"`||n===`'`)return hQ(e,t);let r=e[t+1];if(n===`/`&&(r===`/`||r===`*`)){let n=r===`/`?e.indexOf(`
|
|
1403
|
+
`,t):e.indexOf(`*/`,t+2);return n<0?e.length:r===`/`?n:n+2}return t}function _Q(e,t=`<mwl>`){let n=mQ(e);if(n.trim()===``)return[];let r;try{r=cQ.default.parse(n)}catch(e){throw OQ(e,n,t)}if(r===void 0)return[];if(!Array.isArray(r))throw new lQ({code:`MWL_DOCUMENT`,message:`MWL document must be a top-level array of nodes`,location:{file:t,line:1,column:1},lineText:n.split(/\r?\n/)[0]??``});let i={file:t,sites:TQ(n,t),cursor:{index:0},parent:void 0};return vQ(r).map(e=>SQ(e,i))}function vQ(e){let t=[];for(let n of e){let e=yQ(n);Array.isArray(e)?t.push(...e):t.push(e)}return t}function yQ(e){if(Array.isArray(e))return e.flatMap(e=>yQ(e));if(typeof e!=`object`||!e)return e;let t=e;if(typeof t.tag!=`string`){let n=Object.keys(t);if(n.length!==1||!wQ.test(n[0]))return e;let r=n[0],i=t[r];return Array.isArray(i)?i.map(e=>bQ(r,e)):bQ(r,i)}let n={...t},r=[];Array.isArray(t.children)&&r.push(...t.children.flatMap(e=>yQ(e)));for(let[e,i]of Object.entries(t)){if(e===`tag`||e===`children`||!wQ.test(e)||!xQ(i))continue;let t=Array.isArray(i)?i:[i];r.push(...t.map(t=>bQ(e,t))),delete n[e]}return r.length&&(n.children=r),n}function bQ(e,t){return typeof t!=`object`||!t||Array.isArray(t)?{tag:e,value:t}:yQ({tag:e,...t})}function xQ(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&!(`$gettext`in e)||Array.isArray(e)&&e.every(e=>typeof e==`object`&&!!e&&!Array.isArray(e))}function SQ(e,t){if(typeof e!=`object`||!e||Array.isArray(e))throw new lQ({code:`MWL_TAG`,message:`MWL node must be an object with a tag`,location:t.parent??{file:t.file,line:1,column:1}});let n=e;if(typeof n.tag!=`string`||!wQ.test(n.tag))throw new lQ({code:`MWL_TAG`,message:`MWL node needs a tag name`,location:t.parent??{file:t.file,line:1,column:1}});let r=n.tag,i=EQ(t,r),a=i.location,o=n.children??[];if(!Array.isArray(o))throw new lQ({code:`MWL_TAG`,message:`children of [${r}] must be an array`,location:a});let s={},c={},l={},u=[];for(let[e,t]of Object.entries(n)){if(e===`tag`||e===`children`)continue;s[e]=CQ(r,e,t,a,u);let n=i.properties?.get(e);n&&(c[e]=n.location,l[e]=n.valueLocation)}let d={...t,parent:a},f={tag:r,attributes:s,children:o.map(e=>SQ(e,d)),location:a,gettext:u};return Object.defineProperties(f,{attributeLocations:{value:c,enumerable:!1},valueLocations:{value:l,enumerable:!1}}),f}function CQ(e,t,n,r,i){if(!wQ.test(t)||t.startsWith(`$`)||t.startsWith(`_`))throw new lQ({code:`MWL_ATTRIBUTE`,message:`unknown attribute "${t}" on [${e}]`,location:r});if(typeof n==`string`)return n;if(typeof n==`number`&&Number.isFinite(n))return String(n);if(typeof n==`boolean`)return n?`true`:`false`;if(typeof n==`object`&&n&&!Array.isArray(n)){let e=Object.keys(n),r=n.$gettext;if(e.length===1&&e[0]===`$gettext`&&typeof r==`string`)return i.push(t),r}throw new lQ({code:`MWL_ATTRIBUTE`,message:`attribute "${t}" on [${e}] must be a string, number, boolean, or _("...")`,location:r})}var wQ=/^[A-Za-z_][\w-]*$/;function TQ(e,t){let n=[],r=[];for(let i=0;i<e.length;){let a=gQ(e,i);if(a!==i){i=a;continue}let o=e[i];if(o===`{`){let e={start:i,properties:new Map};r.push(e),i++;continue}if(o===`}`){r.pop(),i++;continue}let s=/[A-Za-z_$][\w$-]*/y;s.lastIndex=i;let c=s.exec(e);if(!c){i++;continue}let l=c.index+c[0].length;for(;/\s/.test(e[l]??``);)l++;if(e[l]!==`:`){i=c.index+c[0].length;continue}let u=l+1;for(;/\s/.test(e[u]??``);)u++;let d=r.at(-1);if(d&&(d.properties.set(c[0],{location:DQ(e,t,c.index),valueLocation:DQ(e,t,u)}),c[0]===`tag`&&(e[u]===`"`||e[u]===`'`))){let r=hQ(e,u),i=e.slice(u,r),a;try{a=cQ.default.parse(i)}catch{a=void 0}typeof a==`string`&&n.push({tag:a,location:DQ(e,t,c.index),properties:d.properties})}i=c.index+c[0].length}return n}function EQ(e,t){for(let n=e.cursor.index;n<e.sites.length;n++)if(e.sites[n].tag===t)return e.cursor.index=n+1,e.sites[n];return{tag:t,location:e.parent??{file:e.file,line:1,column:1}}}function DQ(e,t,n){let r=1,i=1;for(let t=0;t<n;t++)e[t]===`
|
|
1404
|
+
`?(r++,i=1):i++;return{file:t,line:r,column:i}}function OQ(e,t,n){let r=t.split(/\r?\n/),i=e,a=typeof i?.lineNumber==`number`?i.lineNumber:1,o=typeof i?.columnNumber==`number`?i.columnNumber:1,s=e instanceof Error?e.message:String(e);return s.includes(`'_'`)&&(s+=` (write translatable text as _("..."))`),new lQ({code:`MWL_SYNTAX`,message:s,location:{file:n,line:Math.max(1,a),column:Math.max(1,o)},lineText:r[Math.max(1,a)-1]})}function kQ(e,t,n=e){let r=e.trim(),i=/^_\(\s*([\s\S]*?)\s*\)$/.exec(r),a=i?i[1]:r;if(a.startsWith(`"`)||a.startsWith(`'`)){try{let e=cQ.default.parse(a);if(typeof e==`string`)return e}catch{}throw new lQ({code:`MWL_STRING`,message:`unterminated string value`,location:t,lineText:n})}if(i)throw new lQ({code:`MWL_STRING`,message:`_("...") needs a quoted string`,location:t,lineText:n});return r}function AQ(e){return/^_\(\s*["']/.test(e.trim())}function jQ(e){let t=[],n=``,r=!1;for(let i=0;i<e.length;i++){let a=e[i];a===`"`&&(r=!r),/\s/.test(a)&&!r?(n&&t.push(n),n=``):n+=a}return n&&t.push(n),t}function MQ(e){return e.startsWith(`"`)&&e.endsWith(`"`)?e.slice(1,-1):e}function NQ(e,t,n,r,i){return new lQ({code:e,message:t,location:{file:n??`<mwl>`,line:r+1,column:1},lineText:i})}function PQ(e,t,n,r,i){let a=DQ(n,r??`<mwl>`,i);return new lQ({code:e,message:t,location:a,lineText:n.split(/\r?\n/)[a.line-1]})}function FQ(e,t,n,r){if(!Number.isInteger(t.version)||t.version<1)throw Error(`MWL save version must be a positive integer`);let i={format:`mwl-save`,version:t.version,world:e,...n===void 0?{}:{hookState:BQ(n)},...r===void 0?{}:{journal:VQ(r)}};return JSON.stringify(i)}function IQ(e,t){return LQ(e,t).world}function LQ(e,t){let n=JSON.parse(e),r=zQ(n)?n:{format:`mwl-save`,version:1,world:n};if(r.version>t.version)throw Error(`MWL save version ${r.version} is newer than supported version ${t.version}`);let i=RQ(r.world);for(let e=r.version;e<t.version;e++){let n=t.migrations?.[e+1];if(!n)throw Error(`missing MWL save migration to version ${e+1}`);i=RQ(n(i))}return{format:`mwl-save`,version:t.version,world:i,...r.hookState===void 0?{}:{hookState:BQ(r.hookState)},...r.journal===void 0?{}:{journal:VQ(r.journal)}}}function RQ(e){if(!e||typeof e!=`object`)throw Error(`invalid MWL saved world`);Mt(e);let t=e;if(!Number.isInteger(t.turn)||!t.variables||typeof t.variables!=`object`||!t.units||typeof t.units!=`object`)throw Error(`invalid MWL saved world: turn, variables, and units are required`);if(t.status!==void 0&&![`playing`,`won`,`lost`].includes(t.status))throw Error(`invalid MWL saved world status`);return Wt(t,`saved world`)}function zQ(e){return!!e&&typeof e==`object`&&e.format===`mwl-save`&&typeof e.version==`number`&&`world`in e}function BQ(e){if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`invalid MWL hook state`);Mt(e);let t;try{t=JSON.stringify(e)}catch{throw Error(`MWL hook state must be JSON-serialisable`)}let n=JSON.parse(t);if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`invalid MWL hook state`);return n}function VQ(e){try{let t=JSON.stringify(e),n=JSON.parse(t);if(!Array.isArray(n))throw Error();return Mt(n),n}catch{throw Error(`MWL journal must be JSON-serialisable`)}}function HQ(e,t,n={}){return UQ(e,t,n)}function UQ(e,t,n,r){let i=e.search(/\s+where\s+/),a=i<0?e:e.slice(0,i),o={...t};if(i>=0)for(let t of e.slice(i).replace(/^\s+where\s+/,``).split(`,`)){let e=/^\s*([A-Za-z_][A-Za-z0-9_.-]*)\s*=\s*(.+)\s*$/.exec(t);if(!e)throw Error(`invalid MWL where binding: ${t}`);let i=new WQ(e[2],o,n.helpers??{},r);if(o[e[1]]=i.parseOr(),!i.atEnd())throw Error(`invalid MWL where binding: ${t}`)}let s=new WQ(a,o,n.helpers??{},r),c=s.parseOr();if(!s.atEnd())throw Error(`unexpected token in MWL condition: ${s.peek()}`);return YQ(c)}var WQ=class{constructor(e,t,n,r){this.index=0,this.depth=0,this.tokens=JQ(e),this.context=t,this.helpers=n,this.unread=r}parseOr(){let e=this.parseAnd();for(;this.take(`or`);){let t=this.parseAnd();e=YQ(e)||YQ(t)}return e}parseAnd(){let e=this.parseNot();for(;this.take(`and`);){let t=this.parseNot();e=YQ(e)&&YQ(t)}return e}parseNot(){return this.take(`not`)?!YQ(this.parseNot()):this.parseComparison()}parseComparison(){let e=this.parseAdditive(),t=this.peek();if(![`==`,`~=`,`<`,`<=`,`>`,`>=`].includes(t))return e;this.index++;let n=this.parseAdditive();if(t===`==`)return e===n;if(t===`~=`)return e!==n;if(typeof e!=`number`||typeof n!=`number`)throw Error(`${t} requires numeric operands`);return t===`<`?e<n:t===`<=`?e<=n:t===`>`?e>n:e>=n}parseAdditive(){let e=this.parseMultiplicative();for(;this.peek()===`+`||this.peek()===`-`;){let t=this.tokens[this.index++],n=this.parseMultiplicative();if(typeof e!=`number`||typeof n!=`number`)throw Error(`${t} requires numeric operands`);e=t===`+`?e+n:e-n}return e}parseMultiplicative(){let e=this.parsePrimary();for(;this.peek()===`*`||this.peek()===`/`;){let t=this.tokens[this.index++],n=this.parsePrimary();if(typeof e!=`number`||typeof n!=`number`)throw Error(`${t} requires numeric operands`);if(t===`/`&&n===0&&!this.unread)throw Error(`division by zero in MWL condition`);e=t===`*`?e*n:e/n}return e}parsePrimary(){if(this.take(`(`)){if(++this.depth>KQ)throw Error(`MWL condition is nested more than ${KQ} deep`);let e=this.parseOr();return this.expect(`)`),this.depth--,e}let e=this.tokens[this.index++];if(e===void 0)throw Error(`incomplete MWL condition`);if(/^-?(?:\d+(?:\.\d*)?|\.\d+)$/.test(e))return Number(e);if(e===`true`||e===`yes`)return!0;if(e===`false`||e===`no`)return!1;if(e.startsWith(`"`)||e.startsWith(`'`))return e.slice(1,-1);let t=this.helpers[e];if(t&&this.take(`(`)){let e=[];if(!this.take(`)`)){do e.push(this.parseOr());while(this.take(`,`));this.expect(`)`)}return t(...e)}let n=this.context[e];if(n===void 0&&this.unread)return this.unread.add(e),1;if(n===void 0)throw Error(`missing MWL condition variable "${e}"`);return n}take(e){return this.peek()===e&&(this.index++,!0)}expect(e){if(!this.take(e))throw Error(`expected "${e}" in MWL condition`)}peek(){return this.tokens[this.index]??`<end>`}atEnd(){return this.index>=this.tokens.length}},GQ=1024,KQ=64;function qQ(e){let t=new Set;return UQ(e,{},{},t),[...t]}function JQ(e){let t=[],n=/\s*(?:("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')|([A-Za-z_][A-Za-z0-9_.-]*)|(-?(?:\d+(?:\.\d*)?|\.\d+))|(==|~=|<=|>=|[()+*/,<>-]))/y,r=0;for(;r<e.length;){n.lastIndex=r;let i=n.exec(e);if(!i)throw Error(`invalid MWL condition near "${e.slice(r)}"`);if(t.length>=GQ)throw Error(`MWL condition has more than ${GQ} tokens`);t.push(i[1]??i[2]??i[3]??i[4]),r=n.lastIndex}return t}function YQ(e){return e!==!1&&e!==0&&e!==``}function XQ(e){let t=new n$(e),n=t.expression();if(t.skip(),!t.atEnd())throw Error(`invalid MWL expression near "${t.rest()}"`);return n}function ZQ(e,t){let n=typeof e==`string`?XQ(e):e;if(n.kind===`number`)return n.value;if(n.kind===`variable`){let e=t[n.name];if(e===void 0||!Number.isFinite(e))throw Error(`missing MWL expression variable "${n.name}"`);return e}let r=ZQ(n.left,t),i=ZQ(n.right,t);if(n.op===`+`)return r+i;if(n.op===`-`)return r-i;if(n.op===`*`)return r*i;if(n.op===`/`){if(i===0)throw Error(`division by zero in MWL expression`);return r/i}return r**i}var QQ=256,$Q=4096,e$=/(?:\d+(?:\.\d*)?|\.\d+)/y,t$=/[A-Za-z_][A-Za-z0-9_.-]*/y,n$=class{constructor(e){this.index=0,this.depth=0,this.operators=0,this.source=e}expression(){return this.additive()}additive(){let e=this.multiplicative();for(;;){this.skip();let t=this.peek(`+`)?`+`:this.peek(`-`)?`-`:null;if(!t)return e;this.index++,this.operator(),e={kind:`binary`,op:t,left:e,right:this.multiplicative()}}}multiplicative(){let e=this.power();for(;;){this.skip();let t=this.peek(`*`)?`*`:this.peek(`/`)?`/`:null;if(!t)return e;this.index++,this.operator(),e={kind:`binary`,op:t,left:e,right:this.power()}}}power(){let e=this.primary();return this.skip(),this.peek(`^`)&&(this.index++,this.operator(),e={kind:`binary`,op:`^`,left:e,right:this.nested(()=>this.power())}),e}primary(){if(this.skip(),this.peek(`(`)){this.index++;let e=this.nested(()=>this.expression());if(this.skip(),!this.peek(`)`))throw Error(`missing closing parenthesis in MWL expression`);return this.index++,e}let e=this.match(e$);if(e)return this.index+=e[0].length,{kind:`number`,value:Number(e[0])};let t=this.match(t$);if(t)return this.index+=t[0].length,{kind:`variable`,name:t[0]};throw Error(`expected number, variable, or parenthesis near "${this.rest()}"`)}match(e){return e.lastIndex=this.index,e.exec(this.source)}nested(e){if(++this.depth>QQ)throw Error(`MWL expression is nested more than ${QQ} deep`);try{return e()}finally{this.depth--}}operator(){if(++this.operators>$Q)throw Error(`MWL expression has more than ${$Q} operators`)}peek(e){return this.source[this.index]===e}skip(){for(;/\s/.test(this.source[this.index]??``);)this.index++}atEnd(){return this.index>=this.source.length}rest(){let e=this.source.slice(this.index,this.index+40);return this.index+40<this.source.length?`${e}...`:e}};function r$(e){let t=[],n=e=>{t.push(e),e.children.forEach(n)};return e.forEach(n),t}function i$(e,t){let n=e.attributes[t];if(!n)throw Error(`MWL ${e.tag} is missing ${t}`);return n}function a$(e,t){let n=e.attributes[t];if(n===void 0)return;let r=Number(n);return Number.isFinite(r)?r:void 0}function o$(e,t,n){let r=e.attributes[t];if(r===void 0)return n;let i=Number.parseInt(r,10);return Number.isFinite(i)?i:n}function s$(e,t){return c$(e.attributes[t])}function c$(e){return e===void 0?void 0:e===`true`||e===`yes`}function l$(e,t){return e!==void 0&&t.includes(e)?e:void 0}function u$(e,t,n){let r=n.carryoverPercentage??80,i=t?e.gold[t.id]??e.sides[t.id]?.gold??0:0;return{result:n.result,gold:Math.floor(i*r/100)+(n.bonus??0),add:n.carryoverAdd??!1,recall:t?Object.entries(e.units).filter(([,e])=>e.alive&&e.side===t.id).map(([e])=>e).sort():[],nextScenario:n.nextScenario??null}}function d$(e,t){return e.add?t+e.gold:Math.max(t,e.gold)}_e();var f$=i$,p$=(e,t,n)=>o$(e,t,n)??n;function m$(){return{variables:{},units:{},sides:{},maps:{},gold:{},turn:1,status:`playing`,sideStatus:{},map:null,timeOfDay:``,scheduleIndex:0}}var h$=1048576;function g$(e){let t=e.split(/\r?\n/).filter(e=>e.trim()!==``).map(e=>e.split(`,`).map(e=>e.trim())),n=t.length,r=t.reduce((e,t)=>Math.max(e,t.length),0);if(r*n>h$)throw Error(`MWL terrain is ${r}x${n}, more than ${h$} cells`);let i=[],a={};for(let e=0;e<n;e++)for(let n=0;n<r;n++){let r=t[e]?.[n]??`_off^_usr`,o=/^([A-Za-z0-9_][\w.-]*)\s+(\S.*)$/.exec(r);o?(i.push(o[2]),(a[o[1]]??=[]).push({x:n,y:e})):i.push(r)}return{width:r,height:n,codes:i,starts:a}}var _$=/\$\(([^)]*)\)/g,v$=/\$([A-Za-z_][A-Za-z0-9_.]*)/g,y$=class e{constructor(e,t={}){this.journal=new wn,this.unitTypes=new Map,this.schedule=[],this.pendingDialogue=null,this.dialogueCounter=0,this.traceBatch=null,this.game=e,this.world=t.world??m$(),this.onMessage=t.onMessage,this.resolveMap=t.resolveMap,this.hooks=t.hooks,this.onTrace=t.onTrace,this.persistence=t.persistence??{version:1},this.random=t.random??new j,!t.random&&this.world.random&&this.random.setState(this.world.random),this.loadUnitTypes(),this.loadSchedule(),this.loadInitialContent(),this.loadInitialUnits(),this.loadLeaders(),this.loadScenarioExtras()}run(e){this.recordAction({type:`run`,trigger:e},()=>this.runInternal(e))}runInternal(e){for(let t of this.nodes(`event`))(t.attributes.on??t.attributes.trigger)===e&&this.eventFiltersMatch(t)&&this.claimEvent(t)&&this.executeTracedEvent(t,e);this.checkObjectives()}fireEvent(e){return this.recordAction({type:`fire_event`,id:e},()=>this.fireEventInternal(e))}fireEventInternal(e){let t=this.nodes(`event`).find(t=>t.attributes.id===e);return!t||!this.eventFiltersMatch(t)||!this.claimEvent(t)?!1:(this.executeTracedEvent(t,`fireEvent`),this.checkObjectives(),!0)}fireMoveto(e){this.recordAction({type:`fire_moveto`,unit:e},()=>this.fireMovetoInternal(e))}fireMovetoInternal(e){let t=this.world.units[e];if(t&&t.alive){for(let n of this.nodes(`event`))(n.attributes.on??n.attributes.trigger)===`moveto`&&(n.attributes.x===void 0||B$(n.attributes.x,t.x))&&(n.attributes.y===void 0||B$(n.attributes.y,t.y))&&(n.attributes.unit===void 0||n.attributes.unit===e)&&(n.attributes.side===void 0||n.attributes.side===t.side)&&this.eventFiltersMatch(n)&&this.claimEvent(n)&&this.executeTracedEvent(n,`moveto`);this.checkObjectives()}}claimEvent(e){if(!(e.attributes.once===void 0?e.attributes.on===`moveto`:e.attributes.once!==`false`))return!0;let t=e.attributes.id??`${e.attributes.on??e.attributes.trigger??`event`}@${e.location?.line??0}`,n=this.world.firedEvents??=[];return!n.includes(t)&&(n.push(t),!0)}eventFiltersMatch(e){if(!this.conditionMatches(e)||!this.filterConditionMatches(e))return!1;let t=e.children.find(e=>e.tag===`filter`);return!t||this.filterMatches(t)}executeEvent(e){this.runBlock(this.commandChildren(e))}runBlock(e){for(let t=0;t<e.length;t++){let n=e[t];this.isConsumedElse(e,t)||(n.tag===`say`?this.showSay(n):n.tag===`dialogue`?this.showDialogue(n):this.executeNode(n))}}isConsumedElse(e,t){let n=e[t-1];return e[t]?.tag===`else`&&n?.tag===`if`&&this.nodeConditionMatches(n)}executeTracedEvent(e,t){let n=e.attributes.id??`${e.attributes.on??e.attributes.trigger??`event`}@${e.location?.line??0}`;this.trace({type:`event`,phase:`claimed`,id:n,trigger:t});try{this.executeEvent(e),this.trace({type:`event`,phase:`completed`,id:n,trigger:t})}catch(e){throw this.trace({type:`error`,message:String(e),event:n}),e}}showDialogue(e){let t=null;for(let n of e.children)n.tag===`message`?(this.showMessage(n.attributes),t={text:n.attributes.text??n.attributes.value??``,...n.attributes.speaker===void 0?{}:{speaker:n.attributes.speaker},...n.attributes.portrait===void 0?{}:{portrait:n.attributes.portrait},...n.attributes.side===void 0||n.attributes.side===``?{}:{side:n.attributes.side}}):n.tag===`say`&&(this.showSay(n),t={text:n.attributes.text??``,speaker:n.attributes.speaker});let n=[];for(let t of e.children){if(t.tag!==`choice`||!t.attributes.text||t.attributes.variable!==void 0&&!M$(this.variableAt(t.attributes.variable),t.attributes.equals))continue;let e=t.children.filter(e=>e.tag===`branch`);if(e.length)for(let r of e)n.push({text:r.attributes.text??t.attributes.text,branch:r.children});else t.attributes.event&&n.push({text:t.attributes.text,event:t.attributes.event})}if(n.length===0)return;this.dialogueCounter+=1;let r=`dialogue-${this.dialogueCounter}`;this.pendingDialogue={id:r,choices:n},this.world.pendingDialogue={id:r,choices:n},this.onMessage?.({text:t?.text??``,...t?.speaker===void 0?{}:{speaker:t.speaker},choices:n,dialogueId:r})}showSay(e){this.onMessage&&this.onMessage({text:e.attributes.text??``,...e.attributes.speaker===void 0?{}:{speaker:e.attributes.speaker}})}answerDialogue(e,t){return this.recordAction({type:`answer_dialogue`,dialogueId:e,choiceIndex:t},()=>this.answerDialogueInternal(e,t))}answerDialogueInternal(e,t){let n=this.pendingDialogue;if(!n||n.id!==e)return!1;let r=n.choices[t];if(!r)return!1;if(this.pendingDialogue=null,delete this.world.pendingDialogue,r.event){let e=this.nodes(`event`).find(e=>e.attributes.id===r.event);if(!e)throw Error(`MWL dialogue choice points at unknown event: ${r.event}`);if(!this.claimEvent(e))return!0;this.executeEvent(e)}else this.runBlock(r.branch??[]);return this.checkObjectives(),!0}evaluate(){return this.checkObjectives(),this.world.status}save(){let e=this.hooks?.saveable,t=e?Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.save()])):void 0;return FQ(this.world,this.persistence,t,this.journal.toJSON())}snapshot(){return JSON.stringify(this.world)}restore(e){let t=LQ(e,this.persistence),n=t.world;Object.assign(this.world.variables,n.variables),Object.assign(this.world.units,n.units),Object.assign(this.world.sides,n.sides??{}),Object.assign(this.world.maps,n.maps??{}),Object.assign(this.world.gold,n.gold??{}),this.world.turn=n.turn,this.world.status=n.status,this.world.sideStatus={...n.sideStatus??{}},this.world.map=n.map??null,this.world.timeOfDay=n.timeOfDay??this.schedule[0]??``,this.world.scheduleIndex=n.scheduleIndex??0,this.world.random=n.random,this.random.setState(n.random??new j().getState()),this.world.firedEvents=[...n.firedEvents??[]],this.world.villages=n.villages?structuredClone(n.villages):void 0,this.world.clearedShroud=n.clearedShroud?structuredClone(n.clearedShroud):void 0,this.world.roles=n.roles?structuredClone(n.roles):void 0,this.world.objects=n.objects?structuredClone(n.objects):void 0,this.world.story=n.story?structuredClone(n.story):void 0,this.world.pendingDialogue=n.pendingDialogue,this.pendingDialogue=n.pendingDialogue?{id:n.pendingDialogue.id,choices:[...n.pendingDialogue.choices]}:null;let r=n.pendingDialogue?.id.match(/^dialogue-(\d+)$/);r&&(this.dialogueCounter=Math.max(this.dialogueCounter,Number(r[1])));for(let[e,n]of Object.entries(t.hookState??{}))this.hooks?.saveable?.[e]?.restore(n);this.journal.replace(t.journal??[])}recordAction(e,t){let n=this.traceBatch===null;n&&(this.traceBatch=[]);try{let r=t();return n&&this.journal.append(e,this.traceBatch??[]),r}finally{n&&(this.traceBatch=null)}}trace(e){this.traceBatch?.push(e),this.onTrace?.(e)}loadUnitTypes(){for(let e of this.nodes(`unit_type`)){let t=e.attributes.id;t&&this.unitTypes.set(t,{hitpoints:p$(e,`hitpoints`,1),movement:p$(e,`movement`,0)})}}loadSchedule(){this.schedule=this.nodes(`schedule`).flatMap(e=>e.children.filter(e=>e.tag===`time`).map(e=>e.attributes.id).filter(e=>!!e)),this.world.scheduleIndex=0,this.world.timeOfDay=this.schedule[0]??``}loadInitialContent(){for(let e of this.nodes(`side`)){let t={gold:p$(e,`gold`,0),income:p$(e,`income`,0)};e.attributes.leader!==void 0&&(t.leader=e.attributes.leader),e.attributes.controller!==void 0&&(t.controller=e.attributes.controller),e.attributes.recruit!==void 0&&(t.recruit=e.attributes.recruit),e.attributes.team_name!==void 0&&(t.teamName=e.attributes.team_name),e.attributes.user_team_name!==void 0&&(t.userTeamName=e.attributes.user_team_name),e.attributes.share_vision!==void 0&&(t.shareVision=e.attributes.share_vision),e.attributes.flag!==void 0&&(t.flag=e.attributes.flag),e.attributes.village_gold!==void 0&&(t.villageGold=p$(e,`village_gold`,0));for(let n of[`heal`,`fog`,`shroud`,`hidden`]){let r=e.attributes[n];r!==void 0&&(t[n]=r===`yes`||r===`true`)}this.world.sides[f$(e,`id`)]=t}for(let e of this.nodes(`map`)){let t=e.attributes.id??e.attributes.name??`map`;this.world.maps[t]={terrain:e.attributes.terrain??``,file:e.attributes.file},this.world.map||(this.world.map=this.buildMap(t,e))}}topLevelNodes(e){return(this.game.roots.find(e=>e.tag===`game`)?.children??this.game.roots).filter(t=>t.tag===e)}loadScenarioExtras(){for(let e of this.topLevelNodes(`object`)){let t={x:p$(e,`x`,0),y:p$(e,`y`,0)};e.attributes.id!==void 0&&(t.id=e.attributes.id),e.attributes.name!==void 0&&(t.name=e.attributes.name),e.attributes.image!==void 0&&(t.image=e.attributes.image),e.attributes.side!==void 0&&(t.side=e.attributes.side),(this.world.objects??=[]).push(t)}for(let e of this.topLevelNodes(`story`)){let t=e.attributes.text??e.attributes.value;if(t===void 0)continue;let n={text:t};e.attributes.title!==void 0&&(n.title=e.attributes.title),e.attributes.image!==void 0&&(n.image=e.attributes.image),e.attributes.music!==void 0&&(n.music=e.attributes.music),(this.world.story??=[]).push(n)}for(let e of this.topLevelNodes(`role`)){let t=e.attributes.role??e.attributes.name;if(t===void 0)continue;let n=j$(e.attributes,`role`,`name`),r=Object.entries(this.world.units).filter(([e,t])=>t.alive&&A$(t,e,n));for(let[,e]of r)e.role=t;(this.world.roles??={})[t]=r.map(([e])=>e)}}buildMap(e,t){let n=t.attributes.terrain;if(!n&&t.attributes.file&&this.resolveMap&&(n=this.resolveMap(t.attributes.file)),!n)return null;let r=g$(n);for(let e of t.children){if(e.tag!==`start`)continue;let t=e.attributes.side,n=O$(e,`x`),i=O$(e,`y`);t!==void 0&&n!==void 0&&i!==void 0&&(r.starts[t]??=[]).push({x:n,y:i})}return{id:e,...r}}loadInitialUnits(){for(let e of this.nodes(`unit`)){let t=f$(e,`id`),n={hp:p$(e,`hp`,1),x:p$(e,`x`,0),y:p$(e,`y`,0),alive:!0};if(e.attributes.type!==void 0){n.type=e.attributes.type;let t=this.unitTypes.get(e.attributes.type);t&&(n.moves=t.movement)}e.attributes.side!==void 0&&(n.side=e.attributes.side),e.attributes.name!==void 0&&(n.name=e.attributes.name),e.attributes.role!==void 0&&(n.role=e.attributes.role);let r=s$(e,`can_recruit`);r!==void 0&&(n.can_recruit=r),this.world.units[t]=n}}loadLeaders(){for(let e of this.nodes(`side`)){let t=e.attributes.leader;if(!t)continue;let n=e.attributes.id;if(!n)continue;let r=this.world.map?.starts[n];if(!r?.length||this.world.units[t])continue;let i=this.unitTypes.get(t);if(!i)throw Error(`MWL side ${n} leader "${t}" is neither a unit nor a unit type`);for(let e of r){if(this.unitAt(e.x,e.y))continue;let r=`${t} ${n} (${e.x},${e.y})`;this.world.units[r]={hp:i.hitpoints,x:e.x,y:e.y,alive:!0,type:t,side:n,moves:i.movement,can_recruit:!0,leader:!0}}}}unitAt(e,t){return Object.values(this.world.units).find(n=>n.alive&&n.x===e&&n.y===t)}static{this.commandHandlers={message:(e,t)=>e.showMessage(t.attributes),spawn:(e,t)=>e.cmdSpawn(t),move:(e,t)=>e.cmdMove(t),kill:(e,t)=>e.cmdKill(t),fire_event:(e,t)=>e.cmdFireEvent(t),store_unit:(e,t)=>e.cmdStoreUnit(t),unstore_unit:(e,t)=>e.cmdUnstoreUnit(t),recall:(e,t)=>e.cmdRecall(t),modify_unit:(e,t)=>e.cmdModifyUnit(t),heal_unit:(e,t)=>e.cmdHealUnit(t),set_terrain:(e,t)=>e.setTerrain(p$(t,`x`,0),p$(t,`y`,0),f$(t,`terrain`)),capture_village:(e,t)=>e.cmdCaptureVillage(t),clear_shroud:(e,t)=>e.cmdClearShroud(t),role:(e,t)=>e.cmdRole(t),attack:(e,t)=>e.attack(t.attributes.defender??t.attributes.target??f$(t,`target`),p$(t,`amount`,0)),modify_gold:(e,t)=>e.addGold(t.attributes.side??f$(t,`target`),p$(t,`delta`,p$(t,`amount`,0))),gold:(e,t)=>e.addGold(f$(t,`side`),p$(t,`delta`,p$(t,`amount`,0))),set_variable:(e,t)=>e.cmdSetVariable(t),while:(e,t)=>e.cmdWhile(t),foreach:(e,t)=>e.cmdForeach(t),switch:(e,t)=>e.cmdSwitch(t),end_turn:e=>e.endTurn(),win:(e,t)=>e.cmdWin(t),lose:(e,t)=>e.cmdLose(t),endlevel:(e,t)=>e.cmdEndlevel(t),if:(e,t)=>e.cmdIf(t),else:(e,t)=>e.runBlock(e.commandChildren(t)),hook:(e,t)=>e.runHook(t)}}executeNode(t){let n=t.tag===`command`?t.attributes.name:t.tag;if(!n)throw Error(`MWL command is missing name`);let r=e.commandHandlers[n];if(!r)throw Error(`unknown MWL command: ${n}`);r(this,t)}cmdSpawn(e){this.spawnUnit(e.attributes.type??``,e.attributes.side,p$(e,`x`,0),p$(e,`y`,0),e.attributes.id??e.attributes.target,e.attributes.hp===void 0?void 0:p$(e,`hp`,1))}cmdMove(e){this.applyMove(e.attributes.unit??f$(e,`target`),p$(e,`x`,0),p$(e,`y`,0))}cmdKill(e){let t=e.attributes.unit??e.attributes.target;t===void 0?w$(this.world,e.attributes):this.killUnit(t)}cmdFireEvent(e){let t=e.attributes.id??e.attributes.name;if(!t)throw Error(`[fire_event] requires id`);this.fireEvent(t)}cmdStoreUnit(e){let t=e.attributes.variable??e.attributes.name??f$(e,`variable`);this.setVariableAt(t,this.matchingUnits(e,[`variable`,`name`]).map(([e,t])=>({id:e,...T$(t)})))}cmdUnstoreUnit(e){let t=f$(e,`variable`);for(let e of this.storedUnits(t))this.restoreUnit(e,{})}cmdRecall(e){let t=this.storedUnits(f$(e,`variable`)),n=e.attributes.id??e.attributes.unit,r=n===void 0?t[0]:t.find(e=>e.id===n);if(!r)throw Error(`[recall] found no stored unit${n===void 0?``:` named ${n}`}`);let i={};e.attributes.x!==void 0&&(i.x=p$(e,`x`,0)),e.attributes.y!==void 0&&(i.y=p$(e,`y`,0)),e.attributes.side!==void 0&&(i.side=e.attributes.side),this.restoreUnit(r,i)}cmdModifyUnit(e){let t=e.children.find(e=>e.tag===`set`)?.attributes??e.attributes;for(let[,n]of this.matchingUnits(e))E$(n,t)}cmdHealUnit(e){let t=O$(e,`amount`),n=O$(e,`hp`);if(t===void 0&&n===void 0)throw Error(`[heal_unit] requires amount or hp`);for(let[,r]of this.matchingUnits(e))r.hp=n??r.hp+(t??0)}cmdCaptureVillage(e){let t=p$(e,`x`,0),n=p$(e,`y`,0),r={x:t,y:n,side:f$(e,`side`)};e.attributes.name!==void 0&&(r.name=e.attributes.name),(this.world.villages??={})[`${t},${n}`]=r}cmdClearShroud(e){let t=f$(e,`side`),n=p$(e,`x`,0),r=p$(e,`y`,0),i=p$(e,`radius`,1),a=new Set(this.world.clearedShroud?.[t]??[]);for(let e=-i;e<=i;e++)for(let t=-i;t<=i;t++)a.add(`${n+t},${r+e}`);(this.world.clearedShroud??={})[t]=[...a]}cmdRole(e){let t=e.attributes.role??e.attributes.name;if(!t)throw Error(`[role] requires role`);let n=this.matchingUnits(e,[`role`,`name`]);for(let[,e]of n)e.role=t;(this.world.roles??={})[t]=n.map(([e])=>e)}cmdSetVariable(e){let t=e.attributes.path;this.setVariable(t===void 0?e.tag===`command`?f$(e,`target`):f$(e,`name`):this.expandPath(t),e.attributes.value??``,e.attributes.mode)}cmdWhile(e){let t=p$(e,`max_iterations`,1e3);if(t<1||t>1e5)throw Error(`MWL while max_iterations must be between 1 and 100000`);let n=0;for(;n<t&&this.nodeConditionMatches(e);)this.runBlock(this.commandChildren(e)),n++;if(n===t&&this.nodeConditionMatches(e)){if(e.attributes.on_limit===`error`)throw Error(`MWL while reached its max_iterations cap of ${t}`);this.onTrace?.({type:`while_limit`,iterations:t})}}cmdForeach(e){let t=this.variableAt(f$(e,`variable`)),n=Array.isArray(t)?t.map((e,t)=>[String(t),e]):typeof t==`string`?t.split(`,`).map((e,t)=>[String(t),e.trim()]).filter(([,e])=>e!==``):t&&typeof t==`object`?Object.entries(t):[],r=e.attributes.item??`item`,i=e.attributes.index??`index`;for(let t=0;t<n.length;t++)this.setVariableAt(r,n[t][1]),this.setVariableAt(i,t),this.runBlock(this.commandChildren(e))}cmdSwitch(e){let t=this.variableAt(f$(e,`variable`)),n=e.children.find(e=>e.tag===`case`&&e.attributes.equals!==void 0&&M$(t,e.attributes.equals)),r=e.children.find(e=>e.tag==="default");this.runBlock((n??r)?.children??[])}cmdWin(e){this.markSideResult(e.attributes.side,`won`),this.world.status=`won`}cmdLose(e){this.markSideResult(e.attributes.side,`lost`),this.world.status=`lost`}cmdEndlevel(e){let t=e.attributes.result===`defeat`?`defeat`:`victory`;this.world.status=t===`defeat`?`lost`:`won`,this.world.carryover=u$(this.world,x$(this.world,e.attributes.side),{result:t,bonus:o$(e,`bonus`),carryoverPercentage:a$(e,`carryover_percentage`),carryoverAdd:s$(e,`carryover_add`),nextScenario:e.attributes.next_scenario??null})}cmdIf(e){let t=e.children.find(e=>e.tag===`else`),n=this.nodeConditionMatches(e)?e:t;this.runBlock(n?this.commandChildren(n):[])}commandChildren(e){return e.children.filter(e=>e.tag!==`condition`&&e.tag!==`filter`&&e.tag!==`filter_condition`)}runHook(e){let t=e.attributes.name??``,n=this.hooks?.command?.[t];if(!n)throw Error(`MWL hook ${t} is not implemented`);let{name:r,...i}=e.attributes;n(this.worldView(),this.emit(),i)}applyMove(e,t,n){let r=this.world.units[e];if(!r||!r.alive)throw Error(`MWL unit is not alive: ${e}`);let i=this.world.map??null;if(i){if(t<0||n<0||t>=i.width||n>=i.height)throw Error(`MWL move out of bounds: ${t},${n}`);let e=this.unitAt(t,n);if(e&&e!==r)throw Error(`MWL move onto an occupied cell: ${t},${n}`)}if(typeof r.moves==`number`){if(r.moves<=0)throw Error(`MWL unit has no moves left: ${e}`);--r.moves}r.x=t,r.y=n,this.fireMoveto(e)}showMessage(e){if(!this.onMessage)return;let t={text:this.interpolate(e.text??e.value??``),...e.speaker===void 0?{}:{speaker:e.speaker},...e.portrait===void 0?{}:{portrait:e.portrait},...e.side===void 0||e.side===``?{}:{side:e.side}};this.onMessage(t)}interpolate(e){let t=this.numericVariables();return e.replace(_$,(e,n)=>{try{return String(ZQ(n,t))}catch{return``}}).replace(v$,(e,t)=>{let n=this.variableAt(t);return n===void 0||typeof n==`boolean`?``:String(n)})}expandPath(e){return e.replace(_$,(e,t)=>String(ZQ(t,this.numericVariables()))).replace(v$,(e,t)=>{let n=this.variableAt(t);if(n===void 0)throw Error(`MWL variable path reference "$${t}" names no variable`);if(typeof n==`boolean`||typeof n==`object`)throw Error(`MWL variable path reference "$${t}" is not a name or number`);return String(n)})}setVariable(e,t,n){if(n===`literal`){this.setVariableAt(e,t);return}if(n===`number`){let n=Number(t);if(t.trim()===``||!Number.isFinite(n))throw Error(`MWL set_variable mode="number" needs a number, got "${t}"`);this.setVariableAt(e,n);return}if(n===`expression`){this.setVariableAt(e,ZQ(t,this.numericVariables()));return}if(n!==void 0)throw Error(`unknown MWL set_variable mode "${n}"`);let r=Number(t);if(t.trim()!==``&&Number.isFinite(r)){this.setVariableAt(e,r);return}let i=/^\$([A-Za-z_][A-Za-z0-9_.]*)$/.exec(t.trim());if(i){let t=this.variableAt(i[1]);this.setVariableAt(e,t===void 0?``:t);return}let a=this.numericVariables();/[+*/^()]|\s-\s/.test(t)||Object.prototype.hasOwnProperty.call(a,t.trim())?this.setVariableAt(e,ZQ(t,a)):this.setVariableAt(e,t)}numericVariables(){return Object.fromEntries(Object.entries(this.world.variables).filter(e=>typeof e[1]==`number`))}variableAt(e){return R$(this.world.variables,e)}setVariableAt(e,t){let n=this.variableAt(e);L$(this.world.variables,e,t),this.trace({type:`variable`,name:e,...n===void 0?{}:{previous:n},value:t})}spawnUnit(e,t,n,r,i,a){let o=e?this.unitTypes.get(e):void 0,s=i??`${e||`unit`}#${t??``}@${n},${r}`;this.world.units[s]={hp:a??o?.hitpoints??1,x:n,y:r,alive:!0,...e?{type:e}:{},...t===void 0?{}:{side:t},...o?{moves:o.movement}:{}}}killUnit(e){let t=this.world.units[e];if(!t||!t.alive)throw Error(`MWL unit is not alive: ${e}`);t.alive=!1}matchingUnits(e,t=[]){let n=e.children.find(e=>e.tag===`filter`),r=n?n.attributes:j$(e.attributes,...t);return Object.entries(this.world.units).filter(([e,t])=>t.alive&&A$(t,e,r))}storedUnits(e){let t=this.variableAt(e);if(!Array.isArray(t))throw Error(`MWL variable ${e} is not a stored unit list; store one first`);return t.filter(e=>!!e&&typeof e==`object`&&!Array.isArray(e))}restoreUnit(e,t){let n=typeof e.id==`string`?e.id:void 0;if(!n)throw Error(`a stored unit snapshot is missing its id`);let r={hp:typeof e.hp==`number`?e.hp:1,x:t.x??(typeof e.x==`number`?e.x:0),y:t.y??(typeof e.y==`number`?e.y:0),alive:e.alive!==!1};typeof e.type==`string`&&(r.type=e.type);let i=t.side??(typeof e.side==`string`?e.side:void 0);i!==void 0&&(r.side=i),typeof e.moves==`number`&&(r.moves=e.moves),typeof e.name==`string`&&(r.name=e.name),typeof e.role==`string`&&(r.role=e.role),typeof e.can_recruit==`boolean`&&(r.can_recruit=e.can_recruit),typeof e.leader==`boolean`&&(r.leader=e.leader),this.world.units[n]=r}setTerrain(e,t,n){let r=this.world.map;if(!r)throw Error(`[set_terrain] needs a loaded map`);if(e<0||t<0||e>=r.width||t>=r.height)throw Error(`[set_terrain] is outside the map: ${e},${t}`);let i=[...r.codes];i[t*r.width+e]=n,this.world.map={...r,codes:i}}addGold(e,t){this.world.gold[e]=(this.world.gold[e]??0)+t}endTurn(){this.world.turn+=1,this.advanceSchedule(),this.resetMoves(),this.run(`turn`),this.checkTimeOver()}checkTimeOver(){let e=o$(this.game.roots[0],`turn_limit`);e===void 0||this.world.turn<=e||this.world.variables.time_over===`yes`||(this.world.variables.time_over=`yes`,this.run(`time_over`))}advanceSchedule(){if(!this.schedule.length)return;let e=((this.world.scheduleIndex??0)+1)%this.schedule.length;this.world.scheduleIndex=e,this.world.timeOfDay=this.schedule[e]}resetMoves(){for(let e of Object.values(this.world.units)){if(!e.alive)continue;let t=e.type?this.unitTypes.get(e.type):void 0;t&&(e.moves=t.movement)}}filterMatches(e){return Object.entries(this.world.units).some(([t,n])=>n.alive&&A$(n,t,e.attributes))}conditionMatches(e){return e.children.filter(e=>e.tag===`condition`).every(e=>{if(e.attributes.condition===`hook`){let t=e.attributes.hook,n=t?.startsWith(`predicate:`)?t.slice(10):void 0,r=n?this.hooks?.predicate?.[n]:void 0;if(!r)throw Error(`MWL predicate ${n??`<missing>`} is not implemented`);let{condition:i,hook:a,...o}=e.attributes;return!!r(this.worldView(),o)}return k$(this.variableAt(e.attributes.variable),e.attributes,z$(this.world.variables))})}nodeConditionMatches(e){return e.attributes.test===void 0?this.conditionMatches(e):HQ(e.attributes.test,N$(this.world.variables),{helpers:this.conditionHelpers()})}conditionHelpers(){if(this.testHelpers)return this.testHelpers;let e=e=>{let t={};for(let n of e){let e=String(n),r=e.indexOf(`=`);r<=0?t.value=e:t[e.slice(0,r)]=e.slice(r+1)}return t},t={have_unit:(...t)=>{let n=e(t);return Object.entries(this.world.units).some(([e,t])=>t.alive&&(n.id===void 0||e===n.id)&&A$(t,e,n))},have_location:(...t)=>{let n=e(t),r=this.world.map,i=Number(n.x),a=Number(n.y);if(!r||!Number.isInteger(i)||!Number.isInteger(a)||i<0||a<0||i>=r.width||a>=r.height)return!1;let o=r.codes[a*r.width+i];return n.terrain===void 0||o===n.terrain}};for(let[n,r]of Object.entries(this.hooks?.predicate??{}))t[n]=(...t)=>!!r(this.worldView(),e(t));return this.testHelpers=t,t}filterConditionMatches(e){let t=e.children.find(e=>e.tag===`filter_condition`);return!t||t.children.every(e=>{if(e.tag===`variable`){let t=e.attributes.name;return t!==void 0&&k$(this.variableAt(t),e.attributes,z$(this.world.variables))}if(e.tag===`predicate`){let t=e.attributes.name,n=t?this.hooks?.predicate?.[t]:void 0;if(!n)throw Error(`MWL predicate ${t??`<missing>`} is not implemented`);let{name:r,...i}=e.attributes;return!!n(this.worldView(),i)}return e.tag!==`have_unit`||Object.entries(this.world.units).some(([t,n])=>n.alive&&(e.attributes.id===void 0||t===e.attributes.id)&&A$(n,t,e.attributes))})}conditionMet(e,t){let n=e.attributes.condition??``,r=e.attributes.side??t;switch(n){case`units_dead`:{let t=e.attributes.side_filter??r;return t!==void 0&&!Object.values(this.world.units).some(e=>e.alive&&e.side===t)}case`turns_elapsed`:{let t=O$(e,`turns`);return t!==void 0&&this.world.turn>=t}case`gold_at_least`:{let n=O$(e,`gold`),r=e.attributes.side??t;return n!==void 0&&r!==void 0&&(this.world.gold[r]??0)>=n}case`unit_at`:{let t=O$(e,`x`),n=O$(e,`y`),i=e.attributes.side_filter??r;return Object.values(this.world.units).some(r=>r.alive&&(i===void 0||r.side===i)&&(e.attributes.type===void 0||r.type===e.attributes.type)&&r.x===t&&r.y===n)}case`hook`:{let t=e.attributes.hook??``,n=this.hooks?.predicate?.[t];if(!n)throw Error(`MWL hook ${t} is not implemented`);let{hook:r,condition:i,...a}=e.attributes;return!!n(this.worldView(),a)}default:return!1}}checkObjectives(){if(this.world.status!==`playing`)return;let e=new Set,t=this.nodes(`side`);for(let n of t)for(let t of n.children)(t.tag===`victory`||t.tag===`defeat`)&&e.add(t);if(this.nodes(`victory`).some(t=>!e.has(t)&&this.conditionMet(t))){this.world.status=`won`;return}if(this.nodes(`defeat`).some(t=>!e.has(t)&&this.conditionMet(t))){this.world.status=`lost`;return}let n=!1,r=!1;for(let e of t){let t=e.attributes.id;t&&(this.world.sideStatus?.[t]??`playing`)===`playing`&&(e.children.some(e=>e.tag===`victory`&&this.conditionMet(e,t))?(this.markSideResult(t,`won`),n=!0):e.children.some(e=>e.tag===`defeat`&&this.conditionMet(e,t))&&(this.markSideResult(t,`lost`),r=!0))}n?this.world.status=`won`:r&&(this.world.status=`lost`)}markSideResult(e,t){e!==void 0&&e!==``&&((this.world.sideStatus??={})[e]=t)}worldView(){return{variables:this.world.variables,variableAt:e=>this.variableAt(e),units:this.world.units,sides:this.world.sides,turn:this.world.turn,random:{float:()=>this.drawRandom(e=>e.float()),int:e=>this.drawRandom(t=>t.int(e))}}}drawRandom(e){let t=e(this.random);return this.world.random=this.random.getState(),t}emit(){return{move:(e,t,n)=>this.applyMove(e,t,n),attack:(e,t,n)=>{throw Error(`MWL hook attack is not available in the framework runtime; the engine adapter owns combat`)},spawn:(e,t,n,r)=>this.spawnUnit(e,t,n,r),kill:e=>this.killUnit(e),gold:(e,t)=>this.addGold(e,t),setVariable:(e,t)=>{L$(this.world.variables,e,t)},message:(e,t)=>this.onMessage?.({text:t,...e?{speaker:e}:{}}),endTurn:()=>this.endTurn(),win:e=>{this.markSideResult(e,`won`),this.world.status=`won`},lose:e=>{this.markSideResult(e,`lost`),this.world.status=`lost`}}}attack(e,t){let n=this.world.units[e];if(!n||!n.alive)throw Error(`MWL unit is not alive: ${e}`);n.hp=Math.max(0,n.hp-t),n.hp===0&&(n.alive=!1)}nodes(e){let t=[],n=r=>{r.tag===e&&t.push(r),r.children.forEach(n)};return this.game.roots.forEach(n),t}};function b$(e,t){if(e.status===`playing`||t.name===`win`||t.name===`lose`)switch(t.name){case`set_variable`:L$(e.variables,t.target,t.value);break;case`modify_gold`:e.gold[t.target]=(e.gold[t.target]??0)+t.amount;break;case`move`:{let n=C$(e,t.target);n.x=t.x,n.y=t.y;break}case`spawn`:e.units[t.target]={hp:t.hp,x:t.x,y:t.y,alive:!0};break;case`kill`:t.target===void 0?w$(e,t.filter??{}):C$(e,t.target).alive=!1;break;case`end_turn`:e.turn++;break;case`win`:t.side!==void 0&&t.side!==``&&((e.sideStatus??={})[t.side]=`won`),e.status=`won`;break;case`lose`:t.side!==void 0&&t.side!==``&&((e.sideStatus??={})[t.side]=`lost`),e.status=`lost`;break;case`endlevel`:e.status=t.result===`defeat`?`lost`:`won`,e.carryover=u$(e,t.side??null,t)}}function x$(e,t){let n=t??Object.entries(e.sides).find(([,e])=>e.controller===`human`)?.[0];return!n||!(n in e.sides)?null:{id:n}}function S$(e){let t=new Map;for(let[n,r]of Object.entries(e.sides)){if(!r.teamName||r.shareVision===`none`)continue;let e=t.get(r.teamName);e?e.push(n):t.set(r.teamName,[n])}return[...t.values()].filter(e=>e.length>1)}function C$(e,t){let n=e.units[t];if(!n||!n.alive)throw Error(`MWL unit is not alive: ${t}`);return n}function w$(e,t){let n=0;for(let[r,i]of Object.entries(e.units))i.alive&&A$(i,r,t)&&(i.alive=!1,n++);return n}function T$(e){let t={hp:e.hp,x:e.x,y:e.y,alive:e.alive};return e.type!==void 0&&(t.type=e.type),e.side!==void 0&&(t.side=e.side),e.moves!==void 0&&(t.moves=e.moves),e.name!==void 0&&(t.name=e.name),e.role!==void 0&&(t.role=e.role),e.can_recruit!==void 0&&(t.can_recruit=e.can_recruit),e.leader!==void 0&&(t.leader=e.leader),t}function E$(e,t){let n=D$(t.hp);n!==void 0&&(e.hp=n);let r=D$(t.moves);r!==void 0&&(e.moves=r),t.type!==void 0&&(e.type=t.type),t.side!==void 0&&(e.side=t.side);let i=c$(t.alive);i!==void 0&&(e.alive=i),t.name!==void 0&&(e.name=t.name),t.role!==void 0&&(e.role=t.role);let a=c$(t.can_recruit);a!==void 0&&(e.can_recruit=a)}function D$(e){if(e===void 0||e===``)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function O$(e,t){let n=e.attributes[t];if(n===void 0||n===``)return;let r=Number.parseInt(n,10);return Number.isFinite(r)?r:void 0}function k$(e,t,n){let r=e=>{if(!e.startsWith(`$`))return e;let t=n(e.slice(1));return typeof t==`string`||typeof t==`number`||typeof t==`boolean`?t:void 0};if(t.equals!==void 0)return M$(e,r(t.equals));if(t.not_equals!==void 0)return!M$(e,r(t.not_equals));if(t.in!==void 0)return t.in.split(`,`).map(e=>e.trim()).some(t=>M$(e,t));if(t.not_in!==void 0)return!t.not_in.split(`,`).map(e=>e.trim()).some(t=>M$(e,t));let i=typeof e==`number`?e:Number(e),a=e=>Number(t[e]);return t.less_than!==void 0||t.greater_than!==void 0||t.less_than_or_equal_to!==void 0||t.greater_than_or_equal_to!==void 0?!(typeof e==`boolean`||!Number.isFinite(i)||t.less_than!==void 0&&!(i<a(`less_than`))||t.greater_than!==void 0&&!(i>a(`greater_than`))||t.less_than_or_equal_to!==void 0&&!(i<=a(`less_than_or_equal_to`))||t.greater_than_or_equal_to!==void 0&&!(i>=a(`greater_than_or_equal_to`))):e!==void 0}function A$(e,t,n){let r=(n.not_type??``).split(`,`).map(e=>e.trim()).filter(Boolean),i=c$(n.can_recruit),a=c$(n.leader),o=n.unit??n.id;return(o===void 0||t===o)&&(n.side===void 0||e.side===n.side)&&(n.type===void 0||e.type===n.type)&&(r.length===0||!r.includes(e.type??``))&&(n.name===void 0||e.name===n.name)&&(n.role===void 0||e.role===n.role)&&(i===void 0||(e.can_recruit??!1)===i)&&(a===void 0||(e.leader??!1)===a)&&(n.x===void 0||B$(n.x,e.x))&&(n.y===void 0||B$(n.y,e.y))}function j$(e,...t){if(t.length===0)return{...e};let n={...e};for(let e of t)delete n[e];return n}function M$(e,t){if(e===void 0||t===void 0||typeof t!=`string`)return e===t;let n=Number(t);return typeof e==`number`&&t.trim()!==``&&Number.isFinite(n)?e===n:e===t}function N$(e){return Object.fromEntries(Object.entries(e).filter(e=>typeof e[1]==`string`||typeof e[1]==`number`||typeof e[1]==`boolean`))}function P$(e){return e.split(`.`).flatMap(e=>{let t=/^([^[\]]*)((?:\[[^\]]*\])*)$/.exec(e);if(!t)return[e];let n=t[1]===``?[]:[t[1]];for(let e of t[2].matchAll(/\[([^\]]*)\]/g)){let t=Number(e[1]);n.push({index:/^\d+$/.test(e[1].trim())?t:void 0})}return n}).filter(e=>typeof e!=`string`||e!==``)}function F$(e){let t=P$(e);if(t.some(e=>typeof e!=`string`&&e.index===void 0))throw Error(`invalid variable path: ${e}`);return t}function I$(e){return typeof e!=`string`}function L$(e,t,n){let r=F$(t),i=e=>typeof e==`string`?e:e.index,a=e;for(let e=0;e<r.length-1;e++){let t=i(r[e]),n=a[t];(!n||typeof n!=`object`)&&(a[t]=I$(r[e+1])?[]:{}),a=a[t]}a[i(r[r.length-1])]=n}function R$(e,t){let n=e;for(let e of P$(t))if(typeof e==`string`){if(!n||typeof n!=`object`||Array.isArray(n))return;n=n[e]}else{if(!Array.isArray(n)||e.index===void 0)return;n=n[e.index]}return n}function z$(e){return t=>R$(e,t)}function B$(e,t){return e.split(`,`).some(e=>{let n=e.trim(),r=n.match(/^(-?\d+)\s*-\s*(-?\d+)$/);if(r){let e=Number(r[1]),n=Number(r[2]);return t>=Math.min(e,n)&&t<=Math.max(e,n)}return/^-?\d+$/.test(n)&&Number(n)===t})}var V$=/^\s*([A-Za-z_][\w]*)\s*=\s*(.*?)\s*$/;function H$(e){let t=e.split(/\r?\n/),n={},r=0;for(;r<t.length;r++){let e=t[r];if(e.trim()===``)continue;let i=V$.exec(e);if(!i)break;n[i[1]]=i[2]}return{header:n,...g$(t.slice(r).map(U$).join(`
|
|
1405
|
+
`))}}function U$(e){let t=e.length;for(;t>0&&(e[t-1]===`,`||/\s/.test(e[t-1]));)t--;return e.slice(0,t)}function W$(e){let t=[];for(let n of e.split(`|`)){let e=n.indexOf(`:`);if(e<=0||e===n.length-1)throw Error(`invalid table column "${n}"`);let r=n.slice(0,e).trim(),i=n.slice(e+1).trim();if(!/^[A-Za-z_][\w.-]*$/.test(r))throw Error(`invalid table column name "${r}"`);if(![`string`,`number`,`boolean`,`list`,`map`].includes(i))throw Error(`invalid table column type "${i}"`);if(t.some(e=>e.name===r))throw Error(`duplicate table column "${r}"`);t.push({name:r,type:i})}if(t.length===0)throw Error(`table must declare at least one column`);return t}var G$={game:{attributes:{schema:`string`,title:`string`,data_root:`string`,start_scene:`id`,default_schedule:`id`,save_slot:`string`,turn_limit:`integer`},children:`campaign.terrain_type.movetype.unit_type.unit.side.map.schedule.event.objectives.trait.weapon_special.dialogue.save.item.inventory.monster.status.loot.turn_clock.battle_move.type_matchup.evolution.table.object.story.role`.split(`.`)},campaign:{attributes:{id:`id`,name:`string`,title:`string`,description:`string`,start_scene:`id`,first_scenario:`id`},openChildren:!0},table:{attributes:{id:`id`,columns:`string`,list_delimiter:`string`,map_delimiter:`string`},children:[`row`]},row:{openAttributes:`string`},terrain_type:{attributes:{id:`id`,string:`string`,aliasof:`string`,mvt_alias:`string`,default_base:`string`,heals:`integer`,gives_income:`boolean`,map_code:`string`,base_tile:`string`,overlay_tile:`string`,defense:`number`,healing:`number`}},movetype:{attributes:{id:`id`,name:`string`},children:[`movement_costs`,`defense`,`resistance`]},movement_costs:{openAttributes:`number`},defense:{openAttributes:`number`},resistance:{openAttributes:`number`},unit_type:{attributes:{id:`string`,name:`string`,description:`string`,image:`string`,image_icon:`string`,profile:`string`,sound:`string`,hitpoints:`integer`,movement:`integer`,movement_type:`id`,movetype:`id`,experience:`integer`,level:`integer`,alignment:`id`,cost:`integer`,advances_to:`string`,race:`id`,usage:`id`},children:[`attack`,`trait`,`ability`]},unit:{attributes:{id:`id`,type:`string`,side:`string`,name:`string`,role:`string`,can_recruit:`boolean`,hp:`integer`,x:`integer`,y:`integer`}},attack:{attributes:{id:`id`,attacker:`string`,defender:`string`,target:`string`,amount:`integer`,weapon:`id`,name:`string`,sound:`string`,description:`string`,type:`id`,range:`id`,damage:`integer`,number:`integer`,strikes:`integer`,icon:`string`,specials:`string`}},side:{attributes:{id:`string`,controller:`id`,gold:`integer`,income:`integer`,income_base:`integer`,income_per_village:`integer`,leader:`id`,team:`integer`,recruit:`string`,color:`string`,team_name:`string`,user_team_name:`string`,share_vision:`string`,village_gold:`integer`,heal:`boolean`,fog:`boolean`,shroud:`boolean`,hidden:`boolean`,flag:`string`}},map:{attributes:{id:`id`,name:`string`,file:`string`,terrain:`string`},children:[`start`]},start:{attributes:{side:`string`,x:`integer`,y:`integer`}},schedule:{attributes:{id:`id`},children:[`time`]},time:{attributes:{id:`id`,name:`string`,lawful_bonus:`number`}},event:{attributes:{id:`id`,on:`id`,trigger:`id`,x:`coordinate`,y:`coordinate`,side:`string`,unit:`string`,once:`boolean`},children:`condition.filter.filter_condition.while.foreach.switch.command.say.dialogue.move.attack.spawn.kill.gold.endlevel.set_variable.if.else.message.teleport.end_turn.win.lose.hook.fire_event.store_unit.unstore_unit.recall.modify_unit.heal_unit.set_terrain.capture_village.clear_shroud.role`.split(`.`)},objectives:{attributes:{side:`string`,victory:`string`,defeat:`string`},children:[`victory`,`defeat`]},victory:{attributes:{side:`string`,condition:`id`,type:`string`,x:`integer`,y:`integer`,side_filter:`string`,turns:`integer`,gold:`integer`,hook:`string`,value:`integer`}},defeat:{attributes:{side:`string`,condition:`id`,type:`string`,x:`integer`,y:`integer`,side_filter:`string`,turns:`integer`,gold:`integer`,hook:`string`,value:`integer`}},condition:{attributes:{condition:`id`,hook:`string`,variable:`string`,equals:`string`,not_equals:`string`,in:`string`,not_in:`string`,less_than:`string`,greater_than:`string`,less_than_or_equal_to:`string`,greater_than_or_equal_to:`string`},openAttributes:`string`},filter:{attributes:{side:`string`,type:`string`,not_type:`string`,unit:`string`,name:`string`,role:`string`,x:`coordinate`,y:`coordinate`,level:`integer`,alignment:`id`,can_recruit:`boolean`,leader:`boolean`}},filter_condition:{children:[`variable`,`have_unit`,`predicate`]},variable:{attributes:{name:`id`,equals:`string`,not_equals:`string`,in:`string`,not_in:`string`,less_than:`string`,greater_than:`string`,less_than_or_equal_to:`string`,greater_than_or_equal_to:`string`}},have_unit:{attributes:{id:`string`,type:`string`,side:`string`,name:`string`,role:`string`,can_recruit:`boolean`,x:`coordinate`,y:`coordinate`}},predicate:{attributes:{name:`id`},openAttributes:`string`},command:{attributes:{name:`id`,target:`string`,path:`string`,value:`string`,mode:[`literal`,`number`,`expression`],amount:`integer`,x:`integer`,y:`integer`,hp:`integer`}},move:{attributes:{unit:`string`,target:`string`,x:`integer`,y:`integer`}},spawn:{attributes:{id:`string`,type:`string`,side:`string`,x:`integer`,y:`integer`,hp:`integer`}},kill:{attributes:{unit:`string`,target:`string`},openAttributes:`string`},gold:{attributes:{side:`string`,delta:`integer`,amount:`integer`}},endlevel:{attributes:{result:`id`,side:`string`,bonus:`integer`,carryover_percentage:`integer`,carryover_add:`boolean`,next_scenario:`id`}},set_variable:{attributes:{name:`id`,target:`id`,path:`string`,value:`string`,mode:[`literal`,`number`,`expression`]}},if:{attributes:{test:`string`},children:[`condition`,`while`,`foreach`,`switch`,`if`,`else`,`command`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},else:{children:[`condition`,`while`,`foreach`,`switch`,`if`,`else`,`command`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},while:{attributes:{test:`string`,max_iterations:`integer`,on_limit:`id`},children:[`condition`,`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},foreach:{attributes:{variable:`id`,item:`id`,index:`id`},children:[`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`]},switch:{attributes:{variable:`id`},children:[`case`,`default`]},case:{attributes:{equals:`string`},children:[`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`,`dialogue`]},default:{children:[`while`,`foreach`,`switch`,`if`,`else`,`message`,`move`,`attack`,`spawn`,`kill`,`gold`,`set_variable`,`win`,`lose`,`hook`,`dialogue`]},message:{attributes:{speaker:`string`,text:`string`,value:`string`,portrait:`string`,side:`string`}},teleport:{attributes:{unit:`string`,target:`string`,x:`integer`,y:`integer`}},end_turn:{attributes:{}},win:{attributes:{side:`string`}},lose:{attributes:{side:`string`}},say:{attributes:{speaker:`id`,text:`string`}},dialogue:{attributes:{id:`id`,ref:`id`},children:[`say`,`choice`,`branch`,`message`]},choice:{attributes:{text:`string`,event:`id`,variable:`id`,equals:`string`},children:[`branch`]},branch:{attributes:{text:`string`},children:[`message`,`say`,`command`,`set_variable`,`move`,`attack`,`spawn`,`kill`,`gold`,`hook`]},trait:{attributes:{id:`id`,name:`string`},children:[`effect`]},ability:{attributes:{id:`id`,name:`string`},children:[`effect`]},weapon_special:{attributes:{id:`id`,name:`string`}},hook:{attributes:{name:`string`},openAttributes:`string`},fire_event:{attributes:{id:`id`,name:`string`}},store_unit:{attributes:{variable:`string`,name:`string`},children:[`filter`]},unstore_unit:{attributes:{variable:`string`,name:`string`}},recall:{attributes:{variable:`string`,id:`string`,unit:`string`,side:`string`,x:`integer`,y:`integer`}},modify_unit:{attributes:{hp:`integer`,moves:`integer`,type:`string`,side:`string`,alive:`boolean`},children:[`filter`,`set`]},set:{openAttributes:`string`},heal_unit:{attributes:{amount:`integer`,hp:`integer`,side:`string`,type:`string`,x:`integer`,y:`integer`},children:[`filter`]},set_terrain:{attributes:{terrain:`string`,x:`integer`,y:`integer`}},capture_village:{attributes:{side:`string`,x:`integer`,y:`integer`,name:`string`}},clear_shroud:{attributes:{side:`string`,x:`integer`,y:`integer`,radius:`integer`}},role:{attributes:{role:`string`,name:`string`,type:`string`,not_type:`string`,unit:`string`,side:`string`,can_recruit:`boolean`,x:`integer`,y:`integer`},children:[`filter`]},object:{attributes:{id:`id`,name:`string`,image:`string`,side:`string`,x:`integer`,y:`integer`},children:[`filter`]},story:{attributes:{text:`string`,value:`string`,title:`string`,image:`string`,music:`string`}},item:{attributes:{id:`id`,name:`string`,slot:`id`,stackable:`boolean`,weight:`number`,image:`string`,icon:`string`},children:[`effect`]},inventory:{attributes:{unit:`string`,side:`string`,items:`string`}},monster:{attributes:{id:`string`,name:`string`,hp:`integer`,types:`string`,attack:`number`,defense:`number`,speed:`number`,accuracy:`number`,evasion:`number`,damage_min:`integer`,damage_max:`integer`,armor_min:`integer`,armor_max:`integer`,experience:`integer`,max_level:`integer`,image:`string`},children:[`ability`,`loot`]},status:{attributes:{id:`id`,name:`string`,duration:`integer`,tick:`string`,modifiers:`string`}},loot:{attributes:{item:`id`,chance:`number`,quantity:`integer`,weight:`number`}},turn_clock:{attributes:{id:`id`,tick:`number`,hunger:`number`}},ai:{attributes:{id:`id`,strategy:`id`,target:`id`,difficulty:`number`,scope:`id`,provider:`id`,algorithm:`id`,depth:`integer`,max_nodes:`integer`,player:`string`,moves:`string`,apply:`string`,terminal:`string`,evaluate:`string`},children:[`behavior`]},behavior:{attributes:{id:`id`,when:`string`,action:`string`,hook:`string`}},battle_move:{attributes:{id:`id`,type:`id`,target:`id`,power:`number`,cost:`number`}},type_matchup:{attributes:{attacker:`id`,defender:`id`,multiplier:`number`}},evolution:{attributes:{from:`id`,into:`id`,level:`integer`}},effect:{attributes:{apply_to:`id`,range:`id`,increase:`string`,increase_total:`string`,increase_damage:`string`,add:`string`,sub:`string`,multiply:`string`,divide:`string`,set:`string`}},save:{attributes:{version:`integer`,fields:`string`,migration:`string`}}},K$={...G$,game:{...G$.game,required:[`schema`]},table:{...G$.table,required:[`id`,`columns`],cardinality:{row:{min:1}}},terrain_type:{...G$.terrain_type,required:[`id`]},movetype:{...G$.movetype,required:[`id`]},unit_type:{...G$.unit_type,required:[`id`]},unit:{...G$.unit,required:[`id`,`type`,`side`]}};function q$(e,t=G$){let n=[],r=new Map,i=e=>{let t=e.attributes.id;t&&r.set(t,[...r.get(t)??[],e]),e.children.forEach(i)};e.forEach(i);let a=[],o=(e,i=!1)=>{let s=t[e.tag];if(s){for(let t of Object.keys(e.attributes))s.openAttributes||(!s.attributes||!(t in s.attributes))&&n.push({code:`MWL_UNKNOWN_ATTRIBUTE`,message:`unknown attribute ${t} on ${e.tag}`,location:e.attributeLocations?.[t]??e.location});for(let t of s.required??[])e.attributes[t]===void 0&&n.push({code:`MWL_REQUIRED_ATTRIBUTE`,message:`${t} is required on ${e.tag}`,location:e.location});for(let[t,i]of Object.entries(s.attributes??{})){let o=e.attributes[t];if(o!==void 0&&!Z$(o,i)&&n.push({code:`MWL_VALUE`,message:`${t} must be ${Q$(i)}`,location:e.valueLocations?.[t]??e.attributeLocations?.[t]??e.location}),o!==void 0&&i===`ref`){let i=(r.get(o)??[]).filter(e=>{let n=s.refTargets?.[t];return!n||n===`*`||e.tag===n});i.length===0?n.push({code:`MWL_REF_MISSING`,message:`${t} references missing target ${o}`,location:e.location}):i.length>1?n.push({code:`MWL_REF_DUPLICATE`,message:`${t} references ambiguous target ${o}`,location:e.location}):s.acyclicRefs?.includes(t)&&a.push({from:e,to:i[0],name:t})}}if(s.openAttributes)for(let[t,r]of Object.entries(e.attributes))Z$(r,s.openAttributes)||n.push({code:`MWL_VALUE`,message:`${t} must be ${s.openAttributes}`,location:e.valueLocations?.[t]??e.attributeLocations?.[t]??e.location});for(let t of e.children)!s.openChildren&&s.children&&!s.children.includes(t.tag)&&n.push({code:`MWL_CHILD`,message:`${t.tag} is not allowed inside ${e.tag}`,location:t.location}),o(t,s.openChildren===!0);for(let[t,r]of Object.entries(s.cardinality??{})){let i=e.children.filter(e=>e.tag===t).length;r.min!==void 0&&i<r.min&&n.push({code:`MWL_CARDINALITY`,message:`${e.tag} needs at least ${r.min} ${t} child${r.min===1?``:`ren`}`,location:e.location}),r.max!==void 0&&i>r.max&&n.push({code:`MWL_CARDINALITY`,message:`${e.tag} allows at most ${r.max} ${t} child${r.max===1?``:`ren`}`,location:e.location})}}else{if(i){e.children.forEach(e=>o(e,!0));return}n.push({code:`MWL_UNKNOWN_TAG`,message:`unknown tag ${e.tag}`,location:e.location})}};e.forEach(e=>o(e)),J$(e,n);let s=new Set,c=new Set,l=(e,t)=>{if(s.has(e)){let r=t.indexOf(e);n.push({code:`MWL_REF_CYCLE`,message:`reference cycle through ${t.slice(r).map(e=>e.attributes.id??e.tag).join(` -> `)}`,location:e.location})}else if(!c.has(e)){s.add(e);for(let n of a.filter(t=>t.from===e))l(n.to,[...t,e]);s.delete(e),c.add(e)}};for(let e of a)l(e.from,[]);return n.sort((e,t)=>e.location.line-t.location.line||e.location.column-t.location.column)}function J$(e,t){let n=e=>{if(e.tag===`table`){let n;try{n=W$(e.attributes.columns??``)}catch(r){t.push({code:`MWL_TABLE`,message:String(r).replace(/^Error: /,``),location:e.location}),n=[]}let r=new Map(n.map(e=>[e.name,e]));for(let i of e.children.filter(e=>e.tag===`row`)){for(let e of Object.keys(i.attributes))r.has(e)||t.push({code:`MWL_TABLE`,message:`unknown table column ${e}`,location:i.location});for(let r of n){let n=i.attributes[r.name];if(n===void 0)t.push({code:`MWL_TABLE`,message:`missing table column ${r.name}`,location:i.location});else try{Y$(n,r.type,r.name,e.attributes.list_delimiter,e.attributes.map_delimiter)}catch(e){t.push({code:`MWL_TABLE`,message:String(e).replace(/^Error: /,``),location:i.location})}}}}e.children.forEach(n)};e.forEach(n)}function Y$(e,t,n,r=`;`,i=`=`){return Hr(e,t,{column:n,listDelimiter:r,mapDelimiter:i,acceptYesNo:!0})}function X$(e){return/^[A-Za-z_][\w.[\]-]*$/.test(e)}function Z$(e,t){return $$(t)?t.includes(e):t===`number`?Number.isFinite(Number(e)):t===`integer`?/^-?\d+$/.test(e):t===`boolean`?e===`true`||e===`false`||e===`yes`||e===`no`:t===`ref`?/^[A-Za-z_][\w.-]*$/.test(e):t===`coordinate`?/^-?\d+(?:\s*,\s*-?\d+|\s*-\s*-?\d+)*$/.test(e):t!==`id`||X$(e)}function Q$(e){return $$(e)?`one of ${e.join(`, `)}`:e}function $$(e){return Array.isArray(e)}function e1(e,t={}){return n1(_Q(dQ(e,t),t.file),t)}function t1(e,t={}){let n=[];for(let r of[...e].sort((e,t)=>e.file<t.file?-1:+(e.file>t.file))){let e=dQ(r.source,{...t,file:r.file});n.push(..._Q(e,r.file))}return n1(n,t)}function n1(e,t={}){let n=e.find(e=>e.tag===`game`)?.attributes.schema,r=q$(e,t.schemas??(n===`1.0`?K$:void 0));if(r.length){let e=r[0];throw Error(`${e.location.file}:${e.location.line}:${e.location.column}: ${e.message}`)}let i=new Set,a=new Set,o=e=>{for(let[t,n]of Object.entries(e.attributes))if(r1(t))for(let e of a1(n).map(e=>e.trim()).filter(i1))i.add(o1(e));let t=e.gettext??[`name`,`text`,`title`];for(let n of t){let t=e.attributes[n];t!==void 0&&a.add(t)}let n={tag:e.tag,attributes:{...e.attributes},children:e.children.map(o),location:e.location};return Object.defineProperties(n,{attributeLocations:{value:e.attributeLocations,enumerable:!1},valueLocations:{value:e.valueLocations,enumerable:!1}}),e.gettext&&Object.assign(n,{gettext:[...e.gettext]}),n};return{schema:e.find(e=>e.tag===`game`)?.attributes.schema??`0.1`,roots:e.map(o),assets:[...i].sort(),messages:[...a].sort()}}function r1(e){return e===`file`||e===`image`||e===`image_icon`||e===`icon`||e===`profile`||e===`sound`||e.endsWith(`_sound`)||e.endsWith(`_image`)}function i1(e){return e.includes(`/`)||/\.(?:png|jpg|jpeg|gif|svg|webp|wav|ogg|mp3|flac|glb|gltf|vox|map|cfg)$/i.test(e)||e.startsWith(`data:`)}function a1(e){let t=[],n=0,r=0,i=0;for(let a=0;a<e.length;a+=1)e[a]===`(`?r+=1:e[a]===`)`&&r>0?--r:e[a]===`[`?i+=1:e[a]===`]`&&i>0?--i:e[a]===`,`&&r===0&&i===0&&(t.push(e.slice(n,a)),n=a+1);return t.push(e.slice(n)),t}function o1(e){let t=e.match(/~[A-Za-z][A-Za-z0-9_-]*(?:\(|$)/);return t?e.slice(0,t.index).trim():e}function s1(e,t={}){let n={};for(let t of e.messages)n[t]=t;return{locale:t.locale??`en`,direction:t.direction??`ltr`,messages:n}}function c1(e,t=`gameData`){return`export const ${t} = ${JSON.stringify(e,null,` `)} as const;\n`}function l1(e,t={}){let n=[{name:`game-data.ts`,content:c1(e,t.variable??`gameData`)},{name:`i18n.json`,content:`${JSON.stringify(s1(e),null,` `)}\n`},{name:`assets.json`,content:`${JSON.stringify({assets:e.assets},null,` `)}\n`},...Object.entries(t.artifacts??{}).sort(([e],[t])=>e<t?-1:+(e>t)).map(([e,t])=>({name:e,content:t}))];for(let e of n)t.onEmit?.(e);return n}function u1(e,t={},n={}){let r=l1(t1(e,t),n),i=l1(t1(e,t),n);if(r.length!==i.length||r.some((e,t)=>e.name!==i[t]?.name||e.content!==i[t]?.content))throw Error(`MWL generated artifacts are not deterministic`);return r}var d1=/^[A-Za-z_][\w-]*$/,f1=[`predicate`,`modifier`,`generator`,`command`,`ai`,`migration`];function p1(e){let t=e.indexOf(`:`);if(t<=0)return null;let n=e.slice(0,t),r=e.slice(t+1).trim();return!d1.test(n)||!d1.test(r)?null:{type:n,name:r}}function m1(e,t=[`hook`,`migration`]){let n=new Map,r=new Set(t),i=e=>{for(let[t,n]of Object.entries(e.attributes))r.has(t)&&a(n,e.location),e.tag===`hook`&&t===`name`&&a(n,e.location);e.children.forEach(i)},a=(e,t)=>{let r=p1(e);if(!r)return;let i=`${r.type}:${r.name}`;n.has(i)||n.set(i,{...r,location:t})};return e.roots.forEach(i),[...n.values()].sort((e,t)=>e.type.localeCompare(t.type)||e.name.localeCompare(t.name))}function h1(e,t){if(t.attributes===void 0&&t.openAttributes===void 0)return[];let n=e.location??{file:`<hook>`,line:0,column:0},r=[];for(let[i,a]of Object.entries(e.attributes)){if(i===`name`)continue;let e=t.attributes?.[i]??t.openAttributes;e===void 0?r.push({code:`MWL_UNKNOWN_ATTRIBUTE`,message:`unknown attribute ${i} on hook ${t.id}`,location:n}):Z$(a,e)||r.push({code:`MWL_VALUE`,message:`${i} must be ${Q$(e)} on hook ${t.id}`,location:n})}return r}function g1(e,t){let n=new Set(t),r=[];for(let t of e){let e=`${t.type}:${t.name}`;n.has(e)||r.push({code:`MWL_HOOK`,message:`hook ${e} is not implemented`,location:t.location??{file:`<hook>`,line:0,column:0}})}return r}function _1(e){let t=[];t.push(`// Generated by mwl - do not edit.`),t.push(`import type { AiHook, CommandHook, GeneratorHook, MigrationHook, ModifierHook, PredicateHook } from '@datamoc/mw_games/mwl';`),t.push(``),t.push(`export interface MwlHooks {`);for(let n of e){let e=f1.includes(n.type)?`${n.type[0].toUpperCase()}${n.type.slice(1)}Hook`:`MwlDomainHook`;t.push(`\t'${n.type}:${n.name}': ${e};`)}return t.push(`}`),t.push(``),t.join(`
|
|
1406
|
+
`)}function v1(e,t){let n=e.scenarios;if(n.length===0)throw Error(`campaign ${e.id} declares no scenarios`);let r=new Set(n.map(e=>e.id));if(r.size!==n.length)throw Error(`campaign ${e.id} declares a scenario twice`);let i=e.firstScenario||n[0].id;if(!r.has(i))throw Error(`campaign ${e.id} starts on an unknown scenario: ${i}`);return{start:i,levels:n.map(e=>({id:e.id,run:(n,r)=>{let i=t.run(e,n,r);return i.next===void 0?{...i,next:e.nextScenario??null}:i}}))}}var y1=i$,b1=a$,x1=o$,S1=s$,C1=l$;function w1(e){let t=r$(e.roots);return{campaigns:t.filter(e=>e.tag===`campaign`).map(e=>({id:y1(e,`id`),name:e.attributes.name,title:e.attributes.title,description:e.attributes.description,startScene:e.attributes.start_scene,firstScenario:e.attributes.first_scenario,scenarios:e.children.filter(e=>e.tag===`scenario`).map(e=>({id:y1(e,`id`),nextScenario:e.attributes.next_scenario||void 0}))})),items:t.filter(e=>e.tag===`item`).map(e=>({id:y1(e,`id`),name:y1(e,`name`),slot:e.attributes.slot,stackable:S1(e,`stackable`),weight:b1(e,`weight`),image:e.attributes.image,icon:e.attributes.icon,effects:e.children.filter(e=>e.tag===`effect`).map(E1)})),monsters:t.filter(e=>e.tag===`monster`).map(e=>({id:y1(e,`id`),name:e.attributes.name,hp:x1(e,`hp`,1),accuracy:b1(e,`accuracy`),evasion:b1(e,`evasion`),damage:D1(e,`damage_min`,`damage_max`),armor:D1(e,`armor_min`,`armor_max`),experience:x1(e,`experience`),maxLevel:x1(e,`max_level`),image:e.attributes.image,types:e.attributes.types?.split(`,`).map(e=>e.trim()).filter(Boolean),baseStats:[`attack`,`defense`,`speed`,`hp`].reduce((t,n)=>{let r=b1(e,n);return r!==void 0&&(t[n===`hp`?`maxHp`:n]=r),t},{})})),statuses:t.filter(e=>e.tag===`status`).map(e=>({id:y1(e,`id`),name:e.attributes.name,duration:x1(e,`duration`),tick:e.attributes.tick,modifiers:e.attributes.modifiers})),loot:t.filter(e=>e.tag===`loot`).map(e=>({item:y1(e,`item`),chance:b1(e,`chance`),quantity:x1(e,`quantity`),weight:b1(e,`weight`)})),turnClocks:t.filter(e=>e.tag===`turn_clock`).map(e=>({id:y1(e,`id`),tick:b1(e,`tick`),hunger:b1(e,`hunger`)})),ai:t.filter(e=>e.tag===`ai`).map(e=>({id:y1(e,`id`),strategy:e.attributes.strategy,target:e.attributes.target,difficulty:b1(e,`difficulty`),scope:C1(e.attributes.scope,[`actor`,`controller`]),provider:C1(e.attributes.provider,[`javascript`,`lua`]),algorithm:C1(e.attributes.algorithm,[`rules`,`alpha_beta`]),depth:x1(e,`depth`),maxNodes:x1(e,`max_nodes`),player:e.attributes.player,moves:e.attributes.moves,apply:e.attributes.apply,terminal:e.attributes.terminal,evaluate:e.attributes.evaluate,behaviors:e.children.filter(e=>e.tag===`behavior`).map(e=>({id:y1(e,`id`),when:e.attributes.when,action:e.attributes.action,hook:e.attributes.hook}))})),moves:t.filter(e=>e.tag===`battle_move`).map(e=>({id:y1(e,`id`),type:y1(e,`type`),target:y1(e,`target`),power:b1(e,`power`),cost:b1(e,`cost`)})),typeMatchups:t.filter(e=>e.tag===`type_matchup`).map(e=>({attacker:y1(e,`attacker`),defender:y1(e,`defender`),multiplier:b1(e,`multiplier`)??1})),evolutions:t.filter(e=>e.tag===`evolution`).map(e=>({from:y1(e,`from`),into:y1(e,`into`),level:x1(e,`level`,1)})),tables:t.filter(e=>e.tag===`table`).map(T1)}}function T1(e){let t=W$(y1(e,`columns`));return{id:y1(e,`id`),columns:t,rows:e.children.filter(e=>e.tag===`row`).map(n=>{let r={};for(let i of t){let t=n.attributes[i.name];t!==void 0&&(r[i.name]=Y$(t,i.type,i.name,e.attributes.list_delimiter,e.attributes.map_delimiter))}return r})}}function E1(e){let t=[`add`,`sub`,`multiply`,`divide`,`set`,`increase`,`increase_total`,`increase_damage`].find(t=>e.attributes[t]!==void 0);return{applyTo:y1(e,`apply_to`),operation:t,value:t?e.attributes[t]:void 0,range:e.attributes.range}}function D1(e,t,n){let r=b1(e,t),i=b1(e,n);return r===void 0||i===void 0?void 0:[r,i]}function O1(e,t){let n=[];function r(e,t){n.push({code:`MWL_OBJECT`,message:t,location:e.location??{file:`<mwl>`,line:1,column:1}})}function i(e){let n={},a=Object.hasOwn(t,e.tag)?t[e.tag]:void 0;if(!a)return r(e,`no object schema for tag "${e.tag}"`),n;for(let[t,i]of Object.entries(e.attributes)){let o=(a.attributes&&Object.hasOwn(a.attributes,t)?a.attributes[t]:void 0)??a.openAttributes;if(!o||!Z$(i,o)){r(e,`invalid or undeclared attribute "${t}" on "${e.tag}"`);continue}let s=i;o===`number`||o===`integer`?s=Number(i):o===`boolean`&&(s=i===`true`||i===`yes`),Object.defineProperty(n,t,{value:s,enumerable:!0,writable:!0,configurable:!0})}for(let t of a.required??[])Object.hasOwn(e.attributes,t)||r(e,`missing required attribute "${t}" on "${e.tag}"`);let o=new Map;for(let t of e.children){let e=o.get(t.tag)??[];e.push(i(t)),o.set(t.tag,e)}for(let[t,i]of o){if(Object.hasOwn(n,t)){r(e,`attribute and child tag "${t}" collide on "${e.tag}"`);continue}let o=a.cardinality?.[t]?.max===1;o&&i.length>1&&r(e,`multiple "${t}" children on "${e.tag}"`),Object.defineProperty(n,t,{value:o?i[0]:i,enumerable:!0,writable:!0,configurable:!0})}return n}return{value:e.map(i),diagnostics:n}}function k1(e){return e.rows}function A1(e,t={}){let n=[`// ${t.header??`Generated from MWL tables - do not edit by hand.`}`];e.length>0&&n.push(`import { typedRows } from '@datamoc/mw_games/mwl';`,`import type { MwlContentCatalog } from '@datamoc/mw_games/mwl';`);let r=new Set;for(let i of e){let e=j1(i.id,r);for(let a of i.columns){if(!t.literalColumns?.includes(a.name))continue;if(a.type!==`string`)throw Error(`literal column "${i.id}.${a.name}" must be a string`);let o=[...new Set(i.rows.map(e=>e[a.name]).filter(e=>e!==void 0))];if(o.some(e=>typeof e!=`string`))throw Error(`literal column "${i.id}.${a.name}" contains a non-string value`);let s=j1(`${e}_${a.name}`,r);n.push(``,`export const ${s}Values = ${JSON.stringify(o.sort())} as const;`,`export type ${s} = typeof ${s}Values[number];`)}n.push(``,`const ${e}Columns = [${i.columns.map(e=>`{ name: ${JSON.stringify(e.name)}, type: ${JSON.stringify(e.type)} }`).join(`, `)}] as const;`),n.push(`export interface ${e}Row {`);for(let e of i.columns)n.push(`\t${M1(e.name)}?: ${N1(e.type)};`);n.push(`}`,``,`/** Typed rows of the \`${i.id}\` table. */`);let a=`${e[0].toLowerCase()}${e.slice(1)}Rows`;n.push(`export function ${a}(catalog: Pick<MwlContentCatalog, 'tables'>): ${e}Row[] {`,`\tconst table = catalog.tables.find((entry) => entry.id === ${JSON.stringify(i.id)});`,`\treturn typedRows({ columns: ${e}Columns, rows: table?.rows ?? [] });`,`}`)}return`${n.join(`
|
|
1407
|
+
`)}\n`}function j1(e,t){let n=e.split(/[^A-Za-z0-9]+/).filter(e=>e.length>0).map(e=>e[0].toUpperCase()+e.slice(1)).join(``)||`Table`,r=/^[A-Za-z_$]/.test(n)?n:`_${n}`,i=r;for(let e=2;t.has(i);e++)i=`${r}${e}`;return t.add(i),i}function M1(e){return/^[A-Za-z_$][\w$]*$/.test(e)?e:JSON.stringify(e)}function N1(e){switch(e){case`number`:return`number`;case`boolean`:return`boolean`;case`list`:return`string[]`;case`map`:return`Record<string, string>`;default:return`string`}}function P1(e,t={}){return{id:e.id,stackable:e.stackable,weight:e.weight,slot:e.slot,modifiers:e.effects.map(e=>L1(e,t))}}function F1(e,t=1){return{id:e.id,quantity:t,stackable:e.stackable,weight:e.weight}}function I1(e,t,n={}){return SH(e,t.map(e=>L1(e,n)))}function L1(e,t={}){let n=e.operation;if(n!==`add`&&n!==`sub`&&n!==`multiply`&&n!==`divide`&&n!==`set`)throw Error(`MWL effect operation "${n??``}" is not a StatBlock modifier`);let r=e.value;if(r===void 0)throw Error(`MWL effect has no value`);let i=ZQ(r,t);return{stat:e.applyTo,op:n===`sub`?`add`:n===`divide`?`multiply`:n,value:n===`sub`?-i:n===`divide`?1/i:i}}function R1(e,t={}){let n=[],r=new Map,i=r$(e.roots);for(let e of i){let i=e.attributes.id;if(i){let a=`${t.rowIdScope===`file`?e.location?.file??`<mwl>`:``}\0${e.tag}:${i}`,o=r.get(a);o?n.push(H1(`MWL_DUPLICATE_ID`,`duplicate ${e.tag} id "${i}"`,e.location??o.location)):r.set(a,e)}if(e.tag===`item`&&t.slots&&e.attributes.slot&&!t.slots.includes(e.attributes.slot)&&n.push(H1(`MWL_UNKNOWN_SLOT`,`unknown equipment slot "${e.attributes.slot}"`,e.location)),e.tag===`effect`){let t=[`add`,`sub`,`multiply`,`divide`,`set`,`increase`,`increase_total`,`increase_damage`].filter(t=>e.attributes[t]!==void 0);(!e.attributes.apply_to||t.length!==1)&&n.push(H1(`MWL_INCOMPLETE_EFFECT`,`an effect needs apply_to and exactly one operation`,e.location))}W1(e,t.mapBounds,n)}z1(i,n),B1(i,t.tableReferences,n);let a=m1(e,[`hook`,`migration`,...t.hookAttributes??[]]),o=new Map;for(let e of t.hooks??[])o.set(typeof e==`string`?e:e.id,typeof e==`string`?{id:e}:e);for(let e of i){let t=e.attributes.hook??(e.tag===`hook`?e.attributes.name:void 0);t!==void 0&&!p1(t)&&n.push(H1(`MWL_INVALID_HOOK`,`invalid hook reference "${t}"`,e.location));let r=e.tag===`hook`&&e.attributes.name?o.get(e.attributes.name):void 0;r&&n.push(...h1(e,r))}if(t.hooks)for(let e of a)o.has(`${e.type}:${e.name}`)||n.push(H1(`MWL_UNKNOWN_HOOK`,`hook ${e.type}:${e.name} is not declared by the game`,e.location));return n}function z1(e,t){let n=new Map;for(let t of e){let e=t.attributes.id;e&&n.set(`${t.tag}\0${e}`,t)}let r=new Set,i=new Set,a=new Set,o=(e,s)=>{if(r.has(e)){let n=s.indexOf(e),r=s.slice(n).map(e=>`${e.tag}:${e.attributes.id??`<anonymous>`}`).sort().join(`|`);if(a.has(r))return;a.add(r),t.push({code:`MWL_ALIAS_CYCLE`,message:`alias cycle through ${s.slice(n).map(e=>e.attributes.id??e.tag).join(` -> `)}`,location:e.valueLocations?.aliasof??e.attributeLocations?.aliasof??e.location??U1()})}else if(!i.has(e)){r.add(e);for(let t of(e.attributes.aliasof??``).split(`,`).map(e=>e.trim()).filter(Boolean)){let r=n.get(`${e.tag}\0${t}`);r&&o(r,[...s,e])}r.delete(e),i.add(e)}};for(let t of e)t.attributes.aliasof!==void 0&&o(t,[])}function B1(e,t,n){if(!t)return;let r=new Map;for(let t of e){let e=t.tag===`table`?t.attributes.id:void 0;e&&!r.has(e)&&r.set(e,t)}let i=e=>{try{return W$(e.attributes.columns??``)}catch{return}},a=e=>e.children.filter(e=>e.tag===`row`);for(let o of t){let t=r.get(o.table);if(!t){n.push(H1(`MWL_TABLE_REFERENCE`,`unknown table "${o.table}" in tableReferences`,U1()));continue}let s=i(t)?.find(e=>e.name===o.column);if(!s){n.push(H1(`MWL_TABLE_REFERENCE`,`unknown column "${o.column}" in table "${o.table}"`,t.location));continue}let c,l;if(`oneOf`in o)c=new Set(o.oneOf),l=`one of the declared values`;else if(`node`in o.references){let t=new Set;for(let n of e)n.tag===o.references.node&&n.attributes.id&&t.add(n.attributes.id);c=t,l=`node "${o.references.node}"`}else{let e=o.references,s=r.get(e.table),u=s?i(s)?.find(t=>t.name===e.column):void 0;if(!s||!u){n.push(H1(`MWL_TABLE_REFERENCE`,`unknown reference target "${e.table}.${e.column}" for table "${o.table}" column "${o.column}"`,t.location));continue}let d=new Set;for(let e of a(s))for(let t of V1(e,u,s.attributes.list_delimiter))d.add(t);c=d,l=`${e.table}.${e.column}`}let u=t.attributes.list_delimiter;a(t).forEach((e,t)=>{for(let r of V1(e,s,u))c.has(r)||n.push({code:`MWL_TABLE_REFERENCE`,message:`table "${o.table}" row ${t+1} column "${o.column}": unknown value "${r}" (expected ${l})`,location:e.valueLocations?.[o.column]??e.attributeLocations?.[o.column]??e.location??U1()})})}}function V1(e,t,n){let r=e.attributes[t.name];return r===void 0||r===``?[]:t.type===`list`?r.split(n??`;`).map(e=>e.trim()).filter(e=>e.length>0):[r]}function H1(e,t,n){return{code:e,message:t,location:n??U1()}}function U1(){return{file:`<mwl>`,line:1,column:1}}function W1(e,t,n){if(t)for(let r of[`x`,`y`]){let i=e.attributes[r];if(i===void 0)continue;let a=r===`x`?t.width:t.height;if(!Number.isInteger(a)||a<=0)continue;let o=i.split(`,`).flatMap(e=>{let t=e.trim(),n=/^(-?\d+)\s*-\s*(-?\d+)$/.exec(t);return n?[Number(n[1]),Number(n[2])]:/^-?\d+$/.test(t)?[Number(t)]:[]});o.length>0&&o.some(e=>e<0||e>=a)&&n.push({code:`MWL_COORDINATE`,message:`${r} coordinate is outside the ${a}-cell map bound`,location:e.valueLocations?.[r]??e.attributeLocations?.[r]??e.location??{file:`<mwl>`,line:1,column:1}})}}function G1(e,t={}){return R1({schema:`0.1`,roots:e,assets:[],messages:[]},t)}function K1(e,t={}){try{let n=t1(e,t),r=q1(n),i=[];for(let e of r.opaqueTags)i.push({severity:`warning`,code:`opaque-tag`,message:`ignored opaque tag: ${e}`});for(let e of r.danglingReferences)i.push({severity:`error`,code:`dangling-reference`,message:`dangling content reference: ${e}`});return{game:n,resources:[...n.assets],dependencies:[...r.references],ignored:[...r.opaqueTags],diagnostics:i}}catch(e){return{resources:[],dependencies:[],ignored:[],diagnostics:[{severity:`error`,code:`compile`,message:String(e)}]}}}function q1(e){let t=r$(e.roots),n={},r=new Set;for(let e of t)n[e.tag]=(n[e.tag]??0)+1,e.attributes.id&&r.add(e.attributes.id);let i=new Set(Object.keys(G$)),a=t.filter(e=>!i.has(e.tag)).map(e=>e.tag).filter((e,t,n)=>n.indexOf(e)===t).sort(),o=new Set;for(let e of t)for(let[t,n]of Object.entries(e.attributes))if(/^(?:ability|item|terrain|unit|unit_type|weapon)(?:_id)?$/.test(t))for(let e of n.split(`,`).map(e=>e.trim()).filter(Boolean))o.add(e);return{tags:Object.fromEntries(Object.entries(n).sort(([e],[t])=>e.localeCompare(t))),opaqueTags:a,references:[...o].sort(),danglingReferences:[...o].filter(e=>!r.has(e)).sort()}}function J1(e,t){let n={},r=[];for(let[i,a]of Object.entries(t)){let t=a.source??i,o=e.attributes[t];if(o===void 0){a.required?r.push(i0(`MWL_REQUIRED_FIELD`,`missing required attribute "${t}"`,e)):a.default!==void 0&&(n[i]=a.default);continue}let s=r0(o,a.type);s===void 0?r.push(i0(`MWL_FIELD_TYPE`,`invalid ${a.type} attribute "${t}": "${o}"`,e)):n[i]=s}return{value:n,diagnostics:r}}function Y1(e,t,n){let r=[],i=[];for(let a of e.children){if(a.tag!==t)continue;let e=n(a);r.push(e.value),i.push(...e.diagnostics)}return{value:r,diagnostics:i}}function X1(e,t){let n=new Map;for(let r of e){let e=Q1(...$1(r,t.key));if(n.has(e)&&t.duplicate!==`last`)throw Error(`duplicate table key: ${e}`);n.set(e,t.value?t.value(r):r)}return n}function Z1(e,t){let n=new Map;for(let r of e){let e=Q1(...$1(r,t.key)),i=n.get(e);i?i.push(r):n.set(e,[r])}return n}function Q1(...e){return JSON.stringify(e)}function $1(e,t){if(typeof t==`function`){let n=t(e);return e0(n)?[...n]:[n]}return t0(t)?t.map(t=>n0(e[t],String(t))):[n0(e[t],String(t))]}function e0(e){return Array.isArray(e)}function t0(e){return Array.isArray(e)}function n0(e,t){if(e===null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return e;throw TypeError(`table key column "${t}" must be a string, number, boolean, or null`)}function r0(e,t){if(t===`string`)return e;if(t===`id`)return X$(e)?e:void 0;if(t===`number`)return Number.isFinite(Number(e))?Number(e):void 0;if(t===`integer`)return/^-?\d+$/.test(e)?Number(e):void 0;if(t===`boolean`)return e===`true`||e===`yes`?!0:e===`false`||e===`no`?!1:void 0;let n=e.split(`,`).map(e=>e.trim()).filter(Boolean);return t===`id-list`?n.every(e=>X$(e))?n:void 0:n.every(e=>Number.isFinite(Number(e)))?n.map(Number):void 0}function i0(e,t,n){return{code:e,message:t,location:n.location??{file:`<mwl>`,line:1,column:1}}}function a0(){return{evaluate(e,t={}){let n={};for(let[e,r]of Object.entries(t)){if(typeof r!=`number`)throw Error(`MWL expression context value must be numeric: ${e}`);n[e]=r}return ZQ(e,n)},execute(){throw Error(`the expression ScriptHost cannot execute statements`)},call(){throw Error(`the expression ScriptHost cannot call functions`)},dispose(){}}}var o0=class extends Error{constructor(e){super(e),this.name=`PackageError`}},s0=class extends o0{constructor(e){super(e),this.name=`PackageFormatError`}},c0=class extends o0{constructor(e){super(e),this.name=`PackageIntegrityError`}},l0=class extends o0{constructor(e){super(e),this.name=`PackageLimitError`}},u0=class extends o0{constructor(e){super(e),this.name=`PackagePathError`}},d0={maxPackageBytes:67108864,maxTotalBytes:134217728,maxEntries:512,maxEntryBytes:33554432,maxAudioSeconds:600,maxImageWidth:4096,maxImageHeight:4096},f0=[77,87,80,49],p0=8,m0=4194304,h0=`content.mwl`;function g0(e){if(typeof e!=`string`||e===``||e.length>240)throw new u0(`bad package path`);if(e.includes(`\\`)||/[\u0000-\u001f]/.test(e)||e.startsWith(`/`)||/^[A-Za-z]:/.test(e))throw new u0(`package path "${e}" must be relative with forward slashes`);for(let t of e.split(`/`))if(t===``||t===`.`||t===`..`)throw new u0(`package path "${e}" escapes or is not normalised`);return e}async function _0(e){let t=await globalThis.crypto.subtle.digest(`SHA-256`,e);return Array.from(new Uint8Array(t),e=>e.toString(16).padStart(2,`0`)).join(``)}async function v0(e,t={}){let n={...d0,...t.limits},r=t.main??h0,i=[...e].sort((e,t)=>e.path<t.path?-1:+(e.path>t.path));if(x0(i.map(e=>({path:e.path,size:e.data.length})),n),!i.some(e=>e.path===r))throw new s0(`main document "${r}" is missing`);let a=[],o=[],s=0;for(let e of i){S0(e.path,e.data,n);let t=await k0(e.data);a.push({path:e.path,size:e.data.length,packed:t.length,offset:s,sha256:await _0(e.data)}),o.push(t),s+=t.length}let c=await k0(new TextEncoder().encode(JSON.stringify({entries:a,main:r}))),l=new Uint8Array(p0);l.set(f0,0),new DataView(l.buffer).setUint32(4,c.length,!0);let u=D0([l,c,...o]);if(u.length>n.maxPackageBytes)throw new l0(`package is ${u.length} bytes, over the ${n.maxPackageBytes} limit`);return u}async function y0(e,t={}){let n={...d0,...t};if(e.length>n.maxPackageBytes)throw new l0(`package is ${e.length} bytes, over the ${n.maxPackageBytes} limit`);if(e.length<p0||f0.some((t,n)=>e[n]!==t))throw new s0(`not an MWP1 package (bad magic)`);let r=new DataView(e.buffer,e.byteOffset,e.byteLength).getUint32(4,!0);if(r>m0||p0+r>e.length)throw new s0(`package directory size is out of range`);let i=p0+r,a=new TextDecoder(`utf-8`,{fatal:!0}),o;try{o=JSON.parse(a.decode(await O0(e.subarray(p0,i),m0,`directory`)))}catch(e){throw e instanceof o0?e:new s0(`package directory is not valid JSON`)}let{entries:s,main:c}=b0(o,e.length-i,n);if(!s.some(e=>e.path===c))throw new s0(`main document "${c}" is not in the package`);let l=[];for(let t of s){let r=i+t.offset,a=await O0(e.subarray(r,r+t.packed),t.size,t.path);if(a.length!==t.size)throw new s0(`entry "${t.path}" inflates to ${a.length} bytes, not ${t.size}`);if(await _0(a)!==t.sha256)throw new c0(`entry "${t.path}" does not match its sha256`);S0(t.path,a,n),l.push({path:t.path,data:a})}return{main:c,entries:s,files:l}}function b0(e,t,n){let r=e;if(!r||typeof r!=`object`||!Array.isArray(r.entries)||typeof r.main!=`string`)throw new s0(`package directory needs "entries" and "main"`);if(r.entries.length>n.maxEntries)throw new l0(`package has ${r.entries.length} entries, over the ${n.maxEntries} limit`);let i=r.entries.map((e,n)=>{let r=e,i=e=>{let t=r?.[e];if(typeof t!=`number`||!Number.isSafeInteger(t)||t<0)throw new s0(`directory entry ${n} has a bad "${e}"`);return t};if(typeof r?.path!=`string`)throw new s0(`directory entry ${n} has no path`);let a=r.sha256;if(typeof a!=`string`||!/^[0-9a-f]{64}$/.test(a))throw new s0(`directory entry ${n} has a bad sha256`);let o={path:g0(r.path),size:i(`size`),packed:i(`packed`),offset:i(`offset`),sha256:a};if(o.offset+o.packed>t)throw new s0(`entry "${o.path}" lies outside the package`);return o});return x0(i,n),{entries:i,main:g0(r.main)}}function x0(e,t){if(e.length>t.maxEntries)throw new l0(`package has ${e.length} entries, over the ${t.maxEntries} limit`);let n=new Set,r=0;for(let i of e){g0(i.path);let e=i.path.toLowerCase();if(n.has(e))throw new u0(`duplicate package path "${i.path}"`);if(n.add(e),i.size>t.maxEntryBytes)throw new l0(`entry "${i.path}" is ${i.size} bytes, over the ${t.maxEntryBytes} limit`);r+=i.size}if(r>t.maxTotalBytes)throw new l0(`package inflates to ${r} bytes, over the ${t.maxTotalBytes} limit`)}function S0(e,t,n){let r=e.toLowerCase();if(r.endsWith(`.png`)){let r=C0(t);if(!r)throw new s0(`"${e}" is not a PNG image`);if(r.width>n.maxImageWidth||r.height>n.maxImageHeight)throw new l0(`image "${e}" is ${r.width}x${r.height}, over ${n.maxImageWidth}x${n.maxImageHeight}`)}else if(r.endsWith(`.wav`)){let r=w0(t);if(r===void 0)throw new s0(`"${e}" is not a readable WAV file`);if(r>n.maxAudioSeconds)throw new l0(`audio "${e}" lasts ${r.toFixed(1)} s, over the ${n.maxAudioSeconds} s limit`)}}function C0(e){if(e.length<24||[137,80,78,71,13,10,26,10].some((t,n)=>e[n]!==t)||String.fromCharCode(e[12],e[13],e[14],e[15])!==`IHDR`)return;let t=new DataView(e.buffer,e.byteOffset,e.byteLength);return{width:t.getUint32(16),height:t.getUint32(20)}}function w0(e){let t=t=>String.fromCharCode(e[t],e[t+1],e[t+2],e[t+3]);if(e.length<12||t(0)!==`RIFF`||t(8)!==`WAVE`)return;let n=new DataView(e.buffer,e.byteOffset,e.byteLength),r=0;for(let i=12;i+8<=e.length;){let a=n.getUint32(i+4,!0);if(t(i)===`fmt `&&i+24<=e.length){let e=n.getUint32(i+12,!0);r=Math.min(n.getUint32(i+16,!0),e*n.getUint16(i+20,!0),e*n.getUint16(i+10,!0)*Math.ceil(n.getUint16(i+22,!0)/8))}if(t(i)===`data`)return r>0?Math.min(a,e.length-i-8)/r:void 0;i+=8+a+(a&1)}}function T0(e){return new Blob([e]).stream()}async function E0(e,t,n){let r=e.getReader(),i=[],a=0;for(;;){let{done:e,value:o}=await r.read();if(e)break;if(a+=o.length,a>t)throw await r.cancel(),new l0(`"${n}" inflates past its declared ${t} bytes`);i.push(o)}return D0(i)}function D0(e){let t=new Uint8Array(e.reduce((e,t)=>e+t.length,0)),n=0;for(let r of e)t.set(r,n),n+=r.length;return t}async function O0(e,t,n){if(typeof DecompressionStream>`u`)return j0(e,t,n);try{return await E0(T0(e).pipeThrough(new DecompressionStream(`deflate-raw`)),t,n)}catch(e){throw e instanceof o0?e:new s0(`"${n}" is not valid DEFLATE data`)}}async function k0(e){let t=A0(e);if(typeof CompressionStream>`u`)return t;let n=await E0(T0(e).pipeThrough(new CompressionStream(`deflate-raw`)),1/0,`entry`);return n.length<t.length?n:t}function A0(e){let t=Math.max(1,Math.ceil(e.length/65535)),n=new Uint8Array(e.length+t*5),r=0;for(let i=0;i<t;i++){let a=e.subarray(i*65535,(i+1)*65535);n[r++]=+(i===t-1),n[r++]=a.length&255,n[r++]=a.length>>8,n[r++]=~a.length&255,n[r++]=~a.length>>8&255,n.set(a,r),r+=a.length}return n}function j0(e,t,n){let r=[],i=0,a=0;for(let o=!1;!o;){if(i+5>e.length)throw new s0(`"${n}" is truncated`);if(o=(e[i]&1)==1,e[i]>>1&3)throw new s0(`"${n}" is compressed and this platform has no DecompressionStream`);let s=e[i+1]|e[i+2]<<8;if(((e[i+3]|e[i+4]<<8)^65535)!==s)throw new s0(`"${n}" has a corrupt stored block`);if(a+=s,a>t)throw new l0(`"${n}" inflates past its declared ${t} bytes`);if(i+5+s>e.length)throw new s0(`"${n}" is truncated`);r.push(e.subarray(i+5,i+5+s)),i+=5+s}if(i!==e.length)throw new s0(`"${n}" has trailing bytes`);return D0(r)}var M0=[`image`,`audio`,`music`,`font`,`data`,`synth-patch`],N0=[`image`,`audio`,`music`,`font`],P0=[`package`,`asset`,`character`,`animation`,`sound_effect`,`music`,`script`,`import`],F0=[`message`,`say`,`play`,`give`,`set_variable`,`gold`,`heal_unit`,`fire_event`],I0=[`audio`,`script`],L0=/^[A-Za-z_][\w.-]*$/,R0=/^\d+\.\d+\.\d+(?:[-+][\w.+-]*)?$/,z0=4096,B0=65536,V0=512,H0=64,U0=16,W0=4,G0=64;function K0(e,t={}){let n=q0();if(Y0(n,e,t,0,``,{reads:0}),!n.meta)throw new s0(`${t.file??`package`}: needs a [package] tag`);return J0(n,n.meta)}function q0(){return{assets:[],characters:[],animations:[],soundEffects:[],music:[],scripts:[],imports:[],messages:new Set}}function J0(e,t){return{meta:t,assets:e.assets,characters:e.characters,animations:e.animations,soundEffects:e.soundEffects,music:e.music,scripts:e.scripts,imports:e.imports,messages:[...e.messages].sort()}}function Y0(e,t,n,r,i,a){let o=n.file??`package.mwl`,s=e=>{throw new s0(`${o}: ${e}`)},c;try{c=cQ.default.parse(dQ(t,n))}catch(e){return s(e instanceof Error?e.message:String(e))}if(!Array.isArray(c))return s(`a package document is a top-level array of nodes`);let l=(t,n)=>{if(typeof t==`string`)return t;let r=t?.$gettext;return typeof r==`string`&&Object.keys(t).length===1?(e.messages.add(r),r):s(`${n} must be a string or _("...")`)},u=(e,t)=>typeof e==`string`?e:s(`${t} must be a string`),d=(e,t)=>typeof e!=`string`||!L0.test(e)?s(`${t} must be an id (letters, digits, _ . -)`):e,f=(e,t)=>typeof e!=`number`||!Number.isFinite(e)?s(`${t} must be a number`):e,p=(e,t)=>typeof e!=`object`||!e||Array.isArray(e)?s(`${t} must be an object`):e,m=(e,t,n)=>{for(let r of Object.keys(e))t.includes(r)||s(`${n}: unknown field "${r}"`)},h=(e,t,n)=>{e.some(e=>e.id===t)&&s(`${n}: duplicate id "${t}"`)},g=e=>i?`${i}.${e}`:e,_=(t,n,r=0)=>{if(r>U0)return s(`${n} is nested too deep`);if(t===null||typeof t==`boolean`||typeof t==`string`)return t;if(typeof t==`number`)return Number.isFinite(t)?t:s(`${n} must be finite`);if(Array.isArray(t))return t.map(e=>_(e,n,r+1));if(typeof t==`object`){let i={};for(let[a,o]of Object.entries(t))a===`__proto__`&&s(`${n} has a forbidden key`),i[a]=a===`$gettext`&&typeof o==`string`?(e.messages.add(o),o):_(o,n,r+1);return i}return s(`${n} must be plain data`)},v=(e,t,n)=>{m(t,[`tag`,`id`,`frames`,`fps`,`loop`,`events`],n);let r=t.frames;(!Array.isArray(r)||r.length===0||r.length>z0)&&s(`${n}: frames must be a list of 1 to ${z0} frame numbers`),r.forEach(e=>{(!Number.isInteger(e)||e<0)&&s(`${n}: a frame is a non-negative integer`)});let i={};for(let[e,r]of Object.entries(p(t.events??{},`${n}.events`))){/^\d+$/.test(e)||s(`${n}: event keys are frame numbers`);let t=p(r,`${n}.events.${e}`);m(t,[`sound`],`${n}.events.${e}`),i[e]={sound:y(t.sound,`${n}.events.${e}.sound`)}}let a=t.fps===void 0?void 0:f(t.fps,`${n}.fps`);return a!==void 0&&(a<=0||a>240)&&s(`${n}: fps must be between 0 and 240`),t.loop!==void 0&&typeof t.loop!=`boolean`&&s(`${n}: loop must be true or false`),{id:e,frames:r,...a===void 0?{}:{fps:a},...t.loop===void 0?{}:{loop:t.loop},events:i}},y=(e,t)=>typeof e!=`string`||!/^[A-Za-z_][\w.-]*(?:@[\w.+-]+)?(?::[A-Za-z_][\w.-]*)?$/.test(e)?s(`${t} must be an id or package:id`):e,b=(e,t,n)=>{m(t,[`tag`,`id`,`on`,`when`,`do`,`code`],n);let r=u(t.on,`${n}.on`);L0.test(r)||s(`${n}: on must be an event name`);let i;if(t.when!==void 0){i=u(t.when,`${n}.when`),i.length>V0&&s(`${n}: when is longer than ${V0} characters`);try{qQ(i)}catch(e){s(`${n}: when: ${e instanceof Error?e.message:String(e)}`)}}let a=t.do??[];(!Array.isArray(a)||a.length>H0)&&s(`${n}: do is a list of at most ${H0} actions`);let o=a.map((e,t)=>{let r=p(e,`${n}.do[${t}]`),i=r.tag,a=r;if(typeof i!=`string`){let e=Object.keys(r);i=e.length===1?e[0]:void 0,a=i?p(r[i],`${n}.do[${t}]`):r}if(typeof i!=`string`||!F0.includes(i))return s(`${n}.do[${t}]: "${String(i)}" is not an allowed action (${F0.join(`, `)})`);let o={};for(let[e,r]of Object.entries(a))e!==`tag`&&(o[e]=typeof r==`number`||typeof r==`boolean`?r:l(r,`${n}.do[${t}].${e}`));return{tag:i,attributes:o}}),c;return t.code!==void 0&&(c=u(t.code,`${n}.code`),c.length>B0&&s(`${n}: code is longer than ${B0} characters`)),{id:e,on:r,...i===void 0?{}:{when:i},do:o,...c===void 0?{}:{code:c}}},x=(t,n)=>{let r=`[character] ${t}`;h(e.characters,t,r);let i={};for(let[a,o]of Object.entries(p(n.animations??{},`${r}.animations`)))if(typeof o==`string`)i[a]=y(o,`${r}.animations.${a}`);else{let n=`${t}.${a}`;h(e.animations,n,r),e.animations.push(v(n,p(o,`${r}.animations.${a}`),`${r}.animations.${a}`)),i[a]=n}let a={};for(let[i,o]of Object.entries(p(n.sounds??{},`${r}.sounds`)))if(typeof o==`string`)a[i]=y(o,`${r}.sounds.${i}`);else{let n=`${t}.${i}`;h(e.soundEffects,n,r);let s=p(o,`${r}.sounds.${i}`);e.soundEffects.push({id:n,definition:JSON.parse(JSON.stringify(s))}),a[i]=n}let o=[],c=n.scripts??[];Array.isArray(c)||s(`${r}.scripts must be a list`),c.forEach((n,i)=>{if(typeof n==`string`)o.push(y(n,`${r}.scripts[${i}]`));else{let a=`${t}.script${i}`;h(e.scripts,a,r),e.scripts.push(b(a,p(n,`${r}.scripts[${i}]`),`${r}.scripts[${i}]`)),o.push(a)}});let u;if(n.sprite!==void 0){let e=p(n.sprite,`${r}.sprite`);m(e,[`image`,`frame`],`${r}.sprite`);let t=e.frame;t!==void 0&&(!Array.isArray(t)||t.length!==2||t.some(e=>!Number.isInteger(e)||e<=0))&&s(`${r}.sprite.frame is [width, height]`),u={image:y(e.image,`${r}.sprite.image`),...t===void 0?{}:{frame:t}}}let d={};for(let[e,t]of Object.entries(n))X0.includes(e)||(L0.test(e)||s(`${r}: bad field name "${e}"`),d[e]=typeof t==`number`||typeof t==`boolean`?t:l(t,`${r}.${e}`));e.characters.push({id:t,...n.name===void 0?{}:{name:l(n.name,`${r}.name`)},...n.description===void 0?{}:{description:l(n.description,`${r}.description`)},...n.portrait===void 0?{}:{portrait:y(n.portrait,`${r}.portrait`)},...u===void 0?{}:{sprite:u},...n.theme===void 0?{}:{theme:y(n.theme,`${r}.theme`)},animations:i,sounds:a,scripts:o,stats:d})},S=[];for(let e of c){let t=p(e,`a node`);if(typeof t.tag==`string`)S.push([t.tag,t]);else{let e=Object.keys(t);e.length!==1&&s(`a node needs a tag`);let n=Array.isArray(t[e[0]])?t[e[0]]:[t[e[0]]];for(let t of n)S.push([e[0],p(t,e[0])])}}for(let[t,o]of S){let c=`[${t}]`;if(P0.includes(t)||s(`${c} is not allowed in a package; use [character] and the other package tags`),t===`package`){r>0&&s(`an imported file cannot hold a [package] tag`),e.meta&&s(`a second [package] tag`),m(o,[`tag`,`id`,`version`,`author`,`license`,`requires`],c);let t=u(o.version,`${c}.version`);R0.test(t)||s(`${c}: version must look like 1.2.3`);let n=p(o.requires??{},`${c}.requires`);m(n,[`mwg`,`retroAudio`,`capabilities`],`${c}.requires`);let i=n.capabilities??[];(!Array.isArray(i)||i.some(e=>typeof e!=`string`||!L0.test(e)))&&s(`${c}: requires.capabilities is a list of names`),e.meta={id:d(o.id,`${c}.id`),version:t,...o.author===void 0?{}:{author:l(o.author,`${c}.author`)},...o.license===void 0?{}:{license:u(o.license,`${c}.license`)},requires:{...n.mwg===void 0?{}:{mwg:u(n.mwg,`${c}.requires.mwg`)},...n.retroAudio===void 0?{}:{retroAudio:u(n.retroAudio,`${c}.requires.retroAudio`)},capabilities:[...new Set(i)].sort()}};continue}if(t===`import`){m(o,[`tag`,`src`,`package`,`version`,`as`],c),o.src===void 0==(o.package===void 0)&&s(`${c}: needs exactly one of src and package`);let t={...o.src===void 0?{}:{src:g0(u(o.src,`${c}.src`))},...o.package===void 0?{}:{package:d(o.package,`${c}.package`)},...o.version===void 0?{}:{version:u(o.version,`${c}.version`)},...o.as===void 0?{}:{as:d(o.as,`${c}.as`)}};if(e.imports.push(t),t.src!==void 0){r+1>W0&&s(`${c}: imports are nested more than ${W0} deep`),++a.reads>G0&&s(`${c}: more than ${G0} imports in one package`);let o=n.files,l=o&&Object.hasOwn(o,t.src)?o[t.src]:void 0;l===void 0&&s(`${c}: "${t.src}" is not in the package`),Y0(e,l,{...n,file:t.src},r+1,t.as?g(t.as):i,a)}continue}let f=g(d(o.id,`${c}.id`));if(t===`asset`){m(o,[`tag`,`id`,`kind`,`path`,`mime`,`sha256`,`license`,`source`],c);let t=u(o.kind,`${c}.kind`);M0.includes(t)||s(`${c}: kind must be one of ${M0.join(`, `)}`),h(e.assets,f,c);let n=o.sha256===void 0?void 0:u(o.sha256,`${c}.sha256`);n!==void 0&&!/^[0-9a-f]{64}$/.test(n)&&s(`${c}: sha256 is 64 lower-case hex digits`),e.assets.push({id:f,kind:t,path:g0(u(o.path,`${c}.path`)),...o.mime===void 0?{}:{mime:u(o.mime,`${c}.mime`)},...n===void 0?{}:{sha256:n},...o.license===void 0?{}:{license:u(o.license,`${c}.license`)},...o.source===void 0?{}:{source:u(o.source,`${c}.source`)}})}else if(t===`animation`)h(e.animations,f,c),e.animations.push(v(f,o,`${c} ${f}`));else if(t===`sound_effect`){h(e.soundEffects,f,c);let{tag:t,id:n,...r}=o;e.soundEffects.push({id:f,definition:_(r,`${c} ${f}`)})}else if(t===`music`){m(o,[`tag`,`id`,`src`,`loop`,`region`,`fallback`],c),h(e.music,f,c);let t=o.region;t!==void 0&&(!Array.isArray(t)||t.length!==2||t.some(e=>typeof e!=`number`||e<0))&&s(`${c}: region is [start, end]`),e.music.push({id:f,src:y(o.src,`${c}.src`),...o.loop===void 0?{}:{loop:o.loop===!0},...t===void 0?{}:{region:t},...o.fallback===void 0?{}:{fallback:y(o.fallback,`${c}.fallback`)}})}else t===`script`?(h(e.scripts,f,c),e.scripts.push(b(f,o,`${c} ${f}`))):x(f,o)}}var X0=[`tag`,`id`,`name`,`description`,`portrait`,`sprite`,`theme`,`animations`,`sounds`,`scripts`];function Z0(e,t){let n=e.split(/[-+]/)[0].split(`.`);if(n.length>3||!t&&n.length!==3)throw new s0(`bad version "${e}"`);return n.map(t=>{if(!/^\d{1,9}$/.test(t))throw new s0(`bad version "${e}"`);return Number(t)})}function Q0(e,t){for(let n=0;n<3;n++){let r=(e[n]??0)-(t[n]??0);if(r)return r}return 0}function $0(e){return e.length===1?[e[0]+1,0,0]:e.length===2?[e[0],e[1]+1,0]:[e[0],e[1],e[2]+1]}function e2(e){let t=/^(>=|<=|>|<|\^|~|=)?\s*(.*)$/.exec(e.trim()),n=t?.[1]??`=`,r=t?.[2]??``;if(r===``||r===`*`||/^[xX*]$/.test(r))return;let i=Z0(r.replace(/\.[xX*]/g,``),!0),a=[i[0],i[1]??0,i[2]??0];if(n===`>=`)return{low:a,op:`range`};if(n===`>`)return i.length===3?{low:a,op:`gt`}:{low:$0(i),op:`range`};if(n===`<`)return{low:[0,0,0],high:a,op:`range`};if(n===`<=`)return i.length===3?{low:a,op:`lte`}:{low:[0,0,0],high:$0(i),op:`range`};if(n===`^`){let e=i.findIndex(e=>e>0);return{low:a,high:$0(i.slice(0,e<0?i.length:e+1)),op:`range`}}return n===`~`?{low:a,high:$0(i.slice(0,2)),op:`range`}:{low:a,high:$0(i),op:`range`}}function t2(e,t){let n=Z0(e,!1);return t.split(`||`).some(e=>e.replace(/([<>=^~])\s+/g,`$1`).trim().split(/\s+/).every(e=>{let t=e2(e);return t?t.op===`gt`?Q0(n,t.low)>0:t.op===`lte`?Q0(n,t.low)<=0:Q0(n,t.low)>=0&&(!t.high||Q0(n,t.high)<0):!0}))}function n2(e,t){return Q0(Z0(e,!1),Z0(t,!1))}var r2=class extends o0{constructor(e){super(e),this.name=`PackageConflictError`}};async function i2(e,t={}){let n=await y0(e,t),r=new TextDecoder(`utf-8`,{fatal:!0}),i=Object.create(null);for(let e of n.files)if(e.path.endsWith(`.mwl`))try{i[e.path]=r.decode(e.data)}catch{throw new s0(`"${e.path}" is not UTF-8 text`)}if(!Object.hasOwn(i,n.main))throw new s0(`main "${n.main}" is not a .mwl document`);let a=K0(i[n.main],{file:n.main,files:i}),o=n.entries.map(e=>`${e.path}\n${e.sha256}\n`).join(``);return{document:a,main:n.main,files:n.files,hash:await _0(new TextEncoder().encode(o))}}function a2(e){return`${e.document.meta.id}@${e.document.meta.version}#${e.hash}`}function o2(e){let t=/^([A-Za-z_][\w.-]*)@(\d+\.\d+\.\d+[\w.+-]*)#([0-9a-f]{64}|[\w-]+)$/.exec(e);if(!t)throw new s0(`"${e}" is not an id@version#sha256 package reference`);return{id:t[1],version:t[2],hash:t[3]}}function s2(e){let t=new Set(e.meta.requires.capabilities);return e.scripts.some(e=>e.code!==void 0)&&t.add(`script`),[...t].sort()}function c2(e,t){let n=[],{requires:r}=e.meta;for(let r of s2(e)){let e=I0.includes(r);!t.allow.includes(r)&&(e||t.refuseUnknown!==!1)&&n.push(`asks for the "${r}" capability, which this game does not allow`)}let i=t.provides?.mwg??`0.44.2`;if(r.mwg!==void 0&&!l2(i,r.mwg,`requires.mwg`,n)&&n.push(`requires mwg ${r.mwg}, this game runs ${i}`),r.retroAudio!==void 0){let e=t.provides?.retroAudio;e===void 0?n.push(`requires retro-audio ${r.retroAudio}, which this game does not provide`):l2(e,r.retroAudio,`requires.retroAudio`,n)||n.push(`requires retro-audio ${r.retroAudio}, this game provides ${e}`)}return n}function l2(e,t,n,r){try{return t2(e,t)}catch{return r.push(`${n} "${t}" is not a valid version range`),!0}}function u2(e,t={packages:[]}){let{id:n,version:r}=e.document.meta;if(t.packages.some(e=>e.document.meta.id===n&&e.document.meta.version===r))throw new r2(`package ${n}@${r} is already in the content set`);for(let i of e.document.imports)if(i.package!==void 0&&!t.packages.filter(e=>e.document.meta.id===i.package).some(e=>i.version===void 0||t2(e.document.meta.version,i.version)))throw new r2(`${n}@${r} imports package ${i.package}${i.version?` ${i.version}`:``}, which is not merged`);return{packages:[...t.packages,e]}}function d2(e,t){let{id:n,version:r}=t.document.meta;return e.packages.filter(e=>e.document.meta.id===n).every(e=>n2(r,e.document.meta.version)>=0)?n:`${n}@${r}`}function f2(e){let t={assets:{},characters:{},animations:{},soundEffects:{},music:{},scripts:{}};for(let n of e.packages){let r=d2(e,n),i=`${n.document.meta.id}@${n.document.meta.version}`,a=e=>`${r}:${e}`,o=e=>e.includes(`:`)?e:a(e),{document:s}=n;for(let e of s.assets)t.assets[a(e.id)]={...e,id:a(e.id),path:h2(r,e),package:i};for(let e of s.animations)t.animations[a(e.id)]={...e,id:a(e.id),events:Object.fromEntries(Object.entries(e.events).map(([e,t])=>[e,{sound:o(t.sound)}])),package:i};for(let e of s.soundEffects)t.soundEffects[a(e.id)]={...e,id:a(e.id),package:i};for(let e of s.music)t.music[a(e.id)]={...e,id:a(e.id),src:o(e.src),...e.fallback===void 0?{}:{fallback:o(e.fallback)},package:i};for(let e of s.scripts)t.scripts[a(e.id)]={...e,id:a(e.id),do:e.do.map(e=>m2(e,o)),package:i};for(let e of s.characters)t.characters[a(e.id)]={...e,id:a(e.id),...e.portrait===void 0?{}:{portrait:o(e.portrait)},...e.sprite===void 0?{}:{sprite:{...e.sprite,image:o(e.sprite.image)}},...e.theme===void 0?{}:{theme:o(e.theme)},animations:p2(e.animations,o),sounds:p2(e.sounds,o),scripts:e.scripts.map(o),package:i}}return t}function p2(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,t(n)]))}function m2(e,t){let n=e.attributes.sound;return e.tag===`play`&&typeof n==`string`?{tag:e.tag,attributes:{...e.attributes,sound:t(n)}}:e}function h2(e,t){return`${e}/${t.path}`}var g2=[`hitpoints`,`movement`,`level`,`experience`,`cost`,`alignment`,`race`,`usage`,`movetype`,`movement_type`];function _2(e){let t=[],n=new Set,r=new Set;for(let i of e.packages){let{document:a}=i,o=d2(e,i),s={file:`${i.document.meta.id}/${i.main}`,line:1,column:1};for(let e of a.messages)n.add(e);for(let e of a.assets)r.add(h2(o,e));for(let e of a.characters){let n={id:`${o}:${e.id}`};e.name!==void 0&&(n.name=e.name),e.description!==void 0&&(n.description=e.description);for(let t of g2)e.stats[t]!==void 0&&(n[t]=String(e.stats[t]));let r=e=>{let t=a.assets.find(t=>t.id===e);return t?h2(o,t):void 0},i=e.sprite&&r(e.sprite.image);i&&(n.image=i);let c=e.portrait&&r(e.portrait);c&&(n.profile=c);let l=e.stats.attack;t.push({tag:`unit_type`,attributes:n,children:typeof l==`number`?[{tag:`attack`,attributes:{id:`attack`,damage:String(l)},children:[],location:s}]:[],location:s,gettext:[]})}}return{...n1(t),messages:[...n].sort(),assets:[...r].sort()}}function v2(e){let t=[];for(let{meta:n,assets:r}of[...e].sort((e,t)=>e.meta.id<t.meta.id?-1:+(e.meta.id>t.meta.id))){let e=n.author?` by ${n.author}`:``;n.license&&t.push(`${n.id} ${n.version}${e}\nLicense: ${n.license}`);for(let i of[...r].sort((e,t)=>e.id<t.id?-1:+(e.id>t.id))){if(!i.license)continue;let r=[`${i.id} (${n.id})${e}`,`License: ${i.license}`];i.source&&r.push(i.source),t.push(r.join(`
|
|
1408
|
+
`))}}return t.length?`${t.join(`
|
|
1409
|
+
|
|
1410
|
+
`)}\n`:``}var y2=new Map,b2=new Set(Array.from({length:9},(e,t)=>8192<<t)),x2=[[137,80,78,71],[255,216,255],[71,73,70,56],[82,73,70,70],[79,103,103,83],[73,68,51],[102,76,97,67],[77,84,104,100],[77,87,80,49],[80,75,3,4],[31,139],[70,79,82,77],[89,77,53,33],[89,77,54,33],[86,103,109,32],[80,83,73,68],[82,83,73,68],[78,69,83,77],[73,77,80,77],[69,120,116,101,110],[119,79,70],[0,1,0,0],[79,84,84,79]];function S2(e,t){let n=e.toLowerCase();if(!/^[0-9a-f]{64}$/.test(n))throw Error(`a ROM digest is 64 hexadecimal characters`);y2.set(n,t)}async function C2(e,t=`data`){let n=(e,n,r)=>({reason:e,...r?{label:r}:{},message:`"${t}" looks like an instrument ROM image (${n}). Packages carry no ROM: supply the patches as a .syx file instead.`}),r=y2.size?y2.get(await _0(e)):void 0;return r===void 0?t.toLowerCase().endsWith(`.rom`)?n(`extension`,`it has a .rom extension`):b2.has(e.length)&&!w2(e)&&!T2(e)?n(`size`,`${e.length} bytes with no recognised format`):null:n(`digest`,`it matches the registered ROM "${r}"`,r)}function w2(e){return e[0]===240&&e[e.length-1]===247||x2.some(t=>t.every((t,n)=>e[n]===t))}function T2(e){let t=e.subarray(0,512),n=0;for(let e of t)(e>=32&&e<127||e===9||e===10||e===13)&&n++;return n>=t.length*.95}async function E2(e,t={}){let n;try{n=await i2(e,t.limits)}catch(e){if(!(e instanceof o0))throw e;return{ok:!1,errors:[e.message],warnings:[],capabilities:[]}}let{document:r}=n,i=[],a=[],o=new Map;for(let e of n.files){o.set(e.path,await _0(e.data));let t=await C2(e.data,e.path);t&&i.push(t.message)}D2(r,o,i),O2(r,i);for(let e of n.files)e.path!==n.main&&!e.path.endsWith(`.mwl`)&&!r.assets.some(t=>t.path===e.path)&&a.push(`"${e.path}" is in the package but no asset declares it`);let s=s2(r);s.includes(`script`)&&!r.meta.requires.capabilities.includes(`script`)&&i.push(`a script carries code but the package does not declare requires.capabilities: ["script"]`);let{mwg:c}=r.meta.requires;return c!==void 0&&!l2(`0.44.2`,c,`requires.mwg`,i)&&i.push(`requires mwg ${c}, this is mwg ${f}`),t.policy&&i.push(...c2(r,t.policy).map(e=>`refused by policy: ${e}`)),{ok:i.length===0,errors:i,warnings:a,ref:a2(n),capabilities:s}}function D2(e,t,n){for(let r of e.assets){let e=t.get(r.path);e===void 0?n.push(`asset "${r.id}": "${r.path}" is not in the package`):r.sha256!==void 0&&r.sha256!==e&&n.push(`asset "${r.id}": sha256 does not match "${r.path}"`),N0.includes(r.kind)&&(r.license||n.push(`asset "${r.id}": a ${r.kind} needs a license`),r.source||n.push(`asset "${r.id}": a ${r.kind} needs a source`))}}function O2(e,t){let n=e=>new Set(e.map(e=>e.id)),r=n(e.assets),i=n(e.soundEffects),a=n(e.animations),o=n(e.music),s=n(e.scripts),c=(e,n,...r)=>{n===void 0||n.includes(`:`)||r.some(e=>e.has(n))||t.push(`${e}: "${n}" is not defined in the package`)};for(let t of e.characters){let e=`character "${t.id}"`;c(`${e} portrait`,t.portrait,r),c(`${e} sprite`,t.sprite?.image,r),c(`${e} theme`,t.theme,o,r);for(let[n,r]of Object.entries(t.animations))c(`${e} animation ${n}`,r,a);for(let[n,r]of Object.entries(t.sounds))c(`${e} sound ${n}`,r,i);for(let n of t.scripts)c(`${e} script`,n,s)}for(let t of e.animations)for(let[e,n]of Object.entries(t.events))c(`animation "${t.id}" frame ${e}`,n.sound,i);for(let t of e.music)c(`music "${t.id}" src`,t.src,r),c(`music "${t.id}" fallback`,t.fallback,r);for(let t of e.scripts)for(let e of t.do)e.tag===`play`&&typeof e.attributes.sound==`string`&&c(`script "${t.id}" play`,e.attributes.sound,i,r)}var k2=l({DEFAULT_PACKAGE_LIMITS:()=>d0,KNOWN_PACKAGE_CAPABILITIES:()=>I0,MWL_DEFAULT_CARRYOVER_PERCENTAGE:()=>80,MWL_SCHEMA_01:()=>`0.1`,MWL_SCHEMA_10:()=>`1.0`,MwlRuntime:()=>y$,MwlSyntaxError:()=>lQ,PACKAGE_ASSET_KINDS:()=>M0,PACKAGE_MEDIA_KINDS:()=>N0,PACKAGE_SCRIPT_ACTIONS:()=>F0,PACKAGE_TAGS:()=>P0,PackageConflictError:()=>r2,PackageError:()=>o0,PackageFormatError:()=>s0,PackageIntegrityError:()=>c0,PackageLimitError:()=>l0,PackagePathError:()=>u0,attributeTypeDescription:()=>Q$,campaignChain:()=>v1,carryoverIntoScenario:()=>d$,checkConditionSyntax:()=>qQ,checkPackagePath:()=>g0,checkPackagePolicy:()=>c2,coerceTableValue:()=>Y$,collectHookReferences:()=>m1,compareVersions:()=>n2,compile:()=>e1,compileAndEmitSources:()=>u1,compileNodes:()=>n1,compilePackages:()=>_2,compileSources:()=>t1,composeEffects:()=>I1,contentCatalog:()=>w1,contentReport:()=>q1,createExpressionScriptHost:()=>a0,createWorld:()=>m$,decodePackage:()=>y0,decodeSave:()=>IQ,decodeSaveEnvelope:()=>LQ,detectRomImage:()=>C2,effectToModifier:()=>L1,emitArtifacts:()=>l1,emitHooksDeclaration:()=>_1,emitModule:()=>c1,emitTableTypes:()=>A1,encodePackage:()=>v0,encodeSave:()=>FQ,endLevelCarryover:()=>u$,evaluateCondition:()=>HQ,evaluateExpression:()=>ZQ,execute:()=>b$,extractCatalog:()=>s1,generateCredits:()=>v2,hookTypes:()=>f1,inventoryItem:()=>F1,isGettext:()=>AQ,isMwlId:()=>X$,itemDefinition:()=>P1,loadContent:()=>K1,loadPackage:()=>i2,mergePackage:()=>u2,nodesToObjects:()=>O1,packageContent:()=>f2,packageRef:()=>a2,parse:()=>_Q,parseExpression:()=>XQ,parseHookReference:()=>p1,parseMapFile:()=>H$,parsePackageDocument:()=>K0,parsePackageRef:()=>o2,parseTableColumns:()=>W$,parseTerrain:()=>g$,parseValue:()=>kQ,preprocess:()=>dQ,readAttributes:()=>J1,readChildren:()=>Y1,readTableIndex:()=>Z1,readTableMap:()=>X1,registerRomDigest:()=>S2,requestedCapabilities:()=>s2,satisfiesVersionRange:()=>t2,schema01:()=>G$,schema10:()=>K$,sha256Hex:()=>_0,sideVisionGroups:()=>S$,tableKey:()=>Q1,typedRows:()=>k1,validAttributeValue:()=>Z$,validate:()=>q$,validateCatalog:()=>R1,validateCatalogNodes:()=>G1,validateHookAttributes:()=>h1,validateHookReferences:()=>g1,validateWorld:()=>RQ,verifyPackage:()=>E2}),A2=class{constructor(e,t={}){if(this.latestDecision=null,this.decide=e,this.every=t.every??1,!Number.isInteger(this.every)||this.every<1||this.every>1e6)throw RangeError(`a suggestion budget must be a frame count in 1..1000000`);this.since=this.every-1}update(e){return this.since++,this.since<this.every?null:(this.since=0,this.latestDecision=this.decide(e),this.latestDecision)}get latest(){return this.latestDecision}clear(){this.latestDecision=null}};function j2(e,t){return e.filter(e=>(t.side===void 0||e.side===t.side)&&(t.type===void 0||e.type===t.type)&&(t.role===void 0||e.role===t.role)&&(t.can_recruit===void 0||(e.can_recruit??!1)===t.can_recruit)&&(t.name===void 0||e.name===t.name))}function M2(e,t,n,r){let i=0,a=0,o=1;for(let s of t)s.id!==e.id&&r(s.x,s.y)&&(o++,s.side===e.side?i+=n(s.id):a+=n(s.id));return{own:n(e.id),allies:i,enemies:a,seen:o}}function N2(e,t,n,r){let i=0,a=0,o=0;for(let s of t)r(s.x,s.y)&&(o++,s.side===e?i+=n(s.id):a+=n(s.id));return{own:0,allies:i,enemies:a,seen:o}}function P2(e,t){return e.own*t.own+e.allies*t.allies+e.enemies*t.enemies}var F2=class e{constructor(e={}){this.values={};for(let[t,n]of Object.entries(e))n!==void 0&&(this.values[t]=n)}has(e){return this.values[e]!==void 0}get(e){return this.values[e]}set(e,t){this.values[e]=t}number(e,t=0){let n=this.values[e];return typeof n==`number`&&Number.isFinite(n)?n:typeof n==`boolean`?+!!n:t}flag(e,t=!1){let n=this.values[e];return typeof n==`boolean`?n:t}list(e){let t=this.values[e];return Array.isArray(t)?t:typeof t==`string`?[t]:[]}names(){return Object.keys(this.values)}with(t){let n=new e(this.values);for(let[e,r]of Object.entries(t))r!==void 0&&n.set(e,r);return n}toJSON(){return{...this.values}}static fromJSON(t){return new e(t)}},I2=class{constructor(e=[],t={}){this.levels=new Map,this.base=new F2(t);for(let t of e){if(this.levels.has(t.id))throw Error(`duplicate difficulty level: ${t.id}`);this.levels.set(t.id,t)}}get ids(){return[...this.levels.keys()]}get(e){return this.levels.get(e)}aspectsFor(e){let t=this.levels.get(e);if(!t)throw Error(`unknown difficulty level: ${e}`);return this.base.with(t.aspects??{})}},L2=class{constructor(){this.byUnit=new Map}set(e){this.byUnit.set(e.unit,{...e})}clear(e){this.byUnit.delete(e)}get(e){return this.byUnit.get(e)}all(){return[...this.byUnit.values()]}get isEmpty(){return this.byUnit.size===0}},R2=class{constructor(e,t=null){this.order=e,this.fallback=t}get length(){return this.order.length}at(e){if(this.order.length===0)return this.fallback;let t=(e%this.order.length+this.order.length)%this.order.length;return this.order[t]}next(e){if(this.order.length===0)return this.fallback;if(e===null)return this.order[0];let t=this.order.indexOf(e);return this.at(t<0?0:t+1)}},z2=class{constructor(e){this.stages=e.stages}decide(e,t){if(e.length===0)return null;for(let n of this.stages){if(n.when&&!n.when(t))continue;let r=n.weigh??B2,i=null;for(let a of e){let e=r(a,t);(!i||e>i.score)&&(i={candidate:a,stage:n.id,score:e})}return i}return null}};function B2(e,t){let n=0;for(let[r,i]of Object.entries(e.factors??{}))r!==`distance`&&(n+=i*t.aspects.number(r,1));let r=e.factors?.distance;return r!==void 0&&(n+=V2(r,t.aspects.number(`keep_away`,0))),n}function V2(e,t){return!(t>0)||e>=t?0:-(t-e)}function H2(e){return e?Math.max(0,e.priority??1):0}var U2=l({AIBudgetExceededError:()=>J2,AICancelledError:()=>q2,Aspects:()=>F2,Difficulty:()=>I2,Goals:()=>L2,HeuristicAI:()=>z2,JavaScriptAI:()=>K2,NeuralPolicy:()=>GZ,RecruitmentPattern:()=>R2,Suggester:()=>A2,alphaBetaSearch:()=>oG,defaultWeigh:()=>B2,firstWins:()=>cG,goalScore:()=>H2,keepAwayScore:()=>V2,personalScoreView:()=>M2,rootSplits:()=>sG,scoreWith:()=>P2,sideScoreView:()=>N2,subjectsWhere:()=>j2}),W2=1e4,G2=16,K2=class{constructor(e={}){this.agents=new Map,this.states=new Map,this.options=e,$2(e.maxSteps??W2,`maxSteps`),e4(e.maxMilliseconds??G2,`maxMilliseconds`)}register(e){if(!/^[A-Za-z_][A-Za-z0-9_.-]*$/.test(e.id))throw Error(`invalid AI agent id: ${e.id}`);if(this.agents.has(e.id))throw Error(`AI agent already registered: ${e.id}`);if(!e.behaviors.length)throw Error(`AI agent has no behaviours: ${e.id}`);let t=new Set;for(let n of e.behaviors){if(!n.id||t.has(n.id))throw Error(`duplicate AI behaviour: ${n.id}`);t.add(n.id)}this.agents.set(e.id,e),this.states.set(e.id,{})}decide(e,t){let n=this.agents.get(e);if(!n)throw Error(`unknown AI agent: ${e}`);let r=X2(t.state??this.states.get(e)??{}),i=t.maxSteps??this.options.maxSteps??W2,a=t.maxMilliseconds??this.options.maxMilliseconds??G2;$2(i,`maxSteps`),e4(a,`maxMilliseconds`);let o=0,s=t4(),c=[],l=Q2(t.seed??this.options.seed??7173991),u=()=>{if(o++,t.signal?.aborted)throw new q2;if(o>i||t4()-s>a)throw new J2},d={perception:Z2(t.perception),state:r,random:()=>(u(),l()),checkpoint:u,emit(e,t){if(!e)throw Error(`AI event name must not be empty`);u(),c.push(t===void 0?{name:e}:{name:e,payload:Z2(t)})}},f=null,p,m=`idle`;try{for(let e of n.behaviors)if(u(),!e.when||e.when(d)){p=e.id,f=Y2(e.decide(d)),m=f?`action`:`idle`;break}}catch(e){if(e instanceof q2)m=`cancelled`;else if(e instanceof J2)m=`budget-exceeded`;else throw e}let h={agent:e,action:f,state:X2(r),behavior:p,status:m,steps:o,events:c};return this.states.set(e,X2(r)),this.options.onDecision?.(h),h}search(e,t,n){return oG(e,t,n)}exportState(){return{version:1,agents:Object.fromEntries([...this.states].map(([e,t])=>[e,X2(t)]))}}importState(e){if(e.version!==1)throw Error(`unsupported AI state version: ${e.version}`);for(let[t,n]of Object.entries(e.agents)){if(!this.agents.has(t))throw Error(`AI state names unknown agent: ${t}`);this.states.set(t,X2(n))}}dispose(){this.agents.clear(),this.states.clear()}},q2=class extends Error{constructor(){super(`AI decision cancelled`),this.name=`AICancelledError`}},J2=class extends Error{constructor(){super(`AI decision budget exceeded`),this.name=`AIBudgetExceededError`}};function Y2(e){if(e===null)return null;if(!e||typeof e!=`object`||Array.isArray(e)||typeof e.type!=`string`||!e.type)throw Error(`AI action must be an object with a non-empty string type`);return Z2(e)}function X2(e){return Z2(e)}function Z2(e){return typeof e!=`object`||!e?e:Array.isArray(e)?e.map(Z2):Object.fromEntries(Object.entries(e).map(([e,t])=>[e,Z2(t)]))}function Q2(e){if(!Number.isInteger(e))throw TypeError(`AI seed must be an integer`);let t=e>>>0;return()=>(t=Math.imul(t,1664525)+1013904223>>>0,t/4294967296)}function $2(e,t){if(!Number.isInteger(e)||e<1)throw RangeError(`${t} must be a positive integer`)}function e4(e,t){if(!Number.isFinite(e)||e<0)throw RangeError(`${t} must be a non-negative number`)}function t4(){return typeof performance>`u`?Date.now():performance.now()}return _e(),Pa(),$o(),xs(),Object.defineProperty(e,"AI",{enumerable:!0,get:function(){return U2}}),e.Achievements=En,e.ActionJournal=wn,e.ActorAnimator=CF,Object.defineProperty(e,"Actors",{enumerable:!0,get:function(){return yU}}),e.AnimatedSprite=iN,e.Animation=nN,e.ArticulatedChain=ON,Object.defineProperty(e,"Audio",{enumerable:!0,get:function(){return VZ}}),e.BLOB_SHAPES=UF,e.Bar=nB,Object.defineProperty(e,"Battle",{enumerable:!0,get:function(){return FW}}),e.Beam=lF,e.Beams=uF,e.BitmapLabel=yL,e.Blob=wr,Object.defineProperty(e,"Board",{enumerable:!0,get:function(){return Rq}}),e.Button=gz,e.CIRCLE8=lr,e.COLOR_BLINDNESS_MATRICES=gP,e.Camera=uP,e.CanonicalState=Gt,e.ChainRig=kN,e.Checkbox=Az,e.ClothSprite=AF,e.Collection=cn,e.ColorTransformBatcher=pM,e.Container2D=J,e.DataTable=Iz,e.DeformableSprite=dN,e.DialogueStage=kB,e.Dropdown=Pz,e.DropdownView=Fz,e.EMPTY=QP,e.Easing=Er,e.EntityRegistry=Nr,e.FLOATING_TEXT_STACK_GAP=sB,e.FeedbackClient=Un,e.FixedStepper=Tr,e.Flights=cF,e.FloatingText=oB,e.FloatingTextStack=dB,e.FogLayer=hF,e.Game=rM,e.Generator=j,e.Gradient=sI,e.Grid=Hz,e.HALO_ANIMATION=gF,e.Halo=_F,e.HazeLayer=RF,e.HelpScreen=hB,e.HookRegistry=S,e.HttpTransport=Yt,Object.defineProperty(e,"I18n",{enumerable:!0,get:function(){return RR}}),e.IconGrid=ML,Object.defineProperty(e,"Input",{enumerable:!0,get:function(){return ve}}),e.JavaRandom=St,e.Label=OI,e.LastRun=vn,e.LayeredSprite=aF,e.LightningArc=dF,e.LiquidLayer=pF,e.ListView=jL,e.LoadQueue=Mr,e.LoadingScreen=_B,e.LockstepClient=Qt,e.Logger=b,e.MarkupText=pL,e.MarqueeLabel=DB,e.MersenneTwister=he,e.MessageBox=mz,e.MessageLog=MI,e.Meter=$z,e.Minimap=bP,Object.defineProperty(e,"Mwl",{enumerable:!0,get:function(){return k2}}),e.NEIGHBOURS4=sr,e.NEIGHBOURS8=cr,e.NO_COLOR_ADD=CM,e.NeonGlow=HF,e.NewsClient=an,e.NewsSeenTracker=sn,e.NinePatch=xL,e.Node2D=tI,e.OnScreenKeyboard=xz,e.ParticleEmitter=xF,e.PinnedDeform=uN,e.Player=un,e.PlayerInput=vt,e.PlayerStats=nn,e.PresentationQueue=Pr,e.Projectile=oF,e.QualityScaler=jj,e.RENDERING_DECISIONS=lI,e.RPGM_AUTOTILE_SLOT_BASES=AP,e.RPGM_AUTOTILE_SLOT_COUNTS=jP,e.RPGM_FLOOR_AUTOTILE_TABLE=NP,e.RPGM_WALL_AUTOTILE_TABLE=PP,e.RadioGroup=jz,Object.defineProperty(e,"Random",{enumerable:!0,get:function(){return C}}),e.RandomStreams=ge,e.ReactionTable=Dn,e.RebindScreen=Zz,e.Recorder=ln,e.Rectangle2D=G,e.Registry=g,Object.defineProperty(e,"Resources",{enumerable:!0,get:function(){return sP}}),e.RichLabel=JI,Object.defineProperty(e,"Roguelike",{enumerable:!0,get:function(){return xH}}),Object.defineProperty(e,"Rpg",{enumerable:!0,get:function(){return _W}}),e.RpgmAutotileAtlas=kP,e.RunHistory=tn,e.SaveSyncClient=Xt,e.SaveSystem=zt,e.Scene=m,e.Scene2D=iM,e.SceneComponentHost=v,e.SceneStack=h,e.ScreenEffects=SF,e.ScreenReader=CL,e.ScrollBox=kL,e.ScrollDrag=OL,e.ScrollText=EB,e.Session=On,e.Settings=Nn,e.SettingsScreen=Qz,e.Shape2D=rI,e.Signal=p,Object.defineProperty(e,"Simulation",{enumerable:!0,get:function(){return sQ}}),e.SkeletalSprite=DN,Object.defineProperty(e,"Skeleton",{enumerable:!0,get:function(){return fN}}),e.Skins=Yz,e.Slider=kz,e.Spawner=Wn,e.Spinner=Nz,e.SpringSprite=jF,e.Sprite2D=aI,e.SpriteAttachment=fF,e.SpriteGroup=sN,e.SpriteMotion=DF,e.SpriteSheet=lP,e.StageScript=AB,e.StateRegistry=Kt,e.StatsScreen=gB,e.StatusVisuals=wF,e.StoredValue=Bt,e.StoryScreen=IB,e.StorySequence=FB,e.SyncGuard=zr,e.TabbedList=NL,e.TelemetryClient=rn,e.TerrainGraphicsLayer=cI,e.Text2D=iI,e.TextModel=hz,e.TextPrompt=Cz,e.Texture2D=q,e.TileMap=iF,e.TiledSprite=oI,e.TintedSprite=wM,e.Toast=fB,e.Tooltip=pB,e.TooltipHost=mB,e.TransitionRunner=Qj,e.TreeView=zz,e.Tweener=Dr,e.UPPERCASE_KEYBOARD=vz,e.UndoHistory=Or,e.VerticalLabel=Ez,e.Viewport=mP,e.Window=TL,e.WindowStack=EL,Object.defineProperty(e,"World",{enumerable:!0,get:function(){return DU}}),e.XP_AUTOTILE_PATTERNS=FP,e.XP_NEIGHBORS_TO_PATTERN=IP,e.advanceReveal=TI,e.anchorAlign=Bz,e.applyAllImageModifiers=GM,e.applyImageModifiers=WM,e.applyTextureModifiers=XM,e.assertAutotileLayout=BP,e.autotileCellParts=KP,e.autotileFrames=JF,e.bitmapLabelStyle=bL,e.blendMatrix=RM,e.blendPixels=$M,e.blobIndex=qF,e.cellFromKey=or,e.cellIndex=nr,e.cellInside=tr,e.cellKey=ar,e.cellX=rr,e.cellY=ir,e.channelScaleMatrix=LM,e.channelSwapMatrix=zM,e.chebyshev=dr,e.checkNoControlCharacters=kt,e.checkSize=Ot,e.clamp=kn,e.cloneData=Wt,e.colorShiftMatrix=IM,e.completeReveal=EI,e.contrastRatio=xB,e.createCamera=pP,e.createColorBlindnessFilter=_P,e.createHandles=_,e.createLayers=nI,e.croppedTexture=KM,e.defaultSettings=An,e.defaultStorage=Rt,e.defaultTheme=vI,e.deserializeReplay=fn,e.detectWebGpu=dI,e.dissolve=Xj,e.distance=pr,e.downloadReplayFile=xn,e.effectiveMusicVolume=jn,e.effectiveSfxVolume=Mn,e.ellipsize=CB,e.escapeHtml=oL,e.euclidean=ur,e.exportReplayFile=gn,e.extractDialogueCatalog=PB,e.fitWindowZoom=NI,e.floatingTextAgeAtLeast=aB,e.floatingTextAlpha=rB,e.floatingTextRise=iB,e.floatingTextStackLifePenalty=cB,e.floatingTextStackLift=lB,e.floatingTextStackMoves=uB,e.flowLayout=qz,e.glowFalloff=BF,e.grow=qj,e.hazeField=IF,e.hexDistance=Yn,e.hexLine=Zn,e.hexNeighbors=Jn,e.hexRange=Qn,e.hexRotate=XF,e.hexToPixel=$n,e.highContrastTheme=yI,e.imageModifier=PM,e.importReplayFile=_n,e.importTwee=MB,e.inspectGraphicsCapabilities=uI,e.iris=Yj,e.isOnScreen=oN,e.layoutMarkupLines=rL,e.layoutVertical=Tz,e.linesToDrop=jI,e.loadSvgSkeleton=_I,e.loadTiledMap=gI,e.manhattan=fr,e.markupAccessibilityText=nL,e.markupToHtml=tL,e.marqueeOffset=TB,e.maskPixels=QM,e.matchTerrainRule=QF,e.meetsContrast=SB,e.messageBoxPresenter=vB,e.minimapCellCenter=yP,e.motionDuration=Cr,e.newlyRevealed=vP,e.openAnimationFrame=Zj,e.packColorAdd=bM,e.packTintAdd=xM,e.paintFogPixels=mF,e.paintGlowPixels=VF,e.paintHazePixels=LF,e.paletteRangeMapping=kM,e.parseCSV=Br,e.parseColorPairs=JM,e.parseDialogueLines=Wr,e.parseDialogueText=NB,e.parseImagePath=NM,e.parseInbound=Pt,e.parseMarkdown=GI,e.parseMarkup=$I,e.parsePaletteLists=YM,e.parseReplayEvents=pn,e.parseRotateMode=FM,e.parseTwee=Gr,e.pickReplayFile=Cn,e.pixelToHex=er,e.pop=Kj,e.popScale=Rj,e.positionMarkupLines=aL,e.prefersReducedMotion=yr,e.readReplayFile=Sn,e.recolorTexture=MM,e.rectOf=cP,e.reducedMotion=br,e.registerColorTransform=yM,e.relativeLuminance=bB,e.remapPixels=AM,e.resolveAnchor=Vz,e.resolveEasing=zj,e.resolveTerrainGraphics=$F,e.resumeRunPlayer=bn,e.revealComplete=DI,e.rotatePixels=eN,e.rpgmAutotileFrame=OP,e.rpgmAutotileSlot=MP,e.rpgmTableEdgeCells=ZP,e.runCheckpoint=yn,e.sanitizeInboundText=At,e.scramble=Ct,e.screenReader=wL,e.scrollOffset=DL,e.serializeReplay=dn,e.setReducedMotion=xr,e.setTheme=xI,e.sharpenText=FI,e.shrink=Wj,e.sliceSpans=qI,e.slide=Jj,e.sliderFraction=Dz,e.sliderValueAt=Oz,e.snapZoom=fP,e.spinValue=Mz,e.splitScreenHalves=hP,e.spriteColorMatrix=BM,e.squareRotate=YF,e.startReveal=wI,e.stateChecksum=Rr,e.stripMarkdown=KI,e.stripMarkup=eL,e.takeLastEntries=AI,e.theme=Q,e.themeChanged=$,e.tileDelays=Ij,e.tileFrame=tF,e.tileFrameIndex=rF,e.tileFrameSheet=nF,e.tileProgress=Lj,e.tileShrink=Uj,e.transitionDisposition=Pj,e.truncateLines=wB,e.uncloneablePath=Vt,e.unscramble=wt,e.validateSchema=Nt,e.version=f,e.watchReducedMotion=Sr,e.weightedFlood=kr,e.withTextureCanvas=jM,e.xpAutotilePattern=RP,e.xpAutotileRef=LP,e})({});
|