@woosh/meep-engine 3.46.0 → 3.47.0

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 (230) hide show
  1. package/editor/actions/concrete/TransformModifyAction.d.ts.map +1 -1
  2. package/editor/actions/concrete/TransformModifyAction.js +10 -2
  3. package/editor/ecs/component/FieldDescriptor.js +15 -0
  4. package/editor/ecs/component/createObjectEditor.js +41 -12
  5. package/editor/ecs/component/editors/ecs/Transform64Editor.d.ts.map +1 -1
  6. package/editor/ecs/component/editors/ecs/Transform64Editor.js +77 -70
  7. package/editor/tools/TransformToolV2.d.ts.map +1 -1
  8. package/editor/tools/TransformToolV2.js +4 -0
  9. package/editor/tools/v2/TransformControls.d.ts.map +1 -1
  10. package/editor/tools/v2/TransformControls.js +7 -0
  11. package/editor/view/ecs/EntityEditor.d.ts.map +1 -1
  12. package/editor/view/ecs/EntityEditor.js +4 -2
  13. package/package.json +1 -1
  14. package/src/core/collection/array/array_insert_at.d.ts +16 -0
  15. package/src/core/collection/array/array_insert_at.d.ts.map +1 -0
  16. package/src/core/collection/array/array_insert_at.js +32 -0
  17. package/src/core/collection/array/array_remove_at.d.ts +15 -0
  18. package/src/core/collection/array/array_remove_at.d.ts.map +1 -0
  19. package/src/core/collection/array/array_remove_at.js +30 -0
  20. package/src/core/geom/3d/quaternion/quat3_look_rotation.d.ts +37 -0
  21. package/src/core/geom/3d/quaternion/quat3_look_rotation.d.ts.map +1 -0
  22. package/src/core/geom/3d/quaternion/quat3_look_rotation.js +172 -0
  23. package/src/core/geom/Quaternion.d.ts +1 -0
  24. package/src/core/geom/Quaternion.d.ts.map +1 -1
  25. package/src/core/geom/Quaternion.js +12 -48
  26. package/src/engine/Engine.d.ts.map +1 -1
  27. package/src/engine/Engine.js +9 -4
  28. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  29. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +10 -0
  30. package/src/engine/ecs/transform/t64_look_rotation.d.ts +4 -4
  31. package/src/engine/ecs/transform/t64_look_rotation.d.ts.map +1 -1
  32. package/src/engine/ecs/transform/t64_look_rotation.js +7 -18
  33. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts.map +1 -1
  34. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js +30 -1
  35. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +6 -0
  36. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  37. package/src/engine/graphics3/GPUParticleEmitterSystem.js +72 -29
  38. package/src/engine/input/devices/KeyboardDevice.d.ts +1 -0
  39. package/src/engine/input/devices/KeyboardDevice.d.ts.map +1 -1
  40. package/src/engine/input/devices/KeyboardDevice.js +7 -6
  41. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts.map +1 -1
  42. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +15 -2
  43. package/src/engine/network/CONGESTION_CONTROL.md +9 -9
  44. package/src/engine/network/MESSAGE_TRANSPORT.md +364 -0
  45. package/src/engine/network/NetworkSession.d.ts +31 -11
  46. package/src/engine/network/NetworkSession.d.ts.map +1 -1
  47. package/src/engine/network/NetworkSession.js +453 -286
  48. package/src/engine/network/README.md +77 -27
  49. package/src/engine/network/SMOOTHNESS_DESIGN.md +13 -5
  50. package/src/engine/network/diagnostics/BandwidthMeter.d.ts +1 -1
  51. package/src/engine/network/diagnostics/BandwidthMeter.js +1 -1
  52. package/src/engine/network/orchestrator/HostJoin.d.ts +111 -0
  53. package/src/engine/network/orchestrator/HostJoin.d.ts.map +1 -0
  54. package/src/engine/network/orchestrator/HostJoin.js +271 -0
  55. package/src/engine/network/orchestrator/NetworkPeer.d.ts +151 -112
  56. package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
  57. package/src/engine/network/orchestrator/NetworkPeer.js +450 -499
  58. package/src/engine/network/orchestrator/PendingSlices.d.ts +30 -0
  59. package/src/engine/network/orchestrator/PendingSlices.d.ts.map +1 -0
  60. package/src/engine/network/orchestrator/PendingSlices.js +83 -0
  61. package/src/engine/network/orchestrator/ReliableFrames.d.ts +34 -0
  62. package/src/engine/network/orchestrator/ReliableFrames.d.ts.map +1 -0
  63. package/src/engine/network/orchestrator/ReliableFrames.js +96 -0
  64. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts +77 -10
  65. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
  66. package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +236 -61
  67. package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts +20 -6
  68. package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts.map +1 -1
  69. package/src/engine/network/orchestrator/ServerAuthoritativeServer.js +33 -8
  70. package/src/engine/network/replication/Replicator.d.ts.map +1 -1
  71. package/src/engine/network/replication/Replicator.js +7 -1
  72. package/src/engine/network/sim/ActionLog.d.ts +32 -5
  73. package/src/engine/network/sim/ActionLog.d.ts.map +1 -1
  74. package/src/engine/network/sim/ActionLog.js +47 -5
  75. package/src/engine/network/sim/SimActionExecutor.d.ts +42 -2
  76. package/src/engine/network/sim/SimActionExecutor.d.ts.map +1 -1
  77. package/src/engine/network/sim/SimActionExecutor.js +100 -4
  78. package/src/engine/network/sim/Snapshotter.d.ts +12 -0
  79. package/src/engine/network/sim/Snapshotter.d.ts.map +1 -1
  80. package/src/engine/network/sim/Snapshotter.js +43 -0
  81. package/src/engine/network/state/Baseline.d.ts +1 -1
  82. package/src/engine/network/state/Baseline.js +1 -1
  83. package/src/engine/network/state/FrameBufferRing.d.ts +25 -6
  84. package/src/engine/network/state/FrameBufferRing.d.ts.map +1 -1
  85. package/src/engine/network/state/FrameBufferRing.js +51 -6
  86. package/src/engine/network/state/InputRing.d.ts +4 -0
  87. package/src/engine/network/state/InputRing.d.ts.map +1 -1
  88. package/src/engine/network/state/InputRing.js +7 -0
  89. package/src/engine/network/transport/DeferredTransport.d.ts.map +1 -1
  90. package/src/engine/network/transport/DeferredTransport.js +1 -0
  91. package/src/engine/network/transport/LoopbackTransport.d.ts.map +1 -1
  92. package/src/engine/network/transport/LoopbackTransport.js +4 -2
  93. package/src/engine/network/transport/Transport.d.ts +7 -0
  94. package/src/engine/network/transport/Transport.d.ts.map +1 -1
  95. package/src/engine/network/transport/Transport.js +8 -0
  96. package/src/engine/network/transport/adapters/NodeUDPTransport.d.ts.map +1 -1
  97. package/src/engine/network/transport/adapters/NodeUDPTransport.js +20 -5
  98. package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.d.ts.map +1 -1
  99. package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.js +8 -0
  100. package/src/engine/network/transport/adapters/WebTransportTransport.d.ts.map +1 -1
  101. package/src/engine/network/transport/adapters/WebTransportTransport.js +6 -0
  102. package/src/engine/network/transport/connection/Connection.d.ts +191 -0
  103. package/src/engine/network/transport/connection/Connection.d.ts.map +1 -0
  104. package/src/engine/network/transport/connection/Connection.js +1262 -0
  105. package/src/engine/network/transport/connection/RangeSet.d.ts +94 -0
  106. package/src/engine/network/transport/connection/RangeSet.d.ts.map +1 -0
  107. package/src/engine/network/transport/connection/RangeSet.js +260 -0
  108. package/src/engine/network/transport/connection/RxStream.d.ts +48 -0
  109. package/src/engine/network/transport/connection/RxStream.d.ts.map +1 -0
  110. package/src/engine/network/transport/connection/RxStream.js +211 -0
  111. package/src/engine/network/transport/connection/TxStream.d.ts +90 -0
  112. package/src/engine/network/transport/connection/TxStream.d.ts.map +1 -0
  113. package/src/engine/network/transport/connection/TxStream.js +243 -0
  114. package/src/engine/network/transport/connection/bytes_copy.d.ts +17 -0
  115. package/src/engine/network/transport/connection/bytes_copy.d.ts.map +1 -0
  116. package/src/engine/network/transport/connection/bytes_copy.js +34 -0
  117. package/src/engine/network/transport/connection/varint.d.ts +46 -0
  118. package/src/engine/network/transport/connection/varint.d.ts.map +1 -0
  119. package/src/engine/network/transport/connection/varint.js +107 -0
  120. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  121. package/src/engine/sound/ecs/audio/AudioEmitter.d.ts +38 -7
  122. package/src/engine/sound/ecs/audio/AudioEmitter.d.ts.map +1 -1
  123. package/src/engine/sound/ecs/audio/AudioEmitter.js +35 -7
  124. package/src/engine/sound/ecs/audio/AudioEmitterSerializationAdapter.d.ts.map +1 -1
  125. package/src/engine/sound/ecs/audio/AudioEmitterSerializationAdapter.js +5 -1
  126. package/src/engine/sound/ecs/audio/AudioEmitterSerializationUpgrader_0_1.d.ts +18 -0
  127. package/src/engine/sound/ecs/audio/AudioEmitterSerializationUpgrader_0_1.d.ts.map +1 -0
  128. package/src/engine/sound/ecs/audio/AudioEmitterSerializationUpgrader_0_1.js +48 -0
  129. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts +12 -2
  130. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts.map +1 -1
  131. package/src/engine/sound/ecs/audio/AudioEmitterSystem.js +173 -9
  132. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts +9 -3
  133. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts.map +1 -1
  134. package/src/engine/sound/ecs/audio/LiveEmitterSet.js +28 -8
  135. package/src/engine/sound/ecs/trigger/AudioEventTrigger.d.ts +8 -0
  136. package/src/engine/sound/ecs/trigger/AudioEventTrigger.d.ts.map +1 -1
  137. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationAdapter.d.ts.map +1 -1
  138. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationAdapter.js +5 -1
  139. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationUpgrader_0_1.d.ts +18 -0
  140. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationUpgrader_0_1.d.ts.map +1 -0
  141. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationUpgrader_0_1.js +51 -0
  142. package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.d.ts.map +1 -1
  143. package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.js +15 -1
  144. package/src/engine/sound/sopra/README.md +768 -644
  145. package/src/engine/sound/sopra/SopraEngine.d.ts +104 -8
  146. package/src/engine/sound/sopra/SopraEngine.d.ts.map +1 -1
  147. package/src/engine/sound/sopra/SopraEngine.js +327 -12
  148. package/src/engine/sound/sopra/definition/EventDescription.d.ts +28 -2
  149. package/src/engine/sound/sopra/definition/EventDescription.d.ts.map +1 -1
  150. package/src/engine/sound/sopra/definition/EventDescription.js +55 -5
  151. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts +10 -0
  152. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts.map +1 -1
  153. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.js +77 -55
  154. package/src/engine/sound/sopra/definition/EventDescriptionSerializationUpgrader_0_1.d.ts +31 -0
  155. package/src/engine/sound/sopra/definition/EventDescriptionSerializationUpgrader_0_1.d.ts.map +1 -0
  156. package/src/engine/sound/sopra/definition/EventDescriptionSerializationUpgrader_0_1.js +75 -0
  157. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts +38 -9
  158. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts.map +1 -1
  159. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.js +34 -5
  160. package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts +7 -2
  161. package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts.map +1 -1
  162. package/src/engine/sound/sopra/definition/effect/CompressorEffect.js +137 -122
  163. package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts +3 -1
  164. package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts.map +1 -1
  165. package/src/engine/sound/sopra/definition/effect/EqEffect.js +146 -131
  166. package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts +1 -0
  167. package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts.map +1 -1
  168. package/src/engine/sound/sopra/definition/effect/ReverbEffect.js +6 -1
  169. package/src/engine/sound/sopra/runtime/BusGraph.d.ts +44 -2
  170. package/src/engine/sound/sopra/runtime/BusGraph.d.ts.map +1 -1
  171. package/src/engine/sound/sopra/runtime/BusGraph.js +83 -43
  172. package/src/engine/sound/sopra/runtime/EffectChain.d.ts +96 -0
  173. package/src/engine/sound/sopra/runtime/EffectChain.d.ts.map +1 -0
  174. package/src/engine/sound/sopra/runtime/EffectChain.js +286 -0
  175. package/src/engine/sound/sopra/runtime/EffectParamOverrides.d.ts +123 -0
  176. package/src/engine/sound/sopra/runtime/EffectParamOverrides.d.ts.map +1 -0
  177. package/src/engine/sound/sopra/runtime/EffectParamOverrides.js +320 -0
  178. package/src/engine/sound/sopra/runtime/EventInstance.d.ts +55 -5
  179. package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -1
  180. package/src/engine/sound/sopra/runtime/EventInstance.js +201 -26
  181. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts +2 -1
  182. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts.map +1 -1
  183. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.js +6 -1
  184. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts +15 -0
  185. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts.map +1 -1
  186. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.js +32 -0
  187. package/src/engine/sound/sopra/util/MockAudioContext.d.ts.map +1 -1
  188. package/src/engine/sound/sopra/util/MockAudioContext.js +3 -0
  189. package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts +13 -3
  190. package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts.map +1 -1
  191. package/src/engine/sound/sopra/util/fadeOutAndStop.js +25 -13
  192. package/src/shade/RENDERER_CONTRACT.md +6 -3
  193. package/src/shade/device/SHADE_DEVICE_FLOOR.d.ts +24 -0
  194. package/src/shade/device/SHADE_DEVICE_FLOOR.d.ts.map +1 -0
  195. package/src/shade/device/SHADE_DEVICE_FLOOR.js +34 -0
  196. package/src/shade/device/ShadeDeviceFailure.d.ts +12 -5
  197. package/src/shade/device/ShadeDeviceFailure.d.ts.map +1 -1
  198. package/src/shade/device/ShadeDeviceFailure.js +17 -8
  199. package/src/shade/device/ShadeDeviceFailureReason.d.ts +1 -1
  200. package/src/shade/device/ShadeDeviceFailureReason.js +2 -2
  201. package/src/shade/device/shade_device_floor_unmet.d.ts +13 -0
  202. package/src/shade/device/shade_device_floor_unmet.d.ts.map +1 -0
  203. package/src/shade/device/shade_device_floor_unmet.js +32 -0
  204. package/src/shade/renderer/Renderer.d.ts +2 -0
  205. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  206. package/src/shade/renderer/Renderer.js +29 -55
  207. package/src/shade/renderer/buffer/GPUBufferAllocator.d.ts.map +1 -1
  208. package/src/shade/renderer/buffer/GPUBufferAllocator.js +9 -0
  209. package/src/shade/renderer/buffer/buffer_pool_ops.d.ts +21 -12
  210. package/src/shade/renderer/buffer/buffer_pool_ops.d.ts.map +1 -1
  211. package/src/shade/renderer/buffer/buffer_pool_ops.js +18 -19
  212. package/src/shade/renderer/gpu_primitive/test/gpu_test.d.ts.map +1 -1
  213. package/src/shade/renderer/gpu_primitive/test/gpu_test.js +8 -11
  214. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  215. package/src/shade/renderer/pool/TransientResourcePool.d.ts +24 -0
  216. package/src/shade/renderer/pool/TransientResourcePool.d.ts.map +1 -1
  217. package/src/shade/renderer/pool/TransientResourcePool.js +41 -10
  218. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  219. package/src/shade/renderer/shader/ComputeShader.js +18 -2
  220. package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
  221. package/src/shade/renderer/shader/ImageShader.js +230 -218
  222. package/src/view/graphics/GraphicsContextFailureView.d.ts +1 -2
  223. package/src/view/graphics/GraphicsContextFailureView.d.ts.map +1 -1
  224. package/src/view/graphics/GraphicsContextFailureView.js +1 -2
  225. package/src/engine/network/transport/Channel.js +0 -336
  226. package/src/engine/network/transport/ReliableCommandPipeline.js +0 -335
  227. package/src/engine/network/transport/fragments/FragmentAssembler.js +0 -350
  228. package/src/engine/network/transport/fragments/FragmentRetention.js +0 -191
  229. package/src/engine/network/transport/fragments/fragment_send.js +0 -157
  230. package/src/engine/network/transport/fragments/packet_size.js +0 -107
