ecspresso 0.13.0 → 0.13.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/index.js +2 -2
  2. package/dist/index.js.map +1 -1
  3. package/dist/plugins/ai/detection.d.ts +118 -0
  4. package/dist/plugins/ai/detection.js +4 -0
  5. package/dist/plugins/ai/detection.js.map +10 -0
  6. package/dist/plugins/{audio.js → audio/audio.js} +1 -1
  7. package/dist/plugins/{audio.js.map → audio/audio.js.map} +2 -2
  8. package/dist/plugins/combat/health.d.ts +98 -0
  9. package/dist/plugins/combat/health.js +4 -0
  10. package/dist/plugins/combat/health.js.map +10 -0
  11. package/dist/plugins/combat/projectile.d.ts +115 -0
  12. package/dist/plugins/combat/projectile.js +4 -0
  13. package/dist/plugins/combat/projectile.js.map +10 -0
  14. package/dist/plugins/{diagnostics.js → debug/diagnostics.js} +1 -1
  15. package/dist/plugins/{diagnostics.js.map → debug/diagnostics.js.map} +2 -2
  16. package/dist/plugins/{input.js → input/input.js} +1 -1
  17. package/dist/plugins/{input.js.map → input/input.js.map} +2 -2
  18. package/dist/plugins/input/selection.d.ts +114 -0
  19. package/dist/plugins/input/selection.js +4 -0
  20. package/dist/plugins/input/selection.js.map +11 -0
  21. package/dist/plugins/isometric/depth-sort.d.ts +44 -0
  22. package/dist/plugins/isometric/depth-sort.js +4 -0
  23. package/dist/plugins/isometric/depth-sort.js.map +10 -0
  24. package/dist/plugins/isometric/projection.d.ts +102 -0
  25. package/dist/plugins/isometric/projection.js +4 -0
  26. package/dist/plugins/isometric/projection.js.map +10 -0
  27. package/dist/plugins/{collision.d.ts → physics/collision.d.ts} +1 -1
  28. package/dist/plugins/{collision.js → physics/collision.js} +1 -1
  29. package/dist/plugins/{collision.js.map → physics/collision.js.map} +3 -3
  30. package/dist/plugins/{physics2D.d.ts → physics/physics2D.d.ts} +1 -1
  31. package/dist/plugins/{physics2D.js → physics/physics2D.js} +1 -1
  32. package/dist/plugins/{physics2D.js.map → physics/physics2D.js.map} +3 -3
  33. package/dist/plugins/physics/steering.d.ts +102 -0
  34. package/dist/plugins/physics/steering.js +4 -0
  35. package/dist/plugins/physics/steering.js.map +10 -0
  36. package/dist/plugins/{particles.d.ts → rendering/particles.d.ts} +2 -2
  37. package/dist/plugins/{particles.js → rendering/particles.js} +1 -1
  38. package/dist/plugins/rendering/particles.js.map +10 -0
  39. package/dist/plugins/{renderers → rendering}/renderer2D.d.ts +9 -5
  40. package/dist/plugins/rendering/renderer2D.js +4 -0
  41. package/dist/plugins/rendering/renderer2D.js.map +10 -0
  42. package/dist/plugins/{sprite-animation.js → rendering/sprite-animation.js} +1 -1
  43. package/dist/plugins/{sprite-animation.js.map → rendering/sprite-animation.js.map} +2 -2
  44. package/dist/plugins/{coroutine.js → scripting/coroutine.js} +1 -1
  45. package/dist/plugins/{coroutine.js.map → scripting/coroutine.js.map} +2 -2
  46. package/dist/plugins/{state-machine.js → scripting/state-machine.js} +1 -1
  47. package/dist/plugins/{state-machine.js.map → scripting/state-machine.js.map} +2 -2
  48. package/dist/plugins/{timers.js → scripting/timers.js} +1 -1
  49. package/dist/plugins/{timers.js.map → scripting/timers.js.map} +2 -2
  50. package/dist/plugins/{tween.d.ts → scripting/tween.d.ts} +1 -1
  51. package/dist/plugins/{tween.js → scripting/tween.js} +1 -1
  52. package/dist/plugins/scripting/tween.js.map +11 -0
  53. package/dist/plugins/{bounds.js → spatial/bounds.js} +1 -1
  54. package/dist/plugins/{bounds.js.map → spatial/bounds.js.map} +2 -2
  55. package/dist/plugins/{camera.d.ts → spatial/camera.d.ts} +52 -12
  56. package/dist/plugins/spatial/camera.js +4 -0
  57. package/dist/plugins/spatial/camera.js.map +10 -0
  58. package/dist/plugins/{spatial-index.d.ts → spatial/spatial-index.d.ts} +2 -2
  59. package/dist/plugins/{spatial-index.js → spatial/spatial-index.js} +1 -1
  60. package/dist/plugins/{spatial-index.js.map → spatial/spatial-index.js.map} +3 -3
  61. package/dist/plugins/{transform.d.ts → spatial/transform.d.ts} +1 -1
  62. package/dist/plugins/{transform.js → spatial/transform.js} +1 -1
  63. package/dist/plugins/spatial/transform.js.map +10 -0
  64. package/package.json +78 -50
  65. package/dist/plugins/camera.js +0 -4
  66. package/dist/plugins/camera.js.map +0 -10
  67. package/dist/plugins/particles.js.map +0 -10
  68. package/dist/plugins/renderers/renderer2D.js +0 -4
  69. package/dist/plugins/renderers/renderer2D.js.map +0 -10
  70. package/dist/plugins/transform.js.map +0 -10
  71. package/dist/plugins/tween.js.map +0 -11
  72. /package/dist/plugins/{audio.d.ts → audio/audio.d.ts} +0 -0
  73. /package/dist/plugins/{diagnostics.d.ts → debug/diagnostics.d.ts} +0 -0
  74. /package/dist/plugins/{input.d.ts → input/input.d.ts} +0 -0
  75. /package/dist/plugins/{sprite-animation.d.ts → rendering/sprite-animation.d.ts} +0 -0
  76. /package/dist/plugins/{coroutine.d.ts → scripting/coroutine.d.ts} +0 -0
  77. /package/dist/plugins/{state-machine.d.ts → scripting/state-machine.d.ts} +0 -0
  78. /package/dist/plugins/{timers.d.ts → scripting/timers.d.ts} +0 -0
  79. /package/dist/plugins/{bounds.d.ts → spatial/bounds.d.ts} +0 -0
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- var s=((j)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(j,{get:($,G)=>(typeof require<"u"?require:$)[G]}):j)(function(j){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+j+'" is not supported')});class M{parentMap=new Map;childrenMap=new Map;setParent(j,$){if(j===$)throw Error(`Cannot set entity ${j} as its own parent`);if(this.wouldCreateCycle(j,$))throw Error("Cannot set parent: would create circular reference");let G=this.parentMap.get(j);if(G!==void 0){let X=this.childrenMap.get(G);if(X){let Y=X.indexOf(j);if(Y!==-1)X.splice(Y,1)}}this.parentMap.set(j,$);let J=this.childrenMap.get($);if(J)J.push(j);else this.childrenMap.set($,[j]);return this}removeParent(j){let $=this.parentMap.get(j);if($===void 0)return!1;let G=this.childrenMap.get($);if(G){let J=G.indexOf(j);if(J!==-1)G.splice(J,1)}return this.parentMap.delete(j),!0}getParent(j){return this.parentMap.get(j)??null}getChildren(j){let $=this.childrenMap.get(j);return $?[...$]:[]}getChildAt(j,$){if($<0)return null;let G=this.childrenMap.get(j);if(!G||$>=G.length)return null;return G[$]??null}getChildIndex(j,$){let G=this.childrenMap.get(j);if(!G)return-1;return G.indexOf($)}removeEntity(j){let $=this.parentMap.get(j)??null;if($!==null){let X=this.childrenMap.get($);if(X){let Y=X.indexOf(j);if(Y!==-1)X.splice(Y,1)}}this.parentMap.delete(j);let G=this.childrenMap.get(j)??[],J=[...G];for(let X of G)this.parentMap.delete(X);return this.childrenMap.delete(j),{oldParent:$,orphanedChildren:J}}getAncestors(j){let $=[],G=this.parentMap.get(j);while(G!==void 0)$.push(G),G=this.parentMap.get(G);return $}getDescendants(j){let $=[],G=this.childrenMap.get(j);if(!G)return $;let J=G.slice().reverse();while(J.length>0){let X=J.pop();$.push(X);let Y=this.childrenMap.get(X);if(Y)for(let Z=Y.length-1;Z>=0;Z--)J.push(Y[Z])}return $}getRoot(j){let $=j,G=this.parentMap.get($);while(G!==void 0)$=G,G=this.parentMap.get($);return $}getSiblings(j){let $=this.parentMap.get(j);if($===void 0)return[];let G=this.childrenMap.get($);if(!G)return[];return G.filter((J)=>J!==j)}isDescendantOf(j,$){if(j===$)return!1;let G=this.parentMap.get(j);while(G!==void 0){if(G===$)return!0;G=this.parentMap.get(G)}return!1}isAncestorOf(j,$){return this.isDescendantOf($,j)}getRootEntities(){let j=[];for(let $ of this.childrenMap.keys())if(!this.parentMap.has($))j.push($);return j}wouldCreateCycle(j,$){let G=$;while(G!==void 0){if(G===j)return!0;G=this.parentMap.get(G)}return!1}forEachInHierarchy(j,$){let G=$?.roots??this.getRootEntities(),J=[];for(let X of G)J.push({entityId:X,parentId:null,depth:0});for(let X of J){j(X.entityId,X.parentId,X.depth);let Y=this.childrenMap.get(X.entityId);if(Y)for(let Z of Y)J.push({entityId:Z,parentId:X.entityId,depth:X.depth+1})}}*hierarchyIterator(j){let $=j?.roots??this.getRootEntities(),G=[];for(let J of $)G.push({entityId:J,parentId:null,depth:0});for(let J of G){yield J;let X=this.childrenMap.get(J.entityId);if(X)for(let Y of X)G.push({entityId:Y,parentId:J.entityId,depth:J.depth+1})}}}class T{callbacks=[];_iterDepth=0;_pendingRemovals=[];add(j){this.callbacks.push(j)}remove(j){if(this._iterDepth>0){this._pendingRemovals.push(j);return}let $=this.callbacks.indexOf(j);if($!==-1)this.callbacks.splice($,1)}invoke(j){this._iterDepth++;let $=this.callbacks.length;for(let G=0;G<$;G++){let J=this.callbacks[G];if(J)J(j)}if(this._iterDepth--,this._iterDepth===0&&this._pendingRemovals.length>0){for(let G of this._pendingRemovals){let J=this.callbacks.indexOf(G);if(J!==-1)this.callbacks.splice(J,1)}this._pendingRemovals.length=0}}}class H{nextId=1;entities=new Map;componentIndices=new Map;addedCallbacks=new Map;removedCallbacks=new Map;hierarchyManager=new M;disposeCallbacks=new Map;changeSeqs=new Map;_changeSeq=0;_afterComponentAddedHooks=[];_afterEntityMutatedHooks=[];_afterComponentRemovedHooks=[];_beforeEntityRemovedHooks=[];_afterParentChangedHooks=[];_batchingDepth=0;_batchedEntityIds=new Set;_pendingBatchKeys=null;get entityCount(){return this.entities.size}createEntity(){let j=this.nextId++,$={id:j,components:{}};return this.entities.set(j,$),$}registerDispose(j,$){this.disposeCallbacks.set(j,$)}getDisposeCallbacks(){return this.disposeCallbacks}invokeDispose(j,$,G){let J=this.disposeCallbacks.get(j);if(!J)return;try{J({value:$,entityId:G})}catch(X){console.warn(`Component dispose callback for '${String(j)}' threw:`,X)}}addComponent(j,$,G){let J=this.entities.get(j);if(!J)throw Error(`Cannot add component '${String($)}': Entity with ID ${j} does not exist`);let X=J.components[$];if(X!==void 0)this.invokeDispose($,X,J.id);if(J.components[$]=G,!this.componentIndices.has($))this.componentIndices.set($,new Set);this.componentIndices.get($)?.add(J.id);let Y=this.addedCallbacks.get($);if(Y)Y.invoke({value:G,entity:J});this._batchingDepth++;for(let Z of this._afterComponentAddedHooks)Z(J.id,$);if(this._batchedEntityIds.add(J.id),this._batchingDepth--,this._batchingDepth===0){for(let Z of this._batchedEntityIds)for(let F of this._afterEntityMutatedHooks)F(Z);this._batchedEntityIds.clear()}return this}addComponents(j,$){let G=this.entities.get(j);if(!G)throw Error(`Cannot add components: Entity with ID ${j} does not exist`);let J=this._pendingBatchKeys;this._pendingBatchKeys=new Set(Object.keys($)),this._batchingDepth++;for(let X in $)this.addComponent(G.id,X,$[X]);if(this._batchingDepth--,this._pendingBatchKeys=J,this._batchingDepth===0){for(let X of this._batchedEntityIds)for(let Y of this._afterEntityMutatedHooks)Y(X);this._batchedEntityIds.clear()}return this}removeComponent(j,$){let G=this.entities.get(j);if(!G)throw Error(`Cannot remove component '${String($)}': Entity with ID ${j} does not exist`);let J=G.components[$];if(J!==void 0)this.invokeDispose($,J,G.id);delete G.components[$];let X=this.removedCallbacks.get($);if(X&&J!==void 0)X.invoke({value:J,entity:G});if(this.componentIndices.get($)?.delete(G.id),J!==void 0)for(let Y of this._afterComponentRemovedHooks)Y(G.id,$);return this}getComponent(j,$){let G=this.entities.get(j);if(!G)throw Error(`Cannot get component '${String($)}': Entity with ID ${j} does not exist`);return G.components[$]}getEntitiesWithQuery(j=[],$=[],G,J,X){return this.getEntitiesWithQueryInto([],j,$,G,J,X)}getEntitiesWithQueryInto(j,$=[],G=[],J,X,Y){j.length=0;let Z=J!==void 0&&J.length>0&&X!==void 0,F=Y!==void 0&&Y.length>0;if($.length===0){if(G.length===0&&!Z&&!F){for(let D of this.entities.values())j.push(D);return j}for(let D of this.entities.values()){if(G.length>0&&!G.every((L)=>!(L in D.components)))continue;if(Z){let L=this.changeSeqs.get(D.id);if(!L)continue;if(!J.some((B)=>(L.get(B)??-1)>X))continue}if(F&&!this.parentHasComponents(D.id,Y))continue;j.push(D)}return j}let A=$[0];if(A===void 0)return j;let O=$.reduce((D,L)=>{let B=this.componentIndices.get(L)?.size??0,Q=this.componentIndices.get(D)?.size??1/0;return B<Q?L:D},A),W=this.componentIndices.get(O);if(!W||W.size===0)return j;let _=G.length>0;for(let D of W){let L=this.entities.get(D);if(L&&$.every((B)=>(B in L.components))&&(!_||G.every((B)=>!(B in L.components)))){if(Z){let B=this.changeSeqs.get(D);if(!B||!J.some((Q)=>(B.get(Q)??-1)>X))continue}if(F&&!this.parentHasComponents(D,Y))continue;j.push(L)}}return j}parentHasComponents(j,$){let G=this.hierarchyManager.getParent(j);if(G===null)return!1;let J=this.entities.get(G);if(!J)return!1;for(let X of $)if(!(X in J.components))return!1;return!0}removeEntity(j,$){let G=this.entities.get(j);if(!G)return!1;if($?.cascade??!0){let X=this.hierarchyManager.getDescendants(G.id);for(let Y=X.length-1;Y>=0;Y--){let Z=X[Y];if(Z===void 0)continue;for(let F of this._beforeEntityRemovedHooks)F(Z)}for(let Y of this._beforeEntityRemovedHooks)Y(G.id);for(let Y=X.length-1;Y>=0;Y--){let Z=X[Y];if(Z===void 0)continue;this.removeEntityInternal(Z)}}else for(let X of this._beforeEntityRemovedHooks)X(G.id);return this.removeEntityInternal(G.id)}removeEntityInternal(j){let $=this.entities.get(j);if(!$)return!1;this.hierarchyManager.removeEntity(j);for(let G of Object.keys($.components)){let J=$.components[G];if(J!==void 0){this.invokeDispose(G,J,$.id);let X=this.removedCallbacks.get(G);if(X)X.invoke({value:J,entity:$})}this.componentIndices.get(G)?.delete($.id)}return this.changeSeqs.delete($.id),this.entities.delete($.id)}getEntity(j){return this.entities.get(j)}onComponentAdded(j,$){let G=$,J=this.addedCallbacks.get(j);if(!J)J=new T,this.addedCallbacks.set(j,J);return J.add(G),()=>{this.addedCallbacks.get(j)?.remove(G)}}onComponentRemoved(j,$){let G=$,J=this.removedCallbacks.get(j);if(!J)J=new T,this.removedCallbacks.set(j,J);return J.add(G),()=>{this.removedCallbacks.get(j)?.remove(G)}}onAfterComponentAdded(j){return this._afterComponentAddedHooks.push(j),()=>{let $=this._afterComponentAddedHooks.indexOf(j);if($!==-1)this._afterComponentAddedHooks.splice($,1)}}onAfterEntityMutated(j){return this._afterEntityMutatedHooks.push(j),()=>{let $=this._afterEntityMutatedHooks.indexOf(j);if($!==-1)this._afterEntityMutatedHooks.splice($,1)}}onAfterComponentRemoved(j){return this._afterComponentRemovedHooks.push(j),()=>{let $=this._afterComponentRemovedHooks.indexOf(j);if($!==-1)this._afterComponentRemovedHooks.splice($,1)}}onBeforeEntityRemoved(j){return this._beforeEntityRemovedHooks.push(j),()=>{let $=this._beforeEntityRemovedHooks.indexOf(j);if($!==-1)this._beforeEntityRemovedHooks.splice($,1)}}onAfterParentChanged(j){return this._afterParentChangedHooks.push(j),()=>{let $=this._afterParentChangedHooks.indexOf(j);if($!==-1)this._afterParentChangedHooks.splice($,1)}}get changeSeq(){return this._changeSeq}markChanged(j,$){let G=++this._changeSeq,J=this.changeSeqs.get(j);if(!J)J=new Map,this.changeSeqs.set(j,J);J.set($,G)}getChangeSeq(j,$){return this.changeSeqs.get(j)?.get($)??-1}spawnChild(j,$){let G=this.createEntity();return this.addComponents(G.id,$),this.setParent(G.id,j),G}setParent(j,$){this.hierarchyManager.setParent(j,$);for(let G of this._afterParentChangedHooks)G(j);return this}removeParent(j){let $=this.hierarchyManager.removeParent(j);if($)for(let G of this._afterParentChangedHooks)G(j);return $}getParent(j){return this.hierarchyManager.getParent(j)}getChildren(j){return this.hierarchyManager.getChildren(j)}getChildAt(j,$){return this.hierarchyManager.getChildAt(j,$)}getChildIndex(j,$){return this.hierarchyManager.getChildIndex(j,$)}getAncestors(j){return this.hierarchyManager.getAncestors(j)}getDescendants(j){return this.hierarchyManager.getDescendants(j)}getRoot(j){return this.hierarchyManager.getRoot(j)}getSiblings(j){return this.hierarchyManager.getSiblings(j)}isDescendantOf(j,$){return this.hierarchyManager.isDescendantOf(j,$)}isAncestorOf(j,$){return this.hierarchyManager.isAncestorOf(j,$)}getRootEntities(){return this.hierarchyManager.getRootEntities()}forEachInHierarchy(j,$){this.hierarchyManager.forEachInHierarchy(j,$)}hierarchyIterator(j){return this.hierarchyManager.hierarchyIterator(j)}}class V{handlers=new Map;subscribe(j,$){return this.addHandler(j,$,!1)}once(j,$){return this.addHandler(j,$,!0)}unsubscribe(j,$){let G=this.handlers.get(j);if(!G)return!1;let J=G.findIndex((X)=>X.callback===$);if(J===-1)return!1;return G.splice(J,1),!0}addHandler(j,$,G){let J=this.handlers.get(j);if(!J)J=[],this.handlers.set(j,J);let X={callback:$,once:G};return J.push(X),()=>{let Y=this.handlers.get(j);if(Y){let Z=Y.indexOf(X);if(Z!==-1)Y.splice(Z,1)}}}publish(...[j,$]){let G=this.handlers.get(j);if(!G||G.length===0)return;let J=!1,X=G.length;for(let Y=0;Y<X&&Y<G.length;Y++){let Z=G[Y];if(!Z)continue;if(Z.callback($),Z.once)J=!0}if(J){for(let Y=G.length-1;Y>=0;Y--)if(G[Y]?.once)G.splice(Y,1)}}clear(){this.handlers.clear()}clearEvent(j){this.handlers.delete(j)}}var x=Symbol("resource-direct");function p(j){return{[x]:j}}function u(j){return typeof j==="object"&&j!==null&&"factory"in j&&typeof j.factory==="function"}function m(j){return typeof j==="object"&&j!==null&&x in j}function f(j,$){let G=[],J=new Set,X=new Set;function Y(Z,F=[]){if(J.has(Z))return;if(X.has(Z))throw Error(`Circular resource dependency: ${[...F,Z].join(" -> ")}`);X.add(Z);for(let A of $(Z)){let O=j.find((W)=>W===A);if(O)Y(O,[...F,Z])}X.delete(Z),J.add(Z),G.push(Z)}for(let Z of j)Y(Z);return G}class E{resources=new Map;resourceFactories=new Map;resourceDependencies=new Map;resourceDisposers=new Map;initializedResourceKeys=new Set;_changeSubscribers=new Map;add(j,$){let G=(J)=>{this.resources.set(j,J),this.initializedResourceKeys.add(j),this.resourceDependencies.set(j,[])};if(u($)){if(this.resourceFactories.set(j,$.factory),this.resourceDependencies.set(j,$.dependsOn??[]),$.onDispose)this.resourceDisposers.set(j,$.onDispose)}else if(m($))G($[x]);else if(typeof $==="function")this.resourceFactories.set(j,$),this.resourceDependencies.set(j,[]);else G($);return this}tryGet(j,...$){if(!this.has(j))return;return this.get(j,...$)}get(j,...$){let G=this.resources.get(j);if(G!==void 0)return G;let J=this.resourceFactories.get(j);if(J===void 0)throw Error(`Resource ${String(j)} not found`);let X=$[0],Y=J(X);if(!(Y instanceof Promise))this.resources.set(j,Y),this.initializedResourceKeys.add(j);return Y}has(j){return this.resources.has(j)||this.resourceFactories.has(j)}remove(j){let $=this.resources.delete(j),G=this.resourceFactories.delete(j);return this.resourceDependencies.delete(j),this.resourceDisposers.delete(j),this.initializedResourceKeys.delete(j),$||G}getKeys(){let j=new Set([...this.resources.keys(),...this.resourceFactories.keys()]);return Array.from(j)}needsInitialization(j){return this.resourceFactories.has(j)&&!this.initializedResourceKeys.has(j)}getPendingInitializationKeys(){return Array.from(this.resourceFactories.keys()).filter((j)=>!this.initializedResourceKeys.has(j))}async initializeResource(j,...$){if(!this.resourceFactories.has(j)||this.initializedResourceKeys.has(j))return;let G=this.resourceFactories.get(j);if(!G)return;let J=$[0],X=await G(J);this.resources.set(j,X),this.initializedResourceKeys.add(j),this.resourceFactories.delete(j)}async initializeResources(...j){let $=j.slice(1),G=$.length===0?this.getPendingInitializationKeys():$;if(G.length===0)return;let J=f(G,(X)=>[...this.resourceDependencies.get(X)??[]]);for(let X of J)await this.initializeResource(X,...j.slice(0,1))}getDependencies(j){return this.resourceDependencies.get(j)??[]}async disposeResource(j,...$){if(!this.resources.has(j)&&!this.resourceFactories.has(j))return!1;if(this.initializedResourceKeys.has(j)){let G=this.resourceDisposers.get(j),J=this.resources.get(j);if(G&&J!==void 0){let X=$[0];await G(J,X)}}return this.resources.delete(j),this.resourceFactories.delete(j),this.resourceDependencies.delete(j),this.resourceDisposers.delete(j),this.initializedResourceKeys.delete(j),this._changeSubscribers.delete(j),!0}onResourceChange(j,$){let G=this._changeSubscribers.get(j),J=G??new Set;if(!G)this._changeSubscribers.set(j,J);let X=$;return J.add(X),()=>{if(J.delete(X),J.size===0)this._changeSubscribers.delete(j)}}notifyChange(j,$,G){if(Object.is($,G))return;let J=this._changeSubscribers.get(j);if(!J||J.size===0)return;let X=[...J];for(let Y of X)Y($,G)}async disposeResources(...j){let $=Array.from(this.initializedResourceKeys);if($.length===0)return;let G=f($,(J)=>[...this.resourceDependencies.get(J)??[]]).reverse();for(let J of G)await this.disposeResource(J,...j)}}class R{queries=new Map;entityManager;_hasParentHasQueries=!1;constructor(j){this.entityManager=j}get hasParentHasQueries(){return this._hasParentHasQueries}addQuery(j,$){let G={definition:$,matchingEntities:new Set};if(this.queries.set(j,G),$.parentHas?.length)this._hasParentHasQueries=!0;let J=this.entityManager.getEntitiesWithQuery($.with,$.without??[]);for(let X of J)if(this.entityMatchesQuery(X,G.definition))G.matchingEntities.add(X.id),G.definition.onEnter?.(X)}removeQuery(j){let $=this.queries.delete(j);if($)this._recalcParentHasFlag();return $}entityMatchesQuery(j,$){for(let G of $.with)if(!(G in j.components))return!1;if($.without){for(let G of $.without)if(G in j.components)return!1}if($.parentHas?.length){let G=this.entityManager.getParent(j.id);if(G===null)return!1;let J=this.entityManager.getEntity(G);if(!J)return!1;for(let X of $.parentHas)if(!(X in J.components))return!1}return!0}_applyQueryTransition(j,$){let G=$.matchingEntities.has(j.id),J=this.entityMatchesQuery(j,$.definition);if(!G&&J)$.matchingEntities.add(j.id),$.definition.onEnter?.(j);else if(G&&!J)$.matchingEntities.delete(j.id),$.definition.onExit?.(j.id)}onComponentAdded(j,$){for(let[,G]of this.queries)this._applyQueryTransition(j,G);if(this._hasParentHasQueries)this._recheckChildren(j.id)}onComponentRemoved(j,$){for(let[,G]of this.queries)this._applyQueryTransition(j,G);if(this._hasParentHasQueries)this._recheckChildren(j.id)}onEntityRemoved(j){for(let[$,G]of this.queries)if(G.matchingEntities.has(j))G.matchingEntities.delete(j),G.definition.onExit?.(j)}recheckEntity(j){for(let[,$]of this.queries)this._applyQueryTransition(j,$)}recheckEntityAndChildren(j){if(this.recheckEntity(j),this._hasParentHasQueries)this._recheckChildren(j.id)}_recheckChildren(j){let $=this.entityManager.getChildren(j);for(let G of $){let J=this.entityManager.getEntity(G);if(J)this.recheckEntity(J)}}_recalcParentHasFlag(){this._hasParentHasQueries=!1;for(let[,j]of this.queries)if(j.definition.parentHas?.length){this._hasParentHasQueries=!0;return}}}class w{commands=[];removeEntity(j,$){this.commands.push((G)=>{G.removeEntity(j,$)})}addComponent(j,$,G){this.commands.push((J)=>{J.addComponent(j,$,G)})}removeComponent(j,$){this.commands.push((G)=>{G.removeComponent(j,$)})}spawn(j){this.commands.push(($)=>{$.spawn(j)})}spawnChild(j,$){this.commands.push((G)=>{G.spawnChild(j,$)})}addComponents(j,$){this.commands.push((G)=>{G.addComponents(j,$)})}setParent(j,$){this.commands.push((G)=>{G.setParent(j,$)})}mutateComponent(j,$,G){this.commands.push((J)=>{J.mutateComponent(j,$,G)})}markChanged(j,$){this.commands.push((G)=>{G.markChanged(j,$)})}removeParent(j){this.commands.push(($)=>{$.removeParent(j)})}playback(j){for(let $ of this.commands)try{$(j)}catch(G){console.warn("CommandBuffer: Command failed during playback:",G)}this.commands.length=0}clear(){this.commands.length=0}get length(){return this.commands.length}}class b{_id;constructor(j){this._id=j}withComponentTypes(){return this}withEventTypes(){return this}withResourceTypes(){return this}withAssetTypes(){return this}withScreenTypes(){return this}withLabels(){return this}withGroups(){return this}withAssetGroupNames(){return this}withReactiveQueryNames(){return this}requires(){return this}install(j){return{id:this._id,install:j}}}function P(j){return new b(j)}class S{_label;queries={};processFunction;detachFunction;initializeFunction;eventHandlers;_priority=0;_phase="update";_groups=[];_inScreens;_excludeScreens;_requiredAssets;_runWhenEmpty=!1;_entityEnterHandlers={};_resourceKeys;constructor(j){this._label=j}get label(){return this._label}_createSystemObject(){let j={label:this._label,entityQueries:this.queries,priority:this._priority,phase:this._phase};if(this.processFunction)j.process=this.processFunction;if(this.detachFunction)j.onDetach=this.detachFunction;if(this.initializeFunction)j.onInitialize=this.initializeFunction;if(this.eventHandlers)j.eventHandlers=this.eventHandlers;if(this._groups.length>0)j.groups=[...this._groups];if(this._inScreens)j.inScreens=this._inScreens;if(this._excludeScreens)j.excludeScreens=this._excludeScreens;if(this._requiredAssets)j.requiredAssets=this._requiredAssets;if(this._runWhenEmpty)j.runWhenEmpty=!0;if(Object.keys(this._entityEnterHandlers).length>0)j.onEntityEnter={...this._entityEnterHandlers};return j}setPriority(j){return this._priority=j,this}inPhase(j){return this._phase=j,this}inGroup(j){if(!this._groups.includes(j))this._groups.push(j);return this}inScreens(j){return this._inScreens=[...j],this}excludeScreens(j){return this._excludeScreens=[...j],this}requiresAssets(j){return this._requiredAssets=[...j],this}runWhenEmpty(){return this._runWhenEmpty=!0,this}withResources(j){return this._resourceKeys=[...j],this}addQuery(j,$){let G=this;return G.queries={...this.queries,[j]:$},G}setProcess(j){if(this._resourceKeys?.length){let $=this._resourceKeys,G;this.processFunction=(J)=>{if(!G){G={};for(let X of $)G[X]=J.ecs.getResource(X)}J.resources=G,j(J)}}else this.processFunction=j;return this}setOnEntityEnter(j,$){return this._entityEnterHandlers[j]=$,this}setOnDetach(j){return this.detachFunction=j,this}setOnInitialize(j){return this.initializeFunction=j,this}setEventHandlers(j){return this.eventHandlers=j,this}}function N(j,$,G){let J=new Set,X=[$];while(X.length>0){let Y=X.pop();if(Y===void 0)break;if(Y===j)throw Error(`Circular required component dependency: '${String(j)}' -> '${String($)}' -> ... -> '${String(j)}'`);if(J.has(Y))continue;J.add(Y);let Z=G(Y);if(Z)for(let F of Z)X.push(F.component)}}var g="0.13.0";class U{assets=new Map;groups=new Map;eventBus=null;setEventBus(j){this.eventBus=j}register(j,$){if(this.assets.set(j,{definition:$,status:"pending"}),$.group){let G=this.groups.get($.group)??new Set;G.add(j),this.groups.set($.group,G)}}async loadEagerAssets(){let j=[];for(let[$,G]of this.assets)if(G.definition.eager&&G.status==="pending")j.push($);await Promise.all(j.map(($)=>this.loadAsset($)))}async loadAsset(j){let $=this.assets.get(j);if(!$)throw Error(`Asset '${String(j)}' not found`);if($.status==="loaded"&&$.value!==void 0)return $.value;if($.status==="loading"&&$.loadPromise)return $.loadPromise;if($.status==="failed")$.status="pending";$.status="loading",$.loadPromise=$.definition.loader();try{let G=await $.loadPromise;return $.value=G,$.status="loaded",$.loadPromise=void 0,this.eventBus?.publish("assetLoaded",{key:j}),this.checkGroupProgress($.definition.group),G}catch(G){let J=G instanceof Error?G:Error(String(G));throw $.status="failed",$.error=J,$.loadPromise=void 0,this.eventBus?.publish("assetFailed",{key:j,error:J}),J}}async loadAssetGroup(j){let $=this.groups.get(j);if(!$||$.size===0)throw Error(`Asset group '${j}' not found or empty`);await Promise.all(Array.from($).map((G)=>this.loadAsset(G)))}get(j){let $=this.assets.get(j);if(!$)throw Error(`Asset '${String(j)}' not found`);if($.status!=="loaded"||$.value===void 0)throw Error(`Asset '${String(j)}' is not loaded (status: ${$.status})`);return $.value}tryGet(j){let $=this.assets.get(j);if(!$||$.status!=="loaded")return;return $.value}getHandle(j){let $=this.assets.get(j);if(!$)throw Error(`Asset '${String(j)}' not found`);let G=this;return{get status(){return $.status},get isLoaded(){return $.status==="loaded"},get(){return G.get(j)},tryGet(){return G.tryGet(j)}}}getStatus(j){let $=this.assets.get(j);if(!$)throw Error(`Asset '${String(j)}' not found`);return $.status}isLoaded(j){return this.assets.get(j)?.status==="loaded"}isGroupLoaded(j){let $=this.groups.get(j);if(!$||$.size===0)return!1;for(let G of $){let J=this.assets.get(G);if(!J||J.status!=="loaded")return!1}return!0}getGroupProgress(j){return this.getGroupProgressDetails(j).progress}getGroupProgressDetails(j){let $=this.groups.get(j);if(!$||$.size===0)return{loaded:0,total:0,progress:0};let G=0;for(let X of $)if(this.assets.get(X)?.status==="loaded")G++;let J=$.size;return{loaded:G,total:J,progress:G/J}}checkGroupProgress(j){if(!j||!this.eventBus)return;let $=j,G=this.getGroupProgressDetails($);if(this.eventBus.publish("assetGroupProgress",{group:$,...G}),G.loaded===G.total)this.eventBus.publish("assetGroupLoaded",{group:$})}createResource(){let j=this;return{getStatus($){return j.getStatus($)},isLoaded($){return j.isLoaded($)},isGroupLoaded($){return j.isGroupLoaded($)},getGroupProgress($){return j.getGroupProgress($)},get($){return j.get($)},tryGet($){return j.tryGet($)},getHandle($){return j.getHandle($)}}}getKeys(){return Array.from(this.assets.keys())}getGroupNames(){return Array.from(this.groups.keys())}getGroupKeys(j){let $=this.groups.get(j);return $?Array.from($):[]}}class k{manager;constructor(j){this.manager=j}add(j,$){return this.manager.register(j,{loader:$,eager:!0}),this}addWithConfig(j,$){return this.manager.register(j,$),this}addGroup(j,$){for(let[G,J]of Object.entries($))this.manager.register(G,{loader:J,eager:!1,group:j});return this}getManager(){return this.manager}}function C(j){return new k(j??new U)}class K{screens=new Map;currentScreen=null;screenStack=[];eventBus=null;assetManager=null;ecs=null;setDependencies(j,$,G){this.eventBus=j,this.assetManager=$,this.ecs=G}requireEcs(){if(!this.ecs)throw Error("ScreenManager: dependencies not set. Call setDependencies() first.");return this.ecs}register(j,$){this.screens.set(j,{definition:$})}async setScreen(j,$){let G=this.screens.get(j);if(!G)throw Error(`Screen '${String(j)}' not found`);await this.verifyRequiredAssets(G.definition.requiredAssets,G.definition.requiredAssetGroups);while(this.screenStack.length>0){let X=this.screenStack.pop();if(X)await this.exitScreen(X.name)}if(this.currentScreen)await this.exitScreen(this.currentScreen.name);let J=G.definition.initialState($);this.currentScreen={name:j,config:$,state:J},await G.definition.onEnter?.({config:$,ecs:this.requireEcs()}),this.eventBus?.publish("screenEnter",{screen:j,config:$})}async pushScreen(j,$){let G=this.screens.get(j);if(!G)throw Error(`Screen '${String(j)}' not found`);if(await this.verifyRequiredAssets(G.definition.requiredAssets,G.definition.requiredAssetGroups),this.currentScreen)this.screenStack.push(this.currentScreen);let J=G.definition.initialState($);this.currentScreen={name:j,config:$,state:J},await G.definition.onEnter?.({config:$,ecs:this.requireEcs()}),this.eventBus?.publish("screenPush",{screen:j,config:$})}async popScreen(){if(this.screenStack.length===0)throw Error("Cannot pop screen: stack is empty");if(this.currentScreen)await this.exitScreen(this.currentScreen.name),this.eventBus?.publish("screenPop",{screen:this.currentScreen.name});this.currentScreen=this.screenStack.pop()??null}async exitScreen(j){let $=this.screens.get(j);if($?.definition.onExit)await $.definition.onExit(this.requireEcs());this.eventBus?.publish("screenExit",{screen:j})}async verifyRequiredAssets(j,$){if(!this.assetManager)return;if(j){for(let G of j)if(!this.assetManager.isLoaded(G))await this.assetManager.loadAsset(G)}if($){for(let G of $)if(!this.assetManager.isGroupLoaded(G))await this.assetManager.loadAssetGroup(G)}}getCurrentScreen(){return this.currentScreen?.name??null}getConfig(j){if(!this.currentScreen)throw Error("No current screen");if(j!==void 0&&this.currentScreen.name!==j)throw Error(`Expected current screen '${String(j)}', but current is '${String(this.currentScreen.name)}'`);return this.currentScreen.config}tryGetConfig(j){if(!this.currentScreen)return;if(j!==void 0&&this.currentScreen.name!==j)return;return this.currentScreen.config}getState(j){if(!this.currentScreen)throw Error("No current screen");if(j!==void 0&&this.currentScreen.name!==j)throw Error(`Expected current screen '${String(j)}', but current is '${String(this.currentScreen.name)}'`);return this.currentScreen.state}tryGetState(j){if(!this.currentScreen)return;if(j!==void 0&&this.currentScreen.name!==j)return;return this.currentScreen.state}updateState(j,$){if(!this.currentScreen)throw Error("No current screen");if($!==void 0&&this.currentScreen.name!==$)throw Error(`Expected current screen '${String($)}', but current is '${String(this.currentScreen.name)}'`);let G=typeof j==="function"?j(this.currentScreen.state):j;this.currentScreen.state={...this.currentScreen.state,...G}}getStackDepth(){return this.screenStack.length}isOverlay(){return this.screenStack.length>0}isActive(j){if(this.currentScreen?.name===j)return!0;return this.screenStack.some(($)=>$.name===j)}isCurrent(j){return this.currentScreen?.name===j}createResource(){let j=this;return{get current(){return j.getCurrentScreen()},get config(){return j.tryGetConfig()??null},get state(){return j.tryGetState()??null},set state($){if(j.currentScreen&&$!==null)j.currentScreen.state=$},get stack(){return j.screenStack},get isOverlay(){return j.isOverlay()},get stackDepth(){return j.getStackDepth()},isActive($){return j.isActive($)},isCurrent($){return j.isCurrent($)}}}getScreenNames(){return Array.from(this.screens.keys())}hasScreen(j){return this.screens.has(j)}}class h{manager;constructor(j){this.manager=j}add(j,$){return this.manager.register(j,$),this}getManager(){return this.manager}}function q(j){return new h(j??new K)}class v{assetConfigurator=null;screenConfigurator=null;pendingResources=[];pendingDisposeCallbacks=[];pendingRequiredComponents=[];pendingPlugins=[];_fixedDt=null;constructor(){}withPlugin(j){return this.pendingPlugins.push(j),this}withComponentTypes(){return this}withEventTypes(){return this}withResourceTypes(){return this}withResource(j,$){return this.pendingResources.push({key:j,value:$}),this}withDispose(j,$){return this.pendingDisposeCallbacks.push({key:j,callback:$}),this}withRequired(j,$,G){return this.pendingRequiredComponents.push({trigger:j,required:$,factory:G}),this}withAssets(j){let $=C();return j($),this.assetConfigurator=$,this}withScreens(j){let $=q();return j($),this.screenConfigurator=$,this}withFixedTimestep(j){return this._fixedDt=j,this}withReactiveQueryNames(){return this}pluginFactory(){return(j)=>P(j.id).install(j.install)}build(){let j=new z;for(let $ of this.pendingPlugins)j.installPlugin($);for(let{key:$,value:G}of this.pendingResources)j.addResource($,G);for(let{key:$,callback:G}of this.pendingDisposeCallbacks)j.registerDispose($,G);for(let{trigger:$,required:G,factory:J}of this.pendingRequiredComponents)j.registerRequired($,G,J);if(this.assetConfigurator)j._setAssetManager(this.assetConfigurator.getManager());else if(j._hasPendingPluginAssets())j._setAssetManager(new U);if(this.screenConfigurator)j._setScreenManager(this.screenConfigurator.getManager());else if(j._hasPendingPluginScreens())j._setScreenManager(new K);if(this._fixedDt!==null)j._setFixedDt(this._fixedDt);return j}}var I=["preUpdate","fixedUpdate","update","postUpdate","render"];class z{static VERSION=g;_entityManager;_eventBus;_resourceManager;_commandBuffer;_systems=[];_phaseSystems={preUpdate:[],fixedUpdate:[],update:[],postUpdate:[],render:[]};_installedPlugins=new Set;_disabledGroups=new Set;_assetManager=null;_screenManager=null;_reactiveQueryManager;_postUpdateHooks=[];_currentTick=0;_systemLastSeqs=new Map;_changeThreshold=0;_fixedDt=0.016666666666666666;_fixedAccumulator=0;_interpolationAlpha=0;_maxFixedSteps=8;_requiredComponents=new Map;_pendingPluginAssets=[];_pendingPluginScreens=[];_diagnosticsEnabled=!1;_systemTimings=new Map;_phaseTimings={preUpdate:0,fixedUpdate:0,update:0,postUpdate:0,render:0};_entityEnterTracking=new Map;_entityEnterFrameSet=new Set;_systemContexts=new WeakMap;_pendingFinalizers=[];_batchingRegistrations=!1;constructor(){this._entityManager=new H,this._eventBus=new V,this._resourceManager=new E,this._reactiveQueryManager=new R(this._entityManager),this._commandBuffer=new w,this._subscribeLifecycleHooks()}_subscribeLifecycleHooks(){this._entityManager.onAfterComponentAdded((j,$)=>{this._entityManager.markChanged(j,$);let G=this._requiredComponents.get($);if(G){let J=this._entityManager.getEntity(j);if(J){let X=J.components[$];for(let{component:Y,factory:Z}of G){if(this._entityManager._pendingBatchKeys?.has(Y))continue;if(!(Y in J.components))this._entityManager.addComponent(j,Y,Z(X))}}}}),this._entityManager.onAfterEntityMutated((j)=>{let $=this._entityManager.getEntity(j);if($)this._reactiveQueryManager.recheckEntityAndChildren($)}),this._entityManager.onAfterComponentRemoved((j,$)=>{let G=this._entityManager.getEntity(j);if(G)this._reactiveQueryManager.onComponentRemoved(G,$)}),this._entityManager.onBeforeEntityRemoved((j)=>{this._reactiveQueryManager.onEntityRemoved(j)}),this._entityManager.onAfterParentChanged((j)=>{if(this._reactiveQueryManager.hasParentHasQueries){let $=this._entityManager.getEntity(j);if($)this._reactiveQueryManager.recheckEntity($)}})}static create(){return new v}addSystem(j){let $=new S(j);return this._pendingFinalizers.push(()=>{this._registerSystem($._createSystemObject())}),$}_finalizePendingBuilders(){if(this._pendingFinalizers.length===0)return;this._batchingRegistrations=!0;while(this._pendingFinalizers.length>0){let j=this._pendingFinalizers;this._pendingFinalizers=[];for(let $ of j)$()}this._batchingRegistrations=!1,this._rebuildPhaseSystems()}update(j){this._finalizePendingBuilders();let $=this._screenManager?.getCurrentScreen()??null,G=this._diagnosticsEnabled;this._runPhase("preUpdate",j,$,G);let J=G?performance.now():0;this._fixedAccumulator+=j;let X=0;while(this._fixedAccumulator>=this._fixedDt&&X<this._maxFixedSteps)this._executePhase(this._phaseSystems.fixedUpdate,this._fixedDt,$),this._commandBuffer.playback(this),this._fixedAccumulator-=this._fixedDt,X++;if(this._fixedAccumulator>=this._fixedDt)this._fixedAccumulator=0;if(G)this._phaseTimings.fixedUpdate=performance.now()-J;this._interpolationAlpha=this._fixedAccumulator/this._fixedDt,this._runPhase("update",j,$,G),this._runPhase("postUpdate",j,$,G);for(let Y of this._postUpdateHooks)Y({ecs:this,dt:j});this._runPhase("render",j,$,G),this._changeThreshold=this._entityManager.changeSeq,this._currentTick++}_executePhase(j,$,G){for(let J of j){if(!J.process&&!J.onEntityEnter)continue;if(J.groups?.length){let W=!1;for(let _ of J.groups)if(this._disabledGroups.has(_)){W=!0;break}if(W)continue}if(J.inScreens?.length){if(G===null||!J.inScreens.includes(G))continue}if(J.excludeScreens?.length){if(G!==null&&J.excludeScreens.includes(G))continue}if(J.requiredAssets?.length&&this._assetManager){let W=!0;for(let _ of J.requiredAssets)if(!this._assetManager.isLoaded(_)){W=!1;break}if(!W)continue}let X=this._systemLastSeqs.get(J)??0;this._changeThreshold=X;let Y=this._systemContexts.get(J);if(!Y)Y={queries:{},dt:0,ecs:this},this._systemContexts.set(J,Y);Y.dt=$;let Z=Y.queries,F=!1,A=!1;if(J.entityQueries)for(let W in J.entityQueries){A=!0;let _=J.entityQueries[W];if(_){let L=Z[W]??(Z[W]=[]);if(this._entityManager.getEntitiesWithQueryInto(L,_.with,_.without||[],_.changed,_.changed?this._changeThreshold:void 0,_.parentHas),L.length)F=!0}}let O=this._entityEnterTracking.get(J);if(O&&J.onEntityEnter)for(let W in J.onEntityEnter){let _=Z[W],D=O.get(W);if(!_||!D)continue;let L=J.onEntityEnter[W];if(!L)continue;let B=this._entityEnterFrameSet;B.clear();for(let Q of _)if(B.add(Q.id),!D.has(Q.id))D.add(Q.id),L({entity:Q,ecs:this});for(let Q of D)if(!B.has(Q))D.delete(Q)}if(J.process){if(this._diagnosticsEnabled){let W=performance.now();if(F||J.runWhenEmpty)J.process(Y);else if(!A)J.process(Y);this._systemTimings.set(J.label,performance.now()-W)}else if(F||J.runWhenEmpty)J.process(Y);else if(!A)J.process(Y)}this._systemLastSeqs.set(J,this._entityManager.changeSeq)}}_runPhase(j,$,G,J){if(J){let X=performance.now();this._executePhase(this._phaseSystems[j],$,G),this._phaseTimings[j]=performance.now()-X}else this._executePhase(this._phaseSystems[j],$,G);this._commandBuffer.playback(this)}async initialize(){if(this._finalizePendingBuilders(),await this.initializeResources(),this._assetManager)this._assetManager.setEventBus(this._eventBus),await this._assetManager.loadEagerAssets(),this._resourceManager.add("$assets",this._assetManager.createResource());if(this._screenManager)this._screenManager.setDependencies(this._eventBus,this._assetManager,this),this._resourceManager.add("$screen",this._screenManager.createResource());for(let j of this._systems)await j.onInitialize?.(this)}async initializeResources(...j){await this._resourceManager.initializeResources(this,...j)}_rebuildPhaseSystems(){for(let j of I)this._phaseSystems[j]=[];for(let j of this._systems){let $=j.phase??"update";this._phaseSystems[$].push(j)}for(let j of I)this._phaseSystems[j].sort(($,G)=>{let J=$.priority??0;return(G.priority??0)-J})}updateSystemPriority(j,$){this._finalizePendingBuilders();let G=this._systems.find((J)=>J.label===j);if(!G)return!1;return G.priority=$,this._rebuildPhaseSystems(),!0}updateSystemPhase(j,$){this._finalizePendingBuilders();let G=this._systems.find((J)=>J.label===j);if(!G)return!1;return G.phase=$,this._rebuildPhaseSystems(),!0}get interpolationAlpha(){return this._interpolationAlpha}get fixedDt(){return this._fixedDt}disableSystemGroup(j){this._disabledGroups.add(j)}enableSystemGroup(j){this._disabledGroups.delete(j)}isSystemGroupEnabled(j){return!this._disabledGroups.has(j)}getSystemsInGroup(j){return this._finalizePendingBuilders(),this._systems.filter(($)=>$.groups?.includes(j)).map(($)=>$.label)}removeSystem(j){this._finalizePendingBuilders();let $=this._systems.findIndex((J)=>J.label===j);if($===-1)return!1;let G=this._systems[$];if(!G)return!1;if(G.onDetach)G.onDetach(this);return this._systems.splice($,1),this._systemLastSeqs.delete(G),this._entityEnterTracking.delete(G),this._rebuildPhaseSystems(),!0}_registerSystem(j){if(this._systems.push(j),this._systemLastSeqs.set(j,this._changeThreshold),!this._batchingRegistrations)this._rebuildPhaseSystems();if(j.onEntityEnter){let $=new Map;for(let G in j.onEntityEnter)$.set(G,new Set);this._entityEnterTracking.set(j,$)}if(!j.eventHandlers)return;for(let $ in j.eventHandlers){let G=j.eventHandlers[$];if(G)this._eventBus.subscribe($,(J)=>{G({data:J,ecs:this})})}}hasResource(j){return this._resourceManager.has(j)}getResource(j){if(!this._resourceManager.has(j))throw Error(`Resource '${String(j)}' not found. Available resources: [${this.getResourceKeys().map(($)=>String($)).join(", ")}]`);return this._resourceManager.get(j,this)}tryGetResource(j){let $=j;if(!this._resourceManager.has($))return;return this._resourceManager.get($,this)}addResource(j,$){return this._resourceManager.add(j,$),this}removeResource(j){return this._resourceManager.remove(j)}async disposeResource(j){return this._resourceManager.disposeResource(j,this)}async disposeResources(){return this._resourceManager.disposeResources(this)}updateResource(j,$){let G=this.getResource(j),J=$(G);return this._resourceManager.add(j,J),this._resourceManager.notifyChange(j,J,G),this}setResource(j,$){let G=this.tryGetResource(j);if(this._resourceManager.add(j,$),G!==void 0)this._resourceManager.notifyChange(j,$,G);return this}onResourceChange(j,$){return this._resourceManager.onResourceChange(j,$)}getResourceKeys(){return this._resourceManager.getKeys()}resourceNeedsInitialization(j){return this._resourceManager.needsInitialization(j)}getEntity(j){return this._entityManager.getEntity(j)}getComponent(j,$){return this._entityManager.getComponent(j,$)}addComponent(j,$,G){this._entityManager.addComponent(j,$,G)}addComponents(j,$){this._entityManager.addComponents(j,$)}removeComponent(j,$){this._entityManager.removeComponent(j,$)}hasComponent(j,$){return this._entityManager.getComponent(j,$)!==void 0}spawn(j){let $=this._entityManager.createEntity();return this._entityManager.addComponents($.id,j),$}getEntitiesWithQuery(j,$=[],G,J){return this._entityManager.getEntitiesWithQuery(j,$,G,G?this._changeThreshold:void 0,J)}getSingleton(j,$=[]){let G=this._entityManager.getEntitiesWithQuery(j,$);if(G.length===0)throw Error(`getSingleton: no entity matches query with=[${String(j)}] without=[${String($)}]`);if(G.length>1)throw Error(`getSingleton: expected 1 entity but found ${G.length} matching query with=[${String(j)}] without=[${String($)}]`);let J=G[0];if(!J)throw Error("getSingleton: unexpected empty result");return J}tryGetSingleton(j,$=[]){let G=this._entityManager.getEntitiesWithQuery(j,$);if(G.length===0)return;if(G.length>1)throw Error(`tryGetSingleton: expected 0 or 1 entity but found ${G.length} matching query with=[${String(j)}] without=[${String($)}]`);return G[0]}removeEntity(j,$){return this._entityManager.removeEntity(j,$)}spawnChild(j,$){let G=this._entityManager.spawnChild(j,$);return this._emitHierarchyChanged(G.id,null,j),G}setParent(j,$){let G=this._entityManager.getParent(j);return this._entityManager.setParent(j,$),this._emitHierarchyChanged(j,G,$),this}removeParent(j){let $=this._entityManager.getParent(j),G=this._entityManager.removeParent(j);if(G)this._emitHierarchyChanged(j,$,null);return G}getParent(j){return this._entityManager.getParent(j)}getChildren(j){return this._entityManager.getChildren(j)}getChildAt(j,$){return this._entityManager.getChildAt(j,$)}getChildIndex(j,$){return this._entityManager.getChildIndex(j,$)}getAncestors(j){return this._entityManager.getAncestors(j)}getDescendants(j){return this._entityManager.getDescendants(j)}getRoot(j){return this._entityManager.getRoot(j)}getSiblings(j){return this._entityManager.getSiblings(j)}isDescendantOf(j,$){return this._entityManager.isDescendantOf(j,$)}isAncestorOf(j,$){return this._entityManager.isAncestorOf(j,$)}getRootEntities(){return this._entityManager.getRootEntities()}forEachInHierarchy(j,$){this._entityManager.forEachInHierarchy(j,$)}hierarchyIterator(j){return this._entityManager.hierarchyIterator(j)}_emitHierarchyChanged(j,$,G){this._eventBus.publish("hierarchyChanged",{entityId:j,oldParent:$,newParent:G})}get installedPlugins(){return Array.from(this._installedPlugins)}get entityManager(){return this._entityManager}get eventBus(){return this._finalizePendingBuilders(),this._eventBus}get commands(){return this._commandBuffer}get currentTick(){return this._currentTick}get changeThreshold(){return this._changeThreshold}enableDiagnostics(j){if(this._diagnosticsEnabled=j,!j)this._systemTimings.clear(),this._phaseTimings={preUpdate:0,fixedUpdate:0,update:0,postUpdate:0,render:0}}get diagnosticsEnabled(){return this._diagnosticsEnabled}get systemTimings(){return this._systemTimings}get phaseTimings(){return this._phaseTimings}get entityCount(){return this._entityManager.entityCount}mutateComponent(j,$,G){let J=this._entityManager.getComponent(j,$);if(J===void 0)throw Error(`Entity ${j} does not have component "${String($)}"`);return G(J),this._entityManager.markChanged(j,$),J}markChanged(j,$){this._entityManager.markChanged(j,$)}registerDispose(j,$){this._entityManager.registerDispose(j,$)}registerRequired(j,$,G){if(String(j)===String($))throw Error(`Cannot require a component to depend on itself: '${String(j)}'`);let J=this._requiredComponents.get(j)??[];if(J.some((X)=>X.component===$))throw Error(`Required component '${String($)}' already registered for trigger '${String(j)}'`);this._checkRequiredCycle(j,$),J.push({component:$,factory:G}),this._requiredComponents.set(j,J)}_checkRequiredCycle(j,$){N(j,$,(G)=>this._requiredComponents.get(G))}onComponentAdded(j,$){return this._entityManager.onComponentAdded(j,$)}onComponentRemoved(j,$){return this._entityManager.onComponentRemoved(j,$)}addReactiveQuery(j,$){this._reactiveQueryManager.addQuery(j,$)}removeReactiveQuery(j){return this._reactiveQueryManager.removeQuery(j)}on(j,$){return this._eventBus.subscribe(j,$)}off(j,$){return this._eventBus.unsubscribe(j,$)}onPostUpdate(j){return this._postUpdateHooks.push(j),()=>{let $=this._postUpdateHooks.indexOf(j);if($!==-1)this._postUpdateHooks.splice($,1)}}requireAssetManager(){if(!this._assetManager)throw Error("Asset manager not configured. Use withAssets() in builder.");return this._assetManager}getAsset(j){return this.requireAssetManager().get(j)}tryGetAsset(j){return this._assetManager?.tryGet(j)}getAssetHandle(j){return this.requireAssetManager().getHandle(j)}isAssetLoaded(j){return this._assetManager?.isLoaded(j)??!1}async loadAsset(j){return this.requireAssetManager().loadAsset(j)}async loadAssetGroup(j){return this.requireAssetManager().loadAssetGroup(j)}isAssetGroupLoaded(j){return this._assetManager?.isGroupLoaded(j)??!1}getAssetGroupProgress(j){return this._assetManager?.getGroupProgress(j)??0}requireScreenManager(){if(!this._screenManager)throw Error("Screen manager not configured. Use withScreens() in builder.");return this._screenManager}async setScreen(j,$){return this.requireScreenManager().setScreen(j,$)}async pushScreen(j,$){return this.requireScreenManager().pushScreen(j,$)}async popScreen(){return this.requireScreenManager().popScreen()}getCurrentScreen(){return this._screenManager?.getCurrentScreen()??null}getScreenConfig(j){return this.requireScreenManager().getConfig(j)}tryGetScreenConfig(j){return this._screenManager?.tryGetConfig(j)??void 0}getScreenState(j){return this.requireScreenManager().getState(j)}tryGetScreenState(j){return this._screenManager?.tryGetState(j)??void 0}updateScreenState(j,$){if(typeof j==="string")this.requireScreenManager().updateState($,j);else this.requireScreenManager().updateState(j)}isCurrentScreen(j){return this._screenManager?.isCurrent(j)??!1}isScreenActive(j){return this._screenManager?.isActive(j)??!1}getScreenStackDepth(){return this._screenManager?.getStackDepth()??0}_setAssetManager(j){this._assetManager=j;for(let[$,G]of this._pendingPluginAssets)this._assetManager.register($,G);this._pendingPluginAssets=[]}_setScreenManager(j){this._screenManager=j;for(let[$,G]of this._pendingPluginScreens)this._screenManager.register($,G);this._pendingPluginScreens=[]}_hasPendingPluginAssets(){return this._pendingPluginAssets.length>0}_hasPendingPluginScreens(){return this._pendingPluginScreens.length>0}_setFixedDt(j){this._fixedDt=j}_registerAsset(j,$){this._pendingPluginAssets.push([j,$])}_registerScreen(j,$){this._pendingPluginScreens.push([j,$])}installPlugin(j){if(this._installedPlugins.has(j.id))return this;return this._installedPlugins.add(j.id),j.install(this),this}pluginFactory(){return(j)=>P(j.id).install(j.install)}getHelpers(j){return j(this)}}function Vj(j){return j}function Rj(j,$){return{x:j,y:$}}function wj(){return{x:0,y:0}}function Sj(j,$){return{x:j.x+$.x,y:j.y+$.y}}function Tj(j,$){return{x:j.x-$.x,y:j.y-$.y}}function xj(j,$){return{x:j.x*$,y:j.y*$}}function Cj(j){return{x:-j.x,y:-j.y}}function qj(j,$){return j.x*$.x+j.y*$.y}function vj(j,$){return j.x*$.y-j.y*$.x}function fj(j){return j.x*j.x+j.y*j.y}function bj(j){return Math.sqrt(j.x*j.x+j.y*j.y)}function Nj(j){let $=Math.sqrt(j.x*j.x+j.y*j.y);if($===0)return{x:0,y:0};return{x:j.x/$,y:j.y/$}}function gj(j,$){let G=j.x-$.x,J=j.y-$.y;return G*G+J*J}function kj(j,$){let G=j.x-$.x,J=j.y-$.y;return Math.sqrt(G*G+J*J)}function hj(j,$,G=0.0000000001){return Math.abs(j.x-$.x)<=G&&Math.abs(j.y-$.y)<=G}var aj=z;export{wj as vec2Zero,Tj as vec2Sub,xj as vec2Scale,Nj as vec2Normalize,Cj as vec2Negate,fj as vec2LengthSq,bj as vec2Length,hj as vec2Equals,qj as vec2Dot,gj as vec2DistanceSq,kj as vec2Distance,vj as vec2Cross,Sj as vec2Add,Rj as vec2,p as directValue,P as definePlugin,aj as default,q as createScreenConfigurator,Vj as createQueryDefinition,C as createAssetConfigurator,S as SystemBuilder,K as ScreenManager,U as AssetManager};
1
+ var l=((j)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(j,{get:($,G)=>(typeof require<"u"?require:$)[G]}):j)(function(j){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+j+'" is not supported')});class M{parentMap=new Map;childrenMap=new Map;setParent(j,$){if(j===$)throw Error(`Cannot set entity ${j} as its own parent`);if(this.wouldCreateCycle(j,$))throw Error("Cannot set parent: would create circular reference");let G=this.parentMap.get(j);if(G!==void 0){let X=this.childrenMap.get(G);if(X){let Y=X.indexOf(j);if(Y!==-1)X.splice(Y,1)}}this.parentMap.set(j,$);let J=this.childrenMap.get($);if(J)J.push(j);else this.childrenMap.set($,[j]);return this}removeParent(j){let $=this.parentMap.get(j);if($===void 0)return!1;let G=this.childrenMap.get($);if(G){let J=G.indexOf(j);if(J!==-1)G.splice(J,1)}return this.parentMap.delete(j),!0}getParent(j){return this.parentMap.get(j)??null}getChildren(j){let $=this.childrenMap.get(j);return $?[...$]:[]}getChildAt(j,$){if($<0)return null;let G=this.childrenMap.get(j);if(!G||$>=G.length)return null;return G[$]??null}getChildIndex(j,$){let G=this.childrenMap.get(j);if(!G)return-1;return G.indexOf($)}removeEntity(j){let $=this.parentMap.get(j)??null;if($!==null){let X=this.childrenMap.get($);if(X){let Y=X.indexOf(j);if(Y!==-1)X.splice(Y,1)}}this.parentMap.delete(j);let G=this.childrenMap.get(j)??[],J=[...G];for(let X of G)this.parentMap.delete(X);return this.childrenMap.delete(j),{oldParent:$,orphanedChildren:J}}getAncestors(j){let $=[],G=this.parentMap.get(j);while(G!==void 0)$.push(G),G=this.parentMap.get(G);return $}getDescendants(j){let $=[],G=this.childrenMap.get(j);if(!G)return $;let J=G.slice().reverse();while(J.length>0){let X=J.pop();$.push(X);let Y=this.childrenMap.get(X);if(Y)for(let Z=Y.length-1;Z>=0;Z--)J.push(Y[Z])}return $}getRoot(j){let $=j,G=this.parentMap.get($);while(G!==void 0)$=G,G=this.parentMap.get($);return $}getSiblings(j){let $=this.parentMap.get(j);if($===void 0)return[];let G=this.childrenMap.get($);if(!G)return[];return G.filter((J)=>J!==j)}isDescendantOf(j,$){if(j===$)return!1;let G=this.parentMap.get(j);while(G!==void 0){if(G===$)return!0;G=this.parentMap.get(G)}return!1}isAncestorOf(j,$){return this.isDescendantOf($,j)}getRootEntities(){let j=[];for(let $ of this.childrenMap.keys())if(!this.parentMap.has($))j.push($);return j}wouldCreateCycle(j,$){let G=$;while(G!==void 0){if(G===j)return!0;G=this.parentMap.get(G)}return!1}forEachInHierarchy(j,$){let G=$?.roots??this.getRootEntities(),J=[];for(let X of G)J.push({entityId:X,parentId:null,depth:0});for(let X of J){j(X.entityId,X.parentId,X.depth);let Y=this.childrenMap.get(X.entityId);if(Y)for(let Z of Y)J.push({entityId:Z,parentId:X.entityId,depth:X.depth+1})}}*hierarchyIterator(j){let $=j?.roots??this.getRootEntities(),G=[];for(let J of $)G.push({entityId:J,parentId:null,depth:0});for(let J of G){yield J;let X=this.childrenMap.get(J.entityId);if(X)for(let Y of X)G.push({entityId:Y,parentId:J.entityId,depth:J.depth+1})}}}class T{callbacks=[];_iterDepth=0;_pendingRemovals=[];add(j){this.callbacks.push(j)}remove(j){if(this._iterDepth>0){this._pendingRemovals.push(j);return}let $=this.callbacks.indexOf(j);if($!==-1)this.callbacks.splice($,1)}invoke(j){this._iterDepth++;let $=this.callbacks.length;for(let G=0;G<$;G++){let J=this.callbacks[G];if(J)J(j)}if(this._iterDepth--,this._iterDepth===0&&this._pendingRemovals.length>0){for(let G of this._pendingRemovals){let J=this.callbacks.indexOf(G);if(J!==-1)this.callbacks.splice(J,1)}this._pendingRemovals.length=0}}}class H{nextId=1;entities=new Map;componentIndices=new Map;addedCallbacks=new Map;removedCallbacks=new Map;hierarchyManager=new M;disposeCallbacks=new Map;changeSeqs=new Map;_changeSeq=0;_afterComponentAddedHooks=[];_afterEntityMutatedHooks=[];_afterComponentRemovedHooks=[];_beforeEntityRemovedHooks=[];_afterParentChangedHooks=[];_batchingDepth=0;_batchedEntityIds=new Set;_pendingBatchKeys=null;get entityCount(){return this.entities.size}createEntity(){let j=this.nextId++,$={id:j,components:{}};return this.entities.set(j,$),$}registerDispose(j,$){this.disposeCallbacks.set(j,$)}getDisposeCallbacks(){return this.disposeCallbacks}invokeDispose(j,$,G){let J=this.disposeCallbacks.get(j);if(!J)return;try{J({value:$,entityId:G})}catch(X){console.warn(`Component dispose callback for '${String(j)}' threw:`,X)}}addComponent(j,$,G){let J=this.entities.get(j);if(!J)throw Error(`Cannot add component '${String($)}': Entity with ID ${j} does not exist`);let X=J.components[$];if(X!==void 0)this.invokeDispose($,X,J.id);if(J.components[$]=G,!this.componentIndices.has($))this.componentIndices.set($,new Set);this.componentIndices.get($)?.add(J.id);let Y=this.addedCallbacks.get($);if(Y)Y.invoke({value:G,entity:J});this._batchingDepth++;for(let Z of this._afterComponentAddedHooks)Z(J.id,$);if(this._batchedEntityIds.add(J.id),this._batchingDepth--,this._batchingDepth===0){for(let Z of this._batchedEntityIds)for(let F of this._afterEntityMutatedHooks)F(Z);this._batchedEntityIds.clear()}return this}addComponents(j,$){let G=this.entities.get(j);if(!G)throw Error(`Cannot add components: Entity with ID ${j} does not exist`);let J=this._pendingBatchKeys;this._pendingBatchKeys=new Set(Object.keys($)),this._batchingDepth++;for(let X in $)this.addComponent(G.id,X,$[X]);if(this._batchingDepth--,this._pendingBatchKeys=J,this._batchingDepth===0){for(let X of this._batchedEntityIds)for(let Y of this._afterEntityMutatedHooks)Y(X);this._batchedEntityIds.clear()}return this}removeComponent(j,$){let G=this.entities.get(j);if(!G)throw Error(`Cannot remove component '${String($)}': Entity with ID ${j} does not exist`);let J=G.components[$];if(J!==void 0)this.invokeDispose($,J,G.id);delete G.components[$];let X=this.removedCallbacks.get($);if(X&&J!==void 0)X.invoke({value:J,entity:G});if(this.componentIndices.get($)?.delete(G.id),J!==void 0)for(let Y of this._afterComponentRemovedHooks)Y(G.id,$);return this}getComponent(j,$){let G=this.entities.get(j);if(!G)throw Error(`Cannot get component '${String($)}': Entity with ID ${j} does not exist`);return G.components[$]}getEntitiesWithQuery(j=[],$=[],G,J,X){return this.getEntitiesWithQueryInto([],j,$,G,J,X)}getEntitiesWithQueryInto(j,$=[],G=[],J,X,Y){j.length=0;let Z=J!==void 0&&J.length>0&&X!==void 0,F=Y!==void 0&&Y.length>0;if($.length===0){if(G.length===0&&!Z&&!F){for(let D of this.entities.values())j.push(D);return j}for(let D of this.entities.values()){if(G.length>0&&!G.every((L)=>!(L in D.components)))continue;if(Z){let L=this.changeSeqs.get(D.id);if(!L)continue;if(!J.some((B)=>(L.get(B)??-1)>X))continue}if(F&&!this.parentHasComponents(D.id,Y))continue;j.push(D)}return j}let A=$[0];if(A===void 0)return j;let O=$.reduce((D,L)=>{let B=this.componentIndices.get(L)?.size??0,Q=this.componentIndices.get(D)?.size??1/0;return B<Q?L:D},A),W=this.componentIndices.get(O);if(!W||W.size===0)return j;let _=G.length>0;for(let D of W){let L=this.entities.get(D);if(L&&$.every((B)=>(B in L.components))&&(!_||G.every((B)=>!(B in L.components)))){if(Z){let B=this.changeSeqs.get(D);if(!B||!J.some((Q)=>(B.get(Q)??-1)>X))continue}if(F&&!this.parentHasComponents(D,Y))continue;j.push(L)}}return j}parentHasComponents(j,$){let G=this.hierarchyManager.getParent(j);if(G===null)return!1;let J=this.entities.get(G);if(!J)return!1;for(let X of $)if(!(X in J.components))return!1;return!0}removeEntity(j,$){let G=this.entities.get(j);if(!G)return!1;if($?.cascade??!0){let X=this.hierarchyManager.getDescendants(G.id);for(let Y=X.length-1;Y>=0;Y--){let Z=X[Y];if(Z===void 0)continue;for(let F of this._beforeEntityRemovedHooks)F(Z)}for(let Y of this._beforeEntityRemovedHooks)Y(G.id);for(let Y=X.length-1;Y>=0;Y--){let Z=X[Y];if(Z===void 0)continue;this.removeEntityInternal(Z)}}else for(let X of this._beforeEntityRemovedHooks)X(G.id);return this.removeEntityInternal(G.id)}removeEntityInternal(j){let $=this.entities.get(j);if(!$)return!1;this.hierarchyManager.removeEntity(j);for(let G of Object.keys($.components)){let J=$.components[G];if(J!==void 0){this.invokeDispose(G,J,$.id);let X=this.removedCallbacks.get(G);if(X)X.invoke({value:J,entity:$})}this.componentIndices.get(G)?.delete($.id)}return this.changeSeqs.delete($.id),this.entities.delete($.id)}getEntity(j){return this.entities.get(j)}onComponentAdded(j,$){let G=$,J=this.addedCallbacks.get(j);if(!J)J=new T,this.addedCallbacks.set(j,J);return J.add(G),()=>{this.addedCallbacks.get(j)?.remove(G)}}onComponentRemoved(j,$){let G=$,J=this.removedCallbacks.get(j);if(!J)J=new T,this.removedCallbacks.set(j,J);return J.add(G),()=>{this.removedCallbacks.get(j)?.remove(G)}}onAfterComponentAdded(j){return this._afterComponentAddedHooks.push(j),()=>{let $=this._afterComponentAddedHooks.indexOf(j);if($!==-1)this._afterComponentAddedHooks.splice($,1)}}onAfterEntityMutated(j){return this._afterEntityMutatedHooks.push(j),()=>{let $=this._afterEntityMutatedHooks.indexOf(j);if($!==-1)this._afterEntityMutatedHooks.splice($,1)}}onAfterComponentRemoved(j){return this._afterComponentRemovedHooks.push(j),()=>{let $=this._afterComponentRemovedHooks.indexOf(j);if($!==-1)this._afterComponentRemovedHooks.splice($,1)}}onBeforeEntityRemoved(j){return this._beforeEntityRemovedHooks.push(j),()=>{let $=this._beforeEntityRemovedHooks.indexOf(j);if($!==-1)this._beforeEntityRemovedHooks.splice($,1)}}onAfterParentChanged(j){return this._afterParentChangedHooks.push(j),()=>{let $=this._afterParentChangedHooks.indexOf(j);if($!==-1)this._afterParentChangedHooks.splice($,1)}}get changeSeq(){return this._changeSeq}markChanged(j,$){let G=++this._changeSeq,J=this.changeSeqs.get(j);if(!J)J=new Map,this.changeSeqs.set(j,J);J.set($,G)}getChangeSeq(j,$){return this.changeSeqs.get(j)?.get($)??-1}spawnChild(j,$){let G=this.createEntity();return this.addComponents(G.id,$),this.setParent(G.id,j),G}setParent(j,$){this.hierarchyManager.setParent(j,$);for(let G of this._afterParentChangedHooks)G(j);return this}removeParent(j){let $=this.hierarchyManager.removeParent(j);if($)for(let G of this._afterParentChangedHooks)G(j);return $}getParent(j){return this.hierarchyManager.getParent(j)}getChildren(j){return this.hierarchyManager.getChildren(j)}getChildAt(j,$){return this.hierarchyManager.getChildAt(j,$)}getChildIndex(j,$){return this.hierarchyManager.getChildIndex(j,$)}getAncestors(j){return this.hierarchyManager.getAncestors(j)}getDescendants(j){return this.hierarchyManager.getDescendants(j)}getRoot(j){return this.hierarchyManager.getRoot(j)}getSiblings(j){return this.hierarchyManager.getSiblings(j)}isDescendantOf(j,$){return this.hierarchyManager.isDescendantOf(j,$)}isAncestorOf(j,$){return this.hierarchyManager.isAncestorOf(j,$)}getRootEntities(){return this.hierarchyManager.getRootEntities()}forEachInHierarchy(j,$){this.hierarchyManager.forEachInHierarchy(j,$)}hierarchyIterator(j){return this.hierarchyManager.hierarchyIterator(j)}}class V{handlers=new Map;subscribe(j,$){return this.addHandler(j,$,!1)}once(j,$){return this.addHandler(j,$,!0)}unsubscribe(j,$){let G=this.handlers.get(j);if(!G)return!1;let J=G.findIndex((X)=>X.callback===$);if(J===-1)return!1;return G.splice(J,1),!0}addHandler(j,$,G){let J=this.handlers.get(j);if(!J)J=[],this.handlers.set(j,J);let X={callback:$,once:G};return J.push(X),()=>{let Y=this.handlers.get(j);if(Y){let Z=Y.indexOf(X);if(Z!==-1)Y.splice(Z,1)}}}publish(...[j,$]){let G=this.handlers.get(j);if(!G||G.length===0)return;let J=!1,X=G.length;for(let Y=0;Y<X&&Y<G.length;Y++){let Z=G[Y];if(!Z)continue;if(Z.callback($),Z.once)J=!0}if(J){for(let Y=G.length-1;Y>=0;Y--)if(G[Y]?.once)G.splice(Y,1)}}clear(){this.handlers.clear()}clearEvent(j){this.handlers.delete(j)}}var x=Symbol("resource-direct");function I(j){return{[x]:j}}function u(j){return typeof j==="object"&&j!==null&&"factory"in j&&typeof j.factory==="function"}function m(j){return typeof j==="object"&&j!==null&&x in j}function f(j,$){let G=[],J=new Set,X=new Set;function Y(Z,F=[]){if(J.has(Z))return;if(X.has(Z))throw Error(`Circular resource dependency: ${[...F,Z].join(" -> ")}`);X.add(Z);for(let A of $(Z)){let O=j.find((W)=>W===A);if(O)Y(O,[...F,Z])}X.delete(Z),J.add(Z),G.push(Z)}for(let Z of j)Y(Z);return G}class E{resources=new Map;resourceFactories=new Map;resourceDependencies=new Map;resourceDisposers=new Map;initializedResourceKeys=new Set;_changeSubscribers=new Map;add(j,$){let G=(J)=>{this.resources.set(j,J),this.initializedResourceKeys.add(j),this.resourceDependencies.set(j,[])};if(u($)){if(this.resourceFactories.set(j,$.factory),this.resourceDependencies.set(j,$.dependsOn??[]),$.onDispose)this.resourceDisposers.set(j,$.onDispose)}else if(m($))G($[x]);else if(typeof $==="function")this.resourceFactories.set(j,$),this.resourceDependencies.set(j,[]);else G($);return this}tryGet(j,...$){if(!this.has(j))return;return this.get(j,...$)}get(j,...$){let G=this.resources.get(j);if(G!==void 0)return G;let J=this.resourceFactories.get(j);if(J===void 0)throw Error(`Resource ${String(j)} not found`);let X=$[0],Y=J(X);if(!(Y instanceof Promise))this.resources.set(j,Y),this.initializedResourceKeys.add(j);return Y}has(j){return this.resources.has(j)||this.resourceFactories.has(j)}remove(j){let $=this.resources.delete(j),G=this.resourceFactories.delete(j);return this.resourceDependencies.delete(j),this.resourceDisposers.delete(j),this.initializedResourceKeys.delete(j),$||G}getKeys(){let j=new Set([...this.resources.keys(),...this.resourceFactories.keys()]);return Array.from(j)}needsInitialization(j){return this.resourceFactories.has(j)&&!this.initializedResourceKeys.has(j)}getPendingInitializationKeys(){return Array.from(this.resourceFactories.keys()).filter((j)=>!this.initializedResourceKeys.has(j))}async initializeResource(j,...$){if(!this.resourceFactories.has(j)||this.initializedResourceKeys.has(j))return;let G=this.resourceFactories.get(j);if(!G)return;let J=$[0],X=await G(J);this.resources.set(j,X),this.initializedResourceKeys.add(j),this.resourceFactories.delete(j)}async initializeResources(...j){let $=j.slice(1),G=$.length===0?this.getPendingInitializationKeys():$;if(G.length===0)return;let J=f(G,(X)=>[...this.resourceDependencies.get(X)??[]]);for(let X of J)await this.initializeResource(X,...j.slice(0,1))}getDependencies(j){return this.resourceDependencies.get(j)??[]}async disposeResource(j,...$){if(!this.resources.has(j)&&!this.resourceFactories.has(j))return!1;if(this.initializedResourceKeys.has(j)){let G=this.resourceDisposers.get(j),J=this.resources.get(j);if(G&&J!==void 0){let X=$[0];await G(J,X)}}return this.resources.delete(j),this.resourceFactories.delete(j),this.resourceDependencies.delete(j),this.resourceDisposers.delete(j),this.initializedResourceKeys.delete(j),this._changeSubscribers.delete(j),!0}onResourceChange(j,$){let G=this._changeSubscribers.get(j),J=G??new Set;if(!G)this._changeSubscribers.set(j,J);let X=$;return J.add(X),()=>{if(J.delete(X),J.size===0)this._changeSubscribers.delete(j)}}notifyChange(j,$,G){if(Object.is($,G))return;let J=this._changeSubscribers.get(j);if(!J||J.size===0)return;let X=[...J];for(let Y of X)Y($,G)}async disposeResources(...j){let $=Array.from(this.initializedResourceKeys);if($.length===0)return;let G=f($,(J)=>[...this.resourceDependencies.get(J)??[]]).reverse();for(let J of G)await this.disposeResource(J,...j)}}class R{queries=new Map;entityManager;_hasParentHasQueries=!1;constructor(j){this.entityManager=j}get hasParentHasQueries(){return this._hasParentHasQueries}addQuery(j,$){let G={definition:$,matchingEntities:new Set};if(this.queries.set(j,G),$.parentHas?.length)this._hasParentHasQueries=!0;let J=this.entityManager.getEntitiesWithQuery($.with,$.without??[]);for(let X of J)if(this.entityMatchesQuery(X,G.definition))G.matchingEntities.add(X.id),G.definition.onEnter?.(X)}removeQuery(j){let $=this.queries.delete(j);if($)this._recalcParentHasFlag();return $}entityMatchesQuery(j,$){for(let G of $.with)if(!(G in j.components))return!1;if($.without){for(let G of $.without)if(G in j.components)return!1}if($.parentHas?.length){let G=this.entityManager.getParent(j.id);if(G===null)return!1;let J=this.entityManager.getEntity(G);if(!J)return!1;for(let X of $.parentHas)if(!(X in J.components))return!1}return!0}_applyQueryTransition(j,$){let G=$.matchingEntities.has(j.id),J=this.entityMatchesQuery(j,$.definition);if(!G&&J)$.matchingEntities.add(j.id),$.definition.onEnter?.(j);else if(G&&!J)$.matchingEntities.delete(j.id),$.definition.onExit?.(j.id)}onComponentAdded(j,$){for(let[,G]of this.queries)this._applyQueryTransition(j,G);if(this._hasParentHasQueries)this._recheckChildren(j.id)}onComponentRemoved(j,$){for(let[,G]of this.queries)this._applyQueryTransition(j,G);if(this._hasParentHasQueries)this._recheckChildren(j.id)}onEntityRemoved(j){for(let[$,G]of this.queries)if(G.matchingEntities.has(j))G.matchingEntities.delete(j),G.definition.onExit?.(j)}recheckEntity(j){for(let[,$]of this.queries)this._applyQueryTransition(j,$)}recheckEntityAndChildren(j){if(this.recheckEntity(j),this._hasParentHasQueries)this._recheckChildren(j.id)}_recheckChildren(j){let $=this.entityManager.getChildren(j);for(let G of $){let J=this.entityManager.getEntity(G);if(J)this.recheckEntity(J)}}_recalcParentHasFlag(){this._hasParentHasQueries=!1;for(let[,j]of this.queries)if(j.definition.parentHas?.length){this._hasParentHasQueries=!0;return}}}class w{commands=[];removeEntity(j,$){this.commands.push((G)=>{G.removeEntity(j,$)})}addComponent(j,$,G){this.commands.push((J)=>{J.addComponent(j,$,G)})}removeComponent(j,$){this.commands.push((G)=>{G.removeComponent(j,$)})}spawn(j){this.commands.push(($)=>{$.spawn(j)})}spawnChild(j,$){this.commands.push((G)=>{G.spawnChild(j,$)})}addComponents(j,$){this.commands.push((G)=>{G.addComponents(j,$)})}setParent(j,$){this.commands.push((G)=>{G.setParent(j,$)})}mutateComponent(j,$,G){this.commands.push((J)=>{J.mutateComponent(j,$,G)})}markChanged(j,$){this.commands.push((G)=>{G.markChanged(j,$)})}removeParent(j){this.commands.push(($)=>{$.removeParent(j)})}playback(j){for(let $ of this.commands)try{$(j)}catch(G){console.warn("CommandBuffer: Command failed during playback:",G)}this.commands.length=0}clear(){this.commands.length=0}get length(){return this.commands.length}}class b{_id;constructor(j){this._id=j}withComponentTypes(){return this}withEventTypes(){return this}withResourceTypes(){return this}withAssetTypes(){return this}withScreenTypes(){return this}withLabels(){return this}withGroups(){return this}withAssetGroupNames(){return this}withReactiveQueryNames(){return this}requires(){return this}install(j){return{id:this._id,install:j}}}function P(j){return new b(j)}class S{_label;queries={};processFunction;detachFunction;initializeFunction;eventHandlers;_priority=0;_phase="update";_groups=[];_inScreens;_excludeScreens;_requiredAssets;_runWhenEmpty=!1;_entityEnterHandlers={};_resourceKeys;constructor(j){this._label=j}get label(){return this._label}_createSystemObject(){let j={label:this._label,entityQueries:this.queries,priority:this._priority,phase:this._phase};if(this.processFunction)j.process=this.processFunction;if(this.detachFunction)j.onDetach=this.detachFunction;if(this.initializeFunction)j.onInitialize=this.initializeFunction;if(this.eventHandlers)j.eventHandlers=this.eventHandlers;if(this._groups.length>0)j.groups=[...this._groups];if(this._inScreens)j.inScreens=this._inScreens;if(this._excludeScreens)j.excludeScreens=this._excludeScreens;if(this._requiredAssets)j.requiredAssets=this._requiredAssets;if(this._runWhenEmpty)j.runWhenEmpty=!0;if(Object.keys(this._entityEnterHandlers).length>0)j.onEntityEnter={...this._entityEnterHandlers};return j}setPriority(j){return this._priority=j,this}inPhase(j){return this._phase=j,this}inGroup(j){if(!this._groups.includes(j))this._groups.push(j);return this}inScreens(j){return this._inScreens=[...j],this}excludeScreens(j){return this._excludeScreens=[...j],this}requiresAssets(j){return this._requiredAssets=[...j],this}runWhenEmpty(){return this._runWhenEmpty=!0,this}withResources(j){return this._resourceKeys=[...j],this}addQuery(j,$){let G=this;return G.queries={...this.queries,[j]:$},G}setProcess(j){if(this._resourceKeys?.length){let $=this._resourceKeys,G;this.processFunction=(J)=>{if(!G){G={};for(let X of $)G[X]=J.ecs.getResource(X)}J.resources=G,j(J)}}else this.processFunction=j;return this}setOnEntityEnter(j,$){return this._entityEnterHandlers[j]=$,this}setOnDetach(j){return this.detachFunction=j,this}setOnInitialize(j){return this.initializeFunction=j,this}setEventHandlers(j){return this.eventHandlers=j,this}}function g(j,$,G){let J=new Set,X=[$];while(X.length>0){let Y=X.pop();if(Y===void 0)break;if(Y===j)throw Error(`Circular required component dependency: '${String(j)}' -> '${String($)}' -> ... -> '${String(j)}'`);if(J.has(Y))continue;J.add(Y);let Z=G(Y);if(Z)for(let F of Z)X.push(F.component)}}var N="0.13.3";class U{assets=new Map;groups=new Map;eventBus=null;setEventBus(j){this.eventBus=j}register(j,$){if(this.assets.set(j,{definition:$,status:"pending"}),$.group){let G=this.groups.get($.group)??new Set;G.add(j),this.groups.set($.group,G)}}async loadEagerAssets(){let j=[];for(let[$,G]of this.assets)if(G.definition.eager&&G.status==="pending")j.push($);await Promise.all(j.map(($)=>this.loadAsset($)))}async loadAsset(j){let $=this.assets.get(j);if(!$)throw Error(`Asset '${String(j)}' not found`);if($.status==="loaded"&&$.value!==void 0)return $.value;if($.status==="loading"&&$.loadPromise)return $.loadPromise;if($.status==="failed")$.status="pending";$.status="loading",$.loadPromise=$.definition.loader();try{let G=await $.loadPromise;return $.value=G,$.status="loaded",$.loadPromise=void 0,this.eventBus?.publish("assetLoaded",{key:j}),this.checkGroupProgress($.definition.group),G}catch(G){let J=G instanceof Error?G:Error(String(G));throw $.status="failed",$.error=J,$.loadPromise=void 0,this.eventBus?.publish("assetFailed",{key:j,error:J}),J}}async loadAssetGroup(j){let $=this.groups.get(j);if(!$||$.size===0)throw Error(`Asset group '${j}' not found or empty`);await Promise.all(Array.from($).map((G)=>this.loadAsset(G)))}get(j){let $=this.assets.get(j);if(!$)throw Error(`Asset '${String(j)}' not found`);if($.status!=="loaded"||$.value===void 0)throw Error(`Asset '${String(j)}' is not loaded (status: ${$.status})`);return $.value}tryGet(j){let $=this.assets.get(j);if(!$||$.status!=="loaded")return;return $.value}getHandle(j){let $=this.assets.get(j);if(!$)throw Error(`Asset '${String(j)}' not found`);let G=this;return{get status(){return $.status},get isLoaded(){return $.status==="loaded"},get(){return G.get(j)},tryGet(){return G.tryGet(j)}}}getStatus(j){let $=this.assets.get(j);if(!$)throw Error(`Asset '${String(j)}' not found`);return $.status}isLoaded(j){return this.assets.get(j)?.status==="loaded"}isGroupLoaded(j){let $=this.groups.get(j);if(!$||$.size===0)return!1;for(let G of $){let J=this.assets.get(G);if(!J||J.status!=="loaded")return!1}return!0}getGroupProgress(j){return this.getGroupProgressDetails(j).progress}getGroupProgressDetails(j){let $=this.groups.get(j);if(!$||$.size===0)return{loaded:0,total:0,progress:0};let G=0;for(let X of $)if(this.assets.get(X)?.status==="loaded")G++;let J=$.size;return{loaded:G,total:J,progress:G/J}}checkGroupProgress(j){if(!j||!this.eventBus)return;let $=j,G=this.getGroupProgressDetails($);if(this.eventBus.publish("assetGroupProgress",{group:$,...G}),G.loaded===G.total)this.eventBus.publish("assetGroupLoaded",{group:$})}createResource(){let j=this;return{getStatus($){return j.getStatus($)},isLoaded($){return j.isLoaded($)},isGroupLoaded($){return j.isGroupLoaded($)},getGroupProgress($){return j.getGroupProgress($)},get($){return j.get($)},tryGet($){return j.tryGet($)},getHandle($){return j.getHandle($)}}}getKeys(){return Array.from(this.assets.keys())}getGroupNames(){return Array.from(this.groups.keys())}getGroupKeys(j){let $=this.groups.get(j);return $?Array.from($):[]}}class h{manager;constructor(j){this.manager=j}add(j,$){return this.manager.register(j,{loader:$,eager:!0}),this}addWithConfig(j,$){return this.manager.register(j,$),this}addGroup(j,$){for(let[G,J]of Object.entries($))this.manager.register(G,{loader:J,eager:!1,group:j});return this}getManager(){return this.manager}}function C(j){return new h(j??new U)}class K{screens=new Map;currentScreen=null;screenStack=[];eventBus=null;assetManager=null;ecs=null;setDependencies(j,$,G){this.eventBus=j,this.assetManager=$,this.ecs=G}requireEcs(){if(!this.ecs)throw Error("ScreenManager: dependencies not set. Call setDependencies() first.");return this.ecs}register(j,$){this.screens.set(j,{definition:$})}async setScreen(j,$){let G=this.screens.get(j);if(!G)throw Error(`Screen '${String(j)}' not found`);await this.verifyRequiredAssets(G.definition.requiredAssets,G.definition.requiredAssetGroups);while(this.screenStack.length>0){let X=this.screenStack.pop();if(X)await this.exitScreen(X.name)}if(this.currentScreen)await this.exitScreen(this.currentScreen.name);let J=G.definition.initialState($);this.currentScreen={name:j,config:$,state:J},await G.definition.onEnter?.({config:$,ecs:this.requireEcs()}),this.eventBus?.publish("screenEnter",{screen:j,config:$})}async pushScreen(j,$){let G=this.screens.get(j);if(!G)throw Error(`Screen '${String(j)}' not found`);if(await this.verifyRequiredAssets(G.definition.requiredAssets,G.definition.requiredAssetGroups),this.currentScreen)this.screenStack.push(this.currentScreen);let J=G.definition.initialState($);this.currentScreen={name:j,config:$,state:J},await G.definition.onEnter?.({config:$,ecs:this.requireEcs()}),this.eventBus?.publish("screenPush",{screen:j,config:$})}async popScreen(){if(this.screenStack.length===0)throw Error("Cannot pop screen: stack is empty");if(this.currentScreen)await this.exitScreen(this.currentScreen.name),this.eventBus?.publish("screenPop",{screen:this.currentScreen.name});this.currentScreen=this.screenStack.pop()??null}async exitScreen(j){let $=this.screens.get(j);if($?.definition.onExit)await $.definition.onExit(this.requireEcs());this.eventBus?.publish("screenExit",{screen:j})}async verifyRequiredAssets(j,$){if(!this.assetManager)return;if(j){for(let G of j)if(!this.assetManager.isLoaded(G))await this.assetManager.loadAsset(G)}if($){for(let G of $)if(!this.assetManager.isGroupLoaded(G))await this.assetManager.loadAssetGroup(G)}}getCurrentScreen(){return this.currentScreen?.name??null}getConfig(j){if(!this.currentScreen)throw Error("No current screen");if(j!==void 0&&this.currentScreen.name!==j)throw Error(`Expected current screen '${String(j)}', but current is '${String(this.currentScreen.name)}'`);return this.currentScreen.config}tryGetConfig(j){if(!this.currentScreen)return;if(j!==void 0&&this.currentScreen.name!==j)return;return this.currentScreen.config}getState(j){if(!this.currentScreen)throw Error("No current screen");if(j!==void 0&&this.currentScreen.name!==j)throw Error(`Expected current screen '${String(j)}', but current is '${String(this.currentScreen.name)}'`);return this.currentScreen.state}tryGetState(j){if(!this.currentScreen)return;if(j!==void 0&&this.currentScreen.name!==j)return;return this.currentScreen.state}updateState(j,$){if(!this.currentScreen)throw Error("No current screen");if($!==void 0&&this.currentScreen.name!==$)throw Error(`Expected current screen '${String($)}', but current is '${String(this.currentScreen.name)}'`);let G=typeof j==="function"?j(this.currentScreen.state):j;this.currentScreen.state={...this.currentScreen.state,...G}}getStackDepth(){return this.screenStack.length}isOverlay(){return this.screenStack.length>0}isActive(j){if(this.currentScreen?.name===j)return!0;return this.screenStack.some(($)=>$.name===j)}isCurrent(j){return this.currentScreen?.name===j}createResource(){let j=this;return{get current(){return j.getCurrentScreen()},get config(){return j.tryGetConfig()??null},get state(){return j.tryGetState()??null},set state($){if(j.currentScreen&&$!==null)j.currentScreen.state=$},get stack(){return j.screenStack},get isOverlay(){return j.isOverlay()},get stackDepth(){return j.getStackDepth()},isActive($){return j.isActive($)},isCurrent($){return j.isCurrent($)}}}getScreenNames(){return Array.from(this.screens.keys())}hasScreen(j){return this.screens.has(j)}}class k{manager;constructor(j){this.manager=j}add(j,$){return this.manager.register(j,$),this}getManager(){return this.manager}}function q(j){return new k(j??new K)}class v{assetConfigurator=null;screenConfigurator=null;pendingResources=[];pendingDisposeCallbacks=[];pendingRequiredComponents=[];pendingPlugins=[];_fixedDt=null;constructor(){}withPlugin(j){return this.pendingPlugins.push(j),this}withComponentTypes(){return this}withEventTypes(){return this}withResourceTypes(){return this}withResource(j,$){return this.pendingResources.push({key:j,value:$}),this}withDispose(j,$){return this.pendingDisposeCallbacks.push({key:j,callback:$}),this}withRequired(j,$,G){return this.pendingRequiredComponents.push({trigger:j,required:$,factory:G}),this}withAssets(j){let $=C();return j($),this.assetConfigurator=$,this}withScreens(j){let $=q();return j($),this.screenConfigurator=$,this}withFixedTimestep(j){return this._fixedDt=j,this}withReactiveQueryNames(){return this}pluginFactory(){return(j)=>P(j.id).install(j.install)}build(){let j=new z;for(let $ of this.pendingPlugins)j.installPlugin($);for(let{key:$,value:G}of this.pendingResources)j.addResource($,G);for(let{key:$,callback:G}of this.pendingDisposeCallbacks)j.registerDispose($,G);for(let{trigger:$,required:G,factory:J}of this.pendingRequiredComponents)j.registerRequired($,G,J);if(this.assetConfigurator)j._setAssetManager(this.assetConfigurator.getManager());else if(j._hasPendingPluginAssets())j._setAssetManager(new U);if(this.screenConfigurator)j._setScreenManager(this.screenConfigurator.getManager());else if(j._hasPendingPluginScreens())j._setScreenManager(new K);if(this._fixedDt!==null)j._setFixedDt(this._fixedDt);return j}}var p=["preUpdate","fixedUpdate","update","postUpdate","render"];class z{static VERSION=N;_entityManager;_eventBus;_resourceManager;_commandBuffer;_systems=[];_phaseSystems={preUpdate:[],fixedUpdate:[],update:[],postUpdate:[],render:[]};_installedPlugins=new Set;_disabledGroups=new Set;_assetManager=null;_screenManager=null;_reactiveQueryManager;_postUpdateHooks=[];_currentTick=0;_systemLastSeqs=new Map;_changeThreshold=0;_fixedDt=0.016666666666666666;_fixedAccumulator=0;_interpolationAlpha=0;_maxFixedSteps=8;_requiredComponents=new Map;_pendingPluginAssets=[];_pendingPluginScreens=[];_diagnosticsEnabled=!1;_systemTimings=new Map;_phaseTimings={preUpdate:0,fixedUpdate:0,update:0,postUpdate:0,render:0};_entityEnterTracking=new Map;_entityEnterFrameSet=new Set;_systemContexts=new WeakMap;_pendingFinalizers=[];_batchingRegistrations=!1;constructor(){this._entityManager=new H,this._eventBus=new V,this._resourceManager=new E,this._reactiveQueryManager=new R(this._entityManager),this._commandBuffer=new w,this._subscribeLifecycleHooks()}_subscribeLifecycleHooks(){this._entityManager.onAfterComponentAdded((j,$)=>{this._entityManager.markChanged(j,$);let G=this._requiredComponents.get($);if(G){let J=this._entityManager.getEntity(j);if(J){let X=J.components[$];for(let{component:Y,factory:Z}of G){if(this._entityManager._pendingBatchKeys?.has(Y))continue;if(!(Y in J.components))this._entityManager.addComponent(j,Y,Z(X))}}}}),this._entityManager.onAfterEntityMutated((j)=>{let $=this._entityManager.getEntity(j);if($)this._reactiveQueryManager.recheckEntityAndChildren($)}),this._entityManager.onAfterComponentRemoved((j,$)=>{let G=this._entityManager.getEntity(j);if(G)this._reactiveQueryManager.onComponentRemoved(G,$)}),this._entityManager.onBeforeEntityRemoved((j)=>{this._reactiveQueryManager.onEntityRemoved(j)}),this._entityManager.onAfterParentChanged((j)=>{if(this._reactiveQueryManager.hasParentHasQueries){let $=this._entityManager.getEntity(j);if($)this._reactiveQueryManager.recheckEntity($)}})}static create(){return new v}addSystem(j){let $=new S(j);return this._pendingFinalizers.push(()=>{this._registerSystem($._createSystemObject())}),$}_finalizePendingBuilders(){if(this._pendingFinalizers.length===0)return;this._batchingRegistrations=!0;while(this._pendingFinalizers.length>0){let j=this._pendingFinalizers;this._pendingFinalizers=[];for(let $ of j)$()}this._batchingRegistrations=!1,this._rebuildPhaseSystems()}update(j){this._finalizePendingBuilders();let $=this._screenManager?.getCurrentScreen()??null,G=this._diagnosticsEnabled;this._runPhase("preUpdate",j,$,G);let J=G?performance.now():0;this._fixedAccumulator+=j;let X=0;while(this._fixedAccumulator>=this._fixedDt&&X<this._maxFixedSteps)this._executePhase(this._phaseSystems.fixedUpdate,this._fixedDt,$),this._commandBuffer.playback(this),this._fixedAccumulator-=this._fixedDt,X++;if(this._fixedAccumulator>=this._fixedDt)this._fixedAccumulator=0;if(G)this._phaseTimings.fixedUpdate=performance.now()-J;this._interpolationAlpha=this._fixedAccumulator/this._fixedDt,this._runPhase("update",j,$,G),this._runPhase("postUpdate",j,$,G);for(let Y of this._postUpdateHooks)Y({ecs:this,dt:j});this._runPhase("render",j,$,G),this._changeThreshold=this._entityManager.changeSeq,this._currentTick++}_executePhase(j,$,G){for(let J of j){if(!J.process&&!J.onEntityEnter)continue;if(J.groups?.length){let W=!1;for(let _ of J.groups)if(this._disabledGroups.has(_)){W=!0;break}if(W)continue}if(J.inScreens?.length){if(G===null||!J.inScreens.includes(G))continue}if(J.excludeScreens?.length){if(G!==null&&J.excludeScreens.includes(G))continue}if(J.requiredAssets?.length&&this._assetManager){let W=!0;for(let _ of J.requiredAssets)if(!this._assetManager.isLoaded(_)){W=!1;break}if(!W)continue}let X=this._systemLastSeqs.get(J)??0;this._changeThreshold=X;let Y=this._systemContexts.get(J);if(!Y)Y={queries:{},dt:0,ecs:this},this._systemContexts.set(J,Y);Y.dt=$;let Z=Y.queries,F=!1,A=!1;if(J.entityQueries)for(let W in J.entityQueries){A=!0;let _=J.entityQueries[W];if(_){let L=Z[W]??(Z[W]=[]);if(this._entityManager.getEntitiesWithQueryInto(L,_.with,_.without||[],_.changed,_.changed?this._changeThreshold:void 0,_.parentHas),L.length)F=!0}}let O=this._entityEnterTracking.get(J);if(O&&J.onEntityEnter)for(let W in J.onEntityEnter){let _=Z[W],D=O.get(W);if(!_||!D)continue;let L=J.onEntityEnter[W];if(!L)continue;let B=this._entityEnterFrameSet;B.clear();for(let Q of _)if(B.add(Q.id),!D.has(Q.id))D.add(Q.id),L({entity:Q,ecs:this});for(let Q of D)if(!B.has(Q))D.delete(Q)}if(J.process){if(this._diagnosticsEnabled){let W=performance.now();if(F||J.runWhenEmpty)J.process(Y);else if(!A)J.process(Y);this._systemTimings.set(J.label,performance.now()-W)}else if(F||J.runWhenEmpty)J.process(Y);else if(!A)J.process(Y)}this._systemLastSeqs.set(J,this._entityManager.changeSeq)}}_runPhase(j,$,G,J){if(J){let X=performance.now();this._executePhase(this._phaseSystems[j],$,G),this._phaseTimings[j]=performance.now()-X}else this._executePhase(this._phaseSystems[j],$,G);this._commandBuffer.playback(this)}async initialize(){if(this._finalizePendingBuilders(),await this.initializeResources(),this._assetManager)this._assetManager.setEventBus(this._eventBus),await this._assetManager.loadEagerAssets(),this._resourceManager.add("$assets",this._assetManager.createResource());if(this._screenManager)this._screenManager.setDependencies(this._eventBus,this._assetManager,this),this._resourceManager.add("$screen",this._screenManager.createResource());for(let j of this._systems)await j.onInitialize?.(this)}async initializeResources(...j){await this._resourceManager.initializeResources(this,...j)}_rebuildPhaseSystems(){for(let j of p)this._phaseSystems[j]=[];for(let j of this._systems){let $=j.phase??"update";this._phaseSystems[$].push(j)}for(let j of p)this._phaseSystems[j].sort(($,G)=>{let J=$.priority??0;return(G.priority??0)-J})}updateSystemPriority(j,$){this._finalizePendingBuilders();let G=this._systems.find((J)=>J.label===j);if(!G)return!1;return G.priority=$,this._rebuildPhaseSystems(),!0}updateSystemPhase(j,$){this._finalizePendingBuilders();let G=this._systems.find((J)=>J.label===j);if(!G)return!1;return G.phase=$,this._rebuildPhaseSystems(),!0}get interpolationAlpha(){return this._interpolationAlpha}get fixedDt(){return this._fixedDt}disableSystemGroup(j){this._disabledGroups.add(j)}enableSystemGroup(j){this._disabledGroups.delete(j)}isSystemGroupEnabled(j){return!this._disabledGroups.has(j)}getSystemsInGroup(j){return this._finalizePendingBuilders(),this._systems.filter(($)=>$.groups?.includes(j)).map(($)=>$.label)}removeSystem(j){this._finalizePendingBuilders();let $=this._systems.findIndex((J)=>J.label===j);if($===-1)return!1;let G=this._systems[$];if(!G)return!1;if(G.onDetach)G.onDetach(this);return this._systems.splice($,1),this._systemLastSeqs.delete(G),this._entityEnterTracking.delete(G),this._rebuildPhaseSystems(),!0}_registerSystem(j){if(this._systems.push(j),this._systemLastSeqs.set(j,this._changeThreshold),!this._batchingRegistrations)this._rebuildPhaseSystems();if(j.onEntityEnter){let $=new Map;for(let G in j.onEntityEnter)$.set(G,new Set);this._entityEnterTracking.set(j,$)}if(!j.eventHandlers)return;for(let $ in j.eventHandlers){let G=j.eventHandlers[$];if(G)this._eventBus.subscribe($,(J)=>{G({data:J,ecs:this})})}}hasResource(j){return this._resourceManager.has(j)}getResource(j){if(!this._resourceManager.has(j))throw Error(`Resource '${String(j)}' not found. Available resources: [${this.getResourceKeys().map(($)=>String($)).join(", ")}]`);return this._resourceManager.get(j,this)}tryGetResource(j){let $=j;if(!this._resourceManager.has($))return;return this._resourceManager.get($,this)}addResource(j,$){return this._resourceManager.add(j,$),this}removeResource(j){return this._resourceManager.remove(j)}async disposeResource(j){return this._resourceManager.disposeResource(j,this)}async disposeResources(){return this._resourceManager.disposeResources(this)}updateResource(j,$){let G=this.getResource(j),J=$(G);return this._resourceManager.add(j,J),this._resourceManager.notifyChange(j,J,G),this}setResource(j,$){let G=this.tryGetResource(j);if(this._resourceManager.add(j,$),G!==void 0)this._resourceManager.notifyChange(j,$,G);return this}onResourceChange(j,$){return this._resourceManager.onResourceChange(j,$)}getResourceKeys(){return this._resourceManager.getKeys()}resourceNeedsInitialization(j){return this._resourceManager.needsInitialization(j)}getEntity(j){return this._entityManager.getEntity(j)}getComponent(j,$){return this._entityManager.getComponent(j,$)}addComponent(j,$,G){this._entityManager.addComponent(j,$,G)}addComponents(j,$){this._entityManager.addComponents(j,$)}removeComponent(j,$){this._entityManager.removeComponent(j,$)}hasComponent(j,$){return this._entityManager.getComponent(j,$)!==void 0}spawn(j){let $=this._entityManager.createEntity();return this._entityManager.addComponents($.id,j),$}getEntitiesWithQuery(j,$=[],G,J){return this._entityManager.getEntitiesWithQuery(j,$,G,G?this._changeThreshold:void 0,J)}getSingleton(j,$=[]){let G=this._entityManager.getEntitiesWithQuery(j,$);if(G.length===0)throw Error(`getSingleton: no entity matches query with=[${String(j)}] without=[${String($)}]`);if(G.length>1)throw Error(`getSingleton: expected 1 entity but found ${G.length} matching query with=[${String(j)}] without=[${String($)}]`);let J=G[0];if(!J)throw Error("getSingleton: unexpected empty result");return J}tryGetSingleton(j,$=[]){let G=this._entityManager.getEntitiesWithQuery(j,$);if(G.length===0)return;if(G.length>1)throw Error(`tryGetSingleton: expected 0 or 1 entity but found ${G.length} matching query with=[${String(j)}] without=[${String($)}]`);return G[0]}removeEntity(j,$){return this._entityManager.removeEntity(j,$)}spawnChild(j,$){let G=this._entityManager.spawnChild(j,$);return this._emitHierarchyChanged(G.id,null,j),G}setParent(j,$){let G=this._entityManager.getParent(j);return this._entityManager.setParent(j,$),this._emitHierarchyChanged(j,G,$),this}removeParent(j){let $=this._entityManager.getParent(j),G=this._entityManager.removeParent(j);if(G)this._emitHierarchyChanged(j,$,null);return G}getParent(j){return this._entityManager.getParent(j)}getChildren(j){return this._entityManager.getChildren(j)}getChildAt(j,$){return this._entityManager.getChildAt(j,$)}getChildIndex(j,$){return this._entityManager.getChildIndex(j,$)}getAncestors(j){return this._entityManager.getAncestors(j)}getDescendants(j){return this._entityManager.getDescendants(j)}getRoot(j){return this._entityManager.getRoot(j)}getSiblings(j){return this._entityManager.getSiblings(j)}isDescendantOf(j,$){return this._entityManager.isDescendantOf(j,$)}isAncestorOf(j,$){return this._entityManager.isAncestorOf(j,$)}getRootEntities(){return this._entityManager.getRootEntities()}forEachInHierarchy(j,$){this._entityManager.forEachInHierarchy(j,$)}hierarchyIterator(j){return this._entityManager.hierarchyIterator(j)}_emitHierarchyChanged(j,$,G){this._eventBus.publish("hierarchyChanged",{entityId:j,oldParent:$,newParent:G})}get installedPlugins(){return Array.from(this._installedPlugins)}get entityManager(){return this._entityManager}get eventBus(){return this._finalizePendingBuilders(),this._eventBus}get commands(){return this._commandBuffer}get currentTick(){return this._currentTick}get changeThreshold(){return this._changeThreshold}enableDiagnostics(j){if(this._diagnosticsEnabled=j,!j)this._systemTimings.clear(),this._phaseTimings={preUpdate:0,fixedUpdate:0,update:0,postUpdate:0,render:0}}get diagnosticsEnabled(){return this._diagnosticsEnabled}get systemTimings(){return this._systemTimings}get phaseTimings(){return this._phaseTimings}get entityCount(){return this._entityManager.entityCount}mutateComponent(j,$,G){let J=this._entityManager.getComponent(j,$);if(J===void 0)throw Error(`Entity ${j} does not have component "${String($)}"`);return G(J),this._entityManager.markChanged(j,$),J}markChanged(j,$){this._entityManager.markChanged(j,$)}registerDispose(j,$){this._entityManager.registerDispose(j,$)}registerRequired(j,$,G){if(String(j)===String($))throw Error(`Cannot require a component to depend on itself: '${String(j)}'`);let J=this._requiredComponents.get(j)??[];if(J.some((X)=>X.component===$))throw Error(`Required component '${String($)}' already registered for trigger '${String(j)}'`);this._checkRequiredCycle(j,$),J.push({component:$,factory:G}),this._requiredComponents.set(j,J)}_checkRequiredCycle(j,$){g(j,$,(G)=>this._requiredComponents.get(G))}onComponentAdded(j,$){return this._entityManager.onComponentAdded(j,$)}onComponentRemoved(j,$){return this._entityManager.onComponentRemoved(j,$)}addReactiveQuery(j,$){this._reactiveQueryManager.addQuery(j,$)}removeReactiveQuery(j){return this._reactiveQueryManager.removeQuery(j)}on(j,$){return this._eventBus.subscribe(j,$)}off(j,$){return this._eventBus.unsubscribe(j,$)}onPostUpdate(j){return this._postUpdateHooks.push(j),()=>{let $=this._postUpdateHooks.indexOf(j);if($!==-1)this._postUpdateHooks.splice($,1)}}requireAssetManager(){if(!this._assetManager)throw Error("Asset manager not configured. Use withAssets() in builder.");return this._assetManager}getAsset(j){return this.requireAssetManager().get(j)}tryGetAsset(j){return this._assetManager?.tryGet(j)}getAssetHandle(j){return this.requireAssetManager().getHandle(j)}isAssetLoaded(j){return this._assetManager?.isLoaded(j)??!1}async loadAsset(j){return this.requireAssetManager().loadAsset(j)}async loadAssetGroup(j){return this.requireAssetManager().loadAssetGroup(j)}isAssetGroupLoaded(j){return this._assetManager?.isGroupLoaded(j)??!1}getAssetGroupProgress(j){return this._assetManager?.getGroupProgress(j)??0}requireScreenManager(){if(!this._screenManager)throw Error("Screen manager not configured. Use withScreens() in builder.");return this._screenManager}async setScreen(j,$){return this.requireScreenManager().setScreen(j,$)}async pushScreen(j,$){return this.requireScreenManager().pushScreen(j,$)}async popScreen(){return this.requireScreenManager().popScreen()}getCurrentScreen(){return this._screenManager?.getCurrentScreen()??null}getScreenConfig(j){return this.requireScreenManager().getConfig(j)}tryGetScreenConfig(j){return this._screenManager?.tryGetConfig(j)??void 0}getScreenState(j){return this.requireScreenManager().getState(j)}tryGetScreenState(j){return this._screenManager?.tryGetState(j)??void 0}updateScreenState(j,$){if(typeof j==="string")this.requireScreenManager().updateState($,j);else this.requireScreenManager().updateState(j)}isCurrentScreen(j){return this._screenManager?.isCurrent(j)??!1}isScreenActive(j){return this._screenManager?.isActive(j)??!1}getScreenStackDepth(){return this._screenManager?.getStackDepth()??0}_setAssetManager(j){this._assetManager=j;for(let[$,G]of this._pendingPluginAssets)this._assetManager.register($,G);this._pendingPluginAssets=[]}_setScreenManager(j){this._screenManager=j;for(let[$,G]of this._pendingPluginScreens)this._screenManager.register($,G);this._pendingPluginScreens=[]}_hasPendingPluginAssets(){return this._pendingPluginAssets.length>0}_hasPendingPluginScreens(){return this._pendingPluginScreens.length>0}_setFixedDt(j){this._fixedDt=j}_registerAsset(j,$){this._pendingPluginAssets.push([j,$])}_registerScreen(j,$){this._pendingPluginScreens.push([j,$])}installPlugin(j){if(this._installedPlugins.has(j.id))return this;return this._installedPlugins.add(j.id),j.install(this),this}pluginFactory(){return(j)=>P(j.id).install(j.install)}getHelpers(j){return j(this)}}function Vj(j){return j}function Rj(j,$){return{x:j,y:$}}function wj(){return{x:0,y:0}}function Sj(j,$){return{x:j.x+$.x,y:j.y+$.y}}function Tj(j,$){return{x:j.x-$.x,y:j.y-$.y}}function xj(j,$){return{x:j.x*$,y:j.y*$}}function Cj(j){return{x:-j.x,y:-j.y}}function qj(j,$){return j.x*$.x+j.y*$.y}function vj(j,$){return j.x*$.y-j.y*$.x}function fj(j){return j.x*j.x+j.y*j.y}function bj(j){return Math.sqrt(j.x*j.x+j.y*j.y)}function gj(j){let $=Math.sqrt(j.x*j.x+j.y*j.y);if($===0)return{x:0,y:0};return{x:j.x/$,y:j.y/$}}function Nj(j,$){let G=j.x-$.x,J=j.y-$.y;return G*G+J*J}function hj(j,$){let G=j.x-$.x,J=j.y-$.y;return Math.sqrt(G*G+J*J)}function kj(j,$,G=0.0000000001){return Math.abs(j.x-$.x)<=G&&Math.abs(j.y-$.y)<=G}var aj=z;export{wj as vec2Zero,Tj as vec2Sub,xj as vec2Scale,gj as vec2Normalize,Cj as vec2Negate,fj as vec2LengthSq,bj as vec2Length,kj as vec2Equals,qj as vec2Dot,Nj as vec2DistanceSq,hj as vec2Distance,vj as vec2Cross,Sj as vec2Add,Rj as vec2,I as directValue,P as definePlugin,aj as default,q as createScreenConfigurator,Vj as createQueryDefinition,C as createAssetConfigurator,S as SystemBuilder,K as ScreenManager,U as AssetManager};
2
2
 
3
- //# debugId=3212F06B56962B5F64756E2164756E21
3
+ //# debugId=288843F194C573FA64756E2164756E21
4
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -20,6 +20,6 @@
20
20
  "import ECSpresso from './ecspresso';\nimport { SystemBuilder, type ProcessContext } from './system-builder';\nimport { type Plugin, type BasePluginOptions, definePlugin } from './plugin';\n\nexport * from './types';\nexport * from './asset-types';\nexport * from './screen-types';\nexport * from './utils/math';\nexport type { ReactiveQueryDefinition } from './reactive-query-manager';\nexport { default as AssetManager, createAssetConfigurator } from './asset-manager';\nexport { default as ScreenManager, createScreenConfigurator } from './screen-manager';\nexport { SystemBuilder, type ProcessContext };\nexport { type Plugin, type BasePluginOptions, definePlugin };\nexport { directValue, type ResourceDirectValue } from './resource-manager';\nexport default ECSpresso;\n"
21
21
  ],
22
22
  "mappings": "2PAMA,MAAqB,CAAiB,CAE7B,UAAiC,IAAI,IAErC,YAAqC,IAAI,IAQjD,SAAS,CAAC,EAAiB,EAAwB,CAClD,GAAI,IAAY,EACf,MAAU,MAAM,qBAAqB,qBAA2B,EAIjE,GAAI,KAAK,iBAAiB,EAAS,CAAQ,EAC1C,MAAU,MAAM,oDAAoD,EAIrE,IAAM,EAAY,KAAK,UAAU,IAAI,CAAO,EAC5C,GAAI,IAAc,OAAW,CAC5B,IAAM,EAAc,KAAK,YAAY,IAAI,CAAS,EAClD,GAAI,EAAa,CAChB,IAAM,EAAM,EAAY,QAAQ,CAAO,EACvC,GAAI,IAAQ,GACX,EAAY,OAAO,EAAK,CAAC,GAM5B,KAAK,UAAU,IAAI,EAAS,CAAQ,EAGpC,IAAM,EAAW,KAAK,YAAY,IAAI,CAAQ,EAC9C,GAAI,EACH,EAAS,KAAK,CAAO,EAErB,UAAK,YAAY,IAAI,EAAU,CAAC,CAAO,CAAC,EAGzC,OAAO,KAQR,YAAY,CAAC,EAA0B,CACtC,IAAM,EAAW,KAAK,UAAU,IAAI,CAAO,EAC3C,GAAI,IAAa,OAChB,MAAO,GAIR,IAAM,EAAW,KAAK,YAAY,IAAI,CAAQ,EAC9C,GAAI,EAAU,CACb,IAAM,EAAM,EAAS,QAAQ,CAAO,EACpC,GAAI,IAAQ,GACX,EAAS,OAAO,EAAK,CAAC,EAKxB,OADA,KAAK,UAAU,OAAO,CAAO,EACtB,GAQR,SAAS,CAAC,EAAiC,CAC1C,OAAO,KAAK,UAAU,IAAI,CAAQ,GAAK,KAQxC,WAAW,CAAC,EAAqC,CAChD,IAAM,EAAW,KAAK,YAAY,IAAI,CAAQ,EAC9C,OAAO,EAAW,CAAC,GAAG,CAAQ,EAAI,CAAC,EASpC,UAAU,CAAC,EAAkB,EAA8B,CAC1D,GAAI,EAAQ,EAAG,OAAO,KACtB,IAAM,EAAW,KAAK,YAAY,IAAI,CAAQ,EAC9C,GAAI,CAAC,GAAY,GAAS,EAAS,OAAQ,OAAO,KAClD,OAAO,EAAS,IAAU,KAS3B,aAAa,CAAC,EAAkB,EAAyB,CACxD,IAAM,EAAW,KAAK,YAAY,IAAI,CAAQ,EAC9C,GAAI,CAAC,EAAU,MAAO,GACtB,OAAO,EAAS,QAAQ,CAAO,EAShC,YAAY,CAAC,EAA4E,CACxF,IAAM,EAAY,KAAK,UAAU,IAAI,CAAQ,GAAK,KAGlD,GAAI,IAAc,KAAM,CACvB,IAAM,EAAiB,KAAK,YAAY,IAAI,CAAS,EACrD,GAAI,EAAgB,CACnB,IAAM,EAAM,EAAe,QAAQ,CAAQ,EAC3C,GAAI,IAAQ,GACX,EAAe,OAAO,EAAK,CAAC,GAK/B,KAAK,UAAU,OAAO,CAAQ,EAG9B,IAAM,EAAW,KAAK,YAAY,IAAI,CAAQ,GAAK,CAAC,EAC9C,EAAmB,CAAC,GAAG,CAAQ,EACrC,QAAW,KAAW,EACrB,KAAK,UAAU,OAAO,CAAO,EAI9B,OAFA,KAAK,YAAY,OAAO,CAAQ,EAEzB,CAAE,YAAW,kBAAiB,EAQtC,YAAY,CAAC,EAAqC,CACjD,IAAM,EAAsB,CAAC,EACzB,EAAU,KAAK,UAAU,IAAI,CAAQ,EACzC,MAAO,IAAY,OAClB,EAAU,KAAK,CAAO,EACtB,EAAU,KAAK,UAAU,IAAI,CAAO,EAErC,OAAO,EAQR,cAAc,CAAC,EAAqC,CACnD,IAAM,EAAwB,CAAC,EACzB,EAAkB,KAAK,YAAY,IAAI,CAAQ,EACrD,GAAI,CAAC,EAAiB,OAAO,EAI7B,IAAM,EAAQ,EAAgB,MAAM,EAAE,QAAQ,EAE9C,MAAO,EAAM,OAAS,EAAG,CACxB,IAAM,EAAU,EAAM,IAAI,EAC1B,EAAY,KAAK,CAAO,EACxB,IAAM,EAAW,KAAK,YAAY,IAAI,CAAO,EAC7C,GAAI,EACH,QAAS,EAAI,EAAS,OAAS,EAAG,GAAK,EAAG,IACzC,EAAM,KAAK,EAAS,EAAY,EAKnC,OAAO,EAQR,OAAO,CAAC,EAA0B,CACjC,IAAI,EAAU,EACV,EAAS,KAAK,UAAU,IAAI,CAAO,EACvC,MAAO,IAAW,OACjB,EAAU,EACV,EAAS,KAAK,UAAU,IAAI,CAAO,EAEpC,OAAO,EAQR,WAAW,CAAC,EAAqC,CAChD,IAAM,EAAW,KAAK,UAAU,IAAI,CAAQ,EAC5C,GAAI,IAAa,OAAW,MAAO,CAAC,EAEpC,IAAM,EAAW,KAAK,YAAY,IAAI,CAAQ,EAC9C,GAAI,CAAC,EAAU,MAAO,CAAC,EAEvB,OAAO,EAAS,OAAO,KAAM,IAAO,CAAQ,EAS7C,cAAc,CAAC,EAAkB,EAA6B,CAC7D,GAAI,IAAa,EAAY,MAAO,GAEpC,IAAI,EAAU,KAAK,UAAU,IAAI,CAAQ,EACzC,MAAO,IAAY,OAAW,CAC7B,GAAI,IAAY,EAAY,MAAO,GACnC,EAAU,KAAK,UAAU,IAAI,CAAO,EAErC,MAAO,GASR,YAAY,CAAC,EAAkB,EAA+B,CAC7D,OAAO,KAAK,eAAe,EAAc,CAAQ,EAOlD,eAAe,EAAsB,CACpC,IAAM,EAAkB,CAAC,EACzB,QAAW,KAAY,KAAK,YAAY,KAAK,EAC5C,GAAI,CAAC,KAAK,UAAU,IAAI,CAAQ,EAC/B,EAAM,KAAK,CAAQ,EAGrB,OAAO,EAOA,gBAAgB,CAAC,EAAiB,EAA2B,CACpE,IAAI,EAA8B,EAClC,MAAO,IAAY,OAAW,CAC7B,GAAI,IAAY,EACf,MAAO,GAER,EAAU,KAAK,UAAU,IAAI,CAAO,EAErC,MAAO,GASR,kBAAkB,CACjB,EACA,EACO,CACP,IAAM,EAAQ,GAAS,OAAS,KAAK,gBAAgB,EAC/C,EAA6E,CAAC,EAGpF,QAAW,KAAM,EAChB,EAAM,KAAK,CAAE,SAAU,EAAI,SAAU,KAAM,MAAO,CAAE,CAAC,EAGtD,QAAW,KAAW,EAAO,CAC5B,EAAS,EAAQ,SAAU,EAAQ,SAAU,EAAQ,KAAK,EAE1D,IAAM,EAAW,KAAK,YAAY,IAAI,EAAQ,QAAQ,EACtD,GAAI,EACH,QAAW,KAAW,EACrB,EAAM,KAAK,CACV,SAAU,EACV,SAAU,EAAQ,SAClB,MAAO,EAAQ,MAAQ,CACxB,CAAC,IAYJ,iBAAiB,CAAC,EAA8E,CAChG,IAAM,EAAQ,GAAS,OAAS,KAAK,gBAAgB,EAC/C,EAA0B,CAAC,EAGjC,QAAW,KAAM,EAChB,EAAM,KAAK,CAAE,SAAU,EAAI,SAAU,KAAM,MAAO,CAAE,CAAC,EAGtD,QAAW,KAAW,EAAO,CAC5B,MAAM,EAEN,IAAM,EAAW,KAAK,YAAY,IAAI,EAAQ,QAAQ,EACtD,GAAI,EACH,QAAW,KAAW,EACrB,EAAM,KAAK,CACV,SAAU,EACV,SAAU,EAAQ,SAClB,MAAO,EAAQ,MAAQ,CACxB,CAAC,GAKN,CClVA,MAAM,CAA6B,CACjB,UAAiD,CAAC,EAC3D,WAAa,EACb,iBAAwD,CAAC,EAEjE,GAAG,CAAC,EAA6C,CAChD,KAAK,UAAU,KAAK,CAAE,EAGvB,MAAM,CAAC,EAA6C,CACnD,GAAI,KAAK,WAAa,EAAG,CACxB,KAAK,iBAAiB,KAAK,CAAE,EAC7B,OAED,IAAM,EAAM,KAAK,UAAU,QAAQ,CAAE,EACrC,GAAI,IAAQ,GAAI,KAAK,UAAU,OAAO,EAAK,CAAC,EAG7C,MAAM,CAAC,EAA+D,CACrE,KAAK,aACL,IAAM,EAAM,KAAK,UAAU,OAC3B,QAAS,EAAI,EAAG,EAAI,EAAK,IAAK,CAC7B,IAAM,EAAK,KAAK,UAAU,GAC1B,GAAI,EAAI,EAAG,CAAG,EAGf,GADA,KAAK,aACD,KAAK,aAAe,GAAK,KAAK,iBAAiB,OAAS,EAAG,CAC9D,QAAW,KAAM,KAAK,iBAAkB,CACvC,IAAM,EAAM,KAAK,UAAU,QAAQ,CAAE,EACrC,GAAI,IAAQ,GAAI,KAAK,UAAU,OAAO,EAAK,CAAC,EAE7C,KAAK,iBAAiB,OAAS,GAGlC,CAEA,MACM,CAA8B,CAC3B,OAAiB,EACjB,SAAgD,IAAI,IACpD,iBAA2D,IAAI,IAI/D,eAA0E,IAAI,IAI9E,iBAA4E,IAAI,IAIhF,iBAAqC,IAAI,EAKzC,iBAAmG,IAAI,IAKvG,WAA6D,IAAI,IAKjE,WAAqB,EAGrB,0BAAoG,CAAC,EACrG,yBAA8D,CAAC,EAC/D,4BAAsG,CAAC,EACvG,0BAA+D,CAAC,EAChE,yBAA6D,CAAC,EAG9D,eAAyB,EACzB,kBAAiC,IAAI,IAG7C,kBAA8D,QAE1D,YAAW,EAAW,CACzB,OAAO,KAAK,SAAS,KAGtB,YAAY,EAA2B,CACtC,IAAM,EAAK,KAAK,SACV,EAAiC,CAAE,KAAI,WAAY,CAAC,CAAE,EAE5D,OADA,KAAK,SAAS,IAAI,EAAI,CAAM,EACrB,EAUR,eAA2D,CAC1D,EACA,EACO,CACP,KAAK,iBAAiB,IAAI,EAAe,CAA+D,EAOzG,mBAAmB,EAAmF,CACrG,OAAO,KAAK,iBAOL,aAAyD,CAChE,EACA,EACA,EACO,CACP,IAAM,EAAK,KAAK,iBAAiB,IAAI,CAAa,EAClD,GAAI,CAAC,EAAI,OACT,GAAI,CACH,EAAG,CAAE,QAAO,UAAS,CAAC,EACrB,MAAO,EAAO,CACf,QAAQ,KAAK,mCAAmC,OAAO,CAAa,YAAa,CAAK,GAKxF,YAAwD,CACvD,EACA,EACA,EACC,CACD,IAAM,EAAS,KAAK,SAAS,IAAI,CAAQ,EAEzC,GAAI,CAAC,EACJ,MAAU,MAAM,yBAAyB,OAAO,CAAa,sBAAsB,kBAAyB,EAI7G,IAAM,EAAW,EAAO,WAAW,GACnC,GAAI,IAAa,OAChB,KAAK,cAAc,EAAe,EAA2C,EAAO,EAAE,EAMvF,GAHA,EAAO,WAAW,GAAiB,EAG/B,CAAC,KAAK,iBAAiB,IAAI,CAAa,EAC3C,KAAK,iBAAiB,IAAI,EAAe,IAAI,GAAK,EAEnD,KAAK,iBAAiB,IAAI,CAAa,GAAG,IAAI,EAAO,EAAE,EAEvD,IAAM,EAAY,KAAK,eAAe,IAAI,CAAa,EACvD,GAAI,EACH,EAAU,OAAO,CAAE,MAAO,EAAM,QAAO,CAAC,EAIzC,KAAK,iBACL,QAAW,KAAQ,KAAK,0BACvB,EAAK,EAAO,GAAI,CAAa,EAM9B,GAJA,KAAK,kBAAkB,IAAI,EAAO,EAAE,EACpC,KAAK,iBAGD,KAAK,iBAAmB,EAAG,CAC9B,QAAW,KAAY,KAAK,kBAC3B,QAAW,KAAQ,KAAK,yBACvB,EAAK,CAAQ,EAGf,KAAK,kBAAkB,MAAM,EAG9B,OAAO,KAQR,aAEC,CACA,EACA,EACC,CACD,IAAM,EAAS,KAAK,SAAS,IAAI,CAAQ,EAEzC,GAAI,CAAC,EACJ,MAAU,MAAM,yCAAyC,kBAAyB,EAGnF,IAAM,EAAe,KAAK,kBAC1B,KAAK,kBAAoB,IAAI,IAAI,OAAO,KAAK,CAAU,CAA6B,EACpF,KAAK,iBACL,QAAW,KAAiB,EAC3B,KAAK,aACJ,EAAO,GACP,EACA,EAAW,EACZ,EAKD,GAHA,KAAK,iBACL,KAAK,kBAAoB,EAErB,KAAK,iBAAmB,EAAG,CAC9B,QAAW,KAAY,KAAK,kBAC3B,QAAW,KAAQ,KAAK,yBACvB,EAAK,CAAQ,EAGf,KAAK,kBAAkB,MAAM,EAG9B,OAAO,KAGR,eAA2D,CAC1D,EACA,EACC,CACD,IAAM,EAAS,KAAK,SAAS,IAAI,CAAQ,EAEzC,GAAI,CAAC,EACJ,MAAU,MAAM,4BAA4B,OAAO,CAAa,sBAAsB,kBAAyB,EAGhH,IAAM,EAAW,EAAO,WAAW,GAGnC,GAAI,IAAa,OAChB,KAAK,cAAc,EAAe,EAAU,EAAO,EAAE,EAGtD,OAAO,EAAO,WAAW,GAGzB,IAAM,EAAY,KAAK,iBAAiB,IAAI,CAAa,EACzD,GAAI,GAAa,IAAa,OAC7B,EAAU,OAAO,CAAE,MAAO,EAAU,QAAO,CAAC,EAO7C,GAHA,KAAK,iBAAiB,IAAI,CAAa,GAAG,OAAO,EAAO,EAAE,EAGtD,IAAa,OAChB,QAAW,KAAQ,KAAK,4BACvB,EAAK,EAAO,GAAI,CAAa,EAI/B,OAAO,KAGR,YAAwD,CAAC,EAAkB,EAAyE,CACnJ,IAAM,EAAS,KAAK,SAAS,IAAI,CAAQ,EAEzC,GAAI,CAAC,EAAQ,MAAU,MAAM,yBAAyB,OAAO,CAAa,sBAAsB,kBAAyB,EAEzH,OAAO,EAAO,WAAW,GAG1B,oBAGC,CACA,EAA0C,CAAC,EAC3C,EAA6C,CAAC,EAC9C,EACA,EACA,EAC4J,CAC5J,OAAO,KAAK,yBAAyB,CAAC,EAAG,EAAU,EAAU,EAAS,EAAiB,CAAS,EAOjG,wBAGC,CACA,EACA,EAA0C,CAAC,EAC3C,EAA6C,CAAC,EAC9C,EACA,EACA,EAC4J,CAC5J,EAAO,OAAS,EAEhB,IAAM,EAAmB,IAAY,QAAa,EAAQ,OAAS,GAAK,IAAoB,OACtF,EAAqB,IAAc,QAAa,EAAU,OAAS,EAMzE,GAAI,EAAS,SAAW,EAAG,CAC1B,GAAI,EAAS,SAAW,GAAK,CAAC,GAAoB,CAAC,EAAoB,CACtE,QAAW,KAAU,KAAK,SAAS,OAAO,EACzC,EAAO,KAAK,CAAgC,EAE7C,OAAO,EAGR,QAAW,KAAU,KAAK,SAAS,OAAO,EAAG,CAC5C,GAAI,EAAS,OAAS,GAAK,CAAC,EAAS,MAAM,KAAQ,EAAE,KAAQ,EAAO,WAAW,EAC9E,SAED,GAAI,EAAkB,CACrB,IAAM,EAAa,KAAK,WAAW,IAAI,EAAO,EAAE,EAChD,GAAI,CAAC,EAAY,SACjB,GAAI,CAAC,EAAQ,KAAK,MAAS,EAAW,IAAI,CAAI,GAAK,IAAM,CAAe,EAAG,SAE5E,GAAI,GAAsB,CAAC,KAAK,oBAAoB,EAAO,GAAI,CAAS,EACvE,SAED,EAAO,KAAK,CAAgC,EAE7C,OAAO,EAIR,IAAM,EAAgB,EAAS,GAC/B,GAAI,IAAkB,OAAW,OAAO,EACxC,IAAM,EAAoB,EAAS,OAAO,CAAC,EAAU,IAAS,CAC7D,IAAM,EAAc,KAAK,iBAAiB,IAAI,CAAI,GAAG,MAAQ,EACvD,EAAe,KAAK,iBAAiB,IAAI,CAAQ,GAAG,MAAQ,IAClE,OAAO,EAAc,EAAe,EAAO,GACzC,CAAa,EAGV,EAAe,KAAK,iBAAiB,IAAI,CAAiB,EAChE,GAAI,CAAC,GAAgB,EAAa,OAAS,EAC1C,OAAO,EAGR,IAAM,EAAgB,EAAS,OAAS,EAExC,QAAW,KAAM,EAAc,CAC9B,IAAM,EAAS,KAAK,SAAS,IAAI,CAAE,EACnC,GACC,GACA,EAAS,MAAM,MAAQ,KAAQ,EAAO,WAAU,IAC/C,CAAC,GAAiB,EAAS,MAAM,KAAQ,EAAE,KAAQ,EAAO,WAAW,GACrE,CACD,GAAI,EAAkB,CACrB,IAAM,EAAa,KAAK,WAAW,IAAI,CAAE,EACzC,GAAI,CAAC,GAAc,CAAC,EAAQ,KAAK,MAAS,EAAW,IAAI,CAAI,GAAK,IAAM,CAAe,EACtF,SAGF,GAAI,GAAsB,CAAC,KAAK,oBAAoB,EAAI,CAAS,EAChE,SAED,EAAO,KAAK,CAAgC,GAI9C,OAAO,EAMA,mBAAmB,CAAC,EAAkB,EAA0D,CACvG,IAAM,EAAW,KAAK,iBAAiB,UAAU,CAAQ,EACzD,GAAI,IAAa,KAAM,MAAO,GAE9B,IAAM,EAAe,KAAK,SAAS,IAAI,CAAQ,EAC/C,GAAI,CAAC,EAAc,MAAO,GAE1B,QAAW,KAAQ,EAClB,GAAI,EAAE,KAAQ,EAAa,YAC1B,MAAO,GAGT,MAAO,GAGR,YAAY,CAAC,EAAkB,EAAwC,CACtE,IAAM,EAAS,KAAK,SAAS,IAAI,CAAQ,EAEzC,GAAI,CAAC,EAAQ,MAAO,GAIpB,GAFgB,GAAS,SAAW,GAEvB,CAEZ,IAAM,EAAc,KAAK,iBAAiB,eAAe,EAAO,EAAE,EAElE,QAAS,EAAI,EAAY,OAAS,EAAG,GAAK,EAAG,IAAK,CACjD,IAAM,EAAe,EAAY,GACjC,GAAI,IAAiB,OAAW,SAChC,QAAW,KAAQ,KAAK,0BACvB,EAAK,CAAY,EAInB,QAAW,KAAQ,KAAK,0BACvB,EAAK,EAAO,EAAE,EAGf,QAAS,EAAI,EAAY,OAAS,EAAG,GAAK,EAAG,IAAK,CACjD,IAAM,EAAe,EAAY,GACjC,GAAI,IAAiB,OAAW,SAChC,KAAK,qBAAqB,CAAY,GAIvC,aAAW,KAAQ,KAAK,0BACvB,EAAK,EAAO,EAAE,EAIhB,OAAO,KAAK,qBAAqB,EAAO,EAAE,EAMnC,oBAAoB,CAAC,EAA2B,CACvD,IAAM,EAAS,KAAK,SAAS,IAAI,CAAQ,EACzC,GAAI,CAAC,EAAQ,MAAO,GAGpB,KAAK,iBAAiB,aAAa,CAAQ,EAG3C,QAAW,KAAiB,OAAO,KAAK,EAAO,UAAU,EAAkC,CAC1F,IAAM,EAAW,EAAO,WAAW,GAEnC,GAAI,IAAa,OAAW,CAE3B,KAAK,cAAc,EAAe,EAAkD,EAAO,EAAE,EAG7F,IAAM,EAAY,KAAK,iBAAiB,IAAI,CAAa,EACzD,GAAI,EACH,EAAU,OAAO,CAAE,MAAO,EAAU,QAAO,CAAC,EAK9C,KAAK,iBAAiB,IAAI,CAAa,GAAG,OAAO,EAAO,EAAE,EAO3D,OAHA,KAAK,WAAW,OAAO,EAAO,EAAE,EAGzB,KAAK,SAAS,OAAO,EAAO,EAAE,EAGtC,SAAS,CAAC,EAAsD,CAC/D,OAAO,KAAK,SAAS,IAAI,CAAQ,EASlC,gBAA4D,CAC3D,EACA,EACa,CACb,IAAM,EAAU,EACZ,EAAO,KAAK,eAAe,IAAI,CAAa,EAChD,GAAI,CAAC,EACJ,EAAO,IAAI,EACX,KAAK,eAAe,IAAI,EAAe,CAAI,EAG5C,OADA,EAAK,IAAI,CAAO,EACT,IAAM,CACZ,KAAK,eAAe,IAAI,CAAa,GAAG,OAAO,CAAO,GAUxD,kBAA8D,CAC7D,EACA,EACa,CACb,IAAM,EAAU,EACZ,EAAO,KAAK,iBAAiB,IAAI,CAAa,EAClD,GAAI,CAAC,EACJ,EAAO,IAAI,EACX,KAAK,iBAAiB,IAAI,EAAe,CAAI,EAG9C,OADA,EAAK,IAAI,CAAO,EACT,IAAM,CACZ,KAAK,iBAAiB,IAAI,CAAa,GAAG,OAAO,CAAO,GAM1D,qBAAqB,CAAC,EAAmF,CAExG,OADA,KAAK,0BAA0B,KAAK,CAAI,EACjC,IAAM,CACZ,IAAM,EAAM,KAAK,0BAA0B,QAAQ,CAAI,EACvD,GAAI,IAAQ,GAAI,KAAK,0BAA0B,OAAO,EAAK,CAAC,GAI9D,oBAAoB,CAAC,EAA8C,CAElE,OADA,KAAK,yBAAyB,KAAK,CAAI,EAChC,IAAM,CACZ,IAAM,EAAM,KAAK,yBAAyB,QAAQ,CAAI,EACtD,GAAI,IAAQ,GAAI,KAAK,yBAAyB,OAAO,EAAK,CAAC,GAI7D,uBAAuB,CAAC,EAAmF,CAE1G,OADA,KAAK,4BAA4B,KAAK,CAAI,EACnC,IAAM,CACZ,IAAM,EAAM,KAAK,4BAA4B,QAAQ,CAAI,EACzD,GAAI,IAAQ,GAAI,KAAK,4BAA4B,OAAO,EAAK,CAAC,GAIhE,qBAAqB,CAAC,EAA8C,CAEnE,OADA,KAAK,0BAA0B,KAAK,CAAI,EACjC,IAAM,CACZ,IAAM,EAAM,KAAK,0BAA0B,QAAQ,CAAI,EACvD,GAAI,IAAQ,GAAI,KAAK,0BAA0B,OAAO,EAAK,CAAC,GAI9D,oBAAoB,CAAC,EAA6C,CAEjE,OADA,KAAK,yBAAyB,KAAK,CAAI,EAChC,IAAM,CACZ,IAAM,EAAM,KAAK,yBAAyB,QAAQ,CAAI,EACtD,GAAI,IAAQ,GAAI,KAAK,yBAAyB,OAAO,EAAK,CAAC,MAUzD,UAAS,EAAW,CACvB,OAAO,KAAK,WAQb,WAA2C,CAAC,EAAkB,EAAwB,CACrF,IAAM,EAAM,EAAE,KAAK,WACf,EAAa,KAAK,WAAW,IAAI,CAAQ,EAC7C,GAAI,CAAC,EACJ,EAAa,IAAI,IACjB,KAAK,WAAW,IAAI,EAAU,CAAU,EAEzC,EAAW,IAAI,EAAe,CAAG,EASlC,YAA4C,CAAC,EAAkB,EAA0B,CACxF,OAAO,KAAK,WAAW,IAAI,CAAQ,GAAG,IAAI,CAAa,GAAK,GAW7D,UAAyE,CACxE,EACA,EACiE,CACjE,IAAM,EAAS,KAAK,aAAa,EAGjC,OAFA,KAAK,cAAc,EAAO,GAAI,CAAU,EACxC,KAAK,UAAU,EAAO,GAAI,CAAQ,EAC3B,EAQR,SAAS,CAAC,EAAiB,EAAwB,CAClD,KAAK,iBAAiB,UAAU,EAAS,CAAQ,EACjD,QAAW,KAAQ,KAAK,yBACvB,EAAK,CAAO,EAEb,OAAO,KAQR,YAAY,CAAC,EAA0B,CACtC,IAAM,EAAS,KAAK,iBAAiB,aAAa,CAAO,EACzD,GAAI,EACH,QAAW,KAAQ,KAAK,yBACvB,EAAK,CAAO,EAGd,OAAO,EAQR,SAAS,CAAC,EAAiC,CAC1C,OAAO,KAAK,iBAAiB,UAAU,CAAQ,EAQhD,WAAW,CAAC,EAAqC,CAChD,OAAO,KAAK,iBAAiB,YAAY,CAAQ,EASlD,UAAU,CAAC,EAAkB,EAA8B,CAC1D,OAAO,KAAK,iBAAiB,WAAW,EAAU,CAAK,EASxD,aAAa,CAAC,EAAkB,EAAyB,CACxD,OAAO,KAAK,iBAAiB,cAAc,EAAU,CAAO,EAQ7D,YAAY,CAAC,EAAqC,CACjD,OAAO,KAAK,iBAAiB,aAAa,CAAQ,EAQnD,cAAc,CAAC,EAAqC,CACnD,OAAO,KAAK,iBAAiB,eAAe,CAAQ,EAQrD,OAAO,CAAC,EAA0B,CACjC,OAAO,KAAK,iBAAiB,QAAQ,CAAQ,EAQ9C,WAAW,CAAC,EAAqC,CAChD,OAAO,KAAK,iBAAiB,YAAY,CAAQ,EASlD,cAAc,CAAC,EAAkB,EAA6B,CAC7D,OAAO,KAAK,iBAAiB,eAAe,EAAU,CAAU,EASjE,YAAY,CAAC,EAAkB,EAA+B,CAC7D,OAAO,KAAK,iBAAiB,aAAa,EAAU,CAAY,EAOjE,eAAe,EAAsB,CACpC,OAAO,KAAK,iBAAiB,gBAAgB,EAS9C,kBAAkB,CACjB,EACA,EACO,CACP,KAAK,iBAAiB,mBAAmB,EAAU,CAAO,EAS3D,iBAAiB,CAAC,EAA8E,CAC/F,OAAO,KAAK,iBAAiB,kBAAkB,CAAO,EAExD,CChwBA,MACM,CAAqB,CAClB,SAA4D,IAAI,IAKxE,SAAqC,CACpC,EACA,EACa,CACb,OAAO,KAAK,WAAW,EAAW,EAAU,EAAK,EAMlD,IAAgC,CAC/B,EACA,EACa,CACb,OAAO,KAAK,WAAW,EAAW,EAAU,EAAI,EAOjD,WAAuC,CACtC,EACA,EACU,CACV,IAAM,EAAW,KAAK,SAAS,IAAI,CAAS,EAC5C,GAAI,CAAC,EAAU,MAAO,GAEtB,IAAM,EAAQ,EAAS,UAAU,KAAK,EAAE,WAAa,CAAQ,EAC7D,GAAI,IAAU,GAAI,MAAO,GAGzB,OADA,EAAS,OAAO,EAAO,CAAC,EACjB,GAMA,UAAsC,CAC7C,EACA,EACA,EACa,CACb,IAAI,EAAW,KAAK,SAAS,IAAI,CAAS,EAC1C,GAAI,CAAC,EACJ,EAAW,CAAC,EACZ,KAAK,SAAS,IAAI,EAAW,CAAQ,EAGtC,IAAM,EAA6B,CAClC,WACA,MACD,EAKA,OAHA,EAAS,KAAK,CAAO,EAGd,IAAM,CACZ,IAAM,EAAW,KAAK,SAAS,IAAI,CAAS,EAC5C,GAAI,EAAU,CACb,IAAM,EAAQ,EAAS,QAAQ,CAAO,EACtC,GAAI,IAAU,GACb,EAAS,OAAO,EAAO,CAAC,IAW5B,OAAmC,KAC9B,EAAW,GAGR,CACP,IAAM,EAAW,KAAK,SAAS,IAAI,CAAS,EAC5C,GAAI,CAAC,GAAY,EAAS,SAAW,EAAG,OAGxC,IAAI,EAAU,GACR,EAAM,EAAS,OACrB,QAAS,EAAI,EAAG,EAAI,GAAO,EAAI,EAAS,OAAQ,IAAK,CACpD,IAAM,EAAU,EAAS,GACzB,GAAI,CAAC,EAAS,SAEd,GADA,EAAQ,SAAS,CAAqB,EAClC,EAAQ,KAAM,EAAU,GAI7B,GAAI,GACH,QAAS,EAAI,EAAS,OAAS,EAAG,GAAK,EAAG,IACzC,GAAI,EAAS,IAAI,KAChB,EAAS,OAAO,EAAG,CAAC,GAMxB,KAAK,EAAS,CACb,KAAK,SAAS,MAAM,EAGrB,UAAsC,CAAC,EAAoB,CAC1D,KAAK,SAAS,OAAO,CAAS,EAEhC,CC9GO,IAAM,EAAiC,OAAO,iBAAiB,EAuB/D,SAAS,CAAc,CAAC,EAAkC,CAChE,MAAO,EAAG,GAAkB,CAAM,EAMnC,SAAS,CAAoB,CAAC,EAA2D,CACxF,OACC,OAAO,IAAa,UACpB,IAAa,MACb,YAAa,GACb,OAAQ,EAAwC,UAAY,WAO9D,SAAS,CAAgB,CAAC,EAAuD,CAChF,OACC,OAAO,IAAa,UACpB,IAAa,MACb,KAAmB,EAOrB,SAAS,CAAiC,CACzC,EACA,EACM,CACN,IAAM,EAAc,CAAC,EACf,EAAU,IAAI,IACd,EAAW,IAAI,IAErB,SAAS,CAAK,CAAC,EAAQ,EAAY,CAAC,EAAS,CAC5C,GAAI,EAAQ,IAAI,CAAG,EAAG,OACtB,GAAI,EAAS,IAAI,CAAG,EACnB,MAAU,MAAM,iCAAiC,CAAC,GAAG,EAAM,CAAG,EAAE,KAAK,MAAM,GAAG,EAG/E,EAAS,IAAI,CAAG,EAChB,QAAW,KAAO,EAAQ,CAAG,EAAG,CAC/B,IAAM,EAAQ,EAAK,KAAK,KAAK,IAAM,CAAG,EACtC,GAAI,EACH,EAAM,EAAO,CAAC,GAAG,EAAM,CAAG,CAAC,EAG7B,EAAS,OAAO,CAAG,EACnB,EAAQ,IAAI,CAAG,EACf,EAAO,KAAK,CAAG,EAGhB,QAAW,KAAO,EACjB,EAAM,CAAG,EAEV,OAAO,EASR,MACM,CAGJ,CACO,UAA2C,IAAI,IAC/C,kBAAwF,IAAI,IAC5F,qBAA4F,IAAI,IAChG,kBAAyG,IAAI,IAC7G,wBAAoD,IAAI,IACxD,mBAA4F,IAAI,IAexG,GAAkC,CACjC,EACA,EAKC,CACD,IAAM,EAAa,CAAC,IAAmB,CACtC,KAAK,UAAU,IAAI,EAAO,CAAK,EAC/B,KAAK,wBAAwB,IAAI,CAAK,EACtC,KAAK,qBAAqB,IAAI,EAAO,CAAC,CAAC,GAGxC,GAAI,EAAoC,CAAQ,GAK/C,GAHA,KAAK,kBAAkB,IAAI,EAAO,EAAS,OAAmD,EAE9F,KAAK,qBAAqB,IAAI,EAAQ,EAAS,WAAa,CAAC,CAA+C,EACxG,EAAS,UACZ,KAAK,kBAAkB,IAAI,EAAO,EAAS,SAAsE,EAE5G,QAAI,EAAgC,CAAQ,EAClD,EAAW,EAAS,EAAgB,EAC9B,QAAI,OAAO,IAAa,WAE9B,KAAK,kBAAkB,IAAI,EAAO,CAAoD,EACtF,KAAK,qBAAqB,IAAI,EAAO,CAAC,CAAC,EAEvC,OAAW,CAAQ,EAEpB,OAAO,KAYR,MAAqC,CACpC,KACG,EAC4B,CAC/B,GAAI,CAAC,KAAK,IAAI,CAAK,EAAG,OACtB,OAAO,KAAK,IAAI,EAAO,GAAG,CAAI,EAW/B,GAAkC,CACjC,KACG,EACgB,CAEnB,IAAM,EAAW,KAAK,UAAU,IAAI,CAAK,EACzC,GAAI,IAAa,OAChB,OAAO,EAIR,IAAM,EAAU,KAAK,kBAAkB,IAAI,CAAK,EAChD,GAAI,IAAY,OACf,MAAU,MAAM,YAAY,OAAO,CAAK,aAAa,EAItD,IAAM,EAAU,EAAK,GACf,EAAsB,EAAQ,CAAO,EAG3C,GAAI,EAAE,aAA+B,SACpC,KAAK,UAAU,IAAI,EAAO,CAAmB,EAC7C,KAAK,wBAAwB,IAAI,CAAK,EAGvC,OAAO,EAQR,GAAkC,CAAC,EAAmB,CACrD,OAAO,KAAK,UAAU,IAAI,CAAK,GAAK,KAAK,kBAAkB,IAAI,CAAK,EAQrE,MAAqC,CAAC,EAAmB,CACxD,IAAM,EAAkB,KAAK,UAAU,OAAO,CAAK,EAC7C,EAAiB,KAAK,kBAAkB,OAAO,CAAK,EAI1D,OAHA,KAAK,qBAAqB,OAAO,CAAK,EACtC,KAAK,kBAAkB,OAAO,CAAK,EACnC,KAAK,wBAAwB,OAAO,CAAK,EAClC,GAAmB,EAO3B,OAAO,EAA+B,CACrC,IAAM,EAAO,IAAI,IAAI,CACpB,GAAG,KAAK,UAAU,KAAK,EACvB,GAAG,KAAK,kBAAkB,KAAK,CAChC,CAAC,EACD,OAAO,MAAM,KAAK,CAAI,EAQvB,mBAAkD,CAAC,EAAmB,CACrE,OAAO,KAAK,kBAAkB,IAAI,CAAK,GAAK,CAAC,KAAK,wBAAwB,IAAI,CAAK,EAOpF,4BAA4B,EAA+B,CAC1D,OAAO,MACL,KAAK,KAAK,kBAAkB,KAAK,CAAC,EAClC,OAAO,KAAO,CAAC,KAAK,wBAAwB,IAAI,CAAG,CAAC,OASjD,mBAAiD,CACtD,KACG,EACa,CAChB,GAAI,CAAC,KAAK,kBAAkB,IAAI,CAAK,GAAK,KAAK,wBAAwB,IAAI,CAAK,EAC/E,OAGD,IAAM,EAAU,KAAK,kBAAkB,IAAI,CAAK,EAChD,GAAI,CAAC,EAAS,OACd,IAAM,EAAU,EAAK,GACf,EAAsB,MAAM,EAAQ,CAAO,EACjD,KAAK,UAAU,IAAI,EAAO,CAAmB,EAC7C,KAAK,wBAAwB,IAAI,CAAK,EACtC,KAAK,kBAAkB,OAAO,CAAK,OAU9B,oBAAkD,IACpD,EACa,CAEhB,IAAM,EAAO,EAAK,MAAM,CAAC,EAGnB,EAAa,EAAK,SAAW,EAChC,KAAK,6BAA6B,EAClC,EAGH,GAAI,EAAW,SAAW,EAAG,OAG7B,IAAM,EAAa,EAClB,EACA,CAAC,IAAQ,CAAC,GAAI,KAAK,qBAAqB,IAAI,CAAG,GAAK,CAAC,CAAE,CACxD,EAGA,QAAW,KAAO,EACjB,MAAM,KAAK,mBAAmB,EAAK,GAAG,EAAK,MAAM,EAAG,CAAC,CAAyB,EAShF,eAA8C,CAAC,EAAqD,CACnG,OAAO,KAAK,qBAAqB,IAAI,CAAK,GAAK,CAAC,OAS3C,gBAA8C,CACnD,KACG,EACgB,CACnB,GAAI,CAAC,KAAK,UAAU,IAAI,CAAK,GAAK,CAAC,KAAK,kBAAkB,IAAI,CAAK,EAClE,MAAO,GAIR,GAAI,KAAK,wBAAwB,IAAI,CAAK,EAAG,CAC5C,IAAM,EAAW,KAAK,kBAAkB,IAAI,CAAK,EAC3C,EAAW,KAAK,UAAU,IAAI,CAAK,EACzC,GAAI,GAAY,IAAa,OAAW,CACvC,IAAM,EAAU,EAAK,GACrB,MAAM,EAAS,EAAU,CAAO,GAYlC,OAPA,KAAK,UAAU,OAAO,CAAK,EAC3B,KAAK,kBAAkB,OAAO,CAAK,EACnC,KAAK,qBAAqB,OAAO,CAAK,EACtC,KAAK,kBAAkB,OAAO,CAAK,EACnC,KAAK,wBAAwB,OAAO,CAAK,EACzC,KAAK,mBAAmB,OAAO,CAAK,EAE7B,GASR,gBAA+C,CAC9C,EACA,EACa,CACb,IAAM,EAAW,KAAK,mBAAmB,IAAI,CAAG,EAC1C,EAAc,GAAY,IAAI,IACpC,GAAI,CAAC,EACJ,KAAK,mBAAmB,IAAI,EAAK,CAAW,EAE7C,IAAM,EAAU,EAGhB,OAFA,EAAY,IAAI,CAAO,EAEhB,IAAM,CAEZ,GADA,EAAY,OAAO,CAAO,EACtB,EAAY,OAAS,EACxB,KAAK,mBAAmB,OAAO,CAAG,GAYrC,YAA2C,CAC1C,EACA,EACA,EACO,CACP,GAAI,OAAO,GAAG,EAAU,CAAQ,EAAG,OACnC,IAAM,EAAc,KAAK,mBAAmB,IAAI,CAAG,EACnD,GAAI,CAAC,GAAe,EAAY,OAAS,EAAG,OAC5C,IAAM,EAAW,CAAC,GAAG,CAAW,EAChC,QAAW,KAAM,EAChB,EAAG,EAAU,CAAQ,OASjB,iBAAgB,IAClB,EACa,CAEhB,IAAM,EAAkB,MAAM,KAAK,KAAK,uBAAuB,EAE/D,GAAI,EAAgB,SAAW,EAAG,OAGlC,IAAM,EAAa,EAClB,EACA,CAAC,IAAQ,CAAC,GAAI,KAAK,qBAAqB,IAAI,CAAG,GAAK,CAAC,CAAE,CACxD,EAAE,QAAQ,EAGV,QAAW,KAAO,EACjB,MAAM,KAAK,gBAAgB,EAAK,GAAG,CAAI,EAG1C,CCrZA,MAAqB,CAAqG,CACjH,QAAoD,IAAI,IACxD,cAEA,qBAAgC,GAExC,WAAW,CAAC,EAA8C,CACzD,KAAK,cAAgB,KAMlB,oBAAmB,EAAY,CAClC,OAAO,KAAK,qBAQb,QAIC,CACA,EACA,EACO,CACP,IAAM,EAA2C,CAChD,aACA,iBAAkB,IAAI,GACvB,EAKA,GAHA,KAAK,QAAQ,IAAI,EAAM,CAAW,EAG9B,EAAW,WAAW,OACzB,KAAK,qBAAuB,GAI7B,IAAM,EAAkB,KAAK,cAAc,qBAC1C,EAAW,KACV,EAAW,SAAW,CAAC,CACzB,EAEA,QAAW,KAAU,EACpB,GAAI,KAAK,mBAAmB,EAAQ,EAAY,UAAU,EACzD,EAAY,iBAAiB,IAAI,EAAO,EAAE,EAC1C,EAAY,WAAW,UAAU,CAAuD,EAU3F,WAAW,CAAC,EAA2B,CACtC,IAAM,EAAS,KAAK,QAAQ,OAAO,CAAI,EAGvC,GAAI,EACH,KAAK,qBAAqB,EAG3B,OAAO,EAMA,kBAAkB,CACzB,EACA,EACU,CAEV,QAAW,KAAQ,EAAW,KAC7B,GAAI,EAAE,KAAQ,EAAO,YACpB,MAAO,GAKT,GAAI,EAAW,SACd,QAAW,KAAQ,EAAW,QAC7B,GAAI,KAAQ,EAAO,WAClB,MAAO,GAMV,GAAI,EAAW,WAAW,OAAQ,CACjC,IAAM,EAAW,KAAK,cAAc,UAAU,EAAO,EAAE,EACvD,GAAI,IAAa,KAAM,MAAO,GAE9B,IAAM,EAAe,KAAK,cAAc,UAAU,CAAQ,EAC1D,GAAI,CAAC,EAAc,MAAO,GAE1B,QAAW,KAAQ,EAAW,UAC7B,GAAI,EAAE,KAAQ,EAAa,YAC1B,MAAO,GAKV,MAAO,GAOA,qBAAqB,CAAC,EAAgC,EAA0C,CACvG,IAAM,EAAc,EAAM,iBAAiB,IAAI,EAAO,EAAE,EAClD,EAAa,KAAK,mBAAmB,EAAQ,EAAM,UAAU,EAEnE,GAAI,CAAC,GAAe,EACnB,EAAM,iBAAiB,IAAI,EAAO,EAAE,EACpC,EAAM,WAAW,UAAU,CAAuD,EAC5E,QAAI,GAAe,CAAC,EAC1B,EAAM,iBAAiB,OAAO,EAAO,EAAE,EACvC,EAAM,WAAW,SAAS,EAAO,EAAE,EAQrC,gBAAgB,CAAC,EAAgC,EAA4C,CAC5F,SAAc,KAAU,KAAK,QAC5B,KAAK,sBAAsB,EAAQ,CAAK,EAGzC,GAAI,KAAK,qBACR,KAAK,iBAAiB,EAAO,EAAE,EAQjC,kBAAkB,CAAC,EAAgC,EAA4C,CAC9F,SAAc,KAAU,KAAK,QAC5B,KAAK,sBAAsB,EAAQ,CAAK,EAGzC,GAAI,KAAK,qBACR,KAAK,iBAAiB,EAAO,EAAE,EAQjC,eAAe,CAAC,EAAwB,CACvC,QAAY,EAAO,KAAU,KAAK,QACjC,GAAI,EAAM,iBAAiB,IAAI,CAAQ,EACtC,EAAM,iBAAiB,OAAO,CAAQ,EACtC,EAAM,WAAW,SAAS,CAAQ,EASrC,aAAa,CAAC,EAAsC,CACnD,SAAc,KAAU,KAAK,QAC5B,KAAK,sBAAsB,EAAQ,CAAK,EAS1C,wBAAwB,CAAC,EAAsC,CAE9D,GADA,KAAK,cAAc,CAAM,EACrB,KAAK,qBACR,KAAK,iBAAiB,EAAO,EAAE,EAQzB,gBAAgB,CAAC,EAAwB,CAChD,IAAM,EAAW,KAAK,cAAc,YAAY,CAAQ,EACxD,QAAW,KAAW,EAAU,CAC/B,IAAM,EAAc,KAAK,cAAc,UAAU,CAAO,EACxD,GAAI,EACH,KAAK,cAAc,CAAW,GAQzB,oBAAoB,EAAS,CACpC,KAAK,qBAAuB,GAC5B,SAAc,KAAU,KAAK,QAC5B,GAAI,EAAM,WAAW,WAAW,OAAQ,CACvC,KAAK,qBAAuB,GAC5B,QAIJ,CCzOA,MAAqB,CAEnB,CACO,SAAiD,CAAC,EAO1D,YAAY,CAAC,EAAkB,EAAqC,CACnE,KAAK,SAAS,KAAK,CAAC,IAAQ,CAC3B,EAAI,aAAa,EAAU,CAAO,EAClC,EASF,YAA+C,CAC9C,EACA,EACA,EACO,CACP,KAAK,SAAS,KAAK,CAAC,IAAQ,CAC3B,EAAI,aAAa,EAAU,EAAe,CAAc,EACxD,EAQF,eAAkD,CACjD,EACA,EACO,CACP,KAAK,SAAS,KAAK,CAAC,IAAQ,CAC3B,EAAI,gBAAgB,EAAU,CAAa,EAC3C,EAQF,KAA0E,CACzE,EACO,CACP,KAAK,SAAS,KAAK,CAAC,IAAQ,CAC3B,EAAI,MAAM,CAAU,EACpB,EAQF,UAA+E,CAC9E,EACA,EACO,CACP,KAAK,SAAS,KAAK,CAAC,IAAQ,CAC3B,EAAI,WAAW,EAAU,CAAU,EACnC,EAQF,aAAkF,CACjF,EACA,EACO,CACP,KAAK,SAAS,KAAK,CAAC,IAAQ,CAC3B,EAAI,cAAc,EAAU,CAAU,EACtC,EAQF,SAAS,CAAC,EAAiB,EAAwB,CAClD,KAAK,SAAS,KAAK,CAAC,IAAQ,CAC3B,EAAI,UAAU,EAAS,CAAQ,EAC/B,EAWF,eAAkD,CACjD,EACA,EACA,EACO,CACP,KAAK,SAAS,KAAK,CAAC,IAAQ,CAC3B,EAAI,gBAAgB,EAAU,EAAe,CAAO,EACpD,EAQF,WAA8C,CAAC,EAAkB,EAAwB,CACxF,KAAK,SAAS,KAAK,CAAC,IAAQ,CAC3B,EAAI,YAAY,EAAU,CAAa,EACvC,EAOF,YAAY,CAAC,EAAuB,CACnC,KAAK,SAAS,KAAK,CAAC,IAAQ,CAC3B,EAAI,aAAa,CAAO,EACxB,EAQF,QAAQ,CACP,EACO,CAEP,QAAW,KAAW,KAAK,SAC1B,GAAI,CACH,EAAQ,CAAG,EACV,MAAO,EAAO,CAGf,QAAQ,KAAK,iDAAkD,CAAK,EAKtE,KAAK,SAAS,OAAS,EAMxB,KAAK,EAAS,CACb,KAAK,SAAS,OAAS,KAOpB,OAAM,EAAW,CACpB,OAAO,KAAK,SAAS,OAEvB,CC1HO,MAAM,CAOX,CAC4B,IAA7B,WAAW,CAAkB,EAAa,CAAb,WAM7B,kBAAiD,EAO/C,CACD,OAAO,KAcR,cAA6C,EAO3C,CACD,OAAO,KAcR,iBAAgD,EAO9C,CACD,OAAO,KAcR,cAAiD,EAO/C,CACD,OAAO,KAcR,eAA8C,EAO5C,CACD,OAAO,KAcR,UAA4B,EAO1B,CACD,OAAO,KAcR,UAA4B,EAO1B,CACD,OAAO,KAcR,mBAAqC,EAOnC,CACD,OAAO,KAcR,sBAAwC,EAOtC,CACD,OAAO,KAiBR,QAA+B,EAO7B,CACD,OAAO,KAgBR,OAAO,CACN,EAC6E,CAC7E,MAAO,CACN,GAAI,KAAK,IACT,SACD,EAEF,CAcO,SAAS,CAAY,CAAC,EAA2B,CACvD,OAAO,IAAI,EAAc,CAAE,ECrUrB,MAAM,CAMX,CAqBmB,OApBZ,QAAmB,CAAC,EACpB,gBACA,eACA,mBACA,cAMA,UAAY,EACZ,OAAsB,SACtB,QAAoB,CAAC,EACrB,WACA,gBACA,gBACA,cAAgB,GAChB,qBAAiF,CAAC,EAClF,cAER,WAAW,CAAS,EAAgB,CAAhB,iBAEhB,MAAK,EAAG,CACX,OAAO,KAAK,OAOb,mBAAmB,EAA0B,CAC5C,IAAM,EAAgC,CACrC,MAAO,KAAK,OACZ,cAAe,KAAK,QACpB,SAAU,KAAK,UACf,MAAO,KAAK,MACb,EAEA,GAAI,KAAK,gBACR,EAAO,QAAU,KAAK,gBAGvB,GAAI,KAAK,eACR,EAAO,SAAW,KAAK,eAGxB,GAAI,KAAK,mBACR,EAAO,aAAe,KAAK,mBAG5B,GAAI,KAAK,cACR,EAAO,cAAgB,KAAK,cAG7B,GAAI,KAAK,QAAQ,OAAS,EACzB,EAAO,OAAS,CAAC,GAAG,KAAK,OAAO,EAGjC,GAAI,KAAK,WACR,EAAO,UAAY,KAAK,WAGzB,GAAI,KAAK,gBACR,EAAO,eAAiB,KAAK,gBAG9B,GAAI,KAAK,gBACR,EAAO,eAAiB,KAAK,gBAG9B,GAAI,KAAK,cACR,EAAO,aAAe,GAGvB,GAAI,OAAO,KAAK,KAAK,oBAAoB,EAAE,OAAS,EACnD,EAAO,cAAgB,IAAK,KAAK,oBAAqB,EAGvD,OAAO,EAUR,WAAW,CAAC,EAAwB,CAEnC,OADA,KAAK,UAAY,EACV,KAUR,OAAO,CAAC,EAA0B,CAEjC,OADA,KAAK,OAAS,EACP,KASR,OAAyB,CAAC,EAA+E,CACxG,GAAI,CAAC,KAAK,QAAQ,SAAS,CAAS,EACnC,KAAK,QAAQ,KAAK,CAAS,EAE5B,OAAO,KAUR,SAAS,CAAC,EAA6D,CAEtE,OADA,KAAK,WAAa,CAAC,GAAG,CAAO,EACtB,KAUR,cAAc,CAAC,EAA6D,CAE3E,OADA,KAAK,gBAAkB,CAAC,GAAG,CAAO,EAC3B,KAUR,cAAc,CAAC,EAA2D,CAEzE,OADA,KAAK,gBAAkB,CAAC,GAAG,CAAM,EAC1B,KAOR,YAAY,EAAS,CAEpB,OADA,KAAK,cAAgB,GACd,KAUR,aAAyD,CACxD,EACoD,CAEpD,OADC,KAAa,cAAgB,CAAC,GAAG,CAAI,EAC/B,KAMR,QAOC,CACA,EACA,EAOiE,CAGjE,IAAM,EAAa,KAKnB,OAJA,EAAW,QAAU,IACjB,KAAK,SACP,GAAO,CACT,EACO,EAUR,UAAU,CACT,EACO,CACP,GAAI,KAAK,eAAe,OAAQ,CAC/B,IAAM,EAAO,KAAK,cACd,EACJ,KAAK,gBAAmB,CAAC,IAAQ,CAChC,GAAI,CAAC,EAAU,CACd,EAAW,CAAC,EACZ,QAAW,KAAO,EACjB,EAAS,GAAO,EAAI,IAAI,YAAY,CAAsC,EAG3E,EAAgC,UAAe,EAC/C,EAAqB,CAAG,GAK1B,UAAK,gBAAkB,EAExB,OAAO,KAWR,gBAAmD,CAClD,EACA,EASO,CAEP,OADA,KAAK,qBAAqB,GAAa,EAChC,KASR,WAAW,CACV,EACO,CAEP,OADA,KAAK,eAAiB,EACf,KASR,eAAe,CACd,EACO,CAEP,OADA,KAAK,mBAAqB,EACnB,KASR,gBAAgB,CACf,EAMO,CAEP,OADA,KAAK,cAAgB,EACd,KAET,CCxTO,SAAS,CAAqB,CACpC,EACA,EACA,EACO,CACP,IAAM,EAAU,IAAI,IACd,EAAa,CAAC,CAAW,EAE/B,MAAO,EAAM,OAAS,EAAG,CACxB,IAAM,EAAU,EAAM,IAAI,EAC1B,GAAI,IAAY,OAAW,MAC3B,GAAI,IAAY,EACf,MAAU,MACT,4CAA4C,OAAO,CAAO,UAAU,OAAO,CAAW,iBAAiB,OAAO,CAAO,IACtH,EAED,GAAI,EAAQ,IAAI,CAAO,EAAG,SAC1B,EAAQ,IAAI,CAAO,EAEnB,IAAM,EAAO,EAAgB,CAAO,EACpC,GAAI,EACH,QAAW,KAAK,EACf,EAAM,KAAK,EAAE,SAAS,kBCN1B,MAAqB,CAA0H,CAC7H,OAAqD,IAAI,IACzD,OAA6C,IAAI,IAC1D,SAAqF,KAM7F,WAAW,CAAC,EAAmF,CAC9F,KAAK,SAAW,EAMjB,QAA6B,CAC5B,EACA,EACO,CAMP,GALA,KAAK,OAAO,IAAI,EAAK,CACpB,aACA,OAAQ,SACT,CAAC,EAEG,EAAW,MAAO,CACrB,IAAM,EAAW,KAAK,OAAO,IAAI,EAAW,KAAK,GAAK,IAAI,IAC1D,EAAS,IAAI,CAAG,EAChB,KAAK,OAAO,IAAI,EAAW,MAAO,CAAQ,QAOtC,gBAAe,EAAkB,CACtC,IAAM,EAAoC,CAAC,EAE3C,QAAY,EAAK,KAAU,KAAK,OAC/B,GAAI,EAAM,WAAW,OAAS,EAAM,SAAW,UAC9C,EAAY,KAAK,CAAG,EAItB,MAAM,QAAQ,IAAI,EAAY,IAAI,KAAO,KAAK,UAAU,CAAG,CAAC,CAAC,OAMxD,UAAqC,CAAC,EAAgC,CAC3E,IAAM,EAAQ,KAAK,OAAO,IAAI,CAAG,EAEjC,GAAI,CAAC,EACJ,MAAU,MAAM,UAAU,OAAO,CAAG,cAAc,EAInD,GAAI,EAAM,SAAW,UAAY,EAAM,QAAU,OAChD,OAAO,EAAM,MAId,GAAI,EAAM,SAAW,WAAa,EAAM,YACvC,OAAO,EAAM,YAId,GAAI,EAAM,SAAW,SACpB,EAAM,OAAS,UAIhB,EAAM,OAAS,UACf,EAAM,YAAc,EAAM,WAAW,OAAO,EAE5C,GAAI,CACH,IAAM,EAAQ,MAAM,EAAM,YAQ1B,OAPA,EAAM,MAAQ,EACd,EAAM,OAAS,SACf,EAAM,YAAc,OAEpB,KAAK,UAAU,QAAQ,cAAe,CAAE,IAAK,CAAiC,CAAC,EAC/E,KAAK,mBAAmB,EAAM,WAAW,KAAK,EAEvC,EACN,MAAO,EAAK,CACb,IAAM,EAAQ,aAAe,MAAQ,EAAU,MAAM,OAAO,CAAG,CAAC,EAMhE,MALA,EAAM,OAAS,SACf,EAAM,MAAQ,EACd,EAAM,YAAc,OAEpB,KAAK,UAAU,QAAQ,cAAe,CAAE,IAAK,EAAkC,OAAM,CAAC,EAChF,QAOF,eAAc,CAAC,EAA2C,CAC/D,IAAM,EAAY,KAAK,OAAO,IAAI,CAAS,EAE3C,GAAI,CAAC,GAAa,EAAU,OAAS,EACpC,MAAU,MAAM,gBAAgB,uBAA+B,EAGhE,MAAM,QAAQ,IACb,MAAM,KAAK,CAAS,EAAE,IAAI,KAAO,KAAK,UAAU,CAAG,CAAC,CACrD,EAMD,GAA+B,CAAC,EAAuB,CACtD,IAAM,EAAQ,KAAK,OAAO,IAAI,CAAG,EAEjC,GAAI,CAAC,EACJ,MAAU,MAAM,UAAU,OAAO,CAAG,cAAc,EAGnD,GAAI,EAAM,SAAW,UAAY,EAAM,QAAU,OAChD,MAAU,MAAM,UAAU,OAAO,CAAG,6BAA6B,EAAM,SAAS,EAGjF,OAAO,EAAM,MAMd,MAAkC,CAAC,EAAmC,CACrE,IAAM,EAAQ,KAAK,OAAO,IAAI,CAAG,EAEjC,GAAI,CAAC,GAAS,EAAM,SAAW,SAC9B,OAGD,OAAO,EAAM,MAMd,SAAqC,CAAC,EAAoC,CACzE,IAAM,EAAQ,KAAK,OAAO,IAAI,CAAG,EAEjC,GAAI,CAAC,EACJ,MAAU,MAAM,UAAU,OAAO,CAAG,cAAc,EAGnD,IAAM,EAAU,KAChB,MAAO,IACF,OAAM,EAAG,CACZ,OAAO,EAAM,WAEV,SAAQ,EAAG,CACd,OAAO,EAAM,SAAW,UAEzB,GAAG,EAAG,CACL,OAAO,EAAQ,IAAI,CAAG,GAEvB,MAAM,EAAG,CACR,OAAO,EAAQ,OAAO,CAAG,EAE3B,EAMD,SAAqC,CAAC,EAAqB,CAC1D,IAAM,EAAQ,KAAK,OAAO,IAAI,CAAG,EAEjC,GAAI,CAAC,EACJ,MAAU,MAAM,UAAU,OAAO,CAAG,cAAc,EAGnD,OAAO,EAAM,OAMd,QAAoC,CAAC,EAAiB,CAErD,OADc,KAAK,OAAO,IAAI,CAAG,GACnB,SAAW,SAM1B,aAAa,CAAC,EAAqC,CAClD,IAAM,EAAY,KAAK,OAAO,IAAI,CAAS,EAE3C,GAAI,CAAC,GAAa,EAAU,OAAS,EACpC,MAAO,GAGR,QAAW,KAAO,EAAW,CAC5B,IAAM,EAAQ,KAAK,OAAO,IAAI,CAAG,EACjC,GAAI,CAAC,GAAS,EAAM,SAAW,SAC9B,MAAO,GAIT,MAAO,GAMR,gBAAgB,CAAC,EAAoC,CACpD,OAAO,KAAK,wBAAwB,CAAS,EAAE,SAMhD,uBAAuB,CAAC,EAAiF,CACxG,IAAM,EAAY,KAAK,OAAO,IAAI,CAAS,EAE3C,GAAI,CAAC,GAAa,EAAU,OAAS,EACpC,MAAO,CAAE,OAAQ,EAAG,MAAO,EAAG,SAAU,CAAE,EAG3C,IAAI,EAAS,EACb,QAAW,KAAO,EAEjB,GADc,KAAK,OAAO,IAAI,CAAG,GACtB,SAAW,SACrB,IAIF,IAAM,EAAQ,EAAU,KACxB,MAAO,CAAE,SAAQ,QAAO,SAAU,EAAS,CAAM,EAM1C,kBAAkB,CAAC,EAAqC,CAC/D,GAAI,CAAC,GAAa,CAAC,KAAK,SAAU,OAElC,IAAM,EAAQ,EACR,EAAU,KAAK,wBAAwB,CAAK,EAOlD,GALA,KAAK,SAAS,QAAQ,qBAAsB,CAC3C,WACG,CACJ,CAAC,EAEG,EAAQ,SAAW,EAAQ,MAC9B,KAAK,SAAS,QAAQ,mBAAoB,CAAE,OAAM,CAAC,EAOrD,cAAc,EAAgD,CAC7D,IAAM,EAAU,KAChB,MAAO,CACN,SAAqC,CAAC,EAAqB,CAC1D,OAAO,EAAQ,UAAU,CAAG,GAE7B,QAAoC,CAAC,EAAiB,CACrD,OAAO,EAAQ,SAAS,CAAG,GAE5B,aAAa,CAAC,EAAqC,CAClD,OAAO,EAAQ,cAAc,CAAS,GAEvC,gBAAgB,CAAC,EAAoC,CACpD,OAAO,EAAQ,iBAAiB,CAAS,GAE1C,GAA+B,CAAC,EAAuB,CACtD,OAAO,EAAQ,IAAI,CAAG,GAEvB,MAAkC,CAAC,EAAmC,CACrE,OAAO,EAAQ,OAAO,CAAG,GAE1B,SAAqC,CAAC,EAAoC,CACzE,OAAO,EAAQ,UAAU,CAAG,EAE9B,EAMD,OAAO,EAA4B,CAClC,OAAO,MAAM,KAAK,KAAK,OAAO,KAAK,CAAC,EAMrC,aAAa,EAAa,CACzB,OAAO,MAAM,KAAK,KAAK,OAAO,KAAK,CAAC,EAMrC,YAAY,CAAC,EAA4C,CACxD,IAAM,EAAY,KAAK,OAAO,IAAI,CAAS,EAC3C,OAAO,EAAY,MAAM,KAAK,CAAS,EAAI,CAAC,EAE9C,CAKO,MAAM,CAAsH,CACjH,QAEjB,WAAW,CAAC,EAA6B,CACxC,KAAK,QAAU,EAGhB,GAAwB,CACvB,EACA,EACyC,CAEzC,OADA,KAAK,QAAQ,SAAS,EAAK,CAAE,SAAQ,MAAO,EAAK,CAAC,EAC3C,KAGR,aAAkC,CACjC,EACA,EACyC,CAEzC,OADA,KAAK,QAAQ,SAAS,EAAK,CAAU,EAC9B,KAGR,QAA6E,CAC5E,EACA,EAC+E,CAC/E,QAAY,EAAK,KAAW,OAAO,QAAQ,CAAM,EAChD,KAAK,QAAQ,SAAS,EAAK,CAC1B,OAAQ,EACR,MAAO,GACP,MAAO,CACR,CAAC,EAEF,OAAO,KAOR,UAAU,EAAuB,CAChC,OAAO,KAAK,QAEd,CAKO,SAAS,CAA4G,CAC3H,EAC8B,CAC9B,OAAO,IAAI,EAAsB,GAAW,IAAI,CAAoB,EChWrE,MAAqB,CAAkG,CACrG,QAA2C,IAAI,IACxD,cAA8C,KAC9C,YAA4C,CAAC,EAE7C,SAAkE,KAClE,aAA8C,KAC9C,IAAe,KAMvB,eAAe,CACd,EACA,EACA,EACO,CACP,KAAK,SAAW,EAChB,KAAK,aAAe,EACpB,KAAK,IAAM,EAGJ,UAAU,EAAY,CAC7B,GAAI,CAAC,KAAK,IAAK,MAAU,MAAM,oEAAoE,EACnG,OAAO,KAAK,IAMb,QAAyG,CACxG,EACA,EACO,CACP,KAAK,QAAQ,IAAI,EAAM,CAAE,WAAY,CAA+B,CAAC,OAMhE,UAAkC,CACvC,EACA,EACgB,CAChB,IAAM,EAAQ,KAAK,QAAQ,IAAI,CAAI,EAEnC,GAAI,CAAC,EACJ,MAAU,MAAM,WAAW,OAAO,CAAI,cAAc,EAIrD,MAAM,KAAK,qBAAqB,EAAM,WAAW,eAAgB,EAAM,WAAW,mBAAmB,EAGrG,MAAO,KAAK,YAAY,OAAS,EAAG,CACnC,IAAM,EAAc,KAAK,YAAY,IAAI,EACzC,GAAI,EACH,MAAM,KAAK,WAAW,EAAY,IAAI,EAKxC,GAAI,KAAK,cACR,MAAM,KAAK,WAAW,KAAK,cAAc,IAAI,EAI9C,IAAM,EAAQ,EAAM,WAAW,aAAa,CAAM,EAClD,KAAK,cAAgB,CACpB,OACA,OAAQ,EACR,OACD,EAEA,MAAM,EAAM,WAAW,UAAU,CAAE,SAAQ,IAAK,KAAK,WAAW,CAAE,CAAC,EACnE,KAAK,UAAU,QAAQ,cAAe,CAAE,OAAQ,EAAgC,QAAO,CAAC,OAMnF,WAAmC,CACxC,EACA,EACgB,CAChB,IAAM,EAAQ,KAAK,QAAQ,IAAI,CAAI,EAEnC,GAAI,CAAC,EACJ,MAAU,MAAM,WAAW,OAAO,CAAI,cAAc,EAOrD,GAHA,MAAM,KAAK,qBAAqB,EAAM,WAAW,eAAgB,EAAM,WAAW,mBAAmB,EAGjG,KAAK,cACR,KAAK,YAAY,KAAK,KAAK,aAAa,EAIzC,IAAM,EAAQ,EAAM,WAAW,aAAa,CAAM,EAClD,KAAK,cAAgB,CACpB,OACA,OAAQ,EACR,OACD,EAEA,MAAM,EAAM,WAAW,UAAU,CAAE,SAAQ,IAAK,KAAK,WAAW,CAAE,CAAC,EACnE,KAAK,UAAU,QAAQ,aAAc,CAAE,OAAQ,EAAgC,QAAO,CAAC,OAMlF,UAAS,EAAkB,CAChC,GAAI,KAAK,YAAY,SAAW,EAC/B,MAAU,MAAM,mCAAmC,EAIpD,GAAI,KAAK,cACR,MAAM,KAAK,WAAW,KAAK,cAAc,IAAI,EAC7C,KAAK,UAAU,QAAQ,YAAa,CAAE,OAAQ,KAAK,cAAc,IAA+B,CAAC,EAIlG,KAAK,cAAgB,KAAK,YAAY,IAAI,GAAK,UAMlC,WAAU,CAAC,EAAoC,CAC5D,IAAM,EAAQ,KAAK,QAAQ,IAAI,CAAI,EACnC,GAAI,GAAO,WAAW,OACrB,MAAM,EAAM,WAAW,OAAO,KAAK,WAAW,CAAC,EAEhD,KAAK,UAAU,QAAQ,aAAc,CAAE,OAAQ,CAA+B,CAAC,OAMlE,qBAAoB,CACjC,EACA,EACgB,CAChB,GAAI,CAAC,KAAK,aAAc,OAExB,GAAI,GACH,QAAW,KAAY,EACtB,GAAI,CAAC,KAAK,aAAa,SAAS,CAAQ,EACvC,MAAM,KAAK,aAAa,UAAU,CAAQ,EAK7C,GAAI,GACH,QAAW,KAAa,EACvB,GAAI,CAAC,KAAK,aAAa,cAAc,CAAS,EAC7C,MAAM,KAAK,aAAa,eAAe,CAAS,GASpD,gBAAgB,EAAyB,CACxC,OAAO,KAAK,eAAe,MAAQ,KAOpC,SAAS,CAAC,EAAwE,CACjF,GAAI,CAAC,KAAK,cACT,MAAU,MAAM,mBAAmB,EAEpC,GAAI,IAAW,QAAa,KAAK,cAAc,OAAS,EACvD,MAAU,MAAM,4BAA4B,OAAO,CAAM,uBAAuB,OAAO,KAAK,cAAc,IAAI,IAAI,EAEnH,OAAO,KAAK,cAAc,OAO3B,YAAY,CAAC,EAAoF,CAChG,GAAI,CAAC,KAAK,cAAe,OACzB,GAAI,IAAW,QAAa,KAAK,cAAc,OAAS,EAAQ,OAChE,OAAO,KAAK,cAAc,OAO3B,QAAQ,CAAC,EAA6D,CACrE,GAAI,CAAC,KAAK,cACT,MAAU,MAAM,mBAAmB,EAEpC,GAAI,IAAW,QAAa,KAAK,cAAc,OAAS,EACvD,MAAU,MAAM,4BAA4B,OAAO,CAAM,uBAAuB,OAAO,KAAK,cAAc,IAAI,IAAI,EAEnH,OAAO,KAAK,cAAc,MAO3B,WAAW,CAAC,EAAyE,CACpF,GAAI,CAAC,KAAK,cAAe,OACzB,GAAI,IAAW,QAAa,KAAK,cAAc,OAAS,EAAQ,OAChE,OAAO,KAAK,cAAc,MAO3B,WAAW,CAAC,EAAiB,EAA8B,CAC1D,GAAI,CAAC,KAAK,cACT,MAAU,MAAM,mBAAmB,EAEpC,GAAI,IAAW,QAAa,KAAK,cAAc,OAAS,EACvD,MAAU,MAAM,4BAA4B,OAAO,CAAM,uBAAuB,OAAO,KAAK,cAAc,IAAI,IAAI,EAGnH,IAAM,EAAU,OAAO,IAAW,WAC9B,EAAyE,KAAK,cAAc,KAAK,EAClG,EAEH,KAAK,cAAc,MAAQ,IACvB,KAAK,cAAc,SAClB,CACL,EAMD,aAAa,EAAW,CACvB,OAAO,KAAK,YAAY,OAMzB,SAAS,EAAY,CACpB,OAAO,KAAK,YAAY,OAAS,EAMlC,QAAQ,CAAC,EAAoC,CAC5C,GAAI,KAAK,eAAe,OAAS,EAChC,MAAO,GAER,OAAO,KAAK,YAAY,KAAK,KAAK,EAAE,OAAS,CAAU,EAMxD,SAAS,CAAC,EAAoC,CAC7C,OAAO,KAAK,eAAe,OAAS,EAMrC,cAAc,EAA4B,CACzC,IAAM,EAAU,KAChB,MAAO,IACF,QAAO,EAAyB,CACnC,OAAO,EAAQ,iBAAiB,MAE7B,OAAM,EAA0D,CACnE,OAAO,EAAQ,aAAa,GAAK,SAE9B,MAAK,EAA+C,CACvD,OAAO,EAAQ,YAAY,GAAK,SAE7B,MAAK,CAAC,EAAmD,CAC5D,GAAI,EAAQ,eAAiB,IAAU,KACtC,EAAQ,cAAc,MAAQ,MAG5B,MAAK,EAA6C,CACrD,OAAO,EAAQ,gBAEZ,UAAS,EAAY,CACxB,OAAO,EAAQ,UAAU,MAEtB,WAAU,EAAW,CACxB,OAAO,EAAQ,cAAc,GAE9B,QAAQ,CAAC,EAAoC,CAC5C,OAAO,EAAQ,SAAS,CAAU,GAEnC,SAAS,CAAC,EAAoC,CAC7C,OAAO,EAAQ,UAAU,CAAU,EAErC,EAMD,cAAc,EAAyB,CACtC,OAAO,MAAM,KAAK,KAAK,QAAQ,KAAK,CAAC,EAMtC,SAAS,CAAC,EAA8B,CACvC,OAAO,KAAK,QAAQ,IAAI,CAAI,EAE9B,CAKO,MAAM,CAA0I,CACrI,QAEjB,WAAW,CAAC,EAAiC,CAC5C,KAAK,QAAU,EAGhB,GAAoG,CACnG,EACA,EACiF,CAEjF,OADA,KAAK,QAAQ,SAAS,EAAM,CAA6C,EAClE,KAOR,UAAU,EAA2B,CACpC,OAAO,KAAK,QAEd,CAKO,SAAS,CAAyH,CACxI,EACqC,CACrC,OAAO,IAAI,EAAmC,GAAW,IAAI,CAAwB,ECpX/E,MAAM,CAMX,CAEO,kBAAiE,KAEjE,mBAAoE,KAEpE,iBAA2D,CAAC,EAE5D,wBAAiH,CAAC,EAElH,0BAAmH,CAAC,EAEpH,eAAyD,CAAC,EAE1D,SAA0B,KAElC,WAAW,EAAG,EAkDd,UAOC,CACA,EACuH,CAKvH,OAHA,KAAK,eAAe,KAAK,CAAM,EAGxB,KAWR,kBAAiD,EAAkG,CAClJ,OAAO,KAWR,cAA6C,EAA8F,CAC1I,OAAO,KAWR,iBAAgD,EAAiG,CAChJ,OAAO,KAsBR,YAAY,CAAC,EAAa,EAA+F,CAExH,OADA,KAAK,iBAAiB,KAAK,CAAE,MAAK,MAAO,CAAS,CAAC,EAC5C,KAUR,WAAuD,CACtD,EACA,EACO,CAEP,OADA,KAAK,wBAAwB,KAAK,CAAE,IAAK,EAAe,SAAU,CAAgE,CAAC,EAC5H,KAYR,YAGC,CACA,EACA,EACA,EACO,CAMP,OALA,KAAK,0BAA0B,KAAK,CACnC,UACA,WACA,QAAS,CACV,CAAC,EACM,KAQR,UAA6E,CAC5E,EAO8D,CAC9D,IAAM,EAAc,EAAmC,EAGvD,OAFA,EAAa,CAAW,EACxB,KAAK,kBAAoB,EAClB,KAcR,WAAoE,CACnE,EAmBuD,CACvD,IAAM,EAAe,EAMjB,EAGJ,OAFA,EAAa,CAAY,EACzB,KAAK,mBAAqB,EACnB,KAcR,iBAAiB,CAAC,EAAkB,CAEnC,OADA,KAAK,SAAW,EACT,KAOR,sBAAwC,EAAmF,CAC1H,OAAO,KAOR,aAAa,EAQoC,CAChD,MAAQ,CAAC,IACR,EAAa,EAAO,EAAE,EAAE,QAAQ,EAAO,OAAO,EAOhD,KAAK,EAMH,CACD,IAAM,EAAY,IAAI,EAGtB,QAAW,KAAU,KAAK,eACzB,EAAU,cAAc,CAAM,EAI/B,QAAa,MAAK,WAAW,KAAK,iBACjC,EAAU,YAAY,EAA+B,CAAY,EAIlE,QAAa,MAAK,cAAc,KAAK,wBACpC,EAAU,gBAAgB,EAAgC,CAAkG,EAI7J,QAAa,UAAS,WAAU,aAAa,KAAK,0BACjD,EAAU,iBACT,EACA,EACA,CACD,EAID,GAAI,KAAK,kBACR,EAAU,iBAAiB,KAAK,kBAAkB,WAAW,CAA2C,EAClG,QAAI,EAAU,wBAAwB,EAC5C,EAAU,iBAAiB,IAAI,CAAwD,EAIxF,GAAI,KAAK,mBACR,EAAU,kBAAkB,KAAK,mBAAmB,WAAW,CAA6C,EACtG,QAAI,EAAU,yBAAyB,EAC7C,EAAU,kBAAkB,IAAI,CAA2D,EAI5F,GAAI,KAAK,WAAa,KACrB,EAAU,YAAY,KAAK,QAAQ,EAGpC,OAAO,EAQT,CChWA,IAAM,EAAsC,CAC3C,YAAa,cAAe,SAAU,aAAc,QACrD,EAOA,MAAqB,CAMnB,OAKsB,SAAU,EAGzB,eAEA,UAEA,iBAEA,eAGA,SAAyC,CAAC,EAE1C,cAAmE,CAC1E,UAAW,CAAC,EAAG,YAAa,CAAC,EAAG,OAAQ,CAAC,EAAG,WAAY,CAAC,EAAG,OAAQ,CAAC,CACtE,EAEQ,kBAAiC,IAAI,IAErC,gBAA+B,IAAI,IAEnC,cAAoD,KAEpD,eAAuD,KAEvD,sBAEA,iBAA8E,CAAC,EAE/E,aAAuB,EAEvB,gBAAuC,IAAI,IAE3C,iBAA2B,EAE3B,SAAmB,qBAEnB,kBAA4B,EAE5B,oBAA8B,EAE9B,eAAyB,EAEzB,oBAAgJ,IAAI,IAEpJ,qBAAkE,CAAC,EAEnE,sBAAqE,CAAC,EAEtE,oBAA+B,GAE/B,eAAsC,IAAI,IAE1C,cAA6C,CACpD,UAAW,EAAG,YAAa,EAAG,OAAQ,EAAG,WAAY,EAAG,OAAQ,CACjE,EAEQ,qBAA8D,IAAI,IAElE,qBAAoC,IAAI,IAGxC,gBAAsG,IAAI,QAE1G,mBAAwC,CAAC,EACzC,uBAAyB,GAKjC,WAAW,EAAG,CACb,KAAK,eAAiB,IAAI,EAC1B,KAAK,UAAY,IAAI,EACrB,KAAK,iBAAmB,IAAI,EAC5B,KAAK,sBAAwB,IAAI,EAAwC,KAAK,cAAc,EAC5F,KAAK,eAAiB,IAAI,EAG1B,KAAK,yBAAyB,EAQvB,wBAAwB,EAAS,CAExC,KAAK,eAAe,sBAAsB,CAAC,EAAU,IAAkB,CACtE,KAAK,eAAe,YAAY,EAAU,CAAa,EAGvD,IAAM,EAAO,KAAK,oBAAoB,IAAI,CAAa,EACvD,GAAI,EAAM,CACT,IAAM,EAAS,KAAK,eAAe,UAAU,CAAQ,EACrD,GAAI,EAAQ,CACX,IAAM,EAAe,EAAO,WAAW,GACvC,QAAa,YAAW,aAAa,EAAM,CAC1C,GAAI,KAAK,eAAe,mBAAmB,IAAI,CAAS,EAAG,SAC3D,GAAI,EAAE,KAAa,EAAO,YACzB,KAAK,eAAe,aAAa,EAAU,EAAW,EAAQ,CAAY,CAA+C,KAK7H,EAGD,KAAK,eAAe,qBAAqB,CAAC,IAAa,CACtD,IAAM,EAAS,KAAK,eAAe,UAAU,CAAQ,EACrD,GAAI,EACH,KAAK,sBAAsB,yBAAyB,CAAM,EAE3D,EAGD,KAAK,eAAe,wBAAwB,CAAC,EAAU,IAAkB,CACxE,IAAM,EAAS,KAAK,eAAe,UAAU,CAAQ,EACrD,GAAI,EACH,KAAK,sBAAsB,mBAAmB,EAAQ,CAAa,EAEpE,EAGD,KAAK,eAAe,sBAAsB,CAAC,IAAa,CACvD,KAAK,sBAAsB,gBAAgB,CAAQ,EACnD,EAGD,KAAK,eAAe,qBAAqB,CAAC,IAAY,CACrD,GAAI,KAAK,sBAAsB,oBAAqB,CACnD,IAAM,EAAc,KAAK,eAAe,UAAU,CAAO,EACzD,GAAI,EACH,KAAK,sBAAsB,cAAc,CAAW,GAGtD,QAwBK,OAA8C,EAAuD,CAC3G,OAAO,IAAI,EASZ,SAAS,CAAC,EAAmC,CAC5C,IAAM,EAAU,IAAI,EAAmB,CAAK,EAI5C,OAHA,KAAK,mBAAmB,KAAK,IAAM,CAClC,KAAK,gBAAgB,EAAQ,oBAAoB,CAAC,EAClD,EACM,EAOA,wBAAwB,EAAS,CACxC,GAAI,KAAK,mBAAmB,SAAW,EAAG,OAC1C,KAAK,uBAAyB,GAC9B,MAAO,KAAK,mBAAmB,OAAS,EAAG,CAC1C,IAAM,EAAa,KAAK,mBACxB,KAAK,mBAAqB,CAAC,EAC3B,QAAW,KAAY,EACtB,EAAS,EAGX,KAAK,uBAAyB,GAC9B,KAAK,qBAAqB,EAS3B,MAAM,CAAC,EAAmB,CACzB,KAAK,yBAAyB,EAC9B,IAAM,EAAiB,KAAK,gBAAgB,iBAAiB,GAAK,KAC5D,EAAS,KAAK,oBAGpB,KAAK,UAAU,YAAa,EAAW,EAAe,CAAM,EAG5D,IAAM,EAAU,EAAS,YAAY,IAAI,EAAI,EAC7C,KAAK,mBAAqB,EAC1B,IAAI,EAAQ,EACZ,MAAO,KAAK,mBAAqB,KAAK,UAAY,EAAQ,KAAK,eAC9D,KAAK,cAAc,KAAK,cAAc,YAAa,KAAK,SAAU,CAAa,EAC/E,KAAK,eAAe,SAAS,IAAI,EACjC,KAAK,mBAAqB,KAAK,SAC/B,IAGD,GAAI,KAAK,mBAAqB,KAAK,SAClC,KAAK,kBAAoB,EAE1B,GAAI,EACH,KAAK,cAAc,YAAc,YAAY,IAAI,EAAI,EAGtD,KAAK,oBAAsB,KAAK,kBAAoB,KAAK,SAGzD,KAAK,UAAU,SAAU,EAAW,EAAe,CAAM,EAGzD,KAAK,UAAU,aAAc,EAAW,EAAe,CAAM,EAG7D,QAAW,KAAQ,KAAK,iBACvB,EAAK,CAAE,IAAK,KAAM,GAAI,CAAU,CAAC,EAIlC,KAAK,UAAU,SAAU,EAAW,EAAe,CAAM,EAKzD,KAAK,iBAAmB,KAAK,eAAe,UAG5C,KAAK,eAOE,aAAa,CACpB,EACA,EACA,EACO,CACP,QAAW,KAAU,EAAS,CAC7B,GAAI,CAAC,EAAO,SAAW,CAAC,EAAO,cAAe,SAG9C,GAAI,EAAO,QAAQ,OAAQ,CAC1B,IAAI,EAAc,GAClB,QAAW,KAAS,EAAO,OAC1B,GAAI,KAAK,gBAAgB,IAAI,CAAK,EAAG,CACpC,EAAc,GACd,MAGF,GAAI,EAAa,SAIlB,GAAI,EAAO,WAAW,QACrB,GAAI,IAAkB,MAAQ,CAAC,EAAO,UAAU,SAAS,CAAa,EACrE,SAKF,GAAI,EAAO,gBAAgB,QAC1B,GAAI,IAAkB,MAAQ,EAAO,eAAe,SAAS,CAAa,EACzE,SAKF,GAAI,EAAO,gBAAgB,QAAU,KAAK,cAAe,CACxD,IAAI,EAAc,GAClB,QAAW,KAAY,EAAO,eAC7B,GAAI,CAAC,KAAK,cAAc,SAAS,CAAQ,EAAG,CAC3C,EAAc,GACd,MAGF,GAAI,CAAC,EAAa,SAInB,IAAM,EAAkB,KAAK,gBAAgB,IAAI,CAAM,GAAK,EAC5D,KAAK,iBAAmB,EAGxB,IAAI,EAAM,KAAK,gBAAgB,IAAI,CAAM,EACzC,GAAI,CAAC,EACJ,EAAM,CAAE,QAAS,CAAC,EAAG,GAAI,EAAG,IAAK,IAAK,EACtC,KAAK,gBAAgB,IAAI,EAAQ,CAAG,EAErC,EAAI,GAAK,EAGT,IAAM,EAAe,EAAI,QACrB,EAAa,GACb,EAAa,GAEjB,GAAI,EAAO,cACV,QAAW,KAAa,EAAO,cAAe,CAC7C,EAAa,GAEb,IAAM,EAAQ,EAAO,cAAc,GAEnC,GAAI,EAAO,CAEV,IAAM,EADW,EAAa,KACF,EAAa,GAAa,CAAC,GAWvD,GATA,KAAK,eAAe,yBACnB,EACA,EAAM,KACN,EAAM,SAAW,CAAC,EAClB,EAAM,QACN,EAAM,QAAU,KAAK,iBAAmB,OACxC,EAAM,SACP,EAEI,EAAO,OACV,EAAa,IAOjB,IAAM,EAAgB,KAAK,qBAAqB,IAAI,CAAM,EAC1D,GAAI,GAAiB,EAAO,cAC3B,QAAW,KAAa,EAAO,cAAe,CAC7C,IAAM,EAAU,EAAa,GACvB,EAAe,EAAc,IAAI,CAAS,EAChD,GAAI,CAAC,GAAW,CAAC,EAAc,SAE/B,IAAM,EAAW,EAAO,cAAc,GACtC,GAAI,CAAC,EAAU,SAGf,IAAM,EAAW,KAAK,qBACtB,EAAS,MAAM,EAEf,QAAW,KAAU,EAEpB,GADA,EAAS,IAAI,EAAO,EAAE,EAClB,CAAC,EAAa,IAAI,EAAO,EAAE,EAC9B,EAAa,IAAI,EAAO,EAAE,EAC1B,EAAS,CAAE,SAAQ,IAAK,IAAK,CAAC,EAKhC,QAAW,KAAM,EAChB,GAAI,CAAC,EAAS,IAAI,CAAE,EACnB,EAAa,OAAO,CAAE,EAO1B,GAAI,EAAO,SACV,GAAI,KAAK,oBAAqB,CAC7B,IAAM,EAAK,YAAY,IAAI,EAC3B,GAAI,GAAc,EAAO,aACxB,EAAO,QAAQ,CAAG,EACZ,QAAI,CAAC,EACX,EAAO,QAAQ,CAAG,EAEnB,KAAK,eAAe,IAAI,EAAO,MAAO,YAAY,IAAI,EAAI,CAAE,EACtD,QAAI,GAAc,EAAO,aAC/B,EAAO,QAAQ,CAAG,EACZ,QAAI,CAAC,EACX,EAAO,QAAQ,CAAG,EAKpB,KAAK,gBAAgB,IAAI,EAAQ,KAAK,eAAe,SAAS,GAQxD,SAAS,CAChB,EACA,EACA,EACA,EACO,CACP,GAAI,EAAQ,CACX,IAAM,EAAK,YAAY,IAAI,EAC3B,KAAK,cAAc,KAAK,cAAc,GAAQ,EAAW,CAAa,EACtE,KAAK,cAAc,GAAS,YAAY,IAAI,EAAI,EAEhD,UAAK,cAAc,KAAK,cAAc,GAAQ,EAAW,CAAa,EAEvE,KAAK,eAAe,SAAS,IAAI,OAgB5B,WAAU,EAAkB,CAOjC,GANA,KAAK,yBAAyB,EAC9B,MAAM,KAAK,oBAAoB,EAK3B,KAAK,cACR,KAAK,cAAc,YAAY,KAAK,SAA2E,EAC/G,MAAM,KAAK,cAAc,gBAAgB,EACzC,KAAK,iBAAiB,IAAI,UAAqC,KAAK,cAAc,eAAe,CAAwD,EAI1J,GAAI,KAAK,eACR,KAAK,eAAe,gBACnB,KAAK,UACL,KAAK,cACL,IACD,EACA,KAAK,iBAAiB,IAAI,UAAqC,KAAK,eAAe,eAAe,CAAwD,EAG3J,QAAW,KAAU,KAAK,SACzB,MAAM,EAAO,eAAe,IAAI,OAU5B,oBAAqD,IAAI,EAA0B,CACxF,MAAM,KAAK,iBAAiB,oBAAoB,KAAM,GAAG,CAAI,EAStD,oBAAoB,EAAS,CACpC,QAAW,KAAS,EACnB,KAAK,cAAc,GAAS,CAAC,EAE9B,QAAW,KAAU,KAAK,SAAU,CACnC,IAAM,EAAQ,EAAO,OAAS,SAC9B,KAAK,cAAc,GAAO,KAAK,CAAM,EAEtC,QAAW,KAAS,EACnB,KAAK,cAAc,GAAO,KAAK,CAAC,EAAG,IAAM,CACxC,IAAM,EAAY,EAAE,UAAY,EAEhC,OADkB,EAAE,UAAY,GACb,EACnB,EAUH,oBAAoB,CAAC,EAAe,EAA2B,CAC9D,KAAK,yBAAyB,EAC9B,IAAM,EAAS,KAAK,SAAS,KAAK,KAAU,EAAO,QAAU,CAAK,EAClE,GAAI,CAAC,EAAQ,MAAO,GAQpB,OALA,EAAO,SAAW,EAGlB,KAAK,qBAAqB,EAEnB,GASR,iBAAiB,CAAC,EAAe,EAA6B,CAC7D,KAAK,yBAAyB,EAC9B,IAAM,EAAS,KAAK,SAAS,KAAK,KAAU,EAAO,QAAU,CAAK,EAClE,GAAI,CAAC,EAAQ,MAAO,GAKpB,OAHA,EAAO,MAAQ,EACf,KAAK,qBAAqB,EAEnB,MASJ,mBAAkB,EAAW,CAChC,OAAO,KAAK,uBAMT,QAAO,EAAW,CACrB,OAAO,KAAK,SASb,kBAAkB,CAAC,EAAyB,CAC3C,KAAK,gBAAgB,IAAI,CAAS,EAOnC,iBAAiB,CAAC,EAAyB,CAC1C,KAAK,gBAAgB,OAAO,CAAS,EAQtC,oBAAoB,CAAC,EAA4B,CAChD,MAAO,CAAC,KAAK,gBAAgB,IAAI,CAAS,EAQ3C,iBAAiB,CAAC,EAA6B,CAE9C,OADA,KAAK,yBAAyB,EACvB,KAAK,SACV,OAAO,KAAU,EAAO,QAAQ,SAAS,CAAS,CAAC,EACnD,IAAI,KAAU,EAAO,KAAK,EAS7B,YAAY,CAAC,EAAwB,CACpC,KAAK,yBAAyB,EAC9B,IAAM,EAAQ,KAAK,SAAS,UAAU,KAAU,EAAO,QAAU,CAAK,EACtE,GAAI,IAAU,GAAI,MAAO,GAEzB,IAAM,EAAS,KAAK,SAAS,GAE7B,GAAI,CAAC,EAAQ,MAAO,GAGpB,GAAI,EAAO,SACV,EAAO,SAAS,IAAI,EAWrB,OAPA,KAAK,SAAS,OAAO,EAAO,CAAC,EAC7B,KAAK,gBAAgB,OAAO,CAAM,EAClC,KAAK,qBAAqB,OAAO,CAAM,EAGvC,KAAK,qBAAqB,EAEnB,GAOR,eAAe,CAAC,EAAqC,CAOpD,GANA,KAAK,SAAS,KAAK,CAAM,EAKzB,KAAK,gBAAgB,IAAI,EAAQ,KAAK,gBAAgB,EAClD,CAAC,KAAK,uBACT,KAAK,qBAAqB,EAI3B,GAAI,EAAO,cAAe,CACzB,IAAM,EAAW,IAAI,IACrB,QAAW,KAAa,EAAO,cAC9B,EAAS,IAAI,EAAW,IAAI,GAAK,EAElC,KAAK,qBAAqB,IAAI,EAAQ,CAAQ,EAI/C,GAAI,CAAC,EAAO,cAAe,OAE3B,QAAW,KAAa,EAAO,cAAe,CAC7C,IAAM,EAAU,EAAO,cAAc,GACrC,GAAI,EACH,KAAK,UAAU,UAAU,EAAW,CAAC,IAAS,CAC7C,EAAQ,CAAE,OAAM,IAAK,IAAK,CAAC,EAC3B,GAQJ,WAA6C,CAAC,EAAiB,CAC9D,OAAO,KAAK,iBAAiB,IAAI,CAAG,EAUrC,WAA6C,CAAC,EAA6B,CAC1E,GAAI,CAAC,KAAK,iBAAiB,IAAI,CAAG,EACjC,MAAU,MAAM,aAAa,OAAO,CAAG,uCAAuC,KAAK,gBAAgB,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,EAGvI,OAAO,KAAK,iBAAiB,IAAI,EAAK,IAAI,EAsB3C,cAAc,CAAC,EAAsB,CACpC,IAAM,EAAI,EACV,GAAI,CAAC,KAAK,iBAAiB,IAAI,CAAC,EAAG,OACnC,OAAO,KAAK,iBAAiB,IAAI,EAAG,IAAI,EAWzC,WAA6C,CAC5C,EACA,EAKO,CAEP,OADA,KAAK,iBAAiB,IAAI,EAAK,CAAQ,EAChC,KAQR,cAAgD,CAAC,EAAiB,CACjE,OAAO,KAAK,iBAAiB,OAAO,CAAG,OAQlC,gBAAiD,CAAC,EAA0B,CACjF,OAAO,KAAK,iBAAiB,gBAAgB,EAAK,IAAI,OAQjD,iBAAgB,EAAkB,CACvC,OAAO,KAAK,iBAAiB,iBAAiB,IAAI,EAUnD,cAAgD,CAC/C,EACA,EACO,CACP,IAAM,EAAW,KAAK,YAAY,CAAG,EAC/B,EAAW,EAAQ,CAAQ,EAGjC,OAFA,KAAK,iBAAiB,IAAI,EAAK,CAAQ,EACvC,KAAK,iBAAiB,aAAa,EAAK,EAAU,CAAQ,EACnD,KAUR,WAA6C,CAC5C,EACA,EACO,CACP,IAAM,EAAW,KAAK,eAAe,CAAG,EAExC,GADA,KAAK,iBAAiB,IAAI,EAAK,CAAK,EAChC,IAAa,OAChB,KAAK,iBAAiB,aAAa,EAAK,EAAO,CAAQ,EAExD,OAAO,KASR,gBAAkD,CACjD,EACA,EACa,CACb,OAAO,KAAK,iBAAiB,iBAAiB,EAAK,CAAQ,EAO5D,eAAe,EAAkC,CAChD,OAAO,KAAK,iBAAiB,QAAQ,EAQtC,2BAA6D,CAAC,EAAiB,CAC9E,OAAO,KAAK,iBAAiB,oBAAoB,CAAG,EAQrD,SAAS,CAAC,EAAyD,CAClE,OAAO,KAAK,eAAe,UAAU,CAAQ,EAS9C,YAA+C,CAC9C,EACA,EACmC,CACnC,OAAO,KAAK,eAAe,aAAa,EAAU,CAAa,EAUhE,YAA+C,CAC9C,EACA,EACA,EACO,CACP,KAAK,eAAe,aAAa,EAAU,EAAe,CAAK,EAQhE,aAAkF,CACjF,EACA,EACO,CACP,KAAK,eAAe,cAAc,EAAU,CAAU,EASvD,eAAkD,CACjD,EACA,EACO,CACP,KAAK,eAAe,gBAAgB,EAAU,CAAa,EAM5D,YAA+C,CAC9C,EACA,EACU,CAEV,OADkB,KAAK,eAAe,aAAa,EAAU,CAAa,IACrD,OAQtB,KAA0E,CACzE,EACuE,CACvE,IAAM,EAAS,KAAK,eAAe,aAAa,EAEhD,OADA,KAAK,eAAe,cAAc,EAAO,GAAI,CAAU,EAChD,EAMR,oBAGC,CACA,EACA,EAAsD,CAAC,EACvD,EACA,EAC8E,CAC9E,OAAO,KAAK,eAAe,qBAC1B,EACA,EACA,EACA,EAAoB,KAAK,iBAAmB,OAC5C,CACD,EAUD,YAGC,CACA,EACA,EAAsD,CAAC,EACgB,CACvE,IAAM,EAAU,KAAK,eAAe,qBAAqB,EAAgB,CAAiB,EAC1F,GAAI,EAAQ,SAAW,EACtB,MAAU,MAAM,+CAA+C,OAAO,CAAc,eAAe,OAAO,CAAiB,IAAI,EAEhI,GAAI,EAAQ,OAAS,EACpB,MAAU,MAAM,6CAA6C,EAAQ,+BAA+B,OAAO,CAAc,eAAe,OAAO,CAAiB,IAAI,EAErK,IAAM,EAAS,EAAQ,GACvB,GAAI,CAAC,EAAQ,MAAU,MAAM,uCAAuC,EACpE,OAAO,EAWR,eAGC,CACA,EACA,EAAsD,CAAC,EAC4B,CACnF,IAAM,EAAU,KAAK,eAAe,qBAAqB,EAAgB,CAAiB,EAC1F,GAAI,EAAQ,SAAW,EAAG,OAC1B,GAAI,EAAQ,OAAS,EACpB,MAAU,MAAM,qDAAqD,EAAQ,+BAA+B,OAAO,CAAc,eAAe,OAAO,CAAiB,IAAI,EAE7K,OAAO,EAAQ,GAShB,YAAY,CAAC,EAAkB,EAAwC,CACtE,OAAO,KAAK,eAAe,aAAa,EAAU,CAAO,EAW1D,UAA+E,CAC9E,EACA,EACuE,CACvE,IAAM,EAAS,KAAK,eAAe,WAAW,EAAU,CAAU,EAElE,OADA,KAAK,sBAAsB,EAAO,GAAI,KAAM,CAAQ,EAC7C,EAQR,SAAS,CAAC,EAAiB,EAAwB,CAClD,IAAM,EAAY,KAAK,eAAe,UAAU,CAAO,EAGvD,OAFA,KAAK,eAAe,UAAU,EAAS,CAAQ,EAC/C,KAAK,sBAAsB,EAAS,EAAW,CAAQ,EAChD,KAQR,YAAY,CAAC,EAA0B,CACtC,IAAM,EAAY,KAAK,eAAe,UAAU,CAAO,EACjD,EAAS,KAAK,eAAe,aAAa,CAAO,EACvD,GAAI,EACH,KAAK,sBAAsB,EAAS,EAAW,IAAI,EAEpD,OAAO,EAQR,SAAS,CAAC,EAAiC,CAC1C,OAAO,KAAK,eAAe,UAAU,CAAQ,EAQ9C,WAAW,CAAC,EAAqC,CAChD,OAAO,KAAK,eAAe,YAAY,CAAQ,EAShD,UAAU,CAAC,EAAkB,EAA8B,CAC1D,OAAO,KAAK,eAAe,WAAW,EAAU,CAAK,EAStD,aAAa,CAAC,EAAkB,EAAyB,CACxD,OAAO,KAAK,eAAe,cAAc,EAAU,CAAO,EAQ3D,YAAY,CAAC,EAAqC,CACjD,OAAO,KAAK,eAAe,aAAa,CAAQ,EAQjD,cAAc,CAAC,EAAqC,CACnD,OAAO,KAAK,eAAe,eAAe,CAAQ,EAQnD,OAAO,CAAC,EAA0B,CACjC,OAAO,KAAK,eAAe,QAAQ,CAAQ,EAQ5C,WAAW,CAAC,EAAqC,CAChD,OAAO,KAAK,eAAe,YAAY,CAAQ,EAShD,cAAc,CAAC,EAAkB,EAA6B,CAC7D,OAAO,KAAK,eAAe,eAAe,EAAU,CAAU,EAS/D,YAAY,CAAC,EAAkB,EAA+B,CAC7D,OAAO,KAAK,eAAe,aAAa,EAAU,CAAY,EAO/D,eAAe,EAAsB,CACpC,OAAO,KAAK,eAAe,gBAAgB,EAS5C,kBAAkB,CACjB,EACA,EACO,CACP,KAAK,eAAe,mBAAmB,EAAU,CAAO,EASzD,iBAAiB,CAAC,EAA8E,CAC/F,OAAO,KAAK,eAAe,kBAAkB,CAAO,EAO7C,qBAAqB,CAAC,EAAkB,EAA0B,EAAgC,CAGxG,KAAK,UAA2C,QAAQ,mBAAoB,CAAE,WAAU,YAAW,WAAU,CAAC,KAM5G,iBAAgB,EAAa,CAChC,OAAO,MAAM,KAAK,KAAK,iBAAiB,KAIrC,cAAa,EAAG,CACnB,OAAO,KAAK,kBAGT,SAAQ,EAAG,CAEd,OADA,KAAK,yBAAyB,EACvB,KAAK,aAcT,SAAQ,EAAG,CACd,OAAO,KAAK,kBAMT,YAAW,EAAW,CACzB,OAAO,KAAK,gBAST,gBAAe,EAAW,CAC7B,OAAO,KAAK,iBAUb,iBAAiB,CAAC,EAAwB,CAEzC,GADA,KAAK,oBAAsB,EACvB,CAAC,EACJ,KAAK,eAAe,MAAM,EAC1B,KAAK,cAAgB,CACpB,UAAW,EAAG,YAAa,EAAG,OAAQ,EAAG,WAAY,EAAG,OAAQ,CACjE,KAIE,mBAAkB,EAAY,CACjC,OAAO,KAAK,uBAGT,cAAa,EAAgC,CAChD,OAAO,KAAK,kBAGT,aAAY,EAA0C,CACzD,OAAO,KAAK,iBAGT,YAAW,EAAW,CACzB,OAAO,KAAK,eAAe,YAW5B,eAAkD,CACjD,EACA,EACA,EACuB,CACvB,IAAM,EAAY,KAAK,eAAe,aAAa,EAAU,CAAa,EAC1E,GAAI,IAAc,OACjB,MAAU,MAAM,UAAU,8BAAqC,OAAO,CAAa,IAAI,EAIxF,OAFA,EAAQ,CAAS,EACjB,KAAK,eAAe,YAAY,EAAU,CAAa,EAChD,EAUR,WAA8C,CAAC,EAAkB,EAAwB,CACxF,KAAK,eAAe,YAAY,EAAU,CAAa,EAYxD,eAAkD,CACjD,EACA,EACO,CACP,KAAK,eAAe,gBAAgB,EAAe,CAAQ,EAc5D,gBAGC,CACA,EACA,EACA,EACO,CACP,GAAI,OAAO,CAAO,IAAM,OAAO,CAAQ,EACtC,MAAU,MAAM,oDAAoD,OAAO,CAAO,IAAI,EAGvF,IAAM,EAAW,KAAK,oBAAoB,IAAI,CAAO,GAAK,CAAC,EAE3D,GAAI,EAAS,KAAK,KAAK,EAAE,YAAc,CAAQ,EAC9C,MAAU,MACT,uBAAuB,OAAO,CAAQ,sCAAsC,OAAO,CAAO,IAC3F,EAGD,KAAK,oBAAoB,EAAS,CAAQ,EAE1C,EAAS,KAAK,CAAE,UAAW,EAAU,QAAS,CAA8C,CAAC,EAC7F,KAAK,oBAAoB,IAAI,EAAS,CAAQ,EAOvC,mBAAmB,CAC1B,EACA,EACO,CACP,EACC,EACA,EACA,CAAC,IAAc,KAAK,oBAAoB,IAAI,CAAS,CACtD,EAWD,gBAAmD,CAClD,EACA,EACa,CACb,OAAO,KAAK,eAAe,iBAAiB,EAAe,CAAO,EASnE,kBAAqD,CACpD,EACA,EACa,CACb,OAAO,KAAK,eAAe,mBAAmB,EAAe,CAAO,EAUrE,gBAIC,CACA,EACA,EACO,CACP,KAAK,sBAAsB,SAAS,EAAM,CAAU,EAQrD,mBAAmB,CAAC,EAAmC,CACtD,OAAO,KAAK,sBAAsB,YAAY,CAAI,EAWnD,EAAiC,CAChC,EACA,EACa,CACb,OAAO,KAAK,UAAU,UAAU,EAAW,CAAQ,EASpD,GAAkC,CACjC,EACA,EACU,CACV,OAAO,KAAK,UAAU,YAAY,EAAW,CAAQ,EAQtD,YAAY,CACX,EACa,CAEb,OADA,KAAK,iBAAiB,KAAK,CAAQ,EAC5B,IAAM,CACZ,IAAM,EAAQ,KAAK,iBAAiB,QAAQ,CAAQ,EACpD,GAAI,IAAU,GACb,KAAK,iBAAiB,OAAO,EAAO,CAAC,GAOhC,mBAAmB,EAAgC,CAC1D,GAAI,CAAC,KAAK,cACT,MAAU,MAAM,4DAA4D,EAE7E,OAAO,KAAK,cAMb,QAAuC,CAAC,EAA0B,CACjE,OAAO,KAAK,oBAAoB,EAAE,IAAI,CAAG,EAM1C,WAA0C,CAAC,EAAsC,CAChF,OAAO,KAAK,eAAe,OAAO,CAAG,EAMtC,cAA6C,CAAC,EAAuC,CACpF,OAAO,KAAK,oBAAoB,EAAE,UAAU,CAAG,EAMhD,aAA4C,CAAC,EAAiB,CAC7D,OAAO,KAAK,eAAe,SAAS,CAAG,GAAK,QAMvC,UAAwC,CAAC,EAAmC,CACjF,OAAO,KAAK,oBAAoB,EAAE,UAAU,CAAG,OAM1C,eAAc,CAAC,EAA2C,CAC/D,OAAO,KAAK,oBAAoB,EAAE,eAAe,CAAS,EAM3D,kBAAkB,CAAC,EAAqC,CACvD,OAAO,KAAK,eAAe,cAAc,CAAS,GAAK,GAMxD,qBAAqB,CAAC,EAAoC,CACzD,OAAO,KAAK,eAAe,iBAAiB,CAAS,GAAK,EAKnD,oBAAoB,EAAkC,CAC7D,GAAI,CAAC,KAAK,eACT,MAAU,MAAM,8DAA8D,EAE/E,OAAO,KAAK,oBAMP,UAAyC,CAC9C,EACA,EACgB,CAChB,OAAO,KAAK,qBAAqB,EAAE,UAAU,EAAM,CAAM,OAMpD,WAA0C,CAC/C,EACA,EACgB,CAChB,OAAO,KAAK,qBAAqB,EAAE,WAAW,EAAM,CAAM,OAMrD,UAAS,EAAkB,CAChC,OAAO,KAAK,qBAAqB,EAAE,UAAU,EAM9C,gBAAgB,EAAgC,CAC/C,OAAO,KAAK,gBAAgB,iBAAiB,GAAK,KAanD,eAAe,CAAC,EAAwC,CACvD,OAAO,KAAK,qBAAqB,EAAE,UAAU,CAAM,EAYpD,kBAAkB,CAAC,EAAwC,CAC1D,OAAO,KAAK,gBAAgB,aAAa,CAAM,GAAK,OAarD,cAAc,CAAC,EAAwC,CACtD,OAAO,KAAK,qBAAqB,EAAE,SAAS,CAAM,EAYnD,iBAAiB,CAAC,EAAwC,CACzD,OAAO,KAAK,gBAAgB,YAAY,CAAM,GAAK,OAmBpD,iBAAiB,CAChB,EACA,EACO,CACP,GAAI,OAAO,IAAmB,SAC7B,KAAK,qBAAqB,EAAE,YAAY,EAAa,CAAc,EAEnE,UAAK,qBAAqB,EAAE,YAAY,CAAc,EAOxD,eAAe,CAAC,EAA2C,CAC1D,OAAO,KAAK,gBAAgB,UAAU,CAAU,GAAK,GAMtD,cAAc,CAAC,EAA2C,CACzD,OAAO,KAAK,gBAAgB,SAAS,CAAU,GAAK,GAMrD,mBAAmB,EAAW,CAC7B,OAAO,KAAK,gBAAgB,cAAc,GAAK,EAShD,gBAAgB,CAAC,EAA4C,CAC5D,KAAK,cAAgB,EACrB,QAAY,EAAK,KAAe,KAAK,qBACpC,KAAK,cAAc,SAAS,EAAK,CAAiB,EAEnD,KAAK,qBAAuB,CAAC,EAO9B,iBAAiB,CAAC,EAA8C,CAC/D,KAAK,eAAiB,EACtB,QAAY,EAAM,KAAe,KAAK,sBACrC,KAAK,eAAe,SAAS,EAAM,CAAiB,EAErD,KAAK,sBAAwB,CAAC,EAI/B,uBAAuB,EAAY,CAClC,OAAO,KAAK,qBAAqB,OAAS,EAI3C,wBAAwB,EAAY,CACnC,OAAO,KAAK,sBAAsB,OAAS,EAO5C,WAAW,CAAC,EAAkB,CAC7B,KAAK,SAAW,EAOjB,cAAc,CAAC,EAAa,EAA4C,CACvE,KAAK,qBAAqB,KAAK,CAAC,EAAK,CAAU,CAAC,EAOjD,eAAe,CAAC,EAAc,EAA8C,CAC3E,KAAK,sBAAsB,KAAK,CAAC,EAAM,CAAU,CAAC,EAOnD,aAAa,CAAC,EAAoD,CAEjE,GAAI,KAAK,kBAAkB,IAAI,EAAO,EAAE,EACvC,OAAO,KASR,OALA,KAAK,kBAAkB,IAAI,EAAO,EAAE,EAGpC,EAAO,QAAQ,IAAW,EAEnB,KAOR,aAAa,EAQoC,CAChD,MAAQ,CAAC,IACR,EAAa,EAAO,EAAE,EAAE,QAAQ,EAAO,OAAO,EAehD,UAAa,CAAC,EAAgC,CAC7C,OAAO,EAAQ,IAAI,EAErB,CC7nDO,SAAS,EASf,CAAC,EAA8B,CAC/B,OAAO,ECxJD,SAAS,EAAI,CAAC,EAAW,EAAqB,CACpD,MAAO,CAAE,IAAG,GAAE,EAMR,SAAS,EAAQ,EAAa,CACpC,MAAO,CAAE,EAAG,EAAG,EAAG,CAAE,EAMd,SAAS,EAAO,CAAC,EAAa,EAAuB,CAC3D,MAAO,CAAE,EAAG,EAAE,EAAI,EAAE,EAAG,EAAG,EAAE,EAAI,EAAE,CAAE,EAM9B,SAAS,EAAO,CAAC,EAAa,EAAuB,CAC3D,MAAO,CAAE,EAAG,EAAE,EAAI,EAAE,EAAG,EAAG,EAAE,EAAI,EAAE,CAAE,EAM9B,SAAS,EAAS,CAAC,EAAa,EAA0B,CAChE,MAAO,CAAE,EAAG,EAAE,EAAI,EAAQ,EAAG,EAAE,EAAI,CAAO,EAMpC,SAAS,EAAU,CAAC,EAAuB,CACjD,MAAO,CAAE,EAAG,CAAC,EAAE,EAAG,EAAG,CAAC,EAAE,CAAE,EAMpB,SAAS,EAAO,CAAC,EAAa,EAAqB,CACzD,OAAO,EAAE,EAAI,EAAE,EAAI,EAAE,EAAI,EAAE,EAMrB,SAAS,EAAS,CAAC,EAAa,EAAqB,CAC3D,OAAO,EAAE,EAAI,EAAE,EAAI,EAAE,EAAI,EAAE,EAMrB,SAAS,EAAY,CAAC,EAAqB,CACjD,OAAO,EAAE,EAAI,EAAE,EAAI,EAAE,EAAI,EAAE,EAMrB,SAAS,EAAU,CAAC,EAAqB,CAC/C,OAAO,KAAK,KAAK,EAAE,EAAI,EAAE,EAAI,EAAE,EAAI,EAAE,CAAC,EAMhC,SAAS,EAAa,CAAC,EAAuB,CACpD,IAAM,EAAM,KAAK,KAAK,EAAE,EAAI,EAAE,EAAI,EAAE,EAAI,EAAE,CAAC,EAC3C,GAAI,IAAQ,EAAG,MAAO,CAAE,EAAG,EAAG,EAAG,CAAE,EACnC,MAAO,CAAE,EAAG,EAAE,EAAI,EAAK,EAAG,EAAE,EAAI,CAAI,EAM9B,SAAS,EAAc,CAAC,EAAa,EAAqB,CAChE,IAAM,EAAK,EAAE,EAAI,EAAE,EACb,EAAK,EAAE,EAAI,EAAE,EACnB,OAAO,EAAK,EAAK,EAAK,EAMhB,SAAS,EAAY,CAAC,EAAa,EAAqB,CAC9D,IAAM,EAAK,EAAE,EAAI,EAAE,EACb,EAAK,EAAE,EAAI,EAAE,EACnB,OAAO,KAAK,KAAK,EAAK,EAAK,EAAK,CAAE,EAM5B,SAAS,EAAU,CAAC,EAAa,EAAa,EAAU,aAAgB,CAC9E,OAAO,KAAK,IAAI,EAAE,EAAI,EAAE,CAAC,GAAK,GAAW,KAAK,IAAI,EAAE,EAAI,EAAE,CAAC,GAAK,ECpGjE,IAAe",