@@ -0,0 +1,123 @@
1
+ /**
2
+ * @typedef {import("../definition/EventDescription.js").EventDescription} EventDescription
3
+ * @typedef {import("./EventInstance.js").EventInstance} EventInstance
4
+ */
5
+ /**
6
+ * How an {@link EffectParamOverrides} tells its owner to move the instance it currently plays: to `value`,
7
+ * now when `timeConstant` is 0, as a glide (`approachEffectParam`) above 0. A removed override sends the
8
+ * event's own value.
9
+ * @callback EffectParamChange
10
+ * @param {number} effectIndex
11
+ * @param {string} name
12
+ * @param {number} value
13
+ * @param {number} timeConstant seconds
14
+ * @returns {void}
15
+ */
16
+ /**
17
+ * Live overrides of an event's insert-effect parameters ({@link EventDescription.effects}) that outlive any
18
+ * one {@link EventInstance}. They belong to whatever plays the event over and over — an `AudioEmitter`,
19
+ * whose spatially managed instance is torn down on demotion and built afresh on promotion — and are put
20
+ * onto every instance it gets ({@link applyTo}), so a filter set on the emitter stays set however often
21
+ * the voice underneath is rebuilt.
22
+ *
23
+ * Runtime state, not a definition: never serialized, and no part of its owner's identity.
24
+ *
25
+ * An override is addressed the way an instance addresses the parameter itself: the effect's index in the
26
+ * event's `effects`, and one of that effect class's `parameters`. While {@link attach}ed to the event it
27
+ * addresses, every write is checked against the event's effects and one they do not have throws at the
28
+ * write, storing nothing; overrides written before that are checked when it attaches. Values are checked
29
+ * as an `AudioParam` would check them, in every build (not by `assert`). So an override that is held
30
+ * always fits, and no later rebuild of an instance can trip on one — as long as the event's effects are
31
+ * not edited in place while it is attached.
32
+ *
33
+ * One owner at a time: the attached one is told of every change ({@link EffectParamChange}) and moves the
34
+ * instance it currently plays, if any.
35
+ */
36
+ export class EffectParamOverrides {
37
+ /**
38
+ * @returns {number} how many parameters are overridden
39
+ */
40
+ get size(): number;
41
+ /**
42
+ * @returns {boolean} whether an owner is attached
43
+ */
44
+ get attached(): boolean;
45
+ /**
46
+ * Throw unless {@link attach} would take `event`: when another owner is attached, or when an override
47
+ * already held is one the event's effects do not have (named). Changes nothing — so an owner can ask
48
+ * before it does anything else, and attach once nothing else can fail.
49
+ * @param {EventDescription} event
50
+ */
51
+ checkAttach(event: EventDescription): void;
52
+ /**
53
+ * Become the overrides of whatever plays `event`: from now on every write is checked against its
54
+ * effects, and `onChange` is told of it. Checked first as {@link checkAttach} checks; on a throw nothing
55
+ * changes.
56
+ * @param {EventDescription} event the event the owner's instances are built from
57
+ * @param {EffectParamChange} onChange
58
+ */
59
+ attach(event: EventDescription, onChange: EffectParamChange): void;
60
+ /**
61
+ * Stop telling `onChange` of changes — if it is the attached owner; a later owner is left attached. The
62
+ * overrides themselves are kept, for whatever attaches next.
63
+ * @param {EffectParamChange} onChange
64
+ * @returns {boolean} whether `onChange` was attached
65
+ */
66
+ detach(onChange: EffectParamChange): boolean;
67
+ /**
68
+ * Override a parameter; the current instance moves there now.
69
+ * @param {number} effectIndex position in the event's `effects`
70
+ * @param {string} name one of that effect class's `parameters`
71
+ * @param {number} value in the parameter's own units (Hz, dB, ...)
72
+ */
73
+ set(effectIndex: number, name: string, value: number): void;
74
+ /**
75
+ * Override a parameter; the current instance glides there (see {@link EventInstance#approachEffectParam}).
76
+ * The override itself is the target, so an instance built while the glide is in flight starts AT it.
77
+ * @param {number} effectIndex
78
+ * @param {string} name
79
+ * @param {number} value
80
+ * @param {number} timeConstant seconds, above 0
81
+ */
82
+ approach(effectIndex: number, name: string, value: number, timeConstant: number): void;
83
+ /**
84
+ * @param {number} effectIndex
85
+ * @param {string} name
86
+ * @returns {number|undefined} the override, or undefined if the parameter is not overridden
87
+ */
88
+ get(effectIndex: number, name: string): number | undefined;
89
+ /**
90
+ * @param {number} effectIndex
91
+ * @param {string} name
92
+ * @returns {boolean}
93
+ */
94
+ has(effectIndex: number, name: string): boolean;
95
+ /**
96
+ * Drop an override: the current instance returns to the event's own value now, and later ones are built
97
+ * at it. To glide back instead, {@link approach} the event's value first.
98
+ * @param {number} effectIndex
99
+ * @param {string} name
100
+ * @returns {boolean} false if the parameter was not overridden
101
+ */
102
+ remove(effectIndex: number, name: string): boolean;
103
+ /**
104
+ * Drop every override (see {@link remove}).
105
+ */
106
+ clear(): void;
107
+ /**
108
+ * Put every override onto a freshly built instance, at once: a new instance starts at the overrides, not
109
+ * gliding toward them from the definition.
110
+ * @param {EventInstance} instance
111
+ */
112
+ applyTo(instance: EventInstance): void;
113
+ #private;
114
+ }
115
+ export type EventDescription = import("../definition/EventDescription.js").EventDescription;
116
+ export type EventInstance = import("./EventInstance.js").EventInstance;
117
+ /**
118
+ * How an {@link EffectParamOverrides } tells its owner to move the instance it currently plays: to `value`,
119
+ * now when `timeConstant` is 0, as a glide (`approachEffectParam`) above 0. A removed override sends the
120
+ * event's own value.
121
+ */
122
+ export type EffectParamChange = (effectIndex: number, name: string, value: number, timeConstant: number) => void;
123
+ //# sourceMappingURL=EffectParamOverrides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EffectParamOverrides.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/sopra/runtime/EffectParamOverrides.js"],"names":[],"mappings":"AAGA;;;GAGG;AAEH;;;;;;;;;;GAUG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH;IA0BI;;OAEG;IACH,mBAEC;IAED;;OAEG;IACH,wBAEC;IAED;;;;;OAKG;IACH,mBAFW,gBAAgB,QAsB1B;IAED;;;;;;OAMG;IACH,cAHW,gBAAgB,YAChB,iBAAiB,QAS3B;IAED;;;;;OAKG;IACH,iBAHW,iBAAiB,GACf,OAAO,CAWnB;IA8CD;;;;;OAKG;IACH,iBAJW,MAAM,QACN,MAAM,SACN,MAAM,QAQhB;IAED;;;;;;;OAOG;IACH,sBALW,MAAM,QACN,MAAM,SACN,MAAM,gBACN,MAAM,QAWhB;IAED;;;;OAIG;IACH,iBAJW,MAAM,QACN,MAAM,GACJ,MAAM,GAAC,SAAS,CAM5B;IAED;;;;OAIG;IACH,iBAJW,MAAM,QACN,MAAM,GACJ,OAAO,CAMnB;IAED;;;;;;OAMG;IACH,oBAJW,MAAM,QACN,MAAM,GACJ,OAAO,CAmBnB;IAED;;OAEG;IACH,cAkBC;IAcD;;;;OAIG;IACH,kBAFW,aAAa,QAcvB;;CACJ;+BA3TY,OAAO,mCAAmC,EAAE,gBAAgB;4BAC5D,OAAO,oBAAoB,EAAE,aAAa;;;;;;8CAQ5C,MAAM,QACN,MAAM,SACN,MAAM,gBACN,MAAM,KACJ,IAAI"}
@@ -0,0 +1,320 @@
1
+ import { assert } from "../../../../core/assert.js";
2
+ import { effectParamIndex } from "./EffectChain.js";
3
+
4
+ /**
5
+ * @typedef {import("../definition/EventDescription.js").EventDescription} EventDescription
6
+ * @typedef {import("./EventInstance.js").EventInstance} EventInstance
7
+ */
8
+
9
+ /**
10
+ * How an {@link EffectParamOverrides} tells its owner to move the instance it currently plays: to `value`,
11
+ * now when `timeConstant` is 0, as a glide (`approachEffectParam`) above 0. A removed override sends the
12
+ * event's own value.
13
+ * @callback EffectParamChange
14
+ * @param {number} effectIndex
15
+ * @param {string} name
16
+ * @param {number} value
17
+ * @param {number} timeConstant seconds
18
+ * @returns {void}
19
+ */
20
+
21
+ /**
22
+ * Live overrides of an event's insert-effect parameters ({@link EventDescription.effects}) that outlive any
23
+ * one {@link EventInstance}. They belong to whatever plays the event over and over — an `AudioEmitter`,
24
+ * whose spatially managed instance is torn down on demotion and built afresh on promotion — and are put
25
+ * onto every instance it gets ({@link applyTo}), so a filter set on the emitter stays set however often
26
+ * the voice underneath is rebuilt.
27
+ *
28
+ * Runtime state, not a definition: never serialized, and no part of its owner's identity.
29
+ *
30
+ * An override is addressed the way an instance addresses the parameter itself: the effect's index in the
31
+ * event's `effects`, and one of that effect class's `parameters`. While {@link attach}ed to the event it
32
+ * addresses, every write is checked against the event's effects and one they do not have throws at the
33
+ * write, storing nothing; overrides written before that are checked when it attaches. Values are checked
34
+ * as an `AudioParam` would check them, in every build (not by `assert`). So an override that is held
35
+ * always fits, and no later rebuild of an instance can trip on one — as long as the event's effects are
36
+ * not edited in place while it is attached.
37
+ *
38
+ * One owner at a time: the attached one is told of every change ({@link EffectParamChange}) and moves the
39
+ * instance it currently plays, if any.
40
+ */
41
+ export class EffectParamOverrides {
42
+
43
+ /**
44
+ * effect index → that effect's overridden parameters (name → value). Null until the first override:
45
+ * most owners never hold one.
46
+ * @type {Map<number, Map<string, number>>|null}
47
+ */
48
+ #values = null;
49
+
50
+ /**
51
+ * @type {number}
52
+ */
53
+ #size = 0;
54
+
55
+ /**
56
+ * The event the attached owner plays; null while detached. Its `effects` are read at each check, so a
57
+ * check follows whatever list the owner's next instance will be built from.
58
+ * @type {EventDescription|null}
59
+ */
60
+ #event = null;
61
+
62
+ /**
63
+ * @type {EffectParamChange|null}
64
+ */
65
+ #onChange = null;
66
+
67
+ /**
68
+ * @returns {number} how many parameters are overridden
69
+ */
70
+ get size() {
71
+ return this.#size;
72
+ }
73
+
74
+ /**
75
+ * @returns {boolean} whether an owner is attached
76
+ */
77
+ get attached() {
78
+ return this.#onChange !== null;
79
+ }
80
+
81
+ /**
82
+ * Throw unless {@link attach} would take `event`: when another owner is attached, or when an override
83
+ * already held is one the event's effects do not have (named). Changes nothing — so an owner can ask
84
+ * before it does anything else, and attach once nothing else can fail.
85
+ * @param {EventDescription} event
86
+ */
87
+ checkAttach(event) {
88
+ assert.defined(event, 'event');
89
+
90
+ if (this.#onChange !== null) {
91
+ throw new Error('sopra: these effect overrides already have an owner - one playing thing at a time (one entity per AudioEmitter)');
92
+ }
93
+
94
+ const values = this.#values;
95
+
96
+ if (values === null) {
97
+ return;
98
+ }
99
+
100
+ const effects = event.effects;
101
+
102
+ for (const [effectIndex, params] of values) {
103
+ for (const name of params.keys()) {
104
+ effectParamIndex(effects, effectIndex, name);
105
+ }
106
+ }
107
+ }
108
+
109
+ /**
110
+ * Become the overrides of whatever plays `event`: from now on every write is checked against its
111
+ * effects, and `onChange` is told of it. Checked first as {@link checkAttach} checks; on a throw nothing
112
+ * changes.
113
+ * @param {EventDescription} event the event the owner's instances are built from
114
+ * @param {EffectParamChange} onChange
115
+ */
116
+ attach(event, onChange) {
117
+ assert.isFunction(onChange, 'onChange');
118
+
119
+ this.checkAttach(event);
120
+
121
+ this.#event = event;
122
+ this.#onChange = onChange;
123
+ }
124
+
125
+ /**
126
+ * Stop telling `onChange` of changes — if it is the attached owner; a later owner is left attached. The
127
+ * overrides themselves are kept, for whatever attaches next.
128
+ * @param {EffectParamChange} onChange
129
+ * @returns {boolean} whether `onChange` was attached
130
+ */
131
+ detach(onChange) {
132
+ if (this.#onChange !== onChange) {
133
+ return false;
134
+ }
135
+
136
+ this.#event = null;
137
+ this.#onChange = null;
138
+
139
+ return true;
140
+ }
141
+
142
+ /**
143
+ * @param {number} effectIndex
144
+ * @param {string} name
145
+ * @param {number} value
146
+ */
147
+ #store(effectIndex, name, value) {
148
+ // a fractional or negative index is no position, and would be held where no instance can take it
149
+ if (!Number.isInteger(effectIndex) || effectIndex < 0) {
150
+ throw new Error(`sopra: an effect index is a non-negative integer, got ${effectIndex}`);
151
+ }
152
+
153
+ assert.isString(name, 'name');
154
+
155
+ // An AudioParam throws on a non-finite value. Refused here in every build - an `assert` is stripped
156
+ // from a production one, and the value would be held until some promotion tripped over it.
157
+ if (!Number.isFinite(value)) {
158
+ throw new Error(`sopra: an effect parameter's value is a finite number, got ${value}`);
159
+ }
160
+
161
+ if (this.#event !== null) {
162
+ effectParamIndex(this.#event.effects, effectIndex, name);
163
+ }
164
+
165
+ let values = this.#values;
166
+
167
+ if (values === null) {
168
+ values = new Map();
169
+ this.#values = values;
170
+ }
171
+
172
+ let params = values.get(effectIndex);
173
+
174
+ if (params === undefined) {
175
+ params = new Map();
176
+ values.set(effectIndex, params);
177
+ }
178
+
179
+ if (!params.has(name)) {
180
+ this.#size++;
181
+ }
182
+
183
+ params.set(name, value);
184
+ }
185
+
186
+ /**
187
+ * Override a parameter; the current instance moves there now.
188
+ * @param {number} effectIndex position in the event's `effects`
189
+ * @param {string} name one of that effect class's `parameters`
190
+ * @param {number} value in the parameter's own units (Hz, dB, ...)
191
+ */
192
+ set(effectIndex, name, value) {
193
+ this.#store(effectIndex, name, value);
194
+
195
+ if (this.#onChange !== null) {
196
+ this.#onChange(effectIndex, name, value, 0);
197
+ }
198
+ }
199
+
200
+ /**
201
+ * Override a parameter; the current instance glides there (see {@link EventInstance#approachEffectParam}).
202
+ * The override itself is the target, so an instance built while the glide is in flight starts AT it.
203
+ * @param {number} effectIndex
204
+ * @param {string} name
205
+ * @param {number} value
206
+ * @param {number} timeConstant seconds, above 0
207
+ */
208
+ approach(effectIndex, name, value, timeConstant) {
209
+ assert.isFinite(timeConstant, 'timeConstant');
210
+ assert.greaterThan(timeConstant, 0, 'timeConstant');
211
+
212
+ this.#store(effectIndex, name, value);
213
+
214
+ if (this.#onChange !== null) {
215
+ this.#onChange(effectIndex, name, value, timeConstant);
216
+ }
217
+ }
218
+
219
+ /**
220
+ * @param {number} effectIndex
221
+ * @param {string} name
222
+ * @returns {number|undefined} the override, or undefined if the parameter is not overridden
223
+ */
224
+ get(effectIndex, name) {
225
+ const params = this.#values === null ? undefined : this.#values.get(effectIndex);
226
+
227
+ return params === undefined ? undefined : params.get(name);
228
+ }
229
+
230
+ /**
231
+ * @param {number} effectIndex
232
+ * @param {string} name
233
+ * @returns {boolean}
234
+ */
235
+ has(effectIndex, name) {
236
+ const params = this.#values === null ? undefined : this.#values.get(effectIndex);
237
+
238
+ return params !== undefined && params.has(name);
239
+ }
240
+
241
+ /**
242
+ * Drop an override: the current instance returns to the event's own value now, and later ones are built
243
+ * at it. To glide back instead, {@link approach} the event's value first.
244
+ * @param {number} effectIndex
245
+ * @param {string} name
246
+ * @returns {boolean} false if the parameter was not overridden
247
+ */
248
+ remove(effectIndex, name) {
249
+ const values = this.#values;
250
+ const params = values === null ? undefined : values.get(effectIndex);
251
+
252
+ if (params === undefined || !params.delete(name)) {
253
+ return false;
254
+ }
255
+
256
+ if (params.size === 0) {
257
+ values.delete(effectIndex);
258
+ }
259
+
260
+ this.#size--;
261
+
262
+ this.#released(effectIndex, name);
263
+
264
+ return true;
265
+ }
266
+
267
+ /**
268
+ * Drop every override (see {@link remove}).
269
+ */
270
+ clear() {
271
+ const values = this.#values;
272
+
273
+ if (values === null) {
274
+ return;
275
+ }
276
+
277
+ this.#values = null;
278
+ this.#size = 0;
279
+
280
+ for (const [effectIndex, params] of values) {
281
+ for (const name of params.keys()) {
282
+ // the owner may write while it is told; a parameter overridden again meanwhile keeps that
283
+ if (!this.has(effectIndex, name)) {
284
+ this.#released(effectIndex, name);
285
+ }
286
+ }
287
+ }
288
+ }
289
+
290
+ /**
291
+ * Tell the owner a parameter is no longer overridden: its instance goes back to the event's own value,
292
+ * the definition field the parameter starts from.
293
+ * @param {number} effectIndex
294
+ * @param {string} name
295
+ */
296
+ #released(effectIndex, name) {
297
+ if (this.#onChange !== null) {
298
+ this.#onChange(effectIndex, name, this.#event.effects[effectIndex][name], 0);
299
+ }
300
+ }
301
+
302
+ /**
303
+ * Put every override onto a freshly built instance, at once: a new instance starts at the overrides, not
304
+ * gliding toward them from the definition.
305
+ * @param {EventInstance} instance
306
+ */
307
+ applyTo(instance) {
308
+ const values = this.#values;
309
+
310
+ if (values === null) {
311
+ return;
312
+ }
313
+
314
+ for (const [effectIndex, params] of values) {
315
+ for (const [name, value] of params) {
316
+ instance.setEffectParam(effectIndex, name, value);
317
+ }
318
+ }
319
+ }
320
+ }
@@ -74,10 +74,16 @@ export class EventInstance {
74
74
  */
75
75
  busId: string;
76
76
  /**
77
- * World position for spatialization. Null = non-positional.
78
- * @type {Vector3|null}
77
+ * World position for spatialization, read by index. Null = non-positional.
78
+ *
79
+ * Held by reference, not copied, and read when the instance starts, after {@link moved}, and
80
+ * whenever the listener moves ({@link SopraEngine#setListener}). So whoever writes it says so with
81
+ * {@link moved}; a source written without saying so keeps sounding where it last was. Give each
82
+ * instance an array of its own: every instance reads the one it holds, so instances sharing one
83
+ * are all wherever it was last written. (The acoustic simulation reads it afresh on each solve.)
84
+ * @type {ArrayLike<number>|null}
79
85
  */
80
- position: Vector3 | null;
86
+ position: ArrayLike<number> | null;
81
87
  /**
82
88
  * World orientation of the source (shared {@link Transform} rotation ref, so it tracks the entity).
83
89
  * Read by the {@link AcousticSimulator} only to evaluate {@link directivity}; null when the source has
@@ -119,6 +125,38 @@ export class EventInstance {
119
125
  * @param {number} now
120
126
  */
121
127
  start(now: number): void;
128
+ /**
129
+ * Move a parameter of this instance's copy of one of the event's insert effects, now — one play of a
130
+ * cue made duller, brighter or louder than the others. Other instances of the event, and the
131
+ * {@link EventDescription} itself, are untouched.
132
+ *
133
+ * Valid from the moment the instance exists, including while its buffers are still loading. The effect
134
+ * is addressed by its position in {@link EventDescription.effects}, the parameter by one of its class's
135
+ * `parameters` (`'frequency'` on an `EqEffect`).
136
+ *
137
+ * @param {number} effectIndex
138
+ * @param {string} name
139
+ * @param {number} value in the parameter's own units (Hz, dB, seconds, ...)
140
+ */
141
+ setEffectParam(effectIndex: number, name: string, value: number): void;
142
+ /**
143
+ * Glide a parameter of this instance's copy of one of the event's insert effects toward `value` —
144
+ * tracking a game value while the sound plays. See {@link EffectChain#approachParam}; addressed as
145
+ * {@link setEffectParam}.
146
+ *
147
+ * @param {number} effectIndex
148
+ * @param {string} name
149
+ * @param {number} value
150
+ * @param {number} timeConstant seconds, above 0
151
+ */
152
+ approachEffectParam(effectIndex: number, name: string, value: number, timeConstant: number): void;
153
+ /**
154
+ * Where this instance's effect parameter was last sent (a glide's target), or its defined value.
155
+ * @param {number} effectIndex
156
+ * @param {string} name
157
+ * @returns {number}
158
+ */
159
+ getEffectParam(effectIndex: number, name: string): number;
122
160
  /**
123
161
  * Live instance gain in decibels (composes with 3D attenuation).
124
162
  * @returns {number}
@@ -174,10 +212,22 @@ export class EventInstance {
174
212
  /**
175
213
  * Advance the instance one frame: update spatialization, then evaluate the timeline against the
176
214
  * playhead (spawning / virtualizing voices).
215
+ *
216
+ * The listener is the engine's ({@link SopraEngine#listenerPosition}), read here together with the
217
+ * version that says whether it moved, so a listener set during a tick is never paired with another's
218
+ * version.
177
219
  * @param {number} now context time
178
- * @param {Vector3|null} listenerPosition
179
220
  */
180
- update(now: number, listenerPosition: Vector3 | null): void;
221
+ update(now: number): void;
222
+ /**
223
+ * Report that {@link position} was written, so the next {@link update} puts the source where it now
224
+ * is: its panner, its distance attenuation and whether it is audible at all. The instance reads the
225
+ * array only when something has moved, so a write nobody reports is not heard.
226
+ *
227
+ * Cheap and idempotent: it marks the instance, and the work happens once, in the next update,
228
+ * however many writes were reported before it. Harmless on a 2D instance, or on one that has stopped.
229
+ */
230
+ moved(): void;
181
231
  /**
182
232
  * Stop all voices, tear down the output chain, and finish the instance.
183
233
  */
@@ -1 +1 @@
1
- {"version":3,"file":"EventInstance.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/sopra/runtime/EventInstance.js"],"names":[],"mappings":";;;iCAqBU,MAAM;;;;;;AAoFhB;;;;;;;;;GASG;AACH;IAkLI;;;;OAIG;IACH,oBAJW,WAAW,eACX,gBAAgB,qIAChB;QAAC,KAAK,CAAC,EAAC,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAC,OAAO,CAAC;QAAC,OAAO,CAAC,EAAC,OAAO,CAAC;QAAC,WAAW,CAAC,EAAC,MAAM,CAAC;QAAC,eAAe,CAAC,EAAC,oBAAoB,CAAC;QAAC,SAAS,CAAC,EAAC,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAC,OAAO,CAAC;QAAC,OAAO,CAAC,EAAC,OAAO,CAAC;QAAC,YAAY,CAAC,EAAC,MAAM,CAAC;QAAC,WAAW,CAAC,EAAC,UAAU,CAAC;QAAC,WAAW,CAAC,EAAC,mBAAmB,CAAA;KAAC,EA0EnQ;IA7PD;;OAEG;IACH,WAFU,MAAM,CAEF;IAEd;;OAEG;IACH,OAFU,kBAAkB,GAAC,MAAM,CAEA;IAEnC;;;OAGG;IACH,aAFU,MAAM,CAEA;IAEhB;;;;;OAKG;IACH,cAFU,MAAM,CAEG;IAEnB;;;OAGG;IACH,aAAuB;IAsKnB;;OAEG;IACH,QAFU,WAAW,CAED;IAEpB;;OAEG;IACH,aAFU,gBAAgB,CAEI;IAE9B;;OAEG;IACH,OAFU,MAAM,CAEE;IAElB;;;OAGG;IACH,UAFU,OAAO,GAAC,IAAI,CAEE;IAExB;;;;;OAKG;IACH,aAFU,UAAU,GAAC,IAAI,CAEK;IAE9B;;;;;OAKG;IACH,aAFU,mBAAmB,GAAC,IAAI,CAEJ;IAE9B;;OAEG;IACH,SAFU,OAAO,CAEK;IAEtB;;OAEG;IACH,oBAFU,MAAM,CAEqB;IAErC;;OAEG;IACH,iBAFU,oBAAoB,CAEQ;IAW1C;;;OAGG;IACH,uBAEC;IAED;;;OAGG;IACH,2CAeC;IAED;;;OAGG;IACH,WAFW,MAAM,QAyChB;IAwJD;;;OAGG;IACH,qBAEC;IAED;;;OAGG;IACH,wBAEC;IAED;;;OAGG;IACH,cAFW,MAAM,QAQhB;IAED;;;;;;;;;;;OAWG;IACH,sBAFW,gBAAgB,QAgE1B;IAED;;;;;OAKG;IACH,uBAJW,MAAM,YACN,MAAM,eACN,MAAM,QAqBhB;IAED;;;;;OAKG;IACH,yBAHW,MAAM,eACN,MAAM,QAqBhB;IAED;;;;OAIG;IACH,cAFW,MAAM,QAehB;IAED;;OAEG;IACH,gBAEC;IAED;;;;;OAKG;IACH,YAHW,MAAM,oBACN,OAAO,GAAC,IAAI,QA8DtB;IAuGD;;OAEG;IACH,aAsCC;;CACJ;yBAv9BY,OAAO,qCAAqC,EAAE,UAAU;sBACxD,OAAO,kCAAkC,EAAE,OAAO;+BAClD,OAAO,2CAA2C,EAAE,gBAAgB;kCACpE,OAAO,oDAAoD,EAAE,mBAAmB;0BAChF,OAAO,mBAAmB,EAAE,WAAW;+BACvC,OAAO,mCAAmC,EAAE,gBAAgB;mCAC5D,OAAO,2BAA2B,EAAE,oBAAoB;oBACxD,OAAO,YAAY,EAAE,KAAK"}
1
+ {"version":3,"file":"EventInstance.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/sound/sopra/runtime/EventInstance.js"],"names":[],"mappings":";;;iCAsBU,MAAM;;;;;;AAoFhB;;;;;;;;;GASG;AACH;IAuNI;;;;OAIG;IACH,oBAJW,WAAW,eACX,gBAAgB,qIAChB;QAAC,KAAK,CAAC,EAAC,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAC,OAAO,CAAC;QAAC,OAAO,CAAC,EAAC,OAAO,CAAC;QAAC,WAAW,CAAC,EAAC,MAAM,CAAC;QAAC,eAAe,CAAC,EAAC,oBAAoB,CAAC;QAAC,SAAS,CAAC,EAAC,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAC,OAAO,CAAC;QAAC,OAAO,CAAC,EAAC,OAAO,CAAC;QAAC,YAAY,CAAC,EAAC,MAAM,CAAC;QAAC,WAAW,CAAC,EAAC,UAAU,CAAC;QAAC,WAAW,CAAC,EAAC,mBAAmB,CAAA;KAAC,EAoFnQ;IA5SD;;OAEG;IACH,WAFU,MAAM,CAEF;IAEd;;OAEG;IACH,OAFU,kBAAkB,GAAC,MAAM,CAEA;IAEnC;;;OAGG;IACH,aAFU,MAAM,CAEA;IAEhB;;;;;OAKG;IACH,cAFU,MAAM,CAEG;IAEnB;;;OAGG;IACH,aAAuB;IA2MnB;;OAEG;IACH,QAFU,WAAW,CAED;IAEpB;;OAEG;IACH,aAFU,gBAAgB,CAEI;IAE9B;;OAEG;IACH,OAFU,MAAM,CAEE;IAElB;;;;;;;;;OASG;IACH,UAFU,UAAU,MAAM,CAAC,GAAC,IAAI,CAER;IAExB;;;;;OAKG;IACH,aAFU,UAAU,GAAC,IAAI,CAEK;IAE9B;;;;;OAKG;IACH,aAFU,mBAAmB,GAAC,IAAI,CAEJ;IAE9B;;OAEG;IACH,SAFU,OAAO,CAEK;IAEtB;;OAEG;IACH,oBAFU,MAAM,CAEqB;IAErC;;OAEG;IACH,iBAFU,oBAAoB,CAEQ;IAe1C;;;OAGG;IACH,uBAEC;IAED;;;OAGG;IACH,2CAeC;IAED;;;OAGG;IACH,WAFW,MAAM,QAyChB;IA+JD;;;;;;;;;;;;OAYG;IACH,4BAJW,MAAM,QACN,MAAM,SACN,MAAM,QAIhB;IAED;;;;;;;;;OASG;IACH,iCALW,MAAM,QACN,MAAM,SACN,MAAM,gBACN,MAAM,QAIhB;IAED;;;;;OAKG;IACH,4BAJW,MAAM,QACN,MAAM,GACJ,MAAM,CAIlB;IAaD;;;OAGG;IACH,qBAEC;IAED;;;OAGG;IACH,wBAEC;IAED;;;OAGG;IACH,cAFW,MAAM,QAQhB;IAED;;;;;;;;;;;OAWG;IACH,sBAFW,gBAAgB,QAgE1B;IAED;;;;;OAKG;IACH,uBAJW,MAAM,YACN,MAAM,eACN,MAAM,QAqBhB;IAED;;;;;OAKG;IACH,yBAHW,MAAM,eACN,MAAM,QAqBhB;IAED;;;;OAIG;IACH,cAFW,MAAM,QAehB;IAED;;OAEG;IACH,gBAEC;IAED;;;;;;;;OAQG;IACH,YAFW,MAAM,QA+DhB;IAED;;;;;;;OAOG;IACH,cAEC;IAwJD;;OAEG;IACH,aAyCC;;CACJ;yBAroCY,OAAO,qCAAqC,EAAE,UAAU;sBACxD,OAAO,kCAAkC,EAAE,OAAO;+BAClD,OAAO,2CAA2C,EAAE,gBAAgB;kCACpE,OAAO,oDAAoD,EAAE,mBAAmB;0BAChF,OAAO,mBAAmB,EAAE,WAAW;+BACvC,OAAO,mCAAmC,EAAE,gBAAgB;mCAC5D,OAAO,2BAA2B,EAAE,oBAAoB;oBACxD,OAAO,YAAY,EAAE,KAAK"}