23
- "debugId": "3212F06B56962B5F64756E2164756E21",
23
+ "debugId": "288843F194C573FA64756E2164756E21",
24
24
  "names": []
25
25
  }
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Detection Plugin for ECSpresso
3
+ *
4
+ * Provides automatic proximity detection for entities. Entities with a
5
+ * `detector` component get their `detectedEntities` populated each frame
6
+ * with nearby entities that match the configured collision layer filter,
7
+ * sorted by distance ascending (nearest first).
8
+ *
9
+ * Uses the spatial-index plugin for efficient range queries.
10
+ */
11
+ import { type BasePluginOptions } from 'ecspresso';
12
+ import type { WorldConfigFrom } from 'ecspresso';
13
+ import type { TransformWorldConfig } from '../spatial/transform';
14
+ import type { SpatialIndexResourceTypes } from '../spatial/spatial-index';
15
+ import type { CollisionComponentTypes } from '../physics/collision';
16
+ /**
17
+ * Configures proximity detection for an entity.
18
+ */
19
+ export interface Detector {
20
+ /** Detection radius in world units */
21
+ range: number;
22
+ /** Only detect entities on these collision layers */
23
+ layerFilter: readonly string[];
24
+ /** Maximum number of results to track (default: 32) */
25
+ maxResults: number;
26
+ }
27
+ /**
28
+ * A detected entity with its squared distance from the detector.
29
+ */
30
+ export interface DetectedEntry {
31
+ entityId: number;
32
+ distanceSq: number;
33
+ }
34
+ /**
35
+ * Auto-populated list of detected entities, sorted by distance ascending.
36
+ */
37
+ export interface DetectedEntities {
38
+ entities: readonly DetectedEntry[];
39
+ }
40
+ /**
41
+ * Component types provided by the detection plugin.
42
+ */
43
+ export interface DetectionComponentTypes {
44
+ detector: Detector;
45
+ detectedEntities: DetectedEntities;
46
+ }
47
+ /**
48
+ * Event fired when a new entity enters detection range.
49
+ */
50
+ export interface DetectionGainedEvent {
51
+ /** The entity doing the detecting */
52
+ entityId: number;
53
+ /** The entity that was detected */
54
+ detectedId: number;
55
+ }
56
+ /**
57
+ * Event fired when an entity leaves detection range.
58
+ */
59
+ export interface DetectionLostEvent {
60
+ /** The entity doing the detecting */
61
+ entityId: number;
62
+ /** The entity that was lost */
63
+ lostId: number;
64
+ }
65
+ /**
66
+ * Event types provided by the detection plugin.
67
+ */
68
+ export interface DetectionEventTypes {
69
+ detectionGained: DetectionGainedEvent;
70
+ detectionLost: DetectionLostEvent;
71
+ }
72
+ /**
73
+ * WorldConfig representing the detection plugin's provided types.
74
+ */
75
+ export type DetectionWorldConfig = WorldConfigFrom<DetectionComponentTypes, DetectionEventTypes>;
76
+ export interface DetectionPluginOptions<G extends string = 'ai'> extends BasePluginOptions<G> {
77
+ }
78
+ /**
79
+ * Create a detector component.
80
+ *
81
+ * @param range Detection radius in world units
82
+ * @param layerFilter Only detect entities on these collision layers
83
+ * @param maxResults Maximum results to track (default: 32)
84
+ * @returns Component object suitable for spreading into spawn()
85
+ *
86
+ * @example
87
+ * ```typescript
88
+ * ecs.spawn({
89
+ * ...createDetector(300, ['enemy']),
90
+ * ...createLocalTransform(400, 400),
91
+ * });
92
+ * ```
93
+ */
94
+ export declare function createDetector(range: number, layerFilter: readonly string[], maxResults?: number): Pick<DetectionComponentTypes, 'detector'>;
95
+ /**
96
+ * Create a detection plugin for ECSpresso.
97
+ *
98
+ * Populates `detectedEntities` each frame with nearby entities matching
99
+ * the detector's layer filter, sorted by distance (nearest first).
100
+ * Publishes `detectionGained`/`detectionLost` events on transitions.
101
+ *
102
+ * Requires the spatial-index and transform plugins to be installed.
103
+ *
104
+ * @example
105
+ * ```typescript
106
+ * const ecs = ECSpresso.create()
107
+ * .withPlugin(createTransformPlugin())
108
+ * .withPlugin(createCollisionPlugin({ layers }))
109
+ * .withPlugin(createSpatialIndexPlugin())
110
+ * .withPlugin(createDetectionPlugin())
111
+ * .build();
112
+ *
113
+ * // Read nearest detected entity:
114
+ * const detected = ecs.getComponent(turretId, 'detectedEntities');
115
+ * const nearest = detected?.entities[0];
116
+ * ```
117
+ */
118
+ export declare function createDetectionPlugin<G extends string = 'ai'>(options?: DetectionPluginOptions<G>): import("ecspresso").Plugin<import("ecspresso").WithEvents<import("ecspresso").WithComponents<import("ecspresso").EmptyConfig, DetectionComponentTypes>, DetectionEventTypes>, TransformWorldConfig & WorldConfigFrom<Pick<CollisionComponentTypes<string>, "collisionLayer">> & WorldConfigFrom<{}, {}, SpatialIndexResourceTypes>, "detection-scan", G, never, never>;
@@ -0,0 +1,4 @@
1
+ var C=((k)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(k,{get:(E,J)=>(typeof require<"u"?require:E)[J]}):k)(function(k){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+k+'" is not supported')});import{definePlugin as b}from"ecspresso";function F(k,E,J=32){return{detector:{range:k,layerFilter:E,maxResults:J}}}function q(k,E){return k.distanceSq-E.distanceSq}function g(k){let{systemGroup:E="ai",priority:J=500,phase:G="update"}=k??{},V=new Map,K=new Set,W=new Set,Z=new WeakMap;return b("detection").withComponentTypes().withEventTypes().withLabels().withGroups().requires().install((_)=>{_.registerDispose("detector",({entityId:X})=>{V.delete(X)}),_.addSystem("detection-scan").setPriority(J).inPhase(G).inGroup(E).addQuery("detectors",{with:["detector","worldTransform"]}).setProcess(({queries:X,ecs:z})=>{let P=z.getResource("spatialIndex");for(let A of X.detectors){let{detector:H,worldTransform:O}=A.components;W.clear(),P.queryRadiusInto(O.x,O.y,H.range,W);let L=[],Q=Z.get(H.layerFilter);if(!Q)Q=new Set(H.layerFilter),Z.set(H.layerFilter,Q);for(let j of W){if(j===A.id)continue;if(!z.getEntity(j))continue;let N=z.getComponent(j,"collisionLayer");if(!N)continue;if(!Q.has(N.layer))continue;let Y=z.getComponent(j,"worldTransform");if(!Y)continue;let B=Y.x-O.x,D=Y.y-O.y;L.push({entityId:j,distanceSq:B*B+D*D})}L.sort(q);let U=L.length>H.maxResults?L.slice(0,H.maxResults):L,$=z.getComponent(A.id,"detectedEntities");if($)$.entities=U,z.markChanged(A.id,"detectedEntities");else z.addComponent(A.id,"detectedEntities",{entities:U});let M=V.get(A.id);K.clear();for(let j of U)K.add(j.entityId);if(M){for(let j of K)if(!M.has(j))z.eventBus.publish("detectionGained",{entityId:A.id,detectedId:j});for(let j of M)if(!K.has(j))z.eventBus.publish("detectionLost",{entityId:A.id,lostId:j});M.clear();for(let j of K)M.add(j)}else{let j=new Set;for(let N of U)j.add(N.entityId),z.eventBus.publish("detectionGained",{entityId:A.id,detectedId:N.entityId});V.set(A.id,j)}}})})}export{F as createDetector,g as createDetectionPlugin};
2
+
3
+ //# debugId=0908791952E86B8564756E2164756E21
4
+ //# sourceMappingURL=detection.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/plugins/ai/detection.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Detection Plugin for ECSpresso\n *\n * Provides automatic proximity detection for entities. Entities with a\n * `detector` component get their `detectedEntities` populated each frame\n * with nearby entities that match the configured collision layer filter,\n * sorted by distance ascending (nearest first).\n *\n * Uses the spatial-index plugin for efficient range queries.\n */\n\nimport { definePlugin, type BasePluginOptions } from 'ecspresso';\nimport type { WorldConfigFrom } from 'ecspresso';\nimport type { TransformWorldConfig } from '../spatial/transform';\nimport type { SpatialIndexResourceTypes } from '../spatial/spatial-index';\nimport type { CollisionComponentTypes } from '../physics/collision';\n\n// ==================== Component Types ====================\n\n/**\n * Configures proximity detection for an entity.\n */\nexport interface Detector {\n\t/** Detection radius in world units */\n\trange: number;\n\t/** Only detect entities on these collision layers */\n\tlayerFilter: readonly string[];\n\t/** Maximum number of results to track (default: 32) */\n\tmaxResults: number;\n}\n\n/**\n * A detected entity with its squared distance from the detector.\n */\nexport interface DetectedEntry {\n\tentityId: number;\n\tdistanceSq: number;\n}\n\n/**\n * Auto-populated list of detected entities, sorted by distance ascending.\n */\nexport interface DetectedEntities {\n\tentities: readonly DetectedEntry[];\n}\n\n/**\n * Component types provided by the detection plugin.\n */\nexport interface DetectionComponentTypes {\n\tdetector: Detector;\n\tdetectedEntities: DetectedEntities;\n}\n\n// ==================== Event Types ====================\n\n/**\n * Event fired when a new entity enters detection range.\n */\nexport interface DetectionGainedEvent {\n\t/** The entity doing the detecting */\n\tentityId: number;\n\t/** The entity that was detected */\n\tdetectedId: number;\n}\n\n/**\n * Event fired when an entity leaves detection range.\n */\nexport interface DetectionLostEvent {\n\t/** The entity doing the detecting */\n\tentityId: number;\n\t/** The entity that was lost */\n\tlostId: number;\n}\n\n/**\n * Event types provided by the detection plugin.\n */\nexport interface DetectionEventTypes {\n\tdetectionGained: DetectionGainedEvent;\n\tdetectionLost: DetectionLostEvent;\n}\n\n// ==================== WorldConfig ====================\n\n/**\n * WorldConfig representing the detection plugin's provided types.\n */\nexport type DetectionWorldConfig = WorldConfigFrom<DetectionComponentTypes, DetectionEventTypes>;\n\n// ==================== Plugin Options ====================\n\nexport interface DetectionPluginOptions<G extends string = 'ai'> extends BasePluginOptions<G> {}\n\n// ==================== Helper Functions ====================\n\n/**\n * Create a detector component.\n *\n * @param range Detection radius in world units\n * @param layerFilter Only detect entities on these collision layers\n * @param maxResults Maximum results to track (default: 32)\n * @returns Component object suitable for spreading into spawn()\n *\n * @example\n * ```typescript\n * ecs.spawn({\n * ...createDetector(300, ['enemy']),\n * ...createLocalTransform(400, 400),\n * });\n * ```\n */\nexport function createDetector(\n\trange: number,\n\tlayerFilter: readonly string[],\n\tmaxResults = 32,\n): Pick<DetectionComponentTypes, 'detector'> {\n\treturn { detector: { range, layerFilter, maxResults } };\n}\n\n// ==================== Plugin Factory ====================\n\nfunction compareByDistance(a: DetectedEntry, b: DetectedEntry): number {\n\treturn a.distanceSq - b.distanceSq;\n}\n\n/**\n * Create a detection plugin for ECSpresso.\n *\n * Populates `detectedEntities` each frame with nearby entities matching\n * the detector's layer filter, sorted by distance (nearest first).\n * Publishes `detectionGained`/`detectionLost` events on transitions.\n *\n * Requires the spatial-index and transform plugins to be installed.\n *\n * @example\n * ```typescript\n * const ecs = ECSpresso.create()\n * .withPlugin(createTransformPlugin())\n * .withPlugin(createCollisionPlugin({ layers }))\n * .withPlugin(createSpatialIndexPlugin())\n * .withPlugin(createDetectionPlugin())\n * .build();\n *\n * // Read nearest detected entity:\n * const detected = ecs.getComponent(turretId, 'detectedEntities');\n * const nearest = detected?.entities[0];\n * ```\n */\nexport function createDetectionPlugin<G extends string = 'ai'>(\n\toptions?: DetectionPluginOptions<G>,\n) {\n\tconst {\n\t\tsystemGroup = 'ai',\n\t\tpriority = 500,\n\t\tphase = 'update',\n\t} = options ?? {};\n\n\t// Per-detector tracking of previous frame's detected set for event diffing\n\tconst previousSets = new Map<number, Set<number>>();\n\tconst currentSet = new Set<number>();\n\t// Reusable set for spatial index queries (avoids allocation per frame)\n\tconst candidateSet = new Set<number>();\n\t// Cache: layerFilter array → Set for O(1) lookups\n\tconst layerFilterCache = new WeakMap<readonly string[], Set<string>>();\n\n\treturn definePlugin('detection')\n\t\t.withComponentTypes<DetectionComponentTypes>()\n\t\t.withEventTypes<DetectionEventTypes>()\n\t\t.withLabels<'detection-scan'>()\n\t\t.withGroups<G>()\n\t\t.requires<\n\t\t\tTransformWorldConfig &\n\t\t\tWorldConfigFrom<Pick<CollisionComponentTypes<string>, 'collisionLayer'>> &\n\t\t\tWorldConfigFrom<{}, {}, SpatialIndexResourceTypes>\n\t\t>()\n\t\t.install((world) => {\n\t\t\tworld.registerDispose('detector', ({ entityId }) => {\n\t\t\t\tpreviousSets.delete(entityId);\n\t\t\t});\n\n\t\t\tworld\n\t\t\t\t.addSystem('detection-scan')\n\t\t\t\t.setPriority(priority)\n\t\t\t\t.inPhase(phase)\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.addQuery('detectors', {\n\t\t\t\t\twith: ['detector', 'worldTransform'],\n\t\t\t\t})\n\t\t\t\t.setProcess(({ queries, ecs }) => {\n\t\t\t\t\tconst spatialIndex = ecs.getResource('spatialIndex');\n\n\t\t\t\t\tfor (const entity of queries.detectors) {\n\t\t\t\t\t\tconst { detector, worldTransform } = entity.components;\n\n\t\t\t\t\t\tcandidateSet.clear();\n\t\t\t\t\t\tspatialIndex.queryRadiusInto(worldTransform.x, worldTransform.y, detector.range, candidateSet);\n\n\t\t\t\t\t\t// Build sorted results, filtering by layer and excluding self\n\t\t\t\t\t\tconst entries: DetectedEntry[] = [];\n\n\t\t\t\t\t\tlet filterSet = layerFilterCache.get(detector.layerFilter);\n\t\t\t\t\t\tif (!filterSet) {\n\t\t\t\t\t\t\tfilterSet = new Set(detector.layerFilter);\n\t\t\t\t\t\t\tlayerFilterCache.set(detector.layerFilter, filterSet);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (const candidateId of candidateSet) {\n\t\t\t\t\t\t\tif (candidateId === entity.id) continue;\n\t\t\t\t\t\t\tif (!ecs.getEntity(candidateId)) continue;\n\n\t\t\t\t\t\t\tconst layer = ecs.getComponent(candidateId, 'collisionLayer');\n\t\t\t\t\t\t\tif (!layer) continue;\n\t\t\t\t\t\t\tif (!filterSet.has(layer.layer)) continue;\n\n\t\t\t\t\t\t\tconst candidateTransform = ecs.getComponent(candidateId, 'worldTransform');\n\t\t\t\t\t\t\tif (!candidateTransform) continue;\n\n\t\t\t\t\t\t\tconst dx = candidateTransform.x - worldTransform.x;\n\t\t\t\t\t\t\tconst dy = candidateTransform.y - worldTransform.y;\n\t\t\t\t\t\t\tentries.push({ entityId: candidateId, distanceSq: dx * dx + dy * dy });\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tentries.sort(compareByDistance);\n\t\t\t\t\t\tconst capped = entries.length > detector.maxResults\n\t\t\t\t\t\t\t? entries.slice(0, detector.maxResults)\n\t\t\t\t\t\t\t: entries;\n\n\t\t\t\t\t\t// Update or add the detectedEntities component\n\t\t\t\t\t\tconst existing = ecs.getComponent(entity.id, 'detectedEntities');\n\t\t\t\t\t\tif (existing) {\n\t\t\t\t\t\t\t(existing as { entities: readonly DetectedEntry[] }).entities = capped;\n\t\t\t\t\t\t\tecs.markChanged(entity.id, 'detectedEntities');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tecs.addComponent(entity.id, 'detectedEntities', { entities: capped });\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Diff against previous frame for events\n\t\t\t\t\t\tconst prev = previousSets.get(entity.id);\n\t\t\t\t\t\tcurrentSet.clear();\n\t\t\t\t\t\tfor (const entry of capped) {\n\t\t\t\t\t\t\tcurrentSet.add(entry.entityId);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (prev) {\n\t\t\t\t\t\t\t// Detect gained\n\t\t\t\t\t\t\tfor (const id of currentSet) {\n\t\t\t\t\t\t\t\tif (!prev.has(id)) {\n\t\t\t\t\t\t\t\t\tecs.eventBus.publish('detectionGained', {\n\t\t\t\t\t\t\t\t\t\tentityId: entity.id,\n\t\t\t\t\t\t\t\t\t\tdetectedId: id,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Detect lost\n\t\t\t\t\t\t\tfor (const id of prev) {\n\t\t\t\t\t\t\t\tif (!currentSet.has(id)) {\n\t\t\t\t\t\t\t\t\tecs.eventBus.publish('detectionLost', {\n\t\t\t\t\t\t\t\t\t\tentityId: entity.id,\n\t\t\t\t\t\t\t\t\t\tlostId: id,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Update previous set in place\n\t\t\t\t\t\t\tprev.clear();\n\t\t\t\t\t\t\tfor (const id of currentSet) {\n\t\t\t\t\t\t\t\tprev.add(id);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// First frame — all are gained\n\t\t\t\t\t\t\tconst newSet = new Set<number>();\n\t\t\t\t\t\t\tfor (const entry of capped) {\n\t\t\t\t\t\t\t\tnewSet.add(entry.entityId);\n\t\t\t\t\t\t\t\tecs.eventBus.publish('detectionGained', {\n\t\t\t\t\t\t\t\t\tentityId: entity.id,\n\t\t\t\t\t\t\t\t\tdetectedId: entry.entityId,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tpreviousSets.set(entity.id, newSet);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "0908791952E86B8564756E2164756E21",
9
+ "names": []
10
+ }
@@ -1,4 +1,4 @@
1
1
  var A=((Q)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(Q,{get:($,Y)=>(typeof require<"u"?require:$)[Y]}):Q)(function(Q){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+Q+'" is not supported')});import{definePlugin as B}from"ecspresso";function I(Q){return Object.freeze(Q)}function S(Q,$,Y){return{audioSource:{sound:Q,channel:$,volume:Y?.volume??1,loop:Y?.loop??!1,autoRemove:Y?.autoRemove??!1,playing:!1,_soundId:-1}}}function f(Q,$){return()=>import("howler").then(({Howl:Y})=>new Promise((T,H)=>{let Z,K=!1;if(Z=new Y({src:Array.isArray(Q)?Q:[Q],html5:$?.html5??!1,preload:$?.preload??!0,onload:()=>{K=!0,T(Z)},onloaderror:(U,G)=>H(G instanceof Error?G:Error(String(G)))}),!K&&Z.state?.()==="loaded")T(Z)}))}function w(Q){let{channels:$,systemGroup:Y="audio",priority:T=0,phase:H="update"}=Q,Z=new Map,K=new Map,U=new Map,G=1,j=!1,N=[];for(let[z,q]of Object.entries($))Z.set(z,q.volume),N.push(z);let P=N[0];function E(z,q){if(j)return 0;let F=Z.get(q)??1;return z*F*G}function R(z){for(let F of K.values()){if(F.channel!==z)continue;F.howl.volume(E(F.individualVolume,z),F.soundId)}let q=U.get(z);if(q)q.howl.volume(E(q.individualVolume,z),q.soundId)}function W(){for(let z of N)R(z)}function b(z){let q=K.get(z);if(!q)return;q.howl.stop(z),K.delete(z)}let k=null,D=null,O={play(z,q){if(!D)return-1;let F=q?.channel??P,X=q?.volume??1,L=q?.loop??!1,M=D(z);M.volume(E(X,F)),M.loop(L);let J=M.play(),_={howl:M,soundId:J,channel:F,individualVolume:X,assetKey:z,entityId:-1};return K.set(J,_),M.once("end",()=>{K.delete(J),k?.publish("soundEnded",{entityId:-1,soundId:J,sound:z})},J),J},stop(z){b(z)},playMusic(z,q){if(!D)return;let F=q?.channel??P,X=q?.volume??1,L=q?.loop??!0,M=U.get(F);if(M)M.howl.stop(M.soundId),K.delete(M.soundId);let J=D(z);J.volume(E(X,F)),J.loop(L);let _=J.play(),x={howl:J,soundId:_,channel:F,individualVolume:X,assetKey:z};U.set(F,x),K.set(_,{...x,entityId:-1}),J.once("end",()=>{if(K.delete(_),U.get(F)?.soundId===_)U.delete(F)},_)},stopMusic(z){if(z!==void 0){let q=U.get(z);if(q)q.howl.stop(q.soundId),K.delete(q.soundId),U.delete(z)}else for(let[q,F]of U)F.howl.stop(F.soundId),K.delete(F.soundId),U.delete(q)},pauseMusic(z){if(z!==void 0){let q=U.get(z);if(q)q.howl.pause(q.soundId)}else for(let q of U.values())q.howl.pause(q.soundId)},resumeMusic(z){if(z!==void 0){let q=U.get(z);if(q)q.howl.play(q.soundId)}else for(let q of U.values())q.howl.play(q.soundId)},setChannelVolume(z,q){Z.set(z,q),R(z)},getChannelVolume(z){return Z.get(z)??1},setMasterVolume(z){G=z,W()},getMasterVolume(){return G},mute(){j=!0,W()},unmute(){j=!1,W()},toggleMute(){j=!j,W()},isMuted(){return j}};return B("audio").withComponentTypes().withEventTypes().withResourceTypes().withLabels().withGroups().withReactiveQueryNames().install((z)=>{z.addResource("audioState",O),z.registerDispose("audioSource",({value:q})=>{if(q._soundId!==-1)b(q._soundId)}),z.addSystem("audio-sync").setPriority(T).inPhase(H).inGroup(Y).setOnInitialize((q)=>{k=q.eventBus;let F=q.tryGetResource("$assets");if(F)D=(X)=>F.get(X);q.addReactiveQuery("audio-sources",{with:["audioSource"],onEnter:(X)=>{let L=X.components.audioSource;if(!D)return;if(L._soundId!==-1)return;let M=D(L.sound);M.volume(E(L.volume,L.channel)),M.loop(L.loop);let J=M.play();L._soundId=J,L.playing=!0;let _={howl:M,soundId:J,channel:L.channel,individualVolume:L.volume,assetKey:L.sound,entityId:X.id};K.set(J,_),M.once("end",()=>{if(K.delete(J),L.playing=!1,k?.publish("soundEnded",{entityId:X.id,soundId:J,sound:L.sound}),L.autoRemove)q.commands.removeEntity(X.id)},J)},onExit:(X)=>{}})}).setEventHandlers({playSound({data:q,ecs:F}){F.getResource("audioState").play(q.sound,{channel:q.channel,volume:q.volume,loop:q.loop})},stopMusic({data:q,ecs:F}){F.getResource("audioState").stopMusic(q.channel)}}).setOnDetach(()=>{for(let q of K.values())q.howl.stop(q.soundId);K.clear(),U.clear(),k=null,D=null})})}function v(Q){return{createAudioSource:S}}export{f as loadSound,I as defineAudioChannels,S as createAudioSource,w as createAudioPlugin,v as createAudioHelpers};
2
2
 
3
- //# debugId=3DA90E7DCE062E0E64756E2164756E21
3
+ //# debugId=FFF17E90E1B1E9CB64756E2164756E21
4
4
  //# sourceMappingURL=audio.js.map
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/plugins/audio.ts"],
3
+ "sources": ["../src/plugins/audio/audio.ts"],
4
4
  "sourcesContent": [
5
5
  "/**\n * Audio Plugin for ECSpresso\n *\n * Web Audio API integration via Howler.js for sound effects and music playback.\n * User-defined channels with type-safe volume control, hybrid resource + component API,\n * and asset manager integration.\n */\n\nimport { definePlugin, type BasePluginOptions } from 'ecspresso';\nimport type { AssetsOfWorld, AnyECSpresso, ChannelOfWorld } from 'ecspresso';\nimport type { Howl } from 'howler';\n\n// ==================== Channel Definition ====================\n\n/**\n * Configuration for a single audio channel.\n */\nexport interface AudioChannelConfig {\n\treadonly volume: number;\n}\n\n/**\n * Define audio channels with type-safe names and initial volumes.\n * Mirrors `defineCollisionLayers` pattern.\n *\n * @param channels Object mapping channel names to their configuration\n * @returns Frozen channel configuration with inferred channel name union\n *\n * @example\n * ```typescript\n * const channels = defineAudioChannels({\n * sfx: { volume: 1 },\n * music: { volume: 0.7 },\n * ui: { volume: 0.8 },\n * });\n * type Ch = ChannelsOf<typeof channels>; // 'sfx' | 'music' | 'ui'\n * ```\n */\nexport function defineAudioChannels<const T extends Record<string, AudioChannelConfig>>(\n\tchannels: T\n): Readonly<T> {\n\treturn Object.freeze(channels);\n}\n\n/**\n * Extract channel name union from a `defineAudioChannels` result.\n */\nexport type ChannelsOf<T> = T extends Record<infer K extends string, AudioChannelConfig> ? K : never;\n\n// ==================== Component Types ====================\n\n/**\n * Audio source component attached to entities for positional/entity-bound audio.\n */\nexport interface AudioSource<Ch extends string = string> {\n\t/** Asset key for the sound */\n\treadonly sound: string;\n\t/** Channel this sound plays on */\n\treadonly channel: Ch;\n\t/** Individual volume (0-1) */\n\tvolume: number;\n\t/** Whether sound loops */\n\tloop: boolean;\n\t/** Remove entity when sound ends (like timer autoRemove) */\n\tautoRemove: boolean;\n\t/** Whether sound is currently playing (system-managed) */\n\tplaying: boolean;\n\t/** Howler sound ID (system-managed, -1 = not started) */\n\t_soundId: number;\n}\n\n/**\n * Component types provided by the audio plugin.\n */\nexport interface AudioComponentTypes<Ch extends string = string> {\n\taudioSource: AudioSource<Ch>;\n}\n\n// ==================== Event Types ====================\n\n/**\n * Event to trigger fire-and-forget sound playback from any system.\n */\nexport interface PlaySoundEvent<Ch extends string = string> {\n\t/** Asset key for the sound */\n\tsound: string;\n\t/** Channel to play on */\n\tchannel?: Ch;\n\t/** Individual volume (0-1) */\n\tvolume?: number;\n\t/** Whether sound loops */\n\tloop?: boolean;\n}\n\n/**\n * Event to stop music on a channel.\n */\nexport interface StopMusicEvent<Ch extends string = string> {\n\t/** Channel to stop music on. If omitted, stops all music. */\n\tchannel?: Ch;\n}\n\n/**\n * Event published when a sound finishes playing.\n */\nexport interface SoundEndedEvent {\n\t/** Entity ID if sound was entity-attached, -1 for fire-and-forget */\n\tentityId: number;\n\t/** Howler sound ID */\n\tsoundId: number;\n\t/** Asset key of the sound */\n\tsound: string;\n}\n\n/**\n * Event types provided by the audio plugin.\n */\nexport interface AudioEventTypes<Ch extends string = string> {\n\tplaySound: PlaySoundEvent<Ch>;\n\tstopMusic: StopMusicEvent<Ch>;\n\tsoundEnded: SoundEndedEvent;\n}\n\n// ==================== Resource Types ====================\n\n/**\n * Play options for fire-and-forget sound effects.\n */\nexport interface PlayOptions<Ch extends string = string> {\n\t/** Channel to play on (uses first defined channel if omitted) */\n\tchannel?: Ch;\n\t/** Individual volume (0-1, default: 1) */\n\tvolume?: number;\n\t/** Whether to loop (default: false) */\n\tloop?: boolean;\n}\n\n/**\n * Music playback options.\n */\nexport interface MusicOptions<Ch extends string = string> {\n\t/** Channel to play music on (uses first defined channel if omitted) */\n\tchannel?: Ch;\n\t/** Volume (0-1, default: 1) */\n\tvolume?: number;\n\t/** Whether to loop (default: true) */\n\tloop?: boolean;\n}\n\n/**\n * Audio state resource providing fire-and-forget SFX and music control.\n * Effective volume = individual * channel * master.\n */\nexport interface AudioState<Ch extends string = string> {\n\t/** Play a fire-and-forget sound effect. Returns the Howler sound ID. */\n\tplay(sound: string, options?: PlayOptions<Ch>): number;\n\t/** Stop a specific sound by its Howler sound ID. */\n\tstop(soundId: number): void;\n\n\t/** Play music on a channel. Stops any existing music on that channel first. */\n\tplayMusic(sound: string, options?: MusicOptions<Ch>): void;\n\t/** Stop music on a channel. If omitted, stops all music. */\n\tstopMusic(channel?: Ch): void;\n\t/** Pause music on a channel. If omitted, pauses all music. */\n\tpauseMusic(channel?: Ch): void;\n\t/** Resume music on a channel. If omitted, resumes all music. */\n\tresumeMusic(channel?: Ch): void;\n\n\t/** Set volume for a channel (0-1). */\n\tsetChannelVolume(channel: Ch, volume: number): void;\n\t/** Get current volume for a channel. */\n\tgetChannelVolume(channel: Ch): number;\n\t/** Set master volume (0-1). */\n\tsetMasterVolume(volume: number): void;\n\t/** Get current master volume. */\n\tgetMasterVolume(): number;\n\t/** Mute all audio. */\n\tmute(): void;\n\t/** Unmute all audio. */\n\tunmute(): void;\n\t/** Toggle mute state. */\n\ttoggleMute(): void;\n\t/** Check if audio is muted. */\n\tisMuted(): boolean;\n}\n\n/**\n * Resource types provided by the audio plugin.\n */\nexport interface AudioResourceTypes<Ch extends string = string> {\n\taudioState: AudioState<Ch>;\n}\n\n// ==================== Plugin Options ====================\n\n/**\n * Configuration options for the audio plugin.\n */\nexport interface AudioPluginOptions<Ch extends string, G extends string = 'audio'> extends BasePluginOptions<G> {\n\t/** Channel definitions from defineAudioChannels */\n\tchannels: Readonly<Record<Ch, AudioChannelConfig>>;\n}\n\n// ==================== Helper Functions ====================\n\n/**\n * Create an audioSource component for entity-attached audio.\n *\n * @param sound Asset key for the sound\n * @param channel Channel to play on\n * @param options Optional configuration\n * @returns Component object suitable for spreading into spawn()\n *\n * @example\n * ```typescript\n * ecs.spawn({\n * ...createAudioSource('explosion', 'sfx'),\n * ...createTransform(100, 200),\n * });\n * ```\n */\nexport function createAudioSource<Ch extends string>(\n\tsound: string,\n\tchannel: Ch,\n\toptions?: { volume?: number; loop?: boolean; autoRemove?: boolean }\n): Pick<AudioComponentTypes<Ch>, 'audioSource'> {\n\treturn {\n\t\taudioSource: {\n\t\t\tsound,\n\t\t\tchannel,\n\t\t\tvolume: options?.volume ?? 1,\n\t\t\tloop: options?.loop ?? false,\n\t\t\tautoRemove: options?.autoRemove ?? false,\n\t\t\tplaying: false,\n\t\t\t_soundId: -1,\n\t\t},\n\t};\n}\n\n/**\n * Create a loader function for use with the asset manager.\n * Returns a factory function that loads a Howl when called.\n *\n * @param src URL(s) for the sound file\n * @param options Optional Howl configuration\n * @returns Factory function compatible with asset manager's loader parameter\n *\n * @example\n * ```typescript\n * const ecs = ECSpresso.create()\n * .withAssets(a => a\n * .add('explosion', loadSound('/sounds/explosion.mp3'))\n * .add('bgm', loadSound(['/sounds/bgm.webm', '/sounds/bgm.mp3']))\n * )\n * .build();\n * ```\n */\nexport function loadSound(\n\tsrc: string | string[],\n\toptions?: { html5?: boolean; preload?: boolean }\n): () => Promise<Howl> {\n\treturn () => import('howler').then(({ Howl: HowlClass }) =>\n\t\tnew Promise<Howl>((resolve, reject) => {\n\t\t\tlet howl: Howl;\n\t\t\tlet resolved = false;\n\t\t\thowl = new HowlClass({\n\t\t\t\tsrc: Array.isArray(src) ? src : [src],\n\t\t\t\thtml5: options?.html5 ?? false,\n\t\t\t\tpreload: options?.preload ?? true,\n\t\t\t\tonload: () => {\n\t\t\t\t\tresolved = true;\n\t\t\t\t\tresolve(howl);\n\t\t\t\t},\n\t\t\t\tonloaderror: (_id: number, err: unknown) => reject(\n\t\t\t\t\terr instanceof Error ? err : new Error(String(err))\n\t\t\t\t),\n\t\t\t});\n\t\t\t// If onload fired synchronously during construction (e.g. cached),\n\t\t\t// howl is now assigned and the promise is already resolved.\n\t\t\tif (!resolved && howl.state?.() === 'loaded') {\n\t\t\t\tresolve(howl);\n\t\t\t}\n\t\t})\n\t);\n}\n\n// ==================== Internal Types ====================\n\ninterface ActiveSound<Ch extends string> {\n\thowl: Howl;\n\tsoundId: number;\n\tchannel: Ch;\n\tindividualVolume: number;\n\tassetKey: string;\n\tentityId: number;\n}\n\ninterface MusicEntry<Ch extends string> {\n\thowl: Howl;\n\tsoundId: number;\n\tchannel: Ch;\n\tindividualVolume: number;\n\tassetKey: string;\n}\n\n// ==================== Plugin Factory ====================\n\n/**\n * Create an audio plugin for ECSpresso.\n *\n * Provides:\n * - `audioState` resource for fire-and-forget SFX and music\n * - `audioSource` component for entity-attached sounds\n * - Volume hierarchy: individual * channel * master\n * - `playSound` / `stopMusic` event handlers\n * - `soundEnded` event on completion\n * - Automatic cleanup on entity removal (dispose callback)\n *\n * Sounds must be preloaded through the asset pipeline (`loadSound` helper).\n *\n * @example\n * ```typescript\n * const channels = defineAudioChannels({\n * sfx: { volume: 1 },\n * music: { volume: 0.7 },\n * });\n *\n * const ecs = ECSpresso.create()\n * .withAssets(a => a.add('explosion', loadSound('/sfx/boom.mp3')))\n * .withPlugin(createAudioPlugin({ channels }))\n * .build();\n *\n * await ecs.initialize();\n * const audio = ecs.getResource('audioState');\n * audio.play('explosion', { channel: 'sfx' });\n * ```\n */\nexport function createAudioPlugin<Ch extends string, G extends string = 'audio'>(\n\toptions: AudioPluginOptions<Ch, G>\n) {\n\tconst {\n\t\tchannels: channelDefs,\n\t\tsystemGroup = 'audio',\n\t\tpriority = 0,\n\t\tphase = 'update',\n\t} = options;\n\n\t// Closure state\n\tconst channelVolumes = new Map<Ch, number>();\n\tconst activeSounds = new Map<number, ActiveSound<Ch>>();\n\tconst musicByChannel = new Map<Ch, MusicEntry<Ch>>();\n\tlet masterVolume = 1;\n\tlet muted = false;\n\n\t// Initialize channel volumes from definitions\n\tconst channelNames: Ch[] = [];\n\tfor (const [name, config] of Object.entries(channelDefs) as Array<[Ch, AudioChannelConfig]>) {\n\t\tchannelVolumes.set(name, config.volume);\n\t\tchannelNames.push(name);\n\t}\n\n\tconst defaultChannel = channelNames[0] as Ch;\n\n\t// Volume computation\n\tfunction effectiveVolume(individualVol: number, channel: Ch): number {\n\t\tif (muted) return 0;\n\t\tconst chanVol = channelVolumes.get(channel) ?? 1;\n\t\treturn individualVol * chanVol * masterVolume;\n\t}\n\n\t// Propagate volume changes to all active sounds on a channel\n\tfunction propagateChannelVolume(channel: Ch): void {\n\t\tfor (const sound of activeSounds.values()) {\n\t\t\tif (sound.channel !== channel) continue;\n\t\t\tsound.howl.volume(effectiveVolume(sound.individualVolume, channel), sound.soundId);\n\t\t}\n\t\tconst music = musicByChannel.get(channel);\n\t\tif (music) {\n\t\t\tmusic.howl.volume(effectiveVolume(music.individualVolume, channel), music.soundId);\n\t\t}\n\t}\n\n\t// Propagate volume to all sounds across all channels\n\tfunction propagateAllVolumes(): void {\n\t\tfor (const ch of channelNames) {\n\t\t\tpropagateChannelVolume(ch);\n\t\t}\n\t}\n\n\t// Stop a sound by its Howler sound ID\n\tfunction stopSoundById(soundId: number): void {\n\t\tconst entry = activeSounds.get(soundId);\n\t\tif (!entry) return;\n\t\tentry.howl.stop(soundId);\n\t\tactiveSounds.delete(soundId);\n\t}\n\n\t// Event bus reference, set during initialization\n\tlet eventBusRef: { publish(event: string, data: unknown): void } | null = null;\n\n\t// Resolve Howl from asset key\n\tlet getAsset: ((key: string) => Howl) | null = null;\n\n\t// AudioState resource implementation\n\tconst audioState: AudioState<Ch> = {\n\t\tplay(sound, playOpts) {\n\t\t\tif (!getAsset) return -1;\n\t\t\tconst channel = playOpts?.channel ?? defaultChannel;\n\t\t\tconst individualVol = playOpts?.volume ?? 1;\n\t\t\tconst loop = playOpts?.loop ?? false;\n\n\t\t\tconst howl = getAsset(sound);\n\t\t\thowl.volume(effectiveVolume(individualVol, channel));\n\t\t\thowl.loop(loop);\n\t\t\tconst soundId = howl.play();\n\n\t\t\tconst entry: ActiveSound<Ch> = {\n\t\t\t\thowl,\n\t\t\t\tsoundId,\n\t\t\t\tchannel,\n\t\t\t\tindividualVolume: individualVol,\n\t\t\t\tassetKey: sound,\n\t\t\t\tentityId: -1,\n\t\t\t};\n\t\t\tactiveSounds.set(soundId, entry);\n\n\t\t\thowl.once('end', () => {\n\t\t\t\tactiveSounds.delete(soundId);\n\t\t\t\teventBusRef?.publish('soundEnded', {\n\t\t\t\t\tentityId: -1,\n\t\t\t\t\tsoundId,\n\t\t\t\t\tsound,\n\t\t\t\t} satisfies SoundEndedEvent);\n\t\t\t}, soundId);\n\n\t\t\treturn soundId;\n\t\t},\n\n\t\tstop(soundId) {\n\t\t\tstopSoundById(soundId);\n\t\t},\n\n\t\tplayMusic(sound, musicOpts) {\n\t\t\tif (!getAsset) return;\n\t\t\tconst channel = musicOpts?.channel ?? defaultChannel;\n\t\t\tconst individualVol = musicOpts?.volume ?? 1;\n\t\t\tconst loop = musicOpts?.loop ?? true;\n\n\t\t\t// Stop existing music on this channel\n\t\t\tconst existing = musicByChannel.get(channel);\n\t\t\tif (existing) {\n\t\t\t\texisting.howl.stop(existing.soundId);\n\t\t\t\tactiveSounds.delete(existing.soundId);\n\t\t\t}\n\n\t\t\tconst howl = getAsset(sound);\n\t\t\thowl.volume(effectiveVolume(individualVol, channel));\n\t\t\thowl.loop(loop);\n\t\t\tconst soundId = howl.play();\n\n\t\t\tconst entry: MusicEntry<Ch> = {\n\t\t\t\thowl,\n\t\t\t\tsoundId,\n\t\t\t\tchannel,\n\t\t\t\tindividualVolume: individualVol,\n\t\t\t\tassetKey: sound,\n\t\t\t};\n\t\t\tmusicByChannel.set(channel, entry);\n\t\t\tactiveSounds.set(soundId, {\n\t\t\t\t...entry,\n\t\t\t\tentityId: -1,\n\t\t\t});\n\n\t\t\thowl.once('end', () => {\n\t\t\t\tactiveSounds.delete(soundId);\n\t\t\t\tconst current = musicByChannel.get(channel);\n\t\t\t\tif (current?.soundId === soundId) {\n\t\t\t\t\tmusicByChannel.delete(channel);\n\t\t\t\t}\n\t\t\t}, soundId);\n\t\t},\n\n\t\tstopMusic(channel) {\n\t\t\tif (channel !== undefined) {\n\t\t\t\tconst entry = musicByChannel.get(channel);\n\t\t\t\tif (entry) {\n\t\t\t\t\tentry.howl.stop(entry.soundId);\n\t\t\t\t\tactiveSounds.delete(entry.soundId);\n\t\t\t\t\tmusicByChannel.delete(channel);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (const [ch, entry] of musicByChannel) {\n\t\t\t\t\tentry.howl.stop(entry.soundId);\n\t\t\t\t\tactiveSounds.delete(entry.soundId);\n\t\t\t\t\tmusicByChannel.delete(ch);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tpauseMusic(channel) {\n\t\t\tif (channel !== undefined) {\n\t\t\t\tconst entry = musicByChannel.get(channel);\n\t\t\t\tif (entry) entry.howl.pause(entry.soundId);\n\t\t\t} else {\n\t\t\t\tfor (const entry of musicByChannel.values()) {\n\t\t\t\t\tentry.howl.pause(entry.soundId);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tresumeMusic(channel) {\n\t\t\tif (channel !== undefined) {\n\t\t\t\tconst entry = musicByChannel.get(channel);\n\t\t\t\tif (entry) entry.howl.play(entry.soundId);\n\t\t\t} else {\n\t\t\t\tfor (const entry of musicByChannel.values()) {\n\t\t\t\t\tentry.howl.play(entry.soundId);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tsetChannelVolume(channel, volume) {\n\t\t\tchannelVolumes.set(channel, volume);\n\t\t\tpropagateChannelVolume(channel);\n\t\t},\n\n\t\tgetChannelVolume(channel) {\n\t\t\treturn channelVolumes.get(channel) ?? 1;\n\t\t},\n\n\t\tsetMasterVolume(volume) {\n\t\t\tmasterVolume = volume;\n\t\t\tpropagateAllVolumes();\n\t\t},\n\n\t\tgetMasterVolume() {\n\t\t\treturn masterVolume;\n\t\t},\n\n\t\tmute() {\n\t\t\tmuted = true;\n\t\t\tpropagateAllVolumes();\n\t\t},\n\n\t\tunmute() {\n\t\t\tmuted = false;\n\t\t\tpropagateAllVolumes();\n\t\t},\n\n\t\ttoggleMute() {\n\t\t\tmuted = !muted;\n\t\t\tpropagateAllVolumes();\n\t\t},\n\n\t\tisMuted() {\n\t\t\treturn muted;\n\t\t},\n\t};\n\n\treturn definePlugin('audio')\n\t\t.withComponentTypes<AudioComponentTypes<Ch>>()\n\t\t.withEventTypes<AudioEventTypes<Ch>>()\n\t\t.withResourceTypes<AudioResourceTypes<Ch>>()\n\t\t.withLabels<'audio-sync'>()\n\t\t.withGroups<G>()\n\t\t.withReactiveQueryNames<'audio-sources'>()\n\t\t.install((world) => {\n\t\t\tworld.addResource('audioState', audioState);\n\n\t\t\t// Dispose callback: stop sounds when audioSource component is removed\n\t\t\tworld.registerDispose('audioSource', ({ value: source }: { value: AudioSource<Ch>; entityId: number }) => {\n\t\t\t\tif (source._soundId !== -1) {\n\t\t\t\t\tstopSoundById(source._soundId);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tworld\n\t\t\t\t.addSystem('audio-sync')\n\t\t\t\t.setPriority(priority)\n\t\t\t\t.inPhase(phase)\n\t\t\t\t.inGroup(systemGroup)\n\t\t\t\t.setOnInitialize((ecs) => {\n\t\t\t\t\teventBusRef = ecs.eventBus;\n\n\t\t\t\t\t// Resolve asset getter - works with $assets resource if available\n\t\t\t\t\tconst assets = ecs.tryGetResource<{ get(k: string): unknown }>('$assets');\n\t\t\t\t\tif (assets) {\n\t\t\t\t\t\tgetAsset = (key: string) => assets.get(key) as Howl;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Register reactive query for audioSource components\n\t\t\t\t\tecs.addReactiveQuery('audio-sources', {\n\t\t\t\t\t\twith: ['audioSource'],\n\t\t\t\t\t\tonEnter: (entity) => {\n\t\t\t\t\t\t\tconst source = entity.components.audioSource;\n\t\t\t\t\t\t\tif (!getAsset) return;\n\t\t\t\t\t\t\tif (source._soundId !== -1) return; // Already started\n\n\t\t\t\t\t\t\tconst howl = getAsset(source.sound);\n\t\t\t\t\t\t\thowl.volume(effectiveVolume(source.volume, source.channel));\n\t\t\t\t\t\t\thowl.loop(source.loop);\n\t\t\t\t\t\t\tconst soundId = howl.play();\n\n\t\t\t\t\t\t\tsource._soundId = soundId;\n\t\t\t\t\t\t\tsource.playing = true;\n\n\t\t\t\t\t\t\tconst entry: ActiveSound<Ch> = {\n\t\t\t\t\t\t\t\thowl,\n\t\t\t\t\t\t\t\tsoundId,\n\t\t\t\t\t\t\t\tchannel: source.channel,\n\t\t\t\t\t\t\t\tindividualVolume: source.volume,\n\t\t\t\t\t\t\t\tassetKey: source.sound,\n\t\t\t\t\t\t\t\tentityId: entity.id,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tactiveSounds.set(soundId, entry);\n\n\t\t\t\t\t\t\thowl.once('end', () => {\n\t\t\t\t\t\t\t\tactiveSounds.delete(soundId);\n\t\t\t\t\t\t\t\tsource.playing = false;\n\n\t\t\t\t\t\t\t\teventBusRef?.publish('soundEnded', {\n\t\t\t\t\t\t\t\t\tentityId: entity.id,\n\t\t\t\t\t\t\t\t\tsoundId,\n\t\t\t\t\t\t\t\t\tsound: source.sound,\n\t\t\t\t\t\t\t\t} satisfies SoundEndedEvent);\n\n\t\t\t\t\t\t\t\tif (source.autoRemove) {\n\t\t\t\t\t\t\t\t\tecs.commands.removeEntity(entity.id);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}, soundId);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonExit: (_entityId) => {\n\t\t\t\t\t\t\t// Cleanup handled by dispose callback\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.setEventHandlers({\n\t\t\t\t\tplaySound({ data, ecs }) {\n\t\t\t\t\t\tconst audio = ecs.getResource('audioState');\n\t\t\t\t\t\taudio.play(data.sound, {\n\t\t\t\t\t\t\tchannel: data.channel,\n\t\t\t\t\t\t\tvolume: data.volume,\n\t\t\t\t\t\t\tloop: data.loop,\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tstopMusic({ data, ecs }) {\n\t\t\t\t\t\tconst audio = ecs.getResource('audioState');\n\t\t\t\t\t\taudio.stopMusic(data.channel);\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\t.setOnDetach(() => {\n\t\t\t\t\t// Stop all active sounds\n\t\t\t\t\tfor (const entry of activeSounds.values()) {\n\t\t\t\t\t\tentry.howl.stop(entry.soundId);\n\t\t\t\t\t}\n\t\t\t\t\tactiveSounds.clear();\n\t\t\t\t\tmusicByChannel.clear();\n\t\t\t\t\teventBusRef = null;\n\t\t\t\t\tgetAsset = null;\n\t\t\t\t});\n\t\t});\n}\n\n// ==================== Post-Build Helpers ====================\n\n/**\n * Typed helpers for the audio plugin.\n * Creates helpers that validate sound keys and channel names against the world type W.\n * Call after .build() using typeof ecs.\n *\n * @template W - Concrete ECS world type (e.g. `typeof ecs`)\n *\n * @example\n * ```typescript\n * const ecs = ECSpresso.create()\n * .withPlugin(createAudioPlugin({ channels }))\n * .withAssets(a => a.add('boom', loadSound('/sfx/boom.mp3')))\n * .build();\n *\n * const { createAudioSource } = createAudioHelpers<typeof ecs>();\n * // Type-safe: 'boom' must be a registered asset, 'sfx' a valid channel\n * createAudioSource('boom', 'sfx');\n * ```\n */\nexport interface AudioHelpers<W extends AnyECSpresso> {\n\tcreateAudioSource: (\n\t\tsound: keyof AssetsOfWorld<W> & string,\n\t\tchannel: ChannelOfWorld<W>,\n\t\toptions?: { volume?: number; loop?: boolean; autoRemove?: boolean },\n\t) => Pick<AudioComponentTypes<ChannelOfWorld<W>>, 'audioSource'>;\n}\n\nexport function createAudioHelpers<W extends AnyECSpresso>(_world?: W): AudioHelpers<W> {\n\treturn {\n\t\tcreateAudioSource: createAudioSource as AudioHelpers<W>['createAudioSource'],\n\t};\n}\n"
6
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "3DA90E7DCE062E0E64756E2164756E21",
8
+ "debugId": "FFF17E90E1B1E9CB64756E2164756E21",
9
9
  "names": []
10
10
  